From edd0930758f2177025d50dd655514f1ce64bb903 Mon Sep 17 00:00:00 2001 From: Bill Somerville Date: Fri, 19 Oct 2018 02:58:34 +0100 Subject: [PATCH] Squashed 'boost/' changes from b4feb19f2..d9443bc48 d9443bc48 Add the multi_index, intrusive and date_time libraries git-subtree-dir: boost git-subtree-split: d9443bc4849970cd15c886aae652bb3fcd8e1c6e --- README.md | 1 + boost/date_time/date_facet.hpp | 767 + boost/date_time/date_generator_formatter.hpp | 265 + boost/date_time/date_generator_parser.hpp | 330 + boost/date_time/format_date_parser.hpp | 731 + boost/date_time/gregorian/gregorian.hpp | 38 + boost/date_time/gregorian/gregorian_io.hpp | 784 + boost/date_time/period_formatter.hpp | 196 + boost/date_time/period_parser.hpp | 198 + boost/date_time/posix_time/posix_time.hpp | 39 + boost/date_time/posix_time/posix_time_io.hpp | 236 + .../posix_time/posix_time_legacy_io.hpp | 153 + .../date_time/posix_time/time_formatters.hpp | 289 + .../posix_time/time_formatters_limited.hpp | 212 + boost/date_time/posix_time/time_parsers.hpp | 48 + boost/date_time/special_values_formatter.hpp | 96 + boost/date_time/special_values_parser.hpp | 159 + boost/date_time/string_convert.hpp | 32 + boost/date_time/string_parse_tree.hpp | 278 + boost/date_time/strings_from_facet.hpp | 125 + boost/date_time/time_facet.hpp | 1368 ++ boost/date_time/time_formatting_streams.hpp | 122 + boost/date_time/time_parsing.hpp | 324 + boost/interprocess/allocators/allocator.hpp | 307 + .../allocators/detail/allocator_common.hpp | 858 ++ .../containers/allocation_type.hpp | 44 + .../containers/containers_fwd.hpp | 44 + boost/interprocess/containers/string.hpp | 37 + boost/interprocess/containers/vector.hpp | 37 + .../interprocess/containers/version_type.hpp | 37 + boost/interprocess/detail/cast_tags.hpp | 31 + boost/interprocess/detail/file_wrapper.hpp | 212 + .../detail/in_place_interface.hpp | 77 + .../detail/managed_memory_impl.hpp | 775 + boost/interprocess/detail/math_functions.hpp | 118 + boost/interprocess/detail/named_proxy.hpp | 316 + boost/interprocess/detail/nothrow.hpp | 42 + .../detail/segment_manager_helper.hpp | 518 + .../detail/transform_iterator.hpp | 200 + .../detail/variadic_templates_tools.hpp | 35 + boost/interprocess/file_mapping.hpp | 199 + boost/interprocess/indexes/iset_index.hpp | 158 + boost/interprocess/managed_mapped_file.hpp | 250 + boost/interprocess/managed_shared_memory.hpp | 262 + .../mem_algo/detail/mem_algo_common.hpp | 596 + .../interprocess/mem_algo/rbtree_best_fit.hpp | 1400 ++ boost/interprocess/offset_ptr.hpp | 751 + boost/interprocess/segment_manager.hpp | 1343 ++ boost/interprocess/smart_ptr/deleter.hpp | 68 + .../sync/interprocess_recursive_mutex.hpp | 181 + boost/interprocess/sync/mutex_family.hpp | 60 + boost/interprocess/sync/null_mutex.hpp | 155 + .../sync/posix/recursive_mutex.hpp | 137 + .../sync/spin/recursive_mutex.hpp | 176 + .../sync/windows/recursive_mutex.hpp | 47 + boost/intrusive/any_hook.hpp | 338 + boost/intrusive/avl_set.hpp | 1073 ++ boost/intrusive/bs_set.hpp | 1069 ++ boost/intrusive/circular_list_algorithms.hpp | 468 + boost/intrusive/derivation_value_traits.hpp | 77 + .../detail/any_node_and_algorithms.hpp | 297 + boost/intrusive/detail/hashtable_node.hpp | 286 + boost/intrusive/detail/list_iterator.hpp | 134 + boost/intrusive/detail/list_node.hpp | 72 + boost/intrusive/detail/node_to_value.hpp | 130 + boost/intrusive/detail/transform_iterator.hpp | 172 + boost/intrusive/hashtable.hpp | 3585 +++++ boost/intrusive/list.hpp | 1509 ++ boost/intrusive/list_hook.hpp | 289 + boost/intrusive/member_value_traits.hpp | 85 + boost/intrusive/priority_compare.hpp | 82 + boost/intrusive/set.hpp | 1073 ++ boost/intrusive/sg_set.hpp | 1094 ++ boost/intrusive/splay_set.hpp | 1110 ++ boost/intrusive/treap.hpp | 1344 ++ boost/intrusive/treap_algorithms.hpp | 699 + boost/intrusive/treap_set.hpp | 1106 ++ boost/intrusive/trivial_value_traits.hpp | 59 + boost/intrusive/unordered_set.hpp | 990 ++ boost/intrusive/unordered_set_hook.hpp | 459 + boost/multi_index/composite_key.hpp | 1513 ++ boost/multi_index/detail/cons_stdtuple.hpp | 93 + boost/multi_index/detail/rnd_index_loader.hpp | 173 + boost/multi_index/detail/rnd_index_node.hpp | 273 + boost/multi_index/detail/rnd_index_ops.hpp | 203 + .../detail/rnd_index_ptr_array.hpp | 144 + .../multi_index/detail/rnd_node_iterator.hpp | 140 + boost/multi_index/detail/rnk_index_ops.hpp | 300 + boost/multi_index/global_fun.hpp | 185 + boost/multi_index/key_extractors.hpp | 22 + boost/multi_index/mem_fun.hpp | 205 + boost/multi_index/random_access_index.hpp | 1167 ++ boost/multi_index/random_access_index_fwd.hpp | 91 + boost/multi_index/ranked_index.hpp | 382 + boost/multi_index/ranked_index_fwd.hpp | 35 + libs/circular_buffer/doc/autodoc.xml | 1703 --- libs/circular_buffer/doc/circular_buffer.idx | 22 - libs/circular_buffer/doc/circular_buffer.qbk | 626 - .../doc/images/circular_buffer.png | Bin 21147 -> 0 bytes .../doc/images/space_optimized.png | Bin 25514 -> 0 bytes libs/circular_buffer/doc/jamfile.v2 | 219 - .../example/bounded_buffer_comparison.cpp | 316 - .../example/circular_buffer_bound_example.cpp | 191 - .../example/circular_buffer_example.cpp | 63 - .../example/circular_buffer_examples.bat | 14 - .../example/circular_buffer_iter_example.cpp | 40 - .../example/circular_buffer_sum_example.cpp | 64 - libs/circular_buffer/example/jamfile.v2 | 42 - libs/circular_buffer/index.html | 25 - libs/circular_buffer/meta/libraries.json | 14 - libs/circular_buffer/test/Jamfile.v2 | 32 - libs/circular_buffer/test/base_test.cpp | 865 -- .../test/bounded_buffer_comparison.cpp | 316 - libs/circular_buffer/test/common.ipp | 2483 --- .../test/constant_erase_test.cpp | 185 - .../test/soft_iterator_invalidation.cpp | 745 - .../test/space_optimized_test.cpp | 196 - libs/circular_buffer/test/test.hpp | 146 - libs/config/checks/Jamfile.v2 | 220 - libs/config/checks/architecture/32.cpp | 9 - libs/config/checks/architecture/64.cpp | 9 - libs/config/checks/architecture/Jamroot.jam | 23 - libs/config/checks/architecture/arm.cpp | 15 - libs/config/checks/architecture/combined.cpp | 21 - libs/config/checks/architecture/mips1.cpp | 11 - libs/config/checks/architecture/power.cpp | 14 - libs/config/checks/architecture/sparc.cpp | 11 - libs/config/checks/architecture/x86.cpp | 16 - libs/config/checks/config.jam | 21 - libs/config/checks/test_case.cpp | 809 - libs/config/test/Jamfile.v2 | 106 - libs/config/test/abi/abi_test.cpp | 27 - libs/config/test/abi/abi_test.hpp | 54 - libs/config/test/abi/main.cpp | 31 - libs/config/test/all/Jamfile.v2 | 619 - libs/config/test/all/options_v2.jam | 12 - libs/config/test/boost_fallthrough_test.cpp | 20 - libs/config/test/boost_has_2arg_use_facet.ipp | 32 - libs/config/test/boost_has_bethreads.ipp | 34 - libs/config/test/boost_has_clock_gettime.ipp | 35 - libs/config/test/boost_has_dirent_h.ipp | 30 - libs/config/test/boost_has_expm1.ipp | 25 - libs/config/test/boost_has_float128.ipp | 29 - libs/config/test/boost_has_ftime.ipp | 32 - .../boost_has_getsystemtimeasfiletime.ipp | 30 - libs/config/test/boost_has_gettimeofday.ipp | 35 - libs/config/test/boost_has_hash.ipp | 68 - libs/config/test/boost_has_int128.ipp | 36 - libs/config/test/boost_has_log1p.ipp | 24 - libs/config/test/boost_has_long_long.ipp | 36 - .../config/test/boost_has_macro_use_facet.ipp | 35 - libs/config/test/boost_has_ms_int64.ipp | 32 - libs/config/test/boost_has_nanosleep.ipp | 36 - libs/config/test/boost_has_nl_types_h.ipp | 29 - libs/config/test/boost_has_nrvo.ipp | 57 - libs/config/test/boost_has_part_alloc.ipp | 65 - .../test/boost_has_pthread_delay_np.ipp | 35 - libs/config/test/boost_has_pthread_ma_st.ipp | 37 - libs/config/test/boost_has_pthread_yield.ipp | 34 - libs/config/test/boost_has_pthreads.ipp | 64 - libs/config/test/boost_has_rvalue_refs.ipp | 26 - libs/config/test/boost_has_sched_yield.ipp | 34 - .../config/test/boost_has_sgi_type_traits.ipp | 40 - libs/config/test/boost_has_sigaction.ipp | 36 - libs/config/test/boost_has_slist.ipp | 44 - libs/config/test/boost_has_static_assert.ipp | 20 - libs/config/test/boost_has_stdint_h.ipp | 48 - libs/config/test/boost_has_stlp_use_facet.ipp | 31 - libs/config/test/boost_has_tr1_array.ipp | 23 - libs/config/test/boost_has_tr1_bind.ipp | 23 - .../test/boost_has_tr1_complex_over.ipp | 24 - .../test/boost_has_tr1_complex_trig.ipp | 30 - libs/config/test/boost_has_tr1_function.ipp | 23 - libs/config/test/boost_has_tr1_hash.ipp | 23 - libs/config/test/boost_has_tr1_mem_fn.ipp | 23 - libs/config/test/boost_has_tr1_random.ipp | 23 - libs/config/test/boost_has_tr1_ref_wrap.ipp | 24 - libs/config/test/boost_has_tr1_regex.ipp | 24 - libs/config/test/boost_has_tr1_result_of.ipp | 24 - libs/config/test/boost_has_tr1_shared_ptr.ipp | 24 - libs/config/test/boost_has_tr1_tuple.ipp | 23 - .../config/test/boost_has_tr1_type_traits.ipp | 23 - .../test/boost_has_tr1_unordered_map.ipp | 24 - .../test/boost_has_tr1_unordered_set.ipp | 24 - libs/config/test/boost_has_tr1_utility.ipp | 25 - libs/config/test/boost_has_unistd_h.ipp | 26 - libs/config/test/boost_has_variadic_tmpl.ipp | 21 - libs/config/test/boost_has_vc6_mem_templ.ipp | 58 - libs/config/test/boost_has_vc_iterator.ipp | 40 - libs/config/test/boost_has_winthreads.ipp | 34 - libs/config/test/boost_no_adl_barrier.ipp | 38 - libs/config/test/boost_no_arg_dep_lookup.ipp | 37 - libs/config/test/boost_no_array_type_spec.ipp | 30 - .../test/boost_no_auto_declarations.ipp | 25 - libs/config/test/boost_no_auto_multidecl.ipp | 25 - libs/config/test/boost_no_auto_ptr.ipp | 53 - .../config/test/boost_no_bcb_partial_spec.ipp | 53 - libs/config/test/boost_no_char16_t.ipp | 32 - libs/config/test/boost_no_char32_t.ipp | 31 - libs/config/test/boost_no_com_value_init.ipp | 1016 -- libs/config/test/boost_no_constexpr.ipp | 85 - libs/config/test/boost_no_ctype_functions.ipp | 44 - libs/config/test/boost_no_cv_spec.ipp | 47 - libs/config/test/boost_no_cv_void_spec.ipp | 45 - libs/config/test/boost_no_cwchar.ipp | 33 - libs/config/test/boost_no_cwctype.ipp | 47 - libs/config/test/boost_no_cxx11_addressof.ipp | 28 - libs/config/test/boost_no_cxx11_alignas.ipp | 36 - libs/config/test/boost_no_cxx11_allocator.ipp | 44 - libs/config/test/boost_no_cxx11_atomic_sp.ipp | 36 - libs/config/test/boost_no_cxx11_final.ipp | 41 - libs/config/test/boost_no_cxx11_hdr_array.ipp | 23 - .../config/test/boost_no_cxx11_hdr_atomic.ipp | 90 - .../config/test/boost_no_cxx11_hdr_chrono.ipp | 31 - .../test/boost_no_cxx11_hdr_codecvt.ipp | 29 - .../boost_no_cxx11_hdr_condition_variable.ipp | 24 - .../test/boost_no_cxx11_hdr_forward_list.ipp | 23 - .../config/test/boost_no_cxx11_hdr_future.ipp | 34 - .../boost_no_cxx11_hdr_initializer_list.ipp | 27 - libs/config/test/boost_no_cxx11_hdr_mutex.ipp | 26 - .../config/test/boost_no_cxx11_hdr_random.ipp | 31 - libs/config/test/boost_no_cxx11_hdr_ratio.ipp | 37 - libs/config/test/boost_no_cxx11_hdr_regex.ipp | 29 - .../test/boost_no_cxx11_hdr_system_error.ipp | 26 - .../config/test/boost_no_cxx11_hdr_thread.ipp | 27 - libs/config/test/boost_no_cxx11_hdr_tuple.ipp | 23 - .../test/boost_no_cxx11_hdr_type_traits.ipp | 106 - .../test/boost_no_cxx11_hdr_typeindex.ipp | 33 - .../test/boost_no_cxx11_hdr_unordered_map.ipp | 24 - .../test/boost_no_cxx11_hdr_unordered_set.ipp | 24 - .../test/boost_no_cxx11_inline_namespaces.ipp | 30 - .../test/boost_no_cxx11_non_pub_def_fun.ipp | 38 - .../test/boost_no_cxx11_numeric_limits.ipp | 31 - .../test/boost_no_cxx11_ref_qualifiers.ipp | 33 - libs/config/test/boost_no_cxx11_smart_ptr.ipp | 35 - libs/config/test/boost_no_cxx11_std_align.ipp | 34 - .../test/boost_no_cxx11_thread_local.ipp | 24 - .../boost_no_cxx11_trailing_result_types.ipp | 26 - libs/config/test/boost_no_cxx11_user_lit.ipp | 67 - .../test/boost_no_cxx14_binary_literals.ipp | 23 - libs/config/test/boost_no_cxx14_constexpr.ipp | 72 - .../test/boost_no_cxx14_decltype_auto.ipp | 33 - .../test/boost_no_cxx14_digit_separator.ipp | 23 - .../test/boost_no_cxx14_generic_lambda.ipp | 23 - .../test/boost_no_cxx14_hdr_shared_mutex.ipp | 27 - .../test/boost_no_cxx14_lambda_capture.ipp | 23 - .../test/boost_no_cxx14_member_init.ipp | 30 - .../test/boost_no_cxx14_return_type_ded.ipp | 29 - .../test/boost_no_cxx14_std_exchange.ipp | 23 - libs/config/test/boost_no_cxx14_var_templ.ipp | 26 - libs/config/test/boost_no_cxx17_std_apply.ipp | 28 - .../config/test/boost_no_cxx17_std_invoke.ipp | 27 - .../test/boost_no_cxx_hdr_functional.ipp | 43 - libs/config/test/boost_no_decltype.ipp | 54 - libs/config/test/boost_no_decltype_n3276.ipp | 137 - libs/config/test/boost_no_ded_typename.ipp | 40 - .../test/boost_no_defaulted_functions.ipp | 28 - .../test/boost_no_deleted_functions.ipp | 28 - .../config/test/boost_no_dep_nested_class.ipp | 58 - libs/config/test/boost_no_dep_val_param.ipp | 37 - libs/config/test/boost_no_excep_std.ipp | 35 - libs/config/test/boost_no_exceptions.ipp | 43 - .../config/test/boost_no_exp_func_tem_arg.ipp | 55 - .../config/test/boost_no_explicit_cvt_ops.ipp | 33 - libs/config/test/boost_no_extern_template.ipp | 41 - libs/config/test/boost_no_fenv_h.ipp | 58 - .../boost_no_fixed_len_variadic_templates.ipp | 26 - libs/config/test/boost_no_func_tmp_order.ipp | 49 - ...oost_no_function_template_default_args.ipp | 38 - .../test/boost_no_function_type_spec.ipp | 44 - libs/config/test/boost_no_i64_limits.ipp | 29 - .../config/test/boost_no_inline_memb_init.ipp | 62 - .../config/test/boost_no_integral_int64_t.ipp | 54 - libs/config/test/boost_no_iosfwd.ipp | 23 - libs/config/test/boost_no_iostream.ipp | 25 - libs/config/test/boost_no_is_abstract.ipp | 53 - libs/config/test/boost_no_iter_construct.ipp | 38 - libs/config/test/boost_no_lambdas.ipp | 30 - libs/config/test/boost_no_limits.ipp | 34 - .../config/test/boost_no_limits_const_exp.ipp | 42 - libs/config/test/boost_no_ll_limits.ipp | 37 - libs/config/test/boost_no_long_long.ipp | 36 - libs/config/test/boost_no_mem_func_spec.ipp | 62 - libs/config/test/boost_no_mem_tem_keyword.ipp | 69 - libs/config/test/boost_no_mem_tem_pnts.ipp | 50 - libs/config/test/boost_no_mem_templ_frnds.ipp | 72 - libs/config/test/boost_no_mem_templates.ipp | 64 - .../test/boost_no_nested_friendship.ipp | 44 - libs/config/test/boost_no_noexcept.ipp | 26 - libs/config/test/boost_no_nullptr.ipp | 24 - .../config/test/boost_no_ops_in_namespace.ipp | 73 - .../test/boost_no_part_spec_def_args.ipp | 46 - libs/config/test/boost_no_partial_spec.ipp | 56 - libs/config/test/boost_no_priv_aggregate.ipp | 39 - libs/config/test/boost_no_ptr_mem_const.ipp | 86 - libs/config/test/boost_no_range_based_for.ipp | 23 - libs/config/test/boost_no_raw_literals.ipp | 27 - libs/config/test/boost_no_ret_det.ipp | 43 - libs/config/test/boost_no_rtti.ipp | 64 - .../test/boost_no_rvalue_references.ipp | 26 - libs/config/test/boost_no_scoped_enums.ipp | 28 - libs/config/test/boost_no_sfinae.ipp | 68 - libs/config/test/boost_no_sfinae_expr.ipp | 37 - libs/config/test/boost_no_sstream.ipp | 29 - libs/config/test/boost_no_static_assert.ipp | 20 - libs/config/test/boost_no_std_allocator.ipp | 78 - libs/config/test/boost_no_std_distance.ipp | 31 - libs/config/test/boost_no_std_iter_traits.ipp | 80 - libs/config/test/boost_no_std_iterator.ipp | 67 - libs/config/test/boost_no_std_locale.ipp | 36 - libs/config/test/boost_no_std_messages.ipp | 39 - libs/config/test/boost_no_std_min_max.ipp | 33 - libs/config/test/boost_no_std_oi_assign.ipp | 42 - libs/config/test/boost_no_std_typeinfo.ipp | 26 - libs/config/test/boost_no_std_use_facet.ipp | 29 - libs/config/test/boost_no_std_wstreambuf.ipp | 108 - libs/config/test/boost_no_std_wstring.ipp | 28 - libs/config/test/boost_no_stdc_namespace.ipp | 43 - libs/config/test/boost_no_swprintf.ipp | 31 - .../test/boost_no_tem_local_classes.ipp | 33 - .../config/test/boost_no_template_aliases.ipp | 22 - .../config/test/boost_no_template_streams.ipp | 29 - .../test/boost_no_template_template.ipp | 50 - .../config/test/boost_no_two_phase_lookup.ipp | 41 - libs/config/test/boost_no_typeid.ipp | 24 - .../test/boost_no_typename_with_ctor.ipp | 34 - .../config/test/boost_no_unicode_literals.ipp | 29 - libs/config/test/boost_no_unified_init.ipp | 59 - .../config/test/boost_no_using_breaks_adl.ipp | 73 - .../test/boost_no_using_decl_overld.ipp | 33 - libs/config/test/boost_no_using_template.ipp | 47 - libs/config/test/boost_no_variadic_macros.ipp | 64 - .../test/boost_no_variadic_templates.ipp | 21 - libs/config/test/boost_no_void_returns.ipp | 34 - libs/config/test/boost_no_wchar_t.ipp | 45 - libs/config/test/cmd_line_check.cpp | 9 - libs/config/test/config_build_check.cpp | 18 - libs/config/test/config_info.cpp | 1186 -- libs/config/test/config_test.cpp | 2011 --- libs/config/test/config_test_c.c | 9 - libs/config/test/cstdint_include_test.cpp | 69 - libs/config/test/cstdint_test.cpp | 238 - libs/config/test/cstdint_test2.cpp | 248 - libs/config/test/has_2arg_use_facet_fail.cpp | 34 - libs/config/test/has_2arg_use_facet_pass.cpp | 34 - libs/config/test/has_bethreads_fail.cpp | 34 - libs/config/test/has_bethreads_pass.cpp | 34 - libs/config/test/has_clock_gettime_fail.cpp | 34 - libs/config/test/has_clock_gettime_pass.cpp | 34 - libs/config/test/has_dirent_h_fail.cpp | 34 - libs/config/test/has_dirent_h_pass.cpp | 34 - libs/config/test/has_expm1_fail.cpp | 34 - libs/config/test/has_expm1_pass.cpp | 34 - libs/config/test/has_float128_fail.cpp | 37 - libs/config/test/has_float128_pass.cpp | 37 - libs/config/test/has_ftime_fail.cpp | 34 - libs/config/test/has_ftime_pass.cpp | 34 - .../test/has_getsystemtimeasfiletime_fail.cpp | 37 - .../test/has_getsystemtimeasfiletime_pass.cpp | 37 - libs/config/test/has_gettimeofday_fail.cpp | 34 - libs/config/test/has_gettimeofday_pass.cpp | 34 - libs/config/test/has_hash_fail.cpp | 34 - libs/config/test/has_hash_pass.cpp | 34 - libs/config/test/has_int128_fail.cpp | 37 - libs/config/test/has_int128_pass.cpp | 37 - libs/config/test/has_log1p_fail.cpp | 34 - libs/config/test/has_log1p_pass.cpp | 34 - libs/config/test/has_long_long_fail.cpp | 34 - libs/config/test/has_long_long_pass.cpp | 34 - libs/config/test/has_macro_use_facet_fail.cpp | 34 - libs/config/test/has_macro_use_facet_pass.cpp | 34 - libs/config/test/has_ms_int64_fail.cpp | 34 - libs/config/test/has_ms_int64_pass.cpp | 34 - libs/config/test/has_nanosleep_fail.cpp | 34 - libs/config/test/has_nanosleep_pass.cpp | 34 - libs/config/test/has_nl_types_h_fail.cpp | 34 - libs/config/test/has_nl_types_h_pass.cpp | 34 - libs/config/test/has_nrvo_fail.cpp | 34 - libs/config/test/has_nrvo_pass.cpp | 34 - libs/config/test/has_part_alloc_fail.cpp | 34 - libs/config/test/has_part_alloc_pass.cpp | 34 - .../config/test/has_pthread_delay_np_fail.cpp | 34 - .../config/test/has_pthread_delay_np_pass.cpp | 34 - libs/config/test/has_pthread_ma_st_fail.cpp | 34 - libs/config/test/has_pthread_ma_st_pass.cpp | 34 - libs/config/test/has_pthread_yield_fail.cpp | 34 - libs/config/test/has_pthread_yield_pass.cpp | 34 - libs/config/test/has_pthreads_fail.cpp | 34 - libs/config/test/has_pthreads_pass.cpp | 34 - libs/config/test/has_rvalue_refs_fail.cpp | 34 - libs/config/test/has_rvalue_refs_pass.cpp | 34 - libs/config/test/has_sched_yield_fail.cpp | 34 - libs/config/test/has_sched_yield_pass.cpp | 34 - libs/config/test/has_sgi_type_traits_fail.cpp | 34 - libs/config/test/has_sgi_type_traits_pass.cpp | 34 - libs/config/test/has_sigaction_fail.cpp | 34 - libs/config/test/has_sigaction_pass.cpp | 34 - libs/config/test/has_slist_fail.cpp | 34 - libs/config/test/has_slist_pass.cpp | 34 - libs/config/test/has_static_assert_fail.cpp | 34 - libs/config/test/has_static_assert_pass.cpp | 34 - libs/config/test/has_stdint_h_fail.cpp | 34 - libs/config/test/has_stdint_h_pass.cpp | 34 - libs/config/test/has_stlp_use_facet_fail.cpp | 34 - libs/config/test/has_stlp_use_facet_pass.cpp | 34 - libs/config/test/has_tr1_array_fail.cpp | 38 - libs/config/test/has_tr1_array_pass.cpp | 38 - libs/config/test/has_tr1_bind_fail.cpp | 38 - libs/config/test/has_tr1_bind_pass.cpp | 38 - .../config/test/has_tr1_complex_over_fail.cpp | 38 - .../config/test/has_tr1_complex_over_pass.cpp | 38 - .../config/test/has_tr1_complex_trig_fail.cpp | 38 - .../config/test/has_tr1_complex_trig_pass.cpp | 38 - libs/config/test/has_tr1_function_fail.cpp | 38 - libs/config/test/has_tr1_function_pass.cpp | 38 - libs/config/test/has_tr1_hash_fail.cpp | 38 - libs/config/test/has_tr1_hash_pass.cpp | 38 - libs/config/test/has_tr1_mem_fn_fail.cpp | 38 - libs/config/test/has_tr1_mem_fn_pass.cpp | 38 - libs/config/test/has_tr1_random_fail.cpp | 38 - libs/config/test/has_tr1_random_pass.cpp | 38 - libs/config/test/has_tr1_ref_wrap_fail.cpp | 38 - libs/config/test/has_tr1_ref_wrap_pass.cpp | 38 - libs/config/test/has_tr1_regex_fail.cpp | 38 - libs/config/test/has_tr1_regex_pass.cpp | 38 - libs/config/test/has_tr1_result_of_fail.cpp | 38 - libs/config/test/has_tr1_result_of_pass.cpp | 38 - libs/config/test/has_tr1_shared_ptr_fail.cpp | 38 - libs/config/test/has_tr1_shared_ptr_pass.cpp | 38 - libs/config/test/has_tr1_tuple_fail.cpp | 38 - libs/config/test/has_tr1_tuple_pass.cpp | 38 - libs/config/test/has_tr1_type_traits_fail.cpp | 38 - libs/config/test/has_tr1_type_traits_pass.cpp | 38 - .../test/has_tr1_unordered_map_fail.cpp | 38 - .../test/has_tr1_unordered_map_pass.cpp | 38 - .../test/has_tr1_unordered_set_fail.cpp | 38 - .../test/has_tr1_unordered_set_pass.cpp | 38 - libs/config/test/has_tr1_utility_fail.cpp | 38 - libs/config/test/has_tr1_utility_pass.cpp | 38 - libs/config/test/has_unistd_h_fail.cpp | 34 - libs/config/test/has_unistd_h_pass.cpp | 34 - libs/config/test/has_variadic_tmpl_fail.cpp | 34 - libs/config/test/has_variadic_tmpl_pass.cpp | 34 - libs/config/test/has_vc6_mem_templ_fail.cpp | 34 - libs/config/test/has_vc6_mem_templ_pass.cpp | 34 - libs/config/test/has_vc_iterator_fail.cpp | 34 - libs/config/test/has_vc_iterator_pass.cpp | 34 - libs/config/test/has_winthreads_fail.cpp | 34 - libs/config/test/has_winthreads_pass.cpp | 34 - libs/config/test/helper_macro_test.cpp | 60 - libs/config/test/limits_test.cpp | 213 - libs/config/test/link/Jamfile.v2 | 19 - libs/config/test/link/bc_gen.sh | 286 - libs/config/test/link/borland.mak | 429 - libs/config/test/link/common.sh | 19 - libs/config/test/link/link_test.cpp | 54 - libs/config/test/link/link_test.hpp | 108 - libs/config/test/link/main.cpp | 19 - libs/config/test/link/test/Jamfile.v2 | 117 - libs/config/test/link/vc6-stlport.mak | 292 - libs/config/test/link/vc6.mak | 260 - libs/config/test/link/vc7-stlport.mak | 292 - libs/config/test/link/vc7.mak | 260 - libs/config/test/link/vc71-stlport.mak | 292 - libs/config/test/link/vc71.mak | 260 - libs/config/test/link/vc_gen.sh | 424 - libs/config/test/math_info.cpp | 365 - libs/config/test/no_adl_barrier_fail.cpp | 37 - libs/config/test/no_adl_barrier_pass.cpp | 37 - libs/config/test/no_arg_dep_lookup_fail.cpp | 34 - libs/config/test/no_arg_dep_lookup_pass.cpp | 34 - libs/config/test/no_array_type_spec_fail.cpp | 34 - libs/config/test/no_array_type_spec_pass.cpp | 34 - .../config/test/no_auto_declarations_fail.cpp | 37 - .../config/test/no_auto_declarations_pass.cpp | 37 - libs/config/test/no_auto_multidecl_fail.cpp | 37 - libs/config/test/no_auto_multidecl_pass.cpp | 37 - libs/config/test/no_auto_ptr_fail.cpp | 34 - libs/config/test/no_auto_ptr_pass.cpp | 34 - libs/config/test/no_bcb_partial_spec_fail.cpp | 34 - libs/config/test/no_bcb_partial_spec_pass.cpp | 34 - libs/config/test/no_char16_t_fail.cpp | 37 - libs/config/test/no_char16_t_pass.cpp | 37 - libs/config/test/no_char32_t_fail.cpp | 37 - libs/config/test/no_char32_t_pass.cpp | 37 - libs/config/test/no_com_value_init_fail.cpp | 37 - libs/config/test/no_com_value_init_pass.cpp | 37 - libs/config/test/no_constexpr_fail.cpp | 37 - libs/config/test/no_constexpr_pass.cpp | 37 - libs/config/test/no_ctype_functions_fail.cpp | 34 - libs/config/test/no_ctype_functions_pass.cpp | 34 - libs/config/test/no_cv_spec_fail.cpp | 34 - libs/config/test/no_cv_spec_pass.cpp | 34 - libs/config/test/no_cv_void_spec_fail.cpp | 34 - libs/config/test/no_cv_void_spec_pass.cpp | 34 - libs/config/test/no_cwchar_fail.cpp | 34 - libs/config/test/no_cwchar_pass.cpp | 34 - libs/config/test/no_cwctype_fail.cpp | 34 - libs/config/test/no_cwctype_pass.cpp | 34 - libs/config/test/no_cxx11_addressof_fail.cpp | 37 - libs/config/test/no_cxx11_addressof_pass.cpp | 37 - libs/config/test/no_cxx11_alignas_fail.cpp | 37 - libs/config/test/no_cxx11_alignas_pass.cpp | 37 - libs/config/test/no_cxx11_allocator_fail.cpp | 37 - libs/config/test/no_cxx11_allocator_pass.cpp | 37 - libs/config/test/no_cxx11_atomic_sp_fail.cpp | 37 - libs/config/test/no_cxx11_atomic_sp_pass.cpp | 37 - libs/config/test/no_cxx11_final_fail.cpp | 37 - libs/config/test/no_cxx11_final_pass.cpp | 37 - libs/config/test/no_cxx11_hdr_array_fail.cpp | 37 - libs/config/test/no_cxx11_hdr_array_pass.cpp | 37 - libs/config/test/no_cxx11_hdr_atomic_fail.cpp | 37 - libs/config/test/no_cxx11_hdr_atomic_pass.cpp | 37 - libs/config/test/no_cxx11_hdr_chrono_fail.cpp | 37 - libs/config/test/no_cxx11_hdr_chrono_pass.cpp | 37 - .../config/test/no_cxx11_hdr_codecvt_fail.cpp | 37 - .../config/test/no_cxx11_hdr_codecvt_pass.cpp | 37 - .../no_cxx11_hdr_condition_variable_fail.cpp | 37 - .../no_cxx11_hdr_condition_variable_pass.cpp | 37 - .../test/no_cxx11_hdr_forward_list_fail.cpp | 37 - .../test/no_cxx11_hdr_forward_list_pass.cpp | 37 - libs/config/test/no_cxx11_hdr_future_fail.cpp | 37 - libs/config/test/no_cxx11_hdr_future_pass.cpp | 37 - .../no_cxx11_hdr_initializer_list_fail.cpp | 37 - .../no_cxx11_hdr_initializer_list_pass.cpp | 37 - libs/config/test/no_cxx11_hdr_mutex_fail.cpp | 37 - libs/config/test/no_cxx11_hdr_mutex_pass.cpp | 37 - libs/config/test/no_cxx11_hdr_random_fail.cpp | 37 - libs/config/test/no_cxx11_hdr_random_pass.cpp | 37 - libs/config/test/no_cxx11_hdr_ratio_fail.cpp | 37 - libs/config/test/no_cxx11_hdr_ratio_pass.cpp | 37 - libs/config/test/no_cxx11_hdr_regex_fail.cpp | 37 - libs/config/test/no_cxx11_hdr_regex_pass.cpp | 37 - .../test/no_cxx11_hdr_system_error_fail.cpp | 37 - .../test/no_cxx11_hdr_system_error_pass.cpp | 37 - libs/config/test/no_cxx11_hdr_thread_fail.cpp | 37 - libs/config/test/no_cxx11_hdr_thread_pass.cpp | 37 - libs/config/test/no_cxx11_hdr_tuple_fail.cpp | 37 - libs/config/test/no_cxx11_hdr_tuple_pass.cpp | 37 - .../test/no_cxx11_hdr_type_traits_fail.cpp | 37 - .../test/no_cxx11_hdr_type_traits_pass.cpp | 37 - .../test/no_cxx11_hdr_typeindex_fail.cpp | 37 - .../test/no_cxx11_hdr_typeindex_pass.cpp | 37 - .../test/no_cxx11_hdr_unordered_map_fail.cpp | 37 - .../test/no_cxx11_hdr_unordered_map_pass.cpp | 37 - .../test/no_cxx11_hdr_unordered_set_fail.cpp | 37 - .../test/no_cxx11_hdr_unordered_set_pass.cpp | 37 - .../test/no_cxx11_inline_namespaces_fail.cpp | 37 - .../test/no_cxx11_inline_namespaces_pass.cpp | 37 - .../test/no_cxx11_non_pub_def_fun_fail.cpp | 37 - .../test/no_cxx11_non_pub_def_fun_pass.cpp | 37 - .../test/no_cxx11_numeric_limits_fail.cpp | 37 - .../test/no_cxx11_numeric_limits_pass.cpp | 37 - .../test/no_cxx11_ref_qualifiers_fail.cpp | 37 - .../test/no_cxx11_ref_qualifiers_pass.cpp | 37 - libs/config/test/no_cxx11_smart_ptr_fail.cpp | 37 - libs/config/test/no_cxx11_smart_ptr_pass.cpp | 37 - libs/config/test/no_cxx11_std_align_fail.cpp | 37 - libs/config/test/no_cxx11_std_align_pass.cpp | 37 - .../test/no_cxx11_thread_local_fail.cpp | 37 - .../test/no_cxx11_thread_local_pass.cpp | 37 - .../no_cxx11_trailing_result_types_fail.cpp | 37 - .../no_cxx11_trailing_result_types_pass.cpp | 37 - libs/config/test/no_cxx11_user_lit_fail.cpp | 37 - libs/config/test/no_cxx11_user_lit_pass.cpp | 37 - .../test/no_cxx14_binary_literals_fail.cpp | 37 - .../test/no_cxx14_binary_literals_pass.cpp | 37 - libs/config/test/no_cxx14_constexpr_fail.cpp | 37 - libs/config/test/no_cxx14_constexpr_pass.cpp | 37 - .../test/no_cxx14_decltype_auto_fail.cpp | 37 - .../test/no_cxx14_decltype_auto_pass.cpp | 37 - .../test/no_cxx14_digit_separator_fail.cpp | 37 - .../test/no_cxx14_digit_separator_pass.cpp | 37 - .../test/no_cxx14_generic_lambda_fail.cpp | 37 - .../test/no_cxx14_generic_lambda_pass.cpp | 37 - .../test/no_cxx14_hdr_shared_mutex_fail.cpp | 37 - .../test/no_cxx14_hdr_shared_mutex_pass.cpp | 37 - .../test/no_cxx14_lambda_capture_fail.cpp | 37 - .../test/no_cxx14_lambda_capture_pass.cpp | 37 - .../config/test/no_cxx14_member_init_fail.cpp | 37 - .../config/test/no_cxx14_member_init_pass.cpp | 37 - .../test/no_cxx14_return_type_ded_fail.cpp | 37 - .../test/no_cxx14_return_type_ded_pass.cpp | 37 - .../test/no_cxx14_std_exchange_fail.cpp | 37 - .../test/no_cxx14_std_exchange_pass.cpp | 37 - libs/config/test/no_cxx14_var_templ_fail.cpp | 37 - libs/config/test/no_cxx14_var_templ_pass.cpp | 37 - libs/config/test/no_cxx17_std_apply_fail.cpp | 37 - libs/config/test/no_cxx17_std_apply_pass.cpp | 37 - libs/config/test/no_cxx17_std_invoke_fail.cpp | 37 - libs/config/test/no_cxx17_std_invoke_pass.cpp | 37 - .../test/no_cxx_hdr_functional_fail.cpp | 37 - .../test/no_cxx_hdr_functional_pass.cpp | 37 - libs/config/test/no_decltype_fail.cpp | 37 - libs/config/test/no_decltype_n3276_fail.cpp | 37 - libs/config/test/no_decltype_n3276_pass.cpp | 37 - libs/config/test/no_decltype_pass.cpp | 37 - libs/config/test/no_ded_typename_fail.cpp | 34 - libs/config/test/no_ded_typename_pass.cpp | 34 - .../test/no_defaulted_functions_fail.cpp | 37 - .../test/no_defaulted_functions_pass.cpp | 37 - .../config/test/no_deleted_functions_fail.cpp | 37 - .../config/test/no_deleted_functions_pass.cpp | 37 - libs/config/test/no_dep_nested_class_fail.cpp | 34 - libs/config/test/no_dep_nested_class_pass.cpp | 34 - libs/config/test/no_dep_val_param_fail.cpp | 34 - libs/config/test/no_dep_val_param_pass.cpp | 34 - libs/config/test/no_excep_std_fail.cpp | 34 - libs/config/test/no_excep_std_pass.cpp | 34 - libs/config/test/no_exceptions_fail.cpp | 34 - libs/config/test/no_exceptions_pass.cpp | 34 - libs/config/test/no_exp_func_tem_arg_fail.cpp | 34 - libs/config/test/no_exp_func_tem_arg_pass.cpp | 34 - libs/config/test/no_explicit_cvt_ops_fail.cpp | 37 - libs/config/test/no_explicit_cvt_ops_pass.cpp | 37 - libs/config/test/no_extern_template_fail.cpp | 37 - libs/config/test/no_extern_template_pass.cpp | 37 - libs/config/test/no_fenv_h_fail.cpp | 33 - libs/config/test/no_fenv_h_pass.cpp | 33 - .../no_fixed_len_variadic_templates_fail.cpp | 37 - .../no_fixed_len_variadic_templates_pass.cpp | 37 - libs/config/test/no_func_tmp_order_fail.cpp | 34 - libs/config/test/no_func_tmp_order_pass.cpp | 34 - ...no_function_template_default_args_fail.cpp | 37 - ...no_function_template_default_args_pass.cpp | 37 - .../test/no_function_type_spec_fail.cpp | 34 - .../test/no_function_type_spec_pass.cpp | 34 - libs/config/test/no_i64_limits_fail.cpp | 34 - libs/config/test/no_i64_limits_pass.cpp | 34 - libs/config/test/no_inline_memb_init_fail.cpp | 34 - libs/config/test/no_inline_memb_init_pass.cpp | 34 - libs/config/test/no_integral_int64_t_fail.cpp | 34 - libs/config/test/no_integral_int64_t_pass.cpp | 34 - libs/config/test/no_iosfwd_fail.cpp | 34 - libs/config/test/no_iosfwd_pass.cpp | 34 - libs/config/test/no_iostream_fail.cpp | 34 - libs/config/test/no_iostream_pass.cpp | 34 - libs/config/test/no_is_abstract_fail.cpp | 34 - libs/config/test/no_is_abstract_pass.cpp | 34 - libs/config/test/no_iter_construct_fail.cpp | 34 - libs/config/test/no_iter_construct_pass.cpp | 34 - libs/config/test/no_lambdas_fail.cpp | 37 - libs/config/test/no_lambdas_pass.cpp | 37 - libs/config/test/no_limits_const_exp_fail.cpp | 34 - libs/config/test/no_limits_const_exp_pass.cpp | 34 - libs/config/test/no_limits_fail.cpp | 34 - libs/config/test/no_limits_pass.cpp | 34 - libs/config/test/no_ll_limits_fail.cpp | 34 - libs/config/test/no_ll_limits_pass.cpp | 34 - libs/config/test/no_long_long_fail.cpp | 37 - libs/config/test/no_long_long_pass.cpp | 37 - libs/config/test/no_mem_func_spec_fail.cpp | 34 - libs/config/test/no_mem_func_spec_pass.cpp | 34 - libs/config/test/no_mem_tem_keyword_fail.cpp | 34 - libs/config/test/no_mem_tem_keyword_pass.cpp | 34 - libs/config/test/no_mem_tem_pnts_fail.cpp | 34 - libs/config/test/no_mem_tem_pnts_pass.cpp | 34 - libs/config/test/no_mem_templ_frnds_fail.cpp | 34 - libs/config/test/no_mem_templ_frnds_pass.cpp | 34 - libs/config/test/no_mem_templates_fail.cpp | 34 - libs/config/test/no_mem_templates_pass.cpp | 34 - .../config/test/no_nested_friendship_fail.cpp | 37 - .../config/test/no_nested_friendship_pass.cpp | 37 - libs/config/test/no_noexcept_fail.cpp | 37 - libs/config/test/no_noexcept_pass.cpp | 37 - libs/config/test/no_nullptr_fail.cpp | 37 - libs/config/test/no_nullptr_pass.cpp | 37 - libs/config/test/no_ops_in_namespace_fail.cpp | 34 - libs/config/test/no_ops_in_namespace_pass.cpp | 34 - .../test/no_part_spec_def_args_fail.cpp | 37 - .../test/no_part_spec_def_args_pass.cpp | 37 - libs/config/test/no_partial_spec_fail.cpp | 34 - libs/config/test/no_partial_spec_pass.cpp | 34 - libs/config/test/no_priv_aggregate_fail.cpp | 34 - libs/config/test/no_priv_aggregate_pass.cpp | 34 - libs/config/test/no_ptr_mem_const_fail.cpp | 34 - libs/config/test/no_ptr_mem_const_pass.cpp | 34 - libs/config/test/no_range_based_for_fail.cpp | 37 - libs/config/test/no_range_based_for_pass.cpp | 37 - libs/config/test/no_raw_literals_fail.cpp | 37 - libs/config/test/no_raw_literals_pass.cpp | 37 - libs/config/test/no_ret_det_fail.cpp | 34 - libs/config/test/no_ret_det_pass.cpp | 34 - libs/config/test/no_rtti_fail.cpp | 37 - libs/config/test/no_rtti_pass.cpp | 37 - .../config/test/no_rvalue_references_fail.cpp | 37 - .../config/test/no_rvalue_references_pass.cpp | 37 - libs/config/test/no_scoped_enums_fail.cpp | 37 - libs/config/test/no_scoped_enums_pass.cpp | 37 - libs/config/test/no_sfinae_expr_fail.cpp | 37 - libs/config/test/no_sfinae_expr_pass.cpp | 37 - libs/config/test/no_sfinae_fail.cpp | 34 - libs/config/test/no_sfinae_pass.cpp | 34 - libs/config/test/no_sstream_fail.cpp | 34 - libs/config/test/no_sstream_pass.cpp | 34 - libs/config/test/no_static_assert_fail.cpp | 37 - libs/config/test/no_static_assert_pass.cpp | 37 - libs/config/test/no_std_allocator_fail.cpp | 34 - libs/config/test/no_std_allocator_pass.cpp | 34 - libs/config/test/no_std_distance_fail.cpp | 34 - libs/config/test/no_std_distance_pass.cpp | 34 - libs/config/test/no_std_iter_traits_fail.cpp | 34 - libs/config/test/no_std_iter_traits_pass.cpp | 34 - libs/config/test/no_std_iterator_fail.cpp | 34 - libs/config/test/no_std_iterator_pass.cpp | 34 - libs/config/test/no_std_locale_fail.cpp | 34 - libs/config/test/no_std_locale_pass.cpp | 34 - libs/config/test/no_std_messages_fail.cpp | 34 - libs/config/test/no_std_messages_pass.cpp | 34 - libs/config/test/no_std_min_max_fail.cpp | 34 - libs/config/test/no_std_min_max_pass.cpp | 34 - libs/config/test/no_std_oi_assign_fail.cpp | 34 - libs/config/test/no_std_oi_assign_pass.cpp | 34 - libs/config/test/no_std_typeinfo_fail.cpp | 34 - libs/config/test/no_std_typeinfo_pass.cpp | 34 - libs/config/test/no_std_use_facet_fail.cpp | 34 - libs/config/test/no_std_use_facet_pass.cpp | 34 - libs/config/test/no_std_wstreambuf_fail.cpp | 34 - libs/config/test/no_std_wstreambuf_pass.cpp | 34 - libs/config/test/no_std_wstring_fail.cpp | 34 - libs/config/test/no_std_wstring_pass.cpp | 34 - libs/config/test/no_stdc_namespace_fail.cpp | 34 - libs/config/test/no_stdc_namespace_pass.cpp | 34 - libs/config/test/no_swprintf_fail.cpp | 34 - libs/config/test/no_swprintf_pass.cpp | 34 - .../config/test/no_tem_local_classes_fail.cpp | 37 - .../config/test/no_tem_local_classes_pass.cpp | 37 - libs/config/test/no_template_aliases_fail.cpp | 37 - libs/config/test/no_template_aliases_pass.cpp | 37 - libs/config/test/no_template_streams_fail.cpp | 37 - libs/config/test/no_template_streams_pass.cpp | 37 - .../config/test/no_template_template_fail.cpp | 34 - .../config/test/no_template_template_pass.cpp | 34 - libs/config/test/no_two_phase_lookup_fail.cpp | 34 - libs/config/test/no_two_phase_lookup_pass.cpp | 34 - libs/config/test/no_typeid_fail.cpp | 34 - libs/config/test/no_typeid_pass.cpp | 34 - .../test/no_typename_with_ctor_fail.cpp | 37 - .../test/no_typename_with_ctor_pass.cpp | 37 - libs/config/test/no_unicode_literals_fail.cpp | 37 - libs/config/test/no_unicode_literals_pass.cpp | 37 - libs/config/test/no_unified_init_fail.cpp | 37 - libs/config/test/no_unified_init_pass.cpp | 37 - libs/config/test/no_using_breaks_adl_fail.cpp | 34 - libs/config/test/no_using_breaks_adl_pass.cpp | 34 - .../config/test/no_using_decl_overld_fail.cpp | 34 - .../config/test/no_using_decl_overld_pass.cpp | 34 - libs/config/test/no_using_template_fail.cpp | 34 - libs/config/test/no_using_template_pass.cpp | 34 - libs/config/test/no_variadic_macros_fail.cpp | 37 - libs/config/test/no_variadic_macros_pass.cpp | 37 - .../test/no_variadic_templates_fail.cpp | 37 - .../test/no_variadic_templates_pass.cpp | 37 - libs/config/test/no_void_returns_fail.cpp | 34 - libs/config/test/no_void_returns_pass.cpp | 34 - libs/config/test/no_wchar_t_fail.cpp | 34 - libs/config/test/no_wchar_t_pass.cpp | 34 - libs/config/test/test.hpp | 21 - .../config/test/threads/test_thread_fail1.cpp | 10 - .../config/test/threads/test_thread_fail2.cpp | 13 - libs/crc/crc.html | 635 - libs/crc/crc_example.cpp | 75 - libs/crc/index.html | 61 - libs/crc/test/Jamfile.v2 | 14 - libs/crc/test/crc_test.cpp | 761 - libs/iterator/doc/BidirectionalTraversal.html | 76 - libs/iterator/doc/BidirectionalTraversal.rst | 41 - libs/iterator/doc/ForwardTraversal.html | 67 - libs/iterator/doc/ForwardTraversal.rst | 31 - libs/iterator/doc/GNUmakefile | 15 - libs/iterator/doc/IncrementableIterator.html | 66 - libs/iterator/doc/IncrementableIterator.rst | 32 - libs/iterator/doc/InteroperableIterator.rst | 61 - libs/iterator/doc/Jamfile.v2 | 27 - libs/iterator/doc/LvalueIterator.html | 56 - libs/iterator/doc/LvalueIterator.rst | 25 - libs/iterator/doc/RandomAccessTraversal.html | 134 - libs/iterator/doc/RandomAccessTraversal.rst | 67 - libs/iterator/doc/ReadableIterator.html | 64 - libs/iterator/doc/ReadableIterator.rst | 26 - libs/iterator/doc/SinglePassIterator.html | 68 - libs/iterator/doc/SinglePassIterator.rst | 32 - libs/iterator/doc/SwappableIterator.html | 54 - libs/iterator/doc/SwappableIterator.rst | 23 - libs/iterator/doc/WritableIterator.html | 52 - libs/iterator/doc/WritableIterator.rst | 21 - libs/iterator/doc/access.png | Bin 11127 -> 0 bytes libs/iterator/doc/access2old.png | Bin 42175 -> 0 bytes libs/iterator/doc/counting_iterator.html | 301 - libs/iterator/doc/counting_iterator.pdf | Bin 72583 -> 0 bytes libs/iterator/doc/counting_iterator.rst | 43 - .../doc/counting_iterator_abstract.rst | 8 - libs/iterator/doc/counting_iterator_eg.rst | 43 - libs/iterator/doc/counting_iterator_ref.rst | 149 - libs/iterator/doc/default.css | 226 - libs/iterator/doc/docutils.sty | 54 - libs/iterator/doc/facade-and-adaptor.html | 2716 ---- libs/iterator/doc/facade-and-adaptor.pdf | Bin 226024 -> 0 bytes libs/iterator/doc/facade-and-adaptor.rst | 438 - .../iterator/doc/facade_iterator_category.rst | 53 - libs/iterator/doc/filter_iterator.html | 413 - libs/iterator/doc/filter_iterator.pdf | Bin 69532 -> 0 bytes libs/iterator/doc/filter_iterator.rst | 33 - .../iterator/doc/filter_iterator_abstract.rst | 15 - libs/iterator/doc/filter_iterator_eg.rst | 72 - libs/iterator/doc/filter_iterator_ref.rst | 177 - .../doc/func_output_iter_abstract.rst | 12 - libs/iterator/doc/func_output_iter_ref.rst | 73 - .../iterator/doc/function_input_iterator.html | 142 - libs/iterator/doc/function_input_iterator.rst | 132 - .../doc/function_output_iterator.html | 191 - .../iterator/doc/function_output_iterator.pdf | Bin 57133 -> 0 bytes .../iterator/doc/function_output_iterator.rst | 28 - .../doc/function_output_iterator_eg.rst | 39 - libs/iterator/doc/generate.py | 32 - libs/iterator/doc/generator_iterator.htm | 163 - libs/iterator/doc/html/index.html | 296 - libs/iterator/doc/html/iterator/concepts.html | 336 - .../iterator/concepts/concepts_traversal.html | 798 - libs/iterator/doc/html/iterator/generic.html | 1546 -- .../doc/html/iterator/generic/adaptor.html | 278 - .../generic/adaptor/adaptor_tutorial.html | 198 - libs/iterator/doc/html/iterator/history.html | 74 - .../doc/html/iterator/specialized.html | 287 - .../doc/html/iterator/specialized/filter.html | 474 - .../iterator/specialized/function_output.html | 161 - .../html/iterator/specialized/indirect.html | 323 - .../iterator/specialized/permutation.html | 277 - .../html/iterator/specialized/reverse.html | 286 - .../specialized/shared_container.html | 221 - .../shared_container_generator.html | 109 - .../shared_container_object_generator.html | 110 - .../html/iterator/specialized/transform.html | 355 - .../doc/html/iterator/specialized/zip.html | 177 - .../specialized/zip/zip_reference.html | 213 - .../iterator/doc/html/iterator/upgrading.html | 72 - .../iterator/doc/html/iterator/utilities.html | 233 - .../iterator/utilities/concept_checking.html | 99 - .../doc/html/iterator/utilities/traits.html | 101 - .../html/iterator/utilities/utilities.html | 346 - .../utilities/utilities_testing.html | 146 - .../doc/html/standalone_HTML.manifest | 25 - libs/iterator/doc/index.html | 249 - libs/iterator/doc/index.rst | 331 - libs/iterator/doc/indirect_iterator.html | 345 - libs/iterator/doc/indirect_iterator.pdf | Bin 75031 -> 0 bytes libs/iterator/doc/indirect_iterator.rst | 34 - .../doc/indirect_iterator_abstract.rst | 15 - libs/iterator/doc/indirect_iterator_eg.rst | 73 - libs/iterator/doc/indirect_iterator_ref.rst | 181 - libs/iterator/doc/indirect_reference_ref.rst | 29 - .../doc/interoperability-revisited.rst | 238 - libs/iterator/doc/issues.rst | 152 - libs/iterator/doc/iterator_adaptor.html | 461 - libs/iterator/doc/iterator_adaptor.pdf | Bin 100117 -> 0 bytes libs/iterator/doc/iterator_adaptor.rst | 41 - .../doc/iterator_adaptor_abstract.rst | 19 - libs/iterator/doc/iterator_adaptor_body.rst | 43 - libs/iterator/doc/iterator_adaptor_ref.rst | 182 - .../doc/iterator_adaptor_tutorial.rst | 135 - libs/iterator/doc/iterator_archetypes.html | 224 - libs/iterator/doc/iterator_archetypes.pdf | Bin 61213 -> 0 bytes libs/iterator/doc/iterator_archetypes.rst | 193 - libs/iterator/doc/iterator_concepts.html | 127 - libs/iterator/doc/iterator_concepts.pdf | Bin 66710 -> 0 bytes libs/iterator/doc/iterator_concepts.rst | 130 - libs/iterator/doc/iterator_facade.html | 1348 -- libs/iterator/doc/iterator_facade.pdf | Bin 167634 -> 0 bytes libs/iterator/doc/iterator_facade.rst | 44 - .../iterator/doc/iterator_facade_abstract.rst | 8 - libs/iterator/doc/iterator_facade_body.rst | 195 - libs/iterator/doc/iterator_facade_ref.rst | 441 - .../iterator/doc/iterator_facade_tutorial.rst | 523 - libs/iterator/doc/iterator_traits.html | 109 - libs/iterator/doc/iterator_traits.pdf | Bin 49650 -> 0 bytes libs/iterator/doc/iterator_traits.rst | 77 - libs/iterator/doc/make_counting_iterator.rst | 12 - libs/iterator/doc/make_filter_iterator.rst | 19 - libs/iterator/doc/make_reverse_iterator.rst | 13 - libs/iterator/doc/make_transform_iterator.rst | 23 - libs/iterator/doc/make_zip_iterator.rst | 12 - libs/iterator/doc/new-iter-concepts.html | 1029 -- libs/iterator/doc/new-iter-concepts.pdf | Bin 175676 -> 0 bytes libs/iterator/doc/new-iter-concepts.rst | 803 - libs/iterator/doc/oldeqnew.png | Bin 33786 -> 0 bytes .../doc/permutation_iter_abstract.rst | 8 - libs/iterator/doc/permutation_iterator.html | 311 - libs/iterator/doc/permutation_iterator.pdf | Bin 66744 -> 0 bytes libs/iterator/doc/permutation_iterator.rst | 41 - .../doc/permutation_iterator_body.rst | 19 - libs/iterator/doc/permutation_iterator_eg.rst | 71 - .../iterator/doc/permutation_iterator_ref.rst | 130 - libs/iterator/doc/pointee.html | 183 - libs/iterator/doc/pointee.pdf | Bin 62356 -> 0 bytes libs/iterator/doc/pointee.rst | 88 - libs/iterator/doc/pointee_ref.rst | 38 - libs/iterator/doc/quickbook/adaptor.qbk | 333 - libs/iterator/doc/quickbook/archetypes.qbk | 160 - .../doc/quickbook/concept_checking.qbk | 54 - libs/iterator/doc/quickbook/concepts.qbk | 362 - .../doc/quickbook/counting_iterator.qbk | 192 - libs/iterator/doc/quickbook/facade.qbk | 637 - .../doc/quickbook/facade_tutorial.qbk | 507 - .../doc/quickbook/filter_iterator.qbk | 242 - .../quickbook/function_output_iterator.qbk | 100 - .../doc/quickbook/indirect_iterator.qbk | 254 - libs/iterator/doc/quickbook/iterator.qbk | 269 - .../doc/quickbook/permutation_iterator.qbk | 207 - .../doc/quickbook/reverse_iterator.qbk | 160 - .../quickbook/shared_container_iterator.qbk | 248 - .../doc/quickbook/specialized_adaptors.qbk | 22 - libs/iterator/doc/quickbook/traits.qbk | 55 - .../doc/quickbook/transform_iterator.qbk | 216 - libs/iterator/doc/quickbook/utilities.qbk | 324 - libs/iterator/doc/quickbook/zip_iterator.qbk | 266 - libs/iterator/doc/ref_problem.rst | 63 - libs/iterator/doc/reverse_iterator.html | 297 - libs/iterator/doc/reverse_iterator.pdf | Bin 61924 -> 0 bytes libs/iterator/doc/reverse_iterator.rst | 33 - .../doc/reverse_iterator_abstract.rst | 12 - libs/iterator/doc/reverse_iterator_eg.rst | 45 - libs/iterator/doc/reverse_iterator_ref.rst | 141 - libs/iterator/doc/rst2html | 10 - libs/iterator/doc/rst2latex | 7 - libs/iterator/doc/scanrst.py | 29 - libs/iterator/doc/sources.py | 25 - libs/iterator/doc/syscmd.py | 14 - libs/iterator/doc/transform_iterator.html | 346 - libs/iterator/doc/transform_iterator.pdf | Bin 67596 -> 0 bytes libs/iterator/doc/transform_iterator.rst | 32 - .../doc/transform_iterator_abstract.rst | 7 - libs/iterator/doc/transform_iterator_eg.rst | 46 - libs/iterator/doc/transform_iterator_ref.rst | 175 - libs/iterator/doc/traversal.png | Bin 9112 -> 0 bytes libs/iterator/doc/zip_iterator.html | 367 - libs/iterator/doc/zip_iterator.pdf | Bin 62372 -> 0 bytes libs/iterator/doc/zip_iterator.rst | 29 - libs/iterator/doc/zip_iterator_abstract.rst | 20 - libs/iterator/doc/zip_iterator_eg.rst | 116 - libs/iterator/doc/zip_iterator_ref.rst | 155 - .../example/counting_iterator_example.cpp | 52 - .../example/filter_iterator_example.cpp | 58 - .../example/func_output_iter_example.cpp | 46 - .../example/indirect_iterator_example.cpp | 59 - libs/iterator/example/node.hpp | 60 - libs/iterator/example/node_iterator1.cpp | 34 - libs/iterator/example/node_iterator1.hpp | 42 - libs/iterator/example/node_iterator2.cpp | 43 - libs/iterator/example/node_iterator2.hpp | 73 - libs/iterator/example/node_iterator3.cpp | 43 - libs/iterator/example/node_iterator3.hpp | 60 - .../example/permutation_iter_example.cpp | 68 - libs/iterator/example/reverse_iterator.cpp | 19 - .../example/reverse_iterator_example.cpp | 41 - .../example/transform_iterator_example.cpp | 76 - libs/iterator/index.html | 12 - libs/iterator/meta/libraries.json | 18 - libs/iterator/test/Jamfile.v2 | 58 - libs/iterator/test/concept_tests.cpp | 94 - libs/iterator/test/constant_iter_arrow.cpp | 16 - .../test/constant_iter_arrow_fail.cpp | 20 - libs/iterator/test/counting_iterator_test.cpp | 300 - .../test/detail/zip_iterator_test.ipp | 73 - .../detail/zip_iterator_test_original.ipp | 857 -- libs/iterator/test/filter_iterator_test.cpp | 272 - .../test/function_input_iterator_test.cpp | 101 - .../iterator/test/generator_iterator_test.cpp | 63 - .../test/indirect_iter_member_types.cpp | 87 - libs/iterator/test/indirect_iterator_test.cpp | 218 - libs/iterator/test/interoperable.cpp | 60 - libs/iterator/test/interoperable_fail.cpp | 21 - libs/iterator/test/is_convertible_fail.cpp | 19 - libs/iterator/test/is_lvalue_iterator.cpp | 141 - libs/iterator/test/is_readable_iterator.cpp | 90 - .../test/iter_archetype_default_ctor.cpp | 21 - libs/iterator/test/iterator_adaptor_cc.cpp | 46 - libs/iterator/test/iterator_adaptor_test.cpp | 335 - libs/iterator/test/iterator_archetype_cc.cpp | 61 - libs/iterator/test/iterator_facade.cpp | 227 - libs/iterator/test/iterator_traits_test.cpp | 218 - libs/iterator/test/lvalue_concept_fail.cpp | 20 - libs/iterator/test/minimum_category.cpp | 22 - .../test/minimum_category_compile_fail.cpp | 19 - .../test/permutation_iterator_test.cpp | 103 - libs/iterator/test/pointee.cpp | 71 - libs/iterator/test/reverse_iterator_test.cpp | 174 - libs/iterator/test/static_assert_same.hpp | 20 - .../iterator/test/transform_iterator_test.cpp | 285 - libs/iterator/test/unit_tests.cpp | 107 - libs/iterator/test/zip_iterator_test.cpp | 8 - .../test/zip_iterator_test2_fusion_deque.cpp | 9 - .../test/zip_iterator_test2_fusion_list.cpp | 11 - .../test/zip_iterator_test2_fusion_vector.cpp | 11 - .../test/zip_iterator_test2_std_tuple.cpp | 21 - .../test/zip_iterator_test_fusion.cpp | 15 - .../test/zip_iterator_test_std_pair.cpp | 16 - .../test/zip_iterator_test_std_tuple.cpp | 29 - libs/numeric/conversion/doc/Jamfile.v2 | 36 - libs/numeric/conversion/doc/bounds.qbk | 100 - libs/numeric/conversion/doc/conversion.qbk | 161 - .../conversion/doc/conversion_traits.qbk | 272 - libs/numeric/conversion/doc/converter.qbk | 293 - .../conversion/doc/converter_policies.qbk | 311 - libs/numeric/conversion/doc/definitions.qbk | 550 - .../numeric/conversion/doc/html/HTML.manifest | 10 - .../bounds___traits_class.html | 143 - .../conversion_traits___traits_class.html | 505 - .../converter___function_object.html | 462 - .../boost_numericconversion/definitions.html | 974 -- .../improved_numeric_cast__.html | 212 - .../numeric_converter_policy_classes.html | 395 - ...ements_and_user_defined_types_support.html | 554 - .../numeric/conversion/doc/html/boostbook.css | 582 - .../conversion/doc/html/images/callouts/R.png | Bin 293 -> 0 bytes .../conversion/doc/html/images/space.png | Bin 81 -> 0 bytes libs/numeric/conversion/doc/html/index.html | 181 - .../html/numeric_conversion/bibliography.html | 88 - .../history_and_acknowledgments.html | 97 - .../doc/html/standalone_HTML.manifest | 10 - libs/numeric/conversion/doc/numeric_cast.qbk | 153 - libs/numeric/conversion/doc/requirements.qbk | 448 - libs/numeric/conversion/index.html | 13 - libs/numeric/conversion/test/Jamfile.v2 | 42 - libs/numeric/conversion/test/bounds_test.cpp | 101 - .../built_in_numeric_cast_traits.cpp | 122 - .../conversion/test/converter_test.cpp | 562 - .../conversion/test/numeric_cast_test.cpp | 97 - .../test/numeric_cast_traits_test.cpp | 380 - libs/numeric/conversion/test/test_helpers.cpp | 152 - .../numeric/conversion/test/test_helpers2.cpp | 60 - .../numeric/conversion/test/test_helpers3.cpp | 144 - libs/numeric/conversion/test/traits_test.cpp | 341 - .../numeric/conversion/test/udt_example_0.cpp | 242 - .../conversion/test/udt_support_test.cpp | 309 - libs/numeric/index.html | 14 - libs/numeric/interval/doc/checking.htm | 252 - libs/numeric/interval/doc/comparisons.htm | 204 - libs/numeric/interval/doc/examples.htm | 211 - libs/numeric/interval/doc/guide.htm | 122 - libs/numeric/interval/doc/includes.htm | 218 - libs/numeric/interval/doc/index.html | 13 - libs/numeric/interval/doc/interval.htm | 990 -- libs/numeric/interval/doc/numbers.htm | 176 - libs/numeric/interval/doc/policies.htm | 80 - libs/numeric/interval/doc/rounding.htm | 632 - libs/numeric/interval/doc/todo.htm | 67 - libs/numeric/interval/examples/filter.cpp | 208 - .../interval/examples/findroot_demo.cpp | 170 - libs/numeric/interval/examples/horner.cpp | 47 - libs/numeric/interval/examples/io.cpp | 172 - .../interval/examples/newton-raphson.cpp | 146 - libs/numeric/interval/examples/rational.cpp | 43 - libs/numeric/interval/examples/transc.cpp | 90 - libs/numeric/interval/meta/libraries.json | 19 - libs/numeric/interval/test/Jamfile.v2 | 50 - libs/numeric/interval/test/add.cpp | 243 - libs/numeric/interval/test/bugs.hpp | 43 - libs/numeric/interval/test/cmp.cpp | 215 - libs/numeric/interval/test/cmp_exn.cpp | 230 - libs/numeric/interval/test/cmp_exp.cpp | 366 - libs/numeric/interval/test/cmp_header.hpp | 26 - libs/numeric/interval/test/cmp_lex.cpp | 217 - libs/numeric/interval/test/cmp_set.cpp | 218 - libs/numeric/interval/test/cmp_tribool.cpp | 224 - libs/numeric/interval/test/det.cpp | 103 - libs/numeric/interval/test/fmod.cpp | 53 - libs/numeric/interval/test/integer.cpp | 24 - libs/numeric/interval/test/msvc_x64_flags.cpp | 21 - libs/numeric/interval/test/mul.cpp | 124 - libs/numeric/interval/test/overflow.cpp | 44 - libs/numeric/interval/test/pi.cpp | 59 - libs/numeric/interval/test/pow.cpp | 42 - libs/numeric/interval/test/test_float.cpp | 128 - libs/numeric/odeint/CHANGELOG | 9 - libs/numeric/odeint/README.md | 3 - libs/numeric/odeint/doc/Jamfile.v2 | 277 - libs/numeric/odeint/doc/acknowledgements.qbk | 37 - libs/numeric/odeint/doc/concepts.qbk | 27 - .../doc/concepts/controlled_stepper.qbk | 74 - .../doc/concepts/dense_output_stepper.qbk | 85 - .../odeint/doc/concepts/error_stepper.qbk | 101 - .../odeint/doc/concepts/implicit_system.qbk | 43 - .../doc/concepts/second_order_system.qbk | 44 - .../doc/concepts/state_algebra_operations.qbk | 126 - .../odeint/doc/concepts/state_wrapper.qbk | 39 - libs/numeric/odeint/doc/concepts/stepper.qbk | 93 - .../odeint/doc/concepts/symplectic_system.qbk | 99 - libs/numeric/odeint/doc/concepts/system.qbk | 43 - .../odeint/doc/controlled_stepper_table.qbk | 55 - libs/numeric/odeint/doc/details.qbk | 30 - .../doc/details_bind_member_functions.qbk | 36 - .../odeint/doc/details_boost_range.qbk | 60 - libs/numeric/odeint/doc/details_boost_ref.qbk | 35 - .../doc/details_generation_functions.qbk | 45 - .../doc/details_integrate_functions.qbk | 147 - libs/numeric/odeint/doc/details_iterators.qbk | 195 - ...etails_state_types_algebras_operations.qbk | 482 - libs/numeric/odeint/doc/details_steppers.qbk | 421 - libs/numeric/odeint/doc/examples_table.qbk | 142 - libs/numeric/odeint/doc/getting_started.qbk | 142 - .../boost/numeric/odeint/adams_bashforth.html | 328 - .../odeint/adams_bashforth_moulton.html | 257 - .../boost/numeric/odeint/adams_moulton.html | 161 - .../numeric/odeint/adaptive_iterator.html | 91 - .../odeint/adaptive_time_iterator.html | 92 - .../html/boost/numeric/odeint/base_tag.html | 51 - .../odeint/base_tag_contr_idp64221824.html | 53 - .../odeint/base_tag_dense_idp64227712.html | 53 - .../odeint/base_tag_error_idp64215936.html | 53 - .../odeint/base_tag_expli_idp64217888.html | 53 - .../odeint/base_tag_expli_idp64219856.html | 53 - .../odeint/base_tag_expli_idp64223776.html | 53 - .../odeint/base_tag_expli_idp64225744.html | 53 - .../odeint/base_tag_stepp_idp64213984.html | 53 - .../boost/numeric/odeint/bulirsch_stoer.html | 264 - .../odeint/bulirsch_stoer_dense_out.html | 512 - .../numeric/odeint/checked_observer.html | 78 - .../odeint/checked_steppe_idp40575584.html | 86 - .../odeint/checked_steppe_idp40591776.html | 104 - .../odeint/checked_steppe_idp59310512.html | 85 - .../boost/numeric/odeint/checked_stepper.html | 63 - .../numeric/odeint/const_step_iterator.html | 92 - .../odeint/const_step_time_iterator.html | 92 - .../odeint/controlled_run_idp62987792.html | 493 - .../odeint/controlled_run_idp63082720.html | 570 - .../odeint/controlled_runge_kutta.html | 65 - .../odeint/controlled_stepper_tag.html | 51 - .../numeric/odeint/default_error_checker.html | 114 - .../odeint/default_rosenb_idp63704736.html | 114 - .../numeric/odeint/default_step_adjuster.html | 86 - .../odeint/dense_output_r_idp63206624.html | 383 - .../odeint/dense_output_r_idp63274768.html | 150 - .../odeint/dense_output_runge_kutta.html | 62 - .../odeint/dense_output_stepper_tag.html | 51 - .../numeric/odeint/error_stepper_tag.html | 51 - .../doc/html/boost/numeric/odeint/euler.html | 220 - .../odeint/explicit_contr_idp64210304.html | 53 - .../odeint/explicit_contr_idp64211312.html | 53 - .../odeint/explicit_error_generic_rk.html | 238 - .../odeint/explicit_error_idp64208896.html | 53 - .../odeint/explicit_error_stepper_tag.html | 53 - .../numeric/odeint/explicit_generic_rk.html | 256 - .../numeric/odeint/extrapolation_stepper.html | 172 - .../numeric/odeint/failed_step_checker.html | 80 - .../boost/numeric/odeint/implicit_euler.html | 105 - .../odeint/integrate_adap_idp61738944.html | 112 - .../odeint/integrate_cons_idp61780800.html | 116 - .../numeric/odeint/integrate_idp61698176.html | 115 - .../numeric/odeint/integrate_idp61718352.html | 110 - .../odeint/integrate_n_st_idp61865360.html | 113 - .../odeint/integrate_time_idp61950624.html | 112 - .../odeint/make_adaptive__idp62031392.html | 108 - .../odeint/make_adaptive__idp62081248.html | 108 - .../odeint/make_adaptive__idp62093888.html | 93 - .../odeint/make_adaptive_iterator_end.html | 93 - .../numeric/odeint/make_adaptive_range.html | 108 - .../odeint/make_adaptive_time_range.html | 108 - .../odeint/make_const_ste_idp62132800.html | 108 - .../odeint/make_const_ste_idp62145440.html | 93 - .../odeint/make_const_ste_idp62185824.html | 109 - .../odeint/make_const_ste_idp62198512.html | 93 - .../numeric/odeint/make_const_step_range.html | 108 - .../odeint/make_const_step_time_range.html | 104 - .../odeint/make_n_step_iterator_begin.html | 108 - .../odeint/make_n_step_iterator_end.html | 93 - .../numeric/odeint/make_n_step_range.html | 108 - .../odeint/make_n_step_ti_idp62291328.html | 108 - .../odeint/make_n_step_ti_idp62303904.html | 93 - .../odeint/make_n_step_time_range.html | 108 - .../odeint/make_times_iterator_begin.html | 108 - .../odeint/make_times_iterator_end.html | 95 - .../numeric/odeint/make_times_range.html | 108 - .../odeint/make_times_tim_idp62400560.html | 108 - .../odeint/make_times_tim_idp62413776.html | 95 - .../numeric/odeint/make_times_time_range.html | 108 - .../numeric/odeint/max_step_checker.html | 80 - .../odeint/modified_midpo_idp63664288.html | 118 - .../numeric/odeint/modified_midpoint.html | 113 - .../boost/numeric/odeint/n_step_iterator.html | 91 - .../numeric/odeint/n_step_time_iterator.html | 91 - .../boost/numeric/odeint/order_helper.html | 52 - .../boost/numeric/odeint/rosenbrock4.html | 138 - .../odeint/rosenbrock4_controller.html | 129 - .../odeint/rosenbrock4_dense_output.html | 128 - .../boost/numeric/odeint/runge_kutta4.html | 221 - .../numeric/odeint/runge_kutta4_classic.html | 229 - .../odeint/runge_kutta_ca_idp64042704.html | 193 - .../odeint/runge_kutta_cash_karp54.html | 185 - .../numeric/odeint/runge_kutta_dopri5.html | 210 - .../odeint/runge_kutta_fehlberg78.html | 185 - .../boost/numeric/odeint/stepper_tag.html | 51 - .../numeric/odeint/symplectic_euler.html | 136 - .../odeint/symplectic_rkn_idp64254896.html | 139 - .../odeint/symplectic_rkn_idp64277488.html | 137 - .../boost/numeric/odeint/times_iterator.html | 97 - .../numeric/odeint/times_time_iterator.html | 97 - .../boost/numeric/odeint/velocity_verlet.html | 279 - .../boost_numeric_odeint/acknowledgments.html | 41 - .../html/boost_numeric_odeint/concepts.html | 64 - .../concepts/controlled_stepper.html | 235 - .../concepts/dense_output_stepper.html | 341 - .../concepts/error_stepper.html | 369 - .../concepts/implicit_system.html | 184 - .../concepts/second_order_system.html | 168 - .../concepts/simple_symplectic_system.html | 187 - .../concepts/state_algebra_operations.html | 882 -- .../concepts/state_wrapper.html | 233 - .../concepts/stepper.html | 279 - .../concepts/symplectic_system.html | 241 - .../boost_numeric_odeint/concepts/system.html | 158 - .../boost_numeric_odeint/getting_started.html | 50 - .../getting_started/overview.html | 1168 -- .../getting_started/short_example.html | 207 - .../usage__compilation__headers.html | 95 - .../html/boost_numeric_odeint/literature.html | 102 - .../odeint_in_detail.html | 60 - .../binding_member_functions.html | 130 - .../generation_functions.html | 323 - .../odeint_in_detail/integrate_functions.html | 409 - .../iterators_and_ranges.html | 662 - .../state_types__algebras_and_operations.html | 1293 -- .../odeint_in_detail/steppers.html | 2367 --- .../odeint_in_detail/using_boost__range.html | 254 - .../odeint_in_detail/using_boost__ref.html | 87 - .../html/boost_numeric_odeint/tutorial.html | 72 - .../tutorial/all_examples.html | 601 - ...haotic_systems_and_lyapunov_exponents.html | 303 - .../tutorial/complex_state_types.html | 125 - .../tutorial/ensembles_of_oscillators.html | 200 - .../tutorial/harmonic_oscillator.html | 528 - .../tutorial/lattice_systems.html | 183 - ...allel_computation_with_openmp_and_mpi.html | 938 -- .../tutorial/self_expanding_lattices.html | 228 - .../tutorial/solar_system.html | 317 - .../tutorial/stiff_systems.html | 171 - ...itrary_precision_floating_point_types.html | 118 - .../tutorial/using_boost__units.html | 211 - ...cuda__or_openmp__tbb_______via_thrust.html | 713 - .../using_matrices_as_state_types.html | 114 - .../tutorial/using_opencl_via_vexcl.html | 177 - libs/numeric/odeint/doc/html/boostbook.css | 611 - .../odeint/integrate/check_adapter_hpp.html | 60 - .../integrate/integrate_adaptive_hpp.html | 73 - .../odeint/integrate/integrate_const_hpp.html | 88 - .../odeint/integrate/integrate_hpp.html | 61 - .../integrate/integrate_n_steps_hpp.html | 89 - .../odeint/integrate/integrate_times_hpp.html | 114 - .../integrate/max_step_checker_hpp.html | 50 - .../iterator/adaptive_iterator_hpp.html | 65 - .../iterator/adaptive_time_iterator_hpp.html | 65 - .../iterator/const_step_iterator_hpp.html | 65 - .../const_step_time_iterator_hpp.html | 65 - .../odeint/iterator/n_step_iterator_hpp.html | 65 - .../iterator/n_step_time_iterator_hpp.html | 65 - .../odeint/iterator/times_iterator_hpp.html | 66 - .../iterator/times_time_iterator_hpp.html | 67 - .../odeint/stepper/adams_bashforth_hpp.html | 57 - .../stepper/adams_bashforth_moulton_hpp.html | 55 - .../odeint/stepper/adams_moulton_hpp.html | 54 - .../stepper/bulirsch_stoer_dense_out_hpp.html | 54 - .../odeint/stepper/bulirsch_stoer_hpp.html | 54 - .../stepper/controlled_runge_kutta_hpp.html | 64 - .../stepper/controlled_step_result_hpp.html | 51 - .../stepper/dense_output_runge_kutta_hpp.html | 56 - .../numeric/odeint/stepper/euler_hpp.html | 54 - .../explicit_error_generic_rk_hpp.html | 55 - .../stepper/explicit_generic_rk_hpp.html | 52 - .../stepper/extrapolation_stepper_hpp.html | 54 - .../odeint/stepper/implicit_euler_hpp.html | 50 - .../odeint/stepper/modified_midpoint_hpp.html | 60 - .../stepper/rosenbrock4_controller_hpp.html | 49 - .../stepper/rosenbrock4_dense_output_hpp.html | 49 - .../odeint/stepper/rosenbrock4_hpp.html | 54 - .../stepper/runge_kutta4_classic_hpp.html | 54 - .../odeint/stepper/runge_kutta4_hpp.html | 54 - .../runge_kutta_cash_karp54_classic_hpp.html | 54 - .../stepper/runge_kutta_cash_karp54_hpp.html | 54 - .../stepper/runge_kutta_dopri5_hpp.html | 54 - .../stepper/runge_kutta_fehlberg78_hpp.html | 54 - .../stepper/stepper_categories_hpp.html | 66 - .../odeint/stepper/symplectic_euler_hpp.html | 55 - .../symplectic_rkn_sb3a_m4_mclachlan_hpp.html | 55 - .../symplectic_rkn_sb3a_mclachlan_hpp.html | 55 - .../odeint/stepper/velocity_verlet_hpp.html | 55 - libs/numeric/odeint/doc/html/images/alert.png | Bin 603 -> 0 bytes libs/numeric/odeint/doc/html/images/blank.png | Bin 374 -> 0 bytes .../odeint/doc/html/images/callouts/1.png | Bin 391 -> 0 bytes .../odeint/doc/html/images/callouts/1.svg | 15 - .../odeint/doc/html/images/callouts/10.png | Bin 485 -> 0 bytes .../odeint/doc/html/images/callouts/10.svg | 18 - .../odeint/doc/html/images/callouts/11.png | Bin 410 -> 0 bytes .../odeint/doc/html/images/callouts/11.svg | 16 - .../odeint/doc/html/images/callouts/12.png | Bin 488 -> 0 bytes .../odeint/doc/html/images/callouts/12.svg | 18 - .../odeint/doc/html/images/callouts/13.png | Bin 509 -> 0 bytes .../odeint/doc/html/images/callouts/13.svg | 20 - .../odeint/doc/html/images/callouts/14.png | Bin 499 -> 0 bytes .../odeint/doc/html/images/callouts/14.svg | 17 - .../odeint/doc/html/images/callouts/15.png | Bin 507 -> 0 bytes .../odeint/doc/html/images/callouts/15.svg | 19 - .../odeint/doc/html/images/callouts/16.svg | 20 - .../odeint/doc/html/images/callouts/17.svg | 17 - .../odeint/doc/html/images/callouts/18.svg | 21 - .../odeint/doc/html/images/callouts/19.svg | 20 - .../odeint/doc/html/images/callouts/2.png | Bin 446 -> 0 bytes .../odeint/doc/html/images/callouts/2.svg | 17 - .../odeint/doc/html/images/callouts/20.svg | 20 - .../odeint/doc/html/images/callouts/21.svg | 18 - .../odeint/doc/html/images/callouts/22.svg | 20 - .../odeint/doc/html/images/callouts/23.svg | 22 - .../odeint/doc/html/images/callouts/24.svg | 19 - .../odeint/doc/html/images/callouts/25.svg | 21 - .../odeint/doc/html/images/callouts/26.svg | 22 - .../odeint/doc/html/images/callouts/27.svg | 19 - .../odeint/doc/html/images/callouts/28.svg | 23 - .../odeint/doc/html/images/callouts/29.svg | 22 - .../odeint/doc/html/images/callouts/3.png | Bin 431 -> 0 bytes .../odeint/doc/html/images/callouts/3.svg | 19 - .../odeint/doc/html/images/callouts/30.svg | 22 - .../odeint/doc/html/images/callouts/4.png | Bin 441 -> 0 bytes .../odeint/doc/html/images/callouts/4.svg | 16 - .../odeint/doc/html/images/callouts/5.png | Bin 423 -> 0 bytes .../odeint/doc/html/images/callouts/5.svg | 18 - .../odeint/doc/html/images/callouts/6.png | Bin 431 -> 0 bytes .../odeint/doc/html/images/callouts/6.svg | 19 - .../odeint/doc/html/images/callouts/7.png | Bin 397 -> 0 bytes .../odeint/doc/html/images/callouts/7.svg | 16 - .../odeint/doc/html/images/callouts/8.png | Bin 434 -> 0 bytes .../odeint/doc/html/images/callouts/8.svg | 20 - .../odeint/doc/html/images/callouts/9.png | Bin 420 -> 0 bytes .../odeint/doc/html/images/callouts/9.svg | 19 - .../odeint/doc/html/images/caution.png | Bin 1250 -> 0 bytes .../odeint/doc/html/images/caution.svg | 68 - libs/numeric/odeint/doc/html/images/draft.png | Bin 17454 -> 0 bytes libs/numeric/odeint/doc/html/images/home.png | Bin 358 -> 0 bytes libs/numeric/odeint/doc/html/images/home.svg | 26 - .../odeint/doc/html/images/important.png | Bin 722 -> 0 bytes .../odeint/doc/html/images/important.svg | 25 - libs/numeric/odeint/doc/html/images/next.png | Bin 336 -> 0 bytes libs/numeric/odeint/doc/html/images/next.svg | 19 - .../odeint/doc/html/images/next_disabled.png | Bin 1110 -> 0 bytes libs/numeric/odeint/doc/html/images/note.png | Bin 490 -> 0 bytes libs/numeric/odeint/doc/html/images/note.svg | 33 - libs/numeric/odeint/doc/html/images/prev.png | Bin 334 -> 0 bytes libs/numeric/odeint/doc/html/images/prev.svg | 19 - .../odeint/doc/html/images/prev_disabled.png | Bin 1109 -> 0 bytes .../numeric/odeint/doc/html/images/smiley.png | Bin 867 -> 0 bytes libs/numeric/odeint/doc/html/images/tip.png | Bin 449 -> 0 bytes libs/numeric/odeint/doc/html/images/tip.svg | 84 - .../odeint/doc/html/images/toc-blank.png | Bin 318 -> 0 bytes .../odeint/doc/html/images/toc-minus.png | Bin 259 -> 0 bytes .../odeint/doc/html/images/toc-plus.png | Bin 264 -> 0 bytes libs/numeric/odeint/doc/html/images/up.png | Bin 370 -> 0 bytes libs/numeric/odeint/doc/html/images/up.svg | 19 - .../odeint/doc/html/images/up_disabled.png | Bin 1115 -> 0 bytes .../odeint/doc/html/images/warning.png | Bin 1241 -> 0 bytes .../odeint/doc/html/images/warning.svg | 23 - libs/numeric/odeint/doc/html/index.html | 178 - libs/numeric/odeint/doc/html/logo.jpg | Bin 9048 -> 0 bytes .../odeint/doc/html/odeint/indexes.html | 69 - .../odeint/doc/html/odeint_reference.html | 87 - .../odeint/doc/html/phase_lattice_2d_0000.jpg | Bin 1995 -> 0 bytes .../odeint/doc/html/phase_lattice_2d_0100.jpg | Bin 3231 -> 0 bytes .../odeint/doc/html/phase_lattice_2d_1000.jpg | Bin 13287 -> 0 bytes libs/numeric/odeint/doc/html/solar_system.jpg | Bin 31597 -> 0 bytes .../odeint/doc/html/standalone_HTML.manifest | 186 - libs/numeric/odeint/doc/literature.qbk | 53 - .../odeint/doc/make_controlled_table.qbk | 20 - .../odeint/doc/make_dense_output_table.qbk | 19 - libs/numeric/odeint/doc/odeint.idx | 54 - libs/numeric/odeint/doc/odeint.qbk | 273 - libs/numeric/odeint/doc/range_table.qbk | 70 - libs/numeric/odeint/doc/reference.xml | 4720 ------ libs/numeric/odeint/doc/stepper_table.qbk | 44 - libs/numeric/odeint/doc/tutorial.qbk | 46 - .../odeint/doc/tutorial_chaotic_system.qbk | 162 - .../doc/tutorial_harmonic_oscillator.qbk | 123 - libs/numeric/odeint/doc/tutorial_parallel.qbk | 266 - .../odeint/doc/tutorial_solar_system.qbk | 109 - .../odeint/doc/tutorial_special_topics.qbk | 274 - .../odeint/doc/tutorial_stiff_systems.qbk | 62 - .../odeint/doc/tutorial_thrust_cuda.qbk | 172 - .../odeint/doc/tutorial_vexcl_opencl.qbk | 53 - .../odeint/examples/2d_lattice/Jamfile.v2 | 13 - .../odeint/examples/2d_lattice/lattice2d.hpp | 165 - .../2d_lattice/nested_range_algebra.hpp | 46 - .../odeint/examples/2d_lattice/spreading.cpp | 122 - .../2d_lattice/vector_vector_resize.hpp | 105 - libs/numeric/odeint/examples/Jamfile.v2 | 51 - .../numeric/odeint/examples/abm_precision.cpp | 84 - .../odeint/examples/adaptive_iterator.cpp | 361 - .../odeint/examples/bind_member_functions.cpp | 126 - .../examples/bind_member_functions_cpp11.cpp | 56 - .../odeint/examples/bulirsch_stoer.cpp | 100 - .../odeint/examples/chaotic_system.cpp | 119 - .../odeint/examples/const_step_iterator.cpp | 296 - libs/numeric/odeint/examples/elliptic.py | 31 - .../odeint/examples/elliptic_functions.cpp | 89 - .../numeric/odeint/examples/find_crossing.cpp | 134 - libs/numeric/odeint/examples/fpu.cpp | 169 - .../odeint/examples/generation_functions.cpp | 113 - libs/numeric/odeint/examples/gmpxx/Makefile | 5 - .../odeint/examples/gmpxx/lorenz_gmpxx.cpp | 83 - libs/numeric/odeint/examples/gram_schmidt.hpp | 89 - .../odeint/examples/harmonic_oscillator.cpp | 211 - .../examples/harmonic_oscillator_units.cpp | 121 - libs/numeric/odeint/examples/heun.cpp | 170 - .../odeint/examples/integrate_times.cpp | 54 - libs/numeric/odeint/examples/list_lattice.cpp | 78 - libs/numeric/odeint/examples/lorenz.cpp | 31 - libs/numeric/odeint/examples/lorenz_point.cpp | 119 - .../odeint/examples/molecular_dynamics.cpp | 160 - .../examples/molecular_dynamics_cells.cpp | 377 - libs/numeric/odeint/examples/mpi/Jamfile.v2 | 15 - .../odeint/examples/mpi/phase_chain.cpp | 120 - libs/numeric/odeint/examples/mtl/Jamfile.v2 | 17 - .../odeint/examples/mtl/gauss_packet.cpp | 141 - .../examples/mtl/implicit_euler_mtl.cpp | 324 - .../odeint/examples/multiprecision/Jamfile | 16 - .../examples/multiprecision/cmp_precision.cpp | 68 - .../examples/multiprecision/lorenz_mp.cpp | 81 - libs/numeric/odeint/examples/my_vector.cpp | 114 - libs/numeric/odeint/examples/nt2/Jamfile.v2 | 34 - .../nt2/phase_oscillator_ensemble.cpp | 170 - .../numeric/odeint/examples/openmp/Jamfile.v2 | 23 - .../examples/openmp/lorenz_ensemble.cpp | 91 - .../openmp/lorenz_ensemble_nested.cpp | 75 - .../openmp/lorenz_ensemble_simple.cpp | 79 - .../numeric/odeint/examples/openmp/openmp.jam | 52 - .../odeint/examples/openmp/phase_chain.cpp | 95 - .../examples/openmp/phase_chain_omp_state.cpp | 98 - .../examples/phase_oscillator_ensemble.cpp | 151 - libs/numeric/odeint/examples/point_type.hpp | 177 - .../odeint/examples/quadmath/Jamfile.v2 | 16 - .../odeint/examples/quadmath/black_hole.cpp | 151 - .../odeint/examples/resizing_lattice.cpp | 169 - libs/numeric/odeint/examples/simple1d.cpp | 44 - libs/numeric/odeint/examples/solar_system.agr | 12672 ---------------- libs/numeric/odeint/examples/solar_system.cpp | 201 - .../odeint/examples/stepper_details.cpp | 200 - libs/numeric/odeint/examples/stiff_system.cpp | 118 - .../odeint/examples/stochastic_euler.cpp | 147 - .../numeric/odeint/examples/stuart_landau.cpp | 87 - libs/numeric/odeint/examples/thrust/Makefile | 34 - .../examples/thrust/lorenz_parameters.cu | 296 - .../examples/thrust/phase_oscillator_chain.cu | 156 - .../thrust/phase_oscillator_ensemble.cu | 280 - .../odeint/examples/thrust/relaxation.cu | 81 - .../two_dimensional_phase_lattice.cpp | 158 - libs/numeric/odeint/examples/ublas/Jamfile.v2 | 13 - .../odeint/examples/ublas/lorenz_ublas.cpp | 40 - .../odeint/examples/van_der_pol_stiff.cpp | 95 - libs/numeric/odeint/examples/vexcl/Jamfile.v2 | 32 - .../odeint/examples/vexcl/lorenz_ensemble.cpp | 86 - libs/numeric/odeint/fix-copyright.py | 71 - libs/numeric/odeint/index.html | 20 - libs/numeric/odeint/meta/libraries.json | 16 - libs/numeric/odeint/performance/Jamfile.v2 | 32 - libs/numeric/odeint/performance/Makefile | 43 - libs/numeric/odeint/performance/SIMD/Makefile | 33 - .../odeint/performance/SIMD/perf_roessler.sh | 22 - .../odeint/performance/SIMD/roessler.cpp | 125 - .../odeint/performance/SIMD/roessler_simd.cpp | 149 - libs/numeric/odeint/performance/c_lorenz.c | 57 - .../odeint/performance/fortran_lorenz.f90 | 60 - libs/numeric/odeint/performance/lorenz.hpp | 33 - .../odeint/performance/odeint_rk4_array.cpp | 63 - .../numeric/odeint/performance/plot_result.py | 64 - libs/numeric/odeint/test/Jamfile.v2 | 102 - libs/numeric/odeint/test/adams_bashforth.cpp | 232 - .../odeint/test/adams_bashforth_moulton.cpp | 112 - libs/numeric/odeint/test/adams_moulton.cpp | 104 - .../numeric/odeint/test/adaptive_iterator.cpp | 346 - .../odeint/test/adaptive_time_iterator.cpp | 332 - .../odeint/test/algebra_dispatcher.cpp | 82 - .../odeint/test/boost_units_helpers.hpp | 59 - libs/numeric/odeint/test/bulirsch_stoer.cpp | 155 - libs/numeric/odeint/test/const_range.hpp | 50 - .../odeint/test/const_step_iterator.cpp | 232 - .../odeint/test/const_step_time_iterator.cpp | 218 - .../odeint/test/default_operations.cpp | 257 - .../odeint/test/diagnostic_state_type.hpp | 185 - libs/numeric/odeint/test/dummy_observers.hpp | 41 - libs/numeric/odeint/test/dummy_odes.hpp | 151 - libs/numeric/odeint/test/dummy_steppers.hpp | 122 - libs/numeric/odeint/test/euler_stepper.cpp | 105 - libs/numeric/odeint/test/fusion_algebra.cpp | 184 - libs/numeric/odeint/test/generation.cpp | 87 - .../odeint/test/generic_error_stepper.cpp | 111 - libs/numeric/odeint/test/generic_stepper.cpp | 104 - libs/numeric/odeint/test/implicit_euler.cpp | 86 - libs/numeric/odeint/test/integrate.cpp | 285 - .../odeint/test/integrate_implicit.cpp | 233 - .../odeint/test/integrate_overflow.cpp | 200 - .../odeint/test/integrate_stepper_refs.cpp | 271 - libs/numeric/odeint/test/integrate_times.cpp | 247 - .../odeint/test/integrators_symplectic.cpp | 74 - libs/numeric/odeint/test/is_pair.cpp | 49 - libs/numeric/odeint/test/is_resizeable.cpp | 116 - libs/numeric/odeint/test/multi_array.cpp | 211 - libs/numeric/odeint/test/n_step_iterator.cpp | 225 - .../odeint/test/n_step_time_iterator.cpp | 213 - libs/numeric/odeint/test/numeric/Jamfile.v2 | 35 - .../test/numeric/abm_time_dependent.cpp | 85 - .../odeint/test/numeric/adams_bashforth.cpp | 117 - .../test/numeric/adams_bashforth_moulton.cpp | 119 - .../test/numeric/order_quadrature_formula.cpp | 191 - .../odeint/test/numeric/rosenbrock.cpp | 89 - .../odeint/test/numeric/runge_kutta.cpp | 177 - .../odeint/test/numeric/symplectic.cpp | 95 - .../odeint/test/numeric/velocity_verlet.cpp | 93 - .../odeint/test/prepare_stepper_testing.hpp | 74 - libs/numeric/odeint/test/range_algebra.cpp | 143 - .../numeric/odeint/test/regression/Jamfile.v2 | 30 - .../odeint/test/regression/regression_147.cpp | 88 - .../odeint/test/regression/regression_149.cpp | 84 - .../odeint/test/regression/regression_168.cpp | 90 - libs/numeric/odeint/test/resize.cpp | 98 - libs/numeric/odeint/test/resizing.cpp | 110 - .../odeint/test/resizing_test_state_type.hpp | 69 - libs/numeric/odeint/test/rosenbrock4.cpp | 140 - libs/numeric/odeint/test/rosenbrock4_mp.cpp | 143 - .../odeint/test/runge_kutta_concepts.cpp | 216 - .../test/runge_kutta_controlled_concepts.cpp | 210 - .../test/runge_kutta_error_concepts.cpp | 182 - libs/numeric/odeint/test/same_size.cpp | 65 - libs/numeric/odeint/test/split.cpp | 68 - libs/numeric/odeint/test/std_array.cpp | 57 - .../odeint/test/step_size_limitation.cpp | 268 - libs/numeric/odeint/test/stepper_copying.cpp | 856 -- .../odeint/test/stepper_with_ranges.cpp | 292 - .../odeint/test/stepper_with_units.cpp | 328 - .../odeint/test/symplectic_steppers.cpp | 391 - libs/numeric/odeint/test/times_iterator.cpp | 237 - .../odeint/test/times_time_iterator.cpp | 250 - libs/numeric/odeint/test/trivial_state.cpp | 109 - .../odeint/test/unwrap_boost_reference.cpp | 40 - libs/numeric/odeint/test/unwrap_reference.cpp | 42 - libs/numeric/odeint/test/velocity_verlet.cpp | 298 - .../odeint/test_external/eigen/Jamfile.v2 | 36 - .../test_external/eigen/fail_integrate.cpp | 47 - .../odeint/test_external/eigen/integrate.cpp | 69 - .../test_external/eigen/is_resizeable.cpp | 47 - .../odeint/test_external/eigen/resize.cpp | 145 - .../test_external/eigen/runge_kutta4.cpp | 94 - .../eigen/runge_kutta_dopri5.cpp | 132 - .../odeint/test_external/eigen/same_size.cpp | 83 - .../odeint/test_external/gmp/Jamfile.v2 | 26 - .../odeint/test_external/gmp/check_gmp.cpp | 165 - .../test_external/gmp/gmp_integrate.cpp | 169 - .../odeint/test_external/gsl/Jamfile.v2 | 28 - .../odeint/test_external/gsl/check_gsl.cpp | 58 - .../odeint/test_external/mkl/Jamfile.v2 | 30 - .../odeint/test_external/mkl/check_mkl.cpp | 51 - .../odeint/test_external/mpi/Jamfile.v2 | 27 - .../odeint/test_external/mpi/norm_test.cpp | 62 - .../odeint/test_external/mpi/split_test.cpp | 61 - .../odeint/test_external/mpi/state_test.cpp | 78 - .../odeint/test_external/mtl4/Jamfile.v2 | 30 - .../odeint/test_external/mtl4/mtl4_resize.cpp | 89 - .../odeint/test_external/nt2/Jamfile.v2 | 44 - .../test_external/nt2/algebra_dispatcher.cpp | 55 - .../numeric/odeint/test_external/nt2/copy.cpp | 44 - .../test_external/nt2/is_resizeable.cpp | 36 - .../odeint/test_external/nt2/norm_inf.cpp | 46 - .../odeint/test_external/nt2/resize.cpp | 45 - .../odeint/test_external/thrust/Makefile | 34 - .../test_external/thrust/check_thrust.cu | 72 - .../odeint/test_external/vexcl/Jamfile.v2 | 35 - .../odeint/test_external/vexcl/lorenz.cpp | 147 - .../odeint/test_external/vexcl/norm_inf.cpp | 25 - libs/numeric/odeint/toolset.jam.patch | 61 - libs/numeric/sublibs | 1 - libs/numeric/ublas/Changelog | 25 - .../qtcreator/benchmarks/bench1/bench1.pro | 16 - .../qtcreator/benchmarks/bench2/bench2.pro | 16 - .../qtcreator/benchmarks/bench3/bench3.pro | 16 - .../qtcreator/benchmarks/bench4/bench4.pro | 15 - .../qtcreator/benchmarks/bench5/bench5.pro | 12 - .../IDEs/qtcreator/benchmarks/benchmarks.pro | 2 - .../qtcreator/benchmarks/configuration.pri | 13 - .../IDEs/qtcreator/include/detail/detail.pri | 12 - .../include/experimental/experimental.pri | 2 - .../ublas/IDEs/qtcreator/include/include.pro | 47 - .../qtcreator/include/operation/operation.pri | 7 - .../IDEs/qtcreator/include/traits/traits.pri | 4 - .../ublas/IDEs/qtcreator/test/begin_end.pro | 10 - .../IDEs/qtcreator/test/comp_mat_erase.pro | 7 - .../ublas/IDEs/qtcreator/test/concepts.pro | 16 - .../IDEs/qtcreator/test/configuration.pri | 51 - .../ublas/IDEs/qtcreator/test/num_columns.pro | 10 - .../ublas/IDEs/qtcreator/test/num_rows.pro | 10 - .../IDEs/qtcreator/test/placement_new.pro | 7 - .../ublas/IDEs/qtcreator/test/size.pro | 10 - .../IDEs/qtcreator/test/sparse_view_test.pro | 7 - .../ublas/IDEs/qtcreator/test/test1.pro | 14 - .../ublas/IDEs/qtcreator/test/test2.pro | 14 - .../ublas/IDEs/qtcreator/test/test3.pro | 14 - .../ublas/IDEs/qtcreator/test/test3_coo.pro | 14 - .../ublas/IDEs/qtcreator/test/test3_mvov.pro | 19 - .../ublas/IDEs/qtcreator/test/test4.pro | 13 - .../ublas/IDEs/qtcreator/test/test5.pro | 13 - .../ublas/IDEs/qtcreator/test/test6.pro | 13 - .../ublas/IDEs/qtcreator/test/test7.pro | 16 - .../IDEs/qtcreator/test/test_assignment.pro | 13 - .../test/test_banded_storage_layout.pro | 10 - .../qtcreator/test/test_complex_norms.pro | 10 - ..._coordinate_matrix_always_do_full_sort.pro | 13 - .../test_coordinate_matrix_inplace_merge.pro | 10 - .../test/test_coordinate_matrix_sort.pro | 10 - .../test_coordinate_vector_inplace_merge.pro | 9 - .../qtcreator/test/test_fixed_containers.pro | 10 - .../test/test_inplace_solve_basic.pro | 13 - .../test/test_inplace_solve_mvov.pro | 13 - .../test/test_inplace_solve_sparse.pro | 14 - .../ublas/IDEs/qtcreator/test/test_lu.pro | 10 - .../qtcreator/test/test_matrix_vector.pro | 13 - .../IDEs/qtcreator/test/test_ticket7296.pro | 10 - .../IDEs/qtcreator/test/test_triangular.pro | 16 - .../IDEs/qtcreator/test/triangular_access.pro | 12 - .../IDEs/qtcreator/test/triangular_layout.pro | 7 - libs/numeric/ublas/IDEs/qtcreator/tests.pri | 74 - .../ublas/IDEs/qtcreator/ublas_develop.pro | 6 - libs/numeric/ublas/README.md | 15 - .../ublas/benchmarks/bench1/Jamfile.v2 | 10 - .../ublas/benchmarks/bench1/bench1.cpp | 122 - .../ublas/benchmarks/bench1/bench1.hpp | 159 - .../ublas/benchmarks/bench1/bench11.cpp | 287 - .../ublas/benchmarks/bench1/bench12.cpp | 491 - .../ublas/benchmarks/bench1/bench13.cpp | 192 - .../ublas/benchmarks/bench2/Jamfile.v2 | 10 - .../ublas/benchmarks/bench2/bench2.cpp | 122 - .../ublas/benchmarks/bench2/bench2.hpp | 182 - .../ublas/benchmarks/bench2/bench21.cpp | 282 - .../ublas/benchmarks/bench2/bench22.cpp | 469 - .../ublas/benchmarks/bench2/bench23.cpp | 196 - .../ublas/benchmarks/bench3/Jamfile.v2 | 10 - .../ublas/benchmarks/bench3/bench3.cpp | 122 - .../ublas/benchmarks/bench3/bench3.hpp | 159 - .../ublas/benchmarks/bench3/bench31.cpp | 296 - .../ublas/benchmarks/bench3/bench32.cpp | 501 - .../ublas/benchmarks/bench3/bench33.cpp | 198 - .../ublas/benchmarks/bench4/Jamfile.v2 | 12 - .../ublas/benchmarks/bench4/bench4.cpp | 135 - .../ublas/benchmarks/bench4/bench41.cpp | 46 - .../ublas/benchmarks/bench4/bench42.cpp | 46 - .../ublas/benchmarks/bench4/bench43.cpp | 46 - .../ublas/benchmarks/bench5/Jamfile.v2 | 11 - .../benchmarks/bench5/assignment_bench.cpp | 141 - libs/numeric/ublas/doc/banded.html | 580 - libs/numeric/ublas/doc/blas.html | 452 - libs/numeric/ublas/doc/bounded_array.html | 219 - libs/numeric/ublas/doc/container_concept.html | 424 - .../numeric/ublas/doc/expression_concept.html | 1074 -- libs/numeric/ublas/doc/hermitian.html | 597 - libs/numeric/ublas/doc/index.html | 391 - libs/numeric/ublas/doc/iterator_concept.html | 1168 -- libs/numeric/ublas/doc/js/jquery-1.3.2.min.js | 19 - libs/numeric/ublas/doc/js/jquery.toc-gw.js | 166 - libs/numeric/ublas/doc/matrix.html | 768 - libs/numeric/ublas/doc/matrix_expression.html | 1428 -- libs/numeric/ublas/doc/matrix_proxy.html | 1428 -- libs/numeric/ublas/doc/matrix_sparse.html | 983 -- .../ublas/doc/operations_overview.html | 261 - libs/numeric/ublas/doc/options.html | 247 - libs/numeric/ublas/doc/overview.html | 965 -- libs/numeric/ublas/doc/products.html | 318 - libs/numeric/ublas/doc/range.html | 229 - libs/numeric/ublas/doc/release_notes.html | 101 - libs/numeric/ublas/doc/samples/Jamfile.v2 | 228 - .../ublas/doc/samples/assignment_examples.cpp | 319 - .../ublas/doc/samples/banded_adaptor.cpp | 25 - .../ublas/doc/samples/banded_matrix.cpp | 24 - .../ublas/doc/samples/bounded_array.cpp | 23 - .../ublas/doc/samples/compressed_matrix.cpp | 24 - .../ublas/doc/samples/compressed_vector.cpp | 23 - .../ublas/doc/samples/coordinate_matrix.cpp | 24 - .../ublas/doc/samples/coordinate_vector.cpp | 23 - .../ublas/doc/samples/ex_triangular.cpp | 58 - .../ublas/doc/samples/hermitian_adaptor.cpp | 34 - .../ublas/doc/samples/hermitian_matrix.cpp | 33 - .../ublas/doc/samples/identity_matrix.cpp | 21 - libs/numeric/ublas/doc/samples/map_array.cpp | 24 - .../ublas/doc/samples/mapped_matrix.cpp | 24 - .../ublas/doc/samples/mapped_vector.cpp | 23 - libs/numeric/ublas/doc/samples/matrix.cpp | 24 - .../ublas/doc/samples/matrix_binary.cpp | 26 - .../doc/samples/matrix_binary_scalar.cpp | 26 - .../ublas/doc/samples/matrix_column.cpp | 27 - .../doc/samples/matrix_column_project.cpp | 26 - .../doc/samples/matrix_matrix_binary.cpp | 25 - .../ublas/doc/samples/matrix_matrix_solve.cpp | 25 - .../ublas/doc/samples/matrix_range.cpp | 26 - .../doc/samples/matrix_range_project.cpp | 25 - libs/numeric/ublas/doc/samples/matrix_row.cpp | 27 - .../ublas/doc/samples/matrix_row_project.cpp | 26 - .../ublas/doc/samples/matrix_slice.cpp | 26 - .../doc/samples/matrix_slice_project.cpp | 25 - .../ublas/doc/samples/matrix_unary.cpp | 30 - .../doc/samples/matrix_vector_binary.cpp | 29 - .../ublas/doc/samples/matrix_vector_range.cpp | 27 - .../ublas/doc/samples/matrix_vector_slice.cpp | 27 - .../ublas/doc/samples/matrix_vector_solve.cpp | 29 - libs/numeric/ublas/doc/samples/range.cpp | 22 - libs/numeric/ublas/doc/samples/slice.cpp | 22 - .../ublas/doc/samples/symmetric_adaptor.cpp | 30 - .../ublas/doc/samples/symmetric_matrix.cpp | 29 - .../ublas/doc/samples/triangular_adaptor.cpp | 30 - .../ublas/doc/samples/triangular_matrix.cpp | 29 - .../ublas/doc/samples/unbounded_array.cpp | 23 - .../numeric/ublas/doc/samples/unit_vector.cpp | 23 - libs/numeric/ublas/doc/samples/vector.cpp | 23 - .../ublas/doc/samples/vector_binary.cpp | 25 - .../ublas/doc/samples/vector_binary_outer.cpp | 24 - .../ublas/doc/samples/vector_binary_redux.cpp | 23 - .../doc/samples/vector_binary_scalar.cpp | 25 - .../ublas/doc/samples/vector_range.cpp | 25 - .../doc/samples/vector_range_project.cpp | 24 - .../ublas/doc/samples/vector_slice.cpp | 25 - .../doc/samples/vector_slice_project.cpp | 24 - .../ublas/doc/samples/vector_unary.cpp | 29 - .../ublas/doc/samples/vector_unary_redux.cpp | 27 - .../numeric/ublas/doc/samples/zero_matrix.cpp | 21 - .../numeric/ublas/doc/samples/zero_vector.cpp | 21 - libs/numeric/ublas/doc/storage_concept.html | 157 - libs/numeric/ublas/doc/storage_sparse.html | 288 - libs/numeric/ublas/doc/symmetric.html | 588 - libs/numeric/ublas/doc/triangular.html | 602 - libs/numeric/ublas/doc/types_overview.html | 580 - libs/numeric/ublas/doc/ublas.css | 59 - libs/numeric/ublas/doc/unbounded_array.html | 219 - libs/numeric/ublas/doc/vector.html | 755 - libs/numeric/ublas/doc/vector_expression.html | 969 -- libs/numeric/ublas/doc/vector_proxy.html | 527 - libs/numeric/ublas/doc/vector_sparse.html | 800 - libs/numeric/ublas/index.html | 10 - libs/numeric/ublas/meta/libraries.json | 15 - libs/numeric/ublas/test/Jamfile.v2 | 222 - libs/numeric/ublas/test/README | 31 - libs/numeric/ublas/test/begin_end.cpp | 181 - libs/numeric/ublas/test/common/init.hpp | 100 - libs/numeric/ublas/test/common/testhelper.hpp | 135 - libs/numeric/ublas/test/comp_mat_erase.cpp | 106 - libs/numeric/ublas/test/concepts.cpp | 34 - libs/numeric/ublas/test/manual/Jamfile.v2 | 8 - libs/numeric/ublas/test/manual/sp_resize.cpp | 55 - .../ublas/test/manual/test_move_semantics.cpp | 127 - libs/numeric/ublas/test/num_columns.cpp | 110 - libs/numeric/ublas/test/num_rows.cpp | 110 - libs/numeric/ublas/test/placement_new.cpp | 63 - libs/numeric/ublas/test/size.cpp | 275 - libs/numeric/ublas/test/sparse_view_test.cpp | 106 - libs/numeric/ublas/test/test1.cpp | 20 - libs/numeric/ublas/test/test1.hpp | 33 - libs/numeric/ublas/test/test11.cpp | 265 - libs/numeric/ublas/test/test12.cpp | 277 - libs/numeric/ublas/test/test13.cpp | 325 - libs/numeric/ublas/test/test2.cpp | 87 - libs/numeric/ublas/test/test2.hpp | 51 - libs/numeric/ublas/test/test21.cpp | 95 - libs/numeric/ublas/test/test22.cpp | 147 - libs/numeric/ublas/test/test23.cpp | 208 - libs/numeric/ublas/test/test3.cpp | 20 - libs/numeric/ublas/test/test3.hpp | 38 - libs/numeric/ublas/test/test31.cpp | 248 - libs/numeric/ublas/test/test32.cpp | 354 - libs/numeric/ublas/test/test33.cpp | 371 - libs/numeric/ublas/test/test4.cpp | 19 - libs/numeric/ublas/test/test4.hpp | 39 - libs/numeric/ublas/test/test42.cpp | 361 - libs/numeric/ublas/test/test43.cpp | 326 - libs/numeric/ublas/test/test5.cpp | 19 - libs/numeric/ublas/test/test5.hpp | 35 - libs/numeric/ublas/test/test52.cpp | 214 - libs/numeric/ublas/test/test53.cpp | 223 - libs/numeric/ublas/test/test6.cpp | 19 - libs/numeric/ublas/test/test6.hpp | 32 - libs/numeric/ublas/test/test62.cpp | 218 - libs/numeric/ublas/test/test63.cpp | 223 - libs/numeric/ublas/test/test7.cpp | 31 - libs/numeric/ublas/test/test7.hpp | 36 - libs/numeric/ublas/test/test71.cpp | 170 - libs/numeric/ublas/test/test72.cpp | 165 - libs/numeric/ublas/test/test73.cpp | 202 - libs/numeric/ublas/test/test_assignment.cpp | 780 - .../ublas/test/test_banded_storage_layout.cpp | 291 - .../numeric/ublas/test/test_complex_norms.cpp | 82 - .../test_coordinate_matrix_inplace_merge.cpp | 120 - .../test/test_coordinate_matrix_sort.cpp | 73 - .../test_coordinate_vector_inplace_merge.cpp | 109 - .../ublas/test/test_fixed_containers.cpp | 309 - .../numeric/ublas/test/test_inplace_solve.cpp | 123 - libs/numeric/ublas/test/test_lu.cpp | 70 - .../numeric/ublas/test/test_matrix_vector.cpp | 458 - libs/numeric/ublas/test/test_ticket7296.cpp | 292 - libs/numeric/ublas/test/test_triangular.cpp | 129 - libs/numeric/ublas/test/triangular_access.cpp | 220 - libs/numeric/ublas/test/triangular_layout.cpp | 139 - libs/numeric/ublas/test/utils.hpp | 396 - libs/range/doc/Jamfile.v2 | 35 - libs/range/doc/boost_range.qbk | 199 - libs/range/doc/concepts.qbk | 255 - libs/range/doc/example.cpp | 151 - libs/range/doc/examples.qbk | 28 - libs/range/doc/faq.qbk | 30 - libs/range/doc/headers.qbk | 143 - libs/range/doc/history_ack.qbk | 58 - libs/range/doc/html/index.html | 159 - libs/range/doc/html/quickbook_HTML.manifest | 158 - libs/range/doc/html/range/concepts.html | 52 - .../range/concepts/bidirectional_range.html | 301 - .../html/range/concepts/concept_checking.html | 108 - .../html/range/concepts/forward_range.html | 163 - .../doc/html/range/concepts/overview.html | 80 - .../range/concepts/random_access_range.html | 187 - .../range/concepts/single_pass_range.html | 352 - libs/range/doc/html/range/examples.html | 75 - libs/range/doc/html/range/faq.html | 90 - libs/range/doc/html/range/headers.html | 50 - .../doc/html/range/headers/adaptors.html | 233 - .../doc/html/range/headers/algorithm.html | 684 - .../doc/html/range/headers/algorithm_ext.html | 172 - .../range/doc/html/range/headers/general.html | 552 - libs/range/doc/html/range/history_ack.html | 157 - libs/range/doc/html/range/introduction.html | 127 - libs/range/doc/html/range/mfc_atl.html | 141 - .../doc/html/range/mfc_atl/atl_ranges.html | 375 - .../doc/html/range/mfc_atl/const_ranges.html | 125 - .../doc/html/range/mfc_atl/mfc_ranges.html | 485 - .../doc/html/range/mfc_atl/references.html | 57 - .../doc/html/range/mfc_atl/requirements.html | 52 - libs/range/doc/html/range/portability.html | 92 - libs/range/doc/html/range/reference.html | 98 - .../doc/html/range/reference/adaptors.html | 51 - .../adaptors/general_requirements.html | 142 - .../reference/adaptors/introduction.html | 279 - .../range/reference/adaptors/reference.html | 62 - .../adaptors/reference/adjacent_filtered.html | 160 - .../reference/adaptors/reference/copied.html | 156 - .../adaptors/reference/filtered.html | 163 - .../reference/adaptors/reference/indexed.html | 244 - .../adaptors/reference/indirected.html | 156 - .../adaptors/reference/map_keys.html | 156 - .../adaptors/reference/map_values.html | 158 - .../adaptors/reference/replaced.html | 172 - .../adaptors/reference/replaced_if.html | 173 - .../adaptors/reference/reversed.html | 147 - .../reference/adaptors/reference/sliced.html | 157 - .../reference/adaptors/reference/strided.html | 149 - .../adaptors/reference/tokenized.html | 197 - .../adaptors/reference/transformed.html | 166 - .../adaptors/reference/type_erased.html | 304 - .../reference/adaptors/reference/uniqued.html | 152 - .../doc/html/range/reference/algorithms.html | 57 - .../html/range/reference/algorithms/heap.html | 50 - .../reference/algorithms/heap/make_heap.html | 143 - .../reference/algorithms/heap/pop_heap.html | 157 - .../reference/algorithms/heap/push_heap.html | 155 - .../reference/algorithms/heap/sort_heap.html | 152 - .../reference/algorithms/introduction.html | 254 - .../range/reference/algorithms/mutating.html | 76 - .../reference/algorithms/mutating/copy.html | 115 - .../algorithms/mutating/copy_backward.html | 124 - .../reference/algorithms/mutating/fill.html | 101 - .../reference/algorithms/mutating/fill_n.html | 101 - .../algorithms/mutating/generate.html | 120 - .../algorithms/mutating/inplace_merge.html | 186 - .../reference/algorithms/mutating/merge.html | 256 - .../algorithms/mutating/nth_element.html | 150 - .../algorithms/mutating/partial_sort.html | 155 - .../algorithms/mutating/partition.html | 135 - .../algorithms/mutating/random_shuffle.html | 131 - .../reference/algorithms/mutating/remove.html | 138 - .../algorithms/mutating/remove_copy.html | 108 - .../algorithms/mutating/remove_copy_if.html | 103 - .../algorithms/mutating/remove_if.html | 137 - .../algorithms/mutating/replace.html | 118 - .../algorithms/mutating/replace_copy.html | 111 - .../algorithms/mutating/replace_copy_if.html | 113 - .../algorithms/mutating/replace_if.html | 116 - .../algorithms/mutating/reverse.html | 96 - .../algorithms/mutating/reverse_copy.html | 100 - .../reference/algorithms/mutating/rotate.html | 109 - .../algorithms/mutating/rotate_copy.html | 111 - .../reference/algorithms/mutating/sort.html | 153 - .../algorithms/mutating/stable_partition.html | 134 - .../algorithms/mutating/stable_sort.html | 156 - .../algorithms/mutating/swap_ranges.html | 103 - .../algorithms/mutating/transform.html | 227 - .../reference/algorithms/mutating/unique.html | 163 - .../algorithms/mutating/unique_copy.html | 142 - .../html/range/reference/algorithms/new.html | 57 - .../reference/algorithms/new/copy_n.html | 103 - .../range/reference/algorithms/new/erase.html | 96 - .../reference/algorithms/new/for_each.html | 149 - .../reference/algorithms/new/insert.html | 113 - .../range/reference/algorithms/new/iota.html | 96 - .../reference/algorithms/new/is_sorted.html | 108 - .../reference/algorithms/new/overwrite.html | 112 - .../reference/algorithms/new/push_back.html | 103 - .../reference/algorithms/new/push_front.html | 103 - .../algorithms/new/remove_erase.html | 88 - .../algorithms/new/remove_erase_if.html | 95 - .../reference/algorithms/non_mutating.html | 66 - .../non_mutating/adjacent_find.html | 167 - .../non_mutating/binary_search.html | 156 - .../algorithms/non_mutating/count.html | 107 - .../algorithms/non_mutating/count_if.html | 103 - .../algorithms/non_mutating/equal.html | 162 - .../algorithms/non_mutating/equal_range.html | 178 - .../algorithms/non_mutating/find.html | 110 - .../algorithms/non_mutating/find_end.html | 173 - .../non_mutating/find_first_of.html | 169 - .../algorithms/non_mutating/find_if.html | 120 - .../algorithms/non_mutating/for_each.html | 112 - .../non_mutating/lexicographical_compare.html | 169 - .../algorithms/non_mutating/lower_bound.html | 195 - .../algorithms/non_mutating/max_element.html | 165 - .../algorithms/non_mutating/min_element.html | 165 - .../algorithms/non_mutating/mismatch.html | 215 - .../algorithms/non_mutating/search.html | 205 - .../algorithms/non_mutating/search_n.html | 147 - .../algorithms/non_mutating/upper_bound.html | 192 - .../range/reference/algorithms/numeric.html | 50 - .../algorithms/numeric/accumulate.html | 156 - .../numeric/adjacent_difference.html | 178 - .../algorithms/numeric/inner_product.html | 192 - .../algorithms/numeric/partial_sum.html | 160 - .../reference/algorithms/permutation.html | 49 - .../permutation/next_permutation.html | 148 - .../permutation/prev_permutation.html | 148 - .../html/range/reference/algorithms/set.html | 51 - .../reference/algorithms/set/includes.html | 186 - .../algorithms/set/set_difference.html | 205 - .../algorithms/set/set_intersection.html | 205 - .../set/set_symmetric_difference.html | 209 - .../reference/algorithms/set/set_union.html | 204 - .../reference/concept_implementation.html | 49 - .../concept_implementation/semantics.html | 164 - .../semantics/functions.html | 410 - .../semantics/metafunctions.html | 273 - .../concept_implementation/synopsis.html | 181 - .../doc/html/range/reference/extending.html | 52 - .../range/reference/extending/method_1.html | 162 - .../range/reference/extending/method_2.html | 287 - .../range/reference/extending/method_3.html | 51 - .../extending/method_3/method_3_1.html | 110 - .../extending/method_3/method_3_2.html | 138 - .../doc/html/range/reference/overview.html | 71 - .../doc/html/range/reference/ranges.html | 50 - .../range/reference/ranges/any_range.html | 177 - .../reference/ranges/counting_range.html | 90 - .../html/range/reference/ranges/irange.html | 104 - .../range/reference/ranges/istream_range.html | 72 - .../doc/html/range/reference/utilities.html | 88 - .../range/reference/utilities/combine.html | 142 - .../reference/utilities/iterator_range.html | 305 - .../html/range/reference/utilities/join.html | 132 - .../range/reference/utilities/sub_range.html | 133 - libs/range/doc/html/range/style_guide.html | 150 - libs/range/doc/html/range/upgrade.html | 56 - .../html/range/upgrade/upgrade_from_1_34.html | 79 - .../html/range/upgrade/upgrade_from_1_42.html | 69 - .../html/range/upgrade/upgrade_from_1_45.html | 65 - .../html/range/upgrade/upgrade_from_1_49.html | 50 - .../html/range/upgrade/upgrade_from_1_55.html | 64 - libs/range/doc/introduction.qbk | 43 - libs/range/doc/mfc_atl.qbk | 148 - libs/range/doc/mfc_atl.rst | 232 - libs/range/doc/portability.qbk | 27 - libs/range/doc/reference.qbk | 21 - libs/range/doc/reference/adaptors.qbk | 187 - .../reference/adaptors/adjacent_filtered.qbk | 32 - libs/range/doc/reference/adaptors/copied.qbk | 30 - .../adaptors/examples/indirected.cpp | 32 - .../range/doc/reference/adaptors/filtered.qbk | 32 - .../doc/reference/adaptors/formatted.qbk | 51 - libs/range/doc/reference/adaptors/indexed.qbk | 84 - .../doc/reference/adaptors/indirected.qbk | 31 - .../range/doc/reference/adaptors/map_keys.qbk | 31 - .../doc/reference/adaptors/map_values.qbk | 31 - .../range/doc/reference/adaptors/replaced.qbk | 33 - .../doc/reference/adaptors/replaced_if.qbk | 33 - .../range/doc/reference/adaptors/reversed.qbk | 30 - libs/range/doc/reference/adaptors/sliced.qbk | 31 - libs/range/doc/reference/adaptors/strided.qbk | 30 - .../doc/reference/adaptors/tokenized.qbk | 67 - .../doc/reference/adaptors/transformed.qbk | 32 - .../doc/reference/adaptors/type_erased.qbk | 65 - libs/range/doc/reference/adaptors/uniqued.qbk | 31 - .../doc/reference/algorithm/adjacent_find.qbk | 85 - .../doc/reference/algorithm/binary_search.qbk | 60 - libs/range/doc/reference/algorithm/copy.qbk | 41 - .../doc/reference/algorithm/copy_backward.qbk | 46 - libs/range/doc/reference/algorithm/count.qbk | 41 - .../doc/reference/algorithm/count_if.qbk | 37 - libs/range/doc/reference/algorithm/equal.qbk | 64 - .../doc/reference/algorithm/equal_range.qbk | 83 - libs/range/doc/reference/algorithm/fill.qbk | 36 - libs/range/doc/reference/algorithm/fill_n.qbk | 36 - libs/range/doc/reference/algorithm/find.qbk | 45 - .../doc/reference/algorithm/find_end.qbk | 74 - .../doc/reference/algorithm/find_first_of.qbk | 74 - .../range/doc/reference/algorithm/find_if.qbk | 50 - .../doc/reference/algorithm/for_each.qbk | 45 - .../doc/reference/algorithm/generate.qbk | 44 - .../doc/reference/algorithm/includes.qbk | 69 - .../doc/reference/algorithm/inplace_merge.qbk | 77 - .../algorithm/lexicographical_compare.qbk | 60 - .../doc/reference/algorithm/lower_bound.qbk | 93 - .../doc/reference/algorithm/make_heap.qbk | 56 - .../doc/reference/algorithm/max_element.qbk | 86 - libs/range/doc/reference/algorithm/merge.qbk | 88 - .../doc/reference/algorithm/min_element.qbk | 86 - .../doc/reference/algorithm/mismatch.qbk | 119 - .../reference/algorithm/next_permutation.qbk | 56 - .../doc/reference/algorithm/nth_element.qbk | 67 - .../doc/reference/algorithm/partial_sort.qbk | 69 - .../doc/reference/algorithm/partition.qbk | 63 - .../doc/reference/algorithm/pop_heap.qbk | 61 - .../reference/algorithm/prev_permutation.qbk | 56 - .../doc/reference/algorithm/push_heap.qbk | 61 - .../reference/algorithm/random_shuffle.qbk | 55 - libs/range/doc/reference/algorithm/remove.qbk | 60 - .../doc/reference/algorithm/remove_copy.qbk | 39 - .../reference/algorithm/remove_copy_if.qbk | 38 - .../doc/reference/algorithm/remove_if.qbk | 63 - .../range/doc/reference/algorithm/replace.qbk | 46 - .../doc/reference/algorithm/replace_copy.qbk | 38 - .../reference/algorithm/replace_copy_if.qbk | 39 - .../doc/reference/algorithm/replace_if.qbk | 41 - .../range/doc/reference/algorithm/reverse.qbk | 37 - .../doc/reference/algorithm/reverse_copy.qbk | 36 - libs/range/doc/reference/algorithm/rotate.qbk | 44 - .../doc/reference/algorithm/rotate_copy.qbk | 43 - libs/range/doc/reference/algorithm/search.qbk | 106 - .../doc/reference/algorithm/search_n.qbk | 63 - .../reference/algorithm/set_difference.qbk | 81 - .../reference/algorithm/set_intersection.qbk | 81 - .../algorithm/set_symmetric_difference.qbk | 83 - .../doc/reference/algorithm/set_union.qbk | 80 - libs/range/doc/reference/algorithm/sort.qbk | 58 - .../doc/reference/algorithm/sort_heap.qbk | 60 - .../reference/algorithm/stable_partition.qbk | 61 - .../doc/reference/algorithm/stable_sort.qbk | 59 - .../doc/reference/algorithm/swap_ranges.qbk | 37 - .../doc/reference/algorithm/transform.qbk | 88 - libs/range/doc/reference/algorithm/unique.qbk | 77 - .../doc/reference/algorithm/unique_copy.qbk | 49 - .../doc/reference/algorithm/upper_bound.qbk | 90 - .../doc/reference/algorithm_ext/copy_n.qbk | 37 - .../doc/reference/algorithm_ext/erase.qbk | 37 - .../doc/reference/algorithm_ext/for_each.qbk | 73 - .../doc/reference/algorithm_ext/insert.qbk | 46 - .../doc/reference/algorithm_ext/iota.qbk | 33 - .../doc/reference/algorithm_ext/is_sorted.qbk | 40 - .../doc/reference/algorithm_ext/overwrite.qbk | 39 - .../doc/reference/algorithm_ext/push_back.qbk | 37 - .../reference/algorithm_ext/push_front.qbk | 37 - .../reference/algorithm_ext/remove_erase.qbk | 33 - .../algorithm_ext/remove_erase_if.qbk | 34 - libs/range/doc/reference/algorithms.qbk | 182 - libs/range/doc/reference/extending.qbk | 328 - .../doc/reference/numeric/accumulate.qbk | 61 - .../reference/numeric/adjacent_difference.qbk | 68 - .../doc/reference/numeric/inner_product.qbk | 73 - .../doc/reference/numeric/partial_sum.qbk | 60 - libs/range/doc/reference/overview.qbk | 19 - libs/range/doc/reference/ranges.qbk | 14 - libs/range/doc/reference/ranges/any_range.qbk | 115 - .../doc/reference/ranges/counting_range.qbk | 36 - libs/range/doc/reference/ranges/irange.qbk | 40 - .../doc/reference/ranges/istream_range.qbk | 24 - libs/range/doc/reference/semantics.qbk | 200 - libs/range/doc/reference/synopsis.qbk | 144 - libs/range/doc/reference/utilities.qbk | 417 - libs/range/doc/style.qbk | 50 - libs/range/doc/upgrade.qbk | 67 - libs/range/index.html | 16 - libs/range/meta/libraries.json | 16 - libs/range/test/Jamfile.v2 | 221 - .../test/adaptor_test/adjacent_filtered.cpp | 110 - .../adjacent_filtered_example.cpp | 65 - libs/range/test/adaptor_test/chained.cpp | 117 - libs/range/test/adaptor_test/copied.cpp | 84 - .../test/adaptor_test/copied_example.cpp | 64 - libs/range/test/adaptor_test/filtered.cpp | 159 - .../test/adaptor_test/filtered_example.cpp | 71 - libs/range/test/adaptor_test/formatted.cpp | 311 - .../test/adaptor_test/formatted_example.cpp | 61 - libs/range/test/adaptor_test/indexed.cpp | 152 - .../test/adaptor_test/indexed_example.cpp | 104 - libs/range/test/adaptor_test/indirected.cpp | 99 - .../test/adaptor_test/indirected_example.cpp | 66 - libs/range/test/adaptor_test/map.cpp | 171 - .../test/adaptor_test/map_keys_example.cpp | 66 - .../test/adaptor_test/map_values_example.cpp | 66 - libs/range/test/adaptor_test/replaced.cpp | 87 - .../test/adaptor_test/replaced_example.cpp | 64 - libs/range/test/adaptor_test/replaced_if.cpp | 96 - .../test/adaptor_test/replaced_if_example.cpp | 71 - libs/range/test/adaptor_test/reversed.cpp | 84 - .../test/adaptor_test/reversed_example.cpp | 61 - libs/range/test/adaptor_test/sliced.cpp | 99 - .../test/adaptor_test/sliced_example.cpp | 64 - libs/range/test/adaptor_test/strided.cpp | 313 - libs/range/test/adaptor_test/strided2.cpp | 67 - .../test/adaptor_test/strided_example.cpp | 64 - .../ticket_6742_transformed_c4789_warning.cpp | 69 - .../ticket_8676_sliced_transformed.cpp | 56 - .../ticket_9519_strided_reversed.cpp | 67 - libs/range/test/adaptor_test/tokenized.cpp | 79 - .../test/adaptor_test/tokenized_example.cpp | 65 - libs/range/test/adaptor_test/transformed.cpp | 132 - .../test/adaptor_test/transformed_example.cpp | 72 - libs/range/test/adaptor_test/type_erased.cpp | 44 - .../adaptor_test/type_erased_abstract.cpp | 88 - .../type_erased_bidirectional.cpp | 57 - .../adaptor_test/type_erased_brackets.cpp | 70 - .../test/adaptor_test/type_erased_example.cpp | 124 - .../test/adaptor_test/type_erased_forward.cpp | 57 - .../adaptor_test/type_erased_mix_values.cpp | 94 - .../type_erased_random_access.cpp | 50 - .../adaptor_test/type_erased_single_pass.cpp | 57 - .../test/adaptor_test/type_erased_test.hpp | 289 - .../adaptor_test/type_erased_tparam_conv.cpp | 74 - libs/range/test/adaptor_test/uniqued.cpp | 168 - .../test/adaptor_test/uniqued_example.cpp | 64 - libs/range/test/adaptors.cpp | 236 - libs/range/test/adl_conformance.cpp | 188 - libs/range/test/adl_conformance_no_using.cpp | 110 - libs/range/test/algorithm.cpp | 479 - libs/range/test/algorithm_example.cpp | 92 - libs/range/test/algorithm_ext_test/copy_n.cpp | 60 - libs/range/test/algorithm_ext_test/erase.cpp | 128 - .../test/algorithm_ext_test/for_each_ext.cpp | 98 - libs/range/test/algorithm_ext_test/insert.cpp | 72 - libs/range/test/algorithm_ext_test/iota.cpp | 70 - .../test/algorithm_ext_test/is_sorted.cpp | 62 - .../test/algorithm_ext_test/overwrite.cpp | 74 - .../test/algorithm_ext_test/push_back.cpp | 72 - .../test/algorithm_ext_test/push_front.cpp | 84 - .../test/algorithm_test/adjacent_find.cpp | 95 - .../test/algorithm_test/binary_search.cpp | 126 - libs/range/test/algorithm_test/copy.cpp | 74 - .../test/algorithm_test/copy_backward.cpp | 84 - libs/range/test/algorithm_test/copy_n.cpp | 70 - libs/range/test/algorithm_test/count.cpp | 85 - libs/range/test/algorithm_test/count_if.cpp | 100 - libs/range/test/algorithm_test/equal.cpp | 143 - .../range/test/algorithm_test/equal_range.cpp | 181 - libs/range/test/algorithm_test/fill.cpp | 86 - libs/range/test/algorithm_test/find.cpp | 131 - libs/range/test/algorithm_test/find_end.cpp | 200 - .../test/algorithm_test/find_first_of.cpp | 198 - libs/range/test/algorithm_test/find_if.cpp | 126 - libs/range/test/algorithm_test/for_each.cpp | 95 - libs/range/test/algorithm_test/generate.cpp | 96 - libs/range/test/algorithm_test/heap.cpp | 145 - libs/range/test/algorithm_test/includes.cpp | 165 - .../test/algorithm_test/inplace_merge.cpp | 167 - .../lexicographical_compare.cpp | 157 - .../range/test/algorithm_test/lower_bound.cpp | 181 - .../range/test/algorithm_test/max_element.cpp | 165 - libs/range/test/algorithm_test/merge.cpp | 237 - .../range/test/algorithm_test/min_element.cpp | 163 - libs/range/test/algorithm_test/mismatch.cpp | 242 - .../test/algorithm_test/next_permutation.cpp | 125 - .../range/test/algorithm_test/nth_element.cpp | 175 - .../test/algorithm_test/partial_sort.cpp | 171 - libs/range/test/algorithm_test/partition.cpp | 136 - .../test/algorithm_test/prev_permutation.cpp | 124 - .../test/algorithm_test/random_shuffle.cpp | 198 - libs/range/test/algorithm_test/remove.cpp | 101 - .../range/test/algorithm_test/remove_copy.cpp | 108 - .../test/algorithm_test/remove_copy_if.cpp | 113 - libs/range/test/algorithm_test/remove_if.cpp | 109 - libs/range/test/algorithm_test/replace.cpp | 86 - .../test/algorithm_test/replace_copy.cpp | 111 - .../test/algorithm_test/replace_copy_if.cpp | 115 - libs/range/test/algorithm_test/replace_if.cpp | 96 - libs/range/test/algorithm_test/reverse.cpp | 80 - .../test/algorithm_test/reverse_copy.cpp | 97 - libs/range/test/algorithm_test/rotate.cpp | 107 - .../range/test/algorithm_test/rotate_copy.cpp | 115 - libs/range/test/algorithm_test/search.cpp | 113 - libs/range/test/algorithm_test/search_n.cpp | 198 - .../test/algorithm_test/set_difference.cpp | 214 - .../test/algorithm_test/set_intersection.cpp | 214 - .../set_symmetric_difference.cpp | 216 - libs/range/test/algorithm_test/set_union.cpp | 210 - libs/range/test/algorithm_test/sort.cpp | 105 - .../test/algorithm_test/stable_partition.cpp | 134 - .../range/test/algorithm_test/stable_sort.cpp | 103 - .../range/test/algorithm_test/swap_ranges.cpp | 116 - libs/range/test/algorithm_test/transform.cpp | 184 - libs/range/test/algorithm_test/unique.cpp | 263 - .../range/test/algorithm_test/unique_copy.cpp | 158 - .../range/test/algorithm_test/upper_bound.cpp | 182 - libs/range/test/array.cpp | 83 - libs/range/test/atl.cpp | 623 - libs/range/test/begin.cpp | 119 - libs/range/test/category.cpp | 61 - libs/range/test/combine.cpp | 160 - libs/range/test/compat2.cpp | 75 - libs/range/test/compat3.cpp | 75 - .../adaptor/adjacent_filtered_concept.cpp | 39 - .../adaptor/adjacent_filtered_concept2.cpp | 39 - .../adaptor/adjacent_filtered_concept3.cpp | 40 - .../adaptor/adjacent_filtered_concept4.cpp | 40 - .../compile_fail/adaptor/copied_concept.cpp | 24 - .../compile_fail/adaptor/copied_concept2.cpp | 24 - .../compile_fail/adaptor/copied_concept3.cpp | 23 - .../compile_fail/adaptor/copied_concept4.cpp | 24 - .../compile_fail/adaptor/mock_iterator.hpp | 82 - .../test/compile_fail/adaptor/mock_range.hpp | 50 - .../compile_fail/adaptor/reversed_concept.cpp | 23 - .../adaptor/reversed_concept2.cpp | 23 - .../adaptor/reversed_concept3.cpp | 23 - .../adaptor/reversed_concept4.cpp | 23 - .../compile_fail/adaptor/sliced_concept.cpp | 23 - .../compile_fail/adaptor/sliced_concept2.cpp | 23 - .../compile_fail/adaptor/sliced_concept3.cpp | 22 - .../compile_fail/adaptor/sliced_concept4.cpp | 22 - .../compile_fail/adaptor/uniqued_concept.cpp | 22 - .../compile_fail/adaptor/uniqued_concept2.cpp | 23 - .../compile_fail/adaptor/uniqued_concept3.cpp | 22 - .../compile_fail/adaptor/uniqued_concept4.cpp | 22 - .../test/compile_fail/iterator_range1.cpp | 22 - libs/range/test/const_iterator.cpp | 61 - libs/range/test/const_ranges.cpp | 59 - libs/range/test/const_reverse_iterator.cpp | 62 - libs/range/test/counting_range.cpp | 90 - libs/range/test/difference_type.cpp | 61 - libs/range/test/end.cpp | 119 - libs/range/test/extension_mechanism.cpp | 109 - libs/range/test/extension_size.cpp | 224 - libs/range/test/has_range_iterator.cpp | 68 - libs/range/test/irange.cpp | 153 - libs/range/test/istream_range.cpp | 58 - libs/range/test/iterator.cpp | 61 - libs/range/test/iterator_ext.cpp | 153 - libs/range/test/iterator_pair.cpp | 102 - libs/range/test/iterator_range.cpp | 330 - libs/range/test/iterator_range_drop.cpp | 200 - .../test/iterator_range_equality_bug.cpp | 39 - libs/range/test/iterator_range_hash.cpp | 52 - libs/range/test/iterator_range_variant.cpp | 60 - libs/range/test/join.cpp | 396 - libs/range/test/mfc.cpp | 743 - libs/range/test/mutable_iterator.cpp | 61 - libs/range/test/partial_workaround.cpp | 114 - libs/range/test/pointer.cpp | 61 - libs/range/test/pointer_as_iterator.cpp | 39 - libs/range/test/reference.cpp | 61 - libs/range/test/result_iterator.cpp | 61 - libs/range/test/reverse_iterator.cpp | 61 - libs/range/test/reverse_result_iterator.cpp | 62 - libs/range/test/reversible_range.cpp | 74 - libs/range/test/size_type.cpp | 61 - libs/range/test/std_container.cpp | 74 - libs/range/test/string.cpp | 280 - libs/range/test/sub_range.cpp | 289 - .../range_overload_test_driver.hpp | 74 - .../test_driver/range_return_test_driver.hpp | 406 - .../test/test_function/check_equal_fn.hpp | 49 - .../test/test_function/counted_function.hpp | 40 - libs/range/test/test_function/equal_to_x.hpp | 33 - .../test/test_function/false_predicate.hpp | 29 - .../test/test_function/greater_than_x.hpp | 32 - .../test/test_function/multiply_by_x.hpp | 32 - .../test/test_function/true_predicate.hpp | 29 - libs/range/test/test_utils.hpp | 24 - libs/range/test/ticket_10336.cpp | 43 - libs/range/test/ticket_5486.cpp | 56 - .../test/ticket_5544_terminate_irange.cpp | 47 - libs/range/test/ticket_5547.cpp | 42 - .../test/ticket_5556_is_sorted_namespace.cpp | 37 - .../test/ticket_5811_indirected_optional.cpp | 48 - .../ticket_6715_iterator_range_equality.cpp | 52 - libs/range/test/ticket_6944.cpp | 46 - libs/range/test/value_type.cpp | 61 - 2282 files changed, 38788 insertions(+), 258352 deletions(-) create mode 100644 boost/date_time/date_facet.hpp create mode 100644 boost/date_time/date_generator_formatter.hpp create mode 100644 boost/date_time/date_generator_parser.hpp create mode 100644 boost/date_time/format_date_parser.hpp create mode 100644 boost/date_time/gregorian/gregorian.hpp create mode 100644 boost/date_time/gregorian/gregorian_io.hpp create mode 100644 boost/date_time/period_formatter.hpp create mode 100644 boost/date_time/period_parser.hpp create mode 100644 boost/date_time/posix_time/posix_time.hpp create mode 100644 boost/date_time/posix_time/posix_time_io.hpp create mode 100644 boost/date_time/posix_time/posix_time_legacy_io.hpp create mode 100644 boost/date_time/posix_time/time_formatters.hpp create mode 100644 boost/date_time/posix_time/time_formatters_limited.hpp create mode 100644 boost/date_time/posix_time/time_parsers.hpp create mode 100644 boost/date_time/special_values_formatter.hpp create mode 100644 boost/date_time/special_values_parser.hpp create mode 100644 boost/date_time/string_convert.hpp create mode 100644 boost/date_time/string_parse_tree.hpp create mode 100644 boost/date_time/strings_from_facet.hpp create mode 100644 boost/date_time/time_facet.hpp create mode 100644 boost/date_time/time_formatting_streams.hpp create mode 100644 boost/date_time/time_parsing.hpp create mode 100644 boost/interprocess/allocators/allocator.hpp create mode 100644 boost/interprocess/allocators/detail/allocator_common.hpp create mode 100644 boost/interprocess/containers/allocation_type.hpp create mode 100644 boost/interprocess/containers/containers_fwd.hpp create mode 100644 boost/interprocess/containers/string.hpp create mode 100644 boost/interprocess/containers/vector.hpp create mode 100644 boost/interprocess/containers/version_type.hpp create mode 100644 boost/interprocess/detail/cast_tags.hpp create mode 100644 boost/interprocess/detail/file_wrapper.hpp create mode 100644 boost/interprocess/detail/in_place_interface.hpp create mode 100644 boost/interprocess/detail/managed_memory_impl.hpp create mode 100644 boost/interprocess/detail/math_functions.hpp create mode 100644 boost/interprocess/detail/named_proxy.hpp create mode 100644 boost/interprocess/detail/nothrow.hpp create mode 100644 boost/interprocess/detail/segment_manager_helper.hpp create mode 100644 boost/interprocess/detail/transform_iterator.hpp create mode 100644 boost/interprocess/detail/variadic_templates_tools.hpp create mode 100644 boost/interprocess/file_mapping.hpp create mode 100644 boost/interprocess/indexes/iset_index.hpp create mode 100644 boost/interprocess/managed_mapped_file.hpp create mode 100644 boost/interprocess/managed_shared_memory.hpp create mode 100644 boost/interprocess/mem_algo/detail/mem_algo_common.hpp create mode 100644 boost/interprocess/mem_algo/rbtree_best_fit.hpp create mode 100644 boost/interprocess/offset_ptr.hpp create mode 100644 boost/interprocess/segment_manager.hpp create mode 100644 boost/interprocess/smart_ptr/deleter.hpp create mode 100644 boost/interprocess/sync/interprocess_recursive_mutex.hpp create mode 100644 boost/interprocess/sync/mutex_family.hpp create mode 100644 boost/interprocess/sync/null_mutex.hpp create mode 100644 boost/interprocess/sync/posix/recursive_mutex.hpp create mode 100644 boost/interprocess/sync/spin/recursive_mutex.hpp create mode 100644 boost/interprocess/sync/windows/recursive_mutex.hpp create mode 100644 boost/intrusive/any_hook.hpp create mode 100644 boost/intrusive/avl_set.hpp create mode 100644 boost/intrusive/bs_set.hpp create mode 100644 boost/intrusive/circular_list_algorithms.hpp create mode 100644 boost/intrusive/derivation_value_traits.hpp create mode 100644 boost/intrusive/detail/any_node_and_algorithms.hpp create mode 100644 boost/intrusive/detail/hashtable_node.hpp create mode 100644 boost/intrusive/detail/list_iterator.hpp create mode 100644 boost/intrusive/detail/list_node.hpp create mode 100644 boost/intrusive/detail/node_to_value.hpp create mode 100644 boost/intrusive/detail/transform_iterator.hpp create mode 100644 boost/intrusive/hashtable.hpp create mode 100644 boost/intrusive/list.hpp create mode 100644 boost/intrusive/list_hook.hpp create mode 100644 boost/intrusive/member_value_traits.hpp create mode 100644 boost/intrusive/priority_compare.hpp create mode 100644 boost/intrusive/set.hpp create mode 100644 boost/intrusive/sg_set.hpp create mode 100644 boost/intrusive/splay_set.hpp create mode 100644 boost/intrusive/treap.hpp create mode 100644 boost/intrusive/treap_algorithms.hpp create mode 100644 boost/intrusive/treap_set.hpp create mode 100644 boost/intrusive/trivial_value_traits.hpp create mode 100644 boost/intrusive/unordered_set.hpp create mode 100644 boost/intrusive/unordered_set_hook.hpp create mode 100644 boost/multi_index/composite_key.hpp create mode 100644 boost/multi_index/detail/cons_stdtuple.hpp create mode 100644 boost/multi_index/detail/rnd_index_loader.hpp create mode 100644 boost/multi_index/detail/rnd_index_node.hpp create mode 100644 boost/multi_index/detail/rnd_index_ops.hpp create mode 100644 boost/multi_index/detail/rnd_index_ptr_array.hpp create mode 100644 boost/multi_index/detail/rnd_node_iterator.hpp create mode 100644 boost/multi_index/detail/rnk_index_ops.hpp create mode 100644 boost/multi_index/global_fun.hpp create mode 100644 boost/multi_index/key_extractors.hpp create mode 100644 boost/multi_index/mem_fun.hpp create mode 100644 boost/multi_index/random_access_index.hpp create mode 100644 boost/multi_index/random_access_index_fwd.hpp create mode 100644 boost/multi_index/ranked_index.hpp create mode 100644 boost/multi_index/ranked_index_fwd.hpp delete mode 100644 libs/circular_buffer/doc/autodoc.xml delete mode 100644 libs/circular_buffer/doc/circular_buffer.idx delete mode 100644 libs/circular_buffer/doc/circular_buffer.qbk delete mode 100644 libs/circular_buffer/doc/images/circular_buffer.png delete mode 100644 libs/circular_buffer/doc/images/space_optimized.png delete mode 100644 libs/circular_buffer/doc/jamfile.v2 delete mode 100644 libs/circular_buffer/example/bounded_buffer_comparison.cpp delete mode 100644 libs/circular_buffer/example/circular_buffer_bound_example.cpp delete mode 100644 libs/circular_buffer/example/circular_buffer_example.cpp delete mode 100644 libs/circular_buffer/example/circular_buffer_examples.bat delete mode 100644 libs/circular_buffer/example/circular_buffer_iter_example.cpp delete mode 100644 libs/circular_buffer/example/circular_buffer_sum_example.cpp delete mode 100644 libs/circular_buffer/example/jamfile.v2 delete mode 100644 libs/circular_buffer/index.html delete mode 100644 libs/circular_buffer/meta/libraries.json delete mode 100644 libs/circular_buffer/test/Jamfile.v2 delete mode 100644 libs/circular_buffer/test/base_test.cpp delete mode 100644 libs/circular_buffer/test/bounded_buffer_comparison.cpp delete mode 100644 libs/circular_buffer/test/common.ipp delete mode 100644 libs/circular_buffer/test/constant_erase_test.cpp delete mode 100644 libs/circular_buffer/test/soft_iterator_invalidation.cpp delete mode 100644 libs/circular_buffer/test/space_optimized_test.cpp delete mode 100644 libs/circular_buffer/test/test.hpp delete mode 100644 libs/config/checks/Jamfile.v2 delete mode 100644 libs/config/checks/architecture/32.cpp delete mode 100644 libs/config/checks/architecture/64.cpp delete mode 100644 libs/config/checks/architecture/Jamroot.jam delete mode 100644 libs/config/checks/architecture/arm.cpp delete mode 100644 libs/config/checks/architecture/combined.cpp delete mode 100644 libs/config/checks/architecture/mips1.cpp delete mode 100644 libs/config/checks/architecture/power.cpp delete mode 100644 libs/config/checks/architecture/sparc.cpp delete mode 100644 libs/config/checks/architecture/x86.cpp delete mode 100644 libs/config/checks/config.jam delete mode 100644 libs/config/checks/test_case.cpp delete mode 100644 libs/config/test/Jamfile.v2 delete mode 100644 libs/config/test/abi/abi_test.cpp delete mode 100644 libs/config/test/abi/abi_test.hpp delete mode 100644 libs/config/test/abi/main.cpp delete mode 100644 libs/config/test/all/Jamfile.v2 delete mode 100644 libs/config/test/all/options_v2.jam delete mode 100644 libs/config/test/boost_fallthrough_test.cpp delete mode 100644 libs/config/test/boost_has_2arg_use_facet.ipp delete mode 100644 libs/config/test/boost_has_bethreads.ipp delete mode 100644 libs/config/test/boost_has_clock_gettime.ipp delete mode 100644 libs/config/test/boost_has_dirent_h.ipp delete mode 100644 libs/config/test/boost_has_expm1.ipp delete mode 100644 libs/config/test/boost_has_float128.ipp delete mode 100644 libs/config/test/boost_has_ftime.ipp delete mode 100644 libs/config/test/boost_has_getsystemtimeasfiletime.ipp delete mode 100644 libs/config/test/boost_has_gettimeofday.ipp delete mode 100644 libs/config/test/boost_has_hash.ipp delete mode 100644 libs/config/test/boost_has_int128.ipp delete mode 100644 libs/config/test/boost_has_log1p.ipp delete mode 100644 libs/config/test/boost_has_long_long.ipp delete mode 100644 libs/config/test/boost_has_macro_use_facet.ipp delete mode 100644 libs/config/test/boost_has_ms_int64.ipp delete mode 100644 libs/config/test/boost_has_nanosleep.ipp delete mode 100644 libs/config/test/boost_has_nl_types_h.ipp delete mode 100644 libs/config/test/boost_has_nrvo.ipp delete mode 100644 libs/config/test/boost_has_part_alloc.ipp delete mode 100644 libs/config/test/boost_has_pthread_delay_np.ipp delete mode 100644 libs/config/test/boost_has_pthread_ma_st.ipp delete mode 100644 libs/config/test/boost_has_pthread_yield.ipp delete mode 100644 libs/config/test/boost_has_pthreads.ipp delete mode 100644 libs/config/test/boost_has_rvalue_refs.ipp delete mode 100644 libs/config/test/boost_has_sched_yield.ipp delete mode 100644 libs/config/test/boost_has_sgi_type_traits.ipp delete mode 100644 libs/config/test/boost_has_sigaction.ipp delete mode 100644 libs/config/test/boost_has_slist.ipp delete mode 100644 libs/config/test/boost_has_static_assert.ipp delete mode 100644 libs/config/test/boost_has_stdint_h.ipp delete mode 100644 libs/config/test/boost_has_stlp_use_facet.ipp delete mode 100644 libs/config/test/boost_has_tr1_array.ipp delete mode 100644 libs/config/test/boost_has_tr1_bind.ipp delete mode 100644 libs/config/test/boost_has_tr1_complex_over.ipp delete mode 100644 libs/config/test/boost_has_tr1_complex_trig.ipp delete mode 100644 libs/config/test/boost_has_tr1_function.ipp delete mode 100644 libs/config/test/boost_has_tr1_hash.ipp delete mode 100644 libs/config/test/boost_has_tr1_mem_fn.ipp delete mode 100644 libs/config/test/boost_has_tr1_random.ipp delete mode 100644 libs/config/test/boost_has_tr1_ref_wrap.ipp delete mode 100644 libs/config/test/boost_has_tr1_regex.ipp delete mode 100644 libs/config/test/boost_has_tr1_result_of.ipp delete mode 100644 libs/config/test/boost_has_tr1_shared_ptr.ipp delete mode 100644 libs/config/test/boost_has_tr1_tuple.ipp delete mode 100644 libs/config/test/boost_has_tr1_type_traits.ipp delete mode 100644 libs/config/test/boost_has_tr1_unordered_map.ipp delete mode 100644 libs/config/test/boost_has_tr1_unordered_set.ipp delete mode 100644 libs/config/test/boost_has_tr1_utility.ipp delete mode 100644 libs/config/test/boost_has_unistd_h.ipp delete mode 100644 libs/config/test/boost_has_variadic_tmpl.ipp delete mode 100644 libs/config/test/boost_has_vc6_mem_templ.ipp delete mode 100644 libs/config/test/boost_has_vc_iterator.ipp delete mode 100644 libs/config/test/boost_has_winthreads.ipp delete mode 100644 libs/config/test/boost_no_adl_barrier.ipp delete mode 100644 libs/config/test/boost_no_arg_dep_lookup.ipp delete mode 100644 libs/config/test/boost_no_array_type_spec.ipp delete mode 100644 libs/config/test/boost_no_auto_declarations.ipp delete mode 100644 libs/config/test/boost_no_auto_multidecl.ipp delete mode 100644 libs/config/test/boost_no_auto_ptr.ipp delete mode 100644 libs/config/test/boost_no_bcb_partial_spec.ipp delete mode 100644 libs/config/test/boost_no_char16_t.ipp delete mode 100644 libs/config/test/boost_no_char32_t.ipp delete mode 100644 libs/config/test/boost_no_com_value_init.ipp delete mode 100644 libs/config/test/boost_no_constexpr.ipp delete mode 100644 libs/config/test/boost_no_ctype_functions.ipp delete mode 100644 libs/config/test/boost_no_cv_spec.ipp delete mode 100644 libs/config/test/boost_no_cv_void_spec.ipp delete mode 100644 libs/config/test/boost_no_cwchar.ipp delete mode 100644 libs/config/test/boost_no_cwctype.ipp delete mode 100644 libs/config/test/boost_no_cxx11_addressof.ipp delete mode 100644 libs/config/test/boost_no_cxx11_alignas.ipp delete mode 100644 libs/config/test/boost_no_cxx11_allocator.ipp delete mode 100644 libs/config/test/boost_no_cxx11_atomic_sp.ipp delete mode 100644 libs/config/test/boost_no_cxx11_final.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_array.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_atomic.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_chrono.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_codecvt.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_condition_variable.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_forward_list.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_future.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_initializer_list.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_mutex.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_random.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_ratio.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_regex.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_system_error.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_thread.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_tuple.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_type_traits.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_typeindex.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_unordered_map.ipp delete mode 100644 libs/config/test/boost_no_cxx11_hdr_unordered_set.ipp delete mode 100644 libs/config/test/boost_no_cxx11_inline_namespaces.ipp delete mode 100644 libs/config/test/boost_no_cxx11_non_pub_def_fun.ipp delete mode 100644 libs/config/test/boost_no_cxx11_numeric_limits.ipp delete mode 100644 libs/config/test/boost_no_cxx11_ref_qualifiers.ipp delete mode 100644 libs/config/test/boost_no_cxx11_smart_ptr.ipp delete mode 100644 libs/config/test/boost_no_cxx11_std_align.ipp delete mode 100644 libs/config/test/boost_no_cxx11_thread_local.ipp delete mode 100644 libs/config/test/boost_no_cxx11_trailing_result_types.ipp delete mode 100644 libs/config/test/boost_no_cxx11_user_lit.ipp delete mode 100644 libs/config/test/boost_no_cxx14_binary_literals.ipp delete mode 100644 libs/config/test/boost_no_cxx14_constexpr.ipp delete mode 100644 libs/config/test/boost_no_cxx14_decltype_auto.ipp delete mode 100644 libs/config/test/boost_no_cxx14_digit_separator.ipp delete mode 100644 libs/config/test/boost_no_cxx14_generic_lambda.ipp delete mode 100644 libs/config/test/boost_no_cxx14_hdr_shared_mutex.ipp delete mode 100644 libs/config/test/boost_no_cxx14_lambda_capture.ipp delete mode 100644 libs/config/test/boost_no_cxx14_member_init.ipp delete mode 100644 libs/config/test/boost_no_cxx14_return_type_ded.ipp delete mode 100644 libs/config/test/boost_no_cxx14_std_exchange.ipp delete mode 100644 libs/config/test/boost_no_cxx14_var_templ.ipp delete mode 100644 libs/config/test/boost_no_cxx17_std_apply.ipp delete mode 100644 libs/config/test/boost_no_cxx17_std_invoke.ipp delete mode 100644 libs/config/test/boost_no_cxx_hdr_functional.ipp delete mode 100644 libs/config/test/boost_no_decltype.ipp delete mode 100644 libs/config/test/boost_no_decltype_n3276.ipp delete mode 100644 libs/config/test/boost_no_ded_typename.ipp delete mode 100644 libs/config/test/boost_no_defaulted_functions.ipp delete mode 100644 libs/config/test/boost_no_deleted_functions.ipp delete mode 100644 libs/config/test/boost_no_dep_nested_class.ipp delete mode 100644 libs/config/test/boost_no_dep_val_param.ipp delete mode 100644 libs/config/test/boost_no_excep_std.ipp delete mode 100644 libs/config/test/boost_no_exceptions.ipp delete mode 100644 libs/config/test/boost_no_exp_func_tem_arg.ipp delete mode 100644 libs/config/test/boost_no_explicit_cvt_ops.ipp delete mode 100644 libs/config/test/boost_no_extern_template.ipp delete mode 100644 libs/config/test/boost_no_fenv_h.ipp delete mode 100644 libs/config/test/boost_no_fixed_len_variadic_templates.ipp delete mode 100644 libs/config/test/boost_no_func_tmp_order.ipp delete mode 100644 libs/config/test/boost_no_function_template_default_args.ipp delete mode 100644 libs/config/test/boost_no_function_type_spec.ipp delete mode 100644 libs/config/test/boost_no_i64_limits.ipp delete mode 100644 libs/config/test/boost_no_inline_memb_init.ipp delete mode 100644 libs/config/test/boost_no_integral_int64_t.ipp delete mode 100644 libs/config/test/boost_no_iosfwd.ipp delete mode 100644 libs/config/test/boost_no_iostream.ipp delete mode 100644 libs/config/test/boost_no_is_abstract.ipp delete mode 100644 libs/config/test/boost_no_iter_construct.ipp delete mode 100644 libs/config/test/boost_no_lambdas.ipp delete mode 100644 libs/config/test/boost_no_limits.ipp delete mode 100644 libs/config/test/boost_no_limits_const_exp.ipp delete mode 100644 libs/config/test/boost_no_ll_limits.ipp delete mode 100644 libs/config/test/boost_no_long_long.ipp delete mode 100644 libs/config/test/boost_no_mem_func_spec.ipp delete mode 100644 libs/config/test/boost_no_mem_tem_keyword.ipp delete mode 100644 libs/config/test/boost_no_mem_tem_pnts.ipp delete mode 100644 libs/config/test/boost_no_mem_templ_frnds.ipp delete mode 100644 libs/config/test/boost_no_mem_templates.ipp delete mode 100644 libs/config/test/boost_no_nested_friendship.ipp delete mode 100644 libs/config/test/boost_no_noexcept.ipp delete mode 100644 libs/config/test/boost_no_nullptr.ipp delete mode 100644 libs/config/test/boost_no_ops_in_namespace.ipp delete mode 100644 libs/config/test/boost_no_part_spec_def_args.ipp delete mode 100644 libs/config/test/boost_no_partial_spec.ipp delete mode 100644 libs/config/test/boost_no_priv_aggregate.ipp delete mode 100644 libs/config/test/boost_no_ptr_mem_const.ipp delete mode 100644 libs/config/test/boost_no_range_based_for.ipp delete mode 100644 libs/config/test/boost_no_raw_literals.ipp delete mode 100644 libs/config/test/boost_no_ret_det.ipp delete mode 100644 libs/config/test/boost_no_rtti.ipp delete mode 100644 libs/config/test/boost_no_rvalue_references.ipp delete mode 100644 libs/config/test/boost_no_scoped_enums.ipp delete mode 100644 libs/config/test/boost_no_sfinae.ipp delete mode 100644 libs/config/test/boost_no_sfinae_expr.ipp delete mode 100644 libs/config/test/boost_no_sstream.ipp delete mode 100644 libs/config/test/boost_no_static_assert.ipp delete mode 100644 libs/config/test/boost_no_std_allocator.ipp delete mode 100644 libs/config/test/boost_no_std_distance.ipp delete mode 100644 libs/config/test/boost_no_std_iter_traits.ipp delete mode 100644 libs/config/test/boost_no_std_iterator.ipp delete mode 100644 libs/config/test/boost_no_std_locale.ipp delete mode 100644 libs/config/test/boost_no_std_messages.ipp delete mode 100644 libs/config/test/boost_no_std_min_max.ipp delete mode 100644 libs/config/test/boost_no_std_oi_assign.ipp delete mode 100644 libs/config/test/boost_no_std_typeinfo.ipp delete mode 100644 libs/config/test/boost_no_std_use_facet.ipp delete mode 100644 libs/config/test/boost_no_std_wstreambuf.ipp delete mode 100644 libs/config/test/boost_no_std_wstring.ipp delete mode 100644 libs/config/test/boost_no_stdc_namespace.ipp delete mode 100644 libs/config/test/boost_no_swprintf.ipp delete mode 100644 libs/config/test/boost_no_tem_local_classes.ipp delete mode 100644 libs/config/test/boost_no_template_aliases.ipp delete mode 100644 libs/config/test/boost_no_template_streams.ipp delete mode 100644 libs/config/test/boost_no_template_template.ipp delete mode 100644 libs/config/test/boost_no_two_phase_lookup.ipp delete mode 100644 libs/config/test/boost_no_typeid.ipp delete mode 100644 libs/config/test/boost_no_typename_with_ctor.ipp delete mode 100644 libs/config/test/boost_no_unicode_literals.ipp delete mode 100644 libs/config/test/boost_no_unified_init.ipp delete mode 100644 libs/config/test/boost_no_using_breaks_adl.ipp delete mode 100644 libs/config/test/boost_no_using_decl_overld.ipp delete mode 100644 libs/config/test/boost_no_using_template.ipp delete mode 100644 libs/config/test/boost_no_variadic_macros.ipp delete mode 100644 libs/config/test/boost_no_variadic_templates.ipp delete mode 100644 libs/config/test/boost_no_void_returns.ipp delete mode 100644 libs/config/test/boost_no_wchar_t.ipp delete mode 100644 libs/config/test/cmd_line_check.cpp delete mode 100644 libs/config/test/config_build_check.cpp delete mode 100644 libs/config/test/config_info.cpp delete mode 100644 libs/config/test/config_test.cpp delete mode 100644 libs/config/test/config_test_c.c delete mode 100644 libs/config/test/cstdint_include_test.cpp delete mode 100644 libs/config/test/cstdint_test.cpp delete mode 100644 libs/config/test/cstdint_test2.cpp delete mode 100644 libs/config/test/has_2arg_use_facet_fail.cpp delete mode 100644 libs/config/test/has_2arg_use_facet_pass.cpp delete mode 100644 libs/config/test/has_bethreads_fail.cpp delete mode 100644 libs/config/test/has_bethreads_pass.cpp delete mode 100644 libs/config/test/has_clock_gettime_fail.cpp delete mode 100644 libs/config/test/has_clock_gettime_pass.cpp delete mode 100644 libs/config/test/has_dirent_h_fail.cpp delete mode 100644 libs/config/test/has_dirent_h_pass.cpp delete mode 100644 libs/config/test/has_expm1_fail.cpp delete mode 100644 libs/config/test/has_expm1_pass.cpp delete mode 100644 libs/config/test/has_float128_fail.cpp delete mode 100644 libs/config/test/has_float128_pass.cpp delete mode 100644 libs/config/test/has_ftime_fail.cpp delete mode 100644 libs/config/test/has_ftime_pass.cpp delete mode 100644 libs/config/test/has_getsystemtimeasfiletime_fail.cpp delete mode 100644 libs/config/test/has_getsystemtimeasfiletime_pass.cpp delete mode 100644 libs/config/test/has_gettimeofday_fail.cpp delete mode 100644 libs/config/test/has_gettimeofday_pass.cpp delete mode 100644 libs/config/test/has_hash_fail.cpp delete mode 100644 libs/config/test/has_hash_pass.cpp delete mode 100644 libs/config/test/has_int128_fail.cpp delete mode 100644 libs/config/test/has_int128_pass.cpp delete mode 100644 libs/config/test/has_log1p_fail.cpp delete mode 100644 libs/config/test/has_log1p_pass.cpp delete mode 100644 libs/config/test/has_long_long_fail.cpp delete mode 100644 libs/config/test/has_long_long_pass.cpp delete mode 100644 libs/config/test/has_macro_use_facet_fail.cpp delete mode 100644 libs/config/test/has_macro_use_facet_pass.cpp delete mode 100644 libs/config/test/has_ms_int64_fail.cpp delete mode 100644 libs/config/test/has_ms_int64_pass.cpp delete mode 100644 libs/config/test/has_nanosleep_fail.cpp delete mode 100644 libs/config/test/has_nanosleep_pass.cpp delete mode 100644 libs/config/test/has_nl_types_h_fail.cpp delete mode 100644 libs/config/test/has_nl_types_h_pass.cpp delete mode 100644 libs/config/test/has_nrvo_fail.cpp delete mode 100644 libs/config/test/has_nrvo_pass.cpp delete mode 100644 libs/config/test/has_part_alloc_fail.cpp delete mode 100644 libs/config/test/has_part_alloc_pass.cpp delete mode 100644 libs/config/test/has_pthread_delay_np_fail.cpp delete mode 100644 libs/config/test/has_pthread_delay_np_pass.cpp delete mode 100644 libs/config/test/has_pthread_ma_st_fail.cpp delete mode 100644 libs/config/test/has_pthread_ma_st_pass.cpp delete mode 100644 libs/config/test/has_pthread_yield_fail.cpp delete mode 100644 libs/config/test/has_pthread_yield_pass.cpp delete mode 100644 libs/config/test/has_pthreads_fail.cpp delete mode 100644 libs/config/test/has_pthreads_pass.cpp delete mode 100644 libs/config/test/has_rvalue_refs_fail.cpp delete mode 100644 libs/config/test/has_rvalue_refs_pass.cpp delete mode 100644 libs/config/test/has_sched_yield_fail.cpp delete mode 100644 libs/config/test/has_sched_yield_pass.cpp delete mode 100644 libs/config/test/has_sgi_type_traits_fail.cpp delete mode 100644 libs/config/test/has_sgi_type_traits_pass.cpp delete mode 100644 libs/config/test/has_sigaction_fail.cpp delete mode 100644 libs/config/test/has_sigaction_pass.cpp delete mode 100644 libs/config/test/has_slist_fail.cpp delete mode 100644 libs/config/test/has_slist_pass.cpp delete mode 100644 libs/config/test/has_static_assert_fail.cpp delete mode 100644 libs/config/test/has_static_assert_pass.cpp delete mode 100644 libs/config/test/has_stdint_h_fail.cpp delete mode 100644 libs/config/test/has_stdint_h_pass.cpp delete mode 100644 libs/config/test/has_stlp_use_facet_fail.cpp delete mode 100644 libs/config/test/has_stlp_use_facet_pass.cpp delete mode 100644 libs/config/test/has_tr1_array_fail.cpp delete mode 100644 libs/config/test/has_tr1_array_pass.cpp delete mode 100644 libs/config/test/has_tr1_bind_fail.cpp delete mode 100644 libs/config/test/has_tr1_bind_pass.cpp delete mode 100644 libs/config/test/has_tr1_complex_over_fail.cpp delete mode 100644 libs/config/test/has_tr1_complex_over_pass.cpp delete mode 100644 libs/config/test/has_tr1_complex_trig_fail.cpp delete mode 100644 libs/config/test/has_tr1_complex_trig_pass.cpp delete mode 100644 libs/config/test/has_tr1_function_fail.cpp delete mode 100644 libs/config/test/has_tr1_function_pass.cpp delete mode 100644 libs/config/test/has_tr1_hash_fail.cpp delete mode 100644 libs/config/test/has_tr1_hash_pass.cpp delete mode 100644 libs/config/test/has_tr1_mem_fn_fail.cpp delete mode 100644 libs/config/test/has_tr1_mem_fn_pass.cpp delete mode 100644 libs/config/test/has_tr1_random_fail.cpp delete mode 100644 libs/config/test/has_tr1_random_pass.cpp delete mode 100644 libs/config/test/has_tr1_ref_wrap_fail.cpp delete mode 100644 libs/config/test/has_tr1_ref_wrap_pass.cpp delete mode 100644 libs/config/test/has_tr1_regex_fail.cpp delete mode 100644 libs/config/test/has_tr1_regex_pass.cpp delete mode 100644 libs/config/test/has_tr1_result_of_fail.cpp delete mode 100644 libs/config/test/has_tr1_result_of_pass.cpp delete mode 100644 libs/config/test/has_tr1_shared_ptr_fail.cpp delete mode 100644 libs/config/test/has_tr1_shared_ptr_pass.cpp delete mode 100644 libs/config/test/has_tr1_tuple_fail.cpp delete mode 100644 libs/config/test/has_tr1_tuple_pass.cpp delete mode 100644 libs/config/test/has_tr1_type_traits_fail.cpp delete mode 100644 libs/config/test/has_tr1_type_traits_pass.cpp delete mode 100644 libs/config/test/has_tr1_unordered_map_fail.cpp delete mode 100644 libs/config/test/has_tr1_unordered_map_pass.cpp delete mode 100644 libs/config/test/has_tr1_unordered_set_fail.cpp delete mode 100644 libs/config/test/has_tr1_unordered_set_pass.cpp delete mode 100644 libs/config/test/has_tr1_utility_fail.cpp delete mode 100644 libs/config/test/has_tr1_utility_pass.cpp delete mode 100644 libs/config/test/has_unistd_h_fail.cpp delete mode 100644 libs/config/test/has_unistd_h_pass.cpp delete mode 100644 libs/config/test/has_variadic_tmpl_fail.cpp delete mode 100644 libs/config/test/has_variadic_tmpl_pass.cpp delete mode 100644 libs/config/test/has_vc6_mem_templ_fail.cpp delete mode 100644 libs/config/test/has_vc6_mem_templ_pass.cpp delete mode 100644 libs/config/test/has_vc_iterator_fail.cpp delete mode 100644 libs/config/test/has_vc_iterator_pass.cpp delete mode 100644 libs/config/test/has_winthreads_fail.cpp delete mode 100644 libs/config/test/has_winthreads_pass.cpp delete mode 100644 libs/config/test/helper_macro_test.cpp delete mode 100644 libs/config/test/limits_test.cpp delete mode 100644 libs/config/test/link/Jamfile.v2 delete mode 100644 libs/config/test/link/bc_gen.sh delete mode 100644 libs/config/test/link/borland.mak delete mode 100644 libs/config/test/link/common.sh delete mode 100644 libs/config/test/link/link_test.cpp delete mode 100644 libs/config/test/link/link_test.hpp delete mode 100644 libs/config/test/link/main.cpp delete mode 100644 libs/config/test/link/test/Jamfile.v2 delete mode 100644 libs/config/test/link/vc6-stlport.mak delete mode 100644 libs/config/test/link/vc6.mak delete mode 100644 libs/config/test/link/vc7-stlport.mak delete mode 100644 libs/config/test/link/vc7.mak delete mode 100644 libs/config/test/link/vc71-stlport.mak delete mode 100644 libs/config/test/link/vc71.mak delete mode 100644 libs/config/test/link/vc_gen.sh delete mode 100644 libs/config/test/math_info.cpp delete mode 100644 libs/config/test/no_adl_barrier_fail.cpp delete mode 100644 libs/config/test/no_adl_barrier_pass.cpp delete mode 100644 libs/config/test/no_arg_dep_lookup_fail.cpp delete mode 100644 libs/config/test/no_arg_dep_lookup_pass.cpp delete mode 100644 libs/config/test/no_array_type_spec_fail.cpp delete mode 100644 libs/config/test/no_array_type_spec_pass.cpp delete mode 100644 libs/config/test/no_auto_declarations_fail.cpp delete mode 100644 libs/config/test/no_auto_declarations_pass.cpp delete mode 100644 libs/config/test/no_auto_multidecl_fail.cpp delete mode 100644 libs/config/test/no_auto_multidecl_pass.cpp delete mode 100644 libs/config/test/no_auto_ptr_fail.cpp delete mode 100644 libs/config/test/no_auto_ptr_pass.cpp delete mode 100644 libs/config/test/no_bcb_partial_spec_fail.cpp delete mode 100644 libs/config/test/no_bcb_partial_spec_pass.cpp delete mode 100644 libs/config/test/no_char16_t_fail.cpp delete mode 100644 libs/config/test/no_char16_t_pass.cpp delete mode 100644 libs/config/test/no_char32_t_fail.cpp delete mode 100644 libs/config/test/no_char32_t_pass.cpp delete mode 100644 libs/config/test/no_com_value_init_fail.cpp delete mode 100644 libs/config/test/no_com_value_init_pass.cpp delete mode 100644 libs/config/test/no_constexpr_fail.cpp delete mode 100644 libs/config/test/no_constexpr_pass.cpp delete mode 100644 libs/config/test/no_ctype_functions_fail.cpp delete mode 100644 libs/config/test/no_ctype_functions_pass.cpp delete mode 100644 libs/config/test/no_cv_spec_fail.cpp delete mode 100644 libs/config/test/no_cv_spec_pass.cpp delete mode 100644 libs/config/test/no_cv_void_spec_fail.cpp delete mode 100644 libs/config/test/no_cv_void_spec_pass.cpp delete mode 100644 libs/config/test/no_cwchar_fail.cpp delete mode 100644 libs/config/test/no_cwchar_pass.cpp delete mode 100644 libs/config/test/no_cwctype_fail.cpp delete mode 100644 libs/config/test/no_cwctype_pass.cpp delete mode 100644 libs/config/test/no_cxx11_addressof_fail.cpp delete mode 100644 libs/config/test/no_cxx11_addressof_pass.cpp delete mode 100644 libs/config/test/no_cxx11_alignas_fail.cpp delete mode 100644 libs/config/test/no_cxx11_alignas_pass.cpp delete mode 100644 libs/config/test/no_cxx11_allocator_fail.cpp delete mode 100644 libs/config/test/no_cxx11_allocator_pass.cpp delete mode 100644 libs/config/test/no_cxx11_atomic_sp_fail.cpp delete mode 100644 libs/config/test/no_cxx11_atomic_sp_pass.cpp delete mode 100644 libs/config/test/no_cxx11_final_fail.cpp delete mode 100644 libs/config/test/no_cxx11_final_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_array_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_array_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_atomic_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_atomic_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_chrono_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_chrono_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_codecvt_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_codecvt_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_condition_variable_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_condition_variable_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_forward_list_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_forward_list_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_future_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_future_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_initializer_list_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_initializer_list_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_mutex_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_mutex_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_random_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_random_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_ratio_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_ratio_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_regex_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_regex_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_system_error_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_system_error_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_thread_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_thread_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_tuple_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_tuple_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_type_traits_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_type_traits_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_typeindex_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_typeindex_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_unordered_map_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_unordered_map_pass.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_unordered_set_fail.cpp delete mode 100644 libs/config/test/no_cxx11_hdr_unordered_set_pass.cpp delete mode 100644 libs/config/test/no_cxx11_inline_namespaces_fail.cpp delete mode 100644 libs/config/test/no_cxx11_inline_namespaces_pass.cpp delete mode 100644 libs/config/test/no_cxx11_non_pub_def_fun_fail.cpp delete mode 100644 libs/config/test/no_cxx11_non_pub_def_fun_pass.cpp delete mode 100644 libs/config/test/no_cxx11_numeric_limits_fail.cpp delete mode 100644 libs/config/test/no_cxx11_numeric_limits_pass.cpp delete mode 100644 libs/config/test/no_cxx11_ref_qualifiers_fail.cpp delete mode 100644 libs/config/test/no_cxx11_ref_qualifiers_pass.cpp delete mode 100644 libs/config/test/no_cxx11_smart_ptr_fail.cpp delete mode 100644 libs/config/test/no_cxx11_smart_ptr_pass.cpp delete mode 100644 libs/config/test/no_cxx11_std_align_fail.cpp delete mode 100644 libs/config/test/no_cxx11_std_align_pass.cpp delete mode 100644 libs/config/test/no_cxx11_thread_local_fail.cpp delete mode 100644 libs/config/test/no_cxx11_thread_local_pass.cpp delete mode 100644 libs/config/test/no_cxx11_trailing_result_types_fail.cpp delete mode 100644 libs/config/test/no_cxx11_trailing_result_types_pass.cpp delete mode 100644 libs/config/test/no_cxx11_user_lit_fail.cpp delete mode 100644 libs/config/test/no_cxx11_user_lit_pass.cpp delete mode 100644 libs/config/test/no_cxx14_binary_literals_fail.cpp delete mode 100644 libs/config/test/no_cxx14_binary_literals_pass.cpp delete mode 100644 libs/config/test/no_cxx14_constexpr_fail.cpp delete mode 100644 libs/config/test/no_cxx14_constexpr_pass.cpp delete mode 100644 libs/config/test/no_cxx14_decltype_auto_fail.cpp delete mode 100644 libs/config/test/no_cxx14_decltype_auto_pass.cpp delete mode 100644 libs/config/test/no_cxx14_digit_separator_fail.cpp delete mode 100644 libs/config/test/no_cxx14_digit_separator_pass.cpp delete mode 100644 libs/config/test/no_cxx14_generic_lambda_fail.cpp delete mode 100644 libs/config/test/no_cxx14_generic_lambda_pass.cpp delete mode 100644 libs/config/test/no_cxx14_hdr_shared_mutex_fail.cpp delete mode 100644 libs/config/test/no_cxx14_hdr_shared_mutex_pass.cpp delete mode 100644 libs/config/test/no_cxx14_lambda_capture_fail.cpp delete mode 100644 libs/config/test/no_cxx14_lambda_capture_pass.cpp delete mode 100644 libs/config/test/no_cxx14_member_init_fail.cpp delete mode 100644 libs/config/test/no_cxx14_member_init_pass.cpp delete mode 100644 libs/config/test/no_cxx14_return_type_ded_fail.cpp delete mode 100644 libs/config/test/no_cxx14_return_type_ded_pass.cpp delete mode 100644 libs/config/test/no_cxx14_std_exchange_fail.cpp delete mode 100644 libs/config/test/no_cxx14_std_exchange_pass.cpp delete mode 100644 libs/config/test/no_cxx14_var_templ_fail.cpp delete mode 100644 libs/config/test/no_cxx14_var_templ_pass.cpp delete mode 100644 libs/config/test/no_cxx17_std_apply_fail.cpp delete mode 100644 libs/config/test/no_cxx17_std_apply_pass.cpp delete mode 100644 libs/config/test/no_cxx17_std_invoke_fail.cpp delete mode 100644 libs/config/test/no_cxx17_std_invoke_pass.cpp delete mode 100644 libs/config/test/no_cxx_hdr_functional_fail.cpp delete mode 100644 libs/config/test/no_cxx_hdr_functional_pass.cpp delete mode 100644 libs/config/test/no_decltype_fail.cpp delete mode 100644 libs/config/test/no_decltype_n3276_fail.cpp delete mode 100644 libs/config/test/no_decltype_n3276_pass.cpp delete mode 100644 libs/config/test/no_decltype_pass.cpp delete mode 100644 libs/config/test/no_ded_typename_fail.cpp delete mode 100644 libs/config/test/no_ded_typename_pass.cpp delete mode 100644 libs/config/test/no_defaulted_functions_fail.cpp delete mode 100644 libs/config/test/no_defaulted_functions_pass.cpp delete mode 100644 libs/config/test/no_deleted_functions_fail.cpp delete mode 100644 libs/config/test/no_deleted_functions_pass.cpp delete mode 100644 libs/config/test/no_dep_nested_class_fail.cpp delete mode 100644 libs/config/test/no_dep_nested_class_pass.cpp delete mode 100644 libs/config/test/no_dep_val_param_fail.cpp delete mode 100644 libs/config/test/no_dep_val_param_pass.cpp delete mode 100644 libs/config/test/no_excep_std_fail.cpp delete mode 100644 libs/config/test/no_excep_std_pass.cpp delete mode 100644 libs/config/test/no_exceptions_fail.cpp delete mode 100644 libs/config/test/no_exceptions_pass.cpp delete mode 100644 libs/config/test/no_exp_func_tem_arg_fail.cpp delete mode 100644 libs/config/test/no_exp_func_tem_arg_pass.cpp delete mode 100644 libs/config/test/no_explicit_cvt_ops_fail.cpp delete mode 100644 libs/config/test/no_explicit_cvt_ops_pass.cpp delete mode 100644 libs/config/test/no_extern_template_fail.cpp delete mode 100644 libs/config/test/no_extern_template_pass.cpp delete mode 100644 libs/config/test/no_fenv_h_fail.cpp delete mode 100644 libs/config/test/no_fenv_h_pass.cpp delete mode 100644 libs/config/test/no_fixed_len_variadic_templates_fail.cpp delete mode 100644 libs/config/test/no_fixed_len_variadic_templates_pass.cpp delete mode 100644 libs/config/test/no_func_tmp_order_fail.cpp delete mode 100644 libs/config/test/no_func_tmp_order_pass.cpp delete mode 100644 libs/config/test/no_function_template_default_args_fail.cpp delete mode 100644 libs/config/test/no_function_template_default_args_pass.cpp delete mode 100644 libs/config/test/no_function_type_spec_fail.cpp delete mode 100644 libs/config/test/no_function_type_spec_pass.cpp delete mode 100644 libs/config/test/no_i64_limits_fail.cpp delete mode 100644 libs/config/test/no_i64_limits_pass.cpp delete mode 100644 libs/config/test/no_inline_memb_init_fail.cpp delete mode 100644 libs/config/test/no_inline_memb_init_pass.cpp delete mode 100644 libs/config/test/no_integral_int64_t_fail.cpp delete mode 100644 libs/config/test/no_integral_int64_t_pass.cpp delete mode 100644 libs/config/test/no_iosfwd_fail.cpp delete mode 100644 libs/config/test/no_iosfwd_pass.cpp delete mode 100644 libs/config/test/no_iostream_fail.cpp delete mode 100644 libs/config/test/no_iostream_pass.cpp delete mode 100644 libs/config/test/no_is_abstract_fail.cpp delete mode 100644 libs/config/test/no_is_abstract_pass.cpp delete mode 100644 libs/config/test/no_iter_construct_fail.cpp delete mode 100644 libs/config/test/no_iter_construct_pass.cpp delete mode 100644 libs/config/test/no_lambdas_fail.cpp delete mode 100644 libs/config/test/no_lambdas_pass.cpp delete mode 100644 libs/config/test/no_limits_const_exp_fail.cpp delete mode 100644 libs/config/test/no_limits_const_exp_pass.cpp delete mode 100644 libs/config/test/no_limits_fail.cpp delete mode 100644 libs/config/test/no_limits_pass.cpp delete mode 100644 libs/config/test/no_ll_limits_fail.cpp delete mode 100644 libs/config/test/no_ll_limits_pass.cpp delete mode 100644 libs/config/test/no_long_long_fail.cpp delete mode 100644 libs/config/test/no_long_long_pass.cpp delete mode 100644 libs/config/test/no_mem_func_spec_fail.cpp delete mode 100644 libs/config/test/no_mem_func_spec_pass.cpp delete mode 100644 libs/config/test/no_mem_tem_keyword_fail.cpp delete mode 100644 libs/config/test/no_mem_tem_keyword_pass.cpp delete mode 100644 libs/config/test/no_mem_tem_pnts_fail.cpp delete mode 100644 libs/config/test/no_mem_tem_pnts_pass.cpp delete mode 100644 libs/config/test/no_mem_templ_frnds_fail.cpp delete mode 100644 libs/config/test/no_mem_templ_frnds_pass.cpp delete mode 100644 libs/config/test/no_mem_templates_fail.cpp delete mode 100644 libs/config/test/no_mem_templates_pass.cpp delete mode 100644 libs/config/test/no_nested_friendship_fail.cpp delete mode 100644 libs/config/test/no_nested_friendship_pass.cpp delete mode 100644 libs/config/test/no_noexcept_fail.cpp delete mode 100644 libs/config/test/no_noexcept_pass.cpp delete mode 100644 libs/config/test/no_nullptr_fail.cpp delete mode 100644 libs/config/test/no_nullptr_pass.cpp delete mode 100644 libs/config/test/no_ops_in_namespace_fail.cpp delete mode 100644 libs/config/test/no_ops_in_namespace_pass.cpp delete mode 100644 libs/config/test/no_part_spec_def_args_fail.cpp delete mode 100644 libs/config/test/no_part_spec_def_args_pass.cpp delete mode 100644 libs/config/test/no_partial_spec_fail.cpp delete mode 100644 libs/config/test/no_partial_spec_pass.cpp delete mode 100644 libs/config/test/no_priv_aggregate_fail.cpp delete mode 100644 libs/config/test/no_priv_aggregate_pass.cpp delete mode 100644 libs/config/test/no_ptr_mem_const_fail.cpp delete mode 100644 libs/config/test/no_ptr_mem_const_pass.cpp delete mode 100644 libs/config/test/no_range_based_for_fail.cpp delete mode 100644 libs/config/test/no_range_based_for_pass.cpp delete mode 100644 libs/config/test/no_raw_literals_fail.cpp delete mode 100644 libs/config/test/no_raw_literals_pass.cpp delete mode 100644 libs/config/test/no_ret_det_fail.cpp delete mode 100644 libs/config/test/no_ret_det_pass.cpp delete mode 100644 libs/config/test/no_rtti_fail.cpp delete mode 100644 libs/config/test/no_rtti_pass.cpp delete mode 100644 libs/config/test/no_rvalue_references_fail.cpp delete mode 100644 libs/config/test/no_rvalue_references_pass.cpp delete mode 100644 libs/config/test/no_scoped_enums_fail.cpp delete mode 100644 libs/config/test/no_scoped_enums_pass.cpp delete mode 100644 libs/config/test/no_sfinae_expr_fail.cpp delete mode 100644 libs/config/test/no_sfinae_expr_pass.cpp delete mode 100644 libs/config/test/no_sfinae_fail.cpp delete mode 100644 libs/config/test/no_sfinae_pass.cpp delete mode 100644 libs/config/test/no_sstream_fail.cpp delete mode 100644 libs/config/test/no_sstream_pass.cpp delete mode 100644 libs/config/test/no_static_assert_fail.cpp delete mode 100644 libs/config/test/no_static_assert_pass.cpp delete mode 100644 libs/config/test/no_std_allocator_fail.cpp delete mode 100644 libs/config/test/no_std_allocator_pass.cpp delete mode 100644 libs/config/test/no_std_distance_fail.cpp delete mode 100644 libs/config/test/no_std_distance_pass.cpp delete mode 100644 libs/config/test/no_std_iter_traits_fail.cpp delete mode 100644 libs/config/test/no_std_iter_traits_pass.cpp delete mode 100644 libs/config/test/no_std_iterator_fail.cpp delete mode 100644 libs/config/test/no_std_iterator_pass.cpp delete mode 100644 libs/config/test/no_std_locale_fail.cpp delete mode 100644 libs/config/test/no_std_locale_pass.cpp delete mode 100644 libs/config/test/no_std_messages_fail.cpp delete mode 100644 libs/config/test/no_std_messages_pass.cpp delete mode 100644 libs/config/test/no_std_min_max_fail.cpp delete mode 100644 libs/config/test/no_std_min_max_pass.cpp delete mode 100644 libs/config/test/no_std_oi_assign_fail.cpp delete mode 100644 libs/config/test/no_std_oi_assign_pass.cpp delete mode 100644 libs/config/test/no_std_typeinfo_fail.cpp delete mode 100644 libs/config/test/no_std_typeinfo_pass.cpp delete mode 100644 libs/config/test/no_std_use_facet_fail.cpp delete mode 100644 libs/config/test/no_std_use_facet_pass.cpp delete mode 100644 libs/config/test/no_std_wstreambuf_fail.cpp delete mode 100644 libs/config/test/no_std_wstreambuf_pass.cpp delete mode 100644 libs/config/test/no_std_wstring_fail.cpp delete mode 100644 libs/config/test/no_std_wstring_pass.cpp delete mode 100644 libs/config/test/no_stdc_namespace_fail.cpp delete mode 100644 libs/config/test/no_stdc_namespace_pass.cpp delete mode 100644 libs/config/test/no_swprintf_fail.cpp delete mode 100644 libs/config/test/no_swprintf_pass.cpp delete mode 100644 libs/config/test/no_tem_local_classes_fail.cpp delete mode 100644 libs/config/test/no_tem_local_classes_pass.cpp delete mode 100644 libs/config/test/no_template_aliases_fail.cpp delete mode 100644 libs/config/test/no_template_aliases_pass.cpp delete mode 100644 libs/config/test/no_template_streams_fail.cpp delete mode 100644 libs/config/test/no_template_streams_pass.cpp delete mode 100644 libs/config/test/no_template_template_fail.cpp delete mode 100644 libs/config/test/no_template_template_pass.cpp delete mode 100644 libs/config/test/no_two_phase_lookup_fail.cpp delete mode 100644 libs/config/test/no_two_phase_lookup_pass.cpp delete mode 100644 libs/config/test/no_typeid_fail.cpp delete mode 100644 libs/config/test/no_typeid_pass.cpp delete mode 100644 libs/config/test/no_typename_with_ctor_fail.cpp delete mode 100644 libs/config/test/no_typename_with_ctor_pass.cpp delete mode 100644 libs/config/test/no_unicode_literals_fail.cpp delete mode 100644 libs/config/test/no_unicode_literals_pass.cpp delete mode 100644 libs/config/test/no_unified_init_fail.cpp delete mode 100644 libs/config/test/no_unified_init_pass.cpp delete mode 100644 libs/config/test/no_using_breaks_adl_fail.cpp delete mode 100644 libs/config/test/no_using_breaks_adl_pass.cpp delete mode 100644 libs/config/test/no_using_decl_overld_fail.cpp delete mode 100644 libs/config/test/no_using_decl_overld_pass.cpp delete mode 100644 libs/config/test/no_using_template_fail.cpp delete mode 100644 libs/config/test/no_using_template_pass.cpp delete mode 100644 libs/config/test/no_variadic_macros_fail.cpp delete mode 100644 libs/config/test/no_variadic_macros_pass.cpp delete mode 100644 libs/config/test/no_variadic_templates_fail.cpp delete mode 100644 libs/config/test/no_variadic_templates_pass.cpp delete mode 100644 libs/config/test/no_void_returns_fail.cpp delete mode 100644 libs/config/test/no_void_returns_pass.cpp delete mode 100644 libs/config/test/no_wchar_t_fail.cpp delete mode 100644 libs/config/test/no_wchar_t_pass.cpp delete mode 100644 libs/config/test/test.hpp delete mode 100644 libs/config/test/threads/test_thread_fail1.cpp delete mode 100644 libs/config/test/threads/test_thread_fail2.cpp delete mode 100644 libs/crc/crc.html delete mode 100644 libs/crc/crc_example.cpp delete mode 100644 libs/crc/index.html delete mode 100644 libs/crc/test/Jamfile.v2 delete mode 100644 libs/crc/test/crc_test.cpp delete mode 100644 libs/iterator/doc/BidirectionalTraversal.html delete mode 100644 libs/iterator/doc/BidirectionalTraversal.rst delete mode 100644 libs/iterator/doc/ForwardTraversal.html delete mode 100644 libs/iterator/doc/ForwardTraversal.rst delete mode 100644 libs/iterator/doc/GNUmakefile delete mode 100644 libs/iterator/doc/IncrementableIterator.html delete mode 100644 libs/iterator/doc/IncrementableIterator.rst delete mode 100644 libs/iterator/doc/InteroperableIterator.rst delete mode 100644 libs/iterator/doc/Jamfile.v2 delete mode 100644 libs/iterator/doc/LvalueIterator.html delete mode 100644 libs/iterator/doc/LvalueIterator.rst delete mode 100644 libs/iterator/doc/RandomAccessTraversal.html delete mode 100644 libs/iterator/doc/RandomAccessTraversal.rst delete mode 100644 libs/iterator/doc/ReadableIterator.html delete mode 100644 libs/iterator/doc/ReadableIterator.rst delete mode 100644 libs/iterator/doc/SinglePassIterator.html delete mode 100644 libs/iterator/doc/SinglePassIterator.rst delete mode 100644 libs/iterator/doc/SwappableIterator.html delete mode 100644 libs/iterator/doc/SwappableIterator.rst delete mode 100644 libs/iterator/doc/WritableIterator.html delete mode 100644 libs/iterator/doc/WritableIterator.rst delete mode 100644 libs/iterator/doc/access.png delete mode 100644 libs/iterator/doc/access2old.png delete mode 100644 libs/iterator/doc/counting_iterator.html delete mode 100644 libs/iterator/doc/counting_iterator.pdf delete mode 100644 libs/iterator/doc/counting_iterator.rst delete mode 100644 libs/iterator/doc/counting_iterator_abstract.rst delete mode 100644 libs/iterator/doc/counting_iterator_eg.rst delete mode 100644 libs/iterator/doc/counting_iterator_ref.rst delete mode 100644 libs/iterator/doc/default.css delete mode 100644 libs/iterator/doc/docutils.sty delete mode 100644 libs/iterator/doc/facade-and-adaptor.html delete mode 100644 libs/iterator/doc/facade-and-adaptor.pdf delete mode 100644 libs/iterator/doc/facade-and-adaptor.rst delete mode 100644 libs/iterator/doc/facade_iterator_category.rst delete mode 100644 libs/iterator/doc/filter_iterator.html delete mode 100644 libs/iterator/doc/filter_iterator.pdf delete mode 100644 libs/iterator/doc/filter_iterator.rst delete mode 100644 libs/iterator/doc/filter_iterator_abstract.rst delete mode 100644 libs/iterator/doc/filter_iterator_eg.rst delete mode 100644 libs/iterator/doc/filter_iterator_ref.rst delete mode 100644 libs/iterator/doc/func_output_iter_abstract.rst delete mode 100644 libs/iterator/doc/func_output_iter_ref.rst delete mode 100644 libs/iterator/doc/function_input_iterator.html delete mode 100644 libs/iterator/doc/function_input_iterator.rst delete mode 100644 libs/iterator/doc/function_output_iterator.html delete mode 100644 libs/iterator/doc/function_output_iterator.pdf delete mode 100644 libs/iterator/doc/function_output_iterator.rst delete mode 100644 libs/iterator/doc/function_output_iterator_eg.rst delete mode 100644 libs/iterator/doc/generate.py delete mode 100644 libs/iterator/doc/generator_iterator.htm delete mode 100644 libs/iterator/doc/html/index.html delete mode 100644 libs/iterator/doc/html/iterator/concepts.html delete mode 100644 libs/iterator/doc/html/iterator/concepts/concepts_traversal.html delete mode 100644 libs/iterator/doc/html/iterator/generic.html delete mode 100644 libs/iterator/doc/html/iterator/generic/adaptor.html delete mode 100644 libs/iterator/doc/html/iterator/generic/adaptor/adaptor_tutorial.html delete mode 100644 libs/iterator/doc/html/iterator/history.html delete mode 100644 libs/iterator/doc/html/iterator/specialized.html delete mode 100644 libs/iterator/doc/html/iterator/specialized/filter.html delete mode 100644 libs/iterator/doc/html/iterator/specialized/function_output.html delete mode 100644 libs/iterator/doc/html/iterator/specialized/indirect.html delete mode 100644 libs/iterator/doc/html/iterator/specialized/permutation.html delete mode 100644 libs/iterator/doc/html/iterator/specialized/reverse.html delete mode 100644 libs/iterator/doc/html/iterator/specialized/shared_container.html delete mode 100644 libs/iterator/doc/html/iterator/specialized/shared_container/shared_container_generator.html delete mode 100644 libs/iterator/doc/html/iterator/specialized/shared_container/shared_container_object_generator.html delete mode 100644 libs/iterator/doc/html/iterator/specialized/transform.html delete mode 100644 libs/iterator/doc/html/iterator/specialized/zip.html delete mode 100644 libs/iterator/doc/html/iterator/specialized/zip/zip_reference.html delete mode 100644 libs/iterator/doc/html/iterator/upgrading.html delete mode 100644 libs/iterator/doc/html/iterator/utilities.html delete mode 100644 libs/iterator/doc/html/iterator/utilities/concept_checking.html delete mode 100644 libs/iterator/doc/html/iterator/utilities/traits.html delete mode 100644 libs/iterator/doc/html/iterator/utilities/utilities.html delete mode 100644 libs/iterator/doc/html/iterator/utilities/utilities/utilities_testing.html delete mode 100644 libs/iterator/doc/html/standalone_HTML.manifest delete mode 100644 libs/iterator/doc/index.html delete mode 100644 libs/iterator/doc/index.rst delete mode 100644 libs/iterator/doc/indirect_iterator.html delete mode 100644 libs/iterator/doc/indirect_iterator.pdf delete mode 100644 libs/iterator/doc/indirect_iterator.rst delete mode 100644 libs/iterator/doc/indirect_iterator_abstract.rst delete mode 100644 libs/iterator/doc/indirect_iterator_eg.rst delete mode 100644 libs/iterator/doc/indirect_iterator_ref.rst delete mode 100644 libs/iterator/doc/indirect_reference_ref.rst delete mode 100644 libs/iterator/doc/interoperability-revisited.rst delete mode 100644 libs/iterator/doc/issues.rst delete mode 100644 libs/iterator/doc/iterator_adaptor.html delete mode 100644 libs/iterator/doc/iterator_adaptor.pdf delete mode 100644 libs/iterator/doc/iterator_adaptor.rst delete mode 100644 libs/iterator/doc/iterator_adaptor_abstract.rst delete mode 100644 libs/iterator/doc/iterator_adaptor_body.rst delete mode 100644 libs/iterator/doc/iterator_adaptor_ref.rst delete mode 100644 libs/iterator/doc/iterator_adaptor_tutorial.rst delete mode 100644 libs/iterator/doc/iterator_archetypes.html delete mode 100644 libs/iterator/doc/iterator_archetypes.pdf delete mode 100644 libs/iterator/doc/iterator_archetypes.rst delete mode 100644 libs/iterator/doc/iterator_concepts.html delete mode 100644 libs/iterator/doc/iterator_concepts.pdf delete mode 100644 libs/iterator/doc/iterator_concepts.rst delete mode 100644 libs/iterator/doc/iterator_facade.html delete mode 100644 libs/iterator/doc/iterator_facade.pdf delete mode 100644 libs/iterator/doc/iterator_facade.rst delete mode 100644 libs/iterator/doc/iterator_facade_abstract.rst delete mode 100644 libs/iterator/doc/iterator_facade_body.rst delete mode 100644 libs/iterator/doc/iterator_facade_ref.rst delete mode 100644 libs/iterator/doc/iterator_facade_tutorial.rst delete mode 100644 libs/iterator/doc/iterator_traits.html delete mode 100644 libs/iterator/doc/iterator_traits.pdf delete mode 100644 libs/iterator/doc/iterator_traits.rst delete mode 100644 libs/iterator/doc/make_counting_iterator.rst delete mode 100644 libs/iterator/doc/make_filter_iterator.rst delete mode 100644 libs/iterator/doc/make_reverse_iterator.rst delete mode 100644 libs/iterator/doc/make_transform_iterator.rst delete mode 100644 libs/iterator/doc/make_zip_iterator.rst delete mode 100644 libs/iterator/doc/new-iter-concepts.html delete mode 100644 libs/iterator/doc/new-iter-concepts.pdf delete mode 100644 libs/iterator/doc/new-iter-concepts.rst delete mode 100644 libs/iterator/doc/oldeqnew.png delete mode 100644 libs/iterator/doc/permutation_iter_abstract.rst delete mode 100644 libs/iterator/doc/permutation_iterator.html delete mode 100644 libs/iterator/doc/permutation_iterator.pdf delete mode 100644 libs/iterator/doc/permutation_iterator.rst delete mode 100644 libs/iterator/doc/permutation_iterator_body.rst delete mode 100644 libs/iterator/doc/permutation_iterator_eg.rst delete mode 100644 libs/iterator/doc/permutation_iterator_ref.rst delete mode 100644 libs/iterator/doc/pointee.html delete mode 100644 libs/iterator/doc/pointee.pdf delete mode 100644 libs/iterator/doc/pointee.rst delete mode 100644 libs/iterator/doc/pointee_ref.rst delete mode 100644 libs/iterator/doc/quickbook/adaptor.qbk delete mode 100644 libs/iterator/doc/quickbook/archetypes.qbk delete mode 100644 libs/iterator/doc/quickbook/concept_checking.qbk delete mode 100644 libs/iterator/doc/quickbook/concepts.qbk delete mode 100644 libs/iterator/doc/quickbook/counting_iterator.qbk delete mode 100644 libs/iterator/doc/quickbook/facade.qbk delete mode 100644 libs/iterator/doc/quickbook/facade_tutorial.qbk delete mode 100644 libs/iterator/doc/quickbook/filter_iterator.qbk delete mode 100644 libs/iterator/doc/quickbook/function_output_iterator.qbk delete mode 100644 libs/iterator/doc/quickbook/indirect_iterator.qbk delete mode 100644 libs/iterator/doc/quickbook/iterator.qbk delete mode 100644 libs/iterator/doc/quickbook/permutation_iterator.qbk delete mode 100644 libs/iterator/doc/quickbook/reverse_iterator.qbk delete mode 100644 libs/iterator/doc/quickbook/shared_container_iterator.qbk delete mode 100644 libs/iterator/doc/quickbook/specialized_adaptors.qbk delete mode 100644 libs/iterator/doc/quickbook/traits.qbk delete mode 100644 libs/iterator/doc/quickbook/transform_iterator.qbk delete mode 100644 libs/iterator/doc/quickbook/utilities.qbk delete mode 100644 libs/iterator/doc/quickbook/zip_iterator.qbk delete mode 100644 libs/iterator/doc/ref_problem.rst delete mode 100644 libs/iterator/doc/reverse_iterator.html delete mode 100644 libs/iterator/doc/reverse_iterator.pdf delete mode 100644 libs/iterator/doc/reverse_iterator.rst delete mode 100644 libs/iterator/doc/reverse_iterator_abstract.rst delete mode 100644 libs/iterator/doc/reverse_iterator_eg.rst delete mode 100644 libs/iterator/doc/reverse_iterator_ref.rst delete mode 100644 libs/iterator/doc/rst2html delete mode 100644 libs/iterator/doc/rst2latex delete mode 100644 libs/iterator/doc/scanrst.py delete mode 100644 libs/iterator/doc/sources.py delete mode 100644 libs/iterator/doc/syscmd.py delete mode 100644 libs/iterator/doc/transform_iterator.html delete mode 100644 libs/iterator/doc/transform_iterator.pdf delete mode 100644 libs/iterator/doc/transform_iterator.rst delete mode 100644 libs/iterator/doc/transform_iterator_abstract.rst delete mode 100644 libs/iterator/doc/transform_iterator_eg.rst delete mode 100644 libs/iterator/doc/transform_iterator_ref.rst delete mode 100644 libs/iterator/doc/traversal.png delete mode 100644 libs/iterator/doc/zip_iterator.html delete mode 100644 libs/iterator/doc/zip_iterator.pdf delete mode 100644 libs/iterator/doc/zip_iterator.rst delete mode 100644 libs/iterator/doc/zip_iterator_abstract.rst delete mode 100644 libs/iterator/doc/zip_iterator_eg.rst delete mode 100644 libs/iterator/doc/zip_iterator_ref.rst delete mode 100644 libs/iterator/example/counting_iterator_example.cpp delete mode 100644 libs/iterator/example/filter_iterator_example.cpp delete mode 100644 libs/iterator/example/func_output_iter_example.cpp delete mode 100644 libs/iterator/example/indirect_iterator_example.cpp delete mode 100644 libs/iterator/example/node.hpp delete mode 100644 libs/iterator/example/node_iterator1.cpp delete mode 100644 libs/iterator/example/node_iterator1.hpp delete mode 100644 libs/iterator/example/node_iterator2.cpp delete mode 100644 libs/iterator/example/node_iterator2.hpp delete mode 100644 libs/iterator/example/node_iterator3.cpp delete mode 100644 libs/iterator/example/node_iterator3.hpp delete mode 100644 libs/iterator/example/permutation_iter_example.cpp delete mode 100644 libs/iterator/example/reverse_iterator.cpp delete mode 100644 libs/iterator/example/reverse_iterator_example.cpp delete mode 100644 libs/iterator/example/transform_iterator_example.cpp delete mode 100644 libs/iterator/index.html delete mode 100644 libs/iterator/meta/libraries.json delete mode 100644 libs/iterator/test/Jamfile.v2 delete mode 100644 libs/iterator/test/concept_tests.cpp delete mode 100644 libs/iterator/test/constant_iter_arrow.cpp delete mode 100644 libs/iterator/test/constant_iter_arrow_fail.cpp delete mode 100644 libs/iterator/test/counting_iterator_test.cpp delete mode 100644 libs/iterator/test/detail/zip_iterator_test.ipp delete mode 100644 libs/iterator/test/detail/zip_iterator_test_original.ipp delete mode 100644 libs/iterator/test/filter_iterator_test.cpp delete mode 100644 libs/iterator/test/function_input_iterator_test.cpp delete mode 100644 libs/iterator/test/generator_iterator_test.cpp delete mode 100644 libs/iterator/test/indirect_iter_member_types.cpp delete mode 100644 libs/iterator/test/indirect_iterator_test.cpp delete mode 100644 libs/iterator/test/interoperable.cpp delete mode 100644 libs/iterator/test/interoperable_fail.cpp delete mode 100644 libs/iterator/test/is_convertible_fail.cpp delete mode 100644 libs/iterator/test/is_lvalue_iterator.cpp delete mode 100644 libs/iterator/test/is_readable_iterator.cpp delete mode 100644 libs/iterator/test/iter_archetype_default_ctor.cpp delete mode 100644 libs/iterator/test/iterator_adaptor_cc.cpp delete mode 100644 libs/iterator/test/iterator_adaptor_test.cpp delete mode 100644 libs/iterator/test/iterator_archetype_cc.cpp delete mode 100644 libs/iterator/test/iterator_facade.cpp delete mode 100644 libs/iterator/test/iterator_traits_test.cpp delete mode 100644 libs/iterator/test/lvalue_concept_fail.cpp delete mode 100644 libs/iterator/test/minimum_category.cpp delete mode 100644 libs/iterator/test/minimum_category_compile_fail.cpp delete mode 100644 libs/iterator/test/permutation_iterator_test.cpp delete mode 100644 libs/iterator/test/pointee.cpp delete mode 100644 libs/iterator/test/reverse_iterator_test.cpp delete mode 100644 libs/iterator/test/static_assert_same.hpp delete mode 100644 libs/iterator/test/transform_iterator_test.cpp delete mode 100644 libs/iterator/test/unit_tests.cpp delete mode 100644 libs/iterator/test/zip_iterator_test.cpp delete mode 100644 libs/iterator/test/zip_iterator_test2_fusion_deque.cpp delete mode 100644 libs/iterator/test/zip_iterator_test2_fusion_list.cpp delete mode 100644 libs/iterator/test/zip_iterator_test2_fusion_vector.cpp delete mode 100644 libs/iterator/test/zip_iterator_test2_std_tuple.cpp delete mode 100644 libs/iterator/test/zip_iterator_test_fusion.cpp delete mode 100644 libs/iterator/test/zip_iterator_test_std_pair.cpp delete mode 100644 libs/iterator/test/zip_iterator_test_std_tuple.cpp delete mode 100644 libs/numeric/conversion/doc/Jamfile.v2 delete mode 100644 libs/numeric/conversion/doc/bounds.qbk delete mode 100644 libs/numeric/conversion/doc/conversion.qbk delete mode 100644 libs/numeric/conversion/doc/conversion_traits.qbk delete mode 100644 libs/numeric/conversion/doc/converter.qbk delete mode 100644 libs/numeric/conversion/doc/converter_policies.qbk delete mode 100644 libs/numeric/conversion/doc/definitions.qbk delete mode 100644 libs/numeric/conversion/doc/html/HTML.manifest delete mode 100644 libs/numeric/conversion/doc/html/boost_numericconversion/bounds___traits_class.html delete mode 100644 libs/numeric/conversion/doc/html/boost_numericconversion/conversion_traits___traits_class.html delete mode 100644 libs/numeric/conversion/doc/html/boost_numericconversion/converter___function_object.html delete mode 100644 libs/numeric/conversion/doc/html/boost_numericconversion/definitions.html delete mode 100644 libs/numeric/conversion/doc/html/boost_numericconversion/improved_numeric_cast__.html delete mode 100644 libs/numeric/conversion/doc/html/boost_numericconversion/numeric_converter_policy_classes.html delete mode 100644 libs/numeric/conversion/doc/html/boost_numericconversion/type_requirements_and_user_defined_types_support.html delete mode 100644 libs/numeric/conversion/doc/html/boostbook.css delete mode 100644 libs/numeric/conversion/doc/html/images/callouts/R.png delete mode 100644 libs/numeric/conversion/doc/html/images/space.png delete mode 100644 libs/numeric/conversion/doc/html/index.html delete mode 100644 libs/numeric/conversion/doc/html/numeric_conversion/bibliography.html delete mode 100644 libs/numeric/conversion/doc/html/numeric_conversion/history_and_acknowledgments.html delete mode 100644 libs/numeric/conversion/doc/html/standalone_HTML.manifest delete mode 100644 libs/numeric/conversion/doc/numeric_cast.qbk delete mode 100644 libs/numeric/conversion/doc/requirements.qbk delete mode 100644 libs/numeric/conversion/index.html delete mode 100644 libs/numeric/conversion/test/Jamfile.v2 delete mode 100644 libs/numeric/conversion/test/bounds_test.cpp delete mode 100644 libs/numeric/conversion/test/compile_fail/built_in_numeric_cast_traits.cpp delete mode 100644 libs/numeric/conversion/test/converter_test.cpp delete mode 100644 libs/numeric/conversion/test/numeric_cast_test.cpp delete mode 100644 libs/numeric/conversion/test/numeric_cast_traits_test.cpp delete mode 100644 libs/numeric/conversion/test/test_helpers.cpp delete mode 100644 libs/numeric/conversion/test/test_helpers2.cpp delete mode 100644 libs/numeric/conversion/test/test_helpers3.cpp delete mode 100644 libs/numeric/conversion/test/traits_test.cpp delete mode 100644 libs/numeric/conversion/test/udt_example_0.cpp delete mode 100644 libs/numeric/conversion/test/udt_support_test.cpp delete mode 100644 libs/numeric/index.html delete mode 100644 libs/numeric/interval/doc/checking.htm delete mode 100644 libs/numeric/interval/doc/comparisons.htm delete mode 100644 libs/numeric/interval/doc/examples.htm delete mode 100644 libs/numeric/interval/doc/guide.htm delete mode 100644 libs/numeric/interval/doc/includes.htm delete mode 100644 libs/numeric/interval/doc/index.html delete mode 100644 libs/numeric/interval/doc/interval.htm delete mode 100644 libs/numeric/interval/doc/numbers.htm delete mode 100644 libs/numeric/interval/doc/policies.htm delete mode 100644 libs/numeric/interval/doc/rounding.htm delete mode 100644 libs/numeric/interval/doc/todo.htm delete mode 100644 libs/numeric/interval/examples/filter.cpp delete mode 100644 libs/numeric/interval/examples/findroot_demo.cpp delete mode 100644 libs/numeric/interval/examples/horner.cpp delete mode 100644 libs/numeric/interval/examples/io.cpp delete mode 100644 libs/numeric/interval/examples/newton-raphson.cpp delete mode 100644 libs/numeric/interval/examples/rational.cpp delete mode 100644 libs/numeric/interval/examples/transc.cpp delete mode 100644 libs/numeric/interval/meta/libraries.json delete mode 100644 libs/numeric/interval/test/Jamfile.v2 delete mode 100644 libs/numeric/interval/test/add.cpp delete mode 100644 libs/numeric/interval/test/bugs.hpp delete mode 100644 libs/numeric/interval/test/cmp.cpp delete mode 100644 libs/numeric/interval/test/cmp_exn.cpp delete mode 100644 libs/numeric/interval/test/cmp_exp.cpp delete mode 100644 libs/numeric/interval/test/cmp_header.hpp delete mode 100644 libs/numeric/interval/test/cmp_lex.cpp delete mode 100644 libs/numeric/interval/test/cmp_set.cpp delete mode 100644 libs/numeric/interval/test/cmp_tribool.cpp delete mode 100644 libs/numeric/interval/test/det.cpp delete mode 100644 libs/numeric/interval/test/fmod.cpp delete mode 100644 libs/numeric/interval/test/integer.cpp delete mode 100644 libs/numeric/interval/test/msvc_x64_flags.cpp delete mode 100644 libs/numeric/interval/test/mul.cpp delete mode 100644 libs/numeric/interval/test/overflow.cpp delete mode 100644 libs/numeric/interval/test/pi.cpp delete mode 100644 libs/numeric/interval/test/pow.cpp delete mode 100644 libs/numeric/interval/test/test_float.cpp delete mode 100644 libs/numeric/odeint/CHANGELOG delete mode 100644 libs/numeric/odeint/README.md delete mode 100644 libs/numeric/odeint/doc/Jamfile.v2 delete mode 100644 libs/numeric/odeint/doc/acknowledgements.qbk delete mode 100644 libs/numeric/odeint/doc/concepts.qbk delete mode 100644 libs/numeric/odeint/doc/concepts/controlled_stepper.qbk delete mode 100644 libs/numeric/odeint/doc/concepts/dense_output_stepper.qbk delete mode 100644 libs/numeric/odeint/doc/concepts/error_stepper.qbk delete mode 100644 libs/numeric/odeint/doc/concepts/implicit_system.qbk delete mode 100644 libs/numeric/odeint/doc/concepts/second_order_system.qbk delete mode 100644 libs/numeric/odeint/doc/concepts/state_algebra_operations.qbk delete mode 100644 libs/numeric/odeint/doc/concepts/state_wrapper.qbk delete mode 100644 libs/numeric/odeint/doc/concepts/stepper.qbk delete mode 100644 libs/numeric/odeint/doc/concepts/symplectic_system.qbk delete mode 100644 libs/numeric/odeint/doc/concepts/system.qbk delete mode 100644 libs/numeric/odeint/doc/controlled_stepper_table.qbk delete mode 100644 libs/numeric/odeint/doc/details.qbk delete mode 100644 libs/numeric/odeint/doc/details_bind_member_functions.qbk delete mode 100644 libs/numeric/odeint/doc/details_boost_range.qbk delete mode 100644 libs/numeric/odeint/doc/details_boost_ref.qbk delete mode 100644 libs/numeric/odeint/doc/details_generation_functions.qbk delete mode 100644 libs/numeric/odeint/doc/details_integrate_functions.qbk delete mode 100644 libs/numeric/odeint/doc/details_iterators.qbk delete mode 100644 libs/numeric/odeint/doc/details_state_types_algebras_operations.qbk delete mode 100644 libs/numeric/odeint/doc/details_steppers.qbk delete mode 100644 libs/numeric/odeint/doc/examples_table.qbk delete mode 100644 libs/numeric/odeint/doc/getting_started.qbk delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/adams_bashforth.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/adams_bashforth_moulton.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/adams_moulton.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/adaptive_iterator.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/adaptive_time_iterator.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_contr_idp64221824.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_dense_idp64227712.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_error_idp64215936.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64217888.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64219856.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64223776.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64225744.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_stepp_idp64213984.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/bulirsch_stoer.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/bulirsch_stoer_dense_out.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_observer.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_steppe_idp40575584.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_steppe_idp40591776.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_steppe_idp59310512.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_stepper.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/const_step_iterator.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/const_step_time_iterator.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_run_idp62987792.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_run_idp63082720.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_runge_kutta.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_stepper_tag.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/default_error_checker.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/default_rosenb_idp63704736.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/default_step_adjuster.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_r_idp63206624.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_r_idp63274768.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_runge_kutta.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_stepper_tag.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/error_stepper_tag.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/euler.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_contr_idp64210304.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_contr_idp64211312.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_error_generic_rk.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_error_idp64208896.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_error_stepper_tag.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_generic_rk.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/extrapolation_stepper.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/failed_step_checker.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/implicit_euler.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_adap_idp61738944.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_cons_idp61780800.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_idp61698176.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_idp61718352.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_n_st_idp61865360.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_time_idp61950624.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive__idp62031392.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive__idp62081248.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive__idp62093888.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive_iterator_end.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive_range.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive_time_range.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62132800.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62145440.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62185824.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62198512.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_step_range.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_step_time_range.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_iterator_begin.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_iterator_end.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_range.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_ti_idp62291328.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_ti_idp62303904.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_time_range.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_iterator_begin.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_iterator_end.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_range.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_tim_idp62400560.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_tim_idp62413776.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_time_range.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/max_step_checker.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/modified_midpo_idp63664288.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/modified_midpoint.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/n_step_iterator.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/n_step_time_iterator.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/order_helper.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/rosenbrock4.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/rosenbrock4_controller.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/rosenbrock4_dense_output.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta4.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta4_classic.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_ca_idp64042704.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_cash_karp54.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_dopri5.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_fehlberg78.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/stepper_tag.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/symplectic_euler.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/symplectic_rkn_idp64254896.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/symplectic_rkn_idp64277488.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/times_iterator.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/times_time_iterator.html delete mode 100644 libs/numeric/odeint/doc/html/boost/numeric/odeint/velocity_verlet.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/acknowledgments.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/controlled_stepper.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/dense_output_stepper.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/error_stepper.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/implicit_system.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/second_order_system.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/simple_symplectic_system.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/state_algebra_operations.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/state_wrapper.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/stepper.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/symplectic_system.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/system.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started/overview.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started/short_example.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started/usage__compilation__headers.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/literature.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/binding_member_functions.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/generation_functions.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/integrate_functions.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/iterators_and_ranges.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/state_types__algebras_and_operations.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/steppers.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/using_boost__range.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/using_boost__ref.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/all_examples.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/chaotic_systems_and_lyapunov_exponents.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/complex_state_types.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/ensembles_of_oscillators.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/harmonic_oscillator.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/lattice_systems.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/parallel_computation_with_openmp_and_mpi.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/self_expanding_lattices.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/solar_system.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/stiff_systems.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_arbitrary_precision_floating_point_types.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_boost__units.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_cuda__or_openmp__tbb_______via_thrust.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_matrices_as_state_types.html delete mode 100644 libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_opencl_via_vexcl.html delete mode 100644 libs/numeric/odeint/doc/html/boostbook.css delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/check_adapter_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_adaptive_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_const_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_n_steps_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_times_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/max_step_checker_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/adaptive_iterator_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/adaptive_time_iterator_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/const_step_iterator_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/const_step_time_iterator_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/n_step_iterator_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/n_step_time_iterator_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/times_iterator_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/times_time_iterator_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/adams_bashforth_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/adams_bashforth_moulton_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/adams_moulton_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/bulirsch_stoer_dense_out_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/bulirsch_stoer_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/controlled_runge_kutta_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/controlled_step_result_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/dense_output_runge_kutta_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/euler_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/explicit_error_generic_rk_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/explicit_generic_rk_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/extrapolation_stepper_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/implicit_euler_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/modified_midpoint_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/rosenbrock4_controller_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/rosenbrock4_dense_output_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/rosenbrock4_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta4_classic_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta4_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_cash_karp54_classic_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_cash_karp54_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_dopri5_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_fehlberg78_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/stepper_categories_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/symplectic_euler_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/symplectic_rkn_sb3a_m4_mclachlan_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/symplectic_rkn_sb3a_mclachlan_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/velocity_verlet_hpp.html delete mode 100644 libs/numeric/odeint/doc/html/images/alert.png delete mode 100644 libs/numeric/odeint/doc/html/images/blank.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/1.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/1.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/10.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/10.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/11.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/11.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/12.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/12.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/13.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/13.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/14.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/14.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/15.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/15.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/16.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/17.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/18.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/19.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/2.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/2.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/20.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/21.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/22.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/23.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/24.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/25.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/26.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/27.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/28.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/29.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/3.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/3.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/30.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/4.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/4.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/5.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/5.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/6.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/6.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/7.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/7.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/8.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/8.svg delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/9.png delete mode 100644 libs/numeric/odeint/doc/html/images/callouts/9.svg delete mode 100644 libs/numeric/odeint/doc/html/images/caution.png delete mode 100644 libs/numeric/odeint/doc/html/images/caution.svg delete mode 100644 libs/numeric/odeint/doc/html/images/draft.png delete mode 100644 libs/numeric/odeint/doc/html/images/home.png delete mode 100644 libs/numeric/odeint/doc/html/images/home.svg delete mode 100644 libs/numeric/odeint/doc/html/images/important.png delete mode 100644 libs/numeric/odeint/doc/html/images/important.svg delete mode 100644 libs/numeric/odeint/doc/html/images/next.png delete mode 100644 libs/numeric/odeint/doc/html/images/next.svg delete mode 100644 libs/numeric/odeint/doc/html/images/next_disabled.png delete mode 100644 libs/numeric/odeint/doc/html/images/note.png delete mode 100644 libs/numeric/odeint/doc/html/images/note.svg delete mode 100644 libs/numeric/odeint/doc/html/images/prev.png delete mode 100644 libs/numeric/odeint/doc/html/images/prev.svg delete mode 100644 libs/numeric/odeint/doc/html/images/prev_disabled.png delete mode 100644 libs/numeric/odeint/doc/html/images/smiley.png delete mode 100644 libs/numeric/odeint/doc/html/images/tip.png delete mode 100644 libs/numeric/odeint/doc/html/images/tip.svg delete mode 100644 libs/numeric/odeint/doc/html/images/toc-blank.png delete mode 100644 libs/numeric/odeint/doc/html/images/toc-minus.png delete mode 100644 libs/numeric/odeint/doc/html/images/toc-plus.png delete mode 100644 libs/numeric/odeint/doc/html/images/up.png delete mode 100644 libs/numeric/odeint/doc/html/images/up.svg delete mode 100644 libs/numeric/odeint/doc/html/images/up_disabled.png delete mode 100644 libs/numeric/odeint/doc/html/images/warning.png delete mode 100644 libs/numeric/odeint/doc/html/images/warning.svg delete mode 100644 libs/numeric/odeint/doc/html/index.html delete mode 100644 libs/numeric/odeint/doc/html/logo.jpg delete mode 100644 libs/numeric/odeint/doc/html/odeint/indexes.html delete mode 100644 libs/numeric/odeint/doc/html/odeint_reference.html delete mode 100644 libs/numeric/odeint/doc/html/phase_lattice_2d_0000.jpg delete mode 100644 libs/numeric/odeint/doc/html/phase_lattice_2d_0100.jpg delete mode 100644 libs/numeric/odeint/doc/html/phase_lattice_2d_1000.jpg delete mode 100644 libs/numeric/odeint/doc/html/solar_system.jpg delete mode 100644 libs/numeric/odeint/doc/html/standalone_HTML.manifest delete mode 100644 libs/numeric/odeint/doc/literature.qbk delete mode 100644 libs/numeric/odeint/doc/make_controlled_table.qbk delete mode 100644 libs/numeric/odeint/doc/make_dense_output_table.qbk delete mode 100644 libs/numeric/odeint/doc/odeint.idx delete mode 100644 libs/numeric/odeint/doc/odeint.qbk delete mode 100644 libs/numeric/odeint/doc/range_table.qbk delete mode 100644 libs/numeric/odeint/doc/reference.xml delete mode 100644 libs/numeric/odeint/doc/stepper_table.qbk delete mode 100644 libs/numeric/odeint/doc/tutorial.qbk delete mode 100644 libs/numeric/odeint/doc/tutorial_chaotic_system.qbk delete mode 100644 libs/numeric/odeint/doc/tutorial_harmonic_oscillator.qbk delete mode 100644 libs/numeric/odeint/doc/tutorial_parallel.qbk delete mode 100644 libs/numeric/odeint/doc/tutorial_solar_system.qbk delete mode 100644 libs/numeric/odeint/doc/tutorial_special_topics.qbk delete mode 100644 libs/numeric/odeint/doc/tutorial_stiff_systems.qbk delete mode 100644 libs/numeric/odeint/doc/tutorial_thrust_cuda.qbk delete mode 100644 libs/numeric/odeint/doc/tutorial_vexcl_opencl.qbk delete mode 100644 libs/numeric/odeint/examples/2d_lattice/Jamfile.v2 delete mode 100644 libs/numeric/odeint/examples/2d_lattice/lattice2d.hpp delete mode 100644 libs/numeric/odeint/examples/2d_lattice/nested_range_algebra.hpp delete mode 100644 libs/numeric/odeint/examples/2d_lattice/spreading.cpp delete mode 100644 libs/numeric/odeint/examples/2d_lattice/vector_vector_resize.hpp delete mode 100644 libs/numeric/odeint/examples/Jamfile.v2 delete mode 100644 libs/numeric/odeint/examples/abm_precision.cpp delete mode 100644 libs/numeric/odeint/examples/adaptive_iterator.cpp delete mode 100644 libs/numeric/odeint/examples/bind_member_functions.cpp delete mode 100644 libs/numeric/odeint/examples/bind_member_functions_cpp11.cpp delete mode 100644 libs/numeric/odeint/examples/bulirsch_stoer.cpp delete mode 100644 libs/numeric/odeint/examples/chaotic_system.cpp delete mode 100644 libs/numeric/odeint/examples/const_step_iterator.cpp delete mode 100644 libs/numeric/odeint/examples/elliptic.py delete mode 100644 libs/numeric/odeint/examples/elliptic_functions.cpp delete mode 100644 libs/numeric/odeint/examples/find_crossing.cpp delete mode 100644 libs/numeric/odeint/examples/fpu.cpp delete mode 100644 libs/numeric/odeint/examples/generation_functions.cpp delete mode 100644 libs/numeric/odeint/examples/gmpxx/Makefile delete mode 100644 libs/numeric/odeint/examples/gmpxx/lorenz_gmpxx.cpp delete mode 100644 libs/numeric/odeint/examples/gram_schmidt.hpp delete mode 100644 libs/numeric/odeint/examples/harmonic_oscillator.cpp delete mode 100644 libs/numeric/odeint/examples/harmonic_oscillator_units.cpp delete mode 100644 libs/numeric/odeint/examples/heun.cpp delete mode 100644 libs/numeric/odeint/examples/integrate_times.cpp delete mode 100644 libs/numeric/odeint/examples/list_lattice.cpp delete mode 100644 libs/numeric/odeint/examples/lorenz.cpp delete mode 100644 libs/numeric/odeint/examples/lorenz_point.cpp delete mode 100644 libs/numeric/odeint/examples/molecular_dynamics.cpp delete mode 100644 libs/numeric/odeint/examples/molecular_dynamics_cells.cpp delete mode 100644 libs/numeric/odeint/examples/mpi/Jamfile.v2 delete mode 100644 libs/numeric/odeint/examples/mpi/phase_chain.cpp delete mode 100644 libs/numeric/odeint/examples/mtl/Jamfile.v2 delete mode 100644 libs/numeric/odeint/examples/mtl/gauss_packet.cpp delete mode 100644 libs/numeric/odeint/examples/mtl/implicit_euler_mtl.cpp delete mode 100644 libs/numeric/odeint/examples/multiprecision/Jamfile delete mode 100644 libs/numeric/odeint/examples/multiprecision/cmp_precision.cpp delete mode 100644 libs/numeric/odeint/examples/multiprecision/lorenz_mp.cpp delete mode 100644 libs/numeric/odeint/examples/my_vector.cpp delete mode 100644 libs/numeric/odeint/examples/nt2/Jamfile.v2 delete mode 100644 libs/numeric/odeint/examples/nt2/phase_oscillator_ensemble.cpp delete mode 100644 libs/numeric/odeint/examples/openmp/Jamfile.v2 delete mode 100644 libs/numeric/odeint/examples/openmp/lorenz_ensemble.cpp delete mode 100644 libs/numeric/odeint/examples/openmp/lorenz_ensemble_nested.cpp delete mode 100644 libs/numeric/odeint/examples/openmp/lorenz_ensemble_simple.cpp delete mode 100644 libs/numeric/odeint/examples/openmp/openmp.jam delete mode 100644 libs/numeric/odeint/examples/openmp/phase_chain.cpp delete mode 100644 libs/numeric/odeint/examples/openmp/phase_chain_omp_state.cpp delete mode 100644 libs/numeric/odeint/examples/phase_oscillator_ensemble.cpp delete mode 100644 libs/numeric/odeint/examples/point_type.hpp delete mode 100644 libs/numeric/odeint/examples/quadmath/Jamfile.v2 delete mode 100644 libs/numeric/odeint/examples/quadmath/black_hole.cpp delete mode 100644 libs/numeric/odeint/examples/resizing_lattice.cpp delete mode 100644 libs/numeric/odeint/examples/simple1d.cpp delete mode 100644 libs/numeric/odeint/examples/solar_system.agr delete mode 100644 libs/numeric/odeint/examples/solar_system.cpp delete mode 100644 libs/numeric/odeint/examples/stepper_details.cpp delete mode 100644 libs/numeric/odeint/examples/stiff_system.cpp delete mode 100644 libs/numeric/odeint/examples/stochastic_euler.cpp delete mode 100644 libs/numeric/odeint/examples/stuart_landau.cpp delete mode 100644 libs/numeric/odeint/examples/thrust/Makefile delete mode 100644 libs/numeric/odeint/examples/thrust/lorenz_parameters.cu delete mode 100644 libs/numeric/odeint/examples/thrust/phase_oscillator_chain.cu delete mode 100644 libs/numeric/odeint/examples/thrust/phase_oscillator_ensemble.cu delete mode 100644 libs/numeric/odeint/examples/thrust/relaxation.cu delete mode 100644 libs/numeric/odeint/examples/two_dimensional_phase_lattice.cpp delete mode 100644 libs/numeric/odeint/examples/ublas/Jamfile.v2 delete mode 100644 libs/numeric/odeint/examples/ublas/lorenz_ublas.cpp delete mode 100644 libs/numeric/odeint/examples/van_der_pol_stiff.cpp delete mode 100644 libs/numeric/odeint/examples/vexcl/Jamfile.v2 delete mode 100644 libs/numeric/odeint/examples/vexcl/lorenz_ensemble.cpp delete mode 100644 libs/numeric/odeint/fix-copyright.py delete mode 100644 libs/numeric/odeint/index.html delete mode 100644 libs/numeric/odeint/meta/libraries.json delete mode 100644 libs/numeric/odeint/performance/Jamfile.v2 delete mode 100644 libs/numeric/odeint/performance/Makefile delete mode 100644 libs/numeric/odeint/performance/SIMD/Makefile delete mode 100644 libs/numeric/odeint/performance/SIMD/perf_roessler.sh delete mode 100644 libs/numeric/odeint/performance/SIMD/roessler.cpp delete mode 100644 libs/numeric/odeint/performance/SIMD/roessler_simd.cpp delete mode 100644 libs/numeric/odeint/performance/c_lorenz.c delete mode 100644 libs/numeric/odeint/performance/fortran_lorenz.f90 delete mode 100644 libs/numeric/odeint/performance/lorenz.hpp delete mode 100644 libs/numeric/odeint/performance/odeint_rk4_array.cpp delete mode 100644 libs/numeric/odeint/performance/plot_result.py delete mode 100644 libs/numeric/odeint/test/Jamfile.v2 delete mode 100644 libs/numeric/odeint/test/adams_bashforth.cpp delete mode 100644 libs/numeric/odeint/test/adams_bashforth_moulton.cpp delete mode 100644 libs/numeric/odeint/test/adams_moulton.cpp delete mode 100644 libs/numeric/odeint/test/adaptive_iterator.cpp delete mode 100644 libs/numeric/odeint/test/adaptive_time_iterator.cpp delete mode 100644 libs/numeric/odeint/test/algebra_dispatcher.cpp delete mode 100644 libs/numeric/odeint/test/boost_units_helpers.hpp delete mode 100644 libs/numeric/odeint/test/bulirsch_stoer.cpp delete mode 100644 libs/numeric/odeint/test/const_range.hpp delete mode 100644 libs/numeric/odeint/test/const_step_iterator.cpp delete mode 100644 libs/numeric/odeint/test/const_step_time_iterator.cpp delete mode 100644 libs/numeric/odeint/test/default_operations.cpp delete mode 100644 libs/numeric/odeint/test/diagnostic_state_type.hpp delete mode 100644 libs/numeric/odeint/test/dummy_observers.hpp delete mode 100644 libs/numeric/odeint/test/dummy_odes.hpp delete mode 100644 libs/numeric/odeint/test/dummy_steppers.hpp delete mode 100644 libs/numeric/odeint/test/euler_stepper.cpp delete mode 100644 libs/numeric/odeint/test/fusion_algebra.cpp delete mode 100644 libs/numeric/odeint/test/generation.cpp delete mode 100644 libs/numeric/odeint/test/generic_error_stepper.cpp delete mode 100644 libs/numeric/odeint/test/generic_stepper.cpp delete mode 100644 libs/numeric/odeint/test/implicit_euler.cpp delete mode 100644 libs/numeric/odeint/test/integrate.cpp delete mode 100644 libs/numeric/odeint/test/integrate_implicit.cpp delete mode 100644 libs/numeric/odeint/test/integrate_overflow.cpp delete mode 100644 libs/numeric/odeint/test/integrate_stepper_refs.cpp delete mode 100644 libs/numeric/odeint/test/integrate_times.cpp delete mode 100644 libs/numeric/odeint/test/integrators_symplectic.cpp delete mode 100644 libs/numeric/odeint/test/is_pair.cpp delete mode 100644 libs/numeric/odeint/test/is_resizeable.cpp delete mode 100644 libs/numeric/odeint/test/multi_array.cpp delete mode 100644 libs/numeric/odeint/test/n_step_iterator.cpp delete mode 100644 libs/numeric/odeint/test/n_step_time_iterator.cpp delete mode 100644 libs/numeric/odeint/test/numeric/Jamfile.v2 delete mode 100644 libs/numeric/odeint/test/numeric/abm_time_dependent.cpp delete mode 100644 libs/numeric/odeint/test/numeric/adams_bashforth.cpp delete mode 100644 libs/numeric/odeint/test/numeric/adams_bashforth_moulton.cpp delete mode 100644 libs/numeric/odeint/test/numeric/order_quadrature_formula.cpp delete mode 100644 libs/numeric/odeint/test/numeric/rosenbrock.cpp delete mode 100644 libs/numeric/odeint/test/numeric/runge_kutta.cpp delete mode 100644 libs/numeric/odeint/test/numeric/symplectic.cpp delete mode 100644 libs/numeric/odeint/test/numeric/velocity_verlet.cpp delete mode 100644 libs/numeric/odeint/test/prepare_stepper_testing.hpp delete mode 100644 libs/numeric/odeint/test/range_algebra.cpp delete mode 100644 libs/numeric/odeint/test/regression/Jamfile.v2 delete mode 100644 libs/numeric/odeint/test/regression/regression_147.cpp delete mode 100644 libs/numeric/odeint/test/regression/regression_149.cpp delete mode 100644 libs/numeric/odeint/test/regression/regression_168.cpp delete mode 100644 libs/numeric/odeint/test/resize.cpp delete mode 100644 libs/numeric/odeint/test/resizing.cpp delete mode 100644 libs/numeric/odeint/test/resizing_test_state_type.hpp delete mode 100644 libs/numeric/odeint/test/rosenbrock4.cpp delete mode 100644 libs/numeric/odeint/test/rosenbrock4_mp.cpp delete mode 100644 libs/numeric/odeint/test/runge_kutta_concepts.cpp delete mode 100644 libs/numeric/odeint/test/runge_kutta_controlled_concepts.cpp delete mode 100644 libs/numeric/odeint/test/runge_kutta_error_concepts.cpp delete mode 100644 libs/numeric/odeint/test/same_size.cpp delete mode 100644 libs/numeric/odeint/test/split.cpp delete mode 100644 libs/numeric/odeint/test/std_array.cpp delete mode 100644 libs/numeric/odeint/test/step_size_limitation.cpp delete mode 100644 libs/numeric/odeint/test/stepper_copying.cpp delete mode 100644 libs/numeric/odeint/test/stepper_with_ranges.cpp delete mode 100644 libs/numeric/odeint/test/stepper_with_units.cpp delete mode 100644 libs/numeric/odeint/test/symplectic_steppers.cpp delete mode 100644 libs/numeric/odeint/test/times_iterator.cpp delete mode 100644 libs/numeric/odeint/test/times_time_iterator.cpp delete mode 100644 libs/numeric/odeint/test/trivial_state.cpp delete mode 100644 libs/numeric/odeint/test/unwrap_boost_reference.cpp delete mode 100644 libs/numeric/odeint/test/unwrap_reference.cpp delete mode 100644 libs/numeric/odeint/test/velocity_verlet.cpp delete mode 100644 libs/numeric/odeint/test_external/eigen/Jamfile.v2 delete mode 100644 libs/numeric/odeint/test_external/eigen/fail_integrate.cpp delete mode 100644 libs/numeric/odeint/test_external/eigen/integrate.cpp delete mode 100644 libs/numeric/odeint/test_external/eigen/is_resizeable.cpp delete mode 100644 libs/numeric/odeint/test_external/eigen/resize.cpp delete mode 100644 libs/numeric/odeint/test_external/eigen/runge_kutta4.cpp delete mode 100644 libs/numeric/odeint/test_external/eigen/runge_kutta_dopri5.cpp delete mode 100644 libs/numeric/odeint/test_external/eigen/same_size.cpp delete mode 100644 libs/numeric/odeint/test_external/gmp/Jamfile.v2 delete mode 100644 libs/numeric/odeint/test_external/gmp/check_gmp.cpp delete mode 100644 libs/numeric/odeint/test_external/gmp/gmp_integrate.cpp delete mode 100644 libs/numeric/odeint/test_external/gsl/Jamfile.v2 delete mode 100644 libs/numeric/odeint/test_external/gsl/check_gsl.cpp delete mode 100644 libs/numeric/odeint/test_external/mkl/Jamfile.v2 delete mode 100644 libs/numeric/odeint/test_external/mkl/check_mkl.cpp delete mode 100644 libs/numeric/odeint/test_external/mpi/Jamfile.v2 delete mode 100644 libs/numeric/odeint/test_external/mpi/norm_test.cpp delete mode 100644 libs/numeric/odeint/test_external/mpi/split_test.cpp delete mode 100644 libs/numeric/odeint/test_external/mpi/state_test.cpp delete mode 100644 libs/numeric/odeint/test_external/mtl4/Jamfile.v2 delete mode 100644 libs/numeric/odeint/test_external/mtl4/mtl4_resize.cpp delete mode 100644 libs/numeric/odeint/test_external/nt2/Jamfile.v2 delete mode 100644 libs/numeric/odeint/test_external/nt2/algebra_dispatcher.cpp delete mode 100644 libs/numeric/odeint/test_external/nt2/copy.cpp delete mode 100644 libs/numeric/odeint/test_external/nt2/is_resizeable.cpp delete mode 100644 libs/numeric/odeint/test_external/nt2/norm_inf.cpp delete mode 100644 libs/numeric/odeint/test_external/nt2/resize.cpp delete mode 100644 libs/numeric/odeint/test_external/thrust/Makefile delete mode 100644 libs/numeric/odeint/test_external/thrust/check_thrust.cu delete mode 100644 libs/numeric/odeint/test_external/vexcl/Jamfile.v2 delete mode 100644 libs/numeric/odeint/test_external/vexcl/lorenz.cpp delete mode 100644 libs/numeric/odeint/test_external/vexcl/norm_inf.cpp delete mode 100644 libs/numeric/odeint/toolset.jam.patch delete mode 100644 libs/numeric/sublibs delete mode 100644 libs/numeric/ublas/Changelog delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench1/bench1.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench2/bench2.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench3/bench3.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench4/bench4.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench5/bench5.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/benchmarks/benchmarks.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/benchmarks/configuration.pri delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/include/detail/detail.pri delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/include/experimental/experimental.pri delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/include/include.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/include/operation/operation.pri delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/include/traits/traits.pri delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/begin_end.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/comp_mat_erase.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/concepts.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/configuration.pri delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/num_columns.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/num_rows.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/placement_new.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/size.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/sparse_view_test.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test1.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test2.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test3.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test3_coo.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test3_mvov.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test4.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test5.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test6.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test7.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_assignment.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_banded_storage_layout.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_complex_norms.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_matrix_always_do_full_sort.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_matrix_inplace_merge.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_matrix_sort.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_vector_inplace_merge.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_fixed_containers.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_inplace_solve_basic.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_inplace_solve_mvov.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_inplace_solve_sparse.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_lu.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_matrix_vector.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_ticket7296.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/test_triangular.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/triangular_access.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/test/triangular_layout.pro delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/tests.pri delete mode 100644 libs/numeric/ublas/IDEs/qtcreator/ublas_develop.pro delete mode 100644 libs/numeric/ublas/README.md delete mode 100644 libs/numeric/ublas/benchmarks/bench1/Jamfile.v2 delete mode 100644 libs/numeric/ublas/benchmarks/bench1/bench1.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench1/bench1.hpp delete mode 100644 libs/numeric/ublas/benchmarks/bench1/bench11.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench1/bench12.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench1/bench13.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench2/Jamfile.v2 delete mode 100644 libs/numeric/ublas/benchmarks/bench2/bench2.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench2/bench2.hpp delete mode 100644 libs/numeric/ublas/benchmarks/bench2/bench21.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench2/bench22.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench2/bench23.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench3/Jamfile.v2 delete mode 100644 libs/numeric/ublas/benchmarks/bench3/bench3.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench3/bench3.hpp delete mode 100644 libs/numeric/ublas/benchmarks/bench3/bench31.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench3/bench32.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench3/bench33.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench4/Jamfile.v2 delete mode 100644 libs/numeric/ublas/benchmarks/bench4/bench4.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench4/bench41.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench4/bench42.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench4/bench43.cpp delete mode 100644 libs/numeric/ublas/benchmarks/bench5/Jamfile.v2 delete mode 100644 libs/numeric/ublas/benchmarks/bench5/assignment_bench.cpp delete mode 100644 libs/numeric/ublas/doc/banded.html delete mode 100644 libs/numeric/ublas/doc/blas.html delete mode 100644 libs/numeric/ublas/doc/bounded_array.html delete mode 100644 libs/numeric/ublas/doc/container_concept.html delete mode 100644 libs/numeric/ublas/doc/expression_concept.html delete mode 100644 libs/numeric/ublas/doc/hermitian.html delete mode 100644 libs/numeric/ublas/doc/index.html delete mode 100644 libs/numeric/ublas/doc/iterator_concept.html delete mode 100644 libs/numeric/ublas/doc/js/jquery-1.3.2.min.js delete mode 100644 libs/numeric/ublas/doc/js/jquery.toc-gw.js delete mode 100644 libs/numeric/ublas/doc/matrix.html delete mode 100644 libs/numeric/ublas/doc/matrix_expression.html delete mode 100644 libs/numeric/ublas/doc/matrix_proxy.html delete mode 100644 libs/numeric/ublas/doc/matrix_sparse.html delete mode 100644 libs/numeric/ublas/doc/operations_overview.html delete mode 100644 libs/numeric/ublas/doc/options.html delete mode 100644 libs/numeric/ublas/doc/overview.html delete mode 100644 libs/numeric/ublas/doc/products.html delete mode 100644 libs/numeric/ublas/doc/range.html delete mode 100644 libs/numeric/ublas/doc/release_notes.html delete mode 100644 libs/numeric/ublas/doc/samples/Jamfile.v2 delete mode 100644 libs/numeric/ublas/doc/samples/assignment_examples.cpp delete mode 100644 libs/numeric/ublas/doc/samples/banded_adaptor.cpp delete mode 100644 libs/numeric/ublas/doc/samples/banded_matrix.cpp delete mode 100644 libs/numeric/ublas/doc/samples/bounded_array.cpp delete mode 100644 libs/numeric/ublas/doc/samples/compressed_matrix.cpp delete mode 100644 libs/numeric/ublas/doc/samples/compressed_vector.cpp delete mode 100644 libs/numeric/ublas/doc/samples/coordinate_matrix.cpp delete mode 100644 libs/numeric/ublas/doc/samples/coordinate_vector.cpp delete mode 100644 libs/numeric/ublas/doc/samples/ex_triangular.cpp delete mode 100644 libs/numeric/ublas/doc/samples/hermitian_adaptor.cpp delete mode 100644 libs/numeric/ublas/doc/samples/hermitian_matrix.cpp delete mode 100644 libs/numeric/ublas/doc/samples/identity_matrix.cpp delete mode 100644 libs/numeric/ublas/doc/samples/map_array.cpp delete mode 100644 libs/numeric/ublas/doc/samples/mapped_matrix.cpp delete mode 100644 libs/numeric/ublas/doc/samples/mapped_vector.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_binary.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_binary_scalar.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_column.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_column_project.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_matrix_binary.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_matrix_solve.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_range.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_range_project.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_row.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_row_project.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_slice.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_slice_project.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_unary.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_vector_binary.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_vector_range.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_vector_slice.cpp delete mode 100644 libs/numeric/ublas/doc/samples/matrix_vector_solve.cpp delete mode 100644 libs/numeric/ublas/doc/samples/range.cpp delete mode 100644 libs/numeric/ublas/doc/samples/slice.cpp delete mode 100644 libs/numeric/ublas/doc/samples/symmetric_adaptor.cpp delete mode 100644 libs/numeric/ublas/doc/samples/symmetric_matrix.cpp delete mode 100644 libs/numeric/ublas/doc/samples/triangular_adaptor.cpp delete mode 100644 libs/numeric/ublas/doc/samples/triangular_matrix.cpp delete mode 100644 libs/numeric/ublas/doc/samples/unbounded_array.cpp delete mode 100644 libs/numeric/ublas/doc/samples/unit_vector.cpp delete mode 100644 libs/numeric/ublas/doc/samples/vector.cpp delete mode 100644 libs/numeric/ublas/doc/samples/vector_binary.cpp delete mode 100644 libs/numeric/ublas/doc/samples/vector_binary_outer.cpp delete mode 100644 libs/numeric/ublas/doc/samples/vector_binary_redux.cpp delete mode 100644 libs/numeric/ublas/doc/samples/vector_binary_scalar.cpp delete mode 100644 libs/numeric/ublas/doc/samples/vector_range.cpp delete mode 100644 libs/numeric/ublas/doc/samples/vector_range_project.cpp delete mode 100644 libs/numeric/ublas/doc/samples/vector_slice.cpp delete mode 100644 libs/numeric/ublas/doc/samples/vector_slice_project.cpp delete mode 100644 libs/numeric/ublas/doc/samples/vector_unary.cpp delete mode 100644 libs/numeric/ublas/doc/samples/vector_unary_redux.cpp delete mode 100644 libs/numeric/ublas/doc/samples/zero_matrix.cpp delete mode 100644 libs/numeric/ublas/doc/samples/zero_vector.cpp delete mode 100644 libs/numeric/ublas/doc/storage_concept.html delete mode 100644 libs/numeric/ublas/doc/storage_sparse.html delete mode 100644 libs/numeric/ublas/doc/symmetric.html delete mode 100644 libs/numeric/ublas/doc/triangular.html delete mode 100644 libs/numeric/ublas/doc/types_overview.html delete mode 100644 libs/numeric/ublas/doc/ublas.css delete mode 100644 libs/numeric/ublas/doc/unbounded_array.html delete mode 100644 libs/numeric/ublas/doc/vector.html delete mode 100644 libs/numeric/ublas/doc/vector_expression.html delete mode 100644 libs/numeric/ublas/doc/vector_proxy.html delete mode 100644 libs/numeric/ublas/doc/vector_sparse.html delete mode 100644 libs/numeric/ublas/index.html delete mode 100644 libs/numeric/ublas/meta/libraries.json delete mode 100644 libs/numeric/ublas/test/Jamfile.v2 delete mode 100644 libs/numeric/ublas/test/README delete mode 100644 libs/numeric/ublas/test/begin_end.cpp delete mode 100644 libs/numeric/ublas/test/common/init.hpp delete mode 100644 libs/numeric/ublas/test/common/testhelper.hpp delete mode 100644 libs/numeric/ublas/test/comp_mat_erase.cpp delete mode 100644 libs/numeric/ublas/test/concepts.cpp delete mode 100644 libs/numeric/ublas/test/manual/Jamfile.v2 delete mode 100644 libs/numeric/ublas/test/manual/sp_resize.cpp delete mode 100644 libs/numeric/ublas/test/manual/test_move_semantics.cpp delete mode 100644 libs/numeric/ublas/test/num_columns.cpp delete mode 100644 libs/numeric/ublas/test/num_rows.cpp delete mode 100644 libs/numeric/ublas/test/placement_new.cpp delete mode 100644 libs/numeric/ublas/test/size.cpp delete mode 100644 libs/numeric/ublas/test/sparse_view_test.cpp delete mode 100644 libs/numeric/ublas/test/test1.cpp delete mode 100644 libs/numeric/ublas/test/test1.hpp delete mode 100644 libs/numeric/ublas/test/test11.cpp delete mode 100644 libs/numeric/ublas/test/test12.cpp delete mode 100644 libs/numeric/ublas/test/test13.cpp delete mode 100644 libs/numeric/ublas/test/test2.cpp delete mode 100644 libs/numeric/ublas/test/test2.hpp delete mode 100644 libs/numeric/ublas/test/test21.cpp delete mode 100644 libs/numeric/ublas/test/test22.cpp delete mode 100644 libs/numeric/ublas/test/test23.cpp delete mode 100644 libs/numeric/ublas/test/test3.cpp delete mode 100644 libs/numeric/ublas/test/test3.hpp delete mode 100644 libs/numeric/ublas/test/test31.cpp delete mode 100644 libs/numeric/ublas/test/test32.cpp delete mode 100644 libs/numeric/ublas/test/test33.cpp delete mode 100644 libs/numeric/ublas/test/test4.cpp delete mode 100644 libs/numeric/ublas/test/test4.hpp delete mode 100644 libs/numeric/ublas/test/test42.cpp delete mode 100644 libs/numeric/ublas/test/test43.cpp delete mode 100644 libs/numeric/ublas/test/test5.cpp delete mode 100644 libs/numeric/ublas/test/test5.hpp delete mode 100644 libs/numeric/ublas/test/test52.cpp delete mode 100644 libs/numeric/ublas/test/test53.cpp delete mode 100644 libs/numeric/ublas/test/test6.cpp delete mode 100644 libs/numeric/ublas/test/test6.hpp delete mode 100644 libs/numeric/ublas/test/test62.cpp delete mode 100644 libs/numeric/ublas/test/test63.cpp delete mode 100644 libs/numeric/ublas/test/test7.cpp delete mode 100644 libs/numeric/ublas/test/test7.hpp delete mode 100644 libs/numeric/ublas/test/test71.cpp delete mode 100644 libs/numeric/ublas/test/test72.cpp delete mode 100644 libs/numeric/ublas/test/test73.cpp delete mode 100644 libs/numeric/ublas/test/test_assignment.cpp delete mode 100644 libs/numeric/ublas/test/test_banded_storage_layout.cpp delete mode 100644 libs/numeric/ublas/test/test_complex_norms.cpp delete mode 100644 libs/numeric/ublas/test/test_coordinate_matrix_inplace_merge.cpp delete mode 100644 libs/numeric/ublas/test/test_coordinate_matrix_sort.cpp delete mode 100644 libs/numeric/ublas/test/test_coordinate_vector_inplace_merge.cpp delete mode 100644 libs/numeric/ublas/test/test_fixed_containers.cpp delete mode 100644 libs/numeric/ublas/test/test_inplace_solve.cpp delete mode 100644 libs/numeric/ublas/test/test_lu.cpp delete mode 100644 libs/numeric/ublas/test/test_matrix_vector.cpp delete mode 100644 libs/numeric/ublas/test/test_ticket7296.cpp delete mode 100644 libs/numeric/ublas/test/test_triangular.cpp delete mode 100644 libs/numeric/ublas/test/triangular_access.cpp delete mode 100644 libs/numeric/ublas/test/triangular_layout.cpp delete mode 100644 libs/numeric/ublas/test/utils.hpp delete mode 100644 libs/range/doc/Jamfile.v2 delete mode 100644 libs/range/doc/boost_range.qbk delete mode 100644 libs/range/doc/concepts.qbk delete mode 100644 libs/range/doc/example.cpp delete mode 100644 libs/range/doc/examples.qbk delete mode 100644 libs/range/doc/faq.qbk delete mode 100644 libs/range/doc/headers.qbk delete mode 100644 libs/range/doc/history_ack.qbk delete mode 100644 libs/range/doc/html/index.html delete mode 100644 libs/range/doc/html/quickbook_HTML.manifest delete mode 100644 libs/range/doc/html/range/concepts.html delete mode 100644 libs/range/doc/html/range/concepts/bidirectional_range.html delete mode 100644 libs/range/doc/html/range/concepts/concept_checking.html delete mode 100644 libs/range/doc/html/range/concepts/forward_range.html delete mode 100644 libs/range/doc/html/range/concepts/overview.html delete mode 100644 libs/range/doc/html/range/concepts/random_access_range.html delete mode 100644 libs/range/doc/html/range/concepts/single_pass_range.html delete mode 100644 libs/range/doc/html/range/examples.html delete mode 100644 libs/range/doc/html/range/faq.html delete mode 100644 libs/range/doc/html/range/headers.html delete mode 100644 libs/range/doc/html/range/headers/adaptors.html delete mode 100644 libs/range/doc/html/range/headers/algorithm.html delete mode 100644 libs/range/doc/html/range/headers/algorithm_ext.html delete mode 100644 libs/range/doc/html/range/headers/general.html delete mode 100644 libs/range/doc/html/range/history_ack.html delete mode 100644 libs/range/doc/html/range/introduction.html delete mode 100644 libs/range/doc/html/range/mfc_atl.html delete mode 100644 libs/range/doc/html/range/mfc_atl/atl_ranges.html delete mode 100644 libs/range/doc/html/range/mfc_atl/const_ranges.html delete mode 100644 libs/range/doc/html/range/mfc_atl/mfc_ranges.html delete mode 100644 libs/range/doc/html/range/mfc_atl/references.html delete mode 100644 libs/range/doc/html/range/mfc_atl/requirements.html delete mode 100644 libs/range/doc/html/range/portability.html delete mode 100644 libs/range/doc/html/range/reference.html delete mode 100644 libs/range/doc/html/range/reference/adaptors.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/general_requirements.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/introduction.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/adjacent_filtered.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/copied.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/filtered.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/indexed.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/indirected.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/map_keys.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/map_values.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/replaced.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/replaced_if.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/reversed.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/sliced.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/strided.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/tokenized.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/transformed.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/type_erased.html delete mode 100644 libs/range/doc/html/range/reference/adaptors/reference/uniqued.html delete mode 100644 libs/range/doc/html/range/reference/algorithms.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/heap.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/heap/make_heap.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/heap/pop_heap.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/heap/push_heap.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/heap/sort_heap.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/introduction.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/copy.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/copy_backward.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/fill.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/fill_n.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/generate.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/inplace_merge.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/merge.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/nth_element.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/partial_sort.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/partition.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/random_shuffle.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/remove.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/remove_copy.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/remove_copy_if.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/remove_if.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/replace.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/replace_copy.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/replace_copy_if.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/replace_if.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/reverse.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/reverse_copy.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/rotate.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/rotate_copy.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/sort.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/stable_partition.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/stable_sort.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/swap_ranges.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/transform.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/unique.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/mutating/unique_copy.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/new.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/new/copy_n.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/new/erase.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/new/for_each.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/new/insert.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/new/iota.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/new/is_sorted.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/new/overwrite.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/new/push_back.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/new/push_front.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/new/remove_erase.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/new/remove_erase_if.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/adjacent_find.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/binary_search.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/count.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/count_if.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/equal.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/equal_range.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/find.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/find_end.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/find_first_of.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/find_if.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/for_each.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/lexicographical_compare.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/lower_bound.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/max_element.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/min_element.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/mismatch.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/search.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/search_n.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/non_mutating/upper_bound.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/numeric.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/numeric/accumulate.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/numeric/adjacent_difference.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/numeric/inner_product.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/numeric/partial_sum.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/permutation.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/permutation/next_permutation.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/permutation/prev_permutation.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/set.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/set/includes.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/set/set_difference.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/set/set_intersection.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/set/set_symmetric_difference.html delete mode 100644 libs/range/doc/html/range/reference/algorithms/set/set_union.html delete mode 100644 libs/range/doc/html/range/reference/concept_implementation.html delete mode 100644 libs/range/doc/html/range/reference/concept_implementation/semantics.html delete mode 100644 libs/range/doc/html/range/reference/concept_implementation/semantics/functions.html delete mode 100644 libs/range/doc/html/range/reference/concept_implementation/semantics/metafunctions.html delete mode 100644 libs/range/doc/html/range/reference/concept_implementation/synopsis.html delete mode 100644 libs/range/doc/html/range/reference/extending.html delete mode 100644 libs/range/doc/html/range/reference/extending/method_1.html delete mode 100644 libs/range/doc/html/range/reference/extending/method_2.html delete mode 100644 libs/range/doc/html/range/reference/extending/method_3.html delete mode 100644 libs/range/doc/html/range/reference/extending/method_3/method_3_1.html delete mode 100644 libs/range/doc/html/range/reference/extending/method_3/method_3_2.html delete mode 100644 libs/range/doc/html/range/reference/overview.html delete mode 100644 libs/range/doc/html/range/reference/ranges.html delete mode 100644 libs/range/doc/html/range/reference/ranges/any_range.html delete mode 100644 libs/range/doc/html/range/reference/ranges/counting_range.html delete mode 100644 libs/range/doc/html/range/reference/ranges/irange.html delete mode 100644 libs/range/doc/html/range/reference/ranges/istream_range.html delete mode 100644 libs/range/doc/html/range/reference/utilities.html delete mode 100644 libs/range/doc/html/range/reference/utilities/combine.html delete mode 100644 libs/range/doc/html/range/reference/utilities/iterator_range.html delete mode 100644 libs/range/doc/html/range/reference/utilities/join.html delete mode 100644 libs/range/doc/html/range/reference/utilities/sub_range.html delete mode 100644 libs/range/doc/html/range/style_guide.html delete mode 100644 libs/range/doc/html/range/upgrade.html delete mode 100644 libs/range/doc/html/range/upgrade/upgrade_from_1_34.html delete mode 100644 libs/range/doc/html/range/upgrade/upgrade_from_1_42.html delete mode 100644 libs/range/doc/html/range/upgrade/upgrade_from_1_45.html delete mode 100644 libs/range/doc/html/range/upgrade/upgrade_from_1_49.html delete mode 100644 libs/range/doc/html/range/upgrade/upgrade_from_1_55.html delete mode 100644 libs/range/doc/introduction.qbk delete mode 100644 libs/range/doc/mfc_atl.qbk delete mode 100644 libs/range/doc/mfc_atl.rst delete mode 100644 libs/range/doc/portability.qbk delete mode 100644 libs/range/doc/reference.qbk delete mode 100644 libs/range/doc/reference/adaptors.qbk delete mode 100644 libs/range/doc/reference/adaptors/adjacent_filtered.qbk delete mode 100644 libs/range/doc/reference/adaptors/copied.qbk delete mode 100644 libs/range/doc/reference/adaptors/examples/indirected.cpp delete mode 100644 libs/range/doc/reference/adaptors/filtered.qbk delete mode 100644 libs/range/doc/reference/adaptors/formatted.qbk delete mode 100644 libs/range/doc/reference/adaptors/indexed.qbk delete mode 100644 libs/range/doc/reference/adaptors/indirected.qbk delete mode 100644 libs/range/doc/reference/adaptors/map_keys.qbk delete mode 100644 libs/range/doc/reference/adaptors/map_values.qbk delete mode 100644 libs/range/doc/reference/adaptors/replaced.qbk delete mode 100644 libs/range/doc/reference/adaptors/replaced_if.qbk delete mode 100644 libs/range/doc/reference/adaptors/reversed.qbk delete mode 100644 libs/range/doc/reference/adaptors/sliced.qbk delete mode 100644 libs/range/doc/reference/adaptors/strided.qbk delete mode 100644 libs/range/doc/reference/adaptors/tokenized.qbk delete mode 100644 libs/range/doc/reference/adaptors/transformed.qbk delete mode 100644 libs/range/doc/reference/adaptors/type_erased.qbk delete mode 100644 libs/range/doc/reference/adaptors/uniqued.qbk delete mode 100644 libs/range/doc/reference/algorithm/adjacent_find.qbk delete mode 100644 libs/range/doc/reference/algorithm/binary_search.qbk delete mode 100644 libs/range/doc/reference/algorithm/copy.qbk delete mode 100644 libs/range/doc/reference/algorithm/copy_backward.qbk delete mode 100644 libs/range/doc/reference/algorithm/count.qbk delete mode 100644 libs/range/doc/reference/algorithm/count_if.qbk delete mode 100644 libs/range/doc/reference/algorithm/equal.qbk delete mode 100644 libs/range/doc/reference/algorithm/equal_range.qbk delete mode 100644 libs/range/doc/reference/algorithm/fill.qbk delete mode 100644 libs/range/doc/reference/algorithm/fill_n.qbk delete mode 100644 libs/range/doc/reference/algorithm/find.qbk delete mode 100644 libs/range/doc/reference/algorithm/find_end.qbk delete mode 100644 libs/range/doc/reference/algorithm/find_first_of.qbk delete mode 100644 libs/range/doc/reference/algorithm/find_if.qbk delete mode 100644 libs/range/doc/reference/algorithm/for_each.qbk delete mode 100644 libs/range/doc/reference/algorithm/generate.qbk delete mode 100644 libs/range/doc/reference/algorithm/includes.qbk delete mode 100644 libs/range/doc/reference/algorithm/inplace_merge.qbk delete mode 100644 libs/range/doc/reference/algorithm/lexicographical_compare.qbk delete mode 100644 libs/range/doc/reference/algorithm/lower_bound.qbk delete mode 100644 libs/range/doc/reference/algorithm/make_heap.qbk delete mode 100644 libs/range/doc/reference/algorithm/max_element.qbk delete mode 100644 libs/range/doc/reference/algorithm/merge.qbk delete mode 100644 libs/range/doc/reference/algorithm/min_element.qbk delete mode 100644 libs/range/doc/reference/algorithm/mismatch.qbk delete mode 100644 libs/range/doc/reference/algorithm/next_permutation.qbk delete mode 100644 libs/range/doc/reference/algorithm/nth_element.qbk delete mode 100644 libs/range/doc/reference/algorithm/partial_sort.qbk delete mode 100644 libs/range/doc/reference/algorithm/partition.qbk delete mode 100644 libs/range/doc/reference/algorithm/pop_heap.qbk delete mode 100644 libs/range/doc/reference/algorithm/prev_permutation.qbk delete mode 100644 libs/range/doc/reference/algorithm/push_heap.qbk delete mode 100644 libs/range/doc/reference/algorithm/random_shuffle.qbk delete mode 100644 libs/range/doc/reference/algorithm/remove.qbk delete mode 100644 libs/range/doc/reference/algorithm/remove_copy.qbk delete mode 100644 libs/range/doc/reference/algorithm/remove_copy_if.qbk delete mode 100644 libs/range/doc/reference/algorithm/remove_if.qbk delete mode 100644 libs/range/doc/reference/algorithm/replace.qbk delete mode 100644 libs/range/doc/reference/algorithm/replace_copy.qbk delete mode 100644 libs/range/doc/reference/algorithm/replace_copy_if.qbk delete mode 100644 libs/range/doc/reference/algorithm/replace_if.qbk delete mode 100644 libs/range/doc/reference/algorithm/reverse.qbk delete mode 100644 libs/range/doc/reference/algorithm/reverse_copy.qbk delete mode 100644 libs/range/doc/reference/algorithm/rotate.qbk delete mode 100644 libs/range/doc/reference/algorithm/rotate_copy.qbk delete mode 100644 libs/range/doc/reference/algorithm/search.qbk delete mode 100644 libs/range/doc/reference/algorithm/search_n.qbk delete mode 100644 libs/range/doc/reference/algorithm/set_difference.qbk delete mode 100644 libs/range/doc/reference/algorithm/set_intersection.qbk delete mode 100644 libs/range/doc/reference/algorithm/set_symmetric_difference.qbk delete mode 100644 libs/range/doc/reference/algorithm/set_union.qbk delete mode 100644 libs/range/doc/reference/algorithm/sort.qbk delete mode 100644 libs/range/doc/reference/algorithm/sort_heap.qbk delete mode 100644 libs/range/doc/reference/algorithm/stable_partition.qbk delete mode 100644 libs/range/doc/reference/algorithm/stable_sort.qbk delete mode 100644 libs/range/doc/reference/algorithm/swap_ranges.qbk delete mode 100644 libs/range/doc/reference/algorithm/transform.qbk delete mode 100644 libs/range/doc/reference/algorithm/unique.qbk delete mode 100644 libs/range/doc/reference/algorithm/unique_copy.qbk delete mode 100644 libs/range/doc/reference/algorithm/upper_bound.qbk delete mode 100644 libs/range/doc/reference/algorithm_ext/copy_n.qbk delete mode 100644 libs/range/doc/reference/algorithm_ext/erase.qbk delete mode 100644 libs/range/doc/reference/algorithm_ext/for_each.qbk delete mode 100644 libs/range/doc/reference/algorithm_ext/insert.qbk delete mode 100644 libs/range/doc/reference/algorithm_ext/iota.qbk delete mode 100644 libs/range/doc/reference/algorithm_ext/is_sorted.qbk delete mode 100644 libs/range/doc/reference/algorithm_ext/overwrite.qbk delete mode 100644 libs/range/doc/reference/algorithm_ext/push_back.qbk delete mode 100644 libs/range/doc/reference/algorithm_ext/push_front.qbk delete mode 100644 libs/range/doc/reference/algorithm_ext/remove_erase.qbk delete mode 100644 libs/range/doc/reference/algorithm_ext/remove_erase_if.qbk delete mode 100644 libs/range/doc/reference/algorithms.qbk delete mode 100644 libs/range/doc/reference/extending.qbk delete mode 100644 libs/range/doc/reference/numeric/accumulate.qbk delete mode 100644 libs/range/doc/reference/numeric/adjacent_difference.qbk delete mode 100644 libs/range/doc/reference/numeric/inner_product.qbk delete mode 100644 libs/range/doc/reference/numeric/partial_sum.qbk delete mode 100644 libs/range/doc/reference/overview.qbk delete mode 100644 libs/range/doc/reference/ranges.qbk delete mode 100644 libs/range/doc/reference/ranges/any_range.qbk delete mode 100644 libs/range/doc/reference/ranges/counting_range.qbk delete mode 100644 libs/range/doc/reference/ranges/irange.qbk delete mode 100644 libs/range/doc/reference/ranges/istream_range.qbk delete mode 100644 libs/range/doc/reference/semantics.qbk delete mode 100644 libs/range/doc/reference/synopsis.qbk delete mode 100644 libs/range/doc/reference/utilities.qbk delete mode 100644 libs/range/doc/style.qbk delete mode 100644 libs/range/doc/upgrade.qbk delete mode 100644 libs/range/index.html delete mode 100644 libs/range/meta/libraries.json delete mode 100644 libs/range/test/Jamfile.v2 delete mode 100644 libs/range/test/adaptor_test/adjacent_filtered.cpp delete mode 100644 libs/range/test/adaptor_test/adjacent_filtered_example.cpp delete mode 100644 libs/range/test/adaptor_test/chained.cpp delete mode 100644 libs/range/test/adaptor_test/copied.cpp delete mode 100644 libs/range/test/adaptor_test/copied_example.cpp delete mode 100644 libs/range/test/adaptor_test/filtered.cpp delete mode 100644 libs/range/test/adaptor_test/filtered_example.cpp delete mode 100644 libs/range/test/adaptor_test/formatted.cpp delete mode 100644 libs/range/test/adaptor_test/formatted_example.cpp delete mode 100644 libs/range/test/adaptor_test/indexed.cpp delete mode 100644 libs/range/test/adaptor_test/indexed_example.cpp delete mode 100644 libs/range/test/adaptor_test/indirected.cpp delete mode 100644 libs/range/test/adaptor_test/indirected_example.cpp delete mode 100644 libs/range/test/adaptor_test/map.cpp delete mode 100644 libs/range/test/adaptor_test/map_keys_example.cpp delete mode 100644 libs/range/test/adaptor_test/map_values_example.cpp delete mode 100644 libs/range/test/adaptor_test/replaced.cpp delete mode 100644 libs/range/test/adaptor_test/replaced_example.cpp delete mode 100644 libs/range/test/adaptor_test/replaced_if.cpp delete mode 100644 libs/range/test/adaptor_test/replaced_if_example.cpp delete mode 100644 libs/range/test/adaptor_test/reversed.cpp delete mode 100644 libs/range/test/adaptor_test/reversed_example.cpp delete mode 100644 libs/range/test/adaptor_test/sliced.cpp delete mode 100644 libs/range/test/adaptor_test/sliced_example.cpp delete mode 100644 libs/range/test/adaptor_test/strided.cpp delete mode 100644 libs/range/test/adaptor_test/strided2.cpp delete mode 100644 libs/range/test/adaptor_test/strided_example.cpp delete mode 100644 libs/range/test/adaptor_test/ticket_6742_transformed_c4789_warning.cpp delete mode 100644 libs/range/test/adaptor_test/ticket_8676_sliced_transformed.cpp delete mode 100644 libs/range/test/adaptor_test/ticket_9519_strided_reversed.cpp delete mode 100644 libs/range/test/adaptor_test/tokenized.cpp delete mode 100644 libs/range/test/adaptor_test/tokenized_example.cpp delete mode 100644 libs/range/test/adaptor_test/transformed.cpp delete mode 100644 libs/range/test/adaptor_test/transformed_example.cpp delete mode 100644 libs/range/test/adaptor_test/type_erased.cpp delete mode 100644 libs/range/test/adaptor_test/type_erased_abstract.cpp delete mode 100644 libs/range/test/adaptor_test/type_erased_bidirectional.cpp delete mode 100644 libs/range/test/adaptor_test/type_erased_brackets.cpp delete mode 100644 libs/range/test/adaptor_test/type_erased_example.cpp delete mode 100644 libs/range/test/adaptor_test/type_erased_forward.cpp delete mode 100644 libs/range/test/adaptor_test/type_erased_mix_values.cpp delete mode 100644 libs/range/test/adaptor_test/type_erased_random_access.cpp delete mode 100644 libs/range/test/adaptor_test/type_erased_single_pass.cpp delete mode 100644 libs/range/test/adaptor_test/type_erased_test.hpp delete mode 100644 libs/range/test/adaptor_test/type_erased_tparam_conv.cpp delete mode 100644 libs/range/test/adaptor_test/uniqued.cpp delete mode 100644 libs/range/test/adaptor_test/uniqued_example.cpp delete mode 100644 libs/range/test/adaptors.cpp delete mode 100644 libs/range/test/adl_conformance.cpp delete mode 100644 libs/range/test/adl_conformance_no_using.cpp delete mode 100644 libs/range/test/algorithm.cpp delete mode 100644 libs/range/test/algorithm_example.cpp delete mode 100644 libs/range/test/algorithm_ext_test/copy_n.cpp delete mode 100644 libs/range/test/algorithm_ext_test/erase.cpp delete mode 100644 libs/range/test/algorithm_ext_test/for_each_ext.cpp delete mode 100644 libs/range/test/algorithm_ext_test/insert.cpp delete mode 100644 libs/range/test/algorithm_ext_test/iota.cpp delete mode 100644 libs/range/test/algorithm_ext_test/is_sorted.cpp delete mode 100644 libs/range/test/algorithm_ext_test/overwrite.cpp delete mode 100644 libs/range/test/algorithm_ext_test/push_back.cpp delete mode 100644 libs/range/test/algorithm_ext_test/push_front.cpp delete mode 100644 libs/range/test/algorithm_test/adjacent_find.cpp delete mode 100644 libs/range/test/algorithm_test/binary_search.cpp delete mode 100644 libs/range/test/algorithm_test/copy.cpp delete mode 100644 libs/range/test/algorithm_test/copy_backward.cpp delete mode 100644 libs/range/test/algorithm_test/copy_n.cpp delete mode 100644 libs/range/test/algorithm_test/count.cpp delete mode 100644 libs/range/test/algorithm_test/count_if.cpp delete mode 100644 libs/range/test/algorithm_test/equal.cpp delete mode 100644 libs/range/test/algorithm_test/equal_range.cpp delete mode 100644 libs/range/test/algorithm_test/fill.cpp delete mode 100644 libs/range/test/algorithm_test/find.cpp delete mode 100644 libs/range/test/algorithm_test/find_end.cpp delete mode 100644 libs/range/test/algorithm_test/find_first_of.cpp delete mode 100644 libs/range/test/algorithm_test/find_if.cpp delete mode 100644 libs/range/test/algorithm_test/for_each.cpp delete mode 100644 libs/range/test/algorithm_test/generate.cpp delete mode 100644 libs/range/test/algorithm_test/heap.cpp delete mode 100644 libs/range/test/algorithm_test/includes.cpp delete mode 100644 libs/range/test/algorithm_test/inplace_merge.cpp delete mode 100644 libs/range/test/algorithm_test/lexicographical_compare.cpp delete mode 100644 libs/range/test/algorithm_test/lower_bound.cpp delete mode 100644 libs/range/test/algorithm_test/max_element.cpp delete mode 100644 libs/range/test/algorithm_test/merge.cpp delete mode 100644 libs/range/test/algorithm_test/min_element.cpp delete mode 100644 libs/range/test/algorithm_test/mismatch.cpp delete mode 100644 libs/range/test/algorithm_test/next_permutation.cpp delete mode 100644 libs/range/test/algorithm_test/nth_element.cpp delete mode 100644 libs/range/test/algorithm_test/partial_sort.cpp delete mode 100644 libs/range/test/algorithm_test/partition.cpp delete mode 100644 libs/range/test/algorithm_test/prev_permutation.cpp delete mode 100644 libs/range/test/algorithm_test/random_shuffle.cpp delete mode 100644 libs/range/test/algorithm_test/remove.cpp delete mode 100644 libs/range/test/algorithm_test/remove_copy.cpp delete mode 100644 libs/range/test/algorithm_test/remove_copy_if.cpp delete mode 100644 libs/range/test/algorithm_test/remove_if.cpp delete mode 100644 libs/range/test/algorithm_test/replace.cpp delete mode 100644 libs/range/test/algorithm_test/replace_copy.cpp delete mode 100644 libs/range/test/algorithm_test/replace_copy_if.cpp delete mode 100644 libs/range/test/algorithm_test/replace_if.cpp delete mode 100644 libs/range/test/algorithm_test/reverse.cpp delete mode 100644 libs/range/test/algorithm_test/reverse_copy.cpp delete mode 100644 libs/range/test/algorithm_test/rotate.cpp delete mode 100644 libs/range/test/algorithm_test/rotate_copy.cpp delete mode 100644 libs/range/test/algorithm_test/search.cpp delete mode 100644 libs/range/test/algorithm_test/search_n.cpp delete mode 100644 libs/range/test/algorithm_test/set_difference.cpp delete mode 100644 libs/range/test/algorithm_test/set_intersection.cpp delete mode 100644 libs/range/test/algorithm_test/set_symmetric_difference.cpp delete mode 100644 libs/range/test/algorithm_test/set_union.cpp delete mode 100644 libs/range/test/algorithm_test/sort.cpp delete mode 100644 libs/range/test/algorithm_test/stable_partition.cpp delete mode 100644 libs/range/test/algorithm_test/stable_sort.cpp delete mode 100644 libs/range/test/algorithm_test/swap_ranges.cpp delete mode 100644 libs/range/test/algorithm_test/transform.cpp delete mode 100644 libs/range/test/algorithm_test/unique.cpp delete mode 100644 libs/range/test/algorithm_test/unique_copy.cpp delete mode 100644 libs/range/test/algorithm_test/upper_bound.cpp delete mode 100644 libs/range/test/array.cpp delete mode 100644 libs/range/test/atl.cpp delete mode 100644 libs/range/test/begin.cpp delete mode 100644 libs/range/test/category.cpp delete mode 100644 libs/range/test/combine.cpp delete mode 100644 libs/range/test/compat2.cpp delete mode 100644 libs/range/test/compat3.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/adjacent_filtered_concept.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/adjacent_filtered_concept2.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/adjacent_filtered_concept3.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/adjacent_filtered_concept4.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/copied_concept.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/copied_concept2.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/copied_concept3.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/copied_concept4.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/mock_iterator.hpp delete mode 100644 libs/range/test/compile_fail/adaptor/mock_range.hpp delete mode 100644 libs/range/test/compile_fail/adaptor/reversed_concept.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/reversed_concept2.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/reversed_concept3.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/reversed_concept4.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/sliced_concept.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/sliced_concept2.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/sliced_concept3.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/sliced_concept4.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/uniqued_concept.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/uniqued_concept2.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/uniqued_concept3.cpp delete mode 100644 libs/range/test/compile_fail/adaptor/uniqued_concept4.cpp delete mode 100644 libs/range/test/compile_fail/iterator_range1.cpp delete mode 100644 libs/range/test/const_iterator.cpp delete mode 100644 libs/range/test/const_ranges.cpp delete mode 100644 libs/range/test/const_reverse_iterator.cpp delete mode 100644 libs/range/test/counting_range.cpp delete mode 100644 libs/range/test/difference_type.cpp delete mode 100644 libs/range/test/end.cpp delete mode 100644 libs/range/test/extension_mechanism.cpp delete mode 100644 libs/range/test/extension_size.cpp delete mode 100644 libs/range/test/has_range_iterator.cpp delete mode 100644 libs/range/test/irange.cpp delete mode 100644 libs/range/test/istream_range.cpp delete mode 100644 libs/range/test/iterator.cpp delete mode 100644 libs/range/test/iterator_ext.cpp delete mode 100644 libs/range/test/iterator_pair.cpp delete mode 100644 libs/range/test/iterator_range.cpp delete mode 100644 libs/range/test/iterator_range_drop.cpp delete mode 100644 libs/range/test/iterator_range_equality_bug.cpp delete mode 100644 libs/range/test/iterator_range_hash.cpp delete mode 100644 libs/range/test/iterator_range_variant.cpp delete mode 100644 libs/range/test/join.cpp delete mode 100644 libs/range/test/mfc.cpp delete mode 100644 libs/range/test/mutable_iterator.cpp delete mode 100644 libs/range/test/partial_workaround.cpp delete mode 100644 libs/range/test/pointer.cpp delete mode 100644 libs/range/test/pointer_as_iterator.cpp delete mode 100644 libs/range/test/reference.cpp delete mode 100644 libs/range/test/result_iterator.cpp delete mode 100644 libs/range/test/reverse_iterator.cpp delete mode 100644 libs/range/test/reverse_result_iterator.cpp delete mode 100644 libs/range/test/reversible_range.cpp delete mode 100644 libs/range/test/size_type.cpp delete mode 100644 libs/range/test/std_container.cpp delete mode 100644 libs/range/test/string.cpp delete mode 100644 libs/range/test/sub_range.cpp delete mode 100644 libs/range/test/test_driver/range_overload_test_driver.hpp delete mode 100644 libs/range/test/test_driver/range_return_test_driver.hpp delete mode 100644 libs/range/test/test_function/check_equal_fn.hpp delete mode 100644 libs/range/test/test_function/counted_function.hpp delete mode 100644 libs/range/test/test_function/equal_to_x.hpp delete mode 100644 libs/range/test/test_function/false_predicate.hpp delete mode 100644 libs/range/test/test_function/greater_than_x.hpp delete mode 100644 libs/range/test/test_function/multiply_by_x.hpp delete mode 100644 libs/range/test/test_function/true_predicate.hpp delete mode 100644 libs/range/test/test_utils.hpp delete mode 100644 libs/range/test/ticket_10336.cpp delete mode 100644 libs/range/test/ticket_5486.cpp delete mode 100644 libs/range/test/ticket_5544_terminate_irange.cpp delete mode 100644 libs/range/test/ticket_5547.cpp delete mode 100644 libs/range/test/ticket_5556_is_sorted_namespace.cpp delete mode 100644 libs/range/test/ticket_5811_indirected_optional.cpp delete mode 100644 libs/range/test/ticket_6715_iterator_range_equality.cpp delete mode 100644 libs/range/test/ticket_6944.cpp delete mode 100644 libs/range/test/value_type.cpp diff --git a/README.md b/README.md index 17deab057..f545057bd 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ upstream and master. To upgrade the content do the following: git checkout upstream rm -r * # use the bcp tool to populate with the new Boost libraries +# use git add to stage any new files and directories git commit -a -m "Updated Boost v1.63 libraries including ..." git tag boost_1_63 git push origin diff --git a/boost/date_time/date_facet.hpp b/boost/date_time/date_facet.hpp new file mode 100644 index 000000000..c3574cc95 --- /dev/null +++ b/boost/date_time/date_facet.hpp @@ -0,0 +1,767 @@ +#ifndef _DATE_TIME_DATE_FACET__HPP___ +#define _DATE_TIME_DATE_FACET__HPP___ + +/* Copyright (c) 2004-2005 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Martin Andrian, Jeff Garland, Bart Garst + * $Date$ + */ + +#include +#include +#include +#include // ostreambuf_iterator +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { namespace date_time { + + + /*! Class that provides format based I/O facet for date types. + * + * This class allows the formatting of dates by using format string. + * Format strings are: + * + * - %A => long_weekday_format - Full name Ex: Tuesday + * - %a => short_weekday_format - Three letter abbreviation Ex: Tue + * - %B => long_month_format - Full name Ex: October + * - %b => short_month_format - Three letter abbreviation Ex: Oct + * - %x => standard_format_specifier - defined by the locale + * - %Y-%b-%d => default_date_format - YYYY-Mon-dd + * + * Default month format == %b + * Default weekday format == %a + */ + template > > + class date_facet : public std::locale::facet { + public: + typedef typename date_type::duration_type duration_type; + // greg_weekday is gregorian_calendar::day_of_week_type + typedef typename date_type::day_of_week_type day_of_week_type; + typedef typename date_type::day_type day_type; + typedef typename date_type::month_type month_type; + typedef boost::date_time::period period_type; + typedef std::basic_string string_type; + typedef CharT char_type; + typedef boost::date_time::period_formatter period_formatter_type; + typedef boost::date_time::special_values_formatter special_values_formatter_type; + typedef std::vector > input_collection_type; + // used for the output of the date_generators + typedef date_generator_formatter date_gen_formatter_type; + typedef partial_date partial_date_type; + typedef nth_kday_of_month nth_kday_type; + typedef first_kday_of_month first_kday_type; + typedef last_kday_of_month last_kday_type; + typedef first_kday_after kday_after_type; + typedef first_kday_before kday_before_type; + static const char_type long_weekday_format[3]; + static const char_type short_weekday_format[3]; + static const char_type long_month_format[3]; + static const char_type short_month_format[3]; + static const char_type default_period_separator[4]; + static const char_type standard_format_specifier[3]; + static const char_type iso_format_specifier[7]; + static const char_type iso_format_extended_specifier[9]; + static const char_type default_date_format[9]; // YYYY-Mon-DD + static std::locale::id id; + +#if defined (__SUNPRO_CC) && defined (_RWSTD_VER) + std::locale::id& __get_id (void) const { return id; } +#endif + + explicit date_facet(::size_t a_ref = 0) + : std::locale::facet(a_ref), + //m_format(standard_format_specifier) + m_format(default_date_format), + m_month_format(short_month_format), + m_weekday_format(short_weekday_format) + {} + + explicit date_facet(const char_type* format_str, + const input_collection_type& short_names, + ::size_t ref_count = 0) + : std::locale::facet(ref_count), + m_format(format_str), + m_month_format(short_month_format), + m_weekday_format(short_weekday_format), + m_month_short_names(short_names) + {} + + + explicit date_facet(const char_type* format_str, + period_formatter_type per_formatter = period_formatter_type(), + special_values_formatter_type sv_formatter = special_values_formatter_type(), + date_gen_formatter_type dg_formatter = date_gen_formatter_type(), + ::size_t ref_count = 0) + : std::locale::facet(ref_count), + m_format(format_str), + m_month_format(short_month_format), + m_weekday_format(short_weekday_format), + m_period_formatter(per_formatter), + m_date_gen_formatter(dg_formatter), + m_special_values_formatter(sv_formatter) + {} + void format(const char_type* const format_str) { + m_format = format_str; + } + virtual void set_iso_format() + { + m_format = iso_format_specifier; + } + virtual void set_iso_extended_format() + { + m_format = iso_format_extended_specifier; + } + void month_format(const char_type* const format_str) { + m_month_format = format_str; + } + void weekday_format(const char_type* const format_str) { + m_weekday_format = format_str; + } + + void period_formatter(period_formatter_type per_formatter) { + m_period_formatter= per_formatter; + } + void special_values_formatter(const special_values_formatter_type& svf) + { + m_special_values_formatter = svf; + } + void short_weekday_names(const input_collection_type& short_names) + { + m_weekday_short_names = short_names; + } + void long_weekday_names(const input_collection_type& long_names) + { + m_weekday_long_names = long_names; + } + + void short_month_names(const input_collection_type& short_names) + { + m_month_short_names = short_names; + } + + void long_month_names(const input_collection_type& long_names) + { + m_month_long_names = long_names; + } + + void date_gen_phrase_strings(const input_collection_type& new_strings, + typename date_gen_formatter_type::phrase_elements beg_pos=date_gen_formatter_type::first) + { + m_date_gen_formatter.elements(new_strings, beg_pos); + } + + OutItrT put(OutItrT next, + std::ios_base& a_ios, + char_type fill_char, + const date_type& d) const + { + if (d.is_special()) { + return do_put_special(next, a_ios, fill_char, d.as_special()); + } + //The following line of code required the date to support a to_tm function + return do_put_tm(next, a_ios, fill_char, to_tm(d), m_format); + } + + OutItrT put(OutItrT next, + std::ios_base& a_ios, + char_type fill_char, + const duration_type& dd) const + { + if (dd.is_special()) { + return do_put_special(next, a_ios, fill_char, dd.get_rep().as_special()); + } + + typedef std::num_put num_put; + if (std::has_facet(a_ios.getloc())) { + return std::use_facet(a_ios.getloc()).put(next, a_ios, fill_char, dd.get_rep().as_number()); + } + else { + num_put* f = new num_put(); + std::locale l = std::locale(a_ios.getloc(), f); + a_ios.imbue(l); + return f->put(next, a_ios, fill_char, dd.get_rep().as_number()); + } + + } + + + OutItrT put(OutItrT next, + std::ios_base& a_ios, + char_type fill_char, + const month_type& m) const + { + //if (d.is_special()) { + // return do_put_special(next, a_ios, fill_char, d.as_special()); + //} + //The following line of code required the date to support a to_tm function + std::tm dtm; + std::memset(&dtm, 0, sizeof(dtm)); + dtm.tm_mon = m - 1; + return do_put_tm(next, a_ios, fill_char, dtm, m_month_format); + } + + //! puts the day of month + OutItrT put(OutItrT next, + std::ios_base& a_ios, + char_type fill_char, + const day_type& day) const + { + std::tm dtm; + std::memset(&dtm, 0, sizeof(dtm)); + dtm.tm_mday = day.as_number(); + char_type tmp[3] = {'%','d'}; + string_type temp_format(tmp); + return do_put_tm(next, a_ios, fill_char, dtm, temp_format); + } + + OutItrT put(OutItrT next, + std::ios_base& a_ios, + char_type fill_char, + const day_of_week_type& dow) const + { + //if (d.is_special()) { + // return do_put_special(next, a_ios, fill_char, d.as_special()); + //} + //The following line of code required the date to support a to_tm function + std::tm dtm; + std::memset(&dtm, 0, sizeof(dtm)); + dtm.tm_wday = dow; + return do_put_tm(next, a_ios, fill_char, dtm, m_weekday_format); + } + + + OutItrT put(OutItrT next, + std::ios_base& a_ios, + char_type fill_char, + const period_type& p) const + { + return m_period_formatter.put_period(next, a_ios, fill_char, p, *this); + } + + OutItrT put(OutItrT next, + std::ios_base& a_ios, + char_type fill_char, + const partial_date_type& pd) const + { + return m_date_gen_formatter.put_partial_date(next, a_ios, fill_char, pd, *this); + } + + OutItrT put(OutItrT next, + std::ios_base& a_ios, + char_type fill_char, + const nth_kday_type& nkd) const + { + return m_date_gen_formatter.put_nth_kday(next, a_ios, fill_char, nkd, *this); + } + + OutItrT put(OutItrT next, + std::ios_base& a_ios, + char_type fill_char, + const first_kday_type& fkd) const + { + return m_date_gen_formatter.put_first_kday(next, a_ios, fill_char, fkd, *this); + } + + OutItrT put(OutItrT next, + std::ios_base& a_ios, + char_type fill_char, + const last_kday_type& lkd) const + { + return m_date_gen_formatter.put_last_kday(next, a_ios, fill_char, lkd, *this); + } + + OutItrT put(OutItrT next, + std::ios_base& a_ios, + char_type fill_char, + const kday_before_type& fkb) const + { + return m_date_gen_formatter.put_kday_before(next, a_ios, fill_char, fkb, *this); + } + + OutItrT put(OutItrT next, + std::ios_base& a_ios, + char_type fill_char, + const kday_after_type& fka) const + { + return m_date_gen_formatter.put_kday_after(next, a_ios, fill_char, fka, *this); + } + + protected: + virtual OutItrT do_put_special(OutItrT next, + std::ios_base& /*a_ios*/, + char_type /*fill_char*/, + const boost::date_time::special_values sv) const + { + m_special_values_formatter.put_special(next, sv); + return next; + } + virtual OutItrT do_put_tm(OutItrT next, + std::ios_base& a_ios, + char_type fill_char, + const tm& tm_value, + string_type a_format) const + { + // update format string with custom names + if (m_weekday_long_names.size()) { + boost::algorithm::replace_all(a_format, + long_weekday_format, + m_weekday_long_names[tm_value.tm_wday]); + } + if (m_weekday_short_names.size()) { + boost::algorithm::replace_all(a_format, + short_weekday_format, + m_weekday_short_names[tm_value.tm_wday]); + + } + if (m_month_long_names.size()) { + boost::algorithm::replace_all(a_format, + long_month_format, + m_month_long_names[tm_value.tm_mon]); + } + if (m_month_short_names.size()) { + boost::algorithm::replace_all(a_format, + short_month_format, + m_month_short_names[tm_value.tm_mon]); + } + // use time_put facet to create final string + const char_type* p_format = a_format.c_str(); + return std::use_facet >(a_ios.getloc()).put(next, a_ios, + fill_char, + &tm_value, + p_format, + p_format + a_format.size()); + } + protected: + string_type m_format; + string_type m_month_format; + string_type m_weekday_format; + period_formatter_type m_period_formatter; + date_gen_formatter_type m_date_gen_formatter; + special_values_formatter_type m_special_values_formatter; + input_collection_type m_month_short_names; + input_collection_type m_month_long_names; + input_collection_type m_weekday_short_names; + input_collection_type m_weekday_long_names; + private: + }; + + template + std::locale::id date_facet::id; + + template + const typename date_facet::char_type + date_facet::long_weekday_format[3] = {'%','A'}; + + template + const typename date_facet::char_type + date_facet::short_weekday_format[3] = {'%','a'}; + + template + const typename date_facet::char_type + date_facet::long_month_format[3] = {'%','B'}; + + template + const typename date_facet::char_type + date_facet::short_month_format[3] = {'%','b'}; + + template + const typename date_facet::char_type + date_facet::default_period_separator[4] = { ' ', '/', ' '}; + + template + const typename date_facet::char_type + date_facet::standard_format_specifier[3] = + {'%', 'x' }; + + template + const typename date_facet::char_type + date_facet::iso_format_specifier[7] = + {'%', 'Y', '%', 'm', '%', 'd' }; + + template + const typename date_facet::char_type + date_facet::iso_format_extended_specifier[9] = + {'%', 'Y', '-', '%', 'm', '-', '%', 'd' }; + + template + const typename date_facet::char_type + date_facet::default_date_format[9] = + {'%','Y','-','%','b','-','%','d'}; + + + + //! Input facet + template > > + class date_input_facet : public std::locale::facet { + public: + typedef typename date_type::duration_type duration_type; + // greg_weekday is gregorian_calendar::day_of_week_type + typedef typename date_type::day_of_week_type day_of_week_type; + typedef typename date_type::day_type day_type; + typedef typename date_type::month_type month_type; + typedef typename date_type::year_type year_type; + typedef boost::date_time::period period_type; + typedef std::basic_string string_type; + typedef CharT char_type; + typedef boost::date_time::period_parser period_parser_type; + typedef boost::date_time::special_values_parser special_values_parser_type; + typedef std::vector > input_collection_type; + typedef format_date_parser format_date_parser_type; + // date_generators stuff goes here + typedef date_generator_parser date_gen_parser_type; + typedef partial_date partial_date_type; + typedef nth_kday_of_month nth_kday_type; + typedef first_kday_of_month first_kday_type; + typedef last_kday_of_month last_kday_type; + typedef first_kday_after kday_after_type; + typedef first_kday_before kday_before_type; + + static const char_type long_weekday_format[3]; + static const char_type short_weekday_format[3]; + static const char_type long_month_format[3]; + static const char_type short_month_format[3]; + static const char_type four_digit_year_format[3]; + static const char_type two_digit_year_format[3]; + static const char_type default_period_separator[4]; + static const char_type standard_format_specifier[3]; + static const char_type iso_format_specifier[7]; + static const char_type iso_format_extended_specifier[9]; + static const char_type default_date_format[9]; // YYYY-Mon-DD + static std::locale::id id; + + explicit date_input_facet(::size_t a_ref = 0) + : std::locale::facet(a_ref), + m_format(default_date_format), + m_month_format(short_month_format), + m_weekday_format(short_weekday_format), + m_year_format(four_digit_year_format), + m_parser(m_format, std::locale::classic()) + // default period_parser & special_values_parser used + {} + + explicit date_input_facet(const string_type& format_str, + ::size_t a_ref = 0) + : std::locale::facet(a_ref), + m_format(format_str), + m_month_format(short_month_format), + m_weekday_format(short_weekday_format), + m_year_format(four_digit_year_format), + m_parser(m_format, std::locale::classic()) + // default period_parser & special_values_parser used + {} + + explicit date_input_facet(const string_type& format_str, + const format_date_parser_type& date_parser, + const special_values_parser_type& sv_parser, + const period_parser_type& per_parser, + const date_gen_parser_type& date_gen_parser, + ::size_t ref_count = 0) + : std::locale::facet(ref_count), + m_format(format_str), + m_month_format(short_month_format), + m_weekday_format(short_weekday_format), + m_year_format(four_digit_year_format), + m_parser(date_parser), + m_date_gen_parser(date_gen_parser), + m_period_parser(per_parser), + m_sv_parser(sv_parser) + {} + + + void format(const char_type* const format_str) { + m_format = format_str; + } + virtual void set_iso_format() + { + m_format = iso_format_specifier; + } + virtual void set_iso_extended_format() + { + m_format = iso_format_extended_specifier; + } + void month_format(const char_type* const format_str) { + m_month_format = format_str; + } + void weekday_format(const char_type* const format_str) { + m_weekday_format = format_str; + } + void year_format(const char_type* const format_str) { + m_year_format = format_str; + } + + void period_parser(period_parser_type per_parser) { + m_period_parser = per_parser; + } + void short_weekday_names(const input_collection_type& weekday_names) + { + m_parser.short_weekday_names(weekday_names); + } + void long_weekday_names(const input_collection_type& weekday_names) + { + m_parser.long_weekday_names(weekday_names); + } + + void short_month_names(const input_collection_type& month_names) + { + m_parser.short_month_names(month_names); + } + + void long_month_names(const input_collection_type& month_names) + { + m_parser.long_month_names(month_names); + } + + void date_gen_element_strings(const input_collection_type& col) + { + m_date_gen_parser.element_strings(col); + } + void date_gen_element_strings(const string_type& first, + const string_type& second, + const string_type& third, + const string_type& fourth, + const string_type& fifth, + const string_type& last, + const string_type& before, + const string_type& after, + const string_type& of) + + { + m_date_gen_parser.element_strings(first,second,third,fourth,fifth,last,before,after,of); + } + + void special_values_parser(special_values_parser_type sv_parser) + { + m_sv_parser = sv_parser; + } + + InItrT get(InItrT& from, + InItrT& to, + std::ios_base& /*a_ios*/, + date_type& d) const + { + d = m_parser.parse_date(from, to, m_format, m_sv_parser); + return from; + } + InItrT get(InItrT& from, + InItrT& to, + std::ios_base& /*a_ios*/, + month_type& m) const + { + m = m_parser.parse_month(from, to, m_month_format); + return from; + } + InItrT get(InItrT& from, + InItrT& to, + std::ios_base& /*a_ios*/, + day_of_week_type& wd) const + { + wd = m_parser.parse_weekday(from, to, m_weekday_format); + return from; + } + //! Expects 1 or 2 digit day range: 1-31 + InItrT get(InItrT& from, + InItrT& to, + std::ios_base& /*a_ios*/, + day_type& d) const + { + d = m_parser.parse_var_day_of_month(from, to); + return from; + } + InItrT get(InItrT& from, + InItrT& to, + std::ios_base& /*a_ios*/, + year_type& y) const + { + y = m_parser.parse_year(from, to, m_year_format); + return from; + } + InItrT get(InItrT& from, + InItrT& to, + std::ios_base& a_ios, + duration_type& dd) const + { + // skip leading whitespace + while(std::isspace(*from) && from != to) { ++from; } + + /* num_get.get() will always consume the first character if it + * is a sign indicator (+/-). Special value strings may begin + * with one of these signs so we'll need a copy of it + * in case num_get.get() fails. */ + char_type c = '\0'; + // TODO Are these characters somewhere in the locale? + if(*from == '-' || *from == '+') { + c = *from; + } + typedef std::num_get num_get; + typename duration_type::duration_rep_type val = 0; + std::ios_base::iostate err = std::ios_base::goodbit; + + if (std::has_facet(a_ios.getloc())) { + from = std::use_facet(a_ios.getloc()).get(from, to, a_ios, err, val); + } + else { + num_get* ng = new num_get(); + std::locale l = std::locale(a_ios.getloc(), ng); + a_ios.imbue(l); + from = ng->get(from, to, a_ios, err, val); + } + if(err & std::ios_base::failbit){ + typedef typename special_values_parser_type::match_results match_results; + match_results mr; + if(c == '-' || c == '+') { // was the first character consumed? + mr.cache += c; + } + m_sv_parser.match(from, to, mr); + if(mr.current_match == match_results::PARSE_ERROR) { + boost::throw_exception(std::ios_base::failure("Parse failed. No match found for '" + mr.cache + "'")); + BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(return from); // should never reach + } + dd = duration_type(static_cast(mr.current_match)); + } + else { + dd = duration_type(val); + } + return from; + } + InItrT get(InItrT& from, + InItrT& to, + std::ios_base& a_ios, + period_type& p) const + { + p = m_period_parser.get_period(from, to, a_ios, p, duration_type::unit(), *this); + return from; + } + InItrT get(InItrT& from, + InItrT& to, + std::ios_base& a_ios, + nth_kday_type& nkd) const + { + nkd = m_date_gen_parser.get_nth_kday_type(from, to, a_ios, *this); + return from; + } + InItrT get(InItrT& from, + InItrT& to, + std::ios_base& a_ios, + partial_date_type& pd) const + { + + pd = m_date_gen_parser.get_partial_date_type(from, to, a_ios, *this); + return from; + } + InItrT get(InItrT& from, + InItrT& to, + std::ios_base& a_ios, + first_kday_type& fkd) const + { + fkd = m_date_gen_parser.get_first_kday_type(from, to, a_ios, *this); + return from; + } + InItrT get(InItrT& from, + InItrT& to, + std::ios_base& a_ios, + last_kday_type& lkd) const + { + lkd = m_date_gen_parser.get_last_kday_type(from, to, a_ios, *this); + return from; + } + InItrT get(InItrT& from, + InItrT& to, + std::ios_base& a_ios, + kday_before_type& fkb) const + { + fkb = m_date_gen_parser.get_kday_before_type(from, to, a_ios, *this); + return from; + } + InItrT get(InItrT& from, + InItrT& to, + std::ios_base& a_ios, + kday_after_type& fka) const + { + fka = m_date_gen_parser.get_kday_after_type(from, to, a_ios, *this); + return from; + } + + protected: + string_type m_format; + string_type m_month_format; + string_type m_weekday_format; + string_type m_year_format; + format_date_parser_type m_parser; + date_gen_parser_type m_date_gen_parser; + period_parser_type m_period_parser; + special_values_parser_type m_sv_parser; + private: + }; + + + template + std::locale::id date_input_facet::id; + + template + const typename date_input_facet::char_type + date_input_facet::long_weekday_format[3] = {'%','A'}; + + template + const typename date_input_facet::char_type + date_input_facet::short_weekday_format[3] = {'%','a'}; + + template + const typename date_input_facet::char_type + date_input_facet::long_month_format[3] = {'%','B'}; + + template + const typename date_input_facet::char_type + date_input_facet::short_month_format[3] = {'%','b'}; + + template + const typename date_input_facet::char_type + date_input_facet::four_digit_year_format[3] = {'%','Y'}; + + template + const typename date_input_facet::char_type + date_input_facet::two_digit_year_format[3] = {'%','y'}; + + template + const typename date_input_facet::char_type + date_input_facet::default_period_separator[4] = { ' ', '/', ' '}; + + template + const typename date_input_facet::char_type + date_input_facet::standard_format_specifier[3] = + {'%', 'x' }; + + template + const typename date_input_facet::char_type + date_input_facet::iso_format_specifier[7] = + {'%', 'Y', '%', 'm', '%', 'd' }; + + template + const typename date_input_facet::char_type + date_input_facet::iso_format_extended_specifier[9] = + {'%', 'Y', '-', '%', 'm', '-', '%', 'd' }; + + template + const typename date_input_facet::char_type + date_input_facet::default_date_format[9] = + {'%','Y','-','%','b','-','%','d'}; + +} } // namespaces + + +#endif diff --git a/boost/date_time/date_generator_formatter.hpp b/boost/date_time/date_generator_formatter.hpp new file mode 100644 index 000000000..42c396b2c --- /dev/null +++ b/boost/date_time/date_generator_formatter.hpp @@ -0,0 +1,265 @@ +#ifndef _DATE_TIME_DATE_GENERATOR_FORMATTER__HPP___ +#define _DATE_TIME_DATE_GENERATOR_FORMATTER__HPP___ + +/* Copyright (c) 2004 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + +#include +#include +#include +#include +#include "boost/date_time/date_generators.hpp" + +namespace boost { +namespace date_time { + + //! Formats date_generators for output + /*! Formatting of date_generators follows specific orders for the + * various types of date_generators. + * - partial_date => "dd Month" + * - nth_day_of_the_week_in_month => "nth weekday of month" + * - first_day_of_the_week_in_month => "first weekday of month" + * - last_day_of_the_week_in_month => "last weekday of month" + * - first_day_of_the_week_after => "weekday after" + * - first_day_of_the_week_before => "weekday before" + * While the order of the elements in these phrases cannot be changed, + * the elements themselves can be. Weekday and Month get their formats + * and names from the date_facet. The remaining elements are stored in + * the date_generator_formatter and can be customized upon construction + * or via a member function. The default elements are those shown in the + * examples above. + */ + template > > + class date_generator_formatter { + public: + typedef partial_date partial_date_type; + typedef nth_kday_of_month nth_kday_type; + typedef first_kday_of_month first_kday_type; + typedef last_kday_of_month last_kday_type; + typedef first_kday_after kday_after_type; + typedef first_kday_before kday_before_type; + + typedef CharT char_type; + typedef std::basic_string string_type; + typedef std::vector collection_type; + static const char_type first_string[6]; + static const char_type second_string[7]; + static const char_type third_string[6]; + static const char_type fourth_string[7]; + static const char_type fifth_string[6]; + static const char_type last_string[5]; + static const char_type before_string[8]; + static const char_type after_string[6]; + static const char_type of_string[3]; + + enum phrase_elements {first=0, second, third, fourth, fifth, last, + before, after, of, number_of_phrase_elements}; + + //! Default format elements used + date_generator_formatter() + { + phrase_strings.reserve(number_of_phrase_elements); + phrase_strings.push_back(string_type(first_string)); + phrase_strings.push_back(string_type(second_string)); + phrase_strings.push_back(string_type(third_string)); + phrase_strings.push_back(string_type(fourth_string)); + phrase_strings.push_back(string_type(fifth_string)); + phrase_strings.push_back(string_type(last_string)); + phrase_strings.push_back(string_type(before_string)); + phrase_strings.push_back(string_type(after_string)); + phrase_strings.push_back(string_type(of_string)); + } + + //! Constructor that allows for a custom set of phrase elements + date_generator_formatter(const string_type& first_str, + const string_type& second_str, + const string_type& third_str, + const string_type& fourth_str, + const string_type& fifth_str, + const string_type& last_str, + const string_type& before_str, + const string_type& after_str, + const string_type& of_str) + { + phrase_strings.reserve(number_of_phrase_elements); + phrase_strings.push_back(first_str); + phrase_strings.push_back(second_str); + phrase_strings.push_back(third_str); + phrase_strings.push_back(fourth_str); + phrase_strings.push_back(fifth_str); + phrase_strings.push_back(last_str); + phrase_strings.push_back(before_str); + phrase_strings.push_back(after_str); + phrase_strings.push_back(of_str); + } + + //! Replace the set of phrase elements with those contained in new_strings + /*! The order of the strings in the given collection is important. + * They must follow: + * - first, second, third, fourth, fifth, last, before, after, of. + * + * It is not necessary to send in a complete set if only a few + * elements are to be replaced as long as the correct beg_pos is used. + * + * Ex: To keep the default first through fifth elements, but replace + * the rest with a collection of: + * - "final", "prior", "following", "in". + * The beg_pos of date_generator_formatter::last would be used. + */ + void elements(const collection_type& new_strings, + phrase_elements beg_pos=first) + { + if(beg_pos < number_of_phrase_elements) { + typename collection_type::iterator itr = phrase_strings.begin(); + itr += beg_pos; + std::copy(new_strings.begin(), new_strings.end(), + itr); + //phrase_strings.begin()); + } + } + + //!Put a partial_date => "dd Month" + template + OutItrT put_partial_date(OutItrT next, std::ios_base& a_ios, + CharT a_fill, const partial_date_type& pd, + const facet_type& facet) const + { + facet.put(next, a_ios, a_fill, pd.day()); + next = a_fill; //TODO change this ??? + facet.put(next, a_ios, a_fill, pd.month()); + return next; + } + + //! Put an nth_day_of_the_week_in_month => "nth weekday of month" + template + OutItrT put_nth_kday(OutItrT next, std::ios_base& a_ios, + CharT a_fill, const nth_kday_type& nkd, + const facet_type& facet) const + { + put_string(next, phrase_strings[nkd.nth_week() -1]); + next = a_fill; //TODO change this ??? + facet.put(next, a_ios, a_fill, nkd.day_of_week()); + next = a_fill; //TODO change this ??? + put_string(next, string_type(of_string)); + next = a_fill; //TODO change this ??? + facet.put(next, a_ios, a_fill, nkd.month()); + return next; + } + + //! Put a first_day_of_the_week_in_month => "first weekday of month" + template + OutItrT put_first_kday(OutItrT next, std::ios_base& a_ios, + CharT a_fill, const first_kday_type& fkd, + const facet_type& facet) const + { + put_string(next, phrase_strings[first]); + next = a_fill; //TODO change this ??? + facet.put(next, a_ios, a_fill, fkd.day_of_week()); + next = a_fill; //TODO change this ??? + put_string(next, string_type(of_string)); + next = a_fill; //TODO change this ??? + facet.put(next, a_ios, a_fill, fkd.month()); + return next; + } + + //! Put a last_day_of_the_week_in_month => "last weekday of month" + template + OutItrT put_last_kday(OutItrT next, std::ios_base& a_ios, + CharT a_fill, const last_kday_type& lkd, + const facet_type& facet) const + { + put_string(next, phrase_strings[last]); + next = a_fill; //TODO change this ??? + facet.put(next, a_ios, a_fill, lkd.day_of_week()); + next = a_fill; //TODO change this ??? + put_string(next, string_type(of_string)); + next = a_fill; //TODO change this ??? + facet.put(next, a_ios, a_fill, lkd.month()); + return next; + } + + //! Put a first_day_of_the_week_before => "weekday before" + template + OutItrT put_kday_before(OutItrT next, std::ios_base& a_ios, + CharT a_fill, const kday_before_type& fkb, + const facet_type& facet) const + { + facet.put(next, a_ios, a_fill, fkb.day_of_week()); + next = a_fill; //TODO change this ??? + put_string(next, phrase_strings[before]); + return next; + } + + //! Put a first_day_of_the_week_after => "weekday after" + template + OutItrT put_kday_after(OutItrT next, std::ios_base& a_ios, + CharT a_fill, const kday_after_type& fka, + const facet_type& facet) const + { + facet.put(next, a_ios, a_fill, fka.day_of_week()); + next = a_fill; //TODO change this ??? + put_string(next, phrase_strings[after]); + return next; + } + + + private: + collection_type phrase_strings; + + //! helper function to put the various member string into stream + OutItrT put_string(OutItrT next, const string_type& str) const + { + typename string_type::const_iterator itr = str.begin(); + while(itr != str.end()) { + *next = *itr; + ++itr; + ++next; + } + return next; + } + }; + + template + const typename date_generator_formatter::char_type + date_generator_formatter::first_string[6] = + {'f','i','r','s','t'}; + template + const typename date_generator_formatter::char_type + date_generator_formatter::second_string[7] = + {'s','e','c','o','n','d'}; + template + const typename date_generator_formatter::char_type + date_generator_formatter::third_string[6] = + {'t','h','i','r','d'}; + template + const typename date_generator_formatter::char_type + date_generator_formatter::fourth_string[7] = + {'f','o','u','r','t','h'}; + template + const typename date_generator_formatter::char_type + date_generator_formatter::fifth_string[6] = + {'f','i','f','t','h'}; + template + const typename date_generator_formatter::char_type + date_generator_formatter::last_string[5] = + {'l','a','s','t'}; + template + const typename date_generator_formatter::char_type + date_generator_formatter::before_string[8] = + {'b','e','f','o','r','e'}; + template + const typename date_generator_formatter::char_type + date_generator_formatter::after_string[6] = + {'a','f','t','e','r'}; + template + const typename date_generator_formatter::char_type + date_generator_formatter::of_string[3] = + {'o','f'}; +} } // namespaces + +#endif // _DATE_TIME_DATE_GENERATOR_FORMATTER__HPP___ diff --git a/boost/date_time/date_generator_parser.hpp b/boost/date_time/date_generator_parser.hpp new file mode 100644 index 000000000..f4d7b27a7 --- /dev/null +++ b/boost/date_time/date_generator_parser.hpp @@ -0,0 +1,330 @@ + +#ifndef DATE_TIME_DATE_GENERATOR_PARSER_HPP__ +#define DATE_TIME_DATE_GENERATOR_PARSER_HPP__ + +/* Copyright (c) 2005 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + +#include +#include +#include // istreambuf_iterator +#include +#include +#include +#include +#include + +namespace boost { namespace date_time { + + //! Class for date_generator parsing + /*! The elements of a date_generator "phrase" are parsed from the input stream in a + * particular order. All elements are required and the order in which they appear + * cannot change, however, the elements themselves can be changed. The default + * elements and their order are as follows: + * + * - partial_date => "dd Month" + * - nth_day_of_the_week_in_month => "nth weekday of month" + * - first_day_of_the_week_in_month => "first weekday of month" + * - last_day_of_the_week_in_month => "last weekday of month" + * - first_day_of_the_week_after => "weekday after" + * - first_day_of_the_week_before => "weekday before" + * + * Weekday and Month names and formats are handled via the date_input_facet. + * + */ + template + class date_generator_parser + { + public: + typedef std::basic_string string_type; + typedef std::istreambuf_iterator stream_itr_type; + + typedef typename date_type::month_type month_type; + typedef typename date_type::day_of_week_type day_of_week_type; + typedef typename date_type::day_type day_type; + + typedef string_parse_tree parse_tree_type; + typedef typename parse_tree_type::parse_match_result_type match_results; + typedef std::vector > collection_type; + + typedef partial_date partial_date_type; + typedef nth_kday_of_month nth_kday_type; + typedef first_kday_of_month first_kday_type; + typedef last_kday_of_month last_kday_type; + typedef first_kday_after kday_after_type; + typedef first_kday_before kday_before_type; + + typedef charT char_type; + static const char_type first_string[6]; + static const char_type second_string[7]; + static const char_type third_string[6]; + static const char_type fourth_string[7]; + static const char_type fifth_string[6]; + static const char_type last_string[5]; + static const char_type before_string[8]; + static const char_type after_string[6]; + static const char_type of_string[3]; + + enum phrase_elements {first=0, second, third, fourth, fifth, last, + before, after, of, number_of_phrase_elements}; + + //! Creates a date_generator_parser with the default set of "element_strings" + date_generator_parser() + { + element_strings(string_type(first_string), + string_type(second_string), + string_type(third_string), + string_type(fourth_string), + string_type(fifth_string), + string_type(last_string), + string_type(before_string), + string_type(after_string), + string_type(of_string)); + } + + //! Creates a date_generator_parser using a user defined set of element strings + date_generator_parser(const string_type& first_str, + const string_type& second_str, + const string_type& third_str, + const string_type& fourth_str, + const string_type& fifth_str, + const string_type& last_str, + const string_type& before_str, + const string_type& after_str, + const string_type& of_str) + { + element_strings(first_str, second_str, third_str, fourth_str, fifth_str, + last_str, before_str, after_str, of_str); + } + + //! Replace strings that determine nth week for generator + void element_strings(const string_type& first_str, + const string_type& second_str, + const string_type& third_str, + const string_type& fourth_str, + const string_type& fifth_str, + const string_type& last_str, + const string_type& before_str, + const string_type& after_str, + const string_type& of_str) + { + collection_type phrases; + phrases.push_back(first_str); + phrases.push_back(second_str); + phrases.push_back(third_str); + phrases.push_back(fourth_str); + phrases.push_back(fifth_str); + phrases.push_back(last_str); + phrases.push_back(before_str); + phrases.push_back(after_str); + phrases.push_back(of_str); + m_element_strings = parse_tree_type(phrases, this->first); // enum first + } + + void element_strings(const collection_type& col) + { + m_element_strings = parse_tree_type(col, this->first); // enum first + } + + //! returns partial_date parsed from stream + template + partial_date_type + get_partial_date_type(stream_itr_type& sitr, + stream_itr_type& stream_end, + std::ios_base& a_ios, + const facet_type& facet) const + { + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + + day_type d(1); + month_type m(1); + facet.get(sitr, stream_end, a_ios, d); + facet.get(sitr, stream_end, a_ios, m); + + return partial_date_type(d,m); + } + + //! returns nth_kday_of_week parsed from stream + template + nth_kday_type + get_nth_kday_type(stream_itr_type& sitr, + stream_itr_type& stream_end, + std::ios_base& a_ios, + const facet_type& facet) const + { + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + + typename nth_kday_type::week_num wn; + day_of_week_type wd(0); // no default constructor + month_type m(1); // no default constructor + + match_results mr = m_element_strings.match(sitr, stream_end); + switch(mr.current_match) { + case first : { wn = nth_kday_type::first; break; } + case second : { wn = nth_kday_type::second; break; } + case third : { wn = nth_kday_type::third; break; } + case fourth : { wn = nth_kday_type::fourth; break; } + case fifth : { wn = nth_kday_type::fifth; break; } + default: + { + boost::throw_exception(std::ios_base::failure("Parse failed. No match found for '" + mr.cache + "'")); + BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(wn = nth_kday_type::first); + } + } // week num + facet.get(sitr, stream_end, a_ios, wd); // day_of_week + extract_element(sitr, stream_end, of); // "of" element + facet.get(sitr, stream_end, a_ios, m); // month + + return nth_kday_type(wn, wd, m); + } + + //! returns first_kday_of_week parsed from stream + template + first_kday_type + get_first_kday_type(stream_itr_type& sitr, + stream_itr_type& stream_end, + std::ios_base& a_ios, + const facet_type& facet) const + { + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + + day_of_week_type wd(0); // no default constructor + month_type m(1); // no default constructor + + extract_element(sitr, stream_end, first); // "first" element + facet.get(sitr, stream_end, a_ios, wd); // day_of_week + extract_element(sitr, stream_end, of); // "of" element + facet.get(sitr, stream_end, a_ios, m); // month + + + return first_kday_type(wd, m); + } + + //! returns last_kday_of_week parsed from stream + template + last_kday_type + get_last_kday_type(stream_itr_type& sitr, + stream_itr_type& stream_end, + std::ios_base& a_ios, + const facet_type& facet) const + { + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + + day_of_week_type wd(0); // no default constructor + month_type m(1); // no default constructor + + extract_element(sitr, stream_end, last); // "last" element + facet.get(sitr, stream_end, a_ios, wd); // day_of_week + extract_element(sitr, stream_end, of); // "of" element + facet.get(sitr, stream_end, a_ios, m); // month + + + return last_kday_type(wd, m); + } + + //! returns first_kday_of_week parsed from stream + template + kday_before_type + get_kday_before_type(stream_itr_type& sitr, + stream_itr_type& stream_end, + std::ios_base& a_ios, + const facet_type& facet) const + { + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + + day_of_week_type wd(0); // no default constructor + + facet.get(sitr, stream_end, a_ios, wd); // day_of_week + extract_element(sitr, stream_end, before);// "before" element + + return kday_before_type(wd); + } + + //! returns first_kday_of_week parsed from stream + template + kday_after_type + get_kday_after_type(stream_itr_type& sitr, + stream_itr_type& stream_end, + std::ios_base& a_ios, + const facet_type& facet) const + { + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + + day_of_week_type wd(0); // no default constructor + + facet.get(sitr, stream_end, a_ios, wd); // day_of_week + extract_element(sitr, stream_end, after); // "after" element + + return kday_after_type(wd); + } + + private: + parse_tree_type m_element_strings; + + //! Extracts phrase element from input. Throws ios_base::failure on error. + void extract_element(stream_itr_type& sitr, + stream_itr_type& stream_end, + typename date_generator_parser::phrase_elements ele) const + { + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + match_results mr = m_element_strings.match(sitr, stream_end); + if(mr.current_match != ele) { + boost::throw_exception(std::ios_base::failure("Parse failed. No match found for '" + mr.cache + "'")); + } + } + + }; + + template + const typename date_generator_parser::char_type + date_generator_parser::first_string[6] = + {'f','i','r','s','t'}; + template + const typename date_generator_parser::char_type + date_generator_parser::second_string[7] = + {'s','e','c','o','n','d'}; + template + const typename date_generator_parser::char_type + date_generator_parser::third_string[6] = + {'t','h','i','r','d'}; + template + const typename date_generator_parser::char_type + date_generator_parser::fourth_string[7] = + {'f','o','u','r','t','h'}; + template + const typename date_generator_parser::char_type + date_generator_parser::fifth_string[6] = + {'f','i','f','t','h'}; + template + const typename date_generator_parser::char_type + date_generator_parser::last_string[5] = + {'l','a','s','t'}; + template + const typename date_generator_parser::char_type + date_generator_parser::before_string[8] = + {'b','e','f','o','r','e'}; + template + const typename date_generator_parser::char_type + date_generator_parser::after_string[6] = + {'a','f','t','e','r'}; + template + const typename date_generator_parser::char_type + date_generator_parser::of_string[3] = + {'o','f'}; + +} } //namespace + +#endif // DATE_TIME_DATE_GENERATOR_PARSER_HPP__ + diff --git a/boost/date_time/format_date_parser.hpp b/boost/date_time/format_date_parser.hpp new file mode 100644 index 000000000..a40dee6fb --- /dev/null +++ b/boost/date_time/format_date_parser.hpp @@ -0,0 +1,731 @@ + +#ifndef DATE_TIME_FORMAT_DATE_PARSER_HPP__ +#define DATE_TIME_FORMAT_DATE_PARSER_HPP__ + +/* Copyright (c) 2004-2005 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + + +#include "boost/lexical_cast.hpp" +#include "boost/date_time/string_parse_tree.hpp" +#include "boost/date_time/strings_from_facet.hpp" +#include "boost/date_time/special_values_parser.hpp" +#include +#include +#include +#include +#ifndef BOOST_NO_STDC_NAMESPACE +# include +#else +# include +#endif + +#ifdef BOOST_NO_STDC_NAMESPACE +namespace std { + using ::isspace; + using ::isdigit; +} +#endif +namespace boost { namespace date_time { + +//! Helper function for parsing fixed length strings into integers +/*! Will consume 'length' number of characters from stream. Consumed + * character are transfered to parse_match_result struct. + * Returns '-1' if no number can be parsed or incorrect number of + * digits in stream. */ +template +inline +int_type +fixed_string_to_int(std::istreambuf_iterator& itr, + std::istreambuf_iterator& stream_end, + parse_match_result& mr, + unsigned int length, + const charT& fill_char) +{ + //typedef std::basic_string string_type; + unsigned int j = 0; + //string_type s; + while (j < length && itr != stream_end && + (std::isdigit(*itr) || *itr == fill_char)) { + if(*itr == fill_char) { + /* Since a fill_char can be anything, we convert it to a zero. + * lexical_cast will behave predictably when zero is used as fill. */ + mr.cache += ('0'); + } + else { + mr.cache += (*itr); + } + itr++; + j++; + } + int_type i = static_cast(-1); + // mr.cache will hold leading zeros. size() tells us when input is too short. + if(mr.cache.size() < length) { + return i; + } + try { + i = boost::lexical_cast(mr.cache); + }catch(bad_lexical_cast&){ + // we want to return -1 if the cast fails so nothing to do here + } + return i; +} + +//! Helper function for parsing fixed length strings into integers +/*! Will consume 'length' number of characters from stream. Consumed + * character are transfered to parse_match_result struct. + * Returns '-1' if no number can be parsed or incorrect number of + * digits in stream. */ +template +inline +int_type +fixed_string_to_int(std::istreambuf_iterator& itr, + std::istreambuf_iterator& stream_end, + parse_match_result& mr, + unsigned int length) +{ + return fixed_string_to_int(itr, stream_end, mr, length, '0'); +} + +//! Helper function for parsing varied length strings into integers +/*! Will consume 'max_length' characters from stream only if those + * characters are digits. Returns '-1' if no number can be parsed. + * Will not parse a number preceeded by a '+' or '-'. */ +template +inline +int_type +var_string_to_int(std::istreambuf_iterator& itr, + const std::istreambuf_iterator& stream_end, + unsigned int max_length) +{ + typedef std::basic_string string_type; + unsigned int j = 0; + string_type s; + while (itr != stream_end && (j < max_length) && std::isdigit(*itr)) { + s += (*itr); + ++itr; + ++j; + } + int_type i = static_cast(-1); + if(!s.empty()) { + i = boost::lexical_cast(s); + } + return i; +} + + +//! Class with generic date parsing using a format string +/*! The following is the set of recognized format specifiers + - %a - Short weekday name + - %A - Long weekday name + - %b - Abbreviated month name + - %B - Full month name + - %d - Day of the month as decimal 01 to 31 + - %j - Day of year as decimal from 001 to 366 + - %m - Month name as a decimal 01 to 12 + - %U - Week number 00 to 53 with first Sunday as the first day of week 1? + - %w - Weekday as decimal number 0 to 6 where Sunday == 0 + - %W - Week number 00 to 53 where Monday is first day of week 1 + - %x - facet default date representation + - %y - Year without the century - eg: 04 for 2004 + - %Y - Year with century + + The weekday specifiers (%a and %A) do not add to the date construction, + but they provide a way to skip over the weekday names for formats that + provide them. + + todo -- Another interesting feature that this approach could provide is + an option to fill in any missing fields with the current values + from the clock. So if you have %m-%d the parser would detect + the missing year value and fill it in using the clock. + + todo -- What to do with the %x. %x in the classic facet is just bad... + + */ +template +class format_date_parser +{ + public: + typedef std::basic_string string_type; + typedef std::basic_istringstream stringstream_type; + typedef std::istreambuf_iterator stream_itr_type; + typedef typename string_type::const_iterator const_itr; + typedef typename date_type::year_type year_type; + typedef typename date_type::month_type month_type; + typedef typename date_type::day_type day_type; + typedef typename date_type::duration_type duration_type; + typedef typename date_type::day_of_week_type day_of_week_type; + typedef typename date_type::day_of_year_type day_of_year_type; + typedef string_parse_tree parse_tree_type; + typedef typename parse_tree_type::parse_match_result_type match_results; + typedef std::vector > input_collection_type; + + // TODO sv_parser uses its default constructor - write the others + + format_date_parser(const string_type& format_str, + const input_collection_type& month_short_names, + const input_collection_type& month_long_names, + const input_collection_type& weekday_short_names, + const input_collection_type& weekday_long_names) : + m_format(format_str), + m_month_short_names(month_short_names, 1), + m_month_long_names(month_long_names, 1), + m_weekday_short_names(weekday_short_names), + m_weekday_long_names(weekday_long_names) + {} + + format_date_parser(const string_type& format_str, + const std::locale& locale) : + m_format(format_str), + m_month_short_names(gather_month_strings(locale), 1), + m_month_long_names(gather_month_strings(locale, false), 1), + m_weekday_short_names(gather_weekday_strings(locale)), + m_weekday_long_names(gather_weekday_strings(locale, false)) + {} + + format_date_parser(const format_date_parser& fdp) + { + this->m_format = fdp.m_format; + this->m_month_short_names = fdp.m_month_short_names; + this->m_month_long_names = fdp.m_month_long_names; + this->m_weekday_short_names = fdp.m_weekday_short_names; + this->m_weekday_long_names = fdp.m_weekday_long_names; + } + + string_type format() const + { + return m_format; + } + + void format(string_type format_str) + { + m_format = format_str; + } + + void short_month_names(const input_collection_type& month_names) + { + m_month_short_names = parse_tree_type(month_names, 1); + } + void long_month_names(const input_collection_type& month_names) + { + m_month_long_names = parse_tree_type(month_names, 1); + } + void short_weekday_names(const input_collection_type& weekday_names) + { + m_weekday_short_names = parse_tree_type(weekday_names); + } + void long_weekday_names(const input_collection_type& weekday_names) + { + m_weekday_long_names = parse_tree_type(weekday_names); + } + + date_type + parse_date(const string_type& value, + const string_type& format_str, + const special_values_parser& sv_parser) const + { + stringstream_type ss(value); + stream_itr_type sitr(ss); + stream_itr_type stream_end; + return parse_date(sitr, stream_end, format_str, sv_parser); + } + + date_type + parse_date(std::istreambuf_iterator& sitr, + std::istreambuf_iterator& stream_end, + const special_values_parser& sv_parser) const + { + return parse_date(sitr, stream_end, m_format, sv_parser); + } + + /*! Of all the objects that the format_date_parser can parse, only a + * date can be a special value. Therefore, only parse_date checks + * for special_values. */ + date_type + parse_date(std::istreambuf_iterator& sitr, + std::istreambuf_iterator& stream_end, + string_type format_str, + const special_values_parser& sv_parser) const + { + bool use_current_char = false; + + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + + short year(0), month(0), day(0), day_of_year(0);// wkday(0); + /* Initialized the following to their minimum values. These intermediate + * objects are used so we get specific exceptions when part of the input + * is unparsable. + * Ex: "205-Jan-15" will throw a bad_year, "2005-Jsn-15"- bad_month, etc.*/ + year_type t_year(1400); + month_type t_month(1); + day_type t_day(1); + day_of_week_type wkday(0); + + + const_itr itr(format_str.begin()); + while (itr != format_str.end() && (sitr != stream_end)) { + if (*itr == '%') { + if ( ++itr == format_str.end()) + break; + if (*itr != '%') { + switch(*itr) { + case 'a': + { + //this value is just throw away. It could be used for + //error checking potentially, but it isn't helpful in + //actually constructing the date - we just need to get it + //out of the stream + match_results mr = m_weekday_short_names.match(sitr, stream_end); + if(mr.current_match == match_results::PARSE_ERROR) { + // check special_values + if(sv_parser.match(sitr, stream_end, mr)) { + return date_type(static_cast(mr.current_match)); + } + } + wkday = mr.current_match; + if (mr.has_remaining()) { + use_current_char = true; + } + break; + } + case 'A': + { + //this value is just throw away. It could be used for + //error checking potentially, but it isn't helpful in + //actually constructing the date - we just need to get it + //out of the stream + match_results mr = m_weekday_long_names.match(sitr, stream_end); + if(mr.current_match == match_results::PARSE_ERROR) { + // check special_values + if(sv_parser.match(sitr, stream_end, mr)) { + return date_type(static_cast(mr.current_match)); + } + } + wkday = mr.current_match; + if (mr.has_remaining()) { + use_current_char = true; + } + break; + } + case 'b': + { + match_results mr = m_month_short_names.match(sitr, stream_end); + if(mr.current_match == match_results::PARSE_ERROR) { + // check special_values + if(sv_parser.match(sitr, stream_end, mr)) { + return date_type(static_cast(mr.current_match)); + } + } + t_month = month_type(mr.current_match); + if (mr.has_remaining()) { + use_current_char = true; + } + break; + } + case 'B': + { + match_results mr = m_month_long_names.match(sitr, stream_end); + if(mr.current_match == match_results::PARSE_ERROR) { + // check special_values + if(sv_parser.match(sitr, stream_end, mr)) { + return date_type(static_cast(mr.current_match)); + } + } + t_month = month_type(mr.current_match); + if (mr.has_remaining()) { + use_current_char = true; + } + break; + } + case 'd': + { + match_results mr; + day = fixed_string_to_int(sitr, stream_end, mr, 2); + if(day == -1) { + if(sv_parser.match(sitr, stream_end, mr)) { + return date_type(static_cast(mr.current_match)); + } + } + t_day = day_type(day); + break; + } + case 'e': + { + match_results mr; + day = fixed_string_to_int(sitr, stream_end, mr, 2, ' '); + if(day == -1) { + if(sv_parser.match(sitr, stream_end, mr)) { + return date_type(static_cast(mr.current_match)); + } + } + t_day = day_type(day); + break; + } + case 'j': + { + match_results mr; + day_of_year = fixed_string_to_int(sitr, stream_end, mr, 3); + if(day_of_year == -1) { + if(sv_parser.match(sitr, stream_end, mr)) { + return date_type(static_cast(mr.current_match)); + } + } + // these next two lines are so we get an exception with bad input + day_of_year_type t_day_of_year(1); + t_day_of_year = day_of_year_type(day_of_year); + break; + } + case 'm': + { + match_results mr; + month = fixed_string_to_int(sitr, stream_end, mr, 2); + if(month == -1) { + if(sv_parser.match(sitr, stream_end, mr)) { + return date_type(static_cast(mr.current_match)); + } + } + t_month = month_type(month); + break; + } + case 'Y': + { + match_results mr; + year = fixed_string_to_int(sitr, stream_end, mr, 4); + if(year == -1) { + if(sv_parser.match(sitr, stream_end, mr)) { + return date_type(static_cast(mr.current_match)); + } + } + t_year = year_type(year); + break; + } + case 'y': + { + match_results mr; + year = fixed_string_to_int(sitr, stream_end, mr, 2); + if(year == -1) { + if(sv_parser.match(sitr, stream_end, mr)) { + return date_type(static_cast(mr.current_match)); + } + } + year += 2000; //make 2 digit years in this century + t_year = year_type(year); + break; + } + default: + {} //ignore those we don't understand + + }//switch + + } + else { // itr == '%', second consecutive + sitr++; + } + + itr++; //advance past format specifier + } + else { //skip past chars in format and in buffer + itr++; + if (use_current_char) { + use_current_char = false; + } + else { + sitr++; + } + } + } + + if (day_of_year > 0) { + date_type d(static_cast(year-1),12,31); //end of prior year + return d + duration_type(day_of_year); + } + + return date_type(t_year, t_month, t_day); // exceptions were thrown earlier + // if input was no good + } + + //! Throws bad_month if unable to parse + month_type + parse_month(std::istreambuf_iterator& sitr, + std::istreambuf_iterator& stream_end, + string_type format_str) const + { + match_results mr; + return parse_month(sitr, stream_end, format_str, mr); + } + + //! Throws bad_month if unable to parse + month_type + parse_month(std::istreambuf_iterator& sitr, + std::istreambuf_iterator& stream_end, + string_type format_str, + match_results& mr) const + { + bool use_current_char = false; + + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + + short month(0); + + const_itr itr(format_str.begin()); + while (itr != format_str.end() && (sitr != stream_end)) { + if (*itr == '%') { + if ( ++itr == format_str.end()) + break; + if (*itr != '%') { + switch(*itr) { + case 'b': + { + mr = m_month_short_names.match(sitr, stream_end); + month = mr.current_match; + if (mr.has_remaining()) { + use_current_char = true; + } + break; + } + case 'B': + { + mr = m_month_long_names.match(sitr, stream_end); + month = mr.current_match; + if (mr.has_remaining()) { + use_current_char = true; + } + break; + } + case 'm': + { + month = var_string_to_int(sitr, stream_end, 2); + // var_string_to_int returns -1 if parse failed. That will + // cause a bad_month exception to be thrown so we do nothing here + break; + } + default: + {} //ignore those we don't understand + + }//switch + + } + else { // itr == '%', second consecutive + sitr++; + } + + itr++; //advance past format specifier + } + else { //skip past chars in format and in buffer + itr++; + if (use_current_char) { + use_current_char = false; + } + else { + sitr++; + } + } + } + + return month_type(month); // throws bad_month exception when values are zero + } + + //! Expects 1 or 2 digits 1-31. Throws bad_day_of_month if unable to parse + day_type + parse_var_day_of_month(std::istreambuf_iterator& sitr, + std::istreambuf_iterator& stream_end) const + { + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + + return day_type(var_string_to_int(sitr, stream_end, 2)); + } + //! Expects 2 digits 01-31. Throws bad_day_of_month if unable to parse + day_type + parse_day_of_month(std::istreambuf_iterator& sitr, + std::istreambuf_iterator& stream_end) const + { + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + + //return day_type(var_string_to_int(sitr, stream_end, 2)); + match_results mr; + return day_type(fixed_string_to_int(sitr, stream_end, mr, 2)); + } + + day_of_week_type + parse_weekday(std::istreambuf_iterator& sitr, + std::istreambuf_iterator& stream_end, + string_type format_str) const + { + match_results mr; + return parse_weekday(sitr, stream_end, format_str, mr); + } + day_of_week_type + parse_weekday(std::istreambuf_iterator& sitr, + std::istreambuf_iterator& stream_end, + string_type format_str, + match_results& mr) const + { + bool use_current_char = false; + + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + + short wkday(0); + + const_itr itr(format_str.begin()); + while (itr != format_str.end() && (sitr != stream_end)) { + if (*itr == '%') { + if ( ++itr == format_str.end()) + break; + if (*itr != '%') { + switch(*itr) { + case 'a': + { + //this value is just throw away. It could be used for + //error checking potentially, but it isn't helpful in + //actually constructing the date - we just need to get it + //out of the stream + mr = m_weekday_short_names.match(sitr, stream_end); + wkday = mr.current_match; + if (mr.has_remaining()) { + use_current_char = true; + } + break; + } + case 'A': + { + //this value is just throw away. It could be used for + //error checking potentially, but it isn't helpful in + //actually constructing the date - we just need to get it + //out of the stream + mr = m_weekday_long_names.match(sitr, stream_end); + wkday = mr.current_match; + if (mr.has_remaining()) { + use_current_char = true; + } + break; + } + case 'w': + { + // weekday as number 0-6, Sunday == 0 + wkday = var_string_to_int(sitr, stream_end, 2); + break; + } + default: + {} //ignore those we don't understand + + }//switch + + } + else { // itr == '%', second consecutive + sitr++; + } + + itr++; //advance past format specifier + } + else { //skip past chars in format and in buffer + itr++; + if (use_current_char) { + use_current_char = false; + } + else { + sitr++; + } + } + } + + return day_of_week_type(wkday); // throws bad_day_of_month exception + // when values are zero + } + + //! throws bad_year if unable to parse + year_type + parse_year(std::istreambuf_iterator& sitr, + std::istreambuf_iterator& stream_end, + string_type format_str) const + { + match_results mr; + return parse_year(sitr, stream_end, format_str, mr); + } + + //! throws bad_year if unable to parse + year_type + parse_year(std::istreambuf_iterator& sitr, + std::istreambuf_iterator& stream_end, + string_type format_str, + match_results& mr) const + { + bool use_current_char = false; + + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + + unsigned short year(0); + + const_itr itr(format_str.begin()); + while (itr != format_str.end() && (sitr != stream_end)) { + if (*itr == '%') { + if ( ++itr == format_str.end()) + break; + if (*itr != '%') { + //match_results mr; + switch(*itr) { + case 'Y': + { + // year from 4 digit string + year = fixed_string_to_int(sitr, stream_end, mr, 4); + break; + } + case 'y': + { + // year from 2 digit string (no century) + year = fixed_string_to_int(sitr, stream_end, mr, 2); + year += 2000; //make 2 digit years in this century + break; + } + default: + {} //ignore those we don't understand + + }//switch + + } + else { // itr == '%', second consecutive + sitr++; + } + + itr++; //advance past format specifier + } + else { //skip past chars in format and in buffer + itr++; + if (use_current_char) { + use_current_char = false; + } + else { + sitr++; + } + } + } + + return year_type(year); // throws bad_year exception when values are zero + } + + + private: + string_type m_format; + parse_tree_type m_month_short_names; + parse_tree_type m_month_long_names; + parse_tree_type m_weekday_short_names; + parse_tree_type m_weekday_long_names; + +}; + +} } //namespace + +#endif + + + diff --git a/boost/date_time/gregorian/gregorian.hpp b/boost/date_time/gregorian/gregorian.hpp new file mode 100644 index 000000000..47d545ecc --- /dev/null +++ b/boost/date_time/gregorian/gregorian.hpp @@ -0,0 +1,38 @@ +#ifndef GREGORIAN_HPP__ +#define GREGORIAN_HPP__ + +/* Copyright (c) 2002-2004 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + +/*! @file gregorian.hpp + Single file header that provides overall include for all elements of + the gregorian date-time system. This includes the various types + defined, but also other functions for formatting and parsing. +*/ + + +#include "boost/date_time/compiler_config.hpp" +#include "boost/date_time/gregorian/gregorian_types.hpp" +#include "boost/date_time/gregorian/conversion.hpp" +#if defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS) +#include "boost/date_time/gregorian/formatters_limited.hpp" +#else +#include "boost/date_time/gregorian/formatters.hpp" +#endif + +#if defined(USE_DATE_TIME_PRE_1_33_FACET_IO) +#include "boost/date_time/gregorian/greg_facet.hpp" +#else +#include "boost/date_time/gregorian/gregorian_io.hpp" +#endif // USE_DATE_TIME_PRE_1_33_FACET_IO + +#include "boost/date_time/gregorian/parsers.hpp" + + + +#endif diff --git a/boost/date_time/gregorian/gregorian_io.hpp b/boost/date_time/gregorian/gregorian_io.hpp new file mode 100644 index 000000000..e0a23f326 --- /dev/null +++ b/boost/date_time/gregorian/gregorian_io.hpp @@ -0,0 +1,784 @@ +#ifndef DATE_TIME_GREGORIAN_IO_HPP__ +#define DATE_TIME_GREGORIAN_IO_HPP__ + +/* Copyright (c) 2004-2005 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + +#include +#include +#include // i/ostreambuf_iterator +#include +#include +#include +#include +#include +#include +#include +#include // to_tm will be needed in the facets + +namespace boost { +namespace gregorian { + + + typedef boost::date_time::period_formatter wperiod_formatter; + typedef boost::date_time::period_formatter period_formatter; + + typedef boost::date_time::date_facet wdate_facet; + typedef boost::date_time::date_facet date_facet; + + typedef boost::date_time::period_parser period_parser; + typedef boost::date_time::period_parser wperiod_parser; + + typedef boost::date_time::special_values_formatter special_values_formatter; + typedef boost::date_time::special_values_formatter wspecial_values_formatter; + + typedef boost::date_time::special_values_parser special_values_parser; + typedef boost::date_time::special_values_parser wspecial_values_parser; + + typedef boost::date_time::date_input_facet date_input_facet; + typedef boost::date_time::date_input_facet wdate_input_facet; + + template + inline std::basic_ostream& + operator<<(std::basic_ostream& os, const boost::gregorian::date& d) { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::date_facet custom_date_facet; + std::ostreambuf_iterator output_itr(os); + if (std::has_facet(os.getloc())) + std::use_facet(os.getloc()).put(output_itr, os, os.fill(), d); + else { + //instantiate a custom facet for dealing with dates since the user + //has not put one in the stream so far. This is for efficiency + //since we would always need to reconstruct for every date + //if the locale did not already exist. Of course this will be overridden + //if the user imbues at some later point. With the default settings + //for the facet the resulting format will be the same as the + //std::time_facet settings. + custom_date_facet* f = new custom_date_facet(); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(output_itr, os, os.fill(), d); + } + return os; + } + + //! input operator for date + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, date& d) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::date_input_facet date_input_facet; + + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, d); + } + else { + date_input_facet* f = new date_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, d); + } + } + catch(...) { + // mask tells us what exceptions are turned on + std::ios_base::iostate exception_mask = is.exceptions(); + // if the user wants exceptions on failbit, we'll rethrow our + // date_time exception & set the failbit + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} // ignore this one + throw; // rethrow original exception + } + else { + // if the user want's to fail quietly, we simply set the failbit + is.setstate(std::ios_base::failbit); + } + + } + } + return is; + } + + template + inline std::basic_ostream& + operator<<(std::basic_ostream& os, const boost::gregorian::date_duration& dd) { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::date_facet custom_date_facet; + std::ostreambuf_iterator output_itr(os); + if (std::has_facet(os.getloc())) + std::use_facet(os.getloc()).put(output_itr, os, os.fill(), dd); + else { + custom_date_facet* f = new custom_date_facet(); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(output_itr, os, os.fill(), dd); + + } + return os; + } + + //! input operator for date_duration + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, date_duration& dd) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::date_input_facet date_input_facet; + + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, dd); + } + else { + date_input_facet* f = new date_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, dd); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + + } + } + return is; + } + + template + inline std::basic_ostream& + operator<<(std::basic_ostream& os, const boost::gregorian::date_period& dp) { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::date_facet custom_date_facet; + std::ostreambuf_iterator output_itr(os); + if (std::has_facet(os.getloc())) + std::use_facet(os.getloc()).put(output_itr, os, os.fill(), dp); + else { + //instantiate a custom facet for dealing with date periods since the user + //has not put one in the stream so far. This is for efficiency + //since we would always need to reconstruct for every time period + //if the local did not already exist. Of course this will be overridden + //if the user imbues at some later point. With the default settings + //for the facet the resulting format will be the same as the + //std::time_facet settings. + custom_date_facet* f = new custom_date_facet(); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(output_itr, os, os.fill(), dp); + + } + return os; + } + + //! input operator for date_period + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, date_period& dp) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::date_input_facet date_input_facet; + + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, dp); + } + else { + date_input_facet* f = new date_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, dp); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + + } + } + return is; + } + + /********** small gregorian types **********/ + + template + inline std::basic_ostream& + operator<<(std::basic_ostream& os, const boost::gregorian::greg_month& gm) { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::date_facet custom_date_facet; + std::ostreambuf_iterator output_itr(os); + if (std::has_facet(os.getloc())) + std::use_facet(os.getloc()).put(output_itr, os, os.fill(), gm); + else { + custom_date_facet* f = new custom_date_facet();//-> 10/1074199752/32 because year & day not initialized in put(...) + //custom_date_facet* f = new custom_date_facet("%B"); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(output_itr, os, os.fill(), gm); + } + return os; + } + + //! input operator for greg_month + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, greg_month& m) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::date_input_facet date_input_facet; + + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, m); + } + else { + date_input_facet* f = new date_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, m); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + + } + } + return is; + } + + + template + inline std::basic_ostream& + operator<<(std::basic_ostream& os, const boost::gregorian::greg_weekday& gw) { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::date_facet custom_date_facet; + std::ostreambuf_iterator output_itr(os); + if (std::has_facet(os.getloc())) + std::use_facet(os.getloc()).put(output_itr, os, os.fill(), gw); + else { + custom_date_facet* f = new custom_date_facet(); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(output_itr, os, os.fill(), gw); + } + return os; + } + + //! input operator for greg_weekday + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, greg_weekday& wd) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::date_input_facet date_input_facet; + + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, wd); + } + else { + date_input_facet* f = new date_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, wd); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + + } + } + return is; + } + + //NOTE: output operator for greg_day was not necessary + + //! input operator for greg_day + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, greg_day& gd) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::date_input_facet date_input_facet; + + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, gd); + } + else { + date_input_facet* f = new date_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, gd); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + + } + } + return is; + } + + //NOTE: output operator for greg_year was not necessary + + //! input operator for greg_year + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, greg_year& gy) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::date_input_facet date_input_facet; + + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, gy); + } + else { + date_input_facet* f = new date_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, gy); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + + } + } + return is; + } + + /********** date generator types **********/ + + template + inline std::basic_ostream& + operator<<(std::basic_ostream& os, const boost::gregorian::partial_date& pd) { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::date_facet custom_date_facet; + std::ostreambuf_iterator output_itr(os); + if (std::has_facet(os.getloc())) + std::use_facet(os.getloc()).put(output_itr, os, os.fill(), pd); + else { + custom_date_facet* f = new custom_date_facet(); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(output_itr, os, os.fill(), pd); + } + return os; + } + + //! input operator for partial_date + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, partial_date& pd) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::date_input_facet date_input_facet; + + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, pd); + } + else { + date_input_facet* f = new date_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, pd); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + + } + } + return is; + } + + template + inline std::basic_ostream& + operator<<(std::basic_ostream& os, const boost::gregorian::nth_day_of_the_week_in_month& nkd) { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::date_facet custom_date_facet; + std::ostreambuf_iterator output_itr(os); + if (std::has_facet(os.getloc())) + std::use_facet(os.getloc()).put(output_itr, os, os.fill(), nkd); + else { + custom_date_facet* f = new custom_date_facet(); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(output_itr, os, os.fill(), nkd); + } + return os; + } + + //! input operator for nth_day_of_the_week_in_month + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, + nth_day_of_the_week_in_month& nday) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::date_input_facet date_input_facet; + + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, nday); + } + else { + date_input_facet* f = new date_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, nday); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + + } + } + return is; + } + + + template + inline std::basic_ostream& + operator<<(std::basic_ostream& os, const boost::gregorian::first_day_of_the_week_in_month& fkd) { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::date_facet custom_date_facet; + std::ostreambuf_iterator output_itr(os); + if (std::has_facet(os.getloc())) + std::use_facet(os.getloc()).put(output_itr, os, os.fill(), fkd); + else { + custom_date_facet* f = new custom_date_facet(); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(output_itr, os, os.fill(), fkd); + } + return os; + } + + //! input operator for first_day_of_the_week_in_month + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, + first_day_of_the_week_in_month& fkd) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::date_input_facet date_input_facet; + + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, fkd); + } + else { + date_input_facet* f = new date_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, fkd); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + + } + } + return is; + } + + + template + inline std::basic_ostream& + operator<<(std::basic_ostream& os, const boost::gregorian::last_day_of_the_week_in_month& lkd) { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::date_facet custom_date_facet; + std::ostreambuf_iterator output_itr(os); + if (std::has_facet(os.getloc())) + std::use_facet(os.getloc()).put(output_itr, os, os.fill(), lkd); + else { + custom_date_facet* f = new custom_date_facet(); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(output_itr, os, os.fill(), lkd); + } + return os; + } + + //! input operator for last_day_of_the_week_in_month + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, + last_day_of_the_week_in_month& lkd) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::date_input_facet date_input_facet; + + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, lkd); + } + else { + date_input_facet* f = new date_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, lkd); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + + } + } + return is; + } + + + template + inline std::basic_ostream& + operator<<(std::basic_ostream& os, const boost::gregorian::first_day_of_the_week_after& fda) { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::date_facet custom_date_facet; + std::ostreambuf_iterator output_itr(os); + if (std::has_facet(os.getloc())) { + std::use_facet(os.getloc()).put(output_itr, os, os.fill(), fda); + } + else { + custom_date_facet* f = new custom_date_facet(); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(output_itr, os, os.fill(), fda); + } + return os; + } + + //! input operator for first_day_of_the_week_after + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, + first_day_of_the_week_after& fka) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::date_input_facet date_input_facet; + + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, fka); + } + else { + date_input_facet* f = new date_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, fka); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + + } + } + return is; + } + + + template + inline std::basic_ostream& + operator<<(std::basic_ostream& os, const boost::gregorian::first_day_of_the_week_before& fdb) { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::date_facet custom_date_facet; + std::ostreambuf_iterator output_itr(os); + if (std::has_facet(os.getloc())) { + std::use_facet(os.getloc()).put(output_itr, os, os.fill(), fdb); + } + else { + custom_date_facet* f = new custom_date_facet(); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(output_itr, os, os.fill(), fdb); + } + return os; + } + + //! input operator for first_day_of_the_week_before + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, + first_day_of_the_week_before& fkb) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::date_input_facet date_input_facet; + + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, fkb); + } + else { + date_input_facet* f = new date_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, fkb); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + + } + } + return is; + } + + +} } // namespaces + +#endif // DATE_TIME_GREGORIAN_IO_HPP__ diff --git a/boost/date_time/period_formatter.hpp b/boost/date_time/period_formatter.hpp new file mode 100644 index 000000000..0cce32a68 --- /dev/null +++ b/boost/date_time/period_formatter.hpp @@ -0,0 +1,196 @@ + +#ifndef DATETIME_PERIOD_FORMATTER_HPP___ +#define DATETIME_PERIOD_FORMATTER_HPP___ + +/* Copyright (c) 2002-2004 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + + + +namespace boost { namespace date_time { + + + //! Not a facet, but a class used to specify and control period formats + /*! Provides settings for the following: + * - period_separator -- default '/' + * - period_open_start_delimeter -- default '[' + * - period_open_range_end_delimeter -- default ')' + * - period_closed_range_end_delimeter -- default ']' + * - display_as_open_range, display_as_closed_range -- default closed_range + * + * Thus the default formatting for a period is as follows: + *@code + * [period.start()/period.last()] + *@endcode + * So for a typical date_period this would be + *@code + * [2004-Jan-04/2004-Feb-01] + *@endcode + * where the date formatting is controlled by the date facet + */ + template > > + class period_formatter { + public: + typedef std::basic_string string_type; + typedef CharT char_type; + typedef typename std::basic_string::const_iterator const_itr_type; + typedef std::vector > collection_type; + + static const char_type default_period_separator[2]; + static const char_type default_period_start_delimeter[2]; + static const char_type default_period_open_range_end_delimeter[2]; + static const char_type default_period_closed_range_end_delimeter[2]; + + enum range_display_options { AS_OPEN_RANGE, AS_CLOSED_RANGE }; + + //! Constructor that sets up period formatter options -- default should suffice most cases. + period_formatter(range_display_options range_option_in = AS_CLOSED_RANGE, + const char_type* const period_separator = default_period_separator, + const char_type* const period_start_delimeter = default_period_start_delimeter, + const char_type* const period_open_range_end_delimeter = default_period_open_range_end_delimeter, + const char_type* const period_closed_range_end_delimeter = default_period_closed_range_end_delimeter) : + m_range_option(range_option_in), + m_period_separator(period_separator), + m_period_start_delimeter(period_start_delimeter), + m_open_range_end_delimeter(period_open_range_end_delimeter), + m_closed_range_end_delimeter(period_closed_range_end_delimeter) + {} + + //! Puts the characters between period elements into stream -- default is / + OutItrT put_period_separator(OutItrT& oitr) const + { + const_itr_type ci = m_period_separator.begin(); + while (ci != m_period_separator.end()) { + *oitr = *ci; + ci++; + } + return oitr; + } + + //! Puts the period start characters into stream -- default is [ + OutItrT put_period_start_delimeter(OutItrT& oitr) const + { + const_itr_type ci = m_period_start_delimeter.begin(); + while (ci != m_period_start_delimeter.end()) { + *oitr = *ci; + ci++; + } + return oitr; + } + + //! Puts the period end characters into stream as controled by open/closed range setting. + OutItrT put_period_end_delimeter(OutItrT& oitr) const + { + + const_itr_type ci, end; + if (m_range_option == AS_OPEN_RANGE) { + ci = m_open_range_end_delimeter.begin(); + end = m_open_range_end_delimeter.end(); + } + else { + ci = m_closed_range_end_delimeter.begin(); + end = m_closed_range_end_delimeter.end(); + } + while (ci != end) { + *oitr = *ci; + ci++; + } + return oitr; + } + + range_display_options range_option() const + { + return m_range_option; + } + + //! Reset the range_option control + void + range_option(range_display_options option) const + { + m_range_option = option; + } + void delimiter_strings(const string_type& , + const string_type& , + const string_type& , + const string_type& ) + { + m_period_separator; + m_period_start_delimeter; + m_open_range_end_delimeter; + m_closed_range_end_delimeter; + } + + + //! Generic code to output a period -- no matter the period type. + /*! This generic code will output any period using a facet to + * to output the 'elements'. For example, in the case of a date_period + * the elements will be instances of a date which will be formatted + * according the to setup in the passed facet parameter. + * + * The steps for formatting a period are always the same: + * - put the start delimiter + * - put start element + * - put the separator + * - put either last or end element depending on range settings + * - put end delimeter depending on range settings + * + * Thus for a typical date period the result might look like this: + *@code + * + * [March 01, 2004/June 07, 2004] <-- closed range + * [March 01, 2004/June 08, 2004) <-- open range + * + *@endcode + */ + template + OutItrT put_period(OutItrT next, + std::ios_base& a_ios, + char_type a_fill, + const period_type& p, + const facet_type& facet) const { + put_period_start_delimeter(next); + next = facet.put(next, a_ios, a_fill, p.begin()); + put_period_separator(next); + if (m_range_option == AS_CLOSED_RANGE) { + facet.put(next, a_ios, a_fill, p.last()); + } + else { + facet.put(next, a_ios, a_fill, p.end()); + } + put_period_end_delimeter(next); + return next; + } + + + private: + range_display_options m_range_option; + string_type m_period_separator; + string_type m_period_start_delimeter; + string_type m_open_range_end_delimeter; + string_type m_closed_range_end_delimeter; + }; + + template + const typename period_formatter::char_type + period_formatter::default_period_separator[2] = {'/'}; + + template + const typename period_formatter::char_type + period_formatter::default_period_start_delimeter[2] = {'['}; + + template + const typename period_formatter::char_type + period_formatter::default_period_open_range_end_delimeter[2] = {')'}; + + template + const typename period_formatter::char_type + period_formatter::default_period_closed_range_end_delimeter[2] = {']'}; + + } } //namespace boost::date_time + +#endif diff --git a/boost/date_time/period_parser.hpp b/boost/date_time/period_parser.hpp new file mode 100644 index 000000000..837423489 --- /dev/null +++ b/boost/date_time/period_parser.hpp @@ -0,0 +1,198 @@ + +#ifndef DATETIME_PERIOD_PARSER_HPP___ +#define DATETIME_PERIOD_PARSER_HPP___ + +/* Copyright (c) 2002-2004 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + +#include +#include +#include + + +namespace boost { namespace date_time { + + + //! Not a facet, but a class used to specify and control period parsing + /*! Provides settings for the following: + * - period_separator -- default '/' + * - period_open_start_delimeter -- default '[' + * - period_open_range_end_delimeter -- default ')' + * - period_closed_range_end_delimeter -- default ']' + * - display_as_open_range, display_as_closed_range -- default closed_range + * + * For a typical date_period, the contents of the input stream would be + *@code + * [2004-Jan-04/2004-Feb-01] + *@endcode + * where the date format is controlled by the date facet + */ + template + class period_parser { + public: + typedef std::basic_string string_type; + typedef CharT char_type; + //typedef typename std::basic_string::const_iterator const_itr_type; + typedef std::istreambuf_iterator stream_itr_type; + typedef string_parse_tree parse_tree_type; + typedef typename parse_tree_type::parse_match_result_type match_results; + typedef std::vector > collection_type; + + static const char_type default_period_separator[2]; + static const char_type default_period_start_delimeter[2]; + static const char_type default_period_open_range_end_delimeter[2]; + static const char_type default_period_closed_range_end_delimeter[2]; + + enum period_range_option { AS_OPEN_RANGE, AS_CLOSED_RANGE }; + + //! Constructor that sets up period parser options + period_parser(period_range_option range_opt = AS_CLOSED_RANGE, + const char_type* const period_separator = default_period_separator, + const char_type* const period_start_delimeter = default_period_start_delimeter, + const char_type* const period_open_range_end_delimeter = default_period_open_range_end_delimeter, + const char_type* const period_closed_range_end_delimeter = default_period_closed_range_end_delimeter) + : m_range_option(range_opt) + { + delimiters.push_back(string_type(period_separator)); + delimiters.push_back(string_type(period_start_delimeter)); + delimiters.push_back(string_type(period_open_range_end_delimeter)); + delimiters.push_back(string_type(period_closed_range_end_delimeter)); + } + + period_parser(const period_parser& p_parser) + { + this->delimiters = p_parser.delimiters; + this->m_range_option = p_parser.m_range_option; + } + + period_range_option range_option() const + { + return m_range_option; + } + void range_option(period_range_option option) + { + m_range_option = option; + } + collection_type delimiter_strings() const + { + return delimiters; + } + void delimiter_strings(const string_type& separator, + const string_type& start_delim, + const string_type& open_end_delim, + const string_type& closed_end_delim) + { + delimiters.clear(); + delimiters.push_back(separator); + delimiters.push_back(start_delim); + delimiters.push_back(open_end_delim); + delimiters.push_back(closed_end_delim); + } + + //! Generic code to parse a period -- no matter the period type. + /*! This generic code will parse any period using a facet to + * to get the 'elements'. For example, in the case of a date_period + * the elements will be instances of a date which will be parsed + * according the to setup in the passed facet parameter. + * + * The steps for parsing a period are always the same: + * - consume the start delimiter + * - get start element + * - consume the separator + * - get either last or end element depending on range settings + * - consume the end delimeter depending on range settings + * + * Thus for a typical date period the contents of the input stream + * might look like this: + *@code + * + * [March 01, 2004/June 07, 2004] <-- closed range + * [March 01, 2004/June 08, 2004) <-- open range + * + *@endcode + */ + template + period_type get_period(stream_itr_type& sitr, + stream_itr_type& stream_end, + std::ios_base& a_ios, + const period_type& /* p */, + const duration_type& dur_unit, + const facet_type& facet) const + { + // skip leading whitespace + while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } + + typedef typename period_type::point_type point_type; + point_type p1(not_a_date_time), p2(not_a_date_time); + + + consume_delim(sitr, stream_end, delimiters[START]); // start delim + facet.get(sitr, stream_end, a_ios, p1); // first point + consume_delim(sitr, stream_end, delimiters[SEPARATOR]); // separator + facet.get(sitr, stream_end, a_ios, p2); // second point + + // period construction parameters are always open range [begin, end) + if (m_range_option == AS_CLOSED_RANGE) { + consume_delim(sitr, stream_end, delimiters[CLOSED_END]);// end delim + // add 1 duration unit to p2 to make range open + p2 += dur_unit; + } + else { + consume_delim(sitr, stream_end, delimiters[OPEN_END]); // end delim + } + + return period_type(p1, p2); + } + + private: + collection_type delimiters; + period_range_option m_range_option; + + enum delim_ids { SEPARATOR, START, OPEN_END, CLOSED_END }; + + //! throws ios_base::failure if delimiter and parsed data do not match + void consume_delim(stream_itr_type& sitr, + stream_itr_type& stream_end, + const string_type& delim) const + { + /* string_parse_tree will not parse a string of punctuation characters + * without knowing exactly how many characters to process + * Ex [2000. Will not parse out the '[' string without knowing + * to process only one character. By using length of the delimiter + * string we can safely iterate past it. */ + string_type s; + for(unsigned int i = 0; i < delim.length() && sitr != stream_end; ++i) { + s += *sitr; + ++sitr; + } + if(s != delim) { + boost::throw_exception(std::ios_base::failure("Parse failed. Expected '" + + convert_string_type(delim) + "' but found '" + convert_string_type(s) + "'")); + } + } + }; + + template + const typename period_parser::char_type + period_parser::default_period_separator[2] = {'/'}; + + template + const typename period_parser::char_type + period_parser::default_period_start_delimeter[2] = {'['}; + + template + const typename period_parser::char_type + period_parser::default_period_open_range_end_delimeter[2] = {')'}; + + template + const typename period_parser::char_type + period_parser::default_period_closed_range_end_delimeter[2] = {']'}; + + } } //namespace boost::date_time + +#endif // DATETIME_PERIOD_PARSER_HPP___ diff --git a/boost/date_time/posix_time/posix_time.hpp b/boost/date_time/posix_time/posix_time.hpp new file mode 100644 index 000000000..aecf8a818 --- /dev/null +++ b/boost/date_time/posix_time/posix_time.hpp @@ -0,0 +1,39 @@ +#ifndef POSIX_TIME_HPP___ +#define POSIX_TIME_HPP___ + +/* Copyright (c) 2002-2005 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ +/*!@file posix_time.hpp Global header file to get all of posix time types + */ + +#include "boost/date_time/compiler_config.hpp" +#include "boost/date_time/posix_time/ptime.hpp" +#if defined(BOOST_DATE_TIME_OPTIONAL_GREGORIAN_TYPES) +#include "boost/date_time/posix_time/date_duration_operators.hpp" +#endif + +// output functions +#if defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS) +#include "boost/date_time/posix_time/time_formatters_limited.hpp" +#else +#include "boost/date_time/posix_time/time_formatters.hpp" +#endif // BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS + +// streaming operators +#if defined(USE_DATE_TIME_PRE_1_33_FACET_IO) +#include "boost/date_time/posix_time/posix_time_legacy_io.hpp" +#else +#include "boost/date_time/posix_time/posix_time_io.hpp" +#endif // USE_DATE_TIME_PRE_1_33_FACET_IO + +#include "boost/date_time/posix_time/time_parsers.hpp" +#include "boost/date_time/posix_time/conversion.hpp" + + +#endif + diff --git a/boost/date_time/posix_time/posix_time_io.hpp b/boost/date_time/posix_time/posix_time_io.hpp new file mode 100644 index 000000000..45c338b22 --- /dev/null +++ b/boost/date_time/posix_time/posix_time_io.hpp @@ -0,0 +1,236 @@ +#ifndef DATE_TIME_POSIX_TIME_IO_HPP__ +#define DATE_TIME_POSIX_TIME_IO_HPP__ + +/* Copyright (c) 2004-2005 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + +#include +#include +#include // i/ostreambuf_iterator +#include +#include +#include +#include +#include +#include +#include // to_tm will be needed in the facets + +namespace boost { +namespace posix_time { + + + //! wptime_facet is depricated and will be phased out. use wtime_facet instead + //typedef boost::date_time::time_facet wptime_facet; + //! ptime_facet is depricated and will be phased out. use time_facet instead + //typedef boost::date_time::time_facet ptime_facet; + + //! wptime_input_facet is depricated and will be phased out. use wtime_input_facet instead + //typedef boost::date_time::time_input_facet wptime_input_facet; + //! ptime_input_facet is depricated and will be phased out. use time_input_facet instead + //typedef boost::date_time::time_input_facet ptime_input_facet; + + typedef boost::date_time::time_facet wtime_facet; + typedef boost::date_time::time_facet time_facet; + + typedef boost::date_time::time_input_facet wtime_input_facet; + typedef boost::date_time::time_input_facet time_input_facet; + + template + inline + std::basic_ostream& + operator<<(std::basic_ostream& os, + const ptime& p) { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::time_facet custom_ptime_facet; + std::ostreambuf_iterator oitr(os); + if (std::has_facet(os.getloc())) + std::use_facet(os.getloc()).put(oitr, os, os.fill(), p); + else { + //instantiate a custom facet for dealing with times since the user + //has not put one in the stream so far. This is for efficiency + //since we would always need to reconstruct for every time period + //if the locale did not already exist. Of course this will be overridden + //if the user imbues as some later point. + custom_ptime_facet* f = new custom_ptime_facet(); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(oitr, os, os.fill(), p); + } + return os; + } + + //! input operator for ptime + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, ptime& pt) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::time_input_facet time_input_facet; + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, pt); + } + else { + time_input_facet* f = new time_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, pt); + } + } + catch(...) { + // mask tells us what exceptions are turned on + std::ios_base::iostate exception_mask = is.exceptions(); + // if the user wants exceptions on failbit, we'll rethrow our + // date_time exception & set the failbit + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} // ignore this one + throw; // rethrow original exception + } + else { + // if the user want's to fail quietly, we simply set the failbit + is.setstate(std::ios_base::failbit); + } + } + } + return is; + } + + + template + inline + std::basic_ostream& + operator<<(std::basic_ostream& os, + const boost::posix_time::time_period& p) { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::time_facet custom_ptime_facet; + std::ostreambuf_iterator oitr(os); + if (std::has_facet(os.getloc())) { + std::use_facet(os.getloc()).put(oitr, os, os.fill(), p); + } + else { + //instantiate a custom facet for dealing with periods since the user + //has not put one in the stream so far. This is for efficiency + //since we would always need to reconstruct for every time period + //if the local did not already exist. Of course this will be overridden + //if the user imbues as some later point. + custom_ptime_facet* f = new custom_ptime_facet(); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(oitr, os, os.fill(), p); + } + return os; + } + + //! input operator for time_period + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, time_period& tp) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::time_input_facet time_input_facet; + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, tp); + } + else { + time_input_facet* f = new time_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, tp); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + } + } + return is; + } + + + //! ostream operator for posix_time::time_duration + // todo fix to use facet -- place holder for now... + template + inline + std::basic_ostream& + operator<<(std::basic_ostream& os, const time_duration& td) + { + boost::io::ios_flags_saver iflags(os); + typedef boost::date_time::time_facet custom_ptime_facet; + std::ostreambuf_iterator oitr(os); + if (std::has_facet(os.getloc())) + std::use_facet(os.getloc()).put(oitr, os, os.fill(), td); + else { + //instantiate a custom facet for dealing with times since the user + //has not put one in the stream so far. This is for efficiency + //since we would always need to reconstruct for every time period + //if the locale did not already exist. Of course this will be overridden + //if the user imbues as some later point. + custom_ptime_facet* f = new custom_ptime_facet(); + std::locale l = std::locale(os.getloc(), f); + os.imbue(l); + f->put(oitr, os, os.fill(), td); + } + return os; + } + + //! input operator for time_duration + template + inline + std::basic_istream& + operator>>(std::basic_istream& is, time_duration& td) + { + boost::io::ios_flags_saver iflags(is); + typename std::basic_istream::sentry strm_sentry(is, false); + if (strm_sentry) { + try { + typedef typename date_time::time_input_facet time_input_facet; + std::istreambuf_iterator sit(is), str_end; + if(std::has_facet(is.getloc())) { + std::use_facet(is.getloc()).get(sit, str_end, is, td); + } + else { + time_input_facet* f = new time_input_facet(); + std::locale l = std::locale(is.getloc(), f); + is.imbue(l); + f->get(sit, str_end, is, td); + } + } + catch(...) { + std::ios_base::iostate exception_mask = is.exceptions(); + if(std::ios_base::failbit & exception_mask) { + try { is.setstate(std::ios_base::failbit); } + catch(std::ios_base::failure&) {} + throw; // rethrow original exception + } + else { + is.setstate(std::ios_base::failbit); + } + } + } + return is; + } + +} } // namespaces +#endif // DATE_TIME_POSIX_TIME_IO_HPP__ diff --git a/boost/date_time/posix_time/posix_time_legacy_io.hpp b/boost/date_time/posix_time/posix_time_legacy_io.hpp new file mode 100644 index 000000000..b31fb9872 --- /dev/null +++ b/boost/date_time/posix_time/posix_time_legacy_io.hpp @@ -0,0 +1,153 @@ +#ifndef POSIX_TIME_PRE133_OPERATORS_HPP___ +#define POSIX_TIME_PRE133_OPERATORS_HPP___ + +/* Copyright (c) 2002-2004 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + +/*! @file posix_time_pre133_operators.hpp + * These input and output operators are for use with the + * pre 1.33 version of the date_time libraries io facet code. + * The operators used in version 1.33 and later can be found + * in posix_time_io.hpp */ + +#include +#include +#include +#include "boost/date_time/compiler_config.hpp" +#include "boost/date_time/gregorian/gregorian.hpp" +#include "boost/date_time/posix_time/posix_time_duration.hpp" +#include "boost/date_time/posix_time/ptime.hpp" +#include "boost/date_time/posix_time/time_period.hpp" +#include "boost/date_time/time_parsing.hpp" + +namespace boost { +namespace posix_time { + + +//The following code is removed for configurations with poor std::locale support (eg: MSVC6, gcc 2.9x) +#ifndef BOOST_DATE_TIME_NO_LOCALE +#if defined(USE_DATE_TIME_PRE_1_33_FACET_IO) + //! ostream operator for posix_time::time_duration + template + inline + std::basic_ostream& + operator<<(std::basic_ostream& os, const time_duration& td) + { + typedef boost::date_time::ostream_time_duration_formatter duration_formatter; + duration_formatter::duration_put(td, os); + return os; + } + + //! ostream operator for posix_time::ptime + template + inline + std::basic_ostream& + operator<<(std::basic_ostream& os, const ptime& t) + { + typedef boost::date_time::ostream_time_formatter time_formatter; + time_formatter::time_put(t, os); + return os; + } + + //! ostream operator for posix_time::time_period + template + inline + std::basic_ostream& + operator<<(std::basic_ostream& os, const time_period& tp) + { + typedef boost::date_time::ostream_time_period_formatter period_formatter; + period_formatter::period_put(tp, os); + return os; + } +#endif // USE_DATE_TIME_PRE_1_33_FACET_IO +/******** input streaming ********/ + template + inline + std::basic_istream& operator>>(std::basic_istream& is, time_duration& td) + { + // need to create a std::string and parse it + std::basic_string inp_s; + std::stringstream out_ss; + is >> inp_s; + typename std::basic_string::iterator b = inp_s.begin(); + // need to use both iterators because there is no requirement + // for the data held by a std::basic_string<> be terminated with + // any marker (such as '\0'). + typename std::basic_string::iterator e = inp_s.end(); + while(b != e){ + out_ss << is.narrow(*b, 0); + ++b; + } + + td = date_time::parse_delimited_time_duration(out_ss.str()); + return is; + } + + template + inline + std::basic_istream& operator>>(std::basic_istream& is, ptime& pt) + { + gregorian::date d(not_a_date_time); + time_duration td(0,0,0); + is >> d >> td; + pt = ptime(d, td); + + return is; + } + + /** operator>> for time_period. time_period must be in + * "[date time_duration/date time_duration]" format. */ + template + inline + std::basic_istream& operator>>(std::basic_istream& is, time_period& tp) + { + gregorian::date d(not_a_date_time); + time_duration td(0,0,0); + ptime beg(d, td); + ptime end(beg); + std::basic_string s; + // get first date string and remove leading '[' + is >> s; + { + std::basic_stringstream ss; + ss << s.substr(s.find('[')+1); + ss >> d; + } + // get first time_duration & second date string, remove the '/' + // and split into 2 strings + is >> s; + { + std::basic_stringstream ss; + ss << s.substr(0, s.find('/')); + ss >> td; + } + beg = ptime(d, td); + { + std::basic_stringstream ss; + ss << s.substr(s.find('/')+1); + ss >> d; + } + // get last time_duration and remove the trailing ']' + is >> s; + { + std::basic_stringstream ss; + ss << s.substr(0, s.find(']')); + ss >> td; + } + end = ptime(d, td); + + tp = time_period(beg,end); + return is; + } + + +#endif //BOOST_DATE_TIME_NO_LOCALE + +} } // namespaces + +#endif // POSIX_TIME_PRE133_OPERATORS_HPP___ diff --git a/boost/date_time/posix_time/time_formatters.hpp b/boost/date_time/posix_time/time_formatters.hpp new file mode 100644 index 000000000..ce1956822 --- /dev/null +++ b/boost/date_time/posix_time/time_formatters.hpp @@ -0,0 +1,289 @@ +#ifndef POSIXTIME_FORMATTERS_HPP___ +#define POSIXTIME_FORMATTERS_HPP___ + +/* Copyright (c) 2002-2004 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + +#include +#include +#include +#include +#include +#include +#include // absolute_value +#include + +/* NOTE: The "to_*_string" code for older compilers, ones that define + * BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS, is located in + * formatters_limited.hpp + */ + +namespace boost { + +namespace posix_time { + + // template function called by wrapper functions: + // to_*_string(time_duration) & to_*_wstring(time_duration) + template + inline std::basic_string to_simple_string_type(time_duration td) { + std::basic_ostringstream ss; + if(td.is_special()) { + /* simply using 'ss << td.get_rep()' won't work on compilers + * that don't support locales. This way does. */ + // switch copied from date_names_put.hpp + switch(td.get_rep().as_special()) + { + case not_a_date_time: + //ss << "not-a-number"; + ss << "not-a-date-time"; + break; + case pos_infin: + ss << "+infinity"; + break; + case neg_infin: + ss << "-infinity"; + break; + default: + ss << ""; + } + } + else { + charT fill_char = '0'; + if(td.is_negative()) { + ss << '-'; + } + ss << std::setw(2) << std::setfill(fill_char) + << date_time::absolute_value(td.hours()) << ":"; + ss << std::setw(2) << std::setfill(fill_char) + << date_time::absolute_value(td.minutes()) << ":"; + ss << std::setw(2) << std::setfill(fill_char) + << date_time::absolute_value(td.seconds()); + //TODO the following is totally non-generic, yelling FIXME +#if (defined(BOOST_MSVC) && (_MSC_VER < 1300)) + boost::int64_t frac_sec = + date_time::absolute_value(td.fractional_seconds()); + // JDG [7/6/02 VC++ compatibility] + charT buff[32]; + _i64toa(frac_sec, buff, 10); +#else + time_duration::fractional_seconds_type frac_sec = + date_time::absolute_value(td.fractional_seconds()); +#endif + if (frac_sec != 0) { + ss << "." << std::setw(time_duration::num_fractional_digits()) + << std::setfill(fill_char) + + // JDG [7/6/02 VC++ compatibility] +#if (defined(BOOST_MSVC) && (_MSC_VER < 1300)) + << buff; +#else + << frac_sec; +#endif + } + }// else + return ss.str(); + } + //! Time duration to string -hh::mm::ss.fffffff. Example: 10:09:03.0123456 + /*!\ingroup time_format + */ + inline std::string to_simple_string(time_duration td) { + return to_simple_string_type(td); + } + + + // template function called by wrapper functions: + // to_*_string(time_duration) & to_*_wstring(time_duration) + template + inline std::basic_string to_iso_string_type(time_duration td) + { + std::basic_ostringstream ss; + if(td.is_special()) { + /* simply using 'ss << td.get_rep()' won't work on compilers + * that don't support locales. This way does. */ + // switch copied from date_names_put.hpp + switch(td.get_rep().as_special()) { + case not_a_date_time: + //ss << "not-a-number"; + ss << "not-a-date-time"; + break; + case pos_infin: + ss << "+infinity"; + break; + case neg_infin: + ss << "-infinity"; + break; + default: + ss << ""; + } + } + else { + charT fill_char = '0'; + if(td.is_negative()) { + ss << '-'; + } + ss << std::setw(2) << std::setfill(fill_char) + << date_time::absolute_value(td.hours()); + ss << std::setw(2) << std::setfill(fill_char) + << date_time::absolute_value(td.minutes()); + ss << std::setw(2) << std::setfill(fill_char) + << date_time::absolute_value(td.seconds()); + //TODO the following is totally non-generic, yelling FIXME +#if (defined(BOOST_MSVC) && (_MSC_VER < 1300)) + boost::int64_t frac_sec = + date_time::absolute_value(td.fractional_seconds()); + // JDG [7/6/02 VC++ compatibility] + charT buff[32]; + _i64toa(frac_sec, buff, 10); +#else + time_duration::fractional_seconds_type frac_sec = + date_time::absolute_value(td.fractional_seconds()); +#endif + if (frac_sec != 0) { + ss << "." << std::setw(time_duration::num_fractional_digits()) + << std::setfill(fill_char) + + // JDG [7/6/02 VC++ compatibility] +#if (defined(BOOST_MSVC) && (_MSC_VER < 1300)) + << buff; +#else + << frac_sec; +#endif + } + }// else + return ss.str(); + } + //! Time duration in iso format -hhmmss,fffffff Example: 10:09:03,0123456 + /*!\ingroup time_format + */ + inline std::string to_iso_string(time_duration td){ + return to_iso_string_type(td); + } + + //! Time to simple format CCYY-mmm-dd hh:mm:ss.fffffff + /*!\ingroup time_format + */ + template + inline std::basic_string to_simple_string_type(ptime t) + { + // can't use this w/gcc295, no to_simple_string_type<>(td) available + std::basic_string ts = gregorian::to_simple_string_type(t.date());// + " "; + if(!t.time_of_day().is_special()) { + charT space = ' '; + return ts + space + to_simple_string_type(t.time_of_day()); + } + else { + return ts; + } + } + inline std::string to_simple_string(ptime t){ + return to_simple_string_type(t); + } + + // function called by wrapper functions to_*_string(time_period) + // & to_*_wstring(time_period) + template + inline std::basic_string to_simple_string_type(time_period tp) + { + charT beg = '[', mid = '/', end = ']'; + std::basic_string d1(to_simple_string_type(tp.begin())); + std::basic_string d2(to_simple_string_type(tp.last())); + return std::basic_string(beg + d1 + mid + d2 + end); + } + //! Convert to string of form [YYYY-mmm-DD HH:MM::SS.ffffff/YYYY-mmm-DD HH:MM::SS.fffffff] + /*!\ingroup time_format + */ + inline std::string to_simple_string(time_period tp){ + return to_simple_string_type(tp); + } + + // function called by wrapper functions to_*_string(time_period) + // & to_*_wstring(time_period) + template + inline std::basic_string to_iso_string_type(ptime t) + { + std::basic_string ts = gregorian::to_iso_string_type(t.date());// + "T"; + if(!t.time_of_day().is_special()) { + charT sep = 'T'; + return ts + sep + to_iso_string_type(t.time_of_day()); + } + else { + return ts; + } + } + //! Convert iso short form YYYYMMDDTHHMMSS where T is the date-time separator + /*!\ingroup time_format + */ + inline std::string to_iso_string(ptime t){ + return to_iso_string_type(t); + } + + + // function called by wrapper functions to_*_string(time_period) + // & to_*_wstring(time_period) + template + inline std::basic_string to_iso_extended_string_type(ptime t) + { + std::basic_string ts = gregorian::to_iso_extended_string_type(t.date());// + "T"; + if(!t.time_of_day().is_special()) { + charT sep = 'T'; + return ts + sep + to_simple_string_type(t.time_of_day()); + } + else { + return ts; + } + } + //! Convert to form YYYY-MM-DDTHH:MM:SS where T is the date-time separator + /*!\ingroup time_format + */ + inline std::string to_iso_extended_string(ptime t){ + return to_iso_extended_string_type(t); + } + +#if !defined(BOOST_NO_STD_WSTRING) + //! Time duration to wstring -hh::mm::ss.fffffff. Example: 10:09:03.0123456 + /*!\ingroup time_format + */ + inline std::wstring to_simple_wstring(time_duration td) { + return to_simple_string_type(td); + } + //! Time duration in iso format -hhmmss,fffffff Example: 10:09:03,0123456 + /*!\ingroup time_format + */ + inline std::wstring to_iso_wstring(time_duration td){ + return to_iso_string_type(td); + } + inline std::wstring to_simple_wstring(ptime t){ + return to_simple_string_type(t); + } + //! Convert to wstring of form [YYYY-mmm-DD HH:MM::SS.ffffff/YYYY-mmm-DD HH:MM::SS.fffffff] + /*!\ingroup time_format + */ + inline std::wstring to_simple_wstring(time_period tp){ + return to_simple_string_type(tp); + } + //! Convert iso short form YYYYMMDDTHHMMSS where T is the date-time separator + /*!\ingroup time_format + */ + inline std::wstring to_iso_wstring(ptime t){ + return to_iso_string_type(t); + } + //! Convert to form YYYY-MM-DDTHH:MM:SS where T is the date-time separator + /*!\ingroup time_format + */ + inline std::wstring to_iso_extended_wstring(ptime t){ + return to_iso_extended_string_type(t); + } + +#endif // BOOST_NO_STD_WSTRING + + +} } //namespace posix_time + + +#endif + diff --git a/boost/date_time/posix_time/time_formatters_limited.hpp b/boost/date_time/posix_time/time_formatters_limited.hpp new file mode 100644 index 000000000..c74fcfa0b --- /dev/null +++ b/boost/date_time/posix_time/time_formatters_limited.hpp @@ -0,0 +1,212 @@ +#ifndef POSIXTIME_FORMATTERS_LIMITED_HPP___ +#define POSIXTIME_FORMATTERS_LIMITED_HPP___ + +/* Copyright (c) 2002,2003 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + +#include +#include +#include +#include +#include +#include +#include // absolute_value + +namespace boost { + +namespace posix_time { + + //! Time duration to string -hh::mm::ss.fffffff. Example: 10:09:03.0123456 + /*!\ingroup time_format + */ + inline std::string to_simple_string(time_duration td) { + std::ostringstream ss; + if(td.is_special()) { + /* simply using 'ss << td.get_rep()' won't work on compilers + * that don't support locales. This way does. */ + // switch copied from date_names_put.hpp + switch(td.get_rep().as_special()) + { + case not_a_date_time: + //ss << "not-a-number"; + ss << "not-a-date-time"; + break; + case pos_infin: + ss << "+infinity"; + break; + case neg_infin: + ss << "-infinity"; + break; + default: + ss << ""; + } + } + else { + if(td.is_negative()) { + ss << '-'; + } + ss << std::setw(2) << std::setfill('0') + << date_time::absolute_value(td.hours()) << ":"; + ss << std::setw(2) << std::setfill('0') + << date_time::absolute_value(td.minutes()) << ":"; + ss << std::setw(2) << std::setfill('0') + << date_time::absolute_value(td.seconds()); + //TODO the following is totally non-generic, yelling FIXME +#if (defined(BOOST_MSVC) && (_MSC_VER < 1300)) + boost::int64_t frac_sec = + date_time::absolute_value(td.fractional_seconds()); + // JDG [7/6/02 VC++ compatibility] + char buff[32]; + _i64toa(frac_sec, buff, 10); +#else + time_duration::fractional_seconds_type frac_sec = + date_time::absolute_value(td.fractional_seconds()); +#endif + if (frac_sec != 0) { + ss << "." << std::setw(time_duration::num_fractional_digits()) + << std::setfill('0') + + // JDG [7/6/02 VC++ compatibility] +#if (defined(BOOST_MSVC) && (_MSC_VER < 1300)) + << buff; +#else + << frac_sec; +#endif + } + }// else + return ss.str(); + } + + //! Time duration in iso format -hhmmss,fffffff Example: 10:09:03,0123456 + /*!\ingroup time_format + */ + inline + std::string + to_iso_string(time_duration td) + { + std::ostringstream ss; + if(td.is_special()) { + /* simply using 'ss << td.get_rep()' won't work on compilers + * that don't support locales. This way does. */ + // switch copied from date_names_put.hpp + switch(td.get_rep().as_special()) { + case not_a_date_time: + //ss << "not-a-number"; + ss << "not-a-date-time"; + break; + case pos_infin: + ss << "+infinity"; + break; + case neg_infin: + ss << "-infinity"; + break; + default: + ss << ""; + } + } + else { + if(td.is_negative()) { + ss << '-'; + } + ss << std::setw(2) << std::setfill('0') + << date_time::absolute_value(td.hours()); + ss << std::setw(2) << std::setfill('0') + << date_time::absolute_value(td.minutes()); + ss << std::setw(2) << std::setfill('0') + << date_time::absolute_value(td.seconds()); + //TODO the following is totally non-generic, yelling FIXME +#if (defined(BOOST_MSVC) && (_MSC_VER < 1300)) + boost::int64_t frac_sec = + date_time::absolute_value(td.fractional_seconds()); + // JDG [7/6/02 VC++ compatibility] + char buff[32]; + _i64toa(frac_sec, buff, 10); +#else + time_duration::fractional_seconds_type frac_sec = + date_time::absolute_value(td.fractional_seconds()); +#endif + if (frac_sec != 0) { + ss << "." << std::setw(time_duration::num_fractional_digits()) + << std::setfill('0') + + // JDG [7/6/02 VC++ compatibility] +#if (defined(BOOST_MSVC) && (_MSC_VER < 1300)) + << buff; +#else + << frac_sec; +#endif + } + }// else + return ss.str(); + } + + //! Time to simple format CCYY-mmm-dd hh:mm:ss.fffffff + /*!\ingroup time_format + */ + inline + std::string + to_simple_string(ptime t) + { + std::string ts = gregorian::to_simple_string(t.date());// + " "; + if(!t.time_of_day().is_special()) { + return ts + " " + to_simple_string(t.time_of_day()); + } + else { + return ts; + } + } + + //! Convert to string of form [YYYY-mmm-DD HH:MM::SS.ffffff/YYYY-mmm-DD HH:MM::SS.fffffff] + /*!\ingroup time_format + */ + inline + std::string + to_simple_string(time_period tp) + { + std::string d1(to_simple_string(tp.begin())); + std::string d2(to_simple_string(tp.last())); + return std::string("[" + d1 + "/" + d2 +"]"); + } + + //! Convert iso short form YYYYMMDDTHHMMSS where T is the date-time separator + /*!\ingroup time_format + */ + inline + std::string to_iso_string(ptime t) + { + std::string ts = gregorian::to_iso_string(t.date());// + "T"; + if(!t.time_of_day().is_special()) { + return ts + "T" + to_iso_string(t.time_of_day()); + } + else { + return ts; + } + } + + //! Convert to form YYYY-MM-DDTHH:MM:SS where T is the date-time separator + /*!\ingroup time_format + */ + inline + std::string + to_iso_extended_string(ptime t) + { + std::string ts = gregorian::to_iso_extended_string(t.date());// + "T"; + if(!t.time_of_day().is_special()) { + return ts + "T" + to_simple_string(t.time_of_day()); + } + else { + return ts; + } + } + + +} } //namespace posix_time + + +#endif + diff --git a/boost/date_time/posix_time/time_parsers.hpp b/boost/date_time/posix_time/time_parsers.hpp new file mode 100644 index 000000000..24f20704a --- /dev/null +++ b/boost/date_time/posix_time/time_parsers.hpp @@ -0,0 +1,48 @@ +#ifndef POSIXTIME_PARSERS_HPP___ +#define POSIXTIME_PARSERS_HPP___ + +/* Copyright (c) 2002,2003 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland + * $Date$ + */ + +#include "boost/date_time/gregorian/gregorian.hpp" +#include "boost/date_time/time_parsing.hpp" +#include "boost/date_time/posix_time/posix_time_types.hpp" + + +namespace boost { + +namespace posix_time { + + //! Creates a time_duration object from a delimited string + /*! Expected format for string is "[-]h[h][:mm][:ss][.fff]". + * A negative duration will be created if the first character in + * string is a '-', all other '-' will be treated as delimiters. + * Accepted delimiters are "-:,.". */ + inline time_duration duration_from_string(const std::string& s) { + return date_time::parse_delimited_time_duration(s); + } + + inline ptime time_from_string(const std::string& s) { + return date_time::parse_delimited_time(s, ' '); + } + + inline ptime from_iso_string(const std::string& s) { + return date_time::parse_iso_time(s, 'T'); + } + + inline ptime from_iso_extended_string(const std::string& s) { + return date_time::parse_delimited_time(s, 'T'); + } + + + +} } //namespace posix_time + + +#endif + diff --git a/boost/date_time/special_values_formatter.hpp b/boost/date_time/special_values_formatter.hpp new file mode 100644 index 000000000..c8653c1f4 --- /dev/null +++ b/boost/date_time/special_values_formatter.hpp @@ -0,0 +1,96 @@ + +#ifndef DATETIME_SPECIAL_VALUE_FORMATTER_HPP___ +#define DATETIME_SPECIAL_VALUE_FORMATTER_HPP___ + +/* Copyright (c) 2004 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland + * $Date$ + */ + +#include +#include +#include "boost/date_time/special_defs.hpp" + +namespace boost { namespace date_time { + + + //! Class that provides generic formmatting ostream formatting for special values + /*! This class provides for the formmating of special values to an output stream. + * In particular, it produces strings for the values of negative and positive + * infinity as well as not_a_date_time. + * + * While not a facet, this class is used by the date and time facets for formatting + * special value types. + * + */ + template > > + class special_values_formatter + { + public: + typedef std::basic_string string_type; + typedef CharT char_type; + typedef std::vector collection_type; + static const char_type default_special_value_names[3][17]; + + //! Construct special values formatter using default strings. + /*! Default strings are not-a-date-time -infinity +infinity + */ + special_values_formatter() + { + std::copy(&default_special_value_names[0], + &default_special_value_names[3], + std::back_inserter(m_special_value_names)); + } + + //! Construct special values formatter from array of strings + /*! This constructor will take pair of iterators from an array of strings + * that represent the special values and copy them for use in formatting + * special values. + *@code + * const char* const special_value_names[]={"nadt","-inf","+inf" }; + * + * special_value_formatter svf(&special_value_names[0], &special_value_names[3]); + *@endcode + */ + special_values_formatter(const char_type* const* begin, const char_type* const* end) + { + std::copy(begin, end, std::back_inserter(m_special_value_names)); + } + special_values_formatter(typename collection_type::iterator beg, typename collection_type::iterator end) + { + std::copy(beg, end, std::back_inserter(m_special_value_names)); + } + + OutItrT put_special(OutItrT next, + const boost::date_time::special_values& value) const + { + + unsigned int index = value; + if (index < m_special_value_names.size()) { + std::copy(m_special_value_names[index].begin(), + m_special_value_names[index].end(), + next); + } + return next; + } + protected: + collection_type m_special_value_names; + }; + + //! Storage for the strings used to indicate special values + /* using c_strings to initialize these worked fine in testing, however, + * a project that compiled its objects separately, then linked in a separate + * step wound up with redefinition errors for the values in this array. + * Initializing individual characters eliminated this problem */ + template + const typename special_values_formatter::char_type special_values_formatter::default_special_value_names[3][17] = { + {'n','o','t','-','a','-','d','a','t','e','-','t','i','m','e'}, + {'-','i','n','f','i','n','i','t','y'}, + {'+','i','n','f','i','n','i','t','y'} }; + + } } //namespace boost::date_time + +#endif diff --git a/boost/date_time/special_values_parser.hpp b/boost/date_time/special_values_parser.hpp new file mode 100644 index 000000000..e48ec5fda --- /dev/null +++ b/boost/date_time/special_values_parser.hpp @@ -0,0 +1,159 @@ + +#ifndef DATE_TIME_SPECIAL_VALUES_PARSER_HPP__ +#define DATE_TIME_SPECIAL_VALUES_PARSER_HPP__ + +/* Copyright (c) 2005 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date: + */ + + +#include "boost/date_time/string_parse_tree.hpp" +#include "boost/date_time/special_defs.hpp" +#include +#include + +namespace boost { namespace date_time { + + //! Class for special_value parsing + /*! + * TODO: add doc-comments for which elements can be changed + * Parses input stream for strings representing special_values. + * Special values parsed are: + * - not_a_date_time + * - neg_infin + * - pod_infin + * - min_date_time + * - max_date_time + */ + template + class special_values_parser + { + public: + typedef std::basic_string string_type; + //typedef std::basic_stringstream stringstream_type; + typedef std::istreambuf_iterator stream_itr_type; + //typedef typename string_type::const_iterator const_itr; + //typedef typename date_type::year_type year_type; + //typedef typename date_type::month_type month_type; + typedef typename date_type::duration_type duration_type; + //typedef typename date_type::day_of_week_type day_of_week_type; + //typedef typename date_type::day_type day_type; + typedef string_parse_tree parse_tree_type; + typedef typename parse_tree_type::parse_match_result_type match_results; + typedef std::vector > collection_type; + + typedef charT char_type; + static const char_type nadt_string[16]; + static const char_type neg_inf_string[10]; + static const char_type pos_inf_string[10]; + static const char_type min_date_time_string[18]; + static const char_type max_date_time_string[18]; + + //! Creates a special_values_parser with the default set of "sv_strings" + special_values_parser() + { + sv_strings(string_type(nadt_string), + string_type(neg_inf_string), + string_type(pos_inf_string), + string_type(min_date_time_string), + string_type(max_date_time_string)); + } + + //! Creates a special_values_parser using a user defined set of element strings + special_values_parser(const string_type& nadt_str, + const string_type& neg_inf_str, + const string_type& pos_inf_str, + const string_type& min_dt_str, + const string_type& max_dt_str) + { + sv_strings(nadt_str, neg_inf_str, pos_inf_str, min_dt_str, max_dt_str); + } + + special_values_parser(typename collection_type::iterator beg, typename collection_type::iterator end) + { + collection_type phrases; + std::copy(beg, end, std::back_inserter(phrases)); + m_sv_strings = parse_tree_type(phrases, static_cast(not_a_date_time)); + } + + special_values_parser(const special_values_parser& svp) + { + this->m_sv_strings = svp.m_sv_strings; + } + + //! Replace special value strings + void sv_strings(const string_type& nadt_str, + const string_type& neg_inf_str, + const string_type& pos_inf_str, + const string_type& min_dt_str, + const string_type& max_dt_str) + { + collection_type phrases; + phrases.push_back(nadt_str); + phrases.push_back(neg_inf_str); + phrases.push_back(pos_inf_str); + phrases.push_back(min_dt_str); + phrases.push_back(max_dt_str); + m_sv_strings = parse_tree_type(phrases, static_cast(not_a_date_time)); + } + + /* Does not return a special_value because if the parsing fails, + * the return value will always be not_a_date_time + * (mr.current_match retains its default value of -1 on a failed + * parse and that casts to not_a_date_time). */ + //! Sets match_results.current_match to the corresponding special_value or -1 + bool match(stream_itr_type& sitr, + stream_itr_type& str_end, + match_results& mr) const + { + unsigned int level = 0; + m_sv_strings.match(sitr, str_end, mr, level); + return (mr.current_match != match_results::PARSE_ERROR); + } + /*special_values match(stream_itr_type& sitr, + stream_itr_type& str_end, + match_results& mr) const + { + unsigned int level = 0; + m_sv_strings.match(sitr, str_end, mr, level); + if(mr.current_match == match_results::PARSE_ERROR) { + throw std::ios_base::failure("Parse failed. No match found for '" + mr.cache + "'"); + } + return static_cast(mr.current_match); + }*/ + + + private: + parse_tree_type m_sv_strings; + + }; + + template + const typename special_values_parser::char_type + special_values_parser::nadt_string[16] = + {'n','o','t','-','a','-','d','a','t','e','-','t','i','m','e'}; + template + const typename special_values_parser::char_type + special_values_parser::neg_inf_string[10] = + {'-','i','n','f','i','n','i','t','y'}; + template + const typename special_values_parser::char_type + special_values_parser::pos_inf_string[10] = + {'+','i','n','f','i','n','i','t','y'}; + template + const typename special_values_parser::char_type + special_values_parser::min_date_time_string[18] = + {'m','i','n','i','m','u','m','-','d','a','t','e','-','t','i','m','e'}; + template + const typename special_values_parser::char_type + special_values_parser::max_date_time_string[18] = + {'m','a','x','i','m','u','m','-','d','a','t','e','-','t','i','m','e'}; + +} } //namespace + +#endif // DATE_TIME_SPECIAL_VALUES_PARSER_HPP__ + diff --git a/boost/date_time/string_convert.hpp b/boost/date_time/string_convert.hpp new file mode 100644 index 000000000..30be3567a --- /dev/null +++ b/boost/date_time/string_convert.hpp @@ -0,0 +1,32 @@ +#ifndef _STRING_CONVERT_HPP___ +#define _STRING_CONVERT_HPP___ + +/* Copyright (c) 2005 CrystalClear Software, Inc. + * Subject to the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + +#include "boost/date_time/compiler_config.hpp" +#include + +namespace boost { +namespace date_time { + + //! Converts a string from one value_type to another + /*! Converts a wstring to a string (or a string to wstring). If both template parameters + * are of same type, a copy of the input string is returned. */ + template + inline + std::basic_string convert_string_type(const std::basic_string& inp_str) + { + typedef std::basic_string output_type; + output_type result; + result.insert(result.begin(), inp_str.begin(), inp_str.end()); + return result; + } + +}} // namespace boost::date_time + +#endif // _STRING_CONVERT_HPP___ diff --git a/boost/date_time/string_parse_tree.hpp b/boost/date_time/string_parse_tree.hpp new file mode 100644 index 000000000..9e977663f --- /dev/null +++ b/boost/date_time/string_parse_tree.hpp @@ -0,0 +1,278 @@ +#ifndef BOOST_DATE_TIME_STRING_PARSE_TREE___HPP__ +#define BOOST_DATE_TIME_STRING_PARSE_TREE___HPP__ + +/* Copyright (c) 2004-2005 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + + +#include "boost/lexical_cast.hpp" //error without? +#include "boost/algorithm/string/case_conv.hpp" +#include +#include +#include +#include + +namespace boost { namespace date_time { + + +template +struct parse_match_result +{ + parse_match_result() : + match_depth(0), + current_match(-1)// -1 is match_not-found value + {} + typedef std::basic_string string_type; + string_type remaining() const + { + if (match_depth == cache.size()) { + return string_type(); + } + if (current_match == -1) { + return cache; + } + //some of the cache was used return the rest + return string_type(cache, match_depth); + } + charT last_char() const + { + return cache[cache.size()-1]; + } + //! Returns true if more characters were parsed than was necessary + /*! Should be used in conjunction with last_char() + * to get the remaining character. + */ + bool has_remaining() const + { + return (cache.size() > match_depth); + } + + // cache will hold characters that have been read from the stream + string_type cache; + unsigned short match_depth; + short current_match; + enum PARSE_STATE { PARSE_ERROR= -1 }; +}; + + //for debug -- really only char streams... +template +std::basic_ostream& +operator<<(std::basic_ostream& os, parse_match_result& mr) +{ + os << "cm: " << mr.current_match + << " C: '" << mr.cache + << "' md: " << mr.match_depth + << " R: " << mr.remaining(); + return os; +} + + + +//! Recursive data structure to allow efficient parsing of various strings +/*! This class provides a quick lookup by building what amounts to a + * tree data structure. It also features a match function which can + * can handle nasty input interators by caching values as it recurses + * the tree so that it can backtrack as needed. + */ +template +struct string_parse_tree +{ +#if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT(0x581) ) + typedef std::multimap > ptree_coll; +#else + typedef std::multimap ptree_coll; +#endif + typedef typename ptree_coll::value_type value_type; + typedef typename ptree_coll::iterator iterator; + typedef typename ptree_coll::const_iterator const_iterator; + typedef std::basic_string string_type; + typedef std::vector > collection_type; + typedef parse_match_result parse_match_result_type; + + /*! Parameter "starting_point" designates where the numbering begins. + * A starting_point of zero will start the numbering at zero + * (Sun=0, Mon=1, ...) were a starting_point of one starts the + * numbering at one (Jan=1, Feb=2, ...). The default is zero, + * negative vaules are not allowed */ + string_parse_tree(collection_type names, unsigned int starting_point=0) + { + // iterate thru all the elements and build the tree + unsigned short index = 0; + while (index != names.size() ) { + string_type s = boost::algorithm::to_lower_copy(names[index]); + insert(s, static_cast(index + starting_point)); + index++; + } + //set the last tree node = index+1 indicating a value + index++; + } + + + string_parse_tree(short value = -1) : + m_value(value) + {} + ptree_coll m_next_chars; + short m_value; + + void insert(const string_type& s, unsigned short value) + { + unsigned int i = 0; + iterator ti; + while(i < s.size()) { + if (i==0) { + if (i == (s.size()-1)) { + ti = m_next_chars.insert(value_type(s[i], + string_parse_tree(value))); + } + else { + ti = m_next_chars.insert(value_type(s[i], + string_parse_tree())); + } + } + else { + if (i == (s.size()-1)) { + ti = ti->second.m_next_chars.insert(value_type(s[i], + string_parse_tree(value))); + } + + else { + ti = ti->second.m_next_chars.insert(value_type(s[i], + string_parse_tree())); + } + + } + i++; + } + } + + + //! Recursive function that finds a matching string in the tree. + /*! Must check match_results::has_remaining() after match() is + * called. This is required so the user can determine if + * stream iterator is already pointing to the expected + * character or not (match() might advance sitr to next char in stream). + * + * A parse_match_result that has been returned from a failed match + * attempt can be sent in to the match function of a different + * string_parse_tree to attempt a match there. Use the iterators + * for the partially consumed stream, the parse_match_result object, + * and '0' for the level parameter. */ + short + match(std::istreambuf_iterator& sitr, + std::istreambuf_iterator& stream_end, + parse_match_result_type& result, + unsigned int& level) const + { + + level++; + charT c; + // if we conditionally advance sitr, we won't have + // to consume the next character past the input + bool adv_itr = true; + if (level > result.cache.size()) { + if (sitr == stream_end) return 0; //bail - input exhausted + c = static_cast(std::tolower(*sitr)); + //result.cache += c; + //sitr++; + } + else { + // if we're looking for characters from the cache, + // we don't want to increment sitr + adv_itr = false; + c = static_cast(std::tolower(result.cache[level-1])); + } + const_iterator litr = m_next_chars.lower_bound(c); + const_iterator uitr = m_next_chars.upper_bound(c); + while (litr != uitr) { // equal if not found + if(adv_itr) { + sitr++; + result.cache += c; + } + if (litr->second.m_value != -1) { // -1 is default value + if (result.match_depth < level) { + result.current_match = litr->second.m_value; + result.match_depth = static_cast(level); + } + litr->second.match(sitr, stream_end, + result, level); + level--; + } + else { + litr->second.match(sitr, stream_end, + result, level); + level--; + } + + if(level <= result.cache.size()) { + adv_itr = false; + } + + litr++; + } + return result.current_match; + + } + + /*! Must check match_results::has_remaining() after match() is + * called. This is required so the user can determine if + * stream iterator is already pointing to the expected + * character or not (match() might advance sitr to next char in stream). + */ + parse_match_result_type + match(std::istreambuf_iterator& sitr, + std::istreambuf_iterator& stream_end) const + { + // lookup to_lower of char in tree. + unsigned int level = 0; + // string_type cache; + parse_match_result_type result; + match(sitr, stream_end, result, level); + return result; + } + + void printme(std::ostream& os, int& level) + { + level++; + iterator itr = m_next_chars.begin(); + iterator end = m_next_chars.end(); + // os << "starting level: " << level << std::endl; + while (itr != end) { + os << "level: " << level + << " node: " << itr->first + << " value: " << itr->second.m_value + << std::endl; + itr->second.printme(os, level); + itr++; + } + level--; + } + + void print(std::ostream& os) + { + int level = 0; + printme(os, level); + } + + void printmatch(std::ostream& os, charT c) + { + iterator litr = m_next_chars.lower_bound(c); + iterator uitr = m_next_chars.upper_bound(c); + os << "matches for: " << c << std::endl; + while (litr != uitr) { + os << " node: " << litr->first + << " value: " << litr->second.m_value + << std::endl; + litr++; + } + } + +}; + + +} } //namespace +#endif diff --git a/boost/date_time/strings_from_facet.hpp b/boost/date_time/strings_from_facet.hpp new file mode 100644 index 000000000..800919a0b --- /dev/null +++ b/boost/date_time/strings_from_facet.hpp @@ -0,0 +1,125 @@ +#ifndef DATE_TIME_STRINGS_FROM_FACET__HPP___ +#define DATE_TIME_STRINGS_FROM_FACET__HPP___ + +/* Copyright (c) 2004 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland + * $Date$ + */ + +#include +#include +#include +#include + +namespace boost { namespace date_time { + +//! This function gathers up all the month strings from a std::locale +/*! Using the time_put facet, this function creates a collection of + * all the month strings from a locale. This is handy when building + * custom date parsers or formatters that need to be localized. + * + *@param charT The type of char to use when gathering typically char + * or wchar_t. + *@param locale The locale to use when gathering the strings + *@param short_strings True(default) to gather short strings, + * false for long strings. + *@return A vector of strings containing the strings in order. eg: + * Jan, Feb, Mar, etc. + */ +template +std::vector > +gather_month_strings(const std::locale& locale, bool short_strings=true) +{ + typedef std::basic_string string_type; + typedef std::vector collection_type; + typedef std::ostreambuf_iterator ostream_iter_type; + typedef std::basic_ostringstream stringstream_type; + typedef std::time_put time_put_facet_type; + charT short_fmt[3] = { '%', 'b' }; + charT long_fmt[3] = { '%', 'B' }; + collection_type months; + string_type outfmt(short_fmt); + if (!short_strings) { + outfmt = long_fmt; + } + { + //grab the needed strings by using the locale to + //output each month + const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size(); + tm tm_value; + memset(&tm_value, 0, sizeof(tm_value)); + for (int m=0; m < 12; m++) { + tm_value.tm_mon = m; + stringstream_type ss; + ostream_iter_type oitr(ss); + std::use_facet(locale).put(oitr, ss, ss.fill(), + &tm_value, + p_outfmt, + p_outfmt_end); + months.push_back(ss.str()); + } + } + return months; +} + +//! This function gathers up all the weekday strings from a std::locale +/*! Using the time_put facet, this function creates a collection of + * all the weekday strings from a locale starting with the string for + * 'Sunday'. This is handy when building custom date parsers or + * formatters that need to be localized. + * + *@param charT The type of char to use when gathering typically char + * or wchar_t. + *@param locale The locale to use when gathering the strings + *@param short_strings True(default) to gather short strings, + * false for long strings. + *@return A vector of strings containing the weekdays in order. eg: + * Sun, Mon, Tue, Wed, Thu, Fri, Sat + */ +template +std::vector > +gather_weekday_strings(const std::locale& locale, bool short_strings=true) +{ + typedef std::basic_string string_type; + typedef std::vector collection_type; + typedef std::ostreambuf_iterator ostream_iter_type; + typedef std::basic_ostringstream stringstream_type; + typedef std::time_put time_put_facet_type; + charT short_fmt[3] = { '%', 'a' }; + charT long_fmt[3] = { '%', 'A' }; + + collection_type weekdays; + + + string_type outfmt(short_fmt); + if (!short_strings) { + outfmt = long_fmt; + } + { + //grab the needed strings by using the locale to + //output each month / weekday + const charT* p_outfmt = outfmt.c_str(), *p_outfmt_end = p_outfmt + outfmt.size(); + tm tm_value; + memset(&tm_value, 0, sizeof(tm_value)); + for (int i=0; i < 7; i++) { + tm_value.tm_wday = i; + stringstream_type ss; + ostream_iter_type oitr(ss); + std::use_facet(locale).put(oitr, ss, ss.fill(), + &tm_value, + p_outfmt, + p_outfmt_end); + + weekdays.push_back(ss.str()); + } + } + return weekdays; +} + +} } //namespace + + +#endif diff --git a/boost/date_time/time_facet.hpp b/boost/date_time/time_facet.hpp new file mode 100644 index 000000000..be6010c69 --- /dev/null +++ b/boost/date_time/time_facet.hpp @@ -0,0 +1,1368 @@ + +#ifndef _DATE_TIME_FACET__HPP__ +#define _DATE_TIME_FACET__HPP__ + +/* Copyright (c) 2004-2005 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Martin Andrian, Jeff Garland, Bart Garst + * $Date$ + */ + +#include +#include +#include +#include +#include +#include +#include // i/ostreambuf_iterator +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // absolute_value + +namespace boost { +namespace date_time { + + template + struct time_formats { + public: + typedef CharT char_type; + static const char_type fractional_seconds_format[3]; // f + static const char_type fractional_seconds_or_none_format[3]; // F + static const char_type seconds_with_fractional_seconds_format[3]; // s + static const char_type seconds_format[3]; // S + static const char_type hours_format[3]; // H + static const char_type unrestricted_hours_format[3]; // O + static const char_type full_24_hour_time_format[3]; // T + static const char_type full_24_hour_time_expanded_format[9]; // HH:MM:SS + static const char_type short_24_hour_time_format[3]; // R + static const char_type short_24_hour_time_expanded_format[6]; // HH:MM + static const char_type standard_format[9]; // x X + static const char_type zone_abbrev_format[3]; // z + static const char_type zone_name_format[3]; // Z + static const char_type zone_iso_format[3]; // q + static const char_type zone_iso_extended_format[3]; // Q + static const char_type posix_zone_string_format[4]; // ZP + static const char_type duration_sign_negative_only[3]; // - + static const char_type duration_sign_always[3]; // + + static const char_type duration_seperator[2]; + static const char_type negative_sign[2]; //- + static const char_type positive_sign[2]; //+ + static const char_type iso_time_format_specifier[18]; + static const char_type iso_time_format_extended_specifier[22]; + //default ptime format is YYYY-Mon-DD HH:MM:SS[.fff...][ zzz] + static const char_type default_time_format[23]; + // default_time_input_format uses a posix_time_zone_string instead of a time zone abbrev + static const char_type default_time_input_format[24]; + //default time_duration format is HH:MM:SS[.fff...] + static const char_type default_time_duration_format[11]; + }; + + template + const typename time_formats::char_type + time_formats::fractional_seconds_format[3] = {'%','f'}; + + template + const typename time_formats::char_type + time_formats::fractional_seconds_or_none_format[3] = {'%','F'}; + + template + const typename time_formats::char_type + time_formats::seconds_with_fractional_seconds_format[3] = {'%','s'}; + + template + const typename time_formats::char_type + time_formats::seconds_format[3] = {'%','S'}; + + template + const typename time_formats::char_type + time_formats::hours_format[3] = {'%','H'}; + + template + const typename time_formats::char_type + time_formats::unrestricted_hours_format[3] = {'%','O'}; + + template + const typename time_formats::char_type + time_formats::full_24_hour_time_format[3] = {'%','T'}; + + template + const typename time_formats::char_type + time_formats::full_24_hour_time_expanded_format[9] = + {'%','H',':','%','M',':','%','S'}; + + template + const typename time_formats::char_type + time_formats::short_24_hour_time_format[3] = {'%','R'}; + + template + const typename time_formats::char_type + time_formats::short_24_hour_time_expanded_format[6] = + {'%','H',':','%','M'}; + + template + const typename time_formats::char_type + //time_formats::standard_format[5] = {'%','c',' ','%','z'}; + time_formats::standard_format[9] = {'%','x',' ','%','X',' ','%','z'}; + + template + const typename time_formats::char_type + time_formats::zone_abbrev_format[3] = {'%','z'}; + + template + const typename time_formats::char_type + time_formats::zone_name_format[3] = {'%','Z'}; + + template + const typename time_formats::char_type + time_formats::zone_iso_format[3] = {'%','q'}; + + template + const typename time_formats::char_type + time_formats::zone_iso_extended_format[3] ={'%','Q'}; + + template + const typename time_formats::char_type + time_formats::posix_zone_string_format[4] ={'%','Z','P'}; + + template + const typename time_formats::char_type + time_formats::duration_seperator[2] = {':'}; + + template + const typename time_formats::char_type + time_formats::negative_sign[2] = {'-'}; + + template + const typename time_formats::char_type + time_formats::positive_sign[2] = {'+'}; + + template + const typename time_formats::char_type + time_formats::duration_sign_negative_only[3] ={'%','-'}; + + template + const typename time_formats::char_type + time_formats::duration_sign_always[3] ={'%','+'}; + + template + const typename time_formats::char_type + time_formats::iso_time_format_specifier[18] = + {'%', 'Y', '%', 'm', '%', 'd', 'T', + '%', 'H', '%', 'M', '%', 'S', '%', 'F', '%','q' }; + + template + const typename time_formats::char_type + time_formats::iso_time_format_extended_specifier[22] = + {'%', 'Y', '-', '%', 'm', '-', '%', 'd', ' ', + '%', 'H', ':', '%', 'M', ':', '%', 'S', '%', 'F','%','Q'}; + + template + const typename time_formats::char_type + time_formats::default_time_format[23] = + {'%','Y','-','%','b','-','%','d',' ', + '%','H',':','%','M',':','%','S','%','F',' ','%','z'}; + + template + const typename time_formats::char_type + time_formats::default_time_input_format[24] = + {'%','Y','-','%','b','-','%','d',' ', + '%','H',':','%','M',':','%','S','%','F',' ','%','Z','P'}; + + template + const typename time_formats::char_type + time_formats::default_time_duration_format[11] = + {'%','O',':','%','M',':','%','S','%','F'}; + + + + /*! Facet used for format-based output of time types + * This class provides for the use of format strings to output times. In addition + * to the flags for formatting date elements, the following are the allowed format flags: + * - %x %X => default format - enables addition of more flags to default (ie. "%x %X %z") + * - %f => fractional seconds ".123456" + * - %F => fractional seconds or none: like frac sec but empty if frac sec == 0 + * - %s => seconds w/ fractional sec "02.123" (this is the same as "%S%f) + * - %S => seconds "02" + * - %z => abbreviated time zone "EDT" + * - %Z => full time zone name "Eastern Daylight Time" + */ + template > > + class time_facet : + public boost::date_time::date_facet { + typedef time_formats< CharT > formats_type; + public: + typedef typename time_type::date_type date_type; + typedef typename time_type::time_duration_type time_duration_type; + typedef boost::date_time::period period_type; + typedef boost::date_time::date_facet base_type; + typedef typename base_type::string_type string_type; + typedef typename base_type::char_type char_type; + typedef typename base_type::period_formatter_type period_formatter_type; + typedef typename base_type::special_values_formatter_type special_values_formatter_type; + typedef typename base_type::date_gen_formatter_type date_gen_formatter_type; + static const char_type* fractional_seconds_format; // %f + static const char_type* fractional_seconds_or_none_format; // %F + static const char_type* seconds_with_fractional_seconds_format; // %s + static const char_type* seconds_format; // %S + static const char_type* hours_format; // %H + static const char_type* unrestricted_hours_format; // %O + static const char_type* standard_format; // %x X + static const char_type* zone_abbrev_format; // %z + static const char_type* zone_name_format; // %Z + static const char_type* zone_iso_format; // %q + static const char_type* zone_iso_extended_format; // %Q + static const char_type* posix_zone_string_format; // %ZP + static const char_type* duration_seperator; + static const char_type* duration_sign_always; // %+ + static const char_type* duration_sign_negative_only; // %- + static const char_type* negative_sign; //- + static const char_type* positive_sign; //+ + static const char_type* iso_time_format_specifier; + static const char_type* iso_time_format_extended_specifier; + + //default ptime format is YYYY-Mon-DD HH:MM:SS[.fff...][ zzz] + static const char_type* default_time_format; + //default time_duration format is HH:MM:SS[.fff...] + static const char_type* default_time_duration_format; + static std::locale::id id; + +#if defined (__SUNPRO_CC) && defined (_RWSTD_VER) + std::locale::id& __get_id (void) const { return id; } +#endif + + //! sets default formats for ptime, local_date_time, and time_duration + explicit time_facet(::size_t ref_arg = 0) + : base_type(default_time_format, period_formatter_type(), special_values_formatter_type(), date_gen_formatter_type(), ref_arg), + m_time_duration_format(string_type(duration_sign_negative_only) + default_time_duration_format) + {} + + //! Construct the facet with an explicitly specified format + explicit time_facet(const char_type* format_arg, + period_formatter_type period_formatter_arg = period_formatter_type(), + const special_values_formatter_type& special_value_formatter = special_values_formatter_type(), + date_gen_formatter_type dg_formatter = date_gen_formatter_type(), + ::size_t ref_arg = 0) + : base_type(format_arg, + period_formatter_arg, + special_value_formatter, + dg_formatter, + ref_arg), + m_time_duration_format(string_type(duration_sign_negative_only) + default_time_duration_format) + {} + + //! Changes format for time_duration + void time_duration_format(const char_type* const format) + { + m_time_duration_format = format; + } + + virtual void set_iso_format() + { + this->m_format = iso_time_format_specifier; + } + virtual void set_iso_extended_format() + { + this->m_format = iso_time_format_extended_specifier; + } + + OutItrT put(OutItrT next_arg, + std::ios_base& ios_arg, + char_type fill_arg, + const time_type& time_arg) const + { + if (time_arg.is_special()) { + return this->do_put_special(next_arg, ios_arg, fill_arg, + time_arg.date().as_special()); + } + string_type local_format(this->m_format); + + // %T and %R have to be replaced here since they are not standard + boost::algorithm::replace_all(local_format, + boost::as_literal(formats_type::full_24_hour_time_format), + boost::as_literal(formats_type::full_24_hour_time_expanded_format)); + boost::algorithm::replace_all(local_format, + boost::as_literal(formats_type::short_24_hour_time_format), + boost::as_literal(formats_type::short_24_hour_time_expanded_format)); + + string_type frac_str; + if (local_format.find(seconds_with_fractional_seconds_format) != string_type::npos) { + // replace %s with %S.nnn + frac_str = + fractional_seconds_as_string(time_arg.time_of_day(), false); + char_type sep = std::use_facet >(ios_arg.getloc()).decimal_point(); + + string_type replace_string(seconds_format); + replace_string += sep; + replace_string += frac_str; + boost::algorithm::replace_all(local_format, + seconds_with_fractional_seconds_format, + replace_string); + } + /* NOTE: replacing posix_zone_string_format must be done BEFORE + * zone_name_format: "%ZP" & "%Z", if Z is checked first it will + * incorrectly replace a zone_name where a posix_string should go */ + if (local_format.find(posix_zone_string_format) != string_type::npos) { + if(time_arg.zone_abbrev().empty()) { + // if zone_abbrev() returns an empty string, we want to + // erase posix_zone_string_format from format + boost::algorithm::erase_all(local_format, posix_zone_string_format); + } + else{ + boost::algorithm::replace_all(local_format, + posix_zone_string_format, + time_arg.zone_as_posix_string()); + } + } + if (local_format.find(zone_name_format) != string_type::npos) { + if(time_arg.zone_name().empty()) { + /* TODO: this'll probably create problems if a user places + * the zone_*_format flag in the format with a ptime. This + * code removes the flag from the default formats */ + + // if zone_name() returns an empty string, we want to + // erase zone_name_format & one preceeding space + std::basic_ostringstream ss; + ss << ' ' << zone_name_format; + boost::algorithm::erase_all(local_format, ss.str()); + } + else{ + boost::algorithm::replace_all(local_format, + zone_name_format, + time_arg.zone_name()); + } + } + if (local_format.find(zone_abbrev_format) != string_type::npos) { + if(time_arg.zone_abbrev(false).empty()) { + /* TODO: this'll probably create problems if a user places + * the zone_*_format flag in the format with a ptime. This + * code removes the flag from the default formats */ + + // if zone_abbrev() returns an empty string, we want to + // erase zone_abbrev_format & one preceeding space + std::basic_ostringstream ss; + ss << ' ' << zone_abbrev_format; + boost::algorithm::erase_all(local_format, ss.str()); + } + else{ + boost::algorithm::replace_all(local_format, + zone_abbrev_format, + time_arg.zone_abbrev(false)); + } + } + if (local_format.find(zone_iso_extended_format) != string_type::npos) { + if(time_arg.zone_name(true).empty()) { + /* TODO: this'll probably create problems if a user places + * the zone_*_format flag in the format with a ptime. This + * code removes the flag from the default formats */ + + // if zone_name() returns an empty string, we want to + // erase zone_iso_extended_format from format + boost::algorithm::erase_all(local_format, zone_iso_extended_format); + } + else{ + boost::algorithm::replace_all(local_format, + zone_iso_extended_format, + time_arg.zone_name(true)); + } + } + + if (local_format.find(zone_iso_format) != string_type::npos) { + if(time_arg.zone_abbrev(true).empty()) { + /* TODO: this'll probably create problems if a user places + * the zone_*_format flag in the format with a ptime. This + * code removes the flag from the default formats */ + + // if zone_abbrev() returns an empty string, we want to + // erase zone_iso_format from format + boost::algorithm::erase_all(local_format, zone_iso_format); + } + else{ + boost::algorithm::replace_all(local_format, + zone_iso_format, + time_arg.zone_abbrev(true)); + } + } + if (local_format.find(fractional_seconds_format) != string_type::npos) { + // replace %f with nnnnnnn + if (frac_str.empty()) { + frac_str = fractional_seconds_as_string(time_arg.time_of_day(), false); + } + boost::algorithm::replace_all(local_format, + fractional_seconds_format, + frac_str); + } + + if (local_format.find(fractional_seconds_or_none_format) != string_type::npos) { + // replace %F with nnnnnnn or nothing if fs == 0 + frac_str = + fractional_seconds_as_string(time_arg.time_of_day(), true); + if (frac_str.size()) { + char_type sep = std::use_facet >(ios_arg.getloc()).decimal_point(); + string_type replace_string; + replace_string += sep; + replace_string += frac_str; + boost::algorithm::replace_all(local_format, + fractional_seconds_or_none_format, + replace_string); + } + else { + boost::algorithm::erase_all(local_format, + fractional_seconds_or_none_format); + } + } + + return this->do_put_tm(next_arg, ios_arg, fill_arg, + to_tm(time_arg), local_format); + } + + //! put function for time_duration + OutItrT put(OutItrT next_arg, + std::ios_base& ios_arg, + char_type fill_arg, + const time_duration_type& time_dur_arg) const + { + if (time_dur_arg.is_special()) { + return this->do_put_special(next_arg, ios_arg, fill_arg, + time_dur_arg.get_rep().as_special()); + } + + string_type format(m_time_duration_format); + if (time_dur_arg.is_negative()) { + // replace %- with minus sign. Should we use the numpunct facet? + boost::algorithm::replace_all(format, + duration_sign_negative_only, + negative_sign); + // remove all the %+ in the string with '-' + boost::algorithm::replace_all(format, + duration_sign_always, + negative_sign); + } + else { //duration is positive + // remove all the %- combos from the string + boost::algorithm::erase_all(format, duration_sign_negative_only); + // remove all the %+ in the string with '+' + boost::algorithm::replace_all(format, + duration_sign_always, + positive_sign); + } + + // %T and %R have to be replaced here since they are not standard + boost::algorithm::replace_all(format, + boost::as_literal(formats_type::full_24_hour_time_format), + boost::as_literal(formats_type::full_24_hour_time_expanded_format)); + boost::algorithm::replace_all(format, + boost::as_literal(formats_type::short_24_hour_time_format), + boost::as_literal(formats_type::short_24_hour_time_expanded_format)); + + /* + * It is possible for a time duration to span more then 24 hours. + * Standard time_put::put is obliged to behave the same as strftime + * (See ISO 14882-2003 22.2.5.3.1 par. 1) and strftime's behavior is + * unspecified for the case when tm_hour field is outside 0-23 range + * (See ISO 9899-1999 7.23.3.5 par. 3). So we must output %H and %O + * here ourself. + */ + string_type hours_str; + if (format.find(unrestricted_hours_format) != string_type::npos) { + hours_str = hours_as_string(time_dur_arg); + boost::algorithm::replace_all(format, unrestricted_hours_format, hours_str); + } + // We still have to process restricted hours format specifier. In order to + // support parseability of durations in ISO format (%H%M%S), we'll have to + // restrict the stringified hours length to 2 characters. + if (format.find(hours_format) != string_type::npos) { + if (hours_str.empty()) + hours_str = hours_as_string(time_dur_arg); + BOOST_ASSERT(hours_str.length() <= 2); + boost::algorithm::replace_all(format, hours_format, hours_str); + } + + string_type frac_str; + if (format.find(seconds_with_fractional_seconds_format) != string_type::npos) { + // replace %s with %S.nnn + frac_str = + fractional_seconds_as_string(time_dur_arg, false); + char_type sep = std::use_facet >(ios_arg.getloc()).decimal_point(); + + string_type replace_string(seconds_format); + replace_string += sep; + replace_string += frac_str; + boost::algorithm::replace_all(format, + seconds_with_fractional_seconds_format, + replace_string); + } + if (format.find(fractional_seconds_format) != string_type::npos) { + // replace %f with nnnnnnn + if (!frac_str.size()) { + frac_str = fractional_seconds_as_string(time_dur_arg, false); + } + boost::algorithm::replace_all(format, + fractional_seconds_format, + frac_str); + } + + if (format.find(fractional_seconds_or_none_format) != string_type::npos) { + // replace %F with nnnnnnn or nothing if fs == 0 + frac_str = + fractional_seconds_as_string(time_dur_arg, true); + if (frac_str.size()) { + char_type sep = std::use_facet >(ios_arg.getloc()).decimal_point(); + string_type replace_string; + replace_string += sep; + replace_string += frac_str; + boost::algorithm::replace_all(format, + fractional_seconds_or_none_format, + replace_string); + } + else { + boost::algorithm::erase_all(format, + fractional_seconds_or_none_format); + } + } + + return this->do_put_tm(next_arg, ios_arg, fill_arg, + to_tm(time_dur_arg), format); + } + + OutItrT put(OutItrT next, std::ios_base& ios_arg, + char_type fill, const period_type& p) const + { + return this->m_period_formatter.put_period(next, ios_arg, fill,p,*this); + } + + + protected: + + static + string_type + fractional_seconds_as_string(const time_duration_type& time_arg, + bool null_when_zero) + { + typename time_duration_type::fractional_seconds_type frac_sec = + time_arg.fractional_seconds(); + + if (null_when_zero && (frac_sec == 0)) { + return string_type(); + } + + //make sure there is no sign + return integral_as_string( + date_time::absolute_value(frac_sec), + time_duration_type::num_fractional_digits()); + } + + static + string_type + hours_as_string(const time_duration_type& time_arg, int width = 2) + { + return integral_as_string(date_time::absolute_value(time_arg.hours()), width); + } + + template< typename IntT > + static + string_type + integral_as_string(IntT val, int width = 2) + { + std::basic_ostringstream ss; + ss.imbue(std::locale::classic()); // don't want any formatting + ss << std::setw(width) + << std::setfill(static_cast('0')); +#if (defined(BOOST_MSVC) && (_MSC_VER < 1300)) + // JDG [7/6/02 VC++ compatibility] + char_type buff[34]; + ss << _i64toa(static_cast(val), buff, 10); +#else + ss << val; +#endif + return ss.str(); + } + + private: + string_type m_time_duration_format; + + }; + + template + std::locale::id time_facet::id; + + template + const typename time_facet::char_type* + time_facet::fractional_seconds_format = time_formats::fractional_seconds_format; + + template + const typename time_facet::char_type* + time_facet::fractional_seconds_or_none_format = time_formats::fractional_seconds_or_none_format; + + template + const typename time_facet::char_type* + time_facet::seconds_with_fractional_seconds_format = + time_formats::seconds_with_fractional_seconds_format; + + + template + const typename time_facet::char_type* + time_facet::zone_name_format = time_formats::zone_name_format; + + template + const typename time_facet::char_type* + time_facet::zone_abbrev_format = time_formats::zone_abbrev_format; + + template + const typename time_facet::char_type* + time_facet::zone_iso_extended_format =time_formats::zone_iso_extended_format; + + template + const typename time_facet::char_type* + time_facet::posix_zone_string_format =time_formats::posix_zone_string_format; + + template + const typename time_facet::char_type* + time_facet::zone_iso_format = time_formats::zone_iso_format; + + template + const typename time_facet::char_type* + time_facet::seconds_format = time_formats::seconds_format; + + template + const typename time_facet::char_type* + time_facet::hours_format = time_formats::hours_format; + + template + const typename time_facet::char_type* + time_facet::unrestricted_hours_format = time_formats::unrestricted_hours_format; + + template + const typename time_facet::char_type* + time_facet::standard_format = time_formats::standard_format; + + template + const typename time_facet::char_type* + time_facet::duration_seperator = time_formats::duration_seperator; + + template + const typename time_facet::char_type* + time_facet::negative_sign = time_formats::negative_sign; + + template + const typename time_facet::char_type* + time_facet::positive_sign = time_formats::positive_sign; + + template + const typename time_facet::char_type* + time_facet::duration_sign_negative_only = time_formats::duration_sign_negative_only; + + template + const typename time_facet::char_type* + time_facet::duration_sign_always = time_formats::duration_sign_always; + + template + const typename time_facet::char_type* + time_facet::iso_time_format_specifier = time_formats::iso_time_format_specifier; + + template + const typename time_facet::char_type* + time_facet::iso_time_format_extended_specifier = time_formats::iso_time_format_extended_specifier; + + template + const typename time_facet::char_type* + time_facet::default_time_format = + time_formats::default_time_format; + + template + const typename time_facet::char_type* + time_facet::default_time_duration_format = + time_formats::default_time_duration_format; + + + //! Facet for format-based input. + /*! + */ + template > > + class time_input_facet : + public boost::date_time::date_input_facet { + public: + typedef typename time_type::date_type date_type; + typedef typename time_type::time_duration_type time_duration_type; + typedef typename time_duration_type::fractional_seconds_type fracional_seconds_type; + typedef boost::date_time::period period_type; + typedef boost::date_time::date_input_facet base_type; + typedef typename base_type::duration_type date_duration_type; + typedef typename base_type::year_type year_type; + typedef typename base_type::month_type month_type; + typedef typename base_type::day_type day_type; + typedef typename base_type::string_type string_type; + typedef typename string_type::const_iterator const_itr; + typedef typename base_type::char_type char_type; + typedef typename base_type::format_date_parser_type format_date_parser_type; + typedef typename base_type::period_parser_type period_parser_type; + typedef typename base_type::special_values_parser_type special_values_parser_type; + typedef typename base_type::date_gen_parser_type date_gen_parser_type; + typedef typename base_type::special_values_parser_type::match_results match_results; + + static const char_type* fractional_seconds_format; // f + static const char_type* fractional_seconds_or_none_format; // F + static const char_type* seconds_with_fractional_seconds_format; // s + static const char_type* seconds_format; // S + static const char_type* standard_format; // x X + static const char_type* zone_abbrev_format; // z + static const char_type* zone_name_format; // Z + static const char_type* zone_iso_format; // q + static const char_type* zone_iso_extended_format; // Q + static const char_type* duration_seperator; + static const char_type* iso_time_format_specifier; + static const char_type* iso_time_format_extended_specifier; + static const char_type* default_time_input_format; + static const char_type* default_time_duration_format; + static std::locale::id id; + + //! Constructor that takes a format string for a ptime + explicit time_input_facet(const string_type& format, ::size_t ref_arg = 0) + : base_type(format, ref_arg), + m_time_duration_format(default_time_duration_format) + { } + + explicit time_input_facet(const string_type& format, + const format_date_parser_type& date_parser, + const special_values_parser_type& sv_parser, + const period_parser_type& per_parser, + const date_gen_parser_type& date_gen_parser, + ::size_t ref_arg = 0) + : base_type(format, + date_parser, + sv_parser, + per_parser, + date_gen_parser, + ref_arg), + m_time_duration_format(default_time_duration_format) + {} + + //! sets default formats for ptime, local_date_time, and time_duration + explicit time_input_facet(::size_t ref_arg = 0) + : base_type(default_time_input_format, ref_arg), + m_time_duration_format(default_time_duration_format) + { } + + //! Set the format for time_duration + void time_duration_format(const char_type* const format) { + m_time_duration_format = format; + } + virtual void set_iso_format() + { + this->m_format = iso_time_format_specifier; + } + virtual void set_iso_extended_format() + { + this->m_format = iso_time_format_extended_specifier; + } + + InItrT get(InItrT& sitr, + InItrT& stream_end, + std::ios_base& ios_arg, + period_type& p) const + { + p = this->m_period_parser.get_period(sitr, + stream_end, + ios_arg, + p, + time_duration_type::unit(), + *this); + return sitr; + } + + //default ptime format is YYYY-Mon-DD HH:MM:SS[.fff...][ zzz] + //default time_duration format is %H:%M:%S%F HH:MM:SS[.fff...] + + InItrT get(InItrT& sitr, + InItrT& stream_end, + std::ios_base& ios_arg, + time_duration_type& td) const + { + // skip leading whitespace + while((sitr != stream_end) && std::isspace(*sitr)) { ++sitr; } + + bool use_current_char = false; + + // num_get will consume the +/-, we may need a copy if special_value + char_type c = '\0'; + if((sitr != stream_end) && (*sitr == '-' || *sitr == '+')) { + c = *sitr; + } + + typedef typename time_duration_type::hour_type hour_type; + typedef typename time_duration_type::min_type min_type; + typedef typename time_duration_type::sec_type sec_type; + + hour_type hour = 0; + min_type min = 0; + sec_type sec = 0; + typename time_duration_type::fractional_seconds_type frac(0); + + typedef std::num_get num_get; + if(!std::has_facet(ios_arg.getloc())) { + num_get* ng = new num_get(); + std::locale loc = std::locale(ios_arg.getloc(), ng); + ios_arg.imbue(loc); + } + + const_itr itr(m_time_duration_format.begin()); + while (itr != m_time_duration_format.end() && (sitr != stream_end)) { + if (*itr == '%') { + if (++itr == m_time_duration_format.end()) break; + if (*itr != '%') { + switch(*itr) { + case 'O': + { + // A period may span more than 24 hours. In that case the format + // string should be composed with the unrestricted hours specifier. + hour = var_string_to_int(sitr, stream_end, + std::numeric_limits::digits10 + 1); + if(hour == -1){ + return check_special_value(sitr, stream_end, td, c); + } + break; + } + case 'H': + { + match_results mr; + hour = fixed_string_to_int(sitr, stream_end, mr, 2); + if(hour == -1){ + return check_special_value(sitr, stream_end, td, c); + } + break; + } + case 'M': + { + match_results mr; + min = fixed_string_to_int(sitr, stream_end, mr, 2); + if(min == -1){ + return check_special_value(sitr, stream_end, td, c); + } + break; + } + case 's': + case 'S': + { + match_results mr; + sec = fixed_string_to_int(sitr, stream_end, mr, 2); + if(sec == -1){ + return check_special_value(sitr, stream_end, td, c); + } + if (*itr == 'S') + break; + // %s is the same as %S%f so we drop through into %f + } + case 'f': + { + // check for decimal, check special_values if missing + if(*sitr == '.') { + ++sitr; + parse_frac_type(sitr, stream_end, frac); + // sitr will point to next expected char after this parsing + // is complete so no need to advance it + use_current_char = true; + } + else { + return check_special_value(sitr, stream_end, td, c); + } + break; + } + case 'F': + { + // check for decimal, skip if missing + if(*sitr == '.') { + ++sitr; + parse_frac_type(sitr, stream_end, frac); + // sitr will point to next expected char after this parsing + // is complete so no need to advance it + use_current_char = true; + } + else { + // nothing was parsed so we don't want to advance sitr + use_current_char = true; + } + break; + } + default: + {} // ignore what we don't understand? + }// switch + } + else { // itr == '%', second consecutive + ++sitr; + } + + ++itr; //advance past format specifier + } + else { //skip past chars in format and in buffer + ++itr; + // set use_current_char when sitr is already + // pointing at the next character to process + if (use_current_char) { + use_current_char = false; + } + else { + ++sitr; + } + } + } + + td = time_duration_type(hour, min, sec, frac); + return sitr; + } + + + //! Parses a time object from the input stream + InItrT get(InItrT& sitr, + InItrT& stream_end, + std::ios_base& ios_arg, + time_type& t) const + { + string_type tz_str; + return get(sitr, stream_end, ios_arg, t, tz_str, false); + } + //! Expects a time_zone in the input stream + InItrT get_local_time(InItrT& sitr, + InItrT& stream_end, + std::ios_base& ios_arg, + time_type& t, + string_type& tz_str) const + { + return get(sitr, stream_end, ios_arg, t, tz_str, true); + } + + protected: + + InItrT get(InItrT& sitr, + InItrT& stream_end, + std::ios_base& ios_arg, + time_type& t, + string_type& tz_str, + bool time_is_local) const + { + // skip leading whitespace + while((sitr != stream_end) && std::isspace(*sitr)) { ++sitr; } + + bool use_current_char = false; + bool use_current_format_char = false; // used whith two character flags + + // num_get will consume the +/-, we may need a copy if special_value + char_type c = '\0'; + if((sitr != stream_end) && (*sitr == '-' || *sitr == '+')) { + c = *sitr; + } + + typedef typename time_duration_type::hour_type hour_type; + typedef typename time_duration_type::min_type min_type; + typedef typename time_duration_type::sec_type sec_type; + + // time elements + hour_type hour = 0; + min_type min = 0; + sec_type sec = 0; + typename time_duration_type::fractional_seconds_type frac(0); + // date elements + short day_of_year(0); + /* Initialized the following to their minimum values. These intermediate + * objects are used so we get specific exceptions when part of the input + * is unparsable. + * Ex: "205-Jan-15" will throw a bad_year, "2005-Jsn-15"- bad_month, etc.*/ + year_type t_year(1400); + month_type t_month(1); + day_type t_day(1); + + typedef std::num_get num_get; + if(!std::has_facet(ios_arg.getloc())) { + num_get* ng = new num_get(); + std::locale loc = std::locale(ios_arg.getloc(), ng); + ios_arg.imbue(loc); + } + + const_itr itr(this->m_format.begin()); + while (itr != this->m_format.end() && (sitr != stream_end)) { + if (*itr == '%') { + if (++itr == this->m_format.end()) break; + if (*itr != '%') { + // the cases are grouped by date & time flags - not alphabetical order + switch(*itr) { + // date flags + case 'Y': + case 'y': + { + char_type cs[3] = { '%', *itr }; + string_type s(cs); + match_results mr; + try { + t_year = this->m_parser.parse_year(sitr, stream_end, s, mr); + } + catch(std::out_of_range&) { // base class for bad_year exception + if(this->m_sv_parser.match(sitr, stream_end, mr)) { + t = time_type(static_cast(mr.current_match)); + return sitr; + } + else { + throw; // rethrow bad_year + } + } + break; + } + case 'B': + case 'b': + case 'm': + { + char_type cs[3] = { '%', *itr }; + string_type s(cs); + match_results mr; + try { + t_month = this->m_parser.parse_month(sitr, stream_end, s, mr); + } + catch(std::out_of_range&) { // base class for bad_month exception + if(this->m_sv_parser.match(sitr, stream_end, mr)) { + t = time_type(static_cast(mr.current_match)); + return sitr; + } + else { + throw; // rethrow bad_month + } + } + // did m_parser already advance sitr to next char? + if(mr.has_remaining()) { + use_current_char = true; + } + break; + } + case 'a': + case 'A': + case 'w': + { + // weekday is not used in construction but we need to get it out of the stream + char_type cs[3] = { '%', *itr }; + string_type s(cs); + match_results mr; + typename date_type::day_of_week_type wd(0); + try { + wd = this->m_parser.parse_weekday(sitr, stream_end, s, mr); + } + catch(std::out_of_range&) { // base class for bad_weekday exception + if(this->m_sv_parser.match(sitr, stream_end, mr)) { + t = time_type(static_cast(mr.current_match)); + return sitr; + } + else { + throw; // rethrow bad_weekday + } + } + // did m_parser already advance sitr to next char? + if(mr.has_remaining()) { + use_current_char = true; + } + break; + } + case 'j': + { + // code that gets julian day (from format_date_parser) + match_results mr; + day_of_year = fixed_string_to_int(sitr, stream_end, mr, 3); + if(day_of_year == -1) { + if(this->m_sv_parser.match(sitr, stream_end, mr)) { + t = time_type(static_cast(mr.current_match)); + return sitr; + } + } + // these next two lines are so we get an exception with bad input + typedef typename time_type::date_type::day_of_year_type day_of_year_type; + day_of_year_type t_day_of_year(day_of_year); + break; + } + case 'd': + { + try { + t_day = this->m_parser.parse_day_of_month(sitr, stream_end); + } + catch(std::out_of_range&) { // base class for exception bad_day_of_month + match_results mr; + if(this->m_sv_parser.match(sitr, stream_end, mr)) { + t = time_type(static_cast(mr.current_match)); + return sitr; + } + else { + throw; // rethrow bad_day_of_month + } + } + break; + } + // time flags + case 'H': + { + match_results mr; + hour = fixed_string_to_int(sitr, stream_end, mr, 2); + if(hour == -1){ + return check_special_value(sitr, stream_end, t, c); + } + break; + } + case 'M': + { + match_results mr; + min = fixed_string_to_int(sitr, stream_end, mr, 2); + if(min == -1){ + return check_special_value(sitr, stream_end, t, c); + } + break; + } + case 's': + case 'S': + { + match_results mr; + sec = fixed_string_to_int(sitr, stream_end, mr, 2); + if(sec == -1){ + return check_special_value(sitr, stream_end, t, c); + } + if (*itr == 'S' || sitr == stream_end) + break; + // %s is the same as %S%f so we drop through into %f if we are + // not at the end of the stream + } + case 'f': + { + // check for decimal, check SV if missing + if(*sitr == '.') { + ++sitr; + parse_frac_type(sitr, stream_end, frac); + // sitr will point to next expected char after this parsing + // is complete so no need to advance it + use_current_char = true; + } + else { + return check_special_value(sitr, stream_end, t, c); + } + break; + } + case 'F': + { + // check for decimal, skip if missing + if(*sitr == '.') { + ++sitr; + parse_frac_type(sitr, stream_end, frac); + // sitr will point to next expected char after this parsing + // is complete so no need to advance it + use_current_char = true; + } + else { + // nothing was parsed so we don't want to advance sitr + use_current_char = true; + } + break; + } + // time_zone flags + //case 'q': + //case 'Q': + //case 'z': + case 'Z': + { + if(time_is_local) { // skip if 't' is a ptime + ++itr; + if(*itr == 'P') { + // skip leading whitespace + while((sitr != stream_end) && std::isspace(*sitr)) { ++sitr; } + // parse zone + while((sitr != stream_end) && (!std::isspace(*sitr))) { + tz_str += *sitr; + ++sitr; + } + } + else { + use_current_format_char = true; + } + + } + else { + // nothing was parsed so we don't want to advance sitr + use_current_char = true; + } + + break; + } + default: + {} // ignore what we don't understand? + }// switch + } + else { // itr == '%', second consecutive + ++sitr; + } + + if(use_current_format_char) { + use_current_format_char = false; + } + else { + ++itr; //advance past format specifier + } + + } + else { //skip past chars in format and in buffer + ++itr; + // set use_current_char when sitr is already + // pointing at the next character to process + if (use_current_char) { + use_current_char = false; + } + else { + ++sitr; + } + } + } + + date_type d(not_a_date_time); + if (day_of_year > 0) { + d = date_type(static_cast(t_year-1),12,31) + date_duration_type(day_of_year); + } + else { + d = date_type(t_year, t_month, t_day); + } + + time_duration_type td(hour, min, sec, frac); + t = time_type(d, td); + return sitr; + } + + //! Helper function to check for special_value + /*! First character may have been consumed during original parse + * attempt. Parameter 'c' should be a copy of that character. + * Throws ios_base::failure if parse fails. */ + template + inline + InItrT check_special_value(InItrT& sitr,InItrT& stream_end, temporal_type& tt, char_type c='\0') const + { + match_results mr; + if((c == '-' || c == '+') && (*sitr != c)) { // was the first character consumed? + mr.cache += c; + } + this->m_sv_parser.match(sitr, stream_end, mr); + if(mr.current_match == match_results::PARSE_ERROR) { + std::string tmp = convert_string_type(mr.cache); + boost::throw_exception(std::ios_base::failure("Parse failed. No match found for '" + tmp + "'")); + BOOST_DATE_TIME_UNREACHABLE_EXPRESSION(return sitr); // should never reach + } + tt = temporal_type(static_cast(mr.current_match)); + return sitr; + } + + //! Helper function for parsing a fractional second type from the stream + void parse_frac_type(InItrT& sitr, + InItrT& stream_end, + fracional_seconds_type& frac) const + { + string_type cache; + while((sitr != stream_end) && std::isdigit(*sitr)) { + cache += *sitr; + ++sitr; + } + if(cache.size() > 0) { + unsigned short precision = time_duration_type::num_fractional_digits(); + // input may be only the first few decimal places + if(cache.size() < precision) { + frac = lexical_cast(cache); + frac = decimal_adjust(frac, static_cast(precision - cache.size())); + } + else { + // if input has too many decimal places, drop excess digits + frac = lexical_cast(cache.substr(0, precision)); + } + } + } + + private: + string_type m_time_duration_format; + + //! Helper function to adjust trailing zeros when parsing fractional digits + template + inline + int_type decimal_adjust(int_type val, const unsigned short places) const + { + unsigned long factor = 1; + for(int i = 0; i < places; ++i){ + factor *= 10; // shift decimal to the right + } + return val * factor; + } + + }; + +template + std::locale::id time_input_facet::id; + +template + const typename time_input_facet::char_type* + time_input_facet::fractional_seconds_format = time_formats::fractional_seconds_format; + + template + const typename time_input_facet::char_type* + time_input_facet::fractional_seconds_or_none_format = time_formats::fractional_seconds_or_none_format; + + template + const typename time_input_facet::char_type* + time_input_facet::seconds_with_fractional_seconds_format = time_formats::seconds_with_fractional_seconds_format; + + template + const typename time_input_facet::char_type* + time_input_facet::seconds_format = time_formats::seconds_format; + + template + const typename time_input_facet::char_type* + time_input_facet::standard_format = time_formats::standard_format; + + template + const typename time_input_facet::char_type* + time_input_facet::zone_abbrev_format = time_formats::zone_abbrev_format; + + template + const typename time_input_facet::char_type* + time_input_facet::zone_name_format = time_formats::zone_name_format; + + template + const typename time_input_facet::char_type* + time_input_facet::zone_iso_format = time_formats::zone_iso_format; + + template + const typename time_input_facet::char_type* + time_input_facet::zone_iso_extended_format = time_formats::zone_iso_extended_format; + + template + const typename time_input_facet::char_type* + time_input_facet::duration_seperator = time_formats::duration_seperator; + + template + const typename time_input_facet::char_type* + time_input_facet::iso_time_format_specifier = time_formats::iso_time_format_specifier; + + template + const typename time_input_facet::char_type* + time_input_facet::iso_time_format_extended_specifier = time_formats::iso_time_format_extended_specifier; + + template + const typename time_input_facet::char_type* + time_input_facet::default_time_input_format = time_formats::default_time_input_format; + + template + const typename time_input_facet::char_type* + time_input_facet::default_time_duration_format = time_formats::default_time_duration_format; + + +} } // namespaces + + +#endif + diff --git a/boost/date_time/time_formatting_streams.hpp b/boost/date_time/time_formatting_streams.hpp new file mode 100644 index 000000000..f69f87a34 --- /dev/null +++ b/boost/date_time/time_formatting_streams.hpp @@ -0,0 +1,122 @@ +#ifndef DATE_TIME_TIME_FORMATTING_STREAMS_HPP___ +#define DATE_TIME_TIME_FORMATTING_STREAMS_HPP___ + +/* Copyright (c) 2002,2003 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + +#include + +#ifndef BOOST_DATE_TIME_NO_LOCALE + +#include +#include +#include +#include +#include + +namespace boost { +namespace date_time { + + + //! Put a time type into a stream using appropriate facets + template + class ostream_time_duration_formatter + { + public: + typedef std::basic_ostream ostream_type; + typedef typename time_duration_type::fractional_seconds_type fractional_seconds_type; + + //! Put time into an ostream + static void duration_put(const time_duration_type& td, + ostream_type& os) + { + if(td.is_special()) { + os << td.get_rep(); + } + else { + charT fill_char = '0'; + if(td.is_negative()) { + os << '-'; + } + os << std::setw(2) << std::setfill(fill_char) + << absolute_value(td.hours()) << ":"; + os << std::setw(2) << std::setfill(fill_char) + << absolute_value(td.minutes()) << ":"; + os << std::setw(2) << std::setfill(fill_char) + << absolute_value(td.seconds()); + fractional_seconds_type frac_sec = + absolute_value(td.fractional_seconds()); + if (frac_sec != 0) { + os << "." + << std::setw(time_duration_type::num_fractional_digits()) + << std::setfill(fill_char) + << frac_sec; + } + } // else + } // duration_put + }; //class ostream_time_duration_formatter + + //! Put a time type into a stream using appropriate facets + template + class ostream_time_formatter + { + public: + typedef std::basic_ostream ostream_type; + typedef typename time_type::date_type date_type; + typedef typename time_type::time_duration_type time_duration_type; + typedef ostream_time_duration_formatter duration_formatter; + + //! Put time into an ostream + static void time_put(const time_type& t, + ostream_type& os) + { + date_type d = t.date(); + os << d; + if(!d.is_infinity() && !d.is_not_a_date()) + { + os << " "; //TODO: fix the separator here. + duration_formatter::duration_put(t.time_of_day(), os); + } + + } // time_to_ostream + }; //class ostream_time_formatter + + + //! Put a time period into a stream using appropriate facets + template + class ostream_time_period_formatter + { + public: + typedef std::basic_ostream ostream_type; + typedef typename time_period_type::point_type time_type; + typedef ostream_time_formatter time_formatter; + + //! Put time into an ostream + static void period_put(const time_period_type& tp, + ostream_type& os) + { + os << '['; //TODO: facet or manipulator for periods? + time_formatter::time_put(tp.begin(), os); + os << '/'; //TODO: facet or manipulator for periods? + time_formatter::time_put(tp.last(), os); + os << ']'; + + } // period_put + + }; //class ostream_time_period_formatter + + + +} } //namespace date_time + +#endif //BOOST_DATE_TIME_NO_LOCALE + +#endif diff --git a/boost/date_time/time_parsing.hpp b/boost/date_time/time_parsing.hpp new file mode 100644 index 000000000..6de4b7dbd --- /dev/null +++ b/boost/date_time/time_parsing.hpp @@ -0,0 +1,324 @@ +#ifndef _DATE_TIME_TIME_PARSING_HPP___ +#define _DATE_TIME_TIME_PARSING_HPP___ + +/* Copyright (c) 2002,2003,2005 CrystalClear Software, Inc. + * Use, modification and distribution is subject to the + * Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) + * Author: Jeff Garland, Bart Garst + * $Date$ + */ + +#include "boost/tokenizer.hpp" +#include "boost/lexical_cast.hpp" +#include "boost/date_time/date_parsing.hpp" +#include "boost/cstdint.hpp" +#include + +namespace boost { +namespace date_time { + + //! computes exponential math like 2^8 => 256, only works with positive integers + //Not general purpose, but needed b/c std::pow is not available + //everywehere. Hasn't been tested with negatives and zeros + template + inline + int_type power(int_type base, int_type exponent) + { + int_type result = 1; + for(int i = 0; i < exponent; ++i){ + result *= base; + } + return result; + } + + //! Creates a time_duration object from a delimited string + /*! Expected format for string is "[-]h[h][:mm][:ss][.fff]". + * If the number of fractional digits provided is greater than the + * precision of the time duration type then the extra digits are + * truncated. + * + * A negative duration will be created if the first character in + * string is a '-', all other '-' will be treated as delimiters. + * Accepted delimiters are "-:,.". + */ + template + inline + time_duration + str_from_delimited_time_duration(const std::basic_string& s) + { + unsigned short min=0, sec =0; + int hour =0; + bool is_neg = (s.at(0) == '-'); + boost::int64_t fs=0; + int pos = 0; + + typedef typename std::basic_string::traits_type traits_type; + typedef boost::char_separator char_separator_type; + typedef boost::tokenizer::const_iterator, + std::basic_string > tokenizer; + typedef typename boost::tokenizer::const_iterator, + typename std::basic_string >::iterator tokenizer_iterator; + + char_type sep_chars[5] = {'-',':',',','.'}; + char_separator_type sep(sep_chars); + tokenizer tok(s,sep); + for(tokenizer_iterator beg=tok.begin(); beg!=tok.end();++beg){ + switch(pos) { + case 0: { + hour = boost::lexical_cast(*beg); + break; + } + case 1: { + min = boost::lexical_cast(*beg); + break; + } + case 2: { + sec = boost::lexical_cast(*beg); + break; + }; + case 3: { + int digits = static_cast(beg->length()); + //Works around a bug in MSVC 6 library that does not support + //operator>> thus meaning lexical_cast will fail to compile. +#if (defined(BOOST_MSVC) && (_MSC_VER < 1300)) + // msvc wouldn't compile 'time_duration::num_fractional_digits()' + // (required template argument list) as a workaround a temp + // time_duration object was used + time_duration td(hour,min,sec,fs); + int precision = td.num_fractional_digits(); + // _atoi64 is an MS specific function + if(digits >= precision) { + // drop excess digits + fs = _atoi64(beg->substr(0, precision).c_str()); + } + else { + fs = _atoi64(beg->c_str()); + } +#else + int precision = time_duration::num_fractional_digits(); + if(digits >= precision) { + // drop excess digits + fs = boost::lexical_cast(beg->substr(0, precision)); + } + else { + fs = boost::lexical_cast(*beg); + } +#endif + if(digits < precision){ + // trailing zeros get dropped from the string, + // "1:01:01.1" would yield .000001 instead of .100000 + // the power() compensates for the missing decimal places + fs *= power(10, precision - digits); + } + + break; + } + default: break; + }//switch + pos++; + } + if(is_neg) { + return -time_duration(hour, min, sec, fs); + } + else { + return time_duration(hour, min, sec, fs); + } + } + + //! Creates a time_duration object from a delimited string + /*! Expected format for string is "[-]h[h][:mm][:ss][.fff]". + * If the number of fractional digits provided is greater than the + * precision of the time duration type then the extra digits are + * truncated. + * + * A negative duration will be created if the first character in + * string is a '-', all other '-' will be treated as delimiters. + * Accepted delimiters are "-:,.". + */ + template + inline + time_duration + parse_delimited_time_duration(const std::string& s) + { + return str_from_delimited_time_duration(s); + } + + //! Utility function to split appart string + inline + bool + split(const std::string& s, + char sep, + std::string& first, + std::string& second) + { + std::string::size_type sep_pos = s.find(sep); + first = s.substr(0,sep_pos); + if (sep_pos!=std::string::npos) + second = s.substr(sep_pos+1); + return true; + } + + + template + inline + time_type + parse_delimited_time(const std::string& s, char sep) + { + typedef typename time_type::time_duration_type time_duration; + typedef typename time_type::date_type date_type; + + //split date/time on a unique delimiter char such as ' ' or 'T' + std::string date_string, tod_string; + split(s, sep, date_string, tod_string); + //call parse_date with first string + date_type d = parse_date(date_string); + //call parse_time_duration with remaining string + time_duration td = parse_delimited_time_duration(tod_string); + //construct a time + return time_type(d, td); + + } + + //! Parse time duration part of an iso time of form: [-]hhmmss[.fff...] (eg: 120259.123 is 12 hours, 2 min, 59 seconds, 123000 microseconds) + template + inline + time_duration + parse_undelimited_time_duration(const std::string& s) + { + int precision = 0; + { + // msvc wouldn't compile 'time_duration::num_fractional_digits()' + // (required template argument list) as a workaround, a temp + // time_duration object was used + time_duration tmp(0,0,0,1); + precision = tmp.num_fractional_digits(); + } + // 'precision+1' is so we grab all digits, plus the decimal + int offsets[] = {2,2,2, precision+1}; + int pos = 0, sign = 0; + int hours = 0; + short min=0, sec=0; + boost::int64_t fs=0; + // increment one position if the string was "signed" + if(s.at(sign) == '-') + { + ++sign; + } + // stlport choked when passing s.substr() to tokenizer + // using a new string fixed the error + std::string remain = s.substr(sign); + /* We do not want the offset_separator to wrap the offsets, we + * will never want to process more than: + * 2 char, 2 char, 2 char, frac_sec length. + * We *do* want the offset_separator to give us a partial for the + * last characters if there were not enough provided in the input string. */ + bool wrap_off = false; + bool ret_part = true; + boost::offset_separator osf(offsets, offsets+4, wrap_off, ret_part); + typedef boost::tokenizer::const_iterator, + std::basic_string > tokenizer; + typedef boost::tokenizer::const_iterator, + std::basic_string >::iterator tokenizer_iterator; + tokenizer tok(remain, osf); + for(tokenizer_iterator ti=tok.begin(); ti!=tok.end();++ti){ + switch(pos) { + case 0: + { + hours = boost::lexical_cast(*ti); + break; + } + case 1: + { + min = boost::lexical_cast(*ti); + break; + } + case 2: + { + sec = boost::lexical_cast(*ti); + break; + } + case 3: + { + std::string char_digits(ti->substr(1)); // digits w/no decimal + int digits = static_cast(char_digits.length()); + + //Works around a bug in MSVC 6 library that does not support + //operator>> thus meaning lexical_cast will fail to compile. +#if (defined(BOOST_MSVC) && (_MSC_VER <= 1200)) // 1200 == VC++ 6.0 + // _atoi64 is an MS specific function + if(digits >= precision) { + // drop excess digits + fs = _atoi64(char_digits.substr(0, precision).c_str()); + } + else if(digits == 0) { + fs = 0; // just in case _atoi64 doesn't like an empty string + } + else { + fs = _atoi64(char_digits.c_str()); + } +#else + if(digits >= precision) { + // drop excess digits + fs = boost::lexical_cast(char_digits.substr(0, precision)); + } + else if(digits == 0) { + fs = 0; // lexical_cast doesn't like empty strings + } + else { + fs = boost::lexical_cast(char_digits); + } +#endif + if(digits < precision){ + // trailing zeros get dropped from the string, + // "1:01:01.1" would yield .000001 instead of .100000 + // the power() compensates for the missing decimal places + fs *= power(10, precision - digits); + } + + break; + } + default: break; + }; + pos++; + } + if(sign) { + return -time_duration(hours, min, sec, fs); + } + else { + return time_duration(hours, min, sec, fs); + } + } + + //! Parse time string of form YYYYMMDDThhmmss where T is delimeter between date and time + template + inline + time_type + parse_iso_time(const std::string& s, char sep) + { + typedef typename time_type::time_duration_type time_duration; + typedef typename time_type::date_type date_type; + + //split date/time on a unique delimiter char such as ' ' or 'T' + std::string date_string, tod_string; + split(s, sep, date_string, tod_string); + //call parse_date with first string + date_type d = parse_undelimited_date(date_string); + //call parse_time_duration with remaining string + time_duration td = parse_undelimited_time_duration(tod_string); + //construct a time + return time_type(d, td); + } + + + +} }//namespace date_time + + + + +#endif diff --git a/boost/interprocess/allocators/allocator.hpp b/boost/interprocess/allocators/allocator.hpp new file mode 100644 index 000000000..759e3d260 --- /dev/null +++ b/boost/interprocess/allocators/allocator.hpp @@ -0,0 +1,307 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_ALLOCATOR_HPP +#define BOOST_INTERPROCESS_ALLOCATOR_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +//!\file +//!Describes an allocator that allocates portions of fixed size +//!memory buffer (shared memory, mapped file...) + +namespace boost { +namespace interprocess { + + +//!An STL compatible allocator that uses a segment manager as +//!memory source. The internal pointer type will of the same type (raw, smart) as +//!"typename SegmentManager::void_pointer" type. This allows +//!placing the allocator in shared memory, memory mapped-files, etc... +template +class allocator +{ + public: + //Segment manager + typedef SegmentManager segment_manager; + typedef typename SegmentManager::void_pointer void_pointer; + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + private: + + //Self type + typedef allocator self_t; + + //Pointer to void + typedef typename segment_manager::void_pointer aux_pointer_t; + + //Typedef to const void pointer + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type cvoid_ptr; + + //Pointer to the allocator + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type alloc_ptr_t; + + //Not assignable from related allocator + template + allocator& operator=(const allocator&); + + //Not assignable from other allocator + allocator& operator=(const allocator&); + + //Pointer to the allocator + alloc_ptr_t mp_mngr; + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + public: + typedef T value_type; + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type pointer; + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type const_pointer; + typedef typename ipcdetail::add_reference + ::type reference; + typedef typename ipcdetail::add_reference + ::type const_reference; + typedef typename segment_manager::size_type size_type; + typedef typename segment_manager::difference_type difference_type; + + typedef boost::interprocess::version_type version; + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + + //Experimental. Don't use. + typedef boost::container::container_detail::transform_multiallocation_chain + multiallocation_chain; + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + //!Obtains an allocator that allocates + //!objects of type T2 + template + struct rebind + { + typedef allocator other; + }; + + //!Returns the segment manager. + //!Never throws + segment_manager* get_segment_manager()const + { return ipcdetail::to_raw_pointer(mp_mngr); } + + //!Constructor from the segment manager. + //!Never throws + allocator(segment_manager *segment_mngr) + : mp_mngr(segment_mngr) { } + + //!Constructor from other allocator. + //!Never throws + allocator(const allocator &other) + : mp_mngr(other.get_segment_manager()){ } + + //!Constructor from related allocator. + //!Never throws + template + allocator(const allocator &other) + : mp_mngr(other.get_segment_manager()){} + + //!Allocates memory for an array of count elements. + //!Throws boost::interprocess::bad_alloc if there is no enough memory + pointer allocate(size_type count, cvoid_ptr hint = 0) + { + (void)hint; + if(size_overflows(count)){ + throw bad_alloc(); + } + return pointer(static_cast(mp_mngr->allocate(count*sizeof(T)))); + } + + //!Deallocates memory previously allocated. + //!Never throws + void deallocate(const pointer &ptr, size_type) + { mp_mngr->deallocate((void*)ipcdetail::to_raw_pointer(ptr)); } + + //!Returns the number of elements that could be allocated. + //!Never throws + size_type max_size() const + { return mp_mngr->get_size()/sizeof(T); } + + //!Swap segment manager. Does not throw. If each allocator is placed in + //!different memory segments, the result is undefined. + friend void swap(self_t &alloc1, self_t &alloc2) + { boost::adl_move_swap(alloc1.mp_mngr, alloc2.mp_mngr); } + + //!Returns maximum the number of objects the previously allocated memory + //!pointed by p can hold. This size only works for memory allocated with + //!allocate, allocation_command and allocate_many. + size_type size(const pointer &p) const + { + return (size_type)mp_mngr->size(ipcdetail::to_raw_pointer(p))/sizeof(T); + } + + pointer allocation_command(boost::interprocess::allocation_type command, + size_type limit_size, size_type &prefer_in_recvd_out_size, pointer &reuse) + { + value_type *reuse_raw = ipcdetail::to_raw_pointer(reuse); + pointer const p = mp_mngr->allocation_command(command, limit_size, prefer_in_recvd_out_size, reuse_raw); + reuse = reuse_raw; + return p; + } + + //!Allocates many elements of size elem_size in a contiguous block + //!of memory. The minimum number to be allocated is min_elements, + //!the preferred and maximum number is + //!preferred_elements. The number of actually allocated elements is + //!will be assigned to received_size. The elements must be deallocated + //!with deallocate(...) + void allocate_many(size_type elem_size, size_type num_elements, multiallocation_chain &chain) + { + if(size_overflows(elem_size)){ + throw bad_alloc(); + } + mp_mngr->allocate_many(elem_size*sizeof(T), num_elements, chain); + } + + //!Allocates n_elements elements, each one of size elem_sizes[i]in a + //!contiguous block + //!of memory. The elements must be deallocated + void allocate_many(const size_type *elem_sizes, size_type n_elements, multiallocation_chain &chain) + { + mp_mngr->allocate_many(elem_sizes, n_elements, sizeof(T), chain); + } + + //!Allocates many elements of size elem_size in a contiguous block + //!of memory. The minimum number to be allocated is min_elements, + //!the preferred and maximum number is + //!preferred_elements. The number of actually allocated elements is + //!will be assigned to received_size. The elements must be deallocated + //!with deallocate(...) + void deallocate_many(multiallocation_chain &chain) + { mp_mngr->deallocate_many(chain); } + + //!Allocates just one object. Memory allocated with this function + //!must be deallocated only with deallocate_one(). + //!Throws boost::interprocess::bad_alloc if there is no enough memory + pointer allocate_one() + { return this->allocate(1); } + + //!Allocates many elements of size == 1 in a contiguous block + //!of memory. The minimum number to be allocated is min_elements, + //!the preferred and maximum number is + //!preferred_elements. The number of actually allocated elements is + //!will be assigned to received_size. Memory allocated with this function + //!must be deallocated only with deallocate_one(). + void allocate_individual(size_type num_elements, multiallocation_chain &chain) + { this->allocate_many(1, num_elements, chain); } + + //!Deallocates memory previously allocated with allocate_one(). + //!You should never use deallocate_one to deallocate memory allocated + //!with other functions different from allocate_one(). Never throws + void deallocate_one(const pointer &p) + { return this->deallocate(p, 1); } + + //!Allocates many elements of size == 1 in a contiguous block + //!of memory. The minimum number to be allocated is min_elements, + //!the preferred and maximum number is + //!preferred_elements. The number of actually allocated elements is + //!will be assigned to received_size. Memory allocated with this function + //!must be deallocated only with deallocate_one(). + void deallocate_individual(multiallocation_chain &chain) + { this->deallocate_many(chain); } + + //!Returns address of mutable object. + //!Never throws + pointer address(reference value) const + { return pointer(boost::addressof(value)); } + + //!Returns address of non mutable object. + //!Never throws + const_pointer address(const_reference value) const + { return const_pointer(boost::addressof(value)); } + + //!Constructs an object + //!Throws if T's constructor throws + //!For backwards compatibility with libraries using C++03 allocators + template + void construct(const pointer &ptr, BOOST_FWD_REF(P) p) + { ::new((void*)ipcdetail::to_raw_pointer(ptr), boost_container_new_t()) value_type(::boost::forward

(p)); } + + //!Destroys object. Throws if object's + //!destructor throws + void destroy(const pointer &ptr) + { BOOST_ASSERT(ptr != 0); (*ptr).~value_type(); } + +}; + +//!Equality test for same type +//!of allocator +template inline +bool operator==(const allocator &alloc1, + const allocator &alloc2) + { return alloc1.get_segment_manager() == alloc2.get_segment_manager(); } + +//!Inequality test for same type +//!of allocator +template inline +bool operator!=(const allocator &alloc1, + const allocator &alloc2) + { return alloc1.get_segment_manager() != alloc2.get_segment_manager(); } + +} //namespace interprocess { + +#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + +template +struct has_trivial_destructor; + +template +struct has_trivial_destructor + > +{ + static const bool value = true; +}; +#endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + +} //namespace boost { + +#include + +#endif //BOOST_INTERPROCESS_ALLOCATOR_HPP + diff --git a/boost/interprocess/allocators/detail/allocator_common.hpp b/boost/interprocess/allocators/detail/allocator_common.hpp new file mode 100644 index 000000000..f613ffd82 --- /dev/null +++ b/boost/interprocess/allocators/detail/allocator_common.hpp @@ -0,0 +1,858 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2008-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_ALLOCATOR_DETAIL_ALLOCATOR_COMMON_HPP +#define BOOST_INTERPROCESS_ALLOCATOR_DETAIL_ALLOCATOR_COMMON_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +#include + +#include +#include //to_raw_pointer +#include //boost::addressof +#include //BOOST_ASSERT +#include //bad_alloc +#include //scoped_lock +#include //boost::interprocess::allocation_type +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace interprocess { + +template +struct sizeof_value +{ + static const std::size_t value = sizeof(T); +}; + +template <> +struct sizeof_value +{ + static const std::size_t value = sizeof(void*); +}; + +template <> +struct sizeof_value +{ + static const std::size_t value = sizeof(void*); +}; + +template <> +struct sizeof_value +{ + static const std::size_t value = sizeof(void*); +}; + +template <> +struct sizeof_value +{ + static const std::size_t value = sizeof(void*); +}; + +namespace ipcdetail { + +//!Object function that creates the node allocator if it is not created and +//!increments reference count if it is already created +template +struct get_or_create_node_pool_func +{ + + //!This connects or constructs the unique instance of node_pool_t + //!Can throw boost::interprocess::bad_alloc + void operator()() + { + //Find or create the node_pool_t + mp_node_pool = mp_segment_manager->template find_or_construct + (boost::interprocess::unique_instance)(mp_segment_manager); + //If valid, increment link count + if(mp_node_pool != 0) + mp_node_pool->inc_ref_count(); + } + + //!Constructor. Initializes function + //!object parameters + get_or_create_node_pool_func(typename NodePool::segment_manager *mngr) + : mp_segment_manager(mngr){} + + NodePool *mp_node_pool; + typename NodePool::segment_manager *mp_segment_manager; +}; + +template +inline NodePool *get_or_create_node_pool(typename NodePool::segment_manager *mgnr) +{ + ipcdetail::get_or_create_node_pool_func func(mgnr); + mgnr->atomic_func(func); + return func.mp_node_pool; +} + +//!Object function that decrements the reference count. If the count +//!reaches to zero destroys the node allocator from memory. +//!Never throws +template +struct destroy_if_last_link_func +{ + //!Decrements reference count and destroys the object if there is no + //!more attached allocators. Never throws + void operator()() + { + //If not the last link return + if(mp_node_pool->dec_ref_count() != 0) return; + + //Last link, let's destroy the segment_manager + mp_node_pool->get_segment_manager()->template destroy(boost::interprocess::unique_instance); + } + + //!Constructor. Initializes function + //!object parameters + destroy_if_last_link_func(NodePool *pool) + : mp_node_pool(pool) + {} + + NodePool *mp_node_pool; +}; + +//!Destruction function, initializes and executes destruction function +//!object. Never throws +template +inline void destroy_node_pool_if_last_link(NodePool *pool) +{ + //Get segment manager + typename NodePool::segment_manager *mngr = pool->get_segment_manager(); + //Execute destruction functor atomically + destroy_if_last_link_funcfunc(pool); + mngr->atomic_func(func); +} + +template +class cache_impl +{ + typedef typename NodePool::segment_manager:: + void_pointer void_pointer; + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type node_pool_ptr; + typedef typename NodePool::multiallocation_chain multiallocation_chain; + typedef typename NodePool::segment_manager::size_type size_type; + node_pool_ptr mp_node_pool; + multiallocation_chain m_cached_nodes; + size_type m_max_cached_nodes; + + public: + typedef typename NodePool::segment_manager segment_manager; + + cache_impl(segment_manager *segment_mngr, size_type max_cached_nodes) + : mp_node_pool(get_or_create_node_pool(segment_mngr)) + , m_max_cached_nodes(max_cached_nodes) + {} + + cache_impl(const cache_impl &other) + : mp_node_pool(other.get_node_pool()) + , m_max_cached_nodes(other.get_max_cached_nodes()) + { + mp_node_pool->inc_ref_count(); + } + + ~cache_impl() + { + this->deallocate_all_cached_nodes(); + ipcdetail::destroy_node_pool_if_last_link(ipcdetail::to_raw_pointer(mp_node_pool)); + } + + NodePool *get_node_pool() const + { return ipcdetail::to_raw_pointer(mp_node_pool); } + + segment_manager *get_segment_manager() const + { return mp_node_pool->get_segment_manager(); } + + size_type get_max_cached_nodes() const + { return m_max_cached_nodes; } + + void *cached_allocation() + { + //If don't have any cached node, we have to get a new list of free nodes from the pool + if(m_cached_nodes.empty()){ + mp_node_pool->allocate_nodes(m_max_cached_nodes/2, m_cached_nodes); + } + void *ret = ipcdetail::to_raw_pointer(m_cached_nodes.pop_front()); + return ret; + } + + void cached_allocation(size_type n, multiallocation_chain &chain) + { + size_type count = n, allocated(0); + BOOST_TRY{ + //If don't have any cached node, we have to get a new list of free nodes from the pool + while(!m_cached_nodes.empty() && count--){ + void *ret = ipcdetail::to_raw_pointer(m_cached_nodes.pop_front()); + chain.push_back(ret); + ++allocated; + } + + if(allocated != n){ + mp_node_pool->allocate_nodes(n - allocated, chain); + } + } + BOOST_CATCH(...){ + this->cached_deallocation(chain); + BOOST_RETHROW + } + BOOST_CATCH_END + } + + void cached_deallocation(void *ptr) + { + //Check if cache is full + if(m_cached_nodes.size() >= m_max_cached_nodes){ + //This only occurs if this allocator deallocate memory allocated + //with other equal allocator. Since the cache is full, and more + //deallocations are probably coming, we'll make some room in cache + //in a single, efficient multi node deallocation. + this->priv_deallocate_n_nodes(m_cached_nodes.size() - m_max_cached_nodes/2); + } + m_cached_nodes.push_front(ptr); + } + + void cached_deallocation(multiallocation_chain &chain) + { + m_cached_nodes.splice_after(m_cached_nodes.before_begin(), chain); + + //Check if cache is full + if(m_cached_nodes.size() >= m_max_cached_nodes){ + //This only occurs if this allocator deallocate memory allocated + //with other equal allocator. Since the cache is full, and more + //deallocations are probably coming, we'll make some room in cache + //in a single, efficient multi node deallocation. + this->priv_deallocate_n_nodes(m_cached_nodes.size() - m_max_cached_nodes/2); + } + } + + //!Sets the new max cached nodes value. This can provoke deallocations + //!if "newmax" is less than current cached nodes. Never throws + void set_max_cached_nodes(size_type newmax) + { + m_max_cached_nodes = newmax; + this->priv_deallocate_remaining_nodes(); + } + + //!Frees all cached nodes. + //!Never throws + void deallocate_all_cached_nodes() + { + if(m_cached_nodes.empty()) return; + mp_node_pool->deallocate_nodes(m_cached_nodes); + } + + private: + //!Frees all cached nodes at once. + //!Never throws + void priv_deallocate_remaining_nodes() + { + if(m_cached_nodes.size() > m_max_cached_nodes){ + priv_deallocate_n_nodes(m_cached_nodes.size()-m_max_cached_nodes); + } + } + + //!Frees n cached nodes at once. Never throws + void priv_deallocate_n_nodes(size_type n) + { + //This only occurs if this allocator deallocate memory allocated + //with other equal allocator. Since the cache is full, and more + //deallocations are probably coming, we'll make some room in cache + //in a single, efficient multi node deallocation. + size_type count(n); + typename multiallocation_chain::iterator it(m_cached_nodes.before_begin()); + while(count--){ + ++it; + } + multiallocation_chain chain; + chain.splice_after(chain.before_begin(), m_cached_nodes, m_cached_nodes.before_begin(), it, n); + //Deallocate all new linked list at once + mp_node_pool->deallocate_nodes(chain); + } + + public: + void swap(cache_impl &other) + { + ::boost::adl_move_swap(mp_node_pool, other.mp_node_pool); + ::boost::adl_move_swap(m_cached_nodes, other.m_cached_nodes); + ::boost::adl_move_swap(m_max_cached_nodes, other.m_max_cached_nodes); + } +}; + +template +class array_allocation_impl +{ + const Derived *derived() const + { return static_cast(this); } + Derived *derived() + { return static_cast(this); } + + typedef typename SegmentManager::void_pointer void_pointer; + + public: + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type pointer; + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type const_pointer; + typedef T value_type; + typedef typename ipcdetail::add_reference + ::type reference; + typedef typename ipcdetail::add_reference + ::type const_reference; + typedef typename SegmentManager::size_type size_type; + typedef typename SegmentManager::difference_type difference_type; + typedef boost::container::container_detail::transform_multiallocation_chain + multiallocation_chain; + + + public: + //!Returns maximum the number of objects the previously allocated memory + //!pointed by p can hold. This size only works for memory allocated with + //!allocate, allocation_command and allocate_many. + size_type size(const pointer &p) const + { + return (size_type)this->derived()->get_segment_manager()->size(ipcdetail::to_raw_pointer(p))/sizeof(T); + } + + pointer allocation_command(boost::interprocess::allocation_type command, + size_type limit_size, size_type &prefer_in_recvd_out_size, pointer &reuse) + { + value_type *reuse_raw = ipcdetail::to_raw_pointer(reuse); + pointer const p = this->derived()->get_segment_manager()->allocation_command + (command, limit_size, prefer_in_recvd_out_size, reuse_raw); + reuse = reuse_raw; + return p; + } + + //!Allocates many elements of size elem_size in a contiguous block + //!of memory. The minimum number to be allocated is min_elements, + //!the preferred and maximum number is + //!preferred_elements. The number of actually allocated elements is + //!will be assigned to received_size. The elements must be deallocated + //!with deallocate(...) + void allocate_many(size_type elem_size, size_type num_elements, multiallocation_chain &chain) + { + if(size_overflows(elem_size)){ + throw bad_alloc(); + } + this->derived()->get_segment_manager()->allocate_many(elem_size*sizeof(T), num_elements, chain); + } + + //!Allocates n_elements elements, each one of size elem_sizes[i]in a + //!contiguous block + //!of memory. The elements must be deallocated + void allocate_many(const size_type *elem_sizes, size_type n_elements, multiallocation_chain &chain) + { + this->derived()->get_segment_manager()->allocate_many(elem_sizes, n_elements, sizeof(T), chain); + } + + //!Allocates many elements of size elem_size in a contiguous block + //!of memory. The minimum number to be allocated is min_elements, + //!the preferred and maximum number is + //!preferred_elements. The number of actually allocated elements is + //!will be assigned to received_size. The elements must be deallocated + //!with deallocate(...) + void deallocate_many(multiallocation_chain &chain) + { this->derived()->get_segment_manager()->deallocate_many(chain); } + + //!Returns the number of elements that could be + //!allocated. Never throws + size_type max_size() const + { return this->derived()->get_segment_manager()->get_size()/sizeof(T); } + + //!Returns address of mutable object. + //!Never throws + pointer address(reference value) const + { return pointer(boost::addressof(value)); } + + //!Returns address of non mutable object. + //!Never throws + const_pointer address(const_reference value) const + { return const_pointer(boost::addressof(value)); } + + //!Constructs an object + //!Throws if T's constructor throws + //!For backwards compatibility with libraries using C++03 allocators + template + void construct(const pointer &ptr, BOOST_FWD_REF(P) p) + { ::new((void*)ipcdetail::to_raw_pointer(ptr), boost_container_new_t()) value_type(::boost::forward

(p)); } + + //!Destroys object. Throws if object's + //!destructor throws + void destroy(const pointer &ptr) + { BOOST_ASSERT(ptr != 0); (*ptr).~value_type(); } +}; + + +template +class node_pool_allocation_impl + : public array_allocation_impl + < Derived + , T + , SegmentManager> +{ + const Derived *derived() const + { return static_cast(this); } + Derived *derived() + { return static_cast(this); } + + typedef typename SegmentManager::void_pointer void_pointer; + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type cvoid_pointer; + + public: + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type pointer; + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type const_pointer; + typedef T value_type; + typedef typename ipcdetail::add_reference + ::type reference; + typedef typename ipcdetail::add_reference + ::type const_reference; + typedef typename SegmentManager::size_type size_type; + typedef typename SegmentManager::difference_type difference_type; + typedef boost::container::container_detail::transform_multiallocation_chain + multiallocation_chain; + + + template + struct node_pool + { + typedef typename Derived::template node_pool<0>::type type; + static type *get(void *p) + { return static_cast(p); } + }; + + public: + //!Allocate memory for an array of count elements. + //!Throws boost::interprocess::bad_alloc if there is no enough memory + pointer allocate(size_type count, cvoid_pointer hint = 0) + { + (void)hint; + typedef typename node_pool<0>::type node_pool_t; + node_pool_t *pool = node_pool<0>::get(this->derived()->get_node_pool()); + if(size_overflows(count)){ + throw bad_alloc(); + } + else if(Version == 1 && count == 1){ + return pointer(static_cast + (pool->allocate_node())); + } + else{ + return pointer(static_cast + (pool->get_segment_manager()->allocate(count*sizeof(T)))); + } + } + + //!Deallocate allocated memory. Never throws + void deallocate(const pointer &ptr, size_type count) + { + (void)count; + typedef typename node_pool<0>::type node_pool_t; + node_pool_t *pool = node_pool<0>::get(this->derived()->get_node_pool()); + if(Version == 1 && count == 1) + pool->deallocate_node(ipcdetail::to_raw_pointer(ptr)); + else + pool->get_segment_manager()->deallocate((void*)ipcdetail::to_raw_pointer(ptr)); + } + + //!Allocates just one object. Memory allocated with this function + //!must be deallocated only with deallocate_one(). + //!Throws boost::interprocess::bad_alloc if there is no enough memory + pointer allocate_one() + { + typedef typename node_pool<0>::type node_pool_t; + node_pool_t *pool = node_pool<0>::get(this->derived()->get_node_pool()); + return pointer(static_cast(pool->allocate_node())); + } + + //!Allocates many elements of size == 1 in a contiguous block + //!of memory. The minimum number to be allocated is min_elements, + //!the preferred and maximum number is + //!preferred_elements. The number of actually allocated elements is + //!will be assigned to received_size. Memory allocated with this function + //!must be deallocated only with deallocate_one(). + void allocate_individual(size_type num_elements, multiallocation_chain &chain) + { + typedef typename node_pool<0>::type node_pool_t; + node_pool_t *pool = node_pool<0>::get(this->derived()->get_node_pool()); + pool->allocate_nodes(num_elements, chain); + } + + //!Deallocates memory previously allocated with allocate_one(). + //!You should never use deallocate_one to deallocate memory allocated + //!with other functions different from allocate_one(). Never throws + void deallocate_one(const pointer &p) + { + typedef typename node_pool<0>::type node_pool_t; + node_pool_t *pool = node_pool<0>::get(this->derived()->get_node_pool()); + pool->deallocate_node(ipcdetail::to_raw_pointer(p)); + } + + //!Allocates many elements of size == 1 in a contiguous block + //!of memory. The minimum number to be allocated is min_elements, + //!the preferred and maximum number is + //!preferred_elements. The number of actually allocated elements is + //!will be assigned to received_size. Memory allocated with this function + //!must be deallocated only with deallocate_one(). + void deallocate_individual(multiallocation_chain &chain) + { + node_pool<0>::get(this->derived()->get_node_pool())->deallocate_nodes + (chain); + } + + //!Deallocates all free blocks of the pool + void deallocate_free_blocks() + { node_pool<0>::get(this->derived()->get_node_pool())->deallocate_free_blocks(); } + + //!Deprecated, use deallocate_free_blocks. + //!Deallocates all free chunks of the pool. + void deallocate_free_chunks() + { node_pool<0>::get(this->derived()->get_node_pool())->deallocate_free_blocks(); } +}; + +template +class cached_allocator_impl + : public array_allocation_impl + , T, typename NodePool::segment_manager> +{ + cached_allocator_impl & operator=(const cached_allocator_impl& other); + typedef array_allocation_impl + < cached_allocator_impl + + , T + , typename NodePool::segment_manager> base_t; + + public: + typedef NodePool node_pool_t; + typedef typename NodePool::segment_manager segment_manager; + typedef typename segment_manager::void_pointer void_pointer; + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type cvoid_pointer; + typedef typename base_t::pointer pointer; + typedef typename base_t::size_type size_type; + typedef typename base_t::multiallocation_chain multiallocation_chain; + typedef typename base_t::value_type value_type; + + public: + static const std::size_t DEFAULT_MAX_CACHED_NODES = 64; + + cached_allocator_impl(segment_manager *segment_mngr, size_type max_cached_nodes) + : m_cache(segment_mngr, max_cached_nodes) + {} + + cached_allocator_impl(const cached_allocator_impl &other) + : m_cache(other.m_cache) + {} + + //!Copy constructor from related cached_adaptive_pool_base. If not present, constructs + //!a node pool. Increments the reference count of the associated node pool. + //!Can throw boost::interprocess::bad_alloc + template + cached_allocator_impl + (const cached_allocator_impl + &other) + : m_cache(other.get_segment_manager(), other.get_max_cached_nodes()) + {} + + //!Returns a pointer to the node pool. + //!Never throws + node_pool_t* get_node_pool() const + { return m_cache.get_node_pool(); } + + //!Returns the segment manager. + //!Never throws + segment_manager* get_segment_manager()const + { return m_cache.get_segment_manager(); } + + //!Sets the new max cached nodes value. This can provoke deallocations + //!if "newmax" is less than current cached nodes. Never throws + void set_max_cached_nodes(size_type newmax) + { m_cache.set_max_cached_nodes(newmax); } + + //!Returns the max cached nodes parameter. + //!Never throws + size_type get_max_cached_nodes() const + { return m_cache.get_max_cached_nodes(); } + + //!Allocate memory for an array of count elements. + //!Throws boost::interprocess::bad_alloc if there is no enough memory + pointer allocate(size_type count, cvoid_pointer hint = 0) + { + (void)hint; + void * ret; + if(size_overflows(count)){ + throw bad_alloc(); + } + else if(Version == 1 && count == 1){ + ret = m_cache.cached_allocation(); + } + else{ + ret = this->get_segment_manager()->allocate(count*sizeof(T)); + } + return pointer(static_cast(ret)); + } + + //!Deallocate allocated memory. Never throws + void deallocate(const pointer &ptr, size_type count) + { + (void)count; + if(Version == 1 && count == 1){ + m_cache.cached_deallocation(ipcdetail::to_raw_pointer(ptr)); + } + else{ + this->get_segment_manager()->deallocate((void*)ipcdetail::to_raw_pointer(ptr)); + } + } + + //!Allocates just one object. Memory allocated with this function + //!must be deallocated only with deallocate_one(). + //!Throws boost::interprocess::bad_alloc if there is no enough memory + pointer allocate_one() + { return pointer(static_cast(this->m_cache.cached_allocation())); } + + //!Allocates many elements of size == 1 in a contiguous block + //!of memory. The minimum number to be allocated is min_elements, + //!the preferred and maximum number is + //!preferred_elements. The number of actually allocated elements is + //!will be assigned to received_size. Memory allocated with this function + //!must be deallocated only with deallocate_one(). + void allocate_individual(size_type num_elements, multiallocation_chain &chain) + { this->m_cache.cached_allocation(num_elements, chain); } + + //!Deallocates memory previously allocated with allocate_one(). + //!You should never use deallocate_one to deallocate memory allocated + //!with other functions different from allocate_one(). Never throws + void deallocate_one(const pointer &p) + { this->m_cache.cached_deallocation(ipcdetail::to_raw_pointer(p)); } + + //!Allocates many elements of size == 1 in a contiguous block + //!of memory. The minimum number to be allocated is min_elements, + //!the preferred and maximum number is + //!preferred_elements. The number of actually allocated elements is + //!will be assigned to received_size. Memory allocated with this function + //!must be deallocated only with deallocate_one(). + void deallocate_individual(multiallocation_chain &chain) + { m_cache.cached_deallocation(chain); } + + //!Deallocates all free blocks of the pool + void deallocate_free_blocks() + { m_cache.get_node_pool()->deallocate_free_blocks(); } + + //!Swaps allocators. Does not throw. If each allocator is placed in a + //!different shared memory segments, the result is undefined. + friend void swap(cached_allocator_impl &alloc1, cached_allocator_impl &alloc2) + { ::boost::adl_move_swap(alloc1.m_cache, alloc2.m_cache); } + + void deallocate_cache() + { m_cache.deallocate_all_cached_nodes(); } + + //!Deprecated use deallocate_free_blocks. + void deallocate_free_chunks() + { m_cache.get_node_pool()->deallocate_free_blocks(); } + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + private: + cache_impl m_cache; + #endif //!defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) +}; + +//!Equality test for same type of +//!cached_allocator_impl +template inline +bool operator==(const cached_allocator_impl &alloc1, + const cached_allocator_impl &alloc2) + { return alloc1.get_node_pool() == alloc2.get_node_pool(); } + +//!Inequality test for same type of +//!cached_allocator_impl +template inline +bool operator!=(const cached_allocator_impl &alloc1, + const cached_allocator_impl &alloc2) + { return alloc1.get_node_pool() != alloc2.get_node_pool(); } + + +//!Pooled shared memory allocator using adaptive pool. Includes +//!a reference count but the class does not delete itself, this is +//!responsibility of user classes. Node size (NodeSize) and the number of +//!nodes allocated per block (NodesPerBlock) are known at compile time +template +class shared_pool_impl + : public private_node_allocator_t +{ + public: + //!Segment manager typedef + typedef typename private_node_allocator_t:: + segment_manager segment_manager; + typedef typename private_node_allocator_t:: + multiallocation_chain multiallocation_chain; + typedef typename private_node_allocator_t:: + size_type size_type; + + private: + typedef typename segment_manager::mutex_family::mutex_type mutex_type; + + public: + //!Constructor from a segment manager. Never throws + shared_pool_impl(segment_manager *segment_mngr) + : private_node_allocator_t(segment_mngr) + {} + + //!Destructor. Deallocates all allocated blocks. Never throws + ~shared_pool_impl() + {} + + //!Allocates array of count elements. Can throw boost::interprocess::bad_alloc + void *allocate_node() + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + return private_node_allocator_t::allocate_node(); + } + + //!Deallocates an array pointed by ptr. Never throws + void deallocate_node(void *ptr) + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + private_node_allocator_t::deallocate_node(ptr); + } + + //!Allocates n nodes. + //!Can throw boost::interprocess::bad_alloc + void allocate_nodes(const size_type n, multiallocation_chain &chain) + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + private_node_allocator_t::allocate_nodes(n, chain); + } + + //!Deallocates a linked list of nodes ending in null pointer. Never throws + void deallocate_nodes(multiallocation_chain &nodes, size_type num) + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + private_node_allocator_t::deallocate_nodes(nodes, num); + } + + //!Deallocates the nodes pointed by the multiallocation iterator. Never throws + void deallocate_nodes(multiallocation_chain &chain) + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + private_node_allocator_t::deallocate_nodes(chain); + } + + //!Deallocates all the free blocks of memory. Never throws + void deallocate_free_blocks() + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + private_node_allocator_t::deallocate_free_blocks(); + } + + //!Deallocates all used memory from the common pool. + //!Precondition: all nodes allocated from this pool should + //!already be deallocated. Otherwise, undefined behavior. Never throws + void purge_blocks() + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + private_node_allocator_t::purge_blocks(); + } + + //!Increments internal reference count and returns new count. Never throws + size_type inc_ref_count() + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + return ++m_header.m_usecount; + } + + //!Decrements internal reference count and returns new count. Never throws + size_type dec_ref_count() + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + BOOST_ASSERT(m_header.m_usecount > 0); + return --m_header.m_usecount; + } + + //!Deprecated, use deallocate_free_blocks. + void deallocate_free_chunks() + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + private_node_allocator_t::deallocate_free_blocks(); + } + + //!Deprecated, use purge_blocks. + void purge_chunks() + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + private_node_allocator_t::purge_blocks(); + } + + private: + //!This struct includes needed data and derives from + //!the mutex type to allow EBO when using null_mutex + struct header_t : mutex_type + { + size_type m_usecount; //Number of attached allocators + + header_t() + : m_usecount(0) {} + } m_header; +}; + +} //namespace ipcdetail { +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //#ifndef BOOST_INTERPROCESS_ALLOCATOR_DETAIL_ALLOCATOR_COMMON_HPP diff --git a/boost/interprocess/containers/allocation_type.hpp b/boost/interprocess/containers/allocation_type.hpp new file mode 100644 index 000000000..717520747 --- /dev/null +++ b/boost/interprocess/containers/allocation_type.hpp @@ -0,0 +1,44 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2008-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_CONTAINERS_ALLOCATION_TYPE_HPP +#define BOOST_INTERPROCESS_CONTAINERS_ALLOCATION_TYPE_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +namespace boost { +namespace interprocess { + +#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) +typedef int allocation_type; +#endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED +static const allocation_type allocate_new = boost::container::allocate_new; +static const allocation_type expand_fwd = boost::container::expand_fwd; +static const allocation_type expand_bwd = boost::container::expand_bwd; +static const allocation_type shrink_in_place = boost::container::shrink_in_place; +static const allocation_type try_shrink_in_place= boost::container::try_shrink_in_place; +static const allocation_type nothrow_allocation = boost::container::nothrow_allocation; +static const allocation_type zero_memory = boost::container::zero_memory; + +} //namespace interprocess { +} //namespace boost { + +#include + +#endif // #ifndef BOOST_INTERPROCESS_CONTAINERS_ALLOCATION_TYPE_HPP diff --git a/boost/interprocess/containers/containers_fwd.hpp b/boost/interprocess/containers/containers_fwd.hpp new file mode 100644 index 000000000..9620a92ee --- /dev/null +++ b/boost/interprocess/containers/containers_fwd.hpp @@ -0,0 +1,44 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2009-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_CONTAINERS_CONTAINERS_FWD_HPP +#define BOOST_INTERPROCESS_CONTAINERS_CONTAINERS_FWD_HPP + +#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +////////////////////////////////////////////////////////////////////////////// +// Standard predeclarations +////////////////////////////////////////////////////////////////////////////// + +#include +#include + +namespace boost { +namespace interprocess { + +using boost::container::ordered_range; +using boost::container::ordered_unique_range; + +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + +#endif // #ifndef BOOST_INTERPROCESS_CONTAINERS_CONTAINERS_FWD_HPP diff --git a/boost/interprocess/containers/string.hpp b/boost/interprocess/containers/string.hpp new file mode 100644 index 000000000..bd1286411 --- /dev/null +++ b/boost/interprocess/containers/string.hpp @@ -0,0 +1,37 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2008-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_CONTAINERS_STRING_HPP +#define BOOST_INTERPROCESS_CONTAINERS_STRING_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include +#include + +namespace boost { +namespace interprocess { + +using boost::container::basic_string; +using boost::container::string; + +} //namespace interprocess { +} //namespace boost { + +#include + +#endif // #ifndef BOOST_INTERPROCESS_CONTAINERS_STRING_HPP diff --git a/boost/interprocess/containers/vector.hpp b/boost/interprocess/containers/vector.hpp new file mode 100644 index 000000000..89b3e4714 --- /dev/null +++ b/boost/interprocess/containers/vector.hpp @@ -0,0 +1,37 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2008-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_CONTAINERS_VECTOR_HPP +#define BOOST_INTERPROCESS_CONTAINERS_VECTOR_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include +#include + +namespace boost { +namespace interprocess { + +using boost::container::vector; + +} //namespace interprocess { +} //namespace boost { + +#include + +#endif // #ifndef BOOST_INTERPROCESS_CONTAINERS_VECTOR_HPP + diff --git a/boost/interprocess/containers/version_type.hpp b/boost/interprocess/containers/version_type.hpp new file mode 100644 index 000000000..22b5eef4f --- /dev/null +++ b/boost/interprocess/containers/version_type.hpp @@ -0,0 +1,37 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2008-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_CONTAINERS_VERSION_TYPE_HPP +#define BOOST_INTERPROCESS_CONTAINERS_VERSION_TYPE_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +namespace boost { +namespace interprocess { + +using boost::container::container_detail::version_type; +using boost::container::container_detail::version; + +} //namespace interprocess { +} //namespace boost { + +#include + +#endif // #ifndef BOOST_INTERPROCESS_CONTAINERS_VERSION_TYPE_HPP + diff --git a/boost/interprocess/detail/cast_tags.hpp b/boost/interprocess/detail/cast_tags.hpp new file mode 100644 index 000000000..e47b86344 --- /dev/null +++ b/boost/interprocess/detail/cast_tags.hpp @@ -0,0 +1,31 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_DETAIL_CAST_TAGS_HPP +#define BOOST_INTERPROCESS_DETAIL_CAST_TAGS_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { namespace interprocess { namespace ipcdetail { + +struct static_cast_tag {}; +struct const_cast_tag {}; +struct dynamic_cast_tag {}; +struct reinterpret_cast_tag {}; + +}}} //namespace boost { namespace interprocess { namespace ipcdetail { + +#endif //#ifndef BOOST_INTERPROCESS_DETAIL_CAST_TAGS_HPP diff --git a/boost/interprocess/detail/file_wrapper.hpp b/boost/interprocess/detail/file_wrapper.hpp new file mode 100644 index 000000000..58f28e97f --- /dev/null +++ b/boost/interprocess/detail/file_wrapper.hpp @@ -0,0 +1,212 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2006-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_DETAIL_FILE_WRAPPER_HPP +#define BOOST_INTERPROCESS_DETAIL_FILE_WRAPPER_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace interprocess { +namespace ipcdetail{ + +class file_wrapper +{ + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + BOOST_MOVABLE_BUT_NOT_COPYABLE(file_wrapper) + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + public: + + //!Default constructor. + //!Represents an empty file_wrapper. + file_wrapper(); + + //!Creates a file object with name "name" and mode "mode", with the access mode "mode" + //!If the file previously exists, throws an error. + file_wrapper(create_only_t, const char *name, mode_t mode, const permissions &perm = permissions()) + { this->priv_open_or_create(ipcdetail::DoCreate, name, mode, perm); } + + //!Tries to create a file with name "name" and mode "mode", with the + //!access mode "mode". If the file previously exists, it tries to open it with mode "mode". + //!Otherwise throws an error. + file_wrapper(open_or_create_t, const char *name, mode_t mode, const permissions &perm = permissions()) + { this->priv_open_or_create(ipcdetail::DoOpenOrCreate, name, mode, perm); } + + //!Tries to open a file with name "name", with the access mode "mode". + //!If the file does not previously exist, it throws an error. + file_wrapper(open_only_t, const char *name, mode_t mode) + { this->priv_open_or_create(ipcdetail::DoOpen, name, mode, permissions()); } + + //!Moves the ownership of "moved"'s file to *this. + //!After the call, "moved" does not represent any file. + //!Does not throw + file_wrapper(BOOST_RV_REF(file_wrapper) moved) + : m_handle(file_handle_t(ipcdetail::invalid_file())) + { this->swap(moved); } + + //!Moves the ownership of "moved"'s file to *this. + //!After the call, "moved" does not represent any file. + //!Does not throw + file_wrapper &operator=(BOOST_RV_REF(file_wrapper) moved) + { + file_wrapper tmp(boost::move(moved)); + this->swap(tmp); + return *this; + } + + //!Swaps to file_wrappers. + //!Does not throw + void swap(file_wrapper &other); + + //!Erases a file from the system. + //!Returns false on error. Never throws + static bool remove(const char *name); + + //!Sets the size of the file + void truncate(offset_t length); + + //!Closes the + //!file + ~file_wrapper(); + + //!Returns the name of the file + //!used in the constructor + const char *get_name() const; + + //!Returns the name of the file + //!used in the constructor + bool get_size(offset_t &size) const; + + //!Returns access mode + //!used in the constructor + mode_t get_mode() const; + + //!Get mapping handle + //!to use with mapped_region + mapping_handle_t get_mapping_handle() const; + + private: + //!Closes a previously opened file mapping. Never throws. + void priv_close(); + //!Closes a previously opened file mapping. Never throws. + bool priv_open_or_create(ipcdetail::create_enum_t type, const char *filename, mode_t mode, const permissions &perm); + + file_handle_t m_handle; + mode_t m_mode; + std::string m_filename; +}; + +inline file_wrapper::file_wrapper() + : m_handle(file_handle_t(ipcdetail::invalid_file())) +{} + +inline file_wrapper::~file_wrapper() +{ this->priv_close(); } + +inline const char *file_wrapper::get_name() const +{ return m_filename.c_str(); } + +inline bool file_wrapper::get_size(offset_t &size) const +{ return get_file_size((file_handle_t)m_handle, size); } + +inline void file_wrapper::swap(file_wrapper &other) +{ + (simple_swap)(m_handle, other.m_handle); + (simple_swap)(m_mode, other.m_mode); + m_filename.swap(other.m_filename); +} + +inline mapping_handle_t file_wrapper::get_mapping_handle() const +{ return mapping_handle_from_file_handle(m_handle); } + +inline mode_t file_wrapper::get_mode() const +{ return m_mode; } + +inline bool file_wrapper::priv_open_or_create + (ipcdetail::create_enum_t type, + const char *filename, + mode_t mode, + const permissions &perm = permissions()) +{ + m_filename = filename; + + if(mode != read_only && mode != read_write){ + error_info err(mode_error); + throw interprocess_exception(err); + } + + //Open file existing native API to obtain the handle + switch(type){ + case ipcdetail::DoOpen: + m_handle = open_existing_file(filename, mode); + break; + case ipcdetail::DoCreate: + m_handle = create_new_file(filename, mode, perm); + break; + case ipcdetail::DoOpenOrCreate: + m_handle = create_or_open_file(filename, mode, perm); + break; + default: + { + error_info err = other_error; + throw interprocess_exception(err); + } + } + + //Check for error + if(m_handle == invalid_file()){ + error_info err = system_error_code(); + throw interprocess_exception(err); + } + + m_mode = mode; + return true; +} + +inline bool file_wrapper::remove(const char *filename) +{ return delete_file(filename); } + +inline void file_wrapper::truncate(offset_t length) +{ + if(!truncate_file(m_handle, length)){ + error_info err(system_error_code()); + throw interprocess_exception(err); + } +} + +inline void file_wrapper::priv_close() +{ + if(m_handle != invalid_file()){ + close_file(m_handle); + m_handle = invalid_file(); + } +} + +} //namespace ipcdetail{ +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //BOOST_INTERPROCESS_DETAIL_FILE_WRAPPER_HPP diff --git a/boost/interprocess/detail/in_place_interface.hpp b/boost/interprocess/detail/in_place_interface.hpp new file mode 100644 index 000000000..013691ad7 --- /dev/null +++ b/boost/interprocess/detail/in_place_interface.hpp @@ -0,0 +1,77 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_IN_PLACE_INTERFACE_HPP +#define BOOST_INTERPROCESS_IN_PLACE_INTERFACE_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include +#include +#include //alignment_of, aligned_storage +#include //typeid + +//!\file +//!Describes an abstract interface for placement construction and destruction. + +namespace boost { +namespace interprocess { +namespace ipcdetail { + +struct in_place_interface +{ + in_place_interface(std::size_t alignm, std::size_t sz, const char *tname) + : alignment(alignm), size(sz), type_name(tname) + {} + + std::size_t alignment; + std::size_t size; + const char *type_name; + + virtual void construct_n(void *mem, std::size_t num, std::size_t &constructed) = 0; + virtual void destroy_n(void *mem, std::size_t num, std::size_t &destroyed) = 0; + virtual ~in_place_interface(){} +}; + +template +struct placement_destroy : public in_place_interface +{ + placement_destroy() + : in_place_interface(::boost::container::container_detail::alignment_of::value, sizeof(T), typeid(T).name()) + {} + + virtual void destroy_n(void *mem, std::size_t num, std::size_t &destroyed) + { + T* memory = static_cast(mem); + for(destroyed = 0; destroyed < num; ++destroyed) + (memory++)->~T(); + } + + virtual void construct_n(void *, std::size_t, std::size_t &) {} + + private: + void destroy(void *mem) + { static_cast(mem)->~T(); } +}; + +} +} +} //namespace boost { namespace interprocess { namespace ipcdetail { + +#include + +#endif //#ifndef BOOST_INTERPROCESS_IN_PLACE_INTERFACE_HPP diff --git a/boost/interprocess/detail/managed_memory_impl.hpp b/boost/interprocess/detail/managed_memory_impl.hpp new file mode 100644 index 000000000..939dc6a97 --- /dev/null +++ b/boost/interprocess/detail/managed_memory_impl.hpp @@ -0,0 +1,775 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_DETAIL_MANAGED_MEMORY_IMPL_HPP +#define BOOST_INTERPROCESS_DETAIL_MANAGED_MEMORY_IMPL_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +// +#include +// +#include +#include + +//!\file +//!Describes a named shared memory allocation user class. +//! + +namespace boost { +namespace interprocess { +namespace ipcdetail { + +template +class create_open_func; + +template< + class CharType, + class MemoryAlgorithm, + template class IndexType + > +struct segment_manager_type +{ + typedef segment_manager type; +}; + +//!This class is designed to be a base class to classes that manage +//!creation of objects in a fixed size memory buffer. Apart +//!from allocating raw memory, the user can construct named objects. To +//!achieve this, this class uses the reserved space provided by the allocation +//!algorithm to place a named_allocator_algo, who takes care of name mappings. +//!The class can be customized with the char type used for object names +//!and the memory allocation algorithm to be used.*/ +template < class CharType + , class MemoryAlgorithm + , template class IndexType + , std::size_t Offset = 0 + > +class basic_managed_memory_impl +{ + //Non-copyable + basic_managed_memory_impl(const basic_managed_memory_impl &); + basic_managed_memory_impl &operator=(const basic_managed_memory_impl &); + + template + friend class create_open_func; + + public: + typedef typename segment_manager_type + ::type segment_manager; + typedef CharType char_type; + typedef MemoryAlgorithm memory_algorithm; + typedef typename MemoryAlgorithm::mutex_family mutex_family; + typedef CharType char_t; + typedef typename MemoryAlgorithm::size_type size_type; + typedef typename MemoryAlgorithm::difference_type difference_type; + typedef difference_type handle_t; + typedef typename segment_manager:: + const_named_iterator const_named_iterator; + typedef typename segment_manager:: + const_unique_iterator const_unique_iterator; + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + + typedef typename + segment_manager::char_ptr_holder_t char_ptr_holder_t; + //Experimental. Don't use. + + typedef typename segment_manager::multiallocation_chain multiallocation_chain; + + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + static const size_type PayloadPerAllocation = segment_manager::PayloadPerAllocation; + + private: + typedef basic_managed_memory_impl + self_t; + protected: + template + static bool grow(const char *filename, size_type extra_bytes) + { + typedef typename ManagedMemory::device_type device_type; + //Increase file size + try{ + offset_t old_size; + { + device_type f(open_or_create, filename, read_write); + if(!f.get_size(old_size)) + return false; + f.truncate(old_size + extra_bytes); + } + ManagedMemory managed_memory(open_only, filename); + //Grow always works + managed_memory.self_t::grow(extra_bytes); + } + catch(...){ + return false; + } + return true; + } + + template + static bool shrink_to_fit(const char *filename) + { + typedef typename ManagedMemory::device_type device_type; + size_type new_size; + try{ + ManagedMemory managed_memory(open_only, filename); + managed_memory.get_size(); + managed_memory.self_t::shrink_to_fit(); + new_size = managed_memory.get_size(); + } + catch(...){ + return false; + } + + //Decrease file size + { + device_type f(open_or_create, filename, read_write); + f.truncate(new_size); + } + return true; + } + + //!Constructor. Allocates basic resources. Never throws. + basic_managed_memory_impl() + : mp_header(0){} + + //!Destructor. Calls close. Never throws. + ~basic_managed_memory_impl() + { this->close_impl(); } + + //!Places segment manager in the reserved space. This can throw. + bool create_impl (void *addr, size_type size) + { + if(mp_header) return false; + + //Check if there is enough space + if(size < segment_manager::get_min_size()) + return false; + + //This function should not throw. The index construction can + //throw if constructor allocates memory. So we must catch it. + BOOST_TRY{ + //Let's construct the allocator in memory + mp_header = ::new(addr, boost_container_new_t()) segment_manager(size); + } + BOOST_CATCH(...){ + return false; + } + BOOST_CATCH_END + return true; + } + + //!Connects to a segment manager in the reserved buffer. Never throws. + bool open_impl (void *addr, size_type) + { + if(mp_header) return false; + mp_header = static_cast(addr); + return true; + } + + //!Frees resources. Never throws. + bool close_impl() + { + bool ret = mp_header != 0; + mp_header = 0; + return ret; + } + + //!Frees resources and destroys common resources. Never throws. + bool destroy_impl() + { + if(mp_header == 0) + return false; + mp_header->~segment_manager(); + this->close_impl(); + return true; + } + + //! + void grow(size_type extra_bytes) + { mp_header->grow(extra_bytes); } + + void shrink_to_fit() + { mp_header->shrink_to_fit(); } + + public: + + //!Returns segment manager. Never throws. + segment_manager *get_segment_manager() const + { return mp_header; } + + //!Returns the base address of the memory in this process. Never throws. + void * get_address () const + { return reinterpret_cast(mp_header) - Offset; } + + //!Returns the size of memory segment. Never throws. + size_type get_size () const + { return mp_header->get_size() + Offset; } + + //!Returns the number of free bytes of the memory + //!segment + size_type get_free_memory() const + { return mp_header->get_free_memory(); } + + //!Returns the result of "all_memory_deallocated()" function + //!of the used memory algorithm + bool all_memory_deallocated() + { return mp_header->all_memory_deallocated(); } + + //!Returns the result of "check_sanity()" function + //!of the used memory algorithm + bool check_sanity() + { return mp_header->check_sanity(); } + + //!Writes to zero free memory (memory not yet allocated) of + //!the memory algorithm + void zero_free_memory() + { mp_header->zero_free_memory(); } + + //!Transforms an absolute address into an offset from base address. + //!The address must belong to the memory segment. Never throws. + handle_t get_handle_from_address (const void *ptr) const + { + return (handle_t)(reinterpret_cast(ptr) - + reinterpret_cast(this->get_address())); + } + + //!Returns true if the address belongs to the managed memory segment + bool belongs_to_segment (const void *ptr) const + { + return ptr >= this->get_address() && + ptr < (reinterpret_cast(this->get_address()) + this->get_size()); + } + + //!Transforms previously obtained offset into an absolute address in the + //!process space of the current process. Never throws.*/ + void * get_address_from_handle (handle_t offset) const + { return reinterpret_cast(this->get_address()) + offset; } + + //!Searches for nbytes of free memory in the segment, marks the + //!memory as used and return the pointer to the memory. If no + //!memory is available throws a boost::interprocess::bad_alloc exception + void* allocate (size_type nbytes) + { return mp_header->allocate(nbytes); } + + //!Searches for nbytes of free memory in the segment, marks the + //!memory as used and return the pointer to the memory. If no memory + //!is available returns 0. Never throws. + void* allocate (size_type nbytes, const std::nothrow_t &tag) + { return mp_header->allocate(nbytes, tag); } + + //!Allocates nbytes bytes aligned to "alignment" bytes. "alignment" + //!must be power of two. If no memory + //!is available returns 0. Never throws. + void * allocate_aligned (size_type nbytes, size_type alignment, const std::nothrow_t &tag) + { return mp_header->allocate_aligned(nbytes, alignment, tag); } + + template + T * allocation_command (boost::interprocess::allocation_type command, size_type limit_size, + size_type &prefer_in_recvd_out_size, T *&reuse) + { return mp_header->allocation_command(command, limit_size, prefer_in_recvd_out_size, reuse); } + + //!Allocates nbytes bytes aligned to "alignment" bytes. "alignment" + //!must be power of two. If no + //!memory is available throws a boost::interprocess::bad_alloc exception + void * allocate_aligned(size_type nbytes, size_type alignment) + { return mp_header->allocate_aligned(nbytes, alignment); } + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + + //Experimental. Don't use. + + //!Allocates n_elements of elem_bytes bytes. + //!Throws bad_alloc on failure. chain.size() is not increased on failure. + void allocate_many(size_type elem_bytes, size_type n_elements, multiallocation_chain &chain) + { mp_header->allocate_many(elem_bytes, n_elements, chain); } + + //!Allocates n_elements, each one of element_lengths[i]*sizeof_element bytes. + //!Throws bad_alloc on failure. chain.size() is not increased on failure. + void allocate_many(const size_type *element_lengths, size_type n_elements, size_type sizeof_element, multiallocation_chain &chain) + { mp_header->allocate_many(element_lengths, n_elements, sizeof_element, chain); } + + //!Allocates n_elements of elem_bytes bytes. + //!Non-throwing version. chain.size() is not increased on failure. + void allocate_many(const std::nothrow_t &tag, size_type elem_bytes, size_type n_elements, multiallocation_chain &chain) + { mp_header->allocate_many(tag, elem_bytes, n_elements, chain); } + + //!Allocates n_elements, each one of + //!element_lengths[i]*sizeof_element bytes. + //!Non-throwing version. chain.size() is not increased on failure. + void allocate_many(const std::nothrow_t &tag, const size_type *elem_sizes, size_type n_elements, size_type sizeof_element, multiallocation_chain &chain) + { mp_header->allocate_many(tag, elem_sizes, n_elements, sizeof_element, chain); } + + //!Deallocates all elements contained in chain. + //!Never throws. + void deallocate_many(multiallocation_chain &chain) + { mp_header->deallocate_many(chain); } + + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + //!Marks previously allocated memory as free. Never throws. + void deallocate (void *addr) + { if (mp_header) mp_header->deallocate(addr); } + + //!Tries to find a previous named allocation address. Returns a memory + //!buffer and the object count. If not found returned pointer is 0. + //!Never throws. + template + std::pair find (char_ptr_holder_t name) + { return mp_header->template find(name); } + + //!Creates a named object or array in memory + //! + //!Allocates and constructs a T object or an array of T in memory, + //!associates this with the given name and returns a pointer to the + //!created object. If an array is being constructed all objects are + //!created using the same parameters given to this function. + //! + //!-> If the name was previously used, returns 0. + //! + //!-> Throws boost::interprocess::bad_alloc if there is no available memory + //! + //!-> If T's constructor throws, the function throws that exception. + //! + //!Memory is freed automatically if T's constructor throws and if an + //!array was being constructed, destructors of created objects are called + //!before freeing the memory. + template + typename segment_manager::template construct_proxy::type + construct(char_ptr_holder_t name) + { return mp_header->template construct(name); } + + //!Finds or creates a named object or array in memory + //! + //!Tries to find an object with the given name in memory. If + //!found, returns the pointer to this pointer. If the object is not found, + //!allocates and constructs a T object or an array of T in memory, + //!associates this with the given name and returns a pointer to the + //!created object. If an array is being constructed all objects are + //!created using the same parameters given to this function. + //! + //!-> Throws boost::interprocess::bad_alloc if there is no available memory + //! + //!-> If T's constructor throws, the function throws that exception. + //! + //!Memory is freed automatically if T's constructor throws and if an + //!array was being constructed, destructors of created objects are called + //!before freeing the memory. + template + typename segment_manager::template construct_proxy::type + find_or_construct(char_ptr_holder_t name) + { return mp_header->template find_or_construct(name); } + + //!Creates a named object or array in memory + //! + //!Allocates and constructs a T object or an array of T in memory, + //!associates this with the given name and returns a pointer to the + //!created object. If an array is being constructed all objects are + //!created using the same parameters given to this function. + //! + //!-> If the name was previously used, returns 0. + //! + //!-> Returns 0 if there is no available memory + //! + //!-> If T's constructor throws, the function throws that exception. + //! + //!Memory is freed automatically if T's constructor throws and if an + //!array was being constructed, destructors of created objects are called + //!before freeing the memory. + template + typename segment_manager::template construct_proxy::type + construct(char_ptr_holder_t name, const std::nothrow_t &tag) + { return mp_header->template construct(name, tag); } + + //!Finds or creates a named object or array in memory + //! + //!Tries to find an object with the given name in memory. If + //!found, returns the pointer to this pointer. If the object is not found, + //!allocates and constructs a T object or an array of T in memory, + //!associates this with the given name and returns a pointer to the + //!created object. If an array is being constructed all objects are + //!created using the same parameters given to this function. + //! + //!-> Returns 0 if there is no available memory + //! + //!-> If T's constructor throws, the function throws that exception. + //! + //!Memory is freed automatically if T's constructor throws and if an + //!array was being constructed, destructors of created objects are called + //!before freeing the memory. + template + typename segment_manager::template construct_proxy::type + find_or_construct(char_ptr_holder_t name, const std::nothrow_t &tag) + { return mp_header->template find_or_construct(name, tag); } + + //!Creates a named array from iterators in memory + //! + //!Allocates and constructs an array of T in memory, + //!associates this with the given name and returns a pointer to the + //!created object. Each element in the array is created using the + //!objects returned when dereferencing iterators as parameters + //!and incrementing all iterators for each element. + //! + //!-> If the name was previously used, returns 0. + //! + //!-> Throws boost::interprocess::bad_alloc if there is no available memory + //! + //!-> If T's constructor throws, the function throws that exception. + //! + //!Memory is freed automatically if T's constructor throws and + //!destructors of created objects are called before freeing the memory. + template + typename segment_manager::template construct_iter_proxy::type + construct_it(char_ptr_holder_t name) + { return mp_header->template construct_it(name); } + + //!Finds or creates a named array from iterators in memory + //! + //!Tries to find an object with the given name in memory. If + //!found, returns the pointer to this pointer. If the object is not found, + //!allocates and constructs an array of T in memory, + //!associates this with the given name and returns a pointer to the + //!created object. Each element in the array is created using the + //!objects returned when dereferencing iterators as parameters + //!and incrementing all iterators for each element. + //! + //!-> If the name was previously used, returns 0. + //! + //!-> Throws boost::interprocess::bad_alloc if there is no available memory + //! + //!-> If T's constructor throws, the function throws that exception. + //! + //!Memory is freed automatically if T's constructor throws and + //!destructors of created objects are called before freeing the memory. + template + typename segment_manager::template construct_iter_proxy::type + find_or_construct_it(char_ptr_holder_t name) + { return mp_header->template find_or_construct_it(name); } + + //!Creates a named array from iterators in memory + //! + //!Allocates and constructs an array of T in memory, + //!associates this with the given name and returns a pointer to the + //!created object. Each element in the array is created using the + //!objects returned when dereferencing iterators as parameters + //!and incrementing all iterators for each element. + //! + //!-> If the name was previously used, returns 0. + //! + //!-> If there is no available memory, returns 0. + //! + //!-> If T's constructor throws, the function throws that exception. + //! + //!Memory is freed automatically if T's constructor throws and + //!destructors of created objects are called before freeing the memory.*/ + template + typename segment_manager::template construct_iter_proxy::type + construct_it(char_ptr_holder_t name, const std::nothrow_t &tag) + { return mp_header->template construct_it(name, tag); } + + //!Finds or creates a named array from iterators in memory + //! + //!Tries to find an object with the given name in memory. If + //!found, returns the pointer to this pointer. If the object is not found, + //!allocates and constructs an array of T in memory, + //!associates this with the given name and returns a pointer to the + //!created object. Each element in the array is created using the + //!objects returned when dereferencing iterators as parameters + //!and incrementing all iterators for each element. + //! + //!-> If the name was previously used, returns 0. + //! + //!-> If there is no available memory, returns 0. + //! + //!-> If T's constructor throws, the function throws that exception. + //! + //!Memory is freed automatically if T's constructor throws and + //!destructors of created objects are called before freeing the memory.*/ + template + typename segment_manager::template construct_iter_proxy::type + find_or_construct_it(char_ptr_holder_t name, const std::nothrow_t &tag) + { return mp_header->template find_or_construct_it(name, tag); } + + //!Calls a functor and guarantees that no new construction, search or + //!destruction will be executed by any process while executing the object + //!function call. If the functor throws, this function throws. + template + void atomic_func(Func &f) + { mp_header->atomic_func(f); } + + //!Tries to call a functor guaranteeing that no new construction, search or + //!destruction will be executed by any process while executing the object + //!function call. If the atomic function can't be immediatelly executed + //!because the internal mutex is already locked, returns false. + //!If the functor throws, this function throws. + template + bool try_atomic_func(Func &f) + { return mp_header->try_atomic_func(f); } + + //!Destroys a named memory object or array. + //! + //!Finds the object with the given name, calls its destructors, + //!frees used memory and returns true. + //! + //!-> If the object is not found, it returns false. + //! + //!Exception Handling: + //! + //!When deleting a dynamically object or array, the Standard + //!does not guarantee that dynamically allocated memory, will be released. + //!Also, when deleting arrays, the Standard doesn't require calling + //!destructors for the rest of the objects if for one of them the destructor + //!terminated with an exception. + //! + //!Destroying an object: + //! + //!If the destructor throws, the memory will be freed and that exception + //!will be thrown. + //! + //!Destroying an array: + //! + //!When destroying an array, if a destructor throws, the rest of + //!destructors are called. If any of these throws, the exceptions are + //!ignored. The name association will be erased, memory will be freed and + //!the first exception will be thrown. This guarantees the unlocking of + //!mutexes and other resources. + //! + //!For all theses reasons, classes with throwing destructors are not + //!recommended. + template + bool destroy(const CharType *name) + { return mp_header->template destroy(name); } + + //!Destroys the unique instance of type T + //! + //!Calls the destructor, frees used memory and returns true. + //! + //!Exception Handling: + //! + //!When deleting a dynamically object, the Standard does not + //!guarantee that dynamically allocated memory will be released. + //! + //!Destroying an object: + //! + //!If the destructor throws, the memory will be freed and that exception + //!will be thrown. + //! + //!For all theses reasons, classes with throwing destructors are not + //!recommended for memory. + template + bool destroy(const unique_instance_t *const ) + { return mp_header->template destroy(unique_instance); } + + //!Destroys the object (named, unique, or anonymous) + //! + //!Calls the destructor, frees used memory and returns true. + //! + //!Exception Handling: + //! + //!When deleting a dynamically object, the Standard does not + //!guarantee that dynamically allocated memory will be released. + //! + //!Destroying an object: + //! + //!If the destructor throws, the memory will be freed and that exception + //!will be thrown. + //! + //!For all theses reasons, classes with throwing destructors are not + //!recommended for memory. + template + void destroy_ptr(const T *ptr) + { mp_header->template destroy_ptr(ptr); } + + //!Returns the name of an object created with construct/find_or_construct + //!functions. If ptr points to an unique instance typeid(T).name() is returned. + template + static const char_type *get_instance_name(const T *ptr) + { return segment_manager::get_instance_name(ptr); } + + //!Returns is the type an object created with construct/find_or_construct + //!functions. Does not throw. + template + static instance_type get_instance_type(const T *ptr) + { return segment_manager::get_instance_type(ptr); } + + //!Returns the length of an object created with construct/find_or_construct + //!functions (1 if is a single element, >=1 if it's an array). Does not throw. + template + static size_type get_instance_length(const T *ptr) + { return segment_manager::get_instance_length(ptr); } + + //!Preallocates needed index resources to optimize the + //!creation of "num" named objects in the memory segment. + //!Can throw boost::interprocess::bad_alloc if there is no enough memory. + void reserve_named_objects(size_type num) + { mp_header->reserve_named_objects(num); } + + //!Preallocates needed index resources to optimize the + //!creation of "num" unique objects in the memory segment. + //!Can throw boost::interprocess::bad_alloc if there is no enough memory. + void reserve_unique_objects(size_type num) + { mp_header->reserve_unique_objects(num); } + + //!Calls shrink_to_fit in both named and unique object indexes + //to try to free unused memory from those indexes. + void shrink_to_fit_indexes() + { mp_header->shrink_to_fit_indexes(); } + + //!Returns the number of named objects stored + //!in the managed segment. + size_type get_num_named_objects() + { return mp_header->get_num_named_objects(); } + + //!Returns the number of unique objects stored + //!in the managed segment. + size_type get_num_unique_objects() + { return mp_header->get_num_unique_objects(); } + + //!Returns a constant iterator to the index storing the + //!named allocations. NOT thread-safe. Never throws. + const_named_iterator named_begin() const + { return mp_header->named_begin(); } + + //!Returns a constant iterator to the end of the index + //!storing the named allocations. NOT thread-safe. Never throws. + const_named_iterator named_end() const + { return mp_header->named_end(); } + + //!Returns a constant iterator to the index storing the + //!unique allocations. NOT thread-safe. Never throws. + const_unique_iterator unique_begin() const + { return mp_header->unique_begin(); } + + //!Returns a constant iterator to the end of the index + //!storing the unique allocations. NOT thread-safe. Never throws. + const_unique_iterator unique_end() const + { return mp_header->unique_end(); } + + //!This is the default allocator to allocate types T + //!from this managed segment + template + struct allocator + { + typedef typename segment_manager::template allocator::type type; + }; + + //!Returns an instance of the default allocator for type T + //!initialized that allocates memory from this segment manager. + template + typename allocator::type + get_allocator() + { return mp_header->template get_allocator(); } + + //!This is the default deleter to delete types T + //!from this managed segment. + template + struct deleter + { + typedef typename segment_manager::template deleter::type type; + }; + + //!Returns an instance of the default allocator for type T + //!initialized that allocates memory from this segment manager. + template + typename deleter::type + get_deleter() + { return mp_header->template get_deleter(); } + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + //!Tries to find a previous named allocation address. Returns a memory + //!buffer and the object count. If not found returned pointer is 0. + //!Never throws. + template + std::pair find_no_lock (char_ptr_holder_t name) + { return mp_header->template find_no_lock(name); } + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + protected: + //!Swaps the segment manager's managed by this managed memory segment. + //!NOT thread-safe. Never throws. + void swap(basic_managed_memory_impl &other) + { (simple_swap)(mp_header, other.mp_header); } + + private: + segment_manager *mp_header; +}; + +template +class create_open_func +{ + typedef typename BasicManagedMemoryImpl::size_type size_type; + + public: + + create_open_func(BasicManagedMemoryImpl * const frontend, create_enum_t type) + : m_frontend(frontend), m_type(type){} + + bool operator()(void *addr, std::size_t size, bool created) const + { + if( ((m_type == DoOpen) && created) || + ((m_type == DoCreate) && !created) || + //Check for overflow + size_type(-1) < size ){ + return false; + } + else if(created){ + return m_frontend->create_impl(addr, static_cast(size)); + } + else{ + return m_frontend->open_impl (addr, static_cast(size)); + } + } + + static std::size_t get_min_size() + { + const size_type sz = BasicManagedMemoryImpl::segment_manager::get_min_size(); + if(sz > std::size_t(-1)){ + //The minimum size is not representable by std::size_t + BOOST_ASSERT(false); + return std::size_t(-1); + } + else{ + return static_cast(sz); + } + } + + private: + BasicManagedMemoryImpl *m_frontend; + create_enum_t m_type; +}; + +} //namespace ipcdetail { +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //BOOST_INTERPROCESS_DETAIL_MANAGED_MEMORY_IMPL_HPP + diff --git a/boost/interprocess/detail/math_functions.hpp b/boost/interprocess/detail/math_functions.hpp new file mode 100644 index 000000000..a19efac1a --- /dev/null +++ b/boost/interprocess/detail/math_functions.hpp @@ -0,0 +1,118 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Stephen Cleary 2000. +// (C) Copyright Ion Gaztanaga 2007-2012. +// +// Distributed under the 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/interprocess for documentation. +// +// This file is a slightly modified file from Boost.Pool +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_DETAIL_MATH_FUNCTIONS_HPP +#define BOOST_INTERPROCESS_DETAIL_MATH_FUNCTIONS_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +namespace boost { +namespace interprocess { +namespace ipcdetail { + +// Greatest common divisor and least common multiple + +// +// gcd is an algorithm that calculates the greatest common divisor of two +// integers, using Euclid's algorithm. +// +// Pre: A > 0 && B > 0 +// Recommended: A > B +template +inline Integer gcd(Integer A, Integer B) +{ + do + { + const Integer tmp(B); + B = A % B; + A = tmp; + } while (B != 0); + + return A; +} + +// +// lcm is an algorithm that calculates the least common multiple of two +// integers. +// +// Pre: A > 0 && B > 0 +// Recommended: A > B +template +inline Integer lcm(const Integer & A, const Integer & B) +{ + Integer ret = A; + ret /= gcd(A, B); + ret *= B; + return ret; +} + +template +inline Integer log2_ceil(const Integer & A) +{ + Integer i = 0; + Integer power_of_2 = 1; + + while(power_of_2 < A){ + power_of_2 <<= 1; + ++i; + } + return i; +} + +template +inline Integer upper_power_of_2(const Integer & A) +{ + Integer power_of_2 = 1; + + while(power_of_2 < A){ + power_of_2 <<= 1; + } + return power_of_2; +} + +//This function uses binary search to discover the +//highest set bit of the integer +inline std::size_t floor_log2 (std::size_t x) +{ + const std::size_t Bits = sizeof(std::size_t)*CHAR_BIT; + const bool Size_t_Bits_Power_2= !(Bits & (Bits-1)); + BOOST_STATIC_ASSERT(((Size_t_Bits_Power_2)== true)); + + std::size_t n = x; + std::size_t log2 = 0; + + for(std::size_t shift = Bits >> 1; shift; shift >>= 1){ + std::size_t tmp = n >> shift; + if (tmp) + log2 += shift, n = tmp; + } + + return log2; +} + +} // namespace ipcdetail +} // namespace interprocess +} // namespace boost + +#endif diff --git a/boost/interprocess/detail/named_proxy.hpp b/boost/interprocess/detail/named_proxy.hpp new file mode 100644 index 000000000..4bec375b6 --- /dev/null +++ b/boost/interprocess/detail/named_proxy.hpp @@ -0,0 +1,316 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_NAMED_PROXY_HPP +#define BOOST_INTERPROCESS_NAMED_PROXY_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +// interprocess/detail +#include +#include +#include +#ifndef BOOST_INTERPROCESS_PERFECT_FORWARDING +#include +#else +#include +#include +#endif //#ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING +#include + +#include + +//!\file +//!Describes a proxy class that implements named allocation syntax. + +namespace boost { +namespace interprocess { +namespace ipcdetail { + +#ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING + +template +struct CtorArgN : public placement_destroy +{ + typedef bool_ IsIterator; + typedef CtorArgN self_t; + typedef typename build_number_seq::type index_tuple_t; + + self_t& operator++() + { + this->do_increment(IsIterator(), index_tuple_t()); + return *this; + } + + self_t operator++(int) { return ++*this; *this; } + + CtorArgN(Args && ...args) + : args_(args...) + {} + + virtual void construct_n(void *mem + , std::size_t num + , std::size_t &constructed) + { + T* memory = static_cast(mem); + for(constructed = 0; constructed < num; ++constructed){ + this->construct(memory++, IsIterator(), index_tuple_t()); + this->do_increment(IsIterator(), index_tuple_t()); + } + } + + private: + template + void construct(void *mem, true_, const index_tuple&) + { ::new((void*)mem, boost_container_new_t())T(*boost::forward(get(args_))...); } + + template + void construct(void *mem, false_, const index_tuple&) + { ::new((void*)mem, boost_container_new_t())T(boost::forward(get(args_))...); } + + template + void do_increment(true_, const index_tuple&) + { + this->expansion_helper(++get(args_)...); + } + + template + void expansion_helper(ExpansionArgs &&...) + {} + + template + void do_increment(false_, const index_tuple&) + {} + + tuple args_; +}; + +//!Describes a proxy class that implements named +//!allocation syntax. +template + < class SegmentManager //segment manager to construct the object + , class T //type of object to build + , bool is_iterator //passing parameters are normal object or iterators? + > +class named_proxy +{ + typedef typename SegmentManager::char_type char_type; + const char_type * mp_name; + SegmentManager * mp_mngr; + mutable std::size_t m_num; + const bool m_find; + const bool m_dothrow; + + public: + named_proxy(SegmentManager *mngr, const char_type *name, bool find, bool dothrow) + : mp_name(name), mp_mngr(mngr), m_num(1) + , m_find(find), m_dothrow(dothrow) + {} + + template + T *operator()(Args &&...args) const + { + CtorArgN &&ctor_obj = CtorArgN + (boost::forward(args)...); + return mp_mngr->template + generic_construct(mp_name, m_num, m_find, m_dothrow, ctor_obj); + } + + //This operator allows --> named_new("Name")[3]; <-- syntax + const named_proxy &operator[](std::size_t num) const + { m_num *= num; return *this; } +}; + +#else //#ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING + +//////////////////////////////////////////////////////////////// +// What the macro should generate (n == 2): +// +// template +// struct Ctor2Arg +// : public placement_destroy +// { +// typedef bool_ IsIterator; +// typedef Ctor2Arg self_t; +// +// void do_increment(false_) +// { ++m_p1; ++m_p2; } +// +// void do_increment(true_){} +// +// self_t& operator++() +// { +// this->do_increment(IsIterator()); +// return *this; +// } +// +// self_t operator++(int) { return ++*this; *this; } +// +// Ctor2Arg(const P1 &p1, const P2 &p2) +// : p1((P1 &)p_1), p2((P2 &)p_2) {} +// +// void construct(void *mem) +// { new((void*)object)T(m_p1, m_p2); } +// +// virtual void construct_n(void *mem +// , std::size_t num +// , std::size_t &constructed) +// { +// T* memory = static_cast(mem); +// for(constructed = 0; constructed < num; ++constructed){ +// this->construct(memory++, IsIterator()); +// this->do_increment(IsIterator()); +// } +// } +// +// private: +// void construct(void *mem, true_) +// { new((void*)mem)T(*m_p1, *m_p2); } +// +// void construct(void *mem, false_) +// { new((void*)mem)T(m_p1, m_p2); } +// +// P1 &m_p1; P2 &m_p2; +// }; +//////////////////////////////////////////////////////////////// + +#define BOOST_INTERPROCESS_NAMED_PROXY_CTORARGN(N)\ +\ +template \ +struct CtorArg##N : placement_destroy\ +{\ + typedef CtorArg##N self_t;\ + \ + CtorArg##N ( BOOST_MOVE_UREF##N )\ + BOOST_MOVE_COLON##N BOOST_MOVE_FWD_INIT##N{}\ + \ + virtual void construct_n(void *mem, std::size_t num, std::size_t &constructed)\ + {\ + T* memory = static_cast(mem);\ + for(constructed = 0; constructed < num; ++constructed){\ + ::new((void*)memory++) T ( BOOST_MOVE_MFWD##N );\ + }\ + }\ + \ + private:\ + BOOST_MOVE_MREF##N\ +};\ +//! +BOOST_MOVE_ITERATE_0TO9(BOOST_INTERPROCESS_NAMED_PROXY_CTORARGN) +#undef BOOST_INTERPROCESS_NAMED_PROXY_CTORARGN + +#define BOOST_INTERPROCESS_NAMED_PROXY_CTORITN(N)\ +\ +template \ +struct CtorIt##N : public placement_destroy\ +{\ + typedef CtorIt##N self_t;\ + \ + self_t& operator++()\ + { BOOST_MOVE_MINC##N; return *this; }\ + \ + self_t operator++(int) { return ++*this; *this; }\ + \ + CtorIt##N ( BOOST_MOVE_VAL##N )\ + BOOST_MOVE_COLON##N BOOST_MOVE_VAL_INIT##N{}\ + \ + virtual void construct_n(void *mem, std::size_t num, std::size_t &constructed)\ + {\ + T* memory = static_cast(mem);\ + for(constructed = 0; constructed < num; ++constructed){\ + ::new((void*)memory++) T( BOOST_MOVE_MITFWD##N );\ + ++(*this);\ + }\ + }\ + \ + private:\ + BOOST_MOVE_MEMB##N\ +};\ +//! +BOOST_MOVE_ITERATE_0TO9(BOOST_INTERPROCESS_NAMED_PROXY_CTORITN) +#undef BOOST_INTERPROCESS_NAMED_PROXY_CTORITN + +//!Describes a proxy class that implements named +//!allocation syntax. +template + < class SegmentManager //segment manager to construct the object + , class T //type of object to build + , bool is_iterator //passing parameters are normal object or iterators? + > +class named_proxy +{ + typedef typename SegmentManager::char_type char_type; + const char_type * mp_name; + SegmentManager * mp_mngr; + mutable std::size_t m_num; + const bool m_find; + const bool m_dothrow; + + public: + named_proxy(SegmentManager *mngr, const char_type *name, bool find, bool dothrow) + : mp_name(name), mp_mngr(mngr), m_num(1) + , m_find(find), m_dothrow(dothrow) + {} + + #define BOOST_INTERPROCESS_NAMED_PROXY_CALL_OPERATOR(N)\ + \ + BOOST_MOVE_TMPL_LT##N BOOST_MOVE_CLASS##N BOOST_MOVE_GT##N \ + T *operator()( BOOST_MOVE_UREF##N ) const\ + {\ + typedef typename if_c \ + , CtorArg##N \ + >::type ctor_obj_t;\ + ctor_obj_t ctor_obj = ctor_obj_t( BOOST_MOVE_FWD##N );\ + return mp_mngr->template generic_construct(mp_name, m_num, m_find, m_dothrow, ctor_obj);\ + }\ + // + BOOST_MOVE_ITERATE_0TO9(BOOST_INTERPROCESS_NAMED_PROXY_CALL_OPERATOR) + #undef BOOST_INTERPROCESS_NAMED_PROXY_CALL_OPERATOR + + //////////////////////////////////////////////////////////////////////// + // What the macro should generate (n == 2) + //////////////////////////////////////////////////////////////////////// + // + // template + // T *operator()(P1 &p1, P2 &p2) const + // { + // typedef CtorArg2 + // + // ctor_obj_t; + // ctor_obj_t ctor_obj(p1, p2); + // + // return mp_mngr->template generic_construct + // (mp_name, m_num, m_find, m_dothrow, ctor_obj); + // } + // + ////////////////////////////////////////////////////////////////////////// + + //This operator allows --> named_new("Name")[3]; <-- syntax + const named_proxy &operator[](std::size_t num) const + { m_num *= num; return *this; } +}; + +#endif //#ifdef BOOST_INTERPROCESS_PERFECT_FORWARDING + +}}} //namespace boost { namespace interprocess { namespace ipcdetail { + +#include + +#endif //#ifndef BOOST_INTERPROCESS_NAMED_PROXY_HPP diff --git a/boost/interprocess/detail/nothrow.hpp b/boost/interprocess/detail/nothrow.hpp new file mode 100644 index 000000000..d79ba7647 --- /dev/null +++ b/boost/interprocess/detail/nothrow.hpp @@ -0,0 +1,42 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2014-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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// +#ifndef BOOST_INTERPROCESS_DETAIL_NOTHROW_HPP +#define BOOST_INTERPROCESS_DETAIL_NOTHROW_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace std { //no namespace versioning in clang+libc++ + +struct nothrow_t; + +} //namespace std { + +namespace boost{ namespace interprocess { + +template +struct nothrow +{ + static const std::nothrow_t &get() { return *pnothrow; } + static std::nothrow_t *pnothrow; +}; + +template +std::nothrow_t *nothrow::pnothrow = + reinterpret_cast(0x1234); //Avoid sanitizer warnings on references to null + +}} //namespace boost{ namespace interprocess { + +#endif //#ifndef BOOST_INTERPROCESS_DETAIL_NOTHROW_HPP diff --git a/boost/interprocess/detail/segment_manager_helper.hpp b/boost/interprocess/detail/segment_manager_helper.hpp new file mode 100644 index 000000000..cfa4bd2ba --- /dev/null +++ b/boost/interprocess/detail/segment_manager_helper.hpp @@ -0,0 +1,518 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_SEGMENT_MANAGER_BASE_HPP +#define BOOST_INTERPROCESS_SEGMENT_MANAGER_BASE_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +// interprocess +#include +// interprocess/detail +#include +#include +#include +// container/detail +#include //alignment_of +#include +// intrusive +#include +// move/detail +#include //make_unsigned +// other boost +#include //BOOST_ASSERT +#include +// std +#include //std::size_t + +//!\file +//!Describes the object placed in a memory segment that provides +//!named object allocation capabilities. + +namespace boost{ +namespace interprocess{ + +template +class segment_manager_base; + +//!An integer that describes the type of the +//!instance constructed in memory +enum instance_type { anonymous_type, named_type, unique_type, max_allocation_type }; + +namespace ipcdetail{ + +template +class mem_algo_deallocator +{ + void * m_ptr; + MemoryAlgorithm & m_algo; + + public: + mem_algo_deallocator(void *ptr, MemoryAlgorithm &algo) + : m_ptr(ptr), m_algo(algo) + {} + + void release() + { m_ptr = 0; } + + ~mem_algo_deallocator() + { if(m_ptr) m_algo.deallocate(m_ptr); } +}; + +template +struct block_header +{ + size_type m_value_bytes; + unsigned short m_num_char; + unsigned char m_value_alignment; + unsigned char m_alloc_type_sizeof_char; + + block_header(size_type val_bytes + ,size_type val_alignment + ,unsigned char al_type + ,std::size_t szof_char + ,std::size_t num_char + ) + : m_value_bytes(val_bytes) + , m_num_char((unsigned short)num_char) + , m_value_alignment((unsigned char)val_alignment) + , m_alloc_type_sizeof_char( (al_type << 5u) | ((unsigned char)szof_char & 0x1F) ) + {}; + + template + block_header &operator= (const T& ) + { return *this; } + + size_type total_size() const + { + if(alloc_type() != anonymous_type){ + return name_offset() + (m_num_char+1)*sizeof_char(); + } + else{ + return this->value_offset() + m_value_bytes; + } + } + + size_type value_bytes() const + { return m_value_bytes; } + + template + size_type total_size_with_header() const + { + return get_rounded_size + ( size_type(sizeof(Header)) + , size_type(::boost::container::container_detail::alignment_of >::value)) + + total_size(); + } + + unsigned char alloc_type() const + { return (m_alloc_type_sizeof_char >> 5u)&(unsigned char)0x7; } + + unsigned char sizeof_char() const + { return m_alloc_type_sizeof_char & (unsigned char)0x1F; } + + template + CharType *name() const + { + return const_cast(reinterpret_cast + (reinterpret_cast(this) + name_offset())); + } + + unsigned short name_length() const + { return m_num_char; } + + size_type name_offset() const + { + return this->value_offset() + get_rounded_size(size_type(m_value_bytes), size_type(sizeof_char())); + } + + void *value() const + { + return const_cast((reinterpret_cast(this) + this->value_offset())); + } + + size_type value_offset() const + { + return get_rounded_size(size_type(sizeof(block_header)), size_type(m_value_alignment)); + } + + template + bool less_comp(const block_header &b) const + { + return m_num_char < b.m_num_char || + (m_num_char < b.m_num_char && + std::char_traits::compare(name(), b.name(), m_num_char) < 0); + } + + template + bool equal_comp(const block_header &b) const + { + return m_num_char == b.m_num_char && + std::char_traits::compare(name(), b.name(), m_num_char) == 0; + } + + template + static block_header *block_header_from_value(T *value) + { return block_header_from_value(value, sizeof(T), ::boost::container::container_detail::alignment_of::value); } + + static block_header *block_header_from_value(const void *value, std::size_t sz, std::size_t algn) + { + block_header * hdr = + const_cast + (reinterpret_cast(reinterpret_cast(value) - + get_rounded_size(sizeof(block_header), algn))); + (void)sz; + //Some sanity checks + BOOST_ASSERT(hdr->m_value_alignment == algn); + BOOST_ASSERT(hdr->m_value_bytes % sz == 0); + return hdr; + } + + template + static block_header *from_first_header(Header *header) + { + block_header * hdr = + reinterpret_cast*>(reinterpret_cast(header) + + get_rounded_size( size_type(sizeof(Header)) + , size_type(::boost::container::container_detail::alignment_of >::value))); + //Some sanity checks + return hdr; + } + + template + static Header *to_first_header(block_header *bheader) + { + Header * hdr = + reinterpret_cast(reinterpret_cast(bheader) - + get_rounded_size( size_type(sizeof(Header)) + , size_type(::boost::container::container_detail::alignment_of >::value))); + //Some sanity checks + return hdr; + } +}; + +inline void array_construct(void *mem, std::size_t num, in_place_interface &table) +{ + //Try constructors + std::size_t constructed = 0; + BOOST_TRY{ + table.construct_n(mem, num, constructed); + } + //If there is an exception call destructors and erase index node + BOOST_CATCH(...){ + std::size_t destroyed = 0; + table.destroy_n(mem, constructed, destroyed); + BOOST_RETHROW + } + BOOST_CATCH_END +} + +template +struct intrusive_compare_key +{ + typedef CharT char_type; + + intrusive_compare_key(const CharT *str, std::size_t len) + : mp_str(str), m_len(len) + {} + + const CharT * mp_str; + std::size_t m_len; +}; + +//!This struct indicates an anonymous object creation +//!allocation +template +class instance_t +{ + instance_t(){} +}; + +template +struct char_if_void +{ + typedef T type; +}; + +template<> +struct char_if_void +{ + typedef char type; +}; + +typedef instance_t anonymous_instance_t; +typedef instance_t unique_instance_t; + + +template +struct intrusive_value_type_impl + : public Hook +{ + private: + //Non-copyable + intrusive_value_type_impl(const intrusive_value_type_impl &); + intrusive_value_type_impl& operator=(const intrusive_value_type_impl &); + + public: + typedef CharType char_type; + typedef SizeType size_type; + + intrusive_value_type_impl(){} + + enum { BlockHdrAlignment = ::boost::container::container_detail::alignment_of >::value }; + + block_header *get_block_header() const + { + return const_cast*> + (reinterpret_cast *>(reinterpret_cast(this) + + get_rounded_size(size_type(sizeof(*this)), size_type(BlockHdrAlignment)))); + } + + bool operator <(const intrusive_value_type_impl & other) const + { return (this->get_block_header())->template less_comp(*other.get_block_header()); } + + bool operator ==(const intrusive_value_type_impl & other) const + { return (this->get_block_header())->template equal_comp(*other.get_block_header()); } + + static intrusive_value_type_impl *get_intrusive_value_type(block_header *hdr) + { + return reinterpret_cast(reinterpret_cast(hdr) - + get_rounded_size(size_type(sizeof(intrusive_value_type_impl)), size_type(BlockHdrAlignment))); + } + + CharType *name() const + { return get_block_header()->template name(); } + + unsigned short name_length() const + { return get_block_header()->name_length(); } + + void *value() const + { return get_block_header()->value(); } +}; + +template +class char_ptr_holder +{ + public: + char_ptr_holder(const CharType *name) + : m_name(name) + {} + + char_ptr_holder(const anonymous_instance_t *) + : m_name(static_cast(0)) + {} + + char_ptr_holder(const unique_instance_t *) + : m_name(reinterpret_cast(-1)) + {} + + operator const CharType *() + { return m_name; } + + const CharType *get() const + { return m_name; } + + bool is_unique() const + { return m_name == reinterpret_cast(-1); } + + bool is_anonymous() const + { return m_name == static_cast(0); } + + private: + const CharType *m_name; +}; + +//!The key of the the named allocation information index. Stores an offset pointer +//!to a null terminated string and the length of the string to speed up sorting +template +struct index_key +{ + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type const_char_ptr_t; + typedef CharT char_type; + typedef typename boost::intrusive::pointer_traits::difference_type difference_type; + typedef typename boost::move_detail::make_unsigned::type size_type; + + private: + //Offset pointer to the object's name + const_char_ptr_t mp_str; + //Length of the name buffer (null NOT included) + size_type m_len; + public: + + //!Constructor of the key + index_key (const char_type *nm, size_type length) + : mp_str(nm), m_len(length) + {} + + //!Less than function for index ordering + bool operator < (const index_key & right) const + { + return (m_len < right.m_len) || + (m_len == right.m_len && + std::char_traits::compare + (to_raw_pointer(mp_str),to_raw_pointer(right.mp_str), m_len) < 0); + } + + //!Equal to function for index ordering + bool operator == (const index_key & right) const + { + return m_len == right.m_len && + std::char_traits::compare + (to_raw_pointer(mp_str), to_raw_pointer(right.mp_str), m_len) == 0; + } + + void name(const CharT *nm) + { mp_str = nm; } + + void name_length(size_type len) + { m_len = len; } + + const CharT *name() const + { return to_raw_pointer(mp_str); } + + size_type name_length() const + { return m_len; } +}; + +//!The index_data stores a pointer to a buffer and the element count needed +//!to know how many destructors must be called when calling destroy +template +struct index_data +{ + typedef VoidPointer void_pointer; + void_pointer m_ptr; + explicit index_data(void *ptr) : m_ptr(ptr){} + + void *value() const + { return static_cast(to_raw_pointer(m_ptr)); } +}; + +template +struct segment_manager_base_type +{ typedef segment_manager_base type; }; + +template +struct index_config +{ + typedef typename MemoryAlgorithm::void_pointer void_pointer; + typedef CharT char_type; + typedef index_key key_type; + typedef index_data mapped_type; + typedef typename segment_manager_base_type + ::type segment_manager_base; + + template + struct intrusive_value_type + { typedef intrusive_value_type_impl type; }; + + typedef intrusive_compare_key intrusive_compare_key_type; +}; + +template +class segment_manager_iterator_value_adaptor +{ + typedef typename Iterator::value_type iterator_val_t; + typedef typename iterator_val_t::char_type char_type; + + public: + segment_manager_iterator_value_adaptor(const typename Iterator::value_type &val) + : m_val(&val) + {} + + const char_type *name() const + { return m_val->name(); } + + unsigned short name_length() const + { return m_val->name_length(); } + + const void *value() const + { return m_val->value(); } + + const typename Iterator::value_type *m_val; +}; + + +template +class segment_manager_iterator_value_adaptor +{ + typedef typename Iterator::value_type iterator_val_t; + typedef typename iterator_val_t::first_type first_type; + typedef typename iterator_val_t::second_type second_type; + typedef typename first_type::char_type char_type; + typedef typename first_type::size_type size_type; + + public: + segment_manager_iterator_value_adaptor(const typename Iterator::value_type &val) + : m_val(&val) + {} + + const char_type *name() const + { return m_val->first.name(); } + + size_type name_length() const + { return m_val->first.name_length(); } + + const void *value() const + { + return reinterpret_cast*> + (to_raw_pointer(m_val->second.m_ptr))->value(); + } + + const typename Iterator::value_type *m_val; +}; + +template +struct segment_manager_iterator_transform +{ + typedef segment_manager_iterator_value_adaptor result_type; + + template result_type operator()(const T &arg) const + { return result_type(arg); } +}; + +} //namespace ipcdetail { + +//These pointers are the ones the user will use to +//indicate previous allocation types +static const ipcdetail::anonymous_instance_t * anonymous_instance = 0; +static const ipcdetail::unique_instance_t * unique_instance = 0; + +namespace ipcdetail_really_deep_namespace { + +//Otherwise, gcc issues a warning of previously defined +//anonymous_instance and unique_instance +struct dummy +{ + dummy() + { + (void)anonymous_instance; + (void)unique_instance; + } +}; + +} //detail_really_deep_namespace + +}} //namespace boost { namespace interprocess + +#include + +#endif //#ifndef BOOST_INTERPROCESS_SEGMENT_MANAGER_BASE_HPP + diff --git a/boost/interprocess/detail/transform_iterator.hpp b/boost/interprocess/detail/transform_iterator.hpp new file mode 100644 index 000000000..1c4dcd3ae --- /dev/null +++ b/boost/interprocess/detail/transform_iterator.hpp @@ -0,0 +1,200 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2015. +// (C) Copyright Gennaro Prota 2003 - 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) +// +// See http://www.boost.org/libs/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_DETAIL_TRANSFORM_ITERATORS_HPP +#define BOOST_INTERPROCESS_DETAIL_TRANSFORM_ITERATORS_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +// interprocess +#include +// interprocess/detail +#include +// move/detail +#include + +namespace boost { +namespace interprocess { + +template +struct operator_arrow_proxy +{ + operator_arrow_proxy(const PseudoReference &px) + : m_value(px) + {} + + PseudoReference* operator->() const { return &m_value; } + // This function is needed for MWCW and BCC, which won't call operator-> + // again automatically per 13.3.1.2 para 8 +// operator T*() const { return &m_value; } + mutable PseudoReference m_value; +}; + +template +struct operator_arrow_proxy +{ + operator_arrow_proxy(T &px) + : m_value(px) + {} + + T* operator->() const { return const_cast(&m_value); } + // This function is needed for MWCW and BCC, which won't call operator-> + // again automatically per 13.3.1.2 para 8 +// operator T*() const { return &m_value; } + T &m_value; +}; + +template +class transform_iterator + : public UnaryFunction +{ + public: + typedef typename ::boost::container::iterator_traits::iterator_category iterator_category; + typedef typename ipcdetail::remove_reference::type value_type; + typedef typename ::boost::container::iterator_traits::difference_type difference_type; + typedef operator_arrow_proxy pointer; + typedef typename UnaryFunction::result_type reference; + + explicit transform_iterator(const Iterator &it, const UnaryFunction &f = UnaryFunction()) + : UnaryFunction(f), m_it(it) + {} + + explicit transform_iterator() + : UnaryFunction(), m_it() + {} + + //Constructors + transform_iterator& operator++() + { increment(); return *this; } + + transform_iterator operator++(int) + { + transform_iterator result (*this); + increment(); + return result; + } + + transform_iterator& operator--() + { decrement(); return *this; } + + transform_iterator operator--(int) + { + transform_iterator result (*this); + decrement(); + return result; + } + + friend bool operator== (const transform_iterator& i, const transform_iterator& i2) + { return i.equal(i2); } + + friend bool operator!= (const transform_iterator& i, const transform_iterator& i2) + { return !(i == i2); } + + friend bool operator< (const transform_iterator& i, const transform_iterator& i2) + { return i < i2; } + + friend bool operator> (const transform_iterator& i, const transform_iterator& i2) + { return i2 < i; } + + friend bool operator<= (const transform_iterator& i, const transform_iterator& i2) + { return !(i > i2); } + + friend bool operator>= (const transform_iterator& i, const transform_iterator& i2) + { return !(i < i2); } + + friend difference_type operator- (const transform_iterator& i, const transform_iterator& i2) + { return i2.distance_to(i); } + + //Arithmetic + transform_iterator& operator+=(difference_type off) + { this->advance(off); return *this; } + + transform_iterator operator+(difference_type off) const + { + transform_iterator other(*this); + other.advance(off); + return other; + } + + friend transform_iterator operator+(difference_type off, const transform_iterator& right) + { return right + off; } + + transform_iterator& operator-=(difference_type off) + { this->advance(-off); return *this; } + + transform_iterator operator-(difference_type off) const + { return *this + (-off); } + + typename UnaryFunction::result_type operator*() const + { return dereference(); } + + typename UnaryFunction::result_type operator[](difference_type off) const + { return UnaryFunction::operator()(m_it[off]); } + + operator_arrow_proxy + operator->() const + { return operator_arrow_proxy(dereference()); } + + Iterator & base() + { return m_it; } + + const Iterator & base() const + { return m_it; } + + private: + Iterator m_it; + + void increment() + { ++m_it; } + + void decrement() + { --m_it; } + + bool equal(const transform_iterator &other) const + { return m_it == other.m_it; } + + bool less(const transform_iterator &other) const + { return other.m_it < m_it; } + + typename UnaryFunction::result_type dereference() const + { return UnaryFunction::operator()(*m_it); } + + void advance(difference_type n) + { ::boost::container::iterator_advance(m_it, n); } + + difference_type distance_to(const transform_iterator &other)const + { return ::boost::container::iterator_distance(other.m_it, m_it); } +}; + +template +transform_iterator +make_transform_iterator(Iterator it, UnaryFunc fun) +{ + return transform_iterator(it, fun); +} + +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //#ifndef BOOST_INTERPROCESS_DETAIL_TRANSFORM_ITERATORS_HPP diff --git a/boost/interprocess/detail/variadic_templates_tools.hpp b/boost/interprocess/detail/variadic_templates_tools.hpp new file mode 100644 index 000000000..c0f591312 --- /dev/null +++ b/boost/interprocess/detail/variadic_templates_tools.hpp @@ -0,0 +1,35 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2008-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_DETAIL_VARIADIC_TEMPLATES_TOOLS_HPP +#define BOOST_INTERPROCESS_DETAIL_VARIADIC_TEMPLATES_TOOLS_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include + +namespace boost { +namespace interprocess { +namespace ipcdetail { + +using boost::container::container_detail::tuple; +using boost::container::container_detail::build_number_seq; +using boost::container::container_detail::index_tuple; +using boost::container::container_detail::get; + +}}} //namespace boost { namespace interprocess { namespace ipcdetail { + +#endif //#ifndef BOOST_INTERPROCESS_DETAIL_VARIADIC_TEMPLATES_TOOLS_HPP diff --git a/boost/interprocess/file_mapping.hpp b/boost/interprocess/file_mapping.hpp new file mode 100644 index 000000000..0d1cf1fe4 --- /dev/null +++ b/boost/interprocess/file_mapping.hpp @@ -0,0 +1,199 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_FILE_MAPPING_HPP +#define BOOST_INTERPROCESS_FILE_MAPPING_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +#if !defined(BOOST_INTERPROCESS_MAPPED_FILES) +#error "Boost.Interprocess: This platform does not support memory mapped files!" +#endif + +#include +#include +#include +#include +#include +#include +#include +#include //std::string + +//!\file +//!Describes file_mapping and mapped region classes + +namespace boost { +namespace interprocess { + +//!A class that wraps a file-mapping that can be used to +//!create mapped regions from the mapped files +class file_mapping +{ + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + BOOST_MOVABLE_BUT_NOT_COPYABLE(file_mapping) + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + public: + //!Constructs an empty file mapping. + //!Does not throw + file_mapping(); + + //!Opens a file mapping of file "filename", starting in offset + //!"file_offset", and the mapping's size will be "size". The mapping + //!can be opened for read-only "read_only" or read-write "read_write" + //!modes. Throws interprocess_exception on error. + file_mapping(const char *filename, mode_t mode); + + //!Moves the ownership of "moved"'s file mapping object to *this. + //!After the call, "moved" does not represent any file mapping object. + //!Does not throw + file_mapping(BOOST_RV_REF(file_mapping) moved) + : m_handle(file_handle_t(ipcdetail::invalid_file())) + , m_mode(read_only) + { this->swap(moved); } + + //!Moves the ownership of "moved"'s file mapping to *this. + //!After the call, "moved" does not represent any file mapping. + //!Does not throw + file_mapping &operator=(BOOST_RV_REF(file_mapping) moved) + { + file_mapping tmp(boost::move(moved)); + this->swap(tmp); + return *this; + } + + //!Swaps to file_mappings. + //!Does not throw. + void swap(file_mapping &other); + + //!Returns access mode + //!used in the constructor + mode_t get_mode() const; + + //!Obtains the mapping handle + //!to be used with mapped_region + mapping_handle_t get_mapping_handle() const; + + //!Destroys the file mapping. All mapped regions created from this are still + //!valid. Does not throw + ~file_mapping(); + + //!Returns the name of the file + //!used in the constructor. + const char *get_name() const; + + //!Removes the file named "filename" even if it's been memory mapped. + //!Returns true on success. + //!The function might fail in some operating systems if the file is + //!being used other processes and no deletion permission was shared. + static bool remove(const char *filename); + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + private: + //!Closes a previously opened file mapping. Never throws. + void priv_close(); + file_handle_t m_handle; + mode_t m_mode; + std::string m_filename; + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED +}; + +inline file_mapping::file_mapping() + : m_handle(file_handle_t(ipcdetail::invalid_file())) + , m_mode(read_only) +{} + +inline file_mapping::~file_mapping() +{ this->priv_close(); } + +inline const char *file_mapping::get_name() const +{ return m_filename.c_str(); } + +inline void file_mapping::swap(file_mapping &other) +{ + (simple_swap)(m_handle, other.m_handle); + (simple_swap)(m_mode, other.m_mode); + m_filename.swap(other.m_filename); +} + +inline mapping_handle_t file_mapping::get_mapping_handle() const +{ return ipcdetail::mapping_handle_from_file_handle(m_handle); } + +inline mode_t file_mapping::get_mode() const +{ return m_mode; } + +inline file_mapping::file_mapping + (const char *filename, mode_t mode) + : m_filename(filename) +{ + //Check accesses + if (mode != read_write && mode != read_only){ + error_info err = other_error; + throw interprocess_exception(err); + } + + //Open file + m_handle = ipcdetail::open_existing_file(filename, mode); + + //Check for error + if(m_handle == ipcdetail::invalid_file()){ + error_info err = system_error_code(); + this->priv_close(); + throw interprocess_exception(err); + } + m_mode = mode; +} + +inline bool file_mapping::remove(const char *filename) +{ return ipcdetail::delete_file(filename); } + +#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + +inline void file_mapping::priv_close() +{ + if(m_handle != ipcdetail::invalid_file()){ + ipcdetail::close_file(m_handle); + m_handle = ipcdetail::invalid_file(); + } +} + +//!A class that stores the name of a file +//!and tries to remove it in its destructor +//!Useful to remove temporary files in the presence +//!of exceptions +class remove_file_on_destroy +{ + const char * m_name; + public: + remove_file_on_destroy(const char *name) + : m_name(name) + {} + + ~remove_file_on_destroy() + { ipcdetail::delete_file(m_name); } +}; + +#endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //BOOST_INTERPROCESS_FILE_MAPPING_HPP diff --git a/boost/interprocess/indexes/iset_index.hpp b/boost/interprocess/indexes/iset_index.hpp new file mode 100644 index 000000000..ffaa24fa7 --- /dev/null +++ b/boost/interprocess/indexes/iset_index.hpp @@ -0,0 +1,158 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_ISET_INDEX_HPP +#define BOOST_INTERPROCESS_ISET_INDEX_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +#include +#include +#include //std::pair +#include //std::less +#include //std::char_traits +#include + +//!\file +//!Describes index adaptor of boost::intrusive::set container, to use it +//!as name/shared memory index + +namespace boost { +namespace interprocess { + +#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + +//!Helper class to define typedefs from IndexTraits +template +struct iset_index_aux +{ + typedef typename + MapConfig::segment_manager_base segment_manager_base; + + typedef typename + segment_manager_base::void_pointer void_pointer; + typedef typename bi::make_set_base_hook + < bi::void_pointer + , bi::optimize_size + >::type derivation_hook; + + typedef typename MapConfig::template + intrusive_value_type::type value_type; + typedef std::less value_compare; + typedef typename bi::make_set + < value_type + , bi::base_hook + >::type index_t; +}; +#endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + +//!Index type based in boost::intrusive::set. +//!Just derives from boost::intrusive::set +//!and defines the interface needed by managed memory segments*/ +template +class iset_index + //Derive class from map specialization + : public iset_index_aux::index_t +{ + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + typedef iset_index_aux index_aux; + typedef typename index_aux::index_t index_type; + typedef typename MapConfig:: + intrusive_compare_key_type intrusive_compare_key_type; + typedef typename MapConfig::char_type char_type; + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + public: + typedef typename index_type::iterator iterator; + typedef typename index_type::const_iterator const_iterator; + typedef typename index_type::insert_commit_data insert_commit_data; + typedef typename index_type::value_type value_type; + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + private: + + struct intrusive_key_value_less + { + bool operator()(const intrusive_compare_key_type &i, const value_type &b) const + { + std::size_t blen = b.name_length(); + return (i.m_len < blen) || + (i.m_len == blen && + std::char_traits::compare + (i.mp_str, b.name(), i.m_len) < 0); + } + + bool operator()(const value_type &b, const intrusive_compare_key_type &i) const + { + std::size_t blen = b.name_length(); + return (blen < i.m_len) || + (blen == i.m_len && + std::char_traits::compare + (b.name(), i.mp_str, i.m_len) < 0); + } + }; + + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + public: + + //!Constructor. Takes a pointer to the + //!segment manager. Can throw + iset_index(typename MapConfig::segment_manager_base *) + : index_type(/*typename index_aux::value_compare()*/) + {} + + //!This reserves memory to optimize the insertion of n + //!elements in the index + void reserve(typename MapConfig::segment_manager_base::size_type) + { /*Does nothing, map has not reserve or rehash*/ } + + //!This frees all unnecessary memory + void shrink_to_fit() + { /*Does nothing, this intrusive index does not allocate memory;*/ } + + iterator find(const intrusive_compare_key_type &key) + { return index_type::find(key, intrusive_key_value_less()); } + + const_iterator find(const intrusive_compare_key_type &key) const + { return index_type::find(key, intrusive_key_value_less()); } + + std::pairinsert_check + (const intrusive_compare_key_type &key, insert_commit_data &commit_data) + { return index_type::insert_check(key, intrusive_key_value_less(), commit_data); } +}; + +#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + +//!Trait class to detect if an index is an intrusive +//!index. +template +struct is_intrusive_index + > +{ + static const bool value = true; +}; +#endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + +} //namespace interprocess { +} //namespace boost + +#include + +#endif //#ifndef BOOST_INTERPROCESS_ISET_INDEX_HPP diff --git a/boost/interprocess/managed_mapped_file.hpp b/boost/interprocess/managed_mapped_file.hpp new file mode 100644 index 000000000..14ec16061 --- /dev/null +++ b/boost/interprocess/managed_mapped_file.hpp @@ -0,0 +1,250 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_MANAGED_MAPPED_FILE_HPP +#define BOOST_INTERPROCESS_MANAGED_MAPPED_FILE_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +//These includes needed to fulfill default template parameters of +//predeclarations in interprocess_fwd.hpp +#include +#include +#include + +namespace boost { +namespace interprocess { +namespace ipcdetail { + +template +struct mfile_open_or_create +{ + typedef ipcdetail::managed_open_or_create_impl + < file_wrapper, AllocationAlgorithm::Alignment, true, false> type; +}; + +} //namespace ipcdetail { + +//!A basic mapped file named object creation class. Initializes the +//!mapped file. Inherits all basic functionality from +//!basic_managed_memory_impl +template + < + class CharType, + class AllocationAlgorithm, + template class IndexType + > +class basic_managed_mapped_file + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + : public ipcdetail::basic_managed_memory_impl + ::type::ManagedOpenOrCreateUserOffset> + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED +{ + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + public: + typedef ipcdetail::basic_managed_memory_impl + ::type::ManagedOpenOrCreateUserOffset> base_t; + typedef ipcdetail::file_wrapper device_type; + + private: + + typedef ipcdetail::create_open_func create_open_func_t; + + basic_managed_mapped_file *get_this_pointer() + { return this; } + + private: + typedef typename base_t::char_ptr_holder_t char_ptr_holder_t; + BOOST_MOVABLE_BUT_NOT_COPYABLE(basic_managed_mapped_file) + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + public: //functions + + //!Unsigned integral type enough to represent + //!the size of a basic_managed_mapped_file. + typedef typename BOOST_INTERPROCESS_IMPDEF(base_t::size_type) size_type; + + //!Creates mapped file and creates and places the segment manager. + //!This can throw. + basic_managed_mapped_file() + {} + + //!Creates mapped file and creates and places the segment manager. + //!This can throw. + basic_managed_mapped_file(create_only_t, const char *name, + size_type size, const void *addr = 0, const permissions &perm = permissions()) + : m_mfile(create_only, name, size, read_write, addr, + create_open_func_t(get_this_pointer(), ipcdetail::DoCreate), perm) + {} + + //!Creates mapped file and creates and places the segment manager if + //!segment was not created. If segment was created it connects to the + //!segment. + //!This can throw. + basic_managed_mapped_file (open_or_create_t, + const char *name, size_type size, + const void *addr = 0, const permissions &perm = permissions()) + : m_mfile(open_or_create, name, size, read_write, addr, + create_open_func_t(get_this_pointer(), + ipcdetail::DoOpenOrCreate), perm) + {} + + //!Connects to a created mapped file and its segment manager. + //!This can throw. + basic_managed_mapped_file (open_only_t, const char* name, + const void *addr = 0) + : m_mfile(open_only, name, read_write, addr, + create_open_func_t(get_this_pointer(), + ipcdetail::DoOpen)) + {} + + //!Connects to a created mapped file and its segment manager + //!in copy_on_write mode. + //!This can throw. + basic_managed_mapped_file (open_copy_on_write_t, const char* name, + const void *addr = 0) + : m_mfile(open_only, name, copy_on_write, addr, + create_open_func_t(get_this_pointer(), + ipcdetail::DoOpen)) + {} + + //!Connects to a created mapped file and its segment manager + //!in read-only mode. + //!This can throw. + basic_managed_mapped_file (open_read_only_t, const char* name, + const void *addr = 0) + : m_mfile(open_only, name, read_only, addr, + create_open_func_t(get_this_pointer(), + ipcdetail::DoOpen)) + {} + + //!Moves the ownership of "moved"'s managed memory to *this. + //!Does not throw + basic_managed_mapped_file(BOOST_RV_REF(basic_managed_mapped_file) moved) + { + this->swap(moved); + } + + //!Moves the ownership of "moved"'s managed memory to *this. + //!Does not throw + basic_managed_mapped_file &operator=(BOOST_RV_REF(basic_managed_mapped_file) moved) + { + basic_managed_mapped_file tmp(boost::move(moved)); + this->swap(tmp); + return *this; + } + + //!Destroys *this and indicates that the calling process is finished using + //!the resource. The destructor function will deallocate + //!any system resources allocated by the system for use by this process for + //!this resource. The resource can still be opened again calling + //!the open constructor overload. To erase the resource from the system + //!use remove(). + ~basic_managed_mapped_file() + {} + + //!Swaps the ownership of the managed mapped memories managed by *this and other. + //!Never throws. + void swap(basic_managed_mapped_file &other) + { + base_t::swap(other); + m_mfile.swap(other.m_mfile); + } + + //!Flushes cached data to file. + //!Never throws + bool flush() + { return m_mfile.flush(); } + + //!Tries to resize mapped file so that we have room for + //!more objects. + //! + //!This function is not synchronized so no other thread or process should + //!be reading or writing the file + static bool grow(const char *filename, size_type extra_bytes) + { + return base_t::template grow + (filename, extra_bytes); + } + + //!Tries to resize mapped file to minimized the size of the file. + //! + //!This function is not synchronized so no other thread or process should + //!be reading or writing the file + static bool shrink_to_fit(const char *filename) + { + return base_t::template shrink_to_fit + (filename); + } + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + + //!Tries to find a previous named allocation address. Returns a memory + //!buffer and the object count. If not found returned pointer is 0. + //!Never throws. + template + std::pair find (char_ptr_holder_t name) + { + if(m_mfile.get_mapped_region().get_mode() == read_only){ + return base_t::template find_no_lock(name); + } + else{ + return base_t::template find(name); + } + } + + private: + typename ipcdetail::mfile_open_or_create::type m_mfile; + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED +}; + +#ifdef BOOST_INTERPROCESS_DOXYGEN_INVOKED + +//!Typedef for a default basic_managed_mapped_file +//!of narrow characters +typedef basic_managed_mapped_file + + ,iset_index> +managed_mapped_file; + +//!Typedef for a default basic_managed_mapped_file +//!of wide characters +typedef basic_managed_mapped_file + + ,iset_index> +wmanaged_mapped_file; + +#endif //#ifdef BOOST_INTERPROCESS_DOXYGEN_INVOKED + +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //BOOST_INTERPROCESS_MANAGED_MAPPED_FILE_HPP diff --git a/boost/interprocess/managed_shared_memory.hpp b/boost/interprocess/managed_shared_memory.hpp new file mode 100644 index 000000000..fadc19a71 --- /dev/null +++ b/boost/interprocess/managed_shared_memory.hpp @@ -0,0 +1,262 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_MANAGED_SHARED_MEMORY_HPP +#define BOOST_INTERPROCESS_MANAGED_SHARED_MEMORY_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +#include +#include +#include +#include +#include +//These includes needed to fulfill default template parameters of +//predeclarations in interprocess_fwd.hpp +#include +#include + +namespace boost { +namespace interprocess { + +namespace ipcdetail { + +template +struct shmem_open_or_create +{ + typedef ipcdetail::managed_open_or_create_impl + < shared_memory_object, AllocationAlgorithm::Alignment, true, false> type; +}; + +} //namespace ipcdetail { + +//!A basic shared memory named object creation class. Initializes the +//!shared memory segment. Inherits all basic functionality from +//!basic_managed_memory_impl*/ +template + < + class CharType, + class AllocationAlgorithm, + template class IndexType + > +class basic_managed_shared_memory + : public ipcdetail::basic_managed_memory_impl + ::type::ManagedOpenOrCreateUserOffset> + , private ipcdetail::shmem_open_or_create::type +{ + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + typedef ipcdetail::basic_managed_memory_impl + ::type::ManagedOpenOrCreateUserOffset> base_t; + typedef typename ipcdetail::shmem_open_or_create::type base2_t; + + typedef ipcdetail::create_open_func create_open_func_t; + + basic_managed_shared_memory *get_this_pointer() + { return this; } + + public: + typedef shared_memory_object device_type; + typedef typename base_t::size_type size_type; + + private: + typedef typename base_t::char_ptr_holder_t char_ptr_holder_t; + BOOST_MOVABLE_BUT_NOT_COPYABLE(basic_managed_shared_memory) + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + public: //functions + + //!Destroys *this and indicates that the calling process is finished using + //!the resource. The destructor function will deallocate + //!any system resources allocated by the system for use by this process for + //!this resource. The resource can still be opened again calling + //!the open constructor overload. To erase the resource from the system + //!use remove(). + ~basic_managed_shared_memory() + {} + + //!Default constructor. Does nothing. + //!Useful in combination with move semantics + basic_managed_shared_memory() + {} + + //!Creates shared memory and creates and places the segment manager. + //!This can throw. + basic_managed_shared_memory(create_only_t, const char *name, + size_type size, const void *addr = 0, const permissions& perm = permissions()) + : base_t() + , base2_t(create_only, name, size, read_write, addr, + create_open_func_t(get_this_pointer(), ipcdetail::DoCreate), perm) + {} + + //!Creates shared memory and creates and places the segment manager if + //!segment was not created. If segment was created it connects to the + //!segment. + //!This can throw. + basic_managed_shared_memory (open_or_create_t, + const char *name, size_type size, + const void *addr = 0, const permissions& perm = permissions()) + : base_t() + , base2_t(open_or_create, name, size, read_write, addr, + create_open_func_t(get_this_pointer(), + ipcdetail::DoOpenOrCreate), perm) + {} + + //!Connects to a created shared memory and its segment manager. + //!in copy_on_write mode. + //!This can throw. + basic_managed_shared_memory (open_copy_on_write_t, const char* name, + const void *addr = 0) + : base_t() + , base2_t(open_only, name, copy_on_write, addr, + create_open_func_t(get_this_pointer(), + ipcdetail::DoOpen)) + {} + + //!Connects to a created shared memory and its segment manager. + //!in read-only mode. + //!This can throw. + basic_managed_shared_memory (open_read_only_t, const char* name, + const void *addr = 0) + : base_t() + , base2_t(open_only, name, read_only, addr, + create_open_func_t(get_this_pointer(), + ipcdetail::DoOpen)) + {} + + //!Connects to a created shared memory and its segment manager. + //!This can throw. + basic_managed_shared_memory (open_only_t, const char* name, + const void *addr = 0) + : base_t() + , base2_t(open_only, name, read_write, addr, + create_open_func_t(get_this_pointer(), + ipcdetail::DoOpen)) + {} + + //!Moves the ownership of "moved"'s managed memory to *this. + //!Does not throw + basic_managed_shared_memory(BOOST_RV_REF(basic_managed_shared_memory) moved) + { + basic_managed_shared_memory tmp; + this->swap(moved); + tmp.swap(moved); + } + + //!Moves the ownership of "moved"'s managed memory to *this. + //!Does not throw + basic_managed_shared_memory &operator=(BOOST_RV_REF(basic_managed_shared_memory) moved) + { + basic_managed_shared_memory tmp(boost::move(moved)); + this->swap(tmp); + return *this; + } + + //!Swaps the ownership of the managed shared memories managed by *this and other. + //!Never throws. + void swap(basic_managed_shared_memory &other) + { + base_t::swap(other); + base2_t::swap(other); + } + + //!Tries to resize the managed shared memory object so that we have + //!room for more objects. + //! + //!This function is not synchronized so no other thread or process should + //!be reading or writing the file + static bool grow(const char *shmname, size_type extra_bytes) + { + return base_t::template grow + (shmname, extra_bytes); + } + + //!Tries to resize the managed shared memory to minimized the size of the file. + //! + //!This function is not synchronized so no other thread or process should + //!be reading or writing the file + static bool shrink_to_fit(const char *shmname) + { + return base_t::template shrink_to_fit + (shmname); + } + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + + //!Tries to find a previous named allocation address. Returns a memory + //!buffer and the object count. If not found returned pointer is 0. + //!Never throws. + template + std::pair find (char_ptr_holder_t name) + { + if(base2_t::get_mapped_region().get_mode() == read_only){ + return base_t::template find_no_lock(name); + } + else{ + return base_t::template find(name); + } + } + + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED +}; + +#ifdef BOOST_INTERPROCESS_DOXYGEN_INVOKED + +//!Typedef for a default basic_managed_shared_memory +//!of narrow characters +typedef basic_managed_shared_memory + + ,iset_index> +managed_shared_memory; + +//!Typedef for a default basic_managed_shared_memory +//!of wide characters +typedef basic_managed_shared_memory + + ,iset_index> +wmanaged_shared_memory; + +//!Typedef for a default basic_managed_shared_memory +//!of narrow characters to be placed in a fixed address +typedef basic_managed_shared_memory + + ,iset_index> +fixed_managed_shared_memory; + +//!Typedef for a default basic_managed_shared_memory +//!of narrow characters to be placed in a fixed address +typedef basic_managed_shared_memory + + ,iset_index> +wfixed_managed_shared_memory; + + +#endif //#ifdef BOOST_INTERPROCESS_DOXYGEN_INVOKED + +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //BOOST_INTERPROCESS_MANAGED_SHARED_MEMORY_HPP + diff --git a/boost/interprocess/mem_algo/detail/mem_algo_common.hpp b/boost/interprocess/mem_algo/detail/mem_algo_common.hpp new file mode 100644 index 000000000..87293d18f --- /dev/null +++ b/boost/interprocess/mem_algo/detail/mem_algo_common.hpp @@ -0,0 +1,596 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_DETAIL_MEM_ALGO_COMMON_HPP +#define BOOST_INTERPROCESS_DETAIL_MEM_ALGO_COMMON_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +// interprocess +#include +#include +// interprocess/detail +#include +#include +#include +#include +// container/detail +#include +#include +// move +#include +// other boost +#include +#include + +//!\file +//!Implements common operations for memory algorithms. + +namespace boost { +namespace interprocess { +namespace ipcdetail { + +template +class basic_multiallocation_chain + : public boost::container::container_detail:: + basic_multiallocation_chain +{ + BOOST_MOVABLE_BUT_NOT_COPYABLE(basic_multiallocation_chain) + typedef boost::container::container_detail:: + basic_multiallocation_chain base_t; + public: + + basic_multiallocation_chain() + : base_t() + {} + + basic_multiallocation_chain(BOOST_RV_REF(basic_multiallocation_chain) other) + : base_t(::boost::move(static_cast(other))) + {} + + basic_multiallocation_chain& operator=(BOOST_RV_REF(basic_multiallocation_chain) other) + { + this->base_t::operator=(::boost::move(static_cast(other))); + return *this; + } + + void *pop_front() + { + return boost::interprocess::ipcdetail::to_raw_pointer(this->base_t::pop_front()); + } +}; + + +//!This class implements several allocation functions shared by different algorithms +//!(aligned allocation, multiple allocation...). +template +class memory_algorithm_common +{ + public: + typedef typename MemoryAlgorithm::void_pointer void_pointer; + typedef typename MemoryAlgorithm::block_ctrl block_ctrl; + typedef typename MemoryAlgorithm::multiallocation_chain multiallocation_chain; + typedef memory_algorithm_common this_type; + typedef typename MemoryAlgorithm::size_type size_type; + + static const size_type Alignment = MemoryAlgorithm::Alignment; + static const size_type MinBlockUnits = MemoryAlgorithm::MinBlockUnits; + static const size_type AllocatedCtrlBytes = MemoryAlgorithm::AllocatedCtrlBytes; + static const size_type AllocatedCtrlUnits = MemoryAlgorithm::AllocatedCtrlUnits; + static const size_type BlockCtrlBytes = MemoryAlgorithm::BlockCtrlBytes; + static const size_type BlockCtrlUnits = MemoryAlgorithm::BlockCtrlUnits; + static const size_type UsableByPreviousChunk = MemoryAlgorithm::UsableByPreviousChunk; + + static void assert_alignment(const void *ptr) + { assert_alignment((std::size_t)ptr); } + + static void assert_alignment(size_type uint_ptr) + { + (void)uint_ptr; + BOOST_ASSERT(uint_ptr % Alignment == 0); + } + + static bool check_alignment(const void *ptr) + { return (((std::size_t)ptr) % Alignment == 0); } + + static size_type ceil_units(size_type size) + { return get_rounded_size(size, Alignment)/Alignment; } + + static size_type floor_units(size_type size) + { return size/Alignment; } + + static size_type multiple_of_units(size_type size) + { return get_rounded_size(size, Alignment); } + + static void allocate_many + (MemoryAlgorithm *memory_algo, size_type elem_bytes, size_type n_elements, multiallocation_chain &chain) + { + return this_type::priv_allocate_many(memory_algo, &elem_bytes, n_elements, 0, chain); + } + + static void deallocate_many(MemoryAlgorithm *memory_algo, multiallocation_chain &chain) + { + return this_type::priv_deallocate_many(memory_algo, chain); + } + + static bool calculate_lcm_and_needs_backwards_lcmed + (size_type backwards_multiple, size_type received_size, size_type size_to_achieve, + size_type &lcm_out, size_type &needs_backwards_lcmed_out) + { + // Now calculate lcm_val + size_type max = backwards_multiple; + size_type min = Alignment; + size_type needs_backwards; + size_type needs_backwards_lcmed; + size_type lcm_val; + size_type current_forward; + //Swap if necessary + if(max < min){ + size_type tmp = min; + min = max; + max = tmp; + } + //Check if it's power of two + if((backwards_multiple & (backwards_multiple-1)) == 0){ + if(0 != (size_to_achieve & ((backwards_multiple-1)))){ + return false; + } + + lcm_val = max; + //If we want to use minbytes data to get a buffer between maxbytes + //and minbytes if maxbytes can't be achieved, calculate the + //biggest of all possibilities + current_forward = get_truncated_size_po2(received_size, backwards_multiple); + needs_backwards = size_to_achieve - current_forward; + BOOST_ASSERT((needs_backwards % backwards_multiple) == 0); + needs_backwards_lcmed = get_rounded_size_po2(needs_backwards, lcm_val); + lcm_out = lcm_val; + needs_backwards_lcmed_out = needs_backwards_lcmed; + return true; + } + //Check if it's multiple of alignment + else if((backwards_multiple & (Alignment - 1u)) == 0){ + lcm_val = backwards_multiple; + current_forward = get_truncated_size(received_size, backwards_multiple); + //No need to round needs_backwards because backwards_multiple == lcm_val + needs_backwards_lcmed = needs_backwards = size_to_achieve - current_forward; + BOOST_ASSERT((needs_backwards_lcmed & (Alignment - 1u)) == 0); + lcm_out = lcm_val; + needs_backwards_lcmed_out = needs_backwards_lcmed; + return true; + } + //Check if it's multiple of the half of the alignmment + else if((backwards_multiple & ((Alignment/2u) - 1u)) == 0){ + lcm_val = backwards_multiple*2u; + current_forward = get_truncated_size(received_size, backwards_multiple); + needs_backwards_lcmed = needs_backwards = size_to_achieve - current_forward; + if(0 != (needs_backwards_lcmed & (Alignment-1))) + //while(0 != (needs_backwards_lcmed & (Alignment-1))) + needs_backwards_lcmed += backwards_multiple; + BOOST_ASSERT((needs_backwards_lcmed % lcm_val) == 0); + lcm_out = lcm_val; + needs_backwards_lcmed_out = needs_backwards_lcmed; + return true; + } + //Check if it's multiple of the quarter of the alignmment + else if((backwards_multiple & ((Alignment/4u) - 1u)) == 0){ + size_type remainder; + lcm_val = backwards_multiple*4u; + current_forward = get_truncated_size(received_size, backwards_multiple); + needs_backwards_lcmed = needs_backwards = size_to_achieve - current_forward; + //while(0 != (needs_backwards_lcmed & (Alignment-1))) + //needs_backwards_lcmed += backwards_multiple; + if(0 != (remainder = ((needs_backwards_lcmed & (Alignment-1))>>(Alignment/8u)))){ + if(backwards_multiple & Alignment/2u){ + needs_backwards_lcmed += (remainder)*backwards_multiple; + } + else{ + needs_backwards_lcmed += (4-remainder)*backwards_multiple; + } + } + BOOST_ASSERT((needs_backwards_lcmed % lcm_val) == 0); + lcm_out = lcm_val; + needs_backwards_lcmed_out = needs_backwards_lcmed; + return true; + } + else{ + lcm_val = lcm(max, min); + } + //If we want to use minbytes data to get a buffer between maxbytes + //and minbytes if maxbytes can't be achieved, calculate the + //biggest of all possibilities + current_forward = get_truncated_size(received_size, backwards_multiple); + needs_backwards = size_to_achieve - current_forward; + BOOST_ASSERT((needs_backwards % backwards_multiple) == 0); + needs_backwards_lcmed = get_rounded_size(needs_backwards, lcm_val); + lcm_out = lcm_val; + needs_backwards_lcmed_out = needs_backwards_lcmed; + return true; + } + + static void allocate_many + ( MemoryAlgorithm *memory_algo + , const size_type *elem_sizes + , size_type n_elements + , size_type sizeof_element + , multiallocation_chain &chain) + { + this_type::priv_allocate_many(memory_algo, elem_sizes, n_elements, sizeof_element, chain); + } + + static void* allocate_aligned + (MemoryAlgorithm *memory_algo, size_type nbytes, size_type alignment) + { + + //Ensure power of 2 + if ((alignment & (alignment - size_type(1u))) != 0){ + //Alignment is not power of two + BOOST_ASSERT((alignment & (alignment - size_type(1u))) == 0); + return 0; + } + + size_type real_size = nbytes; + if(alignment <= Alignment){ + void *ignore_reuse = 0; + return memory_algo->priv_allocate + (boost::interprocess::allocate_new, nbytes, real_size, ignore_reuse); + } + + if(nbytes > UsableByPreviousChunk) + nbytes -= UsableByPreviousChunk; + + //We can find a aligned portion if we allocate a block that has alignment + //nbytes + alignment bytes or more. + size_type minimum_allocation = max_value + (nbytes + alignment, size_type(MinBlockUnits*Alignment)); + //Since we will split that block, we must request a bit more memory + //if the alignment is near the beginning of the buffer, because otherwise, + //there is no space for a new block before the alignment. + // + // ____ Aligned here + // | + // ----------------------------------------------------- + // | MBU | + // ----------------------------------------------------- + size_type request = + minimum_allocation + (2*MinBlockUnits*Alignment - AllocatedCtrlBytes + //prevsize - UsableByPreviousChunk + ); + + //Now allocate the buffer + real_size = request; + void *ignore_reuse = 0; + void *buffer = memory_algo->priv_allocate(boost::interprocess::allocate_new, request, real_size, ignore_reuse); + if(!buffer){ + return 0; + } + else if ((((std::size_t)(buffer)) % alignment) == 0){ + //If we are lucky and the buffer is aligned, just split it and + //return the high part + block_ctrl *first = memory_algo->priv_get_block(buffer); + size_type old_size = first->m_size; + const size_type first_min_units = + max_value(ceil_units(nbytes) + AllocatedCtrlUnits, size_type(MinBlockUnits)); + //We can create a new block in the end of the segment + if(old_size >= (first_min_units + MinBlockUnits)){ + block_ctrl *second = reinterpret_cast + (reinterpret_cast(first) + Alignment*first_min_units); + first->m_size = first_min_units; + second->m_size = old_size - first->m_size; + BOOST_ASSERT(second->m_size >= MinBlockUnits); + memory_algo->priv_mark_new_allocated_block(first); + memory_algo->priv_mark_new_allocated_block(second); + memory_algo->priv_deallocate(memory_algo->priv_get_user_buffer(second)); + } + return buffer; + } + + //Buffer not aligned, find the aligned part. + // + // ____ Aligned here + // | + // ----------------------------------------------------- + // | MBU +more | ACB | + // ----------------------------------------------------- + char *pos = reinterpret_cast + (reinterpret_cast(static_cast(buffer) + + //This is the minimum size of (2) + (MinBlockUnits*Alignment - AllocatedCtrlBytes) + + //This is the next MBU for the aligned memory + AllocatedCtrlBytes + + //This is the alignment trick + alignment - 1) & -alignment); + + //Now obtain the address of the blocks + block_ctrl *first = memory_algo->priv_get_block(buffer); + block_ctrl *second = memory_algo->priv_get_block(pos); + BOOST_ASSERT(pos <= (reinterpret_cast(first) + first->m_size*Alignment)); + BOOST_ASSERT(first->m_size >= 2*MinBlockUnits); + BOOST_ASSERT((pos + MinBlockUnits*Alignment - AllocatedCtrlBytes + nbytes*Alignment/Alignment) <= + (reinterpret_cast(first) + first->m_size*Alignment)); + //Set the new size of the first block + size_type old_size = first->m_size; + first->m_size = (size_type)(reinterpret_cast(second) - reinterpret_cast(first))/Alignment; + memory_algo->priv_mark_new_allocated_block(first); + + //Now check if we can create a new buffer in the end + // + // __"second" block + // | __Aligned here + // | | __"third" block + // -----------|-----|-----|------------------------------ + // | MBU +more | ACB | (3) | BCU | + // ----------------------------------------------------- + //This size will be the minimum size to be able to create a + //new block in the end. + const size_type second_min_units = max_value(size_type(MinBlockUnits), + ceil_units(nbytes) + AllocatedCtrlUnits ); + + //Check if we can create a new block (of size MinBlockUnits) in the end of the segment + if((old_size - first->m_size) >= (second_min_units + MinBlockUnits)){ + //Now obtain the address of the end block + block_ctrl *third = new (reinterpret_cast(second) + Alignment*second_min_units)block_ctrl; + second->m_size = second_min_units; + third->m_size = old_size - first->m_size - second->m_size; + BOOST_ASSERT(third->m_size >= MinBlockUnits); + memory_algo->priv_mark_new_allocated_block(second); + memory_algo->priv_mark_new_allocated_block(third); + memory_algo->priv_deallocate(memory_algo->priv_get_user_buffer(third)); + } + else{ + second->m_size = old_size - first->m_size; + BOOST_ASSERT(second->m_size >= MinBlockUnits); + memory_algo->priv_mark_new_allocated_block(second); + } + + memory_algo->priv_deallocate(memory_algo->priv_get_user_buffer(first)); + return memory_algo->priv_get_user_buffer(second); + } + + static bool try_shrink + (MemoryAlgorithm *memory_algo, void *ptr + ,const size_type max_size, size_type &received_size) + { + size_type const preferred_size = received_size; + (void)memory_algo; + //Obtain the real block + block_ctrl *block = memory_algo->priv_get_block(ptr); + size_type old_block_units = (size_type)block->m_size; + + //The block must be marked as allocated + BOOST_ASSERT(memory_algo->priv_is_allocated_block(block)); + + //Check if alignment and block size are right + assert_alignment(ptr); + + //Put this to a safe value + received_size = (old_block_units - AllocatedCtrlUnits)*Alignment + UsableByPreviousChunk; + + //Now translate it to Alignment units + const size_type max_user_units = floor_units(max_size - UsableByPreviousChunk); + const size_type preferred_user_units = ceil_units(preferred_size - UsableByPreviousChunk); + + //Check if rounded max and preferred are possible correct + if(max_user_units < preferred_user_units) + return false; + + //Check if the block is smaller than the requested minimum + size_type old_user_units = old_block_units - AllocatedCtrlUnits; + + if(old_user_units < preferred_user_units) + return false; + + //If the block is smaller than the requested minimum + if(old_user_units == preferred_user_units) + return true; + + size_type shrunk_user_units = + ((BlockCtrlUnits - AllocatedCtrlUnits) >= preferred_user_units) + ? (BlockCtrlUnits - AllocatedCtrlUnits) + : preferred_user_units; + + //Some parameter checks + if(max_user_units < shrunk_user_units) + return false; + + //We must be able to create at least a new empty block + if((old_user_units - shrunk_user_units) < BlockCtrlUnits ){ + return false; + } + + //Update new size + received_size = shrunk_user_units*Alignment + UsableByPreviousChunk; + return true; + } + + static bool shrink + (MemoryAlgorithm *memory_algo, void *ptr + ,const size_type max_size, size_type &received_size) + { + size_type const preferred_size = received_size; + //Obtain the real block + block_ctrl *block = memory_algo->priv_get_block(ptr); + size_type old_block_units = (size_type)block->m_size; + + if(!try_shrink(memory_algo, ptr, max_size, received_size)){ + return false; + } + + //Check if the old size was just the shrunk size (no splitting) + if((old_block_units - AllocatedCtrlUnits) == ceil_units(preferred_size - UsableByPreviousChunk)) + return true; + + //Now we can just rewrite the size of the old buffer + block->m_size = (received_size-UsableByPreviousChunk)/Alignment + AllocatedCtrlUnits; + BOOST_ASSERT(block->m_size >= BlockCtrlUnits); + + //We create the new block + block_ctrl *new_block = reinterpret_cast + (reinterpret_cast(block) + block->m_size*Alignment); + //Write control data to simulate this new block was previously allocated + //and deallocate it + new_block->m_size = old_block_units - block->m_size; + BOOST_ASSERT(new_block->m_size >= BlockCtrlUnits); + memory_algo->priv_mark_new_allocated_block(block); + memory_algo->priv_mark_new_allocated_block(new_block); + memory_algo->priv_deallocate(memory_algo->priv_get_user_buffer(new_block)); + return true; + } + + private: + static void priv_allocate_many + ( MemoryAlgorithm *memory_algo + , const size_type *elem_sizes + , size_type n_elements + , size_type sizeof_element + , multiallocation_chain &chain) + { + //Note: sizeof_element == 0 indicates that we want to + //allocate n_elements of the same size "*elem_sizes" + + //Calculate the total size of all requests + size_type total_request_units = 0; + size_type elem_units = 0; + const size_type ptr_size_units = memory_algo->priv_get_total_units(sizeof(void_pointer)); + if(!sizeof_element){ + elem_units = memory_algo->priv_get_total_units(*elem_sizes); + elem_units = ptr_size_units > elem_units ? ptr_size_units : elem_units; + total_request_units = n_elements*elem_units; + } + else{ + for(size_type i = 0; i < n_elements; ++i){ + if(multiplication_overflows(elem_sizes[i], sizeof_element)){ + total_request_units = 0; + break; + } + elem_units = memory_algo->priv_get_total_units(elem_sizes[i]*sizeof_element); + elem_units = ptr_size_units > elem_units ? ptr_size_units : elem_units; + if(sum_overflows(total_request_units, elem_units)){ + total_request_units = 0; + break; + } + total_request_units += elem_units; + } + } + + if(total_request_units && !multiplication_overflows(total_request_units, Alignment)){ + size_type low_idx = 0; + while(low_idx < n_elements){ + size_type total_bytes = total_request_units*Alignment - AllocatedCtrlBytes + UsableByPreviousChunk; + size_type min_allocation = (!sizeof_element) + ? elem_units + : memory_algo->priv_get_total_units(elem_sizes[low_idx]*sizeof_element); + min_allocation = min_allocation*Alignment - AllocatedCtrlBytes + UsableByPreviousChunk; + + size_type received_size = total_bytes; + void *ignore_reuse = 0; + void *ret = memory_algo->priv_allocate + (boost::interprocess::allocate_new, min_allocation, received_size, ignore_reuse); + if(!ret){ + break; + } + + block_ctrl *block = memory_algo->priv_get_block(ret); + size_type received_units = (size_type)block->m_size; + char *block_address = reinterpret_cast(block); + + size_type total_used_units = 0; + while(total_used_units < received_units){ + if(sizeof_element){ + elem_units = memory_algo->priv_get_total_units(elem_sizes[low_idx]*sizeof_element); + elem_units = ptr_size_units > elem_units ? ptr_size_units : elem_units; + } + if(total_used_units + elem_units > received_units) + break; + total_request_units -= elem_units; + //This is the position where the new block must be created + block_ctrl *new_block = reinterpret_cast(block_address); + assert_alignment(new_block); + + //The last block should take all the remaining space + if((low_idx + 1) == n_elements || + (total_used_units + elem_units + + ((!sizeof_element) + ? elem_units + : max_value(memory_algo->priv_get_total_units(elem_sizes[low_idx+1]*sizeof_element), ptr_size_units)) + > received_units)){ + //By default, the new block will use the rest of the buffer + new_block->m_size = received_units - total_used_units; + memory_algo->priv_mark_new_allocated_block(new_block); + + //If the remaining units are bigger than needed and we can + //split it obtaining a new free memory block do it. + if((received_units - total_used_units) >= (elem_units + MemoryAlgorithm::BlockCtrlUnits)){ + size_type shrunk_request = elem_units*Alignment - AllocatedCtrlBytes + UsableByPreviousChunk; + size_type shrunk_received = shrunk_request; + bool shrink_ok = shrink + (memory_algo + ,memory_algo->priv_get_user_buffer(new_block) + ,shrunk_request + ,shrunk_received); + (void)shrink_ok; + //Shrink must always succeed with passed parameters + BOOST_ASSERT(shrink_ok); + //Some sanity checks + BOOST_ASSERT(shrunk_request == shrunk_received); + BOOST_ASSERT(elem_units == ((shrunk_request-UsableByPreviousChunk)/Alignment + AllocatedCtrlUnits)); + //"new_block->m_size" must have been reduced to elem_units by "shrink" + BOOST_ASSERT(new_block->m_size == elem_units); + //Now update the total received units with the reduction + received_units = elem_units + total_used_units; + } + } + else{ + new_block->m_size = elem_units; + memory_algo->priv_mark_new_allocated_block(new_block); + } + + block_address += new_block->m_size*Alignment; + total_used_units += (size_type)new_block->m_size; + //Check we have enough room to overwrite the intrusive pointer + BOOST_ASSERT((new_block->m_size*Alignment - AllocatedCtrlUnits) >= sizeof(void_pointer)); + void_pointer p = ::new(memory_algo->priv_get_user_buffer(new_block), boost_container_new_t())void_pointer(0); + chain.push_back(p); + ++low_idx; + } + //Sanity check + BOOST_ASSERT(total_used_units == received_units); + } + + if(low_idx != n_elements){ + priv_deallocate_many(memory_algo, chain); + } + } + } + + static void priv_deallocate_many(MemoryAlgorithm *memory_algo, multiallocation_chain &chain) + { + while(!chain.empty()){ + memory_algo->priv_deallocate(to_raw_pointer(chain.pop_front())); + } + } +}; + +} //namespace ipcdetail { +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //#ifndef BOOST_INTERPROCESS_DETAIL_MEM_ALGO_COMMON_HPP diff --git a/boost/interprocess/mem_algo/rbtree_best_fit.hpp b/boost/interprocess/mem_algo/rbtree_best_fit.hpp new file mode 100644 index 000000000..dc4307fe7 --- /dev/null +++ b/boost/interprocess/mem_algo/rbtree_best_fit.hpp @@ -0,0 +1,1400 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_MEM_ALGO_RBTREE_BEST_FIT_HPP +#define BOOST_INTERPROCESS_MEM_ALGO_RBTREE_BEST_FIT_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +// interprocess +#include +#include +#include +#include +#include +#include +// interprocess/detail +#include +#include +#include +#include +// container +#include +// container/detail +#include +// move/detail +#include //make_unsigned, alignment_of +// intrusive +#include +#include +// other boost +#include +#include +// std +#include +#include + +//#define BOOST_INTERPROCESS_RBTREE_BEST_FIT_ABI_V1_HPP +//to maintain ABI compatible with the original version +//ABI had to be updated to fix compatibility issues when +//sharing shared memory between 32 adn 64 bit processes. + +//!\file +//!Describes a best-fit algorithm based in an intrusive red-black tree used to allocate +//!objects in shared memory. This class is intended as a base class for single segment +//!and multi-segment implementations. + +namespace boost { +namespace interprocess { + +//!This class implements an algorithm that stores the free nodes in a red-black tree +//!to have logarithmic search/insert times. +template +class rbtree_best_fit +{ + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + //Non-copyable + rbtree_best_fit(); + rbtree_best_fit(const rbtree_best_fit &); + rbtree_best_fit &operator=(const rbtree_best_fit &); + + private: + struct block_ctrl; + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type block_ctrl_ptr; + + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type char_ptr; + + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + public: + //!Shared mutex family used for the rest of the Interprocess framework + typedef MutexFamily mutex_family; + //!Pointer type to be used with the rest of the Interprocess framework + typedef VoidPointer void_pointer; + typedef ipcdetail::basic_multiallocation_chain multiallocation_chain; + + typedef typename boost::intrusive::pointer_traits::difference_type difference_type; + typedef typename boost::container::container_detail::make_unsigned::type size_type; + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + + private: + + typedef typename bi::make_set_base_hook + < bi::void_pointer + , bi::optimize_size + , bi::link_mode >::type TreeHook; + + struct SizeHolder + { + //!This block's memory size (including block_ctrl + //!header) in Alignment units + size_type m_prev_size : sizeof(size_type)*CHAR_BIT; + size_type m_size : sizeof(size_type)*CHAR_BIT - 2; + size_type m_prev_allocated : 1; + size_type m_allocated : 1; + }; + + //!Block control structure + struct block_ctrl + : public SizeHolder, public TreeHook + { + block_ctrl() + { this->m_size = 0; this->m_allocated = 0, this->m_prev_allocated = 0; } + + friend bool operator<(const block_ctrl &a, const block_ctrl &b) + { return a.m_size < b.m_size; } + friend bool operator==(const block_ctrl &a, const block_ctrl &b) + { return a.m_size == b.m_size; } + }; + + struct size_block_ctrl_compare + { + bool operator()(size_type size, const block_ctrl &block) const + { return size < block.m_size; } + + bool operator()(const block_ctrl &block, size_type size) const + { return block.m_size < size; } + }; + + //!Shared mutex to protect memory allocate/deallocate + typedef typename MutexFamily::mutex_type mutex_type; + typedef typename bi::make_multiset + >::type Imultiset; + + typedef typename Imultiset::iterator imultiset_iterator; + typedef typename Imultiset::const_iterator imultiset_const_iterator; + + //!This struct includes needed data and derives from + //!mutex_type to allow EBO when using null mutex_type + struct header_t : public mutex_type + { + Imultiset m_imultiset; + + //!The extra size required by the segment + size_type m_extra_hdr_bytes; + //!Allocated bytes for internal checking + size_type m_allocated; + //!The size of the memory segment + size_type m_size; + } m_header; + + friend class ipcdetail::memory_algorithm_common; + + typedef ipcdetail::memory_algorithm_common algo_impl_t; + + public: + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + //!Constructor. "size" is the total size of the managed memory segment, + //!"extra_hdr_bytes" indicates the extra bytes beginning in the sizeof(rbtree_best_fit) + //!offset that the allocator should not use at all. + rbtree_best_fit (size_type size, size_type extra_hdr_bytes); + + //!Destructor. + ~rbtree_best_fit(); + + //!Obtains the minimum size needed by the algorithm + static size_type get_min_size (size_type extra_hdr_bytes); + + //Functions for single segment management + + //!Allocates bytes, returns 0 if there is not more memory + void* allocate (size_type nbytes); + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + + //Experimental. Dont' use + + //!Multiple element allocation, same size + void allocate_many(size_type elem_bytes, size_type num_elements, multiallocation_chain &chain) + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + algo_impl_t::allocate_many(this, elem_bytes, num_elements, chain); + } + + //!Multiple element allocation, different size + void allocate_many(const size_type *elem_sizes, size_type n_elements, size_type sizeof_element, multiallocation_chain &chain) + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + algo_impl_t::allocate_many(this, elem_sizes, n_elements, sizeof_element, chain); + } + + //!Multiple element allocation, different size + void deallocate_many(multiallocation_chain &chain); + + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + //!Deallocates previously allocated bytes + void deallocate (void *addr); + + //!Returns the size of the memory segment + size_type get_size() const; + + //!Returns the number of free bytes of the segment + size_type get_free_memory() const; + + //!Initializes to zero all the memory that's not in use. + //!This function is normally used for security reasons. + void zero_free_memory(); + + //!Increases managed memory in + //!extra_size bytes more + void grow(size_type extra_size); + + //!Decreases managed memory as much as possible + void shrink_to_fit(); + + //!Returns true if all allocated memory has been deallocated + bool all_memory_deallocated(); + + //!Makes an internal sanity check + //!and returns true if success + bool check_sanity(); + + template + T * allocation_command (boost::interprocess::allocation_type command, size_type limit_size, + size_type &prefer_in_recvd_out_size, T *&reuse); + + void * raw_allocation_command (boost::interprocess::allocation_type command, size_type limit_object, + size_type &prefer_in_recvd_out_size, + void *&reuse_ptr, size_type sizeof_object = 1); + + //!Returns the size of the buffer previously allocated pointed by ptr + size_type size(const void *ptr) const; + + //!Allocates aligned bytes, returns 0 if there is not more memory. + //!Alignment must be power of 2 + void* allocate_aligned (size_type nbytes, size_type alignment); + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + private: + static size_type priv_first_block_offset_from_this(const void *this_ptr, size_type extra_hdr_bytes); + + block_ctrl *priv_first_block(); + + block_ctrl *priv_end_block(); + + void* priv_allocation_command(boost::interprocess::allocation_type command, size_type limit_size, + size_type &prefer_in_recvd_out_size, void *&reuse_ptr, size_type sizeof_object); + + + //!Real allocation algorithm with min allocation option + void * priv_allocate( boost::interprocess::allocation_type command + , size_type limit_size, size_type &prefer_in_recvd_out_size + , void *&reuse_ptr, size_type backwards_multiple = 1); + + //!Obtains the block control structure of the user buffer + static block_ctrl *priv_get_block(const void *ptr); + + //!Obtains the pointer returned to the user from the block control + static void *priv_get_user_buffer(const block_ctrl *block); + + //!Returns the number of total units that a user buffer + //!of "userbytes" bytes really occupies (including header) + static size_type priv_get_total_units(size_type userbytes); + + //!Real expand function implementation + bool priv_expand(void *ptr, const size_type min_size, size_type &prefer_in_recvd_out_size); + + //!Real expand to both sides implementation + void* priv_expand_both_sides(boost::interprocess::allocation_type command + ,size_type min_size + ,size_type &prefer_in_recvd_out_size + ,void *reuse_ptr + ,bool only_preferred_backwards + ,size_type backwards_multiple); + + //!Returns true if the previous block is allocated + bool priv_is_prev_allocated(block_ctrl *ptr); + + //!Get a pointer of the "end" block from the first block of the segment + static block_ctrl * priv_end_block(block_ctrl *first_segment_block); + + //!Get a pointer of the "first" block from the end block of the segment + static block_ctrl * priv_first_block(block_ctrl *end_segment_block); + + //!Get poitner of the previous block (previous block must be free) + static block_ctrl * priv_prev_block(block_ctrl *ptr); + + //!Get the size in the tail of the previous block + static block_ctrl * priv_next_block(block_ctrl *ptr); + + //!Check if this block is free (not allocated) + bool priv_is_allocated_block(block_ctrl *ptr); + + //!Marks the block as allocated + void priv_mark_as_allocated_block(block_ctrl *ptr); + + //!Marks the block as allocated + void priv_mark_new_allocated_block(block_ctrl *ptr) + { return priv_mark_as_allocated_block(ptr); } + + //!Marks the block as allocated + void priv_mark_as_free_block(block_ctrl *ptr); + + //!Checks if block has enough memory and splits/unlinks the block + //!returning the address to the users + void* priv_check_and_allocate(size_type units + ,block_ctrl* block + ,size_type &received_size); + //!Real deallocation algorithm + void priv_deallocate(void *addr); + + //!Makes a new memory portion available for allocation + void priv_add_segment(void *addr, size_type size); + + public: + + static const size_type Alignment = !MemAlignment + ? size_type(::boost::container::container_detail::alignment_of + < ::boost::container::container_detail::max_align_t>::value) + : size_type(MemAlignment) + ; + + private: + //Due to embedded bits in size, Alignment must be at least 4 + BOOST_STATIC_ASSERT((Alignment >= 4)); + //Due to rbtree size optimizations, Alignment must have at least pointer alignment + BOOST_STATIC_ASSERT((Alignment >= ::boost::container::container_detail::alignment_of::value)); + static const size_type AlignmentMask = (Alignment - 1); + static const size_type BlockCtrlBytes = ipcdetail::ct_rounded_size::value; + static const size_type BlockCtrlUnits = BlockCtrlBytes/Alignment; + static const size_type AllocatedCtrlBytes = ipcdetail::ct_rounded_size::value; + static const size_type AllocatedCtrlUnits = AllocatedCtrlBytes/Alignment; + static const size_type EndCtrlBlockBytes = ipcdetail::ct_rounded_size::value; + static const size_type EndCtrlBlockUnits = EndCtrlBlockBytes/Alignment; + static const size_type MinBlockUnits = BlockCtrlUnits; + static const size_type UsableByPreviousChunk = sizeof(size_type); + + //Make sure the maximum alignment is power of two + BOOST_STATIC_ASSERT((0 == (Alignment & (Alignment - size_type(1u))))); + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + public: + static const size_type PayloadPerAllocation = AllocatedCtrlBytes - UsableByPreviousChunk; +}; + +#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + +template +inline typename rbtree_best_fit::size_type + rbtree_best_fit + ::priv_first_block_offset_from_this(const void *this_ptr, size_type extra_hdr_bytes) +{ + size_type uint_this = (std::size_t)this_ptr; + size_type main_hdr_end = uint_this + sizeof(rbtree_best_fit) + extra_hdr_bytes; + size_type aligned_main_hdr_end = ipcdetail::get_rounded_size(main_hdr_end, Alignment); + size_type block1_off = aligned_main_hdr_end - uint_this; + algo_impl_t::assert_alignment(aligned_main_hdr_end); + algo_impl_t::assert_alignment(uint_this + block1_off); + return block1_off; +} + +template +void rbtree_best_fit:: + priv_add_segment(void *addr, size_type segment_size) +{ + //Check alignment + algo_impl_t::check_alignment(addr); + //Check size + BOOST_ASSERT(segment_size >= (BlockCtrlBytes + EndCtrlBlockBytes)); + + //Initialize the first big block and the "end" node + block_ctrl *first_big_block = ::new(addr, boost_container_new_t())block_ctrl; + first_big_block->m_size = segment_size/Alignment - EndCtrlBlockUnits; + BOOST_ASSERT(first_big_block->m_size >= BlockCtrlUnits); + + //The "end" node is just a node of size 0 with the "end" bit set + block_ctrl *end_block = static_cast + (new (reinterpret_cast(addr) + first_big_block->m_size*Alignment)SizeHolder); + + //This will overwrite the prev part of the "end" node + priv_mark_as_free_block (first_big_block); + #ifdef BOOST_INTERPROCESS_RBTREE_BEST_FIT_ABI_V1_HPP + first_big_block->m_prev_size = end_block->m_size = + (reinterpret_cast(first_big_block) - reinterpret_cast(end_block))/Alignment; + #else + first_big_block->m_prev_size = end_block->m_size = + (reinterpret_cast(end_block) - reinterpret_cast(first_big_block))/Alignment; + #endif + end_block->m_allocated = 1; + first_big_block->m_prev_allocated = 1; + + BOOST_ASSERT(priv_next_block(first_big_block) == end_block); + BOOST_ASSERT(priv_prev_block(end_block) == first_big_block); + BOOST_ASSERT(priv_first_block() == first_big_block); + BOOST_ASSERT(priv_end_block() == end_block); + + //Some check to validate the algorithm, since it makes some assumptions + //to optimize the space wasted in bookkeeping: + + //Check that the sizes of the header are placed before the rbtree + BOOST_ASSERT(static_cast(static_cast(first_big_block)) + < static_cast(static_cast(first_big_block))); + //Insert it in the intrusive containers + m_header.m_imultiset.insert(*first_big_block); +} + +template +inline typename rbtree_best_fit::block_ctrl * + rbtree_best_fit + ::priv_first_block() +{ + size_type block1_off = priv_first_block_offset_from_this(this, m_header.m_extra_hdr_bytes); + return reinterpret_cast(reinterpret_cast(this) + block1_off); +} + +template +inline typename rbtree_best_fit::block_ctrl * + rbtree_best_fit + ::priv_end_block() +{ + size_type block1_off = priv_first_block_offset_from_this(this, m_header.m_extra_hdr_bytes); + const size_type original_first_block_size = m_header.m_size/Alignment*Alignment - block1_off/Alignment*Alignment - EndCtrlBlockBytes; + block_ctrl *end_block = reinterpret_cast + (reinterpret_cast(this) + block1_off + original_first_block_size); + return end_block; +} + +template +inline rbtree_best_fit:: + rbtree_best_fit(size_type segment_size, size_type extra_hdr_bytes) +{ + //Initialize the header + m_header.m_allocated = 0; + m_header.m_size = segment_size; + m_header.m_extra_hdr_bytes = extra_hdr_bytes; + + //Now write calculate the offset of the first big block that will + //cover the whole segment + BOOST_ASSERT(get_min_size(extra_hdr_bytes) <= segment_size); + size_type block1_off = priv_first_block_offset_from_this(this, extra_hdr_bytes); + priv_add_segment(reinterpret_cast(this) + block1_off, segment_size - block1_off); +} + +template +inline rbtree_best_fit::~rbtree_best_fit() +{ + //There is a memory leak! +// BOOST_ASSERT(m_header.m_allocated == 0); +// BOOST_ASSERT(m_header.m_root.m_next->m_next == block_ctrl_ptr(&m_header.m_root)); +} + +template +void rbtree_best_fit::grow(size_type extra_size) +{ + //Get the address of the first block + block_ctrl *first_block = priv_first_block(); + block_ctrl *old_end_block = priv_end_block(); + size_type old_border_offset = (size_type)(reinterpret_cast(old_end_block) - + reinterpret_cast(this)) + EndCtrlBlockBytes; + + //Update managed buffer's size + m_header.m_size += extra_size; + + //We need at least MinBlockUnits blocks to create a new block + if((m_header.m_size - old_border_offset) < MinBlockUnits){ + return; + } + + //Now create a new block between the old end and the new end + size_type align_offset = (m_header.m_size - old_border_offset)/Alignment; + block_ctrl *new_end_block = reinterpret_cast + (reinterpret_cast(old_end_block) + align_offset*Alignment); + + //the last and first block are special: + //new_end_block->m_size & first_block->m_prev_size store the absolute value + //between them + new_end_block->m_allocated = 1; + #ifdef BOOST_INTERPROCESS_RBTREE_BEST_FIT_ABI_V1_HPP + new_end_block->m_size = (reinterpret_cast(first_block) - + reinterpret_cast(new_end_block))/Alignment; + #else + new_end_block->m_size = (reinterpret_cast(new_end_block) - + reinterpret_cast(first_block))/Alignment; + #endif + first_block->m_prev_size = new_end_block->m_size; + first_block->m_prev_allocated = 1; + BOOST_ASSERT(new_end_block == priv_end_block()); + + //The old end block is the new block + block_ctrl *new_block = old_end_block; + new_block->m_size = (reinterpret_cast(new_end_block) - + reinterpret_cast(new_block))/Alignment; + BOOST_ASSERT(new_block->m_size >= BlockCtrlUnits); + priv_mark_as_allocated_block(new_block); + BOOST_ASSERT(priv_next_block(new_block) == new_end_block); + + m_header.m_allocated += (size_type)new_block->m_size*Alignment; + + //Now deallocate the newly created block + this->priv_deallocate(priv_get_user_buffer(new_block)); +} + +template +void rbtree_best_fit::shrink_to_fit() +{ + //Get the address of the first block + block_ctrl *first_block = priv_first_block(); + algo_impl_t::assert_alignment(first_block); + + //block_ctrl *old_end_block = priv_end_block(first_block); + block_ctrl *old_end_block = priv_end_block(); + algo_impl_t::assert_alignment(old_end_block); + size_type old_end_block_size = old_end_block->m_size; + + void *unique_buffer = 0; + block_ctrl *last_block; + //Check if no memory is allocated between the first and last block + if(priv_next_block(first_block) == old_end_block){ + //If so check if we can allocate memory + size_type ignore_recvd = 0; + void *ignore_reuse = 0; + unique_buffer = priv_allocate(boost::interprocess::allocate_new, 0, ignore_recvd, ignore_reuse); + //If not, return, we can't shrink + if(!unique_buffer) + return; + //If we can, mark the position just after the new allocation as the new end + algo_impl_t::assert_alignment(unique_buffer); + block_ctrl *unique_block = priv_get_block(unique_buffer); + BOOST_ASSERT(priv_is_allocated_block(unique_block)); + algo_impl_t::assert_alignment(unique_block); + last_block = priv_next_block(unique_block); + BOOST_ASSERT(!priv_is_allocated_block(last_block)); + algo_impl_t::assert_alignment(last_block); + } + else{ + //If memory is allocated, check if the last block is allocated + if(priv_is_prev_allocated(old_end_block)) + return; + //If not, mark last block after the free block + last_block = priv_prev_block(old_end_block); + } + + size_type last_block_size = last_block->m_size; + + //Erase block from the free tree, since we will erase it + m_header.m_imultiset.erase(Imultiset::s_iterator_to(*last_block)); + + size_type shrunk_border_offset = (size_type)(reinterpret_cast(last_block) - + reinterpret_cast(this)) + EndCtrlBlockBytes; + + block_ctrl *new_end_block = last_block; + algo_impl_t::assert_alignment(new_end_block); + + //Write new end block attributes + #ifdef BOOST_INTERPROCESS_RBTREE_BEST_FIT_ABI_V1_HPP + new_end_block->m_size = first_block->m_prev_size = + (reinterpret_cast(first_block) - reinterpret_cast(new_end_block))/Alignment; + #else + new_end_block->m_size = first_block->m_prev_size = + (reinterpret_cast(new_end_block) - reinterpret_cast(first_block))/Alignment; + #endif + + new_end_block->m_allocated = 1; + (void)last_block_size; + (void)old_end_block_size; + BOOST_ASSERT(new_end_block->m_size == (old_end_block_size - last_block_size)); + + //Update managed buffer's size + m_header.m_size = shrunk_border_offset; + BOOST_ASSERT(priv_end_block() == new_end_block); + if(unique_buffer) + priv_deallocate(unique_buffer); +} + +template +inline typename rbtree_best_fit::size_type +rbtree_best_fit::get_size() const +{ return m_header.m_size; } + +template +typename rbtree_best_fit::size_type +rbtree_best_fit::get_free_memory() const +{ + return m_header.m_size - m_header.m_allocated - + priv_first_block_offset_from_this(this, m_header.m_extra_hdr_bytes); +} + +template +typename rbtree_best_fit::size_type +rbtree_best_fit:: + get_min_size (size_type extra_hdr_bytes) +{ + return (algo_impl_t::ceil_units(sizeof(rbtree_best_fit)) + + algo_impl_t::ceil_units(extra_hdr_bytes) + + MinBlockUnits + EndCtrlBlockUnits)*Alignment; +} + +template +inline bool rbtree_best_fit:: + all_memory_deallocated() +{ + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + size_type block1_off = + priv_first_block_offset_from_this(this, m_header.m_extra_hdr_bytes); + + return m_header.m_allocated == 0 && + m_header.m_imultiset.begin() != m_header.m_imultiset.end() && + (++m_header.m_imultiset.begin()) == m_header.m_imultiset.end() + && m_header.m_imultiset.begin()->m_size == + (m_header.m_size - block1_off - EndCtrlBlockBytes)/Alignment; +} + +template +bool rbtree_best_fit:: + check_sanity() +{ + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + imultiset_iterator ib(m_header.m_imultiset.begin()), ie(m_header.m_imultiset.end()); + + size_type free_memory = 0; + + //Iterate through all blocks obtaining their size + for(; ib != ie; ++ib){ + free_memory += (size_type)ib->m_size*Alignment; + algo_impl_t::assert_alignment(&*ib); + if(!algo_impl_t::check_alignment(&*ib)) + return false; + } + + //Check allocated bytes are less than size + if(m_header.m_allocated > m_header.m_size){ + return false; + } + + size_type block1_off = + priv_first_block_offset_from_this(this, m_header.m_extra_hdr_bytes); + + //Check free bytes are less than size + if(free_memory > (m_header.m_size - block1_off)){ + return false; + } + return true; +} + +template +inline void* rbtree_best_fit:: + allocate(size_type nbytes) +{ + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + size_type ignore_recvd = nbytes; + void *ignore_reuse = 0; + return priv_allocate(boost::interprocess::allocate_new, nbytes, ignore_recvd, ignore_reuse); +} + +template +inline void* rbtree_best_fit:: + allocate_aligned(size_type nbytes, size_type alignment) +{ + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + return algo_impl_t::allocate_aligned(this, nbytes, alignment); +} + +template +template +inline T* rbtree_best_fit:: + allocation_command (boost::interprocess::allocation_type command, size_type limit_size, + size_type &prefer_in_recvd_out_size, T *&reuse) +{ + void* raw_reuse = reuse; + void* const ret = priv_allocation_command(command, limit_size, prefer_in_recvd_out_size, raw_reuse, sizeof(T)); + reuse = static_cast(raw_reuse); + BOOST_ASSERT(0 == ((std::size_t)ret % ::boost::container::container_detail::alignment_of::value)); + return static_cast(ret); +} + +template +inline void* rbtree_best_fit:: + raw_allocation_command (boost::interprocess::allocation_type command, size_type limit_objects, + size_type &prefer_in_recvd_out_objects, void *&reuse_ptr, size_type sizeof_object) +{ + size_type const preferred_objects = prefer_in_recvd_out_objects; + if(!sizeof_object) + return reuse_ptr = 0, static_cast(0); + if(command & boost::interprocess::try_shrink_in_place){ + if(!reuse_ptr) return static_cast(0); + const bool success = algo_impl_t::try_shrink + ( this, reuse_ptr, limit_objects*sizeof_object + , prefer_in_recvd_out_objects = preferred_objects*sizeof_object); + prefer_in_recvd_out_objects /= sizeof_object; + return success ? reuse_ptr : 0; + } + else{ + return priv_allocation_command + (command, limit_objects, prefer_in_recvd_out_objects, reuse_ptr, sizeof_object); + } +} + + +template +inline void* rbtree_best_fit:: + priv_allocation_command (boost::interprocess::allocation_type command, size_type limit_size, + size_type &prefer_in_recvd_out_size, + void *&reuse_ptr, size_type sizeof_object) +{ + void* ret; + size_type const preferred_size = prefer_in_recvd_out_size; + size_type const max_count = m_header.m_size/sizeof_object; + if(limit_size > max_count || preferred_size > max_count){ + return reuse_ptr = 0, static_cast(0); + } + size_type l_size = limit_size*sizeof_object; + size_type p_size = preferred_size*sizeof_object; + size_type r_size; + { + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + ret = priv_allocate(command, l_size, r_size = p_size, reuse_ptr, sizeof_object); + } + prefer_in_recvd_out_size = r_size/sizeof_object; + return ret; +} + +template +typename rbtree_best_fit::size_type +rbtree_best_fit:: + size(const void *ptr) const +{ + //We need no synchronization since this block's size is not going + //to be modified by anyone else + //Obtain the real size of the block + return ((size_type)priv_get_block(ptr)->m_size - AllocatedCtrlUnits)*Alignment + UsableByPreviousChunk; +} + +template +inline void rbtree_best_fit::zero_free_memory() +{ + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + imultiset_iterator ib(m_header.m_imultiset.begin()), ie(m_header.m_imultiset.end()); + + //Iterate through all blocks obtaining their size + while(ib != ie){ + //Just clear user the memory part reserved for the user + volatile char *ptr = reinterpret_cast(&*ib) + BlockCtrlBytes; + size_type s = (size_type)ib->m_size*Alignment - BlockCtrlBytes; + while(s--){ + *ptr++ = 0; + } + + //This surprisingly is optimized out by Visual C++ 7.1 in release mode! + //std::memset( reinterpret_cast(&*ib) + BlockCtrlBytes + // , 0 + // , ib->m_size*Alignment - BlockCtrlBytes); + ++ib; + } +} + +template +void* rbtree_best_fit:: + priv_expand_both_sides(boost::interprocess::allocation_type command + ,size_type min_size + ,size_type &prefer_in_recvd_out_size + ,void *reuse_ptr + ,bool only_preferred_backwards + ,size_type backwards_multiple) +{ + size_type const preferred_size = prefer_in_recvd_out_size; + algo_impl_t::assert_alignment(reuse_ptr); + if(command & boost::interprocess::expand_fwd){ + if(priv_expand(reuse_ptr, min_size, prefer_in_recvd_out_size = preferred_size)) + return reuse_ptr; + } + else{ + prefer_in_recvd_out_size = this->size(reuse_ptr); + if(prefer_in_recvd_out_size >= preferred_size || prefer_in_recvd_out_size >= min_size) + return reuse_ptr; + } + + if(backwards_multiple){ + BOOST_ASSERT(0 == (min_size % backwards_multiple)); + BOOST_ASSERT(0 == (preferred_size % backwards_multiple)); + } + + if(command & boost::interprocess::expand_bwd){ + //Obtain the real size of the block + block_ctrl *reuse = priv_get_block(reuse_ptr); + + //Sanity check + algo_impl_t::assert_alignment(reuse); + + block_ctrl *prev_block; + + //If the previous block is not free, there is nothing to do + if(priv_is_prev_allocated(reuse)){ + return 0; + } + + prev_block = priv_prev_block(reuse); + BOOST_ASSERT(!priv_is_allocated_block(prev_block)); + + //Some sanity checks + BOOST_ASSERT(prev_block->m_size == reuse->m_prev_size); + algo_impl_t::assert_alignment(prev_block); + + size_type needs_backwards_aligned; + size_type lcm; + if(!algo_impl_t::calculate_lcm_and_needs_backwards_lcmed + ( backwards_multiple + , prefer_in_recvd_out_size + , only_preferred_backwards ? preferred_size : min_size + , lcm, needs_backwards_aligned)){ + return 0; + } + + //Check if previous block has enough size + if(size_type(prev_block->m_size*Alignment) >= needs_backwards_aligned){ + //Now take all next space. This will succeed + if(command & boost::interprocess::expand_fwd){ + size_type received_size2; + if(!priv_expand(reuse_ptr, prefer_in_recvd_out_size, received_size2 = prefer_in_recvd_out_size)){ + BOOST_ASSERT(0); + } + BOOST_ASSERT(prefer_in_recvd_out_size == received_size2); + } + //We need a minimum size to split the previous one + if(prev_block->m_size >= (needs_backwards_aligned/Alignment + BlockCtrlUnits)){ + block_ctrl *new_block = reinterpret_cast + (reinterpret_cast(reuse) - needs_backwards_aligned); + + //Free old previous buffer + new_block->m_size = + AllocatedCtrlUnits + (needs_backwards_aligned + (prefer_in_recvd_out_size - UsableByPreviousChunk))/Alignment; + BOOST_ASSERT(new_block->m_size >= BlockCtrlUnits); + priv_mark_as_allocated_block(new_block); + + prev_block->m_size = (reinterpret_cast(new_block) - + reinterpret_cast(prev_block))/Alignment; + BOOST_ASSERT(prev_block->m_size >= BlockCtrlUnits); + priv_mark_as_free_block(prev_block); + + //Update the old previous block in the free blocks tree + //If the new size fulfills tree invariants do nothing, + //otherwise erase() + insert() + { + imultiset_iterator prev_block_it(Imultiset::s_iterator_to(*prev_block)); + imultiset_iterator was_smaller_it(prev_block_it); + if(prev_block_it != m_header.m_imultiset.begin() && + (--(was_smaller_it = prev_block_it))->m_size > prev_block->m_size){ + m_header.m_imultiset.erase(prev_block_it); + m_header.m_imultiset.insert(m_header.m_imultiset.begin(), *prev_block); + } + } + + prefer_in_recvd_out_size = needs_backwards_aligned + prefer_in_recvd_out_size; + m_header.m_allocated += needs_backwards_aligned; + + //Check alignment + algo_impl_t::assert_alignment(new_block); + + //If the backwards expansion has remaining bytes in the + //first bytes, fill them with a pattern + void *p = priv_get_user_buffer(new_block); + void *user_ptr = reinterpret_cast(p); + BOOST_ASSERT((static_cast(reuse_ptr) - static_cast(user_ptr)) % backwards_multiple == 0); + algo_impl_t::assert_alignment(user_ptr); + return user_ptr; + } + //Check if there is no place to create a new block and + //the whole new block is multiple of the backwards expansion multiple + else if(prev_block->m_size >= needs_backwards_aligned/Alignment && + 0 == ((prev_block->m_size*Alignment) % lcm)) { + //Erase old previous block, since we will change it + m_header.m_imultiset.erase(Imultiset::s_iterator_to(*prev_block)); + + //Just merge the whole previous block + //prev_block->m_size*Alignment is multiple of lcm (and backwards_multiple) + prefer_in_recvd_out_size = prefer_in_recvd_out_size + (size_type)prev_block->m_size*Alignment; + + m_header.m_allocated += (size_type)prev_block->m_size*Alignment; + //Now update sizes + prev_block->m_size = prev_block->m_size + reuse->m_size; + BOOST_ASSERT(prev_block->m_size >= BlockCtrlUnits); + priv_mark_as_allocated_block(prev_block); + + //If the backwards expansion has remaining bytes in the + //first bytes, fill them with a pattern + void *user_ptr = priv_get_user_buffer(prev_block); + BOOST_ASSERT((static_cast(reuse_ptr) - static_cast(user_ptr)) % backwards_multiple == 0); + algo_impl_t::assert_alignment(user_ptr); + return user_ptr; + } + else{ + //Alignment issues + } + } + } + return 0; +} + +template +inline void rbtree_best_fit:: + deallocate_many(typename rbtree_best_fit::multiallocation_chain &chain) +{ + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + algo_impl_t::deallocate_many(this, chain); +} + +template +void * rbtree_best_fit:: + priv_allocate(boost::interprocess::allocation_type command + ,size_type limit_size + ,size_type &prefer_in_recvd_out_size + ,void *&reuse_ptr + ,size_type backwards_multiple) +{ + size_type const preferred_size = prefer_in_recvd_out_size; + if(command & boost::interprocess::shrink_in_place){ + if(!reuse_ptr) return static_cast(0); + bool success = + algo_impl_t::shrink(this, reuse_ptr, limit_size, prefer_in_recvd_out_size = preferred_size); + return success ? reuse_ptr : 0; + } + + prefer_in_recvd_out_size = 0; + + if(limit_size > preferred_size) + return reuse_ptr = 0, static_cast(0); + + //Number of units to request (including block_ctrl header) + size_type preferred_units = priv_get_total_units(preferred_size); + + //Number of units to request (including block_ctrl header) + size_type limit_units = priv_get_total_units(limit_size); + + //Expand in place + prefer_in_recvd_out_size = preferred_size; + if(reuse_ptr && (command & (boost::interprocess::expand_fwd | boost::interprocess::expand_bwd))){ + void *ret = priv_expand_both_sides + (command, limit_size, prefer_in_recvd_out_size, reuse_ptr, true, backwards_multiple); + if(ret) + return ret; + } + + if(command & boost::interprocess::allocate_new){ + size_block_ctrl_compare comp; + imultiset_iterator it(m_header.m_imultiset.lower_bound(preferred_units, comp)); + + if(it != m_header.m_imultiset.end()){ + return reuse_ptr = 0, this->priv_check_and_allocate + (preferred_units, ipcdetail::to_raw_pointer(&*it), prefer_in_recvd_out_size); + } + + if(it != m_header.m_imultiset.begin()&& + (--it)->m_size >= limit_units){ + return reuse_ptr = 0, this->priv_check_and_allocate + (it->m_size, ipcdetail::to_raw_pointer(&*it), prefer_in_recvd_out_size); + } + } + + + //Now try to expand both sides with min size + if(reuse_ptr && (command & (boost::interprocess::expand_fwd | boost::interprocess::expand_bwd))){ + return priv_expand_both_sides + (command, limit_size, prefer_in_recvd_out_size = preferred_size, reuse_ptr, false, backwards_multiple); + } + return reuse_ptr = 0, static_cast(0); +} + +template +inline +typename rbtree_best_fit::block_ctrl * + rbtree_best_fit::priv_get_block(const void *ptr) +{ + return const_cast + (reinterpret_cast + (reinterpret_cast(ptr) - AllocatedCtrlBytes)); +} + +template +inline +void *rbtree_best_fit:: + priv_get_user_buffer(const typename rbtree_best_fit::block_ctrl *block) +{ return const_cast(reinterpret_cast(block) + AllocatedCtrlBytes); } + +template +inline typename rbtree_best_fit::size_type +rbtree_best_fit:: + priv_get_total_units(size_type userbytes) +{ + if(userbytes < UsableByPreviousChunk) + userbytes = UsableByPreviousChunk; + size_type units = ipcdetail::get_rounded_size(userbytes - UsableByPreviousChunk, Alignment)/Alignment + AllocatedCtrlUnits; + if(units < BlockCtrlUnits) units = BlockCtrlUnits; + return units; +} + +template +bool rbtree_best_fit:: + priv_expand (void *ptr, const size_type min_size, size_type &prefer_in_recvd_out_size) +{ + size_type const preferred_size = prefer_in_recvd_out_size; + //Obtain the real size of the block + block_ctrl *block = priv_get_block(ptr); + size_type old_block_units = block->m_size; + + //The block must be marked as allocated and the sizes must be equal + BOOST_ASSERT(priv_is_allocated_block(block)); + + //Put this to a safe value + prefer_in_recvd_out_size = (old_block_units - AllocatedCtrlUnits)*Alignment + UsableByPreviousChunk; + if(prefer_in_recvd_out_size >= preferred_size || prefer_in_recvd_out_size >= min_size) + return true; + + //Now translate it to Alignment units + const size_type min_user_units = algo_impl_t::ceil_units(min_size - UsableByPreviousChunk); + const size_type preferred_user_units = algo_impl_t::ceil_units(preferred_size - UsableByPreviousChunk); + + //Some parameter checks + BOOST_ASSERT(min_user_units <= preferred_user_units); + + block_ctrl *next_block; + + if(priv_is_allocated_block(next_block = priv_next_block(block))){ + return prefer_in_recvd_out_size >= min_size; + } + algo_impl_t::assert_alignment(next_block); + + //Is "block" + "next_block" big enough? + const size_type merged_units = old_block_units + (size_type)next_block->m_size; + + //Now get the expansion size + const size_type merged_user_units = merged_units - AllocatedCtrlUnits; + + if(merged_user_units < min_user_units){ + prefer_in_recvd_out_size = merged_units*Alignment - UsableByPreviousChunk; + return false; + } + + //Now get the maximum size the user can allocate + size_type intended_user_units = (merged_user_units < preferred_user_units) ? + merged_user_units : preferred_user_units; + + //These are total units of the merged block (supposing the next block can be split) + const size_type intended_units = AllocatedCtrlUnits + intended_user_units; + + //Check if we can split the next one in two parts + if((merged_units - intended_units) >= BlockCtrlUnits){ + //This block is bigger than needed, split it in + //two blocks, the first one will be merged and + //the second's size will be the remaining space + BOOST_ASSERT(next_block->m_size == priv_next_block(next_block)->m_prev_size); + const size_type rem_units = merged_units - intended_units; + + //Check if we we need to update the old next block in the free blocks tree + //If the new size fulfills tree invariants, we just need to replace the node + //(the block start has been displaced), otherwise erase() + insert(). + // + //This fixup must be done in two parts, because the new next block might + //overwrite the tree hook of the old next block. So we first erase the + //old if needed and we'll insert the new one after creating the new next + imultiset_iterator old_next_block_it(Imultiset::s_iterator_to(*next_block)); + const bool size_invariants_broken = + (next_block->m_size - rem_units ) < BlockCtrlUnits || + (old_next_block_it != m_header.m_imultiset.begin() && + (--imultiset_iterator(old_next_block_it))->m_size > rem_units); + if(size_invariants_broken){ + m_header.m_imultiset.erase(old_next_block_it); + } + //This is the remaining block + block_ctrl *rem_block = ::new(reinterpret_cast + (reinterpret_cast(block) + intended_units*Alignment), boost_container_new_t())block_ctrl; + rem_block->m_size = rem_units; + algo_impl_t::assert_alignment(rem_block); + BOOST_ASSERT(rem_block->m_size >= BlockCtrlUnits); + priv_mark_as_free_block(rem_block); + + //Now the second part of the fixup + if(size_invariants_broken) + m_header.m_imultiset.insert(m_header.m_imultiset.begin(), *rem_block); + else + m_header.m_imultiset.replace_node(old_next_block_it, *rem_block); + + //Write the new length + block->m_size = intended_user_units + AllocatedCtrlUnits; + BOOST_ASSERT(block->m_size >= BlockCtrlUnits); + m_header.m_allocated += (intended_units - old_block_units)*Alignment; + } + //There is no free space to create a new node: just merge both blocks + else{ + //Now we have to update the data in the tree + m_header.m_imultiset.erase(Imultiset::s_iterator_to(*next_block)); + + //Write the new length + block->m_size = merged_units; + BOOST_ASSERT(block->m_size >= BlockCtrlUnits); + m_header.m_allocated += (merged_units - old_block_units)*Alignment; + } + priv_mark_as_allocated_block(block); + prefer_in_recvd_out_size = ((size_type)block->m_size - AllocatedCtrlUnits)*Alignment + UsableByPreviousChunk; + return true; +} + +template inline +typename rbtree_best_fit::block_ctrl * + rbtree_best_fit::priv_prev_block + (typename rbtree_best_fit::block_ctrl *ptr) +{ + BOOST_ASSERT(!ptr->m_prev_allocated); + return reinterpret_cast + (reinterpret_cast(ptr) - ptr->m_prev_size*Alignment); +} + + + +template inline +typename rbtree_best_fit::block_ctrl * + rbtree_best_fit::priv_end_block + (typename rbtree_best_fit::block_ctrl *first_segment_block) +{ + //The first block's logic is different from the rest of blocks: stores in m_prev_size the absolute + //distance with the end block + BOOST_ASSERT(first_segment_block->m_prev_allocated); + block_ctrl *end_block = reinterpret_cast + (reinterpret_cast(first_segment_block) + first_segment_block->m_prev_size*Alignment); + (void)end_block; + BOOST_ASSERT(end_block->m_allocated == 1); + BOOST_ASSERT(end_block->m_size == first_segment_block->m_prev_size); + BOOST_ASSERT(end_block > first_segment_block); + return end_block; +} + +template inline +typename rbtree_best_fit::block_ctrl * + rbtree_best_fit::priv_first_block + (typename rbtree_best_fit::block_ctrl *end_segment_block) +{ + //The first block's logic is different from the rest of blocks: stores in m_prev_size the absolute + //distance with the end block + BOOST_ASSERT(end_segment_block->m_allocated); + block_ctrl *first_block = reinterpret_cast + (reinterpret_cast(end_segment_block) - end_segment_block->m_size*Alignment); + (void)first_block; + BOOST_ASSERT(first_block->m_prev_allocated == 1); + BOOST_ASSERT(first_block->m_prev_size == end_segment_block->m_size); + BOOST_ASSERT(end_segment_block > first_block); + return first_block; +} + + +template inline +typename rbtree_best_fit::block_ctrl * + rbtree_best_fit::priv_next_block + (typename rbtree_best_fit::block_ctrl *ptr) +{ + return reinterpret_cast + (reinterpret_cast(ptr) + ptr->m_size*Alignment); +} + +template inline +bool rbtree_best_fit::priv_is_allocated_block + (typename rbtree_best_fit::block_ctrl *block) +{ + bool allocated = block->m_allocated != 0; + #ifndef NDEBUG + if(block != priv_end_block()){ + block_ctrl *next_block = reinterpret_cast + (reinterpret_cast(block) + block->m_size*Alignment); + bool next_block_prev_allocated = next_block->m_prev_allocated != 0; + (void)next_block_prev_allocated; + BOOST_ASSERT(allocated == next_block_prev_allocated); + } + #endif + return allocated; +} + +template inline +bool rbtree_best_fit::priv_is_prev_allocated + (typename rbtree_best_fit::block_ctrl *block) +{ + if(block->m_prev_allocated){ + return true; + } + else{ + #ifndef NDEBUG + if(block != priv_first_block()){ + block_ctrl *prev = priv_prev_block(block); + (void)prev; + BOOST_ASSERT(!prev->m_allocated); + BOOST_ASSERT(prev->m_size == block->m_prev_size); + } + #endif + return false; + } +} + +template inline +void rbtree_best_fit::priv_mark_as_allocated_block + (typename rbtree_best_fit::block_ctrl *block) +{ + block->m_allocated = 1; + reinterpret_cast + (reinterpret_cast(block)+ block->m_size*Alignment)->m_prev_allocated = 1; +} + +template inline +void rbtree_best_fit::priv_mark_as_free_block + (typename rbtree_best_fit::block_ctrl *block) +{ + block->m_allocated = 0; + block_ctrl *next_block = priv_next_block(block); + next_block->m_prev_allocated = 0; + next_block->m_prev_size = block->m_size; +} + +template inline +void* rbtree_best_fit::priv_check_and_allocate + (size_type nunits + ,typename rbtree_best_fit::block_ctrl* block + ,size_type &received_size) +{ + size_type upper_nunits = nunits + BlockCtrlUnits; + imultiset_iterator it_old = Imultiset::s_iterator_to(*block); + algo_impl_t::assert_alignment(block); + + if (block->m_size >= upper_nunits){ + //This block is bigger than needed, split it in + //two blocks, the first's size will be "units" and + //the second's size "block->m_size-units" + size_type block_old_size = block->m_size; + block->m_size = nunits; + BOOST_ASSERT(block->m_size >= BlockCtrlUnits); + + //This is the remaining block + block_ctrl *rem_block = ::new(reinterpret_cast + (reinterpret_cast(block) + Alignment*nunits), boost_container_new_t())block_ctrl; + algo_impl_t::assert_alignment(rem_block); + rem_block->m_size = block_old_size - nunits; + BOOST_ASSERT(rem_block->m_size >= BlockCtrlUnits); + priv_mark_as_free_block(rem_block); + + imultiset_iterator it_hint; + if(it_old == m_header.m_imultiset.begin() + || (--imultiset_iterator(it_old))->m_size <= rem_block->m_size){ + //option a: slow but secure + //m_header.m_imultiset.insert(m_header.m_imultiset.erase(it_old), *rem_block); + //option b: Construct an empty node and swap + //Imultiset::init_node(*rem_block); + //block->swap_nodes(*rem_block); + //option c: replace the node directly + m_header.m_imultiset.replace_node(Imultiset::s_iterator_to(*it_old), *rem_block); + } + else{ + //Now we have to update the data in the tree + m_header.m_imultiset.erase(it_old); + m_header.m_imultiset.insert(m_header.m_imultiset.begin(), *rem_block); + } + + } + else if (block->m_size >= nunits){ + m_header.m_imultiset.erase(it_old); + } + else{ + BOOST_ASSERT(0); + return 0; + } + //We need block_ctrl for deallocation stuff, so + //return memory user can overwrite + m_header.m_allocated += (size_type)block->m_size*Alignment; + received_size = ((size_type)block->m_size - AllocatedCtrlUnits)*Alignment + UsableByPreviousChunk; + + //Mark the block as allocated + priv_mark_as_allocated_block(block); + + //Clear the memory occupied by the tree hook, since this won't be + //cleared with zero_free_memory + TreeHook *t = static_cast(block); + //Just clear the memory part reserved for the user + std::size_t tree_hook_offset_in_block = (char*)t - (char*)block; + //volatile char *ptr = + char *ptr = reinterpret_cast(block)+tree_hook_offset_in_block; + const std::size_t s = BlockCtrlBytes - tree_hook_offset_in_block; + std::memset(ptr, 0, s); + this->priv_next_block(block)->m_prev_size = 0; + return priv_get_user_buffer(block); +} + +template +void rbtree_best_fit::deallocate(void* addr) +{ + if(!addr) return; + //----------------------- + boost::interprocess::scoped_lock guard(m_header); + //----------------------- + return this->priv_deallocate(addr); +} + +template +void rbtree_best_fit::priv_deallocate(void* addr) +{ + if(!addr) return; + + block_ctrl *block = priv_get_block(addr); + + //The blocks must be marked as allocated and the sizes must be equal + BOOST_ASSERT(priv_is_allocated_block(block)); + + //Check if alignment and block size are right + algo_impl_t::assert_alignment(addr); + + size_type block_old_size = Alignment*(size_type)block->m_size; + BOOST_ASSERT(m_header.m_allocated >= block_old_size); + + //Update used memory count + m_header.m_allocated -= block_old_size; + + //The block to insert in the tree + block_ctrl *block_to_insert = block; + + //Get the next block + block_ctrl *const next_block = priv_next_block(block); + const bool merge_with_prev = !priv_is_prev_allocated(block); + const bool merge_with_next = !priv_is_allocated_block(next_block); + + //Merge logic. First just update block sizes, then fix free blocks tree + if(merge_with_prev || merge_with_next){ + //Merge if the previous is free + if(merge_with_prev){ + //Get the previous block + block_to_insert = priv_prev_block(block); + block_to_insert->m_size += block->m_size; + BOOST_ASSERT(block_to_insert->m_size >= BlockCtrlUnits); + } + //Merge if the next is free + if(merge_with_next){ + block_to_insert->m_size += next_block->m_size; + BOOST_ASSERT(block_to_insert->m_size >= BlockCtrlUnits); + const imultiset_iterator next_it = Imultiset::s_iterator_to(*next_block); + if(merge_with_prev){ + m_header.m_imultiset.erase(next_it); + } + else{ + m_header.m_imultiset.replace_node(next_it, *block_to_insert); + } + } + + //Now try to shortcut erasure + insertion (O(log(N))) with + //a O(1) operation if merging does not alter tree positions + const imultiset_iterator block_to_check_it = Imultiset::s_iterator_to(*block_to_insert); + imultiset_const_iterator next_to_check_it(block_to_check_it), end_it(m_header.m_imultiset.end()); + + if(++next_to_check_it != end_it && block_to_insert->m_size > next_to_check_it->m_size){ + //Block is bigger than next, so move it + m_header.m_imultiset.erase(block_to_check_it); + m_header.m_imultiset.insert(end_it, *block_to_insert); + } + else{ + //Block size increment didn't violate tree invariants so there is nothing to fix + } + } + else{ + m_header.m_imultiset.insert(m_header.m_imultiset.begin(), *block_to_insert); + } + priv_mark_as_free_block(block_to_insert); +} + +#endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //#ifndef BOOST_INTERPROCESS_MEM_ALGO_RBTREE_BEST_FIT_HPP diff --git a/boost/interprocess/offset_ptr.hpp b/boost/interprocess/offset_ptr.hpp new file mode 100644 index 000000000..fca444eaa --- /dev/null +++ b/boost/interprocess/offset_ptr.hpp @@ -0,0 +1,751 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (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) +// +// See http://www.boost.org/libs/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_OFFSET_PTR_HPP +#define BOOST_INTERPROCESS_OFFSET_PTR_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +#include + +#include +#include +#include +#include +#include //alignment_of, aligned_storage +#include +#include + +//!\file +//!Describes a smart pointer that stores the offset between this pointer and +//!target pointee, called offset_ptr. + +namespace boost { + +#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + +//Predeclarations +template +struct has_trivial_destructor; + +#endif //#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + +namespace interprocess { + +#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) +namespace ipcdetail { + + template + 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)//for offset_type_alignment m_offset will be enough + , (OffsetAlignment == offset_type_alignment) ? 1u : OffsetAlignment + >::type alignment_helper; + }; + + //Note: using the address of a local variable to point to another address + //is not standard conforming and this can be optimized-away by the compiler. + //Non-inlining is a method to remain illegal but correct + + //Undef BOOST_INTERPROCESS_OFFSET_PTR_INLINE_XXX if your compiler can inline + //this code without breaking the library + + //////////////////////////////////////////////////////////////////////// + // + // offset_ptr_to_raw_pointer + // + //////////////////////////////////////////////////////////////////////// + #define BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_PTR + BOOST_INTERPROCESS_FORCEINLINE void * offset_ptr_to_raw_pointer(const volatile void *this_ptr, uintptr_t offset) + { + typedef pointer_uintptr_caster caster_t; + #ifndef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_PTR + if(offset == 1){ + return 0; + } + else{ + return caster_t(caster_t(this_ptr).uintptr() + offset).pointer(); + } + #else + 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 + } + + //////////////////////////////////////////////////////////////////////// + // + // offset_ptr_to_offset + // + //////////////////////////////////////////////////////////////////////// + #define BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF + BOOST_INTERPROCESS_FORCEINLINE uintptr_t offset_ptr_to_offset(const volatile void *ptr, const volatile void *this_ptr) + { + typedef pointer_uintptr_caster 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{ + uintptr_t offset = caster_t(ptr).uintptr() - caster_t(this_ptr).uintptr(); + BOOST_ASSERT(offset != 1); + return offset; + } + #else + //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); + // + 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 + } + + //////////////////////////////////////////////////////////////////////// + // + // offset_ptr_to_offset_from_other + // + //////////////////////////////////////////////////////////////////////// + #define BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF_FROM_OTHER + BOOST_INTERPROCESS_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_uintptr_caster caster_t; + #ifndef BOOST_INTERPROCESS_OFFSET_PTR_BRANCHLESS_TO_OFF_FROM_OTHER + if(other_offset == 1){ + return 1; + } + else{ + uintptr_t offset = caster_t(other_ptr).uintptr() - caster_t(this_ptr).uintptr() + other_offset; + BOOST_ASSERT(offset != 1); + return offset; + } + #else + 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 + } + + //////////////////////////////////////////////////////////////////////// + // + // Let's assume cast to void and cv cast don't change any target address + // + //////////////////////////////////////////////////////////////////////// + template + struct offset_ptr_maintains_address + { + static const bool value = ipcdetail::is_cv_same::value + || ipcdetail::is_cv_same::value + || ipcdetail::is_cv_same::value + ; + }; + + template + struct enable_if_convertible_equal_address + : enable_if_c< ::boost::is_convertible::value + && offset_ptr_maintains_address::value + , Ret> + {}; + + template + struct enable_if_convertible_unequal_address + : enable_if_c< ::boost::is_convertible::value + && !offset_ptr_maintains_address::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 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. +//! +//! \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. 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. +//! +//!Note: 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 offset_ptr +{ + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + typedef offset_ptr self_t; + void unspecified_bool_type_func() const {} + typedef void (self_t::*unspecified_bool_type)() const; + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + public: + typedef PointedType element_type; + typedef PointedType * pointer; + typedef typename ipcdetail:: + add_reference::type reference; + typedef typename ipcdetail:: + remove_volatile::type + >::type value_type; + typedef DifferenceType difference_type; + typedef std::random_access_iterator_tag iterator_category; + typedef OffsetType offset_type; + + public: //Public Functions + + //!Default constructor (null pointer). + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE offset_ptr() BOOST_NOEXCEPT + : internal(1) + {} + + //!Constructor from raw pointer (allows "0" pointer conversion). + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE offset_ptr(pointer ptr) BOOST_NOEXCEPT + : internal(static_cast(ipcdetail::offset_ptr_to_offset(ptr, this))) + {} + + //!Constructor from other pointer. + //!Never throws. + template + BOOST_INTERPROCESS_FORCEINLINE offset_ptr( T *ptr + , typename ipcdetail::enable_if< ::boost::is_convertible >::type * = 0) BOOST_NOEXCEPT + : internal(static_cast + (ipcdetail::offset_ptr_to_offset(static_cast(ptr), this))) + {} + + //!Constructor from other offset_ptr + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE offset_ptr(const offset_ptr& ptr) BOOST_NOEXCEPT + : internal(static_cast + (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 + BOOST_INTERPROCESS_FORCEINLINE offset_ptr( const offset_ptr &ptr + #ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + , typename ipcdetail::enable_if_convertible_equal_address::type* = 0 + #endif + ) BOOST_NOEXCEPT + : internal(static_cast + (ipcdetail::offset_ptr_to_offset_from_other(this, &ptr, ptr.get_offset()))) + {} + + #ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + //!Constructor from other offset_ptr. If pointers of pointee types are + //!convertible, offset_ptrs will be convertibles. Never throws. + template + BOOST_INTERPROCESS_FORCEINLINE offset_ptr( const offset_ptr &ptr + , typename ipcdetail::enable_if_convertible_unequal_address::type* = 0) BOOST_NOEXCEPT + : internal(static_cast + (ipcdetail::offset_ptr_to_offset(static_cast(ptr.get()), this))) + {} + + #endif + + //!Emulates static_cast operator. + //!Never throws. + template + BOOST_INTERPROCESS_FORCEINLINE offset_ptr(const offset_ptr & r, ipcdetail::static_cast_tag) BOOST_NOEXCEPT + : internal(static_cast + (ipcdetail::offset_ptr_to_offset(static_cast(r.get()), this))) + {} + + //!Emulates const_cast operator. + //!Never throws. + template + BOOST_INTERPROCESS_FORCEINLINE offset_ptr(const offset_ptr & r, ipcdetail::const_cast_tag) BOOST_NOEXCEPT + : internal(static_cast + (ipcdetail::offset_ptr_to_offset(const_cast(r.get()), this))) + {} + + //!Emulates dynamic_cast operator. + //!Never throws. + template + BOOST_INTERPROCESS_FORCEINLINE offset_ptr(const offset_ptr & r, ipcdetail::dynamic_cast_tag) BOOST_NOEXCEPT + : internal(static_cast + (ipcdetail::offset_ptr_to_offset(dynamic_cast(r.get()), this))) + {} + + //!Emulates reinterpret_cast operator. + //!Never throws. + template + BOOST_INTERPROCESS_FORCEINLINE offset_ptr(const offset_ptr & r, ipcdetail::reinterpret_cast_tag) BOOST_NOEXCEPT + : internal(static_cast + (ipcdetail::offset_ptr_to_offset(reinterpret_cast(r.get()), this))) + {} + + //!Obtains raw pointer from offset. + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE pointer get() const BOOST_NOEXCEPT + { return (pointer)ipcdetail::offset_ptr_to_raw_pointer(this, this->internal.m_offset); } + + BOOST_INTERPROCESS_FORCEINLINE offset_type get_offset() const BOOST_NOEXCEPT + { return this->internal.m_offset; } + + //!Pointer-like -> operator. It can return 0 pointer. + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE pointer operator->() const BOOST_NOEXCEPT + { return this->get(); } + + //!Dereferencing operator, if it is a null offset_ptr behavior + //! is undefined. Never throws. + BOOST_INTERPROCESS_FORCEINLINE reference operator* () const BOOST_NOEXCEPT + { + pointer p = this->get(); + reference r = *p; + return r; + } + + //!Indexing operator. + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE reference operator[](difference_type idx) const BOOST_NOEXCEPT + { return this->get()[idx]; } + + //!Assignment from pointer (saves extra conversion). + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE offset_ptr& operator= (pointer from) BOOST_NOEXCEPT + { + this->internal.m_offset = + static_cast(ipcdetail::offset_ptr_to_offset(from, this)); + return *this; + } + + //!Assignment from other offset_ptr. + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE offset_ptr& operator= (const offset_ptr & ptr) BOOST_NOEXCEPT + { + this->internal.m_offset = + static_cast(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 BOOST_INTERPROCESS_FORCEINLINE + #ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + typename ipcdetail::enable_if_c + < ::boost::is_convertible::value, offset_ptr&>::type + #else + offset_ptr& + #endif + operator= (const offset_ptr &ptr) BOOST_NOEXCEPT + { + this->assign(ptr, ipcdetail::bool_::value>()); + return *this; + } + + public: + + //!offset_ptr += difference_type. + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE offset_ptr &operator+= (difference_type offset) BOOST_NOEXCEPT + { this->inc_offset(offset * sizeof (PointedType)); return *this; } + + //!offset_ptr -= difference_type. + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE offset_ptr &operator-= (difference_type offset) BOOST_NOEXCEPT + { this->dec_offset(offset * sizeof (PointedType)); return *this; } + + //!++offset_ptr. + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE offset_ptr& operator++ (void) BOOST_NOEXCEPT + { this->inc_offset(sizeof (PointedType)); return *this; } + + //!offset_ptr++. + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE offset_ptr operator++ (int) BOOST_NOEXCEPT + { + offset_ptr tmp(*this); + this->inc_offset(sizeof (PointedType)); + return tmp; + } + + //!--offset_ptr. + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE offset_ptr& operator-- (void) BOOST_NOEXCEPT + { this->dec_offset(sizeof (PointedType)); return *this; } + + //!offset_ptr--. + //!Never throws. + BOOST_INTERPROCESS_FORCEINLINE offset_ptr operator-- (int) BOOST_NOEXCEPT + { + offset_ptr tmp(*this); + this->dec_offset(sizeof (PointedType)); + return tmp; + } + + //!safe bool conversion operator. + //!Never throws. + #if defined(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS) + BOOST_INTERPROCESS_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 + BOOST_INTERPROCESS_FORCEINLINE bool operator! () const BOOST_NOEXCEPT + { return this->internal.m_offset == 1; } + + //!Compatibility with pointer_traits + //! + template + struct rebind + { typedef offset_ptr other; }; + + //!Compatibility with pointer_traits + //! + BOOST_INTERPROCESS_FORCEINLINE static offset_ptr pointer_to(reference r) BOOST_NOEXCEPT + { return offset_ptr(&r); } + + //!difference_type + offset_ptr + //!operation + BOOST_INTERPROCESS_FORCEINLINE friend offset_ptr operator+(difference_type diff, offset_ptr right) BOOST_NOEXCEPT + { right += diff; return right; } + + //!offset_ptr + difference_type + //!operation + BOOST_INTERPROCESS_FORCEINLINE friend offset_ptr operator+(offset_ptr left, difference_type diff) BOOST_NOEXCEPT + { left += diff; return left; } + + //!offset_ptr - diff + //!operation + BOOST_INTERPROCESS_FORCEINLINE friend offset_ptr operator-(offset_ptr left, difference_type diff) BOOST_NOEXCEPT + { left -= diff; return left; } + + //!offset_ptr - diff + //!operation + BOOST_INTERPROCESS_FORCEINLINE friend offset_ptr operator-(difference_type diff, offset_ptr right) BOOST_NOEXCEPT + { right -= diff; return right; } + + //!offset_ptr - offset_ptr + //!operation + BOOST_INTERPROCESS_FORCEINLINE friend difference_type operator-(const offset_ptr &pt, const offset_ptr &pt2) BOOST_NOEXCEPT + { return difference_type(pt.get()- pt2.get()); } + + //Comparison + BOOST_INTERPROCESS_FORCEINLINE friend bool operator== (const offset_ptr &pt1, const offset_ptr &pt2) BOOST_NOEXCEPT + { return pt1.get() == pt2.get(); } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator!= (const offset_ptr &pt1, const offset_ptr &pt2) BOOST_NOEXCEPT + { return pt1.get() != pt2.get(); } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator<(const offset_ptr &pt1, const offset_ptr &pt2) BOOST_NOEXCEPT + { return pt1.get() < pt2.get(); } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator<=(const offset_ptr &pt1, const offset_ptr &pt2) BOOST_NOEXCEPT + { return pt1.get() <= pt2.get(); } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator>(const offset_ptr &pt1, const offset_ptr &pt2) BOOST_NOEXCEPT + { return pt1.get() > pt2.get(); } + + BOOST_INTERPROCESS_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 + BOOST_INTERPROCESS_FORCEINLINE friend bool operator== (pointer pt1, const offset_ptr &pt2) BOOST_NOEXCEPT + { return pt1 == pt2.get(); } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator!= (pointer pt1, const offset_ptr &pt2) BOOST_NOEXCEPT + { return pt1 != pt2.get(); } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator<(pointer pt1, const offset_ptr &pt2) BOOST_NOEXCEPT + { return pt1 < pt2.get(); } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator<=(pointer pt1, const offset_ptr &pt2) BOOST_NOEXCEPT + { return pt1 <= pt2.get(); } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator>(pointer pt1, const offset_ptr &pt2) BOOST_NOEXCEPT + { return pt1 > pt2.get(); } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator>=(pointer pt1, const offset_ptr &pt2) BOOST_NOEXCEPT + { return pt1 >= pt2.get(); } + + //Comparison + BOOST_INTERPROCESS_FORCEINLINE friend bool operator== (const offset_ptr &pt1, pointer pt2) BOOST_NOEXCEPT + { return pt1.get() == pt2; } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator!= (const offset_ptr &pt1, pointer pt2) BOOST_NOEXCEPT + { return pt1.get() != pt2; } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator<(const offset_ptr &pt1, pointer pt2) BOOST_NOEXCEPT + { return pt1.get() < pt2; } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator<=(const offset_ptr &pt1, pointer pt2) BOOST_NOEXCEPT + { return pt1.get() <= pt2; } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator>(const offset_ptr &pt1, pointer pt2) BOOST_NOEXCEPT + { return pt1.get() > pt2; } + + BOOST_INTERPROCESS_FORCEINLINE friend bool operator>=(const offset_ptr &pt1, pointer pt2) BOOST_NOEXCEPT + { return pt1.get() >= pt2; } + + BOOST_INTERPROCESS_FORCEINLINE friend void swap(offset_ptr &left, offset_ptr &right) BOOST_NOEXCEPT + { + pointer ptr = right.get(); + right = left; + left = ptr; + } + + private: + template + BOOST_INTERPROCESS_FORCEINLINE void assign(const offset_ptr &ptr, ipcdetail::bool_) BOOST_NOEXCEPT + { //no need to pointer adjustment + this->internal.m_offset = + static_cast(ipcdetail::offset_ptr_to_offset_from_other(this, &ptr, ptr.get_offset())); + } + + template + BOOST_INTERPROCESS_FORCEINLINE void assign(const offset_ptr &ptr, ipcdetail::bool_) BOOST_NOEXCEPT + { //we must convert to raw before calculating the offset + this->internal.m_offset = + static_cast(ipcdetail::offset_ptr_to_offset(static_cast(ptr.get()), this)); + } + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + BOOST_INTERPROCESS_FORCEINLINE void inc_offset(DifferenceType bytes) BOOST_NOEXCEPT + { internal.m_offset += bytes; } + + BOOST_INTERPROCESS_FORCEINLINE void dec_offset(DifferenceType bytes) BOOST_NOEXCEPT + { internal.m_offset -= bytes; } + + ipcdetail::offset_ptr_internal internal; + + public: + BOOST_INTERPROCESS_FORCEINLINE const OffsetType &priv_offset() const BOOST_NOEXCEPT + { return internal.m_offset; } + + BOOST_INTERPROCESS_FORCEINLINE OffsetType &priv_offset() BOOST_NOEXCEPT + { return internal.m_offset; } + + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED +}; + +//!operator<< +//!for offset ptr +template +inline std::basic_ostream & operator<< + (std::basic_ostream & os, offset_ptr const & p) +{ return os << p.get_offset(); } + +//!operator>> +//!for offset ptr +template +inline std::basic_istream & operator>> + (std::basic_istream & is, offset_ptr & p) +{ return is >> p.get_offset(); } + +//!Simulation of static_cast between pointers. Never throws. +template +BOOST_INTERPROCESS_FORCEINLINE boost::interprocess::offset_ptr + static_pointer_cast(const boost::interprocess::offset_ptr & r) BOOST_NOEXCEPT +{ + return boost::interprocess::offset_ptr + (r, boost::interprocess::ipcdetail::static_cast_tag()); +} + +//!Simulation of const_cast between pointers. Never throws. +template +BOOST_INTERPROCESS_FORCEINLINE boost::interprocess::offset_ptr + const_pointer_cast(const boost::interprocess::offset_ptr & r) BOOST_NOEXCEPT +{ + return boost::interprocess::offset_ptr + (r, boost::interprocess::ipcdetail::const_cast_tag()); +} + +//!Simulation of dynamic_cast between pointers. Never throws. +template +BOOST_INTERPROCESS_FORCEINLINE boost::interprocess::offset_ptr + dynamic_pointer_cast(const boost::interprocess::offset_ptr & r) BOOST_NOEXCEPT +{ + return boost::interprocess::offset_ptr + (r, boost::interprocess::ipcdetail::dynamic_cast_tag()); +} + +//!Simulation of reinterpret_cast between pointers. Never throws. +template +BOOST_INTERPROCESS_FORCEINLINE boost::interprocess::offset_ptr + reinterpret_pointer_cast(const boost::interprocess::offset_ptr & r) BOOST_NOEXCEPT +{ + return boost::interprocess::offset_ptr + (r, boost::interprocess::ipcdetail::reinterpret_cast_tag()); +} + +} //namespace interprocess { + +#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + +///has_trivial_destructor<> == true_type specialization for optimizations +template +struct has_trivial_destructor< ::boost::interprocess::offset_ptr > +{ + static const bool value = true; +}; + +namespace move_detail { + +///has_trivial_destructor<> == true_type specialization for optimizations +template +struct is_trivially_destructible< ::boost::interprocess::offset_ptr > +{ + static const bool value = true; +}; + +} //namespace move_detail { + +namespace interprocess { + +//!to_raw_pointer() enables boost::mem_fn to recognize offset_ptr. +//!Never throws. +template +BOOST_INTERPROCESS_FORCEINLINE T * to_raw_pointer(boost::interprocess::offset_ptr const & p) BOOST_NOEXCEPT +{ return ipcdetail::to_raw_pointer(p); } + +} //namespace interprocess + + +#endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED +} //namespace boost { + +#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + +namespace boost{ + +//This is to support embedding a bit in the pointer +//for intrusive containers, saving space +namespace intrusive { + +//Predeclaration to avoid including header +template +struct max_pointer_plus_bits; + +template +struct max_pointer_plus_bits, OffsetAlignment> +{ + //The offset ptr can embed one bit less than the alignment since it + //uses offset == 1 to store the null pointer. + static const std::size_t value = ::boost::interprocess::ipcdetail::ls_zeros::value - 1; +}; + +//Predeclaration +template +struct pointer_plus_bits; + +template +struct pointer_plus_bits, NumBits> +{ + typedef boost::interprocess::offset_ptr pointer; + //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 uintptr_t Mask = ((uintptr_t(1) << uintptr_t(NumBits)) - uintptr_t(1)) << uintptr_t(1); + BOOST_STATIC_ASSERT(0 ==(Mask&1)); + + //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_INTERPROCESS_FORCEINLINE static pointer get_pointer(const pointer &n) BOOST_NOEXCEPT + { + 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; + } + + BOOST_INTERPROCESS_FORCEINLINE static void set_pointer(pointer &n, const pointer &p) BOOST_NOEXCEPT + { + BOOST_ASSERT(0 == (get_bits)(p)); + O const stored_bits = O(n.priv_offset() & Mask); + n = p; + n.priv_offset() |= stored_bits; + } + + BOOST_INTERPROCESS_FORCEINLINE static std::size_t get_bits(const pointer &n) BOOST_NOEXCEPT + { + return std::size_t((n.priv_offset() & Mask) >> 1u); + } + + BOOST_INTERPROCESS_FORCEINLINE static void set_bits(pointer &n, std::size_t const b) BOOST_NOEXCEPT + { + BOOST_ASSERT(b < (std::size_t(1) << NumBits)); + O tmp = n.priv_offset(); + tmp &= O(~Mask); + tmp |= O(b << 1u); + n.priv_offset() = tmp; + } +}; + +} //namespace intrusive + +//Predeclaration +template +struct pointer_to_other; + +//Backwards compatibility with pointer_to_other +template +struct pointer_to_other + < ::boost::interprocess::offset_ptr, U > +{ + typedef ::boost::interprocess::offset_ptr type; +}; + +} //namespace boost{ +#endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + +#include + +#endif //#ifndef BOOST_INTERPROCESS_OFFSET_PTR_HPP diff --git a/boost/interprocess/segment_manager.hpp b/boost/interprocess/segment_manager.hpp new file mode 100644 index 000000000..d00f17716 --- /dev/null +++ b/boost/interprocess/segment_manager.hpp @@ -0,0 +1,1343 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_SEGMENT_MANAGER_HPP +#define BOOST_INTERPROCESS_SEGMENT_MANAGER_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +// container/detail +#include +#include +// std +#include //std::size_t +#include +#include +#ifndef BOOST_NO_EXCEPTIONS +#include +#endif + +//!\file +//!Describes the object placed in a memory segment that provides +//!named object allocation capabilities for single-segment and +//!multi-segment allocations. + +namespace boost{ +namespace interprocess{ + +//!This object is the public base class of segment manager. +//!This class only depends on the memory allocation algorithm +//!and implements all the allocation features not related +//!to named or unique objects. +//! +//!Storing a reference to segment_manager forces +//!the holder class to be dependent on index types and character types. +//!When such dependence is not desirable and only anonymous and raw +//!allocations are needed, segment_manager_base is the correct answer. +template +class segment_manager_base + : private MemoryAlgorithm +{ + public: + typedef segment_manager_base segment_manager_base_type; + typedef typename MemoryAlgorithm::void_pointer void_pointer; + typedef typename MemoryAlgorithm::mutex_family mutex_family; + typedef MemoryAlgorithm memory_algorithm; + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + + //Experimental. Don't use + typedef typename MemoryAlgorithm::multiallocation_chain multiallocation_chain; + typedef typename MemoryAlgorithm::difference_type difference_type; + typedef typename MemoryAlgorithm::size_type size_type; + + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + //!This constant indicates the payload size + //!associated with each allocation of the memory algorithm + static const size_type PayloadPerAllocation = MemoryAlgorithm::PayloadPerAllocation; + + //!Constructor of the segment_manager_base + //! + //!"size" is the size of the memory segment where + //!the basic segment manager is being constructed. + //! + //!"reserved_bytes" is the number of bytes + //!after the end of the memory algorithm object itself + //!that the memory algorithm will exclude from + //!dynamic allocation + //! + //!Can throw + segment_manager_base(size_type sz, size_type reserved_bytes) + : MemoryAlgorithm(sz, reserved_bytes) + { + BOOST_ASSERT((sizeof(segment_manager_base) == sizeof(MemoryAlgorithm))); + } + + //!Returns the size of the memory + //!segment + size_type get_size() const + { return MemoryAlgorithm::get_size(); } + + //!Returns the number of free bytes of the memory + //!segment + size_type get_free_memory() const + { return MemoryAlgorithm::get_free_memory(); } + + //!Obtains the minimum size needed by + //!the segment manager + static size_type get_min_size (size_type size) + { return MemoryAlgorithm::get_min_size(size); } + + //!Allocates nbytes bytes. This function is only used in + //!single-segment management. Never throws + void * allocate (size_type nbytes, const std::nothrow_t &) + { return MemoryAlgorithm::allocate(nbytes); } + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + + //Experimental. Dont' use. + //!Allocates n_elements of elem_bytes bytes. + //!Throws bad_alloc on failure. chain.size() is not increased on failure. + void allocate_many(size_type elem_bytes, size_type n_elements, multiallocation_chain &chain) + { + size_type prev_size = chain.size(); + MemoryAlgorithm::allocate_many(elem_bytes, n_elements, chain); + if(!elem_bytes || chain.size() == prev_size){ + throw bad_alloc(); + } + } + + //!Allocates n_elements, each one of element_lengths[i]*sizeof_element bytes. + //!Throws bad_alloc on failure. chain.size() is not increased on failure. + void allocate_many(const size_type *element_lengths, size_type n_elements, size_type sizeof_element, multiallocation_chain &chain) + { + size_type prev_size = chain.size(); + MemoryAlgorithm::allocate_many(element_lengths, n_elements, sizeof_element, chain); + if(!sizeof_element || chain.size() == prev_size){ + throw bad_alloc(); + } + } + + //!Allocates n_elements of elem_bytes bytes. + //!Non-throwing version. chain.size() is not increased on failure. + void allocate_many(const std::nothrow_t &, size_type elem_bytes, size_type n_elements, multiallocation_chain &chain) + { MemoryAlgorithm::allocate_many(elem_bytes, n_elements, chain); } + + //!Allocates n_elements, each one of + //!element_lengths[i]*sizeof_element bytes. + //!Non-throwing version. chain.size() is not increased on failure. + void allocate_many(const std::nothrow_t &, const size_type *elem_sizes, size_type n_elements, size_type sizeof_element, multiallocation_chain &chain) + { MemoryAlgorithm::allocate_many(elem_sizes, n_elements, sizeof_element, chain); } + + //!Deallocates all elements contained in chain. + //!Never throws. + void deallocate_many(multiallocation_chain &chain) + { MemoryAlgorithm::deallocate_many(chain); } + + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + //!Allocates nbytes bytes. Throws boost::interprocess::bad_alloc + //!on failure + void * allocate(size_type nbytes) + { + void * ret = MemoryAlgorithm::allocate(nbytes); + if(!ret) + throw bad_alloc(); + return ret; + } + + //!Allocates nbytes bytes. This function is only used in + //!single-segment management. Never throws + void * allocate_aligned (size_type nbytes, size_type alignment, const std::nothrow_t &) + { return MemoryAlgorithm::allocate_aligned(nbytes, alignment); } + + //!Allocates nbytes bytes. This function is only used in + //!single-segment management. Throws bad_alloc when fails + void * allocate_aligned(size_type nbytes, size_type alignment) + { + void * ret = MemoryAlgorithm::allocate_aligned(nbytes, alignment); + if(!ret) + throw bad_alloc(); + return ret; + } + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + + template + T *allocation_command (boost::interprocess::allocation_type command, size_type limit_size, + size_type &prefer_in_recvd_out_size, T *&reuse) + { + T *ret = MemoryAlgorithm::allocation_command + (command | boost::interprocess::nothrow_allocation, limit_size, prefer_in_recvd_out_size, reuse); + if(!(command & boost::interprocess::nothrow_allocation) && !ret) + throw bad_alloc(); + return ret; + } + + void *raw_allocation_command (boost::interprocess::allocation_type command, size_type limit_objects, + size_type &prefer_in_recvd_out_size, void *&reuse, size_type sizeof_object = 1) + { + void *ret = MemoryAlgorithm::raw_allocation_command + ( command | boost::interprocess::nothrow_allocation, limit_objects, + prefer_in_recvd_out_size, reuse, sizeof_object); + if(!(command & boost::interprocess::nothrow_allocation) && !ret) + throw bad_alloc(); + return ret; + } + + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + //!Deallocates the bytes allocated with allocate/allocate_many() + //!pointed by addr + void deallocate (void *addr) + { MemoryAlgorithm::deallocate(addr); } + + //!Increases managed memory in extra_size bytes more. This only works + //!with single-segment management. + void grow(size_type extra_size) + { MemoryAlgorithm::grow(extra_size); } + + //!Decreases managed memory to the minimum. This only works + //!with single-segment management. + void shrink_to_fit() + { MemoryAlgorithm::shrink_to_fit(); } + + //!Returns the result of "all_memory_deallocated()" function + //!of the used memory algorithm + bool all_memory_deallocated() + { return MemoryAlgorithm::all_memory_deallocated(); } + + //!Returns the result of "check_sanity()" function + //!of the used memory algorithm + bool check_sanity() + { return MemoryAlgorithm::check_sanity(); } + + //!Writes to zero free memory (memory not yet allocated) + //!of the memory algorithm + void zero_free_memory() + { MemoryAlgorithm::zero_free_memory(); } + + //!Returns the size of the buffer previously allocated pointed by ptr + size_type size(const void *ptr) const + { return MemoryAlgorithm::size(ptr); } + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + protected: + void * prot_anonymous_construct + (size_type num, bool dothrow, ipcdetail::in_place_interface &table) + { + typedef ipcdetail::block_header block_header_t; + block_header_t block_info ( size_type(table.size*num) + , size_type(table.alignment) + , anonymous_type + , 1 + , 0); + + //Allocate memory + void *ptr_struct = this->allocate(block_info.total_size(), nothrow<>::get()); + + //Check if there is enough memory + if(!ptr_struct){ + if(dothrow){ + throw bad_alloc(); + } + else{ + return 0; + } + } + + //Build scoped ptr to avoid leaks with constructor exception + ipcdetail::mem_algo_deallocator mem(ptr_struct, *this); + + //Now construct the header + block_header_t * hdr = ::new(ptr_struct, boost_container_new_t()) block_header_t(block_info); + void *ptr = 0; //avoid gcc warning + ptr = hdr->value(); + + //Now call constructors + ipcdetail::array_construct(ptr, num, table); + + //All constructors successful, we don't want erase memory + mem.release(); + return ptr; + } + + //!Calls the destructor and makes an anonymous deallocate + void prot_anonymous_destroy(const void *object, ipcdetail::in_place_interface &table) + { + + //Get control data from associated with this object + typedef ipcdetail::block_header block_header_t; + block_header_t *ctrl_data = block_header_t::block_header_from_value(object, table.size, table.alignment); + + //------------------------------- + //scoped_lock guard(m_header); + //------------------------------- + + if(ctrl_data->alloc_type() != anonymous_type){ + //This is not an anonymous object, the pointer is wrong! + BOOST_ASSERT(0); + } + + //Call destructors and free memory + //Build scoped ptr to avoid leaks with destructor exception + std::size_t destroyed = 0; + table.destroy_n(const_cast(object), ctrl_data->m_value_bytes/table.size, destroyed); + this->deallocate(ctrl_data); + } + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED +}; + +//!This object is placed in the beginning of memory segment and +//!implements the allocation (named or anonymous) of portions +//!of the segment. This object contains two indexes that +//!maintain an association between a name and a portion of the segment. +//! +//!The first index contains the mappings for normal named objects using the +//!char type specified in the template parameter. +//! +//!The second index contains the association for unique instances. The key will +//!be the const char * returned from type_info.name() function for the unique +//!type to be constructed. +//! +//!segment_manager inherits publicly +//!from segment_manager_base and inherits from it +//!many public functions related to anonymous object and raw memory allocation. +//!See segment_manager_base reference to know about those functions. +template class IndexType> +class segment_manager + : public segment_manager_base +{ + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + //Non-copyable + segment_manager(); + segment_manager(const segment_manager &); + segment_manager &operator=(const segment_manager &); + typedef segment_manager_base segment_manager_base_t; + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + public: + typedef MemoryAlgorithm memory_algorithm; + typedef typename segment_manager_base_t::void_pointer void_pointer; + typedef typename segment_manager_base_t::size_type size_type; + typedef typename segment_manager_base_t::difference_type difference_type; + typedef CharType char_type; + + typedef segment_manager_base segment_manager_base_type; + + static const size_type PayloadPerAllocation = segment_manager_base_t::PayloadPerAllocation; + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + private: + typedef ipcdetail::block_header block_header_t; + typedef ipcdetail::index_config index_config_named; + typedef ipcdetail::index_config index_config_unique; + typedef IndexType index_type; + typedef ipcdetail::bool_::value > is_intrusive_t; + typedef ipcdetail::bool_::value> is_node_index_t; + + public: + typedef IndexType named_index_t; + typedef IndexType unique_index_t; + typedef ipcdetail::char_ptr_holder char_ptr_holder_t; + typedef ipcdetail::segment_manager_iterator_transform + ::value> named_transform; + + typedef ipcdetail::segment_manager_iterator_transform + ::value> unique_transform; + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + typedef typename segment_manager_base_t::mutex_family mutex_family; + + typedef transform_iterator + const_named_iterator; + typedef transform_iterator + const_unique_iterator; + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + + //!Constructor proxy object definition helper class + template + struct construct_proxy + { + typedef ipcdetail::named_proxy type; + }; + + //!Constructor proxy object definition helper class + template + struct construct_iter_proxy + { + typedef ipcdetail::named_proxy type; + }; + + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + + //!Constructor of the segment manager + //!"size" is the size of the memory segment where + //!the segment manager is being constructed. + //!Can throw + explicit segment_manager(size_type segment_size) + : segment_manager_base_t(segment_size, priv_get_reserved_bytes()) + , m_header(static_cast(get_this_pointer())) + { + (void) anonymous_instance; (void) unique_instance; + //Check EBO is applied, it's required + const void * const this_addr = this; + const void *const segm_addr = static_cast(this); + (void)this_addr; (void)segm_addr; + BOOST_ASSERT( this_addr == segm_addr); + } + + //!Tries to find a previous named/unique allocation. Returns the address + //!and the object count. On failure the first member of the + //!returned pair is 0. + template + std::pair find (char_ptr_holder_t name) + { return this->priv_find_impl(name, true); } + + //!Tries to find a previous named/unique allocation. Returns the address + //!and the object count. On failure the first member of the + //!returned pair is 0. This search is not mutex-protected! + //!Use it only inside atomic_func() calls, where the internal mutex + //!is guaranteed to be locked. + template + std::pair find_no_lock (char_ptr_holder_t name) + { return this->priv_find_impl(name, false); } + + //!Returns throwing "construct" proxy + //!object + template + typename construct_proxy::type + construct(char_ptr_holder_t name) + { return typename construct_proxy::type (this, name, false, true); } + + //!Returns throwing "search or construct" proxy + //!object + template + typename construct_proxy::type find_or_construct(char_ptr_holder_t name) + { return typename construct_proxy::type (this, name, true, true); } + + //!Returns no throwing "construct" proxy + //!object + template + typename construct_proxy::type + construct(char_ptr_holder_t name, const std::nothrow_t &) + { return typename construct_proxy::type (this, name, false, false); } + + //!Returns no throwing "search or construct" + //!proxy object + template + typename construct_proxy::type + find_or_construct(char_ptr_holder_t name, const std::nothrow_t &) + { return typename construct_proxy::type (this, name, true, false); } + + //!Returns throwing "construct from iterators" proxy object + template + typename construct_iter_proxy::type + construct_it(char_ptr_holder_t name) + { return typename construct_iter_proxy::type (this, name, false, true); } + + //!Returns throwing "search or construct from iterators" + //!proxy object + template + typename construct_iter_proxy::type + find_or_construct_it(char_ptr_holder_t name) + { return typename construct_iter_proxy::type (this, name, true, true); } + + //!Returns no throwing "construct from iterators" + //!proxy object + template + typename construct_iter_proxy::type + construct_it(char_ptr_holder_t name, const std::nothrow_t &) + { return typename construct_iter_proxy::type (this, name, false, false); } + + //!Returns no throwing "search or construct from iterators" + //!proxy object + template + typename construct_iter_proxy::type + find_or_construct_it(char_ptr_holder_t name, const std::nothrow_t &) + { return typename construct_iter_proxy::type (this, name, true, false); } + + //!Calls object function blocking recursive interprocess_mutex and guarantees that + //!no new named_alloc or destroy will be executed by any process while + //!executing the object function call + template + void atomic_func(Func &f) + { scoped_lock guard(m_header); f(); } + + //!Tries to calls a functor guaranteeing that no new construction, search or + //!destruction will be executed by any process while executing the object + //!function call. If the atomic function can't be immediatelly executed + //!because the internal mutex is already locked, returns false. + //!If the functor throws, this function throws. + template + bool try_atomic_func(Func &f) + { + scoped_lock guard(m_header, try_to_lock); + if(guard){ + f(); + return true; + } + else{ + return false; + } + } + + //!Destroys a previously created named/unique instance. + //!Returns false if the object was not present. + template + bool destroy(char_ptr_holder_t name) + { + BOOST_ASSERT(!name.is_anonymous()); + ipcdetail::placement_destroy dtor; + + if(name.is_unique()){ + return this->priv_generic_named_destroy + ( typeid(T).name(), m_header.m_unique_index , dtor, is_intrusive_t()); + } + else{ + return this->priv_generic_named_destroy + ( name.get(), m_header.m_named_index, dtor, is_intrusive_t()); + } + } + + //!Destroys an anonymous, unique or named object + //!using its address + template + void destroy_ptr(const T *p) + { + //If T is void transform it to char + typedef typename ipcdetail::char_if_void::type data_t; + ipcdetail::placement_destroy dtor; + priv_destroy_ptr(p, dtor); + } + + //!Returns the name of an object created with construct/find_or_construct + //!functions. Does not throw + template + static const CharType *get_instance_name(const T *ptr) + { return priv_get_instance_name(block_header_t::block_header_from_value(ptr)); } + + //!Returns the length of an object created with construct/find_or_construct + //!functions. Does not throw. + template + static size_type get_instance_length(const T *ptr) + { return priv_get_instance_length(block_header_t::block_header_from_value(ptr), sizeof(T)); } + + //!Returns is the the name of an object created with construct/find_or_construct + //!functions. Does not throw + template + static instance_type get_instance_type(const T *ptr) + { return priv_get_instance_type(block_header_t::block_header_from_value(ptr)); } + + //!Preallocates needed index resources to optimize the + //!creation of "num" named objects in the managed memory segment. + //!Can throw boost::interprocess::bad_alloc if there is no enough memory. + void reserve_named_objects(size_type num) + { + //------------------------------- + scoped_lock guard(m_header); + //------------------------------- + m_header.m_named_index.reserve(num); + } + + //!Preallocates needed index resources to optimize the + //!creation of "num" unique objects in the managed memory segment. + //!Can throw boost::interprocess::bad_alloc if there is no enough memory. + void reserve_unique_objects(size_type num) + { + //------------------------------- + scoped_lock guard(m_header); + //------------------------------- + m_header.m_unique_index.reserve(num); + } + + //!Calls shrink_to_fit in both named and unique object indexes + //!to try to free unused memory from those indexes. + void shrink_to_fit_indexes() + { + //------------------------------- + scoped_lock guard(m_header); + //------------------------------- + m_header.m_named_index.shrink_to_fit(); + m_header.m_unique_index.shrink_to_fit(); + } + + //!Returns the number of named objects stored in + //!the segment. + size_type get_num_named_objects() + { + //------------------------------- + scoped_lock guard(m_header); + //------------------------------- + return m_header.m_named_index.size(); + } + + //!Returns the number of unique objects stored in + //!the segment. + size_type get_num_unique_objects() + { + //------------------------------- + scoped_lock guard(m_header); + //------------------------------- + return m_header.m_unique_index.size(); + } + + //!Obtains the minimum size needed by the + //!segment manager + static size_type get_min_size() + { return segment_manager_base_t::get_min_size(priv_get_reserved_bytes()); } + + //!Returns a constant iterator to the beginning of the information about + //!the named allocations performed in this segment manager + const_named_iterator named_begin() const + { + return make_transform_iterator + (m_header.m_named_index.begin(), named_transform()); + } + + //!Returns a constant iterator to the end of the information about + //!the named allocations performed in this segment manager + const_named_iterator named_end() const + { + return make_transform_iterator + (m_header.m_named_index.end(), named_transform()); + } + + //!Returns a constant iterator to the beginning of the information about + //!the unique allocations performed in this segment manager + const_unique_iterator unique_begin() const + { + return make_transform_iterator + (m_header.m_unique_index.begin(), unique_transform()); + } + + //!Returns a constant iterator to the end of the information about + //!the unique allocations performed in this segment manager + const_unique_iterator unique_end() const + { + return make_transform_iterator + (m_header.m_unique_index.end(), unique_transform()); + } + + //!This is the default allocator to allocate types T + //!from this managed segment + template + struct allocator + { + typedef boost::interprocess::allocator type; + }; + + //!Returns an instance of the default allocator for type T + //!initialized that allocates memory from this segment manager. + template + typename allocator::type + get_allocator() + { return typename allocator::type(this); } + + //!This is the default deleter to delete types T + //!from this managed segment. + template + struct deleter + { + typedef boost::interprocess::deleter type; + }; + + //!Returns an instance of the default deleter for type T + //!that will delete an object constructed in this segment manager. + template + typename deleter::type + get_deleter() + { return typename deleter::type(this); } + + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + + //!Generic named/anonymous new function. Offers all the possibilities, + //!such as throwing, search before creating, and the constructor is + //!encapsulated in an object function. + template + T *generic_construct(const CharType *name, + size_type num, + bool try2find, + bool dothrow, + ipcdetail::in_place_interface &table) + { + return static_cast + (priv_generic_construct(name, num, try2find, dothrow, table)); + } + + private: + //!Tries to find a previous named allocation. Returns the address + //!and the object count. On failure the first member of the + //!returned pair is 0. + template + std::pair priv_find_impl (const CharType* name, bool lock) + { + //The name can't be null, no anonymous object can be found by name + BOOST_ASSERT(name != 0); + ipcdetail::placement_destroy table; + size_type sz; + void *ret; + + if(name == reinterpret_cast(-1)){ + ret = priv_generic_find (typeid(T).name(), m_header.m_unique_index, table, sz, is_intrusive_t(), lock); + } + else{ + ret = priv_generic_find (name, m_header.m_named_index, table, sz, is_intrusive_t(), lock); + } + return std::pair(static_cast(ret), sz); + } + + //!Tries to find a previous unique allocation. Returns the address + //!and the object count. On failure the first member of the + //!returned pair is 0. + template + std::pair priv_find_impl (const ipcdetail::unique_instance_t* name, bool lock) + { + ipcdetail::placement_destroy table; + size_type size; + void *ret = priv_generic_find(name, m_header.m_unique_index, table, size, is_intrusive_t(), lock); + return std::pair(static_cast(ret), size); + } + + void *priv_generic_construct + (const CharType *name, size_type num, bool try2find, bool dothrow, ipcdetail::in_place_interface &table) + { + void *ret; + //Security overflow check + if(num > ((std::size_t)-1)/table.size){ + if(dothrow) + throw bad_alloc(); + else + return 0; + } + if(name == 0){ + ret = this->prot_anonymous_construct(num, dothrow, table); + } + else if(name == reinterpret_cast(-1)){ + ret = this->priv_generic_named_construct + (unique_type, table.type_name, num, try2find, dothrow, table, m_header.m_unique_index, is_intrusive_t()); + } + else{ + ret = this->priv_generic_named_construct + (named_type, name, num, try2find, dothrow, table, m_header.m_named_index, is_intrusive_t()); + } + return ret; + } + + void priv_destroy_ptr(const void *ptr, ipcdetail::in_place_interface &dtor) + { + block_header_t *ctrl_data = block_header_t::block_header_from_value(ptr, dtor.size, dtor.alignment); + switch(ctrl_data->alloc_type()){ + case anonymous_type: + this->prot_anonymous_destroy(ptr, dtor); + break; + + case named_type: + this->priv_generic_named_destroy + (ctrl_data, m_header.m_named_index, dtor, is_node_index_t()); + break; + + case unique_type: + this->priv_generic_named_destroy + (ctrl_data, m_header.m_unique_index, dtor, is_node_index_t()); + break; + + default: + //This type is unknown, bad pointer passed to this function! + BOOST_ASSERT(0); + break; + } + } + + //!Returns the name of an object created with construct/find_or_construct + //!functions. Does not throw + static const CharType *priv_get_instance_name(block_header_t *ctrl_data) + { + boost::interprocess::allocation_type type = ctrl_data->alloc_type(); + if(type == anonymous_type){ + BOOST_ASSERT((type == anonymous_type && ctrl_data->m_num_char == 0) || + (type == unique_type && ctrl_data->m_num_char != 0) ); + return 0; + } + CharType *name = static_cast(ctrl_data->template name()); + + //Sanity checks + BOOST_ASSERT(ctrl_data->sizeof_char() == sizeof(CharType)); + BOOST_ASSERT(ctrl_data->m_num_char == std::char_traits::length(name)); + return name; + } + + static size_type priv_get_instance_length(block_header_t *ctrl_data, size_type sizeofvalue) + { + //Get header + BOOST_ASSERT((ctrl_data->value_bytes() %sizeofvalue) == 0); + return ctrl_data->value_bytes()/sizeofvalue; + } + + //!Returns is the the name of an object created with construct/find_or_construct + //!functions. Does not throw + static instance_type priv_get_instance_type(block_header_t *ctrl_data) + { + //Get header + BOOST_ASSERT((instance_type)ctrl_data->alloc_type() < max_allocation_type); + return (instance_type)ctrl_data->alloc_type(); + } + + static size_type priv_get_reserved_bytes() + { + //Get the number of bytes until the end of (*this) + //beginning in the end of the segment_manager_base_t base. + return sizeof(segment_manager) - sizeof(segment_manager_base_t); + } + + template + void *priv_generic_find + (const CharT* name, + IndexType > &index, + ipcdetail::in_place_interface &table, + size_type &length, ipcdetail::true_ is_intrusive, bool use_lock) + { + (void)is_intrusive; + typedef IndexType > index_type; + typedef typename index_type::iterator index_it; + + //------------------------------- + scoped_lock guard(priv_get_lock(use_lock)); + //------------------------------- + //Find name in index + ipcdetail::intrusive_compare_key key + (name, std::char_traits::length(name)); + index_it it = index.find(key); + + //Initialize return values + void *ret_ptr = 0; + length = 0; + + //If found, assign values + if(it != index.end()){ + //Get header + block_header_t *ctrl_data = it->get_block_header(); + + //Sanity check + BOOST_ASSERT((ctrl_data->m_value_bytes % table.size) == 0); + BOOST_ASSERT(ctrl_data->sizeof_char() == sizeof(CharT)); + ret_ptr = ctrl_data->value(); + length = ctrl_data->m_value_bytes/table.size; + } + return ret_ptr; + } + + template + void *priv_generic_find + (const CharT* name, + IndexType > &index, + ipcdetail::in_place_interface &table, + size_type &length, ipcdetail::false_ is_intrusive, bool use_lock) + { + (void)is_intrusive; + typedef IndexType > index_type; + typedef typename index_type::key_type key_type; + typedef typename index_type::iterator index_it; + + //------------------------------- + scoped_lock guard(priv_get_lock(use_lock)); + //------------------------------- + //Find name in index + index_it it = index.find(key_type(name, std::char_traits::length(name))); + + //Initialize return values + void *ret_ptr = 0; + length = 0; + + //If found, assign values + if(it != index.end()){ + //Get header + block_header_t *ctrl_data = reinterpret_cast + (ipcdetail::to_raw_pointer(it->second.m_ptr)); + + //Sanity check + BOOST_ASSERT((ctrl_data->m_value_bytes % table.size) == 0); + BOOST_ASSERT(ctrl_data->sizeof_char() == sizeof(CharT)); + ret_ptr = ctrl_data->value(); + length = ctrl_data->m_value_bytes/table.size; + } + return ret_ptr; + } + + template + bool priv_generic_named_destroy + (block_header_t *block_header, + IndexType > &index, + ipcdetail::in_place_interface &table, ipcdetail::true_ is_node_index) + { + (void)is_node_index; + typedef typename IndexType >::iterator index_it; + + index_it *ihdr = block_header_t::template to_first_header(block_header); + return this->priv_generic_named_destroy_impl(*ihdr, index, table); + } + + template + bool priv_generic_named_destroy + (block_header_t *block_header, + IndexType > &index, + ipcdetail::in_place_interface &table, + ipcdetail::false_ is_node_index) + { + (void)is_node_index; + CharT *name = static_cast(block_header->template name()); + return this->priv_generic_named_destroy(name, index, table, is_intrusive_t()); + } + + template + bool priv_generic_named_destroy(const CharT *name, + IndexType > &index, + ipcdetail::in_place_interface &table, ipcdetail::true_ is_intrusive_index) + { + (void)is_intrusive_index; + typedef IndexType > index_type; + typedef typename index_type::iterator index_it; + typedef typename index_type::value_type intrusive_value_type; + + //------------------------------- + scoped_lock guard(m_header); + //------------------------------- + //Find name in index + ipcdetail::intrusive_compare_key key + (name, std::char_traits::length(name)); + index_it it = index.find(key); + + //If not found, return false + if(it == index.end()){ + //This name is not present in the index, wrong pointer or name! + //BOOST_ASSERT(0); + return false; + } + + block_header_t *ctrl_data = it->get_block_header(); + intrusive_value_type *iv = intrusive_value_type::get_intrusive_value_type(ctrl_data); + void *memory = iv; + void *values = ctrl_data->value(); + std::size_t num = ctrl_data->m_value_bytes/table.size; + + //Sanity check + BOOST_ASSERT((ctrl_data->m_value_bytes % table.size) == 0); + BOOST_ASSERT(sizeof(CharT) == ctrl_data->sizeof_char()); + + //Erase node from index + index.erase(it); + + //Destroy the headers + ctrl_data->~block_header_t(); + iv->~intrusive_value_type(); + + //Call destructors and free memory + std::size_t destroyed; + table.destroy_n(values, num, destroyed); + this->deallocate(memory); + return true; + } + + template + bool priv_generic_named_destroy(const CharT *name, + IndexType > &index, + ipcdetail::in_place_interface &table, + ipcdetail::false_ is_intrusive_index) + { + (void)is_intrusive_index; + typedef IndexType > index_type; + typedef typename index_type::iterator index_it; + typedef typename index_type::key_type key_type; + + //------------------------------- + scoped_lock guard(m_header); + //------------------------------- + //Try to find the name in the index + index_it it = index.find(key_type (name, + std::char_traits::length(name))); + + //If not found, return false + if(it == index.end()){ + //This name is not present in the index, wrong pointer or name! + //BOOST_ASSERT(0); + return false; + } + return this->priv_generic_named_destroy_impl(it, index, table); + } + + template + bool priv_generic_named_destroy_impl + (const typename IndexType >::iterator &it, + IndexType > &index, + ipcdetail::in_place_interface &table) + { + typedef IndexType > index_type; + typedef typename index_type::iterator index_it; + + //Get allocation parameters + block_header_t *ctrl_data = reinterpret_cast + (ipcdetail::to_raw_pointer(it->second.m_ptr)); + char *stored_name = static_cast(static_cast(const_cast(it->first.name()))); + (void)stored_name; + + //Check if the distance between the name pointer and the memory pointer + //is correct (this can detect incorrect type in destruction) + std::size_t num = ctrl_data->m_value_bytes/table.size; + void *values = ctrl_data->value(); + + //Sanity check + BOOST_ASSERT((ctrl_data->m_value_bytes % table.size) == 0); + BOOST_ASSERT(static_cast(stored_name) == static_cast(ctrl_data->template name())); + BOOST_ASSERT(sizeof(CharT) == ctrl_data->sizeof_char()); + + //Erase node from index + index.erase(it); + + //Destroy the header + ctrl_data->~block_header_t(); + + void *memory; + if(is_node_index_t::value){ + index_it *ihdr = block_header_t::template + to_first_header(ctrl_data); + ihdr->~index_it(); + memory = ihdr; + } + else{ + memory = ctrl_data; + } + + //Call destructors and free memory + std::size_t destroyed; + table.destroy_n(values, num, destroyed); + this->deallocate(memory); + return true; + } + + template + void * priv_generic_named_construct + (unsigned char type, const CharT *name, size_type num, bool try2find, + bool dothrow, ipcdetail::in_place_interface &table, + IndexType > &index, ipcdetail::true_ is_intrusive) + { + (void)is_intrusive; + std::size_t namelen = std::char_traits::length(name); + + block_header_t block_info ( size_type(table.size*num) + , size_type(table.alignment) + , type + , sizeof(CharT) + , namelen); + + typedef IndexType > index_type; + typedef typename index_type::iterator index_it; + typedef std::pair index_ib; + + //------------------------------- + scoped_lock guard(m_header); + //------------------------------- + //Insert the node. This can throw. + //First, we want to know if the key is already present before + //we allocate any memory, and if the key is not present, we + //want to allocate all memory in a single buffer that will + //contain the name and the user buffer. + // + //Since equal_range(key) + insert(hint, value) approach is + //quite inefficient in container implementations + //(they re-test if the position is correct), I've chosen + //to insert the node, do an ugly un-const cast and modify + //the key (which is a smart pointer) to an equivalent one + index_ib insert_ret; + + typename index_type::insert_commit_data commit_data; + typedef typename index_type::value_type intrusive_value_type; + + BOOST_TRY{ + ipcdetail::intrusive_compare_key key(name, namelen); + insert_ret = index.insert_check(key, commit_data); + } + //Ignore exceptions + BOOST_CATCH(...){ + if(dothrow) + BOOST_RETHROW + return 0; + } + BOOST_CATCH_END + + index_it it = insert_ret.first; + + //If found and this is find or construct, return data + //else return null + if(!insert_ret.second){ + if(try2find){ + return it->get_block_header()->value(); + } + if(dothrow){ + throw interprocess_exception(already_exists_error); + } + else{ + return 0; + } + } + + //Allocates buffer for name + data, this can throw (it hurts) + void *buffer_ptr; + + //Check if there is enough memory + if(dothrow){ + buffer_ptr = this->allocate + (block_info.template total_size_with_header()); + } + else{ + buffer_ptr = this->allocate + (block_info.template total_size_with_header(), nothrow<>::get()); + if(!buffer_ptr) + return 0; + } + + //Now construct the intrusive hook plus the header + intrusive_value_type * intrusive_hdr = ::new(buffer_ptr, boost_container_new_t()) intrusive_value_type(); + block_header_t * hdr = ::new(intrusive_hdr->get_block_header(), boost_container_new_t())block_header_t(block_info); + void *ptr = 0; //avoid gcc warning + ptr = hdr->value(); + + //Copy name to memory segment and insert data + CharT *name_ptr = static_cast(hdr->template name()); + std::char_traits::copy(name_ptr, name, namelen+1); + + BOOST_TRY{ + //Now commit the insertion using previous context data + it = index.insert_commit(*intrusive_hdr, commit_data); + } + //Ignore exceptions + BOOST_CATCH(...){ + if(dothrow) + BOOST_RETHROW + return 0; + } + BOOST_CATCH_END + + //Avoid constructions if constructor is trivial + //Build scoped ptr to avoid leaks with constructor exception + ipcdetail::mem_algo_deallocator mem + (buffer_ptr, *static_cast(this)); + + //Initialize the node value_eraser to erase inserted node + //if something goes wrong. This will be executed *before* + //the memory allocation as the intrusive value is built in that + //memory + value_eraser v_eraser(index, it); + + //Construct array, this can throw + ipcdetail::array_construct(ptr, num, table); + + //Release rollbacks since construction was successful + v_eraser.release(); + mem.release(); + return ptr; + } + + //!Generic named new function for + //!named functions + template + void * priv_generic_named_construct + (unsigned char type, const CharT *name, size_type num, bool try2find, bool dothrow, + ipcdetail::in_place_interface &table, + IndexType > &index, ipcdetail::false_ is_intrusive) + { + (void)is_intrusive; + std::size_t namelen = std::char_traits::length(name); + + block_header_t block_info ( size_type(table.size*num) + , size_type(table.alignment) + , type + , sizeof(CharT) + , namelen); + + typedef IndexType > index_type; + typedef typename index_type::key_type key_type; + typedef typename index_type::mapped_type mapped_type; + typedef typename index_type::value_type value_type; + typedef typename index_type::iterator index_it; + typedef std::pair index_ib; + + //------------------------------- + scoped_lock guard(m_header); + //------------------------------- + //Insert the node. This can throw. + //First, we want to know if the key is already present before + //we allocate any memory, and if the key is not present, we + //want to allocate all memory in a single buffer that will + //contain the name and the user buffer. + // + //Since equal_range(key) + insert(hint, value) approach is + //quite inefficient in container implementations + //(they re-test if the position is correct), I've chosen + //to insert the node, do an ugly un-const cast and modify + //the key (which is a smart pointer) to an equivalent one + index_ib insert_ret; + BOOST_TRY{ + insert_ret = index.insert(value_type(key_type (name, namelen), mapped_type(0))); + } + //Ignore exceptions + BOOST_CATCH(...){ + if(dothrow) + BOOST_RETHROW; + return 0; + } + BOOST_CATCH_END + + index_it it = insert_ret.first; + + //If found and this is find or construct, return data + //else return null + if(!insert_ret.second){ + if(try2find){ + block_header_t *hdr = static_cast + (ipcdetail::to_raw_pointer(it->second.m_ptr)); + return hdr->value(); + } + return 0; + } + //Initialize the node value_eraser to erase inserted node + //if something goes wrong + value_eraser v_eraser(index, it); + + //Allocates buffer for name + data, this can throw (it hurts) + void *buffer_ptr; + block_header_t * hdr; + + //Allocate and construct the headers + if(is_node_index_t::value){ + size_type total_size = block_info.template total_size_with_header(); + if(dothrow){ + buffer_ptr = this->allocate(total_size); + } + else{ + buffer_ptr = this->allocate(total_size, nothrow<>::get()); + if(!buffer_ptr) + return 0; + } + index_it *idr = ::new(buffer_ptr, boost_container_new_t()) index_it(it); + hdr = block_header_t::template from_first_header(idr); + } + else{ + if(dothrow){ + buffer_ptr = this->allocate(block_info.total_size()); + } + else{ + buffer_ptr = this->allocate(block_info.total_size(), nothrow<>::get()); + if(!buffer_ptr) + return 0; + } + hdr = static_cast(buffer_ptr); + } + + hdr = ::new(hdr, boost_container_new_t())block_header_t(block_info); + void *ptr = 0; //avoid gcc warning + ptr = hdr->value(); + + //Copy name to memory segment and insert data + CharT *name_ptr = static_cast(hdr->template name()); + std::char_traits::copy(name_ptr, name, namelen+1); + + //Do the ugly cast, please mama, forgive me! + //This new key points to an identical string, so it must have the + //same position than the overwritten key according to the predicate + const_cast(it->first).name(name_ptr); + it->second.m_ptr = hdr; + + //Build scoped ptr to avoid leaks with constructor exception + ipcdetail::mem_algo_deallocator mem + (buffer_ptr, *static_cast(this)); + + //Construct array, this can throw + ipcdetail::array_construct(ptr, num, table); + + //All constructors successful, we don't want to release memory + mem.release(); + + //Release node v_eraser since construction was successful + v_eraser.release(); + return ptr; + } + + private: + //!Returns the this pointer + segment_manager *get_this_pointer() + { return this; } + + typedef typename MemoryAlgorithm::mutex_family::recursive_mutex_type rmutex; + + scoped_lock priv_get_lock(bool use_lock) + { + scoped_lock local(m_header, defer_lock); + if(use_lock){ + local.lock(); + } + return scoped_lock(boost::move(local)); + } + + //!This struct includes needed data and derives from + //!rmutex to allow EBO when using null interprocess_mutex + struct header_t + : public rmutex + { + named_index_t m_named_index; + unique_index_t m_unique_index; + + header_t(segment_manager_base_t *segment_mngr_base) + : m_named_index (segment_mngr_base) + , m_unique_index(segment_mngr_base) + {} + } m_header; + + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED +}; + + +}} //namespace boost { namespace interprocess + +#include + +#endif //#ifndef BOOST_INTERPROCESS_SEGMENT_MANAGER_HPP + diff --git a/boost/interprocess/smart_ptr/deleter.hpp b/boost/interprocess/smart_ptr/deleter.hpp new file mode 100644 index 000000000..3cd469df8 --- /dev/null +++ b/boost/interprocess/smart_ptr/deleter.hpp @@ -0,0 +1,68 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2007-2012. +// +// Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_DELETER_HPP +#define BOOST_INTERPROCESS_DELETER_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include +#include +#include + +//!\file +//!Describes the functor to delete objects from the segment. + +namespace boost { +namespace interprocess { + +//!A deleter that uses the segment manager's destroy_ptr +//!function to destroy the passed pointer resource. +//! +//!This deleter is used +template +class deleter +{ + public: + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type pointer; + + private: + typedef typename boost::intrusive:: + pointer_traits::template + rebind_pointer::type segment_manager_pointer; + + segment_manager_pointer mp_mngr; + + public: + deleter(segment_manager_pointer pmngr) + : mp_mngr(pmngr) + {} + + void operator()(const pointer &p) + { mp_mngr->destroy_ptr(ipcdetail::to_raw_pointer(p)); } +}; + +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //#ifndef BOOST_INTERPROCESS_DELETER_HPP diff --git a/boost/interprocess/sync/interprocess_recursive_mutex.hpp b/boost/interprocess/sync/interprocess_recursive_mutex.hpp new file mode 100644 index 000000000..e38257493 --- /dev/null +++ b/boost/interprocess/sync/interprocess_recursive_mutex.hpp @@ -0,0 +1,181 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// +// +// Parts of the pthread code come from Boost Threads code: +// +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2001-2003 +// William E. Kempf +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appear in all copies and +// that both that copyright notice and this permission notice appear +// in supporting documentation. William E. Kempf makes no representations +// about the suitability of this software for any purpose. +// It is provided "as is" without express or implied warranty. +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_RECURSIVE_MUTEX_HPP +#define BOOST_INTERPROCESS_RECURSIVE_MUTEX_HPP + +#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include +#include +#include + +#if !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) && \ + (defined(BOOST_INTERPROCESS_POSIX_PROCESS_SHARED) && defined (BOOST_INTERPROCESS_POSIX_RECURSIVE_MUTEXES)) + #include + #define BOOST_INTERPROCESS_USE_POSIX +//Experimental... +#elif !defined(BOOST_INTERPROCESS_FORCE_GENERIC_EMULATION) && defined (BOOST_INTERPROCESS_WINDOWS) + #include + #define BOOST_INTERPROCESS_USE_WINDOWS +#elif !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + #include + #define BOOST_INTERPROCESS_USE_GENERIC_EMULATION +#endif + +#if defined (BOOST_INTERPROCESS_USE_GENERIC_EMULATION) +namespace boost { +namespace interprocess { +namespace ipcdetail{ +namespace robust_emulation_helpers { + +template +class mutex_traits; + +}}}} + +#endif + +#endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + +//!\file +//!Describes interprocess_recursive_mutex and shared_recursive_try_mutex classes + +namespace boost { +namespace interprocess { + +//!Wraps a interprocess_mutex that can be placed in shared memory and can be +//!shared between processes. Allows several locking calls by the same +//!process. Allows timed lock tries +class interprocess_recursive_mutex +{ + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + //Non-copyable + interprocess_recursive_mutex(const interprocess_recursive_mutex &); + interprocess_recursive_mutex &operator=(const interprocess_recursive_mutex &); + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + public: + //!Constructor. + //!Throws interprocess_exception on error. + interprocess_recursive_mutex(); + + //!Destructor. If any process uses the mutex after the destructor is called + //!the result is undefined. Does not throw. + ~interprocess_recursive_mutex(); + + //!Effects: The calling thread tries to obtain ownership of the mutex, and + //! if another thread has ownership of the mutex, it waits until it can + //! obtain the ownership. If a thread takes ownership of the mutex the + //! mutex must be unlocked by the same mutex. The mutex must be unlocked + //! the same number of times it is locked. + //!Throws: interprocess_exception on error. + void lock(); + + //!Tries to lock the interprocess_mutex, returns false when interprocess_mutex + //!is already locked, returns true when success. The mutex must be unlocked + //!the same number of times it is locked. + //!Throws: interprocess_exception if a severe error is found + bool try_lock(); + + //!Tries to lock the interprocess_mutex, if interprocess_mutex can't be locked before + //!abs_time time, returns false. The mutex must be unlocked + //! the same number of times it is locked. + //!Throws: interprocess_exception if a severe error is found + bool timed_lock(const boost::posix_time::ptime &abs_time); + + //!Effects: The calling thread releases the exclusive ownership of the mutex. + //! If the mutex supports recursive locking, the mutex must be unlocked the + //! same number of times it is locked. + //!Throws: interprocess_exception on error. + void unlock(); + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + private: + + #if defined (BOOST_INTERPROCESS_USE_GENERIC_EMULATION) + #undef BOOST_INTERPROCESS_USE_GENERIC_EMULATION + void take_ownership(){ mutex.take_ownership(); } + friend class ipcdetail::robust_emulation_helpers::mutex_traits; + ipcdetail::spin_recursive_mutex mutex; + #elif defined(BOOST_INTERPROCESS_USE_POSIX) + #undef BOOST_INTERPROCESS_USE_POSIX + ipcdetail::posix_recursive_mutex mutex; + #elif defined(BOOST_INTERPROCESS_USE_WINDOWS) + #undef BOOST_INTERPROCESS_USE_WINDOWS + ipcdetail::windows_recursive_mutex mutex; + #else + #error "Unknown platform for interprocess_mutex" + #endif + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED +}; + +} //namespace interprocess { +} //namespace boost { + +namespace boost { +namespace interprocess { + +inline interprocess_recursive_mutex::interprocess_recursive_mutex(){} + +inline interprocess_recursive_mutex::~interprocess_recursive_mutex(){} + +inline void interprocess_recursive_mutex::lock() +{ + #ifdef BOOST_INTERPROCESS_ENABLE_TIMEOUT_WHEN_LOCKING + boost::posix_time::ptime wait_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?"); + } + #else + mutex.lock(); + #endif +} + +inline bool interprocess_recursive_mutex::try_lock() +{ return mutex.try_lock(); } + +inline bool interprocess_recursive_mutex::timed_lock(const boost::posix_time::ptime &abs_time) +{ return mutex.timed_lock(abs_time); } + +inline void interprocess_recursive_mutex::unlock() +{ mutex.unlock(); } + +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //BOOST_INTERPROCESS_RECURSIVE_MUTEX_HPP diff --git a/boost/interprocess/sync/mutex_family.hpp b/boost/interprocess/sync/mutex_family.hpp new file mode 100644 index 000000000..b136ce441 --- /dev/null +++ b/boost/interprocess/sync/mutex_family.hpp @@ -0,0 +1,60 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_MUTEX_FAMILY_HPP +#define BOOST_INTERPROCESS_MUTEX_FAMILY_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +#include +#include +#include + +//!\file +//!Describes a shared interprocess_mutex family fit algorithm used to allocate objects in shared memory. + +namespace boost { + +namespace interprocess { + +//!Describes interprocess_mutex family to use with Interprocess framework +//!based on boost::interprocess synchronization objects. +struct mutex_family +{ + typedef boost::interprocess::interprocess_mutex mutex_type; + typedef boost::interprocess::interprocess_recursive_mutex recursive_mutex_type; +}; + +//!Describes interprocess_mutex family to use with Interprocess frameworks +//!based on null operation synchronization objects. +struct null_mutex_family +{ + typedef boost::interprocess::null_mutex mutex_type; + typedef boost::interprocess::null_mutex recursive_mutex_type; +}; + +} //namespace interprocess { + +} //namespace boost { + +#include + +#endif //#ifndef BOOST_INTERPROCESS_MUTEX_FAMILY_HPP + + diff --git a/boost/interprocess/sync/null_mutex.hpp b/boost/interprocess/sync/null_mutex.hpp new file mode 100644 index 000000000..f3c29eb25 --- /dev/null +++ b/boost/interprocess/sync/null_mutex.hpp @@ -0,0 +1,155 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_NULL_MUTEX_HPP +#define BOOST_INTERPROCESS_NULL_MUTEX_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + + +//!\file +//!Describes null_mutex classes + +namespace boost { + +#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + +namespace posix_time +{ class ptime; } + +#endif //#if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + +namespace interprocess { + +//!Implements a mutex that simulates a mutex without doing any operation and +//!simulates a successful operation. +class null_mutex +{ + #if !defined(BOOST_INTERPROCESS_DOXYGEN_INVOKED) + null_mutex(const null_mutex&); + null_mutex &operator= (const null_mutex&); + #endif //#ifndef BOOST_INTERPROCESS_DOXYGEN_INVOKED + public: + + //!Constructor. + //!Empty. + null_mutex(){} + + //!Destructor. + //!Empty. + ~null_mutex(){} + + //!Simulates a mutex lock() operation. Empty function. + void lock(){} + + //!Simulates a mutex try_lock() operation. + //!Equivalent to "return true;" + bool try_lock() + { return true; } + + //!Simulates a mutex timed_lock() operation. + //!Equivalent to "return true;" + bool timed_lock(const boost::posix_time::ptime &) + { return true; } + + //!Simulates a mutex unlock() operation. + //!Empty function. + void unlock(){} + + //!Simulates a mutex lock_sharable() operation. + //!Empty function. + void lock_sharable(){} + + //!Simulates a mutex try_lock_sharable() operation. + //!Equivalent to "return true;" + bool try_lock_sharable() + { return true; } + + //!Simulates a mutex timed_lock_sharable() operation. + //!Equivalent to "return true;" + bool timed_lock_sharable(const boost::posix_time::ptime &) + { return true; } + + //!Simulates a mutex unlock_sharable() operation. + //!Empty function. + void unlock_sharable(){} + + //!Simulates a mutex lock_upgradable() operation. + //!Empty function. + void lock_upgradable(){} + + //!Simulates a mutex try_lock_upgradable() operation. + //!Equivalent to "return true;" + bool try_lock_upgradable() + { return true; } + + //!Simulates a mutex timed_lock_upgradable() operation. + //!Equivalent to "return true;" + bool timed_lock_upgradable(const boost::posix_time::ptime &) + { return true; } + + //!Simulates a mutex unlock_upgradable() operation. + //!Empty function. + void unlock_upgradable(){} + + //!Simulates unlock_and_lock_upgradable(). + //!Empty function. + void unlock_and_lock_upgradable(){} + + //!Simulates unlock_and_lock_sharable(). + //!Empty function. + void unlock_and_lock_sharable(){} + + //!Simulates unlock_upgradable_and_lock_sharable(). + //!Empty function. + void unlock_upgradable_and_lock_sharable(){} + + //Promotions + + //!Simulates unlock_upgradable_and_lock(). + //!Empty function. + void unlock_upgradable_and_lock(){} + + //!Simulates try_unlock_upgradable_and_lock(). + //!Equivalent to "return true;" + bool try_unlock_upgradable_and_lock() + { return true; } + + //!Simulates timed_unlock_upgradable_and_lock(). + //!Equivalent to "return true;" + bool timed_unlock_upgradable_and_lock(const boost::posix_time::ptime &) + { return true; } + + //!Simulates try_unlock_sharable_and_lock(). + //!Equivalent to "return true;" + bool try_unlock_sharable_and_lock() + { return true; } + + //!Simulates try_unlock_sharable_and_lock_upgradable(). + //!Equivalent to "return true;" + bool try_unlock_sharable_and_lock_upgradable() + { return true; } +}; + +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //BOOST_INTERPROCESS_NULL_MUTEX_HPP diff --git a/boost/interprocess/sync/posix/recursive_mutex.hpp b/boost/interprocess/sync/posix/recursive_mutex.hpp new file mode 100644 index 000000000..9ef4f1278 --- /dev/null +++ b/boost/interprocess/sync/posix/recursive_mutex.hpp @@ -0,0 +1,137 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// +// +// Parts of the pthread code come from Boost Threads code: +// +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2001-2003 +// William E. Kempf +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appear in all copies and +// that both that copyright notice and this permission notice appear +// in supporting documentation. William E. Kempf makes no representations +// about the suitability of this software for any purpose. +// It is provided "as is" without express or implied warranty. +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_DETAIL_POSIX_RECURSIVE_MUTEX_HPP +#define BOOST_INTERPROCESS_DETAIL_POSIX_RECURSIVE_MUTEX_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#ifndef BOOST_INTERPROCESS_POSIX_TIMEOUTS +# include +# include +#endif +#include + +namespace boost { +namespace interprocess { +namespace ipcdetail { + +class posix_recursive_mutex +{ + posix_recursive_mutex(const posix_recursive_mutex &); + posix_recursive_mutex &operator=(const posix_recursive_mutex &); + public: + + posix_recursive_mutex(); + ~posix_recursive_mutex(); + + void lock(); + bool try_lock(); + bool timed_lock(const boost::posix_time::ptime &abs_time); + void unlock(); + + private: + pthread_mutex_t m_mut; +}; + +inline posix_recursive_mutex::posix_recursive_mutex() +{ + mutexattr_wrapper mut_attr(true); + mutex_initializer mut(m_mut, mut_attr); + mut.release(); +} + +inline posix_recursive_mutex::~posix_recursive_mutex() +{ + int res = pthread_mutex_destroy(&m_mut); + BOOST_ASSERT(res == 0);(void)res; +} + +inline void posix_recursive_mutex::lock() +{ + if (pthread_mutex_lock(&m_mut) != 0) + throw lock_exception(); +} + +inline bool posix_recursive_mutex::try_lock() +{ + int res = pthread_mutex_trylock(&m_mut); + if (!(res == 0 || res == EBUSY)) + throw lock_exception(); + return res == 0; +} + +inline bool posix_recursive_mutex::timed_lock(const boost::posix_time::ptime &abs_time) +{ + #ifdef BOOST_INTERPROCESS_POSIX_TIMEOUTS + //Posix does not support infinity absolute time so handle it here + if(abs_time == boost::posix_time::pos_infin){ + this->lock(); + return true; + } + + timespec ts = ptime_to_timespec(abs_time); + int res = pthread_mutex_timedlock(&m_mut, &ts); + if (res != 0 && res != ETIMEDOUT) + throw lock_exception(); + return res == 0; + + #else //BOOST_INTERPROCESS_POSIX_TIMEOUTS + + return ipcdetail::try_based_timed_lock(*this, abs_time); + + #endif //BOOST_INTERPROCESS_POSIX_TIMEOUTS +} + +inline void posix_recursive_mutex::unlock() +{ + int res = 0; + res = pthread_mutex_unlock(&m_mut); + BOOST_ASSERT(res == 0); (void)res; +} + +} //namespace ipcdetail { +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //#ifndef BOOST_INTERPROCESS_DETAIL_POSIX_RECURSIVE_MUTEX_HPP diff --git a/boost/interprocess/sync/spin/recursive_mutex.hpp b/boost/interprocess/sync/spin/recursive_mutex.hpp new file mode 100644 index 000000000..495efd900 --- /dev/null +++ b/boost/interprocess/sync/spin/recursive_mutex.hpp @@ -0,0 +1,176 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// +// +// Parts of the pthread code come from Boost Threads code: +// +////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2001-2003 +// William E. Kempf +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appear in all copies and +// that both that copyright notice and this permission notice appear +// in supporting documentation. William E. Kempf makes no representations +// about the suitability of this software for any purpose. +// It is provided "as is" without express or implied warranty. +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_DETAIL_SPIN_RECURSIVE_MUTEX_HPP +#define BOOST_INTERPROCESS_DETAIL_SPIN_RECURSIVE_MUTEX_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace interprocess { +namespace ipcdetail { + +class spin_recursive_mutex +{ + spin_recursive_mutex(const spin_recursive_mutex &); + spin_recursive_mutex &operator=(const spin_recursive_mutex &); + public: + + spin_recursive_mutex(); + ~spin_recursive_mutex(); + + void lock(); + bool try_lock(); + bool timed_lock(const boost::posix_time::ptime &abs_time); + void unlock(); + void take_ownership(); + private: + spin_mutex m_mutex; + unsigned int m_nLockCount; + volatile ipcdetail::OS_systemwide_thread_id_t m_nOwner; + volatile boost::uint32_t m_s; +}; + +inline spin_recursive_mutex::spin_recursive_mutex() + : m_nLockCount(0), m_nOwner(ipcdetail::get_invalid_systemwide_thread_id()){} + +inline spin_recursive_mutex::~spin_recursive_mutex(){} + +inline void spin_recursive_mutex::lock() +{ + typedef ipcdetail::OS_systemwide_thread_id_t handle_t; + const handle_t thr_id(ipcdetail::get_current_systemwide_thread_id()); + handle_t old_id; + ipcdetail::systemwide_thread_id_copy(m_nOwner, old_id); + if(ipcdetail::equal_systemwide_thread_id(thr_id , old_id)){ + if((unsigned int)(m_nLockCount+1) == 0){ + //Overflow, throw an exception + throw interprocess_exception("boost::interprocess::spin_recursive_mutex recursive lock overflow"); + } + ++m_nLockCount; + } + else{ + m_mutex.lock(); + ipcdetail::systemwide_thread_id_copy(thr_id, m_nOwner); + m_nLockCount = 1; + } +} + +inline bool spin_recursive_mutex::try_lock() +{ + typedef ipcdetail::OS_systemwide_thread_id_t handle_t; + handle_t thr_id(ipcdetail::get_current_systemwide_thread_id()); + handle_t old_id; + ipcdetail::systemwide_thread_id_copy(m_nOwner, old_id); + if(ipcdetail::equal_systemwide_thread_id(thr_id , old_id)) { // we own it + if((unsigned int)(m_nLockCount+1) == 0){ + //Overflow, throw an exception + throw interprocess_exception("boost::interprocess::spin_recursive_mutex recursive lock overflow"); + } + ++m_nLockCount; + return true; + } + if(m_mutex.try_lock()){ + ipcdetail::systemwide_thread_id_copy(thr_id, m_nOwner); + m_nLockCount = 1; + return true; + } + return false; +} + +inline bool spin_recursive_mutex::timed_lock(const boost::posix_time::ptime &abs_time) +{ + typedef ipcdetail::OS_systemwide_thread_id_t handle_t; + const handle_t thr_id(ipcdetail::get_current_systemwide_thread_id()); + handle_t old_id; + ipcdetail::systemwide_thread_id_copy(m_nOwner, old_id); + if(ipcdetail::equal_systemwide_thread_id(thr_id , old_id)) { // we own it + if((unsigned int)(m_nLockCount+1) == 0){ + //Overflow, throw an exception + throw interprocess_exception("boost::interprocess::spin_recursive_mutex recursive lock overflow"); + } + ++m_nLockCount; + return true; + } + //m_mutex supports abs_time so no need to check it + if(m_mutex.timed_lock(abs_time)){ + ipcdetail::systemwide_thread_id_copy(thr_id, m_nOwner); + m_nLockCount = 1; + return true; + } + return false; +} + +inline void spin_recursive_mutex::unlock() +{ + typedef ipcdetail::OS_systemwide_thread_id_t handle_t; + handle_t old_id; + ipcdetail::systemwide_thread_id_copy(m_nOwner, old_id); + const handle_t thr_id(ipcdetail::get_current_systemwide_thread_id()); + (void)old_id; + (void)thr_id; + BOOST_ASSERT(ipcdetail::equal_systemwide_thread_id(thr_id, old_id)); + --m_nLockCount; + if(!m_nLockCount){ + const handle_t new_id(ipcdetail::get_invalid_systemwide_thread_id()); + ipcdetail::systemwide_thread_id_copy(new_id, m_nOwner); + m_mutex.unlock(); + } +} + +inline void spin_recursive_mutex::take_ownership() +{ + typedef ipcdetail::OS_systemwide_thread_id_t handle_t; + this->m_nLockCount = 1; + const handle_t thr_id(ipcdetail::get_current_systemwide_thread_id()); + ipcdetail::systemwide_thread_id_copy(thr_id, m_nOwner); +} + +} //namespace ipcdetail { +} //namespace interprocess { +} //namespace boost { + +#include + +#endif //BOOST_INTERPROCESS_DETAIL_SPIN_RECURSIVE_MUTEX_HPP diff --git a/boost/interprocess/sync/windows/recursive_mutex.hpp b/boost/interprocess/sync/windows/recursive_mutex.hpp new file mode 100644 index 000000000..bf406f8fe --- /dev/null +++ b/boost/interprocess/sync/windows/recursive_mutex.hpp @@ -0,0 +1,47 @@ +////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the 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/interprocess for documentation. +// +////////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTERPROCESS_DETAIL_WINDOWS_RECURSIVE_MUTEX_HPP +#define BOOST_INTERPROCESS_DETAIL_WINDOWS_RECURSIVE_MUTEX_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif +# +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include +#include + +namespace boost { +namespace interprocess { +namespace ipcdetail { + +//Windows mutex is already recursive +class windows_recursive_mutex + : public windows_mutex +{ + windows_recursive_mutex(const windows_recursive_mutex &); + windows_recursive_mutex &operator=(const windows_recursive_mutex &); + public: + windows_recursive_mutex() : windows_mutex() {} +}; + +} //namespace ipcdetail { +} //namespace interprocess { +} //namespace boost { + + +#include + +#endif //BOOST_INTERPROCESS_DETAIL_WINDOWS_RECURSIVE_MUTEX_HPP diff --git a/boost/intrusive/any_hook.hpp b/boost/intrusive/any_hook.hpp new file mode 100644 index 000000000..6d187812a --- /dev/null +++ b/boost/intrusive/any_hook.hpp @@ -0,0 +1,338 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_ANY_HOOK_HPP +#define BOOST_INTRUSIVE_ANY_HOOK_HPP + +#include +#include +#include +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +//! Helper metafunction to define a \c \c any_base_hook that yields to the same +//! type when the same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_any_base_hook +{ + /// @cond + typedef typename pack_options + < hook_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3 + #else + Options... + #endif + >::type packed_options; + + typedef generic_hook + < AnyAlgorithm + , any_node_traits + , typename packed_options::tag + , packed_options::link_mode + , AnyBaseHookId + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +//! Derive a class from this hook in order to store objects of that class +//! in an intrusive container. +//! +//! The hook admits the following options: \c tag<>, \c void_pointer<> and +//! \c link_mode<>. +//! +//! \c tag<> defines a tag to identify the node. +//! The same tag value can be used in different classes, but if a class is +//! derived from more than one \c any_base_hook, then each \c any_base_hook needs its +//! unique tag. +//! +//! \c link_mode<> will specify the linking mode of the hook (\c normal_link, \c safe_link). +//! +//! \c void_pointer<> is the pointer type that will be used internally in the hook +//! and the container configured to use this hook. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class any_base_hook + : public make_any_base_hook + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + + #else + + #endif + ::type +{ + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + public: + //! Effects: If link_mode is or \c safe_link + //! initializes the node to an unlinked state. + //! + //! Throws: Nothing. + any_base_hook(); + + //! Effects: If link_mode is or \c safe_link + //! initializes the node to an unlinked state. The argument is ignored. + //! + //! Throws: Nothing. + //! + //! Rationale: Providing a copy-constructor + //! makes classes using the hook STL-compliant without forcing the + //! user to do some additional work. \c swap can be used to emulate + //! move-semantics. + any_base_hook(const any_base_hook& ); + + //! Effects: Empty function. The argument is ignored. + //! + //! Throws: Nothing. + //! + //! Rationale: Providing an assignment operator + //! makes classes using the hook STL-compliant without forcing the + //! user to do some additional work. \c swap can be used to emulate + //! move-semantics. + any_base_hook& operator=(const any_base_hook& ); + + //! Effects: If link_mode is \c normal_link, the destructor does + //! nothing (ie. no code is generated). If link_mode is \c safe_link and the + //! object is stored in a container an assertion is raised. + //! + //! Throws: Nothing. + ~any_base_hook(); + + //! Precondition: link_mode must be \c safe_link. + //! + //! Returns: true, if the node belongs to a container, false + //! otherwise. This function can be used to test whether \c container::iterator_to + //! will return a valid iterator. + //! + //! Complexity: Constant + bool is_linked() const; + #endif +}; + +//! Helper metafunction to define a \c \c any_member_hook that yields to the same +//! type when the same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_any_member_hook +{ + /// @cond + typedef typename pack_options + < hook_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3 + #else + Options... + #endif + >::type packed_options; + + typedef generic_hook + < AnyAlgorithm + , any_node_traits + , member_tag + , packed_options::link_mode + , NoBaseHookId + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +//! Store this hook in a class to be inserted +//! in an intrusive container. +//! +//! The hook admits the following options: \c void_pointer<> and +//! \c link_mode<>. +//! +//! \c link_mode<> will specify the linking mode of the hook (\c normal_link or \c safe_link). +//! +//! \c void_pointer<> is the pointer type that will be used internally in the hook +//! and the container configured to use this hook. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class any_member_hook + : public make_any_member_hook + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + + #else + + #endif + ::type +{ + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + public: + //! Effects: If link_mode is or \c safe_link + //! initializes the node to an unlinked state. + //! + //! Throws: Nothing. + any_member_hook(); + + //! Effects: If link_mode is or \c safe_link + //! initializes the node to an unlinked state. The argument is ignored. + //! + //! Throws: Nothing. + //! + //! Rationale: Providing a copy-constructor + //! makes classes using the hook STL-compliant without forcing the + //! user to do some additional work. \c swap can be used to emulate + //! move-semantics. + any_member_hook(const any_member_hook& ); + + //! Effects: Empty function. The argument is ignored. + //! + //! Throws: Nothing. + //! + //! Rationale: Providing an assignment operator + //! makes classes using the hook STL-compliant without forcing the + //! user to do some additional work. \c swap can be used to emulate + //! move-semantics. + any_member_hook& operator=(const any_member_hook& ); + + //! Effects: If link_mode is \c normal_link, the destructor does + //! nothing (ie. no code is generated). If link_mode is \c safe_link and the + //! object is stored in a container an assertion is raised. + //! + //! Throws: Nothing. + ~any_member_hook(); + + //! Precondition: link_mode must be \c safe_link. + //! + //! Returns: true, if the node belongs to a container, false + //! otherwise. This function can be used to test whether \c container::iterator_to + //! will return a valid iterator. + //! + //! Complexity: Constant + bool is_linked() const; + #endif +}; + +/// @cond + +namespace detail{ + +BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(old_proto_value_traits_base_hook, hooktags::is_base_hook) + +//!This option setter specifies that the container +//!must use the specified base hook +template class NodeTraits> +struct any_to_some_hook +{ + typedef typename BasicHook::template pack::proto_value_traits old_proto_value_traits; + + template + struct pack : public Base + { + struct proto_value_traits + { + //proto_value_traits::hooktags::is_base_hook is used by get_value_traits + //to detect base hooks, so mark it in case BasicHook has it. + struct hooktags + { + static const bool is_base_hook = old_proto_value_traits_base_hook_bool_is_true + ::value; + }; + + typedef old_proto_value_traits basic_hook_t; + static const bool is_any_hook = true; + + template + struct node_traits_from_voidptr + { typedef NodeTraits type; }; + }; + }; +}; + +} //namespace detail{ + +/// @endcond + +//!This option setter specifies that +//!any hook should behave as an slist hook +template +struct any_to_slist_hook +/// @cond + : public detail::any_to_some_hook +/// @endcond +{}; + +//!This option setter specifies that +//!any hook should behave as an list hook +template +struct any_to_list_hook +/// @cond + : public detail::any_to_some_hook +/// @endcond +{}; + +//!This option setter specifies that +//!any hook should behave as a set hook +template +struct any_to_set_hook +/// @cond + : public detail::any_to_some_hook +/// @endcond +{}; + +//!This option setter specifies that +//!any hook should behave as an avl_set hook +template +struct any_to_avl_set_hook +/// @cond + : public detail::any_to_some_hook +/// @endcond +{}; + +//!This option setter specifies that any +//!hook should behave as a bs_set hook +template +struct any_to_bs_set_hook +/// @cond + : public detail::any_to_some_hook +/// @endcond +{}; + +//!This option setter specifies that any hook +//!should behave as an unordered set hook +template +struct any_to_unordered_set_hook +/// @cond + : public detail::any_to_some_hook +/// @endcond +{}; + + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_ANY_HOOK_HPP diff --git a/boost/intrusive/avl_set.hpp b/boost/intrusive/avl_set.hpp new file mode 100644 index 000000000..d150140ab --- /dev/null +++ b/boost/intrusive/avl_set.hpp @@ -0,0 +1,1073 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2007-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// +#ifndef BOOST_INTRUSIVE_AVL_SET_HPP +#define BOOST_INTRUSIVE_AVL_SET_HPP + +#include +#include +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +class avl_multiset_impl; +#endif + +//! The class template avl_set is an intrusive container, that mimics most of +//! the interface of std::set as described in the C++ standard. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<> and +//! \c compare<>. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class avl_set_impl +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + : public bstree_impl +#endif +{ + /// @cond + typedef bstree_impl tree_type; + BOOST_MOVABLE_BUT_NOT_COPYABLE(avl_set_impl) + + typedef tree_type implementation_defined; + /// @endcond + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::value_compare value_compare; + typedef typename implementation_defined::key_compare key_compare; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::reverse_iterator reverse_iterator; + typedef typename implementation_defined::const_reverse_iterator const_reverse_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + static const bool constant_time_size = tree_type::constant_time_size; + + public: + + //! @copydoc ::boost::intrusive::avltree::avltree() + avl_set_impl() + : tree_type() + {} + + //! @copydoc ::boost::intrusive::avltree::avltree(const key_compare &,const value_traits &) + explicit avl_set_impl( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : tree_type(cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::avltree::avltree(bool,Iterator,Iterator,const key_compare &,const value_traits &) + template + avl_set_impl( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(true, b, e, cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::avltree::avltree(avltree &&) + avl_set_impl(BOOST_RV_REF(avl_set_impl) x) + : tree_type(BOOST_MOVE_BASE(tree_type, x)) + {} + + //! @copydoc ::boost::intrusive::avltree::operator=(avltree &&) + avl_set_impl& operator=(BOOST_RV_REF(avl_set_impl) x) + { return static_cast(tree_type::operator=(BOOST_MOVE_BASE(tree_type, x))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::avltree::~avltree() + ~avl_set_impl(); + + //! @copydoc ::boost::intrusive::avltree::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::avltree::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::avltree::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::avltree::end() + iterator end(); + + //! @copydoc ::boost::intrusive::avltree::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::avltree::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::avltree::begin() + reverse_iterator avlegin(); + + //! @copydoc ::boost::intrusive::avltree::begin()const + const_reverse_iterator avlegin() const; + + //! @copydoc ::boost::intrusive::avltree::crbegin()const + const_reverse_iterator crbegin() const; + + //! @copydoc ::boost::intrusive::avltree::rend() + reverse_iterator rend(); + + //! @copydoc ::boost::intrusive::avltree::rend()const + const_reverse_iterator rend() const; + + //! @copydoc ::boost::intrusive::avltree::crend()const + const_reverse_iterator crend() const; + + //! @copydoc ::boost::intrusive::avltree::root() + iterator root(); + + //! @copydoc ::boost::intrusive::avltree::root()const + const_iterator root() const; + + //! @copydoc ::boost::intrusive::avltree::croot()const + const_iterator croot() const; + + //! @copydoc ::boost::intrusive::avltree::container_from_end_iterator(iterator) + static avl_set_impl &container_from_end_iterator(iterator end_iterator); + + //! @copydoc ::boost::intrusive::avltree::container_from_end_iterator(const_iterator) + static const avl_set_impl &container_from_end_iterator(const_iterator end_iterator); + + //! @copydoc ::boost::intrusive::avltree::container_from_iterator(iterator) + static avl_set_impl &container_from_iterator(iterator it); + + //! @copydoc ::boost::intrusive::avltree::container_from_iterator(const_iterator) + static const avl_set_impl &container_from_iterator(const_iterator it); + + //! @copydoc ::boost::intrusive::avltree::key_comp()const + key_compare key_comp() const; + + //! @copydoc ::boost::intrusive::avltree::value_comp()const + value_compare value_comp() const; + + //! @copydoc ::boost::intrusive::avltree::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::avltree::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::avltree::swap + void swap(avl_set_impl& other); + + //! @copydoc ::boost::intrusive::avltree::clone_from(const avltree&,Cloner,Disposer) + template + void clone_from(const avl_set_impl &src, Cloner cloner, Disposer disposer); + + #else + + using tree_type::clone_from; + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::avltree::clone_from(avltree&&,Cloner,Disposer) + template + void clone_from(BOOST_RV_REF(avl_set_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } + + //! @copydoc ::boost::intrusive::avltree::insert_unique(reference) + std::pair insert(reference value) + { return tree_type::insert_unique(value); } + + //! @copydoc ::boost::intrusive::avltree::insert_unique(const_iterator,reference) + iterator insert(const_iterator hint, reference value) + { return tree_type::insert_unique(hint, value); } + + //! @copydoc ::boost::intrusive::avltree::insert_unique_check(const key_type&,insert_commit_data&) + std::pair insert_check + (const key_type &key, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(key, commit_data); } + + //! @copydoc ::boost::intrusive::avltree::insert_unique_check(const_iterator,const key_type&,insert_commit_data&) + std::pair insert_check + (const_iterator hint, const key_type &key + ,insert_commit_data &commit_data) + { return tree_type::insert_unique_check(hint, key, commit_data); } + + //! @copydoc ::boost::intrusive::avltree::insert_unique_check(const KeyType&,KeyTypeKeyCompare,insert_commit_data&) + template + std::pair insert_check + (const KeyType &key, KeyTypeKeyCompare comp, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(key, comp, commit_data); } + + //! @copydoc ::boost::intrusive::avltree::insert_unique_check(const_iterator,const KeyType&,KeyTypeKeyCompare,insert_commit_data&) + template + std::pair insert_check + (const_iterator hint, const KeyType &key + ,KeyTypeKeyCompare comp, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(hint, key, comp, commit_data); } + + //! @copydoc ::boost::intrusive::avltree::insert_unique(Iterator,Iterator) + template + void insert(Iterator b, Iterator e) + { tree_type::insert_unique(b, e); } + + //! @copydoc ::boost::intrusive::avltree::insert_unique_commit + iterator insert_commit(reference value, const insert_commit_data &commit_data) + { return tree_type::insert_unique_commit(value, commit_data); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::avltree::insert_before + iterator insert_before(const_iterator pos, reference value); + + //! @copydoc ::boost::intrusive::avltree::push_back + void push_back(reference value); + + //! @copydoc ::boost::intrusive::avltree::push_front + void push_front(reference value); + + //! @copydoc ::boost::intrusive::avltree::erase(const_iterator) + iterator erase(const_iterator i); + + //! @copydoc ::boost::intrusive::avltree::erase(const_iterator,const_iterator) + iterator erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::avltree::erase(const key_type &key) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::avltree::erase(const KeyType&,KeyTypeKeyCompare) + template + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::avltree::erase_and_dispose(const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::avltree::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::avltree::erase_and_dispose(const key_type &, Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::avltree::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); + + //! @copydoc ::boost::intrusive::avltree::clear + void clear(); + + //! @copydoc ::boost::intrusive::avltree::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::avltree::count(const key_type &)const + size_type count(const key_type &key) const + { return static_cast(this->tree_type::find(key) != this->tree_type::cend()); } + + //! @copydoc ::boost::intrusive::avltree::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const + { return static_cast(this->tree_type::find(key, comp) != this->tree_type::cend()); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::avltree::lower_bound(const key_type &) + iterator lower_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::avltree::lower_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::avltree::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::avltree::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::avltree::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::avltree::upper_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::avltree::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::avltree::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::avltree::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::avltree::find(const KeyType&,KeyTypeKeyCompare) + template + iterator find(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::avltree::find(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::avltree::find(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::avltree::equal_range(const key_type &) + std::pair equal_range(const key_type &key) + { return this->tree_type::lower_bound_range(key); } + + //! @copydoc ::boost::intrusive::avltree::equal_range(const KeyType&,KeyTypeKeyCompare) + template + std::pair equal_range(const KeyType& key, KeyTypeKeyCompare comp) + { return this->tree_type::equal_range(key, comp); } + + //! @copydoc ::boost::intrusive::avltree::equal_range(const key_type &)const + std::pair + equal_range(const key_type &key) const + { return this->tree_type::lower_bound_range(key); } + + //! @copydoc ::boost::intrusive::avltree::equal_range(const KeyType&,KeyTypeKeyCompare)const + template + std::pair + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const + { return this->tree_type::equal_range(key, comp); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::avltree::bounded_range(const key_type &,const key_type &,bool,bool) + std::pair bounded_range + (const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::avltree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::avltree::bounded_range(const key_type &,const key_type &,bool,bool)const + std::pair + bounded_range(const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::avltree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::avltree::s_iterator_to(reference) + static iterator s_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::avltree::s_iterator_to(const_reference) + static const_iterator s_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::avltree::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::avltree::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::avltree::init_node(reference) + static void init_node(reference value); + + //! @copydoc ::boost::intrusive::avltree::unlink_leftmost_without_rebalance + pointer unlink_leftmost_without_rebalance(); + + //! @copydoc ::boost::intrusive::avltree::replace_node + void replace_node(iterator replace_this, reference with_this); + + //! @copydoc ::boost::intrusive::avltree::remove_node + void remove_node(reference value); + + //! @copydoc ::boost::intrusive::avltree::merge_unique + template + void merge(avl_set &source); + + //! @copydoc ::boost::intrusive::avltree::merge_unique + template + void merge(avl_multiset &source); + + #else + + template + void merge(avl_set_impl &source) + { return tree_type::merge_unique(source); } + + + template + void merge(avl_multiset_impl &source) + { return tree_type::merge_unique(source); } + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED +}; + +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +template +bool operator!= (const avl_set_impl &x, const avl_set_impl &y); + +template +bool operator>(const avl_set_impl &x, const avl_set_impl &y); + +template +bool operator<=(const avl_set_impl &x, const avl_set_impl &y); + +template +bool operator>=(const avl_set_impl &x, const avl_set_impl &y); + +template +void swap(avl_set_impl &x, avl_set_impl &y); + +#endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +//! Helper metafunction to define a \c set that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_avl_set +{ + /// @cond + typedef typename pack_options + < avltree_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef avl_set_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::compare + , typename packed_options::size_type + , packed_options::constant_time_size + , typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class avl_set + : public make_avl_set::type +{ + typedef typename make_avl_set + ::type Base; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(avl_set) + public: + typedef typename Base::key_compare key_compare; + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + + avl_set() + : Base() + {} + + explicit avl_set( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : Base(cmp, v_traits) + {} + + template + avl_set( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : Base(b, e, cmp, v_traits) + {} + + avl_set(BOOST_RV_REF(avl_set) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + avl_set& operator=(BOOST_RV_REF(avl_set) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + void clone_from(const avl_set &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(avl_set) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static avl_set &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const avl_set &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static avl_set &container_from_iterator(iterator it) + { return static_cast(Base::container_from_iterator(it)); } + + static const avl_set &container_from_iterator(const_iterator it) + { return static_cast(Base::container_from_iterator(it)); } +}; + +#endif + +//! The class template avl_multiset is an intrusive container, that mimics most of +//! the interface of std::_multiset as described in the C++ standard. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<> and +//! \c compare<>. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class avl_multiset_impl +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + : public bstree_impl +#endif +{ + /// @cond + typedef bstree_impl tree_type; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(avl_multiset_impl) + typedef tree_type implementation_defined; + /// @endcond + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::value_compare value_compare; + typedef typename implementation_defined::key_compare key_compare; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::reverse_iterator reverse_iterator; + typedef typename implementation_defined::const_reverse_iterator const_reverse_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + static const bool constant_time_size = tree_type::constant_time_size; + + public: + //! @copydoc ::boost::intrusive::avltree::avltree() + avl_multiset_impl() + : tree_type() + {} + + //! @copydoc ::boost::intrusive::avltree::avltree(const key_compare &,const value_traits &) + explicit avl_multiset_impl( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : tree_type(cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::avltree::avltree(bool,Iterator,Iterator,const key_compare &,const value_traits &) + template + avl_multiset_impl( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(false, b, e, cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::avltree::avltree(avltree &&) + avl_multiset_impl(BOOST_RV_REF(avl_multiset_impl) x) + : tree_type(BOOST_MOVE_BASE(tree_type, x)) + {} + + //! @copydoc ::boost::intrusive::avltree::operator=(avltree &&) + avl_multiset_impl& operator=(BOOST_RV_REF(avl_multiset_impl) x) + { return static_cast(tree_type::operator=(BOOST_MOVE_BASE(tree_type, x))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::avltree::~avltree() + ~avl_multiset_impl(); + + //! @copydoc ::boost::intrusive::avltree::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::avltree::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::avltree::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::avltree::end() + iterator end(); + + //! @copydoc ::boost::intrusive::avltree::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::avltree::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::avltree::rbegin() + reverse_iterator rbegin(); + + //! @copydoc ::boost::intrusive::avltree::rbegin()const + const_reverse_iterator rbegin() const; + + //! @copydoc ::boost::intrusive::avltree::crbegin()const + const_reverse_iterator crbegin() const; + + //! @copydoc ::boost::intrusive::avltree::rend() + reverse_iterator rend(); + + //! @copydoc ::boost::intrusive::avltree::rend()const + const_reverse_iterator rend() const; + + //! @copydoc ::boost::intrusive::avltree::crend()const + const_reverse_iterator crend() const; + + //! @copydoc ::boost::intrusive::avltree::root() + iterator root(); + + //! @copydoc ::boost::intrusive::avltree::root()const + const_iterator root() const; + + //! @copydoc ::boost::intrusive::avltree::croot()const + const_iterator croot() const; + + //! @copydoc ::boost::intrusive::avltree::container_from_end_iterator(iterator) + static avl_multiset_impl &container_from_end_iterator(iterator end_iterator); + + //! @copydoc ::boost::intrusive::avltree::container_from_end_iterator(const_iterator) + static const avl_multiset_impl &container_from_end_iterator(const_iterator end_iterator); + + //! @copydoc ::boost::intrusive::avltree::container_from_iterator(iterator) + static avl_multiset_impl &container_from_iterator(iterator it); + + //! @copydoc ::boost::intrusive::avltree::container_from_iterator(const_iterator) + static const avl_multiset_impl &container_from_iterator(const_iterator it); + + //! @copydoc ::boost::intrusive::avltree::key_comp()const + key_compare key_comp() const; + + //! @copydoc ::boost::intrusive::avltree::value_comp()const + value_compare value_comp() const; + + //! @copydoc ::boost::intrusive::avltree::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::avltree::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::avltree::swap + void swap(avl_multiset_impl& other); + + //! @copydoc ::boost::intrusive::avltree::clone_from(const avltree&,Cloner,Disposer) + template + void clone_from(const avl_multiset_impl &src, Cloner cloner, Disposer disposer); + + #else + + using tree_type::clone_from; + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::avltree::clone_from(avltree&&,Cloner,Disposer) + template + void clone_from(BOOST_RV_REF(avl_multiset_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } + + //! @copydoc ::boost::intrusive::avltree::insert_equal(reference) + iterator insert(reference value) + { return tree_type::insert_equal(value); } + + //! @copydoc ::boost::intrusive::avltree::insert_equal(const_iterator,reference) + iterator insert(const_iterator hint, reference value) + { return tree_type::insert_equal(hint, value); } + + //! @copydoc ::boost::intrusive::avltree::insert_equal(Iterator,Iterator) + template + void insert(Iterator b, Iterator e) + { tree_type::insert_equal(b, e); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::avltree::insert_before + iterator insert_before(const_iterator pos, reference value); + + //! @copydoc ::boost::intrusive::avltree::push_back + void push_back(reference value); + + //! @copydoc ::boost::intrusive::avltree::push_front + void push_front(reference value); + + //! @copydoc ::boost::intrusive::avltree::erase(const_iterator) + iterator erase(const_iterator i); + + //! @copydoc ::boost::intrusive::avltree::erase(const_iterator,const_iterator) + iterator erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::avltree::erase(const key_type &) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::avltree::erase(const KeyType&,KeyTypeKeyCompare) + template + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::avltree::erase_and_dispose(const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::avltree::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::avltree::erase_and_dispose(const key_type &, Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::avltree::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); + + //! @copydoc ::boost::intrusive::avltree::clear + void clear(); + + //! @copydoc ::boost::intrusive::avltree::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + //! @copydoc ::boost::intrusive::avltree::count(const key_type &)const + size_type count(const key_type &key) const; + + //! @copydoc ::boost::intrusive::avltree::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::avltree::lower_bound(const key_type &) + iterator lower_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::avltree::lower_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::avltree::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::avltree::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::avltree::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::avltree::upper_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::avltree::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::avltree::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::avltree::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::avltree::find(const KeyType&,KeyTypeKeyCompare) + template + iterator find(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::avltree::find(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::avltree::find(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::avltree::equal_range(const key_type &) + std::pair equal_range(const key_type &key); + + //! @copydoc ::boost::intrusive::avltree::equal_range(const KeyType&,KeyTypeKeyCompare) + template + std::pair equal_range(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::avltree::equal_range(const key_type &)const + std::pair + equal_range(const key_type &key) const; + + //! @copydoc ::boost::intrusive::avltree::equal_range(const KeyType&,KeyTypeKeyCompare)const + template + std::pair + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::avltree::bounded_range(const key_type &,const key_type &,bool,bool) + std::pair bounded_range + (const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::avltree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::avltree::bounded_range(const key_type &,const key_type &,bool,bool)const + std::pair + bounded_range(const key_type &lower_key, const key_type &key upper_key, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::avltree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::avltree::s_iterator_to(reference) + static iterator s_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::avltree::s_iterator_to(const_reference) + static const_iterator s_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::avltree::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::avltree::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::avltree::init_node(reference) + static void init_node(reference value); + + //! @copydoc ::boost::intrusive::avltree::unlink_leftmost_without_rebalance + pointer unlink_leftmost_without_rebalance(); + + //! @copydoc ::boost::intrusive::avltree::replace_node + void replace_node(iterator replace_this, reference with_this); + + //! @copydoc ::boost::intrusive::avltree::remove_node + void remove_node(reference value); + + //! @copydoc ::boost::intrusive::avltree::merge_equal + template + void merge(avl_multiset &source); + + //! @copydoc ::boost::intrusive::avltree::merge_equal + template + void merge(avl_set &source); + + #else + + template + void merge(avl_multiset_impl &source) + { return tree_type::merge_equal(source); } + + template + void merge(avl_set_impl &source) + { return tree_type::merge_equal(source); } + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED +}; + +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +template +bool operator!= (const avl_multiset_impl &x, const avl_multiset_impl &y); + +template +bool operator>(const avl_multiset_impl &x, const avl_multiset_impl &y); + +template +bool operator<=(const avl_multiset_impl &x, const avl_multiset_impl &y); + +template +bool operator>=(const avl_multiset_impl &x, const avl_multiset_impl &y); + +template +void swap(avl_multiset_impl &x, avl_multiset_impl &y); + +#endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +//! Helper metafunction to define a \c avl_multiset that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_avl_multiset +{ + /// @cond + typedef typename pack_options + < avltree_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef avl_multiset_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::compare + , typename packed_options::size_type + , packed_options::constant_time_size + , typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class avl_multiset + : public make_avl_multiset::type +{ + typedef typename make_avl_multiset::type Base; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(avl_multiset) + + public: + typedef typename Base::key_compare key_compare; + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + + avl_multiset() + : Base() + {} + + explicit avl_multiset( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : Base(cmp, v_traits) + {} + + template + avl_multiset( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : Base(b, e, cmp, v_traits) + {} + + avl_multiset(BOOST_RV_REF(avl_multiset) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + avl_multiset& operator=(BOOST_RV_REF(avl_multiset) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + void clone_from(const avl_multiset &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(avl_multiset) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static avl_multiset &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const avl_multiset &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static avl_multiset &container_from_iterator(iterator it) + { return static_cast(Base::container_from_iterator(it)); } + + static const avl_multiset &container_from_iterator(const_iterator it) + { return static_cast(Base::container_from_iterator(it)); } +}; + +#endif + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_AVL_SET_HPP diff --git a/boost/intrusive/bs_set.hpp b/boost/intrusive/bs_set.hpp new file mode 100644 index 000000000..693b6d855 --- /dev/null +++ b/boost/intrusive/bs_set.hpp @@ -0,0 +1,1069 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2013-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// +#ifndef BOOST_INTRUSIVE_BS_SET_HPP +#define BOOST_INTRUSIVE_BS_SET_HPP + +#include +#include +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +class bs_multiset_impl; +#endif + +namespace boost { +namespace intrusive { + +//! The class template bs_set is an intrusive container, that mimics most of +//! the interface of std::set as described in the C++ standard. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<> and +//! \c compare<>. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class bs_set_impl +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + : public bstree_impl +#endif +{ + /// @cond + typedef bstree_impl tree_type; + BOOST_MOVABLE_BUT_NOT_COPYABLE(bs_set_impl) + + typedef tree_type implementation_defined; + /// @endcond + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::value_compare value_compare; + typedef typename implementation_defined::key_compare key_compare; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::reverse_iterator reverse_iterator; + typedef typename implementation_defined::const_reverse_iterator const_reverse_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + static const bool constant_time_size = tree_type::constant_time_size; + + public: + //! @copydoc ::boost::intrusive::bstree::bstree() + bs_set_impl() + : tree_type() + {} + + //! @copydoc ::boost::intrusive::bstree::bstree(const key_compare &,const value_traits &) + explicit bs_set_impl( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : tree_type(cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::bstree::bstree(bool,Iterator,Iterator,const key_compare &,const value_traits &) + template + bs_set_impl( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(true, b, e, cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::bstree::bstree(bstree &&) + bs_set_impl(BOOST_RV_REF(bs_set_impl) x) + : tree_type(BOOST_MOVE_BASE(tree_type, x)) + {} + + //! @copydoc ::boost::intrusive::bstree::operator=(bstree &&) + bs_set_impl& operator=(BOOST_RV_REF(bs_set_impl) x) + { return static_cast(tree_type::operator=(BOOST_MOVE_BASE(tree_type, x))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::bstree::~bstree() + ~bs_set_impl(); + + //! @copydoc ::boost::intrusive::bstree::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::bstree::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::bstree::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::bstree::end() + iterator end(); + + //! @copydoc ::boost::intrusive::bstree::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::bstree::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::bstree::rbegin() + reverse_iterator rbegin(); + + //! @copydoc ::boost::intrusive::bstree::rbegin()const + const_reverse_iterator rbegin() const; + + //! @copydoc ::boost::intrusive::bstree::crbegin()const + const_reverse_iterator crbegin() const; + + //! @copydoc ::boost::intrusive::bstree::rend() + reverse_iterator rend(); + + //! @copydoc ::boost::intrusive::bstree::rend()const + const_reverse_iterator rend() const; + + //! @copydoc ::boost::intrusive::bstree::crend()const + const_reverse_iterator crend() const; + + //! @copydoc ::boost::intrusive::bstree::root() + iterator root(); + + //! @copydoc ::boost::intrusive::bstree::root()const + const_iterator root() const; + + //! @copydoc ::boost::intrusive::bstree::croot()const + const_iterator croot() const; + + //! @copydoc ::boost::intrusive::bstree::container_from_end_iterator(iterator) + static bs_set_impl &container_from_end_iterator(iterator end_iterator); + + //! @copydoc ::boost::intrusive::bstree::container_from_end_iterator(const_iterator) + static const bs_set_impl &container_from_end_iterator(const_iterator end_iterator); + + //! @copydoc ::boost::intrusive::bstree::container_from_iterator(iterator) + static bs_set_impl &container_from_iterator(iterator it); + + //! @copydoc ::boost::intrusive::bstree::container_from_iterator(const_iterator) + static const bs_set_impl &container_from_iterator(const_iterator it); + + //! @copydoc ::boost::intrusive::bstree::key_comp()const + key_compare key_comp() const; + + //! @copydoc ::boost::intrusive::bstree::value_comp()const + value_compare value_comp() const; + + //! @copydoc ::boost::intrusive::bstree::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::bstree::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::bstree::swap + void swap(bs_set_impl& other); + + //! @copydoc ::boost::intrusive::bstree::clone_from(const bstree&,Cloner,Disposer) + template + void clone_from(const bs_set_impl &src, Cloner cloner, Disposer disposer); + + #else + + using tree_type::clone_from; + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::bstree::clone_from(bstree&&,Cloner,Disposer) + template + void clone_from(BOOST_RV_REF(bs_set_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } + + //! @copydoc ::boost::intrusive::bstree::insert_unique(reference) + std::pair insert(reference value) + { return tree_type::insert_unique(value); } + + //! @copydoc ::boost::intrusive::bstree::insert_unique(const_iterator,reference) + iterator insert(const_iterator hint, reference value) + { return tree_type::insert_unique(hint, value); } + + //! @copydoc ::boost::intrusive::bstree::insert_unique_check(const key_type&,insert_commit_data&) + std::pair insert_check + (const key_type &key, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(key, commit_data); } + + //! @copydoc ::boost::intrusive::bstree::insert_unique_check(const_iterator,const key_type&,insert_commit_data&) + std::pair insert_check + (const_iterator hint, const key_type &key + ,insert_commit_data &commit_data) + { return tree_type::insert_unique_check(hint, key, commit_data); } + + //! @copydoc ::boost::intrusive::bstree::insert_unique_check(const KeyType&,KeyTypeKeyCompare,insert_commit_data&) + template + std::pair insert_check + (const KeyType &key, KeyTypeKeyCompare comp, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(key, comp, commit_data); } + + //! @copydoc ::boost::intrusive::bstree::insert_unique_check(const_iterator,const KeyType&,KeyTypeKeyCompare,insert_commit_data&) + template + std::pair insert_check + (const_iterator hint, const KeyType &key + ,KeyTypeKeyCompare comp, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(hint, key, comp, commit_data); } + + //! @copydoc ::boost::intrusive::bstree::insert_unique(Iterator,Iterator) + template + void insert(Iterator b, Iterator e) + { tree_type::insert_unique(b, e); } + + //! @copydoc ::boost::intrusive::bstree::insert_unique_commit + iterator insert_commit(reference value, const insert_commit_data &commit_data) + { return tree_type::insert_unique_commit(value, commit_data); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::bstree::insert_before + iterator insert_before(const_iterator pos, reference value); + + //! @copydoc ::boost::intrusive::bstree::push_back + void push_back(reference value); + + //! @copydoc ::boost::intrusive::bstree::push_front + void push_front(reference value); + + //! @copydoc ::boost::intrusive::bstree::erase(const_iterator) + iterator erase(const_iterator i); + + //! @copydoc ::boost::intrusive::bstree::erase(const_iterator,const_iterator) + iterator erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::bstree::erase(const key_type &) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::bstree::erase(const KeyType&,KeyTypeKeyCompare) + template + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const key_type &, Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); + + //! @copydoc ::boost::intrusive::bstree::clear + void clear(); + + //! @copydoc ::boost::intrusive::bstree::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::bstree::count(const key_type &)const + size_type count(const key_type &key) const + { return static_cast(this->tree_type::find(key) != this->tree_type::cend()); } + + //! @copydoc ::boost::intrusive::bstree::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const + { return static_cast(this->tree_type::find(key, comp) != this->tree_type::cend()); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::bstree::lower_bound(const key_type &) + iterator lower_bound(const key_type &); + + //! @copydoc ::boost::intrusive::bstree::lower_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::bstree::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::bstree::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::bstree::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::bstree::upper_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::bstree::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::bstree::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::bstree::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::bstree::find(const KeyType&,KeyTypeKeyCompare) + template + iterator find(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::bstree::find(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::bstree::find(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::bstree::equal_range(const key_type &) + std::pair equal_range(const key_type &key) + { return this->tree_type::lower_bound_range(key); } + + //! @copydoc ::boost::intrusive::bstree::equal_range(const KeyType&,KeyTypeKeyCompare) + template + std::pair equal_range(const KeyType& key, KeyTypeKeyCompare comp) + { return this->tree_type::equal_range(key, comp); } + + //! @copydoc ::boost::intrusive::bstree::equal_range(const key_type &)const + std::pair + equal_range(const key_type &key) const + { return this->tree_type::lower_bound_range(key); } + + //! @copydoc ::boost::intrusive::bstree::equal_range(const KeyType&,KeyTypeKeyCompare)const + template + std::pair + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const + { return this->tree_type::equal_range(key, comp); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::bstree::bounded_range(const key_type&,const key_type&,bool,bool) + std::pair bounded_range + (const key_type& lower_key, const key_type& upper_key, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::bstree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::bstree::bounded_range(const key_type&,const key_type&,bool,bool)const + std::pair + bounded_range(const key_type& lower_key, const key_type& upper_key, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::bstree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::bstree::s_iterator_to(reference) + static iterator s_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::bstree::s_iterator_to(const_reference) + static const_iterator s_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::bstree::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::bstree::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::bstree::init_node(reference) + static void init_node(reference value); + + //! @copydoc ::boost::intrusive::bstree::unlink_leftmost_without_rebalance + pointer unlink_leftmost_without_rebalance(); + + //! @copydoc ::boost::intrusive::bstree::replace_node + void replace_node(iterator replace_this, reference with_this); + + //! @copydoc ::boost::intrusive::bstree::remove_node + void remove_node(reference value); + + //! @copydoc ::boost::intrusive::bstree::merge_unique + template + void merge(bs_set &source); + + //! @copydoc ::boost::intrusive::bstree::merge_unique + template + void merge(bs_multiset &source); + + #else + + template + void merge(bs_set_impl &source) + { return tree_type::merge_unique(source); } + + + template + void merge(bs_multiset_impl &source) + { return tree_type::merge_unique(source); } + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED +}; + +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +template +bool operator!= (const bs_set_impl &x, const bs_set_impl &y); + +template +bool operator>(const bs_set_impl &x, const bs_set_impl &y); + +template +bool operator<=(const bs_set_impl &x, const bs_set_impl &y); + +template +bool operator>=(const bs_set_impl &x, const bs_set_impl &y); + +template +void swap(bs_set_impl &x, bs_set_impl &y); + +#endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +//! Helper metafunction to define a \c bs_set that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_bs_set +{ + /// @cond + typedef typename pack_options + < bstree_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef bs_set_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::compare + , typename packed_options::size_type + , packed_options::constant_time_size + , typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class bs_set + : public make_bs_set::type +{ + typedef typename make_bs_set + ::type Base; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(bs_set) + public: + typedef typename Base::value_traits value_traits; + typedef typename Base::key_compare key_compare; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + + bs_set() + : Base() + {} + + explicit bs_set( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : Base(cmp, v_traits) + {} + + template + bs_set( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : Base(b, e, cmp, v_traits) + {} + + bs_set(BOOST_RV_REF(bs_set) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + bs_set& operator=(BOOST_RV_REF(bs_set) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + void clone_from(const bs_set &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(bs_set) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static bs_set &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const bs_set &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static bs_set &container_from_iterator(iterator it) + { return static_cast(Base::container_from_iterator(it)); } + + static const bs_set &container_from_iterator(const_iterator it) + { return static_cast(Base::container_from_iterator(it)); } +}; + +#endif + +//! The class template bs_multiset is an intrusive container, that mimics most of +//! the interface of std::multiset as described in the C++ standard. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<> and +//! \c compare<>. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class bs_multiset_impl +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + : public bstree_impl +#endif +{ + /// @cond + typedef bstree_impl tree_type; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(bs_multiset_impl) + typedef tree_type implementation_defined; + /// @endcond + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::value_compare value_compare; + typedef typename implementation_defined::key_compare key_compare; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::reverse_iterator reverse_iterator; + typedef typename implementation_defined::const_reverse_iterator const_reverse_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + static const bool constant_time_size = tree_type::constant_time_size; + + public: + //! @copydoc ::boost::intrusive::bstree::bstree() + bs_multiset_impl() + : tree_type() + {} + + //! @copydoc ::boost::intrusive::bstree::bstree(const key_compare &,const value_traits &) + explicit bs_multiset_impl( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : tree_type(cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::bstree::bstree(bool,Iterator,Iterator,const key_compare &,const value_traits &) + template + bs_multiset_impl( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(false, b, e, cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::bstree::bstree(bstree &&) + bs_multiset_impl(BOOST_RV_REF(bs_multiset_impl) x) + : tree_type(BOOST_MOVE_BASE(tree_type, x)) + {} + + //! @copydoc ::boost::intrusive::bstree::operator=(bstree &&) + bs_multiset_impl& operator=(BOOST_RV_REF(bs_multiset_impl) x) + { return static_cast(tree_type::operator=(BOOST_MOVE_BASE(tree_type, x))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::bstree::~bstree() + ~bs_multiset_impl(); + + //! @copydoc ::boost::intrusive::bstree::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::bstree::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::bstree::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::bstree::end() + iterator end(); + + //! @copydoc ::boost::intrusive::bstree::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::bstree::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::bstree::rbegin() + reverse_iterator rbegin(); + + //! @copydoc ::boost::intrusive::bstree::rbegin()const + const_reverse_iterator rbegin() const; + + //! @copydoc ::boost::intrusive::bstree::crbegin()const + const_reverse_iterator crbegin() const; + + //! @copydoc ::boost::intrusive::bstree::rend() + reverse_iterator rend(); + + //! @copydoc ::boost::intrusive::bstree::rend()const + const_reverse_iterator rend() const; + + //! @copydoc ::boost::intrusive::bstree::crend()const + const_reverse_iterator crend() const; + + //! @copydoc ::boost::intrusive::bstree::root() + iterator root(); + + //! @copydoc ::boost::intrusive::bstree::root()const + const_iterator root() const; + + //! @copydoc ::boost::intrusive::bstree::croot()const + const_iterator croot() const; + + //! @copydoc ::boost::intrusive::bstree::container_from_end_iterator(iterator) + static bs_multiset_impl &container_from_end_iterator(iterator end_iterator); + + //! @copydoc ::boost::intrusive::bstree::container_from_end_iterator(const_iterator) + static const bs_multiset_impl &container_from_end_iterator(const_iterator end_iterator); + + //! @copydoc ::boost::intrusive::bstree::container_from_iterator(iterator) + static bs_multiset_impl &container_from_iterator(iterator it); + + //! @copydoc ::boost::intrusive::bstree::container_from_iterator(const_iterator) + static const bs_multiset_impl &container_from_iterator(const_iterator it); + + //! @copydoc ::boost::intrusive::bstree::key_comp()const + key_compare key_comp() const; + + //! @copydoc ::boost::intrusive::bstree::value_comp()const + value_compare value_comp() const; + + //! @copydoc ::boost::intrusive::bstree::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::bstree::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::bstree::swap + void swap(bs_multiset_impl& other); + + //! @copydoc ::boost::intrusive::bstree::clone_from(const bstree&,Cloner,Disposer) + template + void clone_from(const bs_multiset_impl &src, Cloner cloner, Disposer disposer); + + #else + + using tree_type::clone_from; + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::bstree::clone_from(bstree&&,Cloner,Disposer) + template + void clone_from(BOOST_RV_REF(bs_multiset_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } + + //! @copydoc ::boost::intrusive::bstree::insert_equal(reference) + iterator insert(reference value) + { return tree_type::insert_equal(value); } + + //! @copydoc ::boost::intrusive::bstree::insert_equal(const_iterator,reference) + iterator insert(const_iterator hint, reference value) + { return tree_type::insert_equal(hint, value); } + + //! @copydoc ::boost::intrusive::bstree::insert_equal(Iterator,Iterator) + template + void insert(Iterator b, Iterator e) + { tree_type::insert_equal(b, e); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::bstree::insert_before + iterator insert_before(const_iterator pos, reference value); + + //! @copydoc ::boost::intrusive::bstree::push_back + void push_back(reference value); + + //! @copydoc ::boost::intrusive::bstree::push_front + void push_front(reference value); + + //! @copydoc ::boost::intrusive::bstree::erase(const_iterator) + iterator erase(const_iterator i); + + //! @copydoc ::boost::intrusive::bstree::erase(const_iterator,const_iterator) + iterator erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::bstree::erase(const key_type &) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::bstree::erase(const KeyType&,KeyTypeKeyCompare) + template + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const key_type &, Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::bstree::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); + + //! @copydoc ::boost::intrusive::bstree::clear + void clear(); + + //! @copydoc ::boost::intrusive::bstree::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + //! @copydoc ::boost::intrusive::bstree::count(const key_type &)const + size_type count(const key_type &key) const; + + //! @copydoc ::boost::intrusive::bstree::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::bstree::lower_bound(const key_type &) + iterator lower_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::bstree::lower_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::bstree::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::bstree::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::bstree::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::bstree::upper_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::bstree::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::bstree::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::bstree::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::bstree::find(const KeyType&,KeyTypeKeyCompare) + template + iterator find(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::bstree::find(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::bstree::find(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::bstree::equal_range(const key_type &) + std::pair equal_range(const key_type &key); + + //! @copydoc ::boost::intrusive::bstree::equal_range(const KeyType&,KeyTypeKeyCompare) + template + std::pair equal_range(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::bstree::equal_range(const key_type &)const + std::pair + equal_range(const key_type &key) const; + + //! @copydoc ::boost::intrusive::bstree::equal_range(const KeyType&,KeyTypeKeyCompare)const + template + std::pair + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::bstree::bounded_range(const key_type &,const key_type &,bool,bool) + std::pair bounded_range + (const key_type & lower_key, const key_type & upper_key, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::bstree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::bstree::bounded_range(const key_type &,const key_type &,bool,bool)const + std::pair + bounded_range(const key_type & lower_key, const key_type & upper_key, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::bstree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::bstree::s_iterator_to(reference) + static iterator s_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::bstree::s_iterator_to(const_reference) + static const_iterator s_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::bstree::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::bstree::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::bstree::init_node(reference) + static void init_node(reference value); + + //! @copydoc ::boost::intrusive::bstree::unlink_leftmost_without_rebalance + pointer unlink_leftmost_without_rebalance(); + + //! @copydoc ::boost::intrusive::bstree::replace_node + void replace_node(iterator replace_this, reference with_this); + + //! @copydoc ::boost::intrusive::bstree::remove_node + void remove_node(reference value); + + //! @copydoc ::boost::intrusive::bstree::merge_equal + template + void merge(bs_multiset &source); + + //! @copydoc ::boost::intrusive::bstree::merge_equal + template + void merge(bs_set &source); + + #else + + template + void merge(bs_multiset_impl &source) + { return tree_type::merge_equal(source); } + + template + void merge(bs_set_impl &source) + { return tree_type::merge_equal(source); } + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED +}; + +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +template +bool operator!= (const bs_multiset_impl &x, const bs_multiset_impl &y); + +template +bool operator>(const bs_multiset_impl &x, const bs_multiset_impl &y); + +template +bool operator<=(const bs_multiset_impl &x, const bs_multiset_impl &y); + +template +bool operator>=(const bs_multiset_impl &x, const bs_multiset_impl &y); + +template +void swap(bs_multiset_impl &x, bs_multiset_impl &y); + +#endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +//! Helper metafunction to define a \c bs_multiset that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_bs_multiset +{ + /// @cond + typedef typename pack_options + < bstree_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef bs_multiset_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::compare + , typename packed_options::size_type + , packed_options::constant_time_size + , typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class bs_multiset + : public make_bs_multiset::type +{ + typedef typename make_bs_multiset::type Base; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(bs_multiset) + + public: + typedef typename Base::key_compare key_compare; + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + + bs_multiset() + : Base() + {} + + explicit bs_multiset( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : Base(cmp, v_traits) + {} + + template + bs_multiset( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : Base(b, e, cmp, v_traits) + {} + + bs_multiset(BOOST_RV_REF(bs_multiset) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + bs_multiset& operator=(BOOST_RV_REF(bs_multiset) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + void clone_from(const bs_multiset &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(bs_multiset) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static bs_multiset &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const bs_multiset &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static bs_multiset &container_from_iterator(iterator it) + { return static_cast(Base::container_from_iterator(it)); } + + static const bs_multiset &container_from_iterator(const_iterator it) + { return static_cast(Base::container_from_iterator(it)); } +}; + +#endif + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_BS_SET_HPP diff --git a/boost/intrusive/circular_list_algorithms.hpp b/boost/intrusive/circular_list_algorithms.hpp new file mode 100644 index 000000000..72eae326d --- /dev/null +++ b/boost/intrusive/circular_list_algorithms.hpp @@ -0,0 +1,468 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Olaf Krzikalla 2004-2006. +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_CIRCULAR_LIST_ALGORITHMS_HPP +#define BOOST_INTRUSIVE_CIRCULAR_LIST_ALGORITHMS_HPP + +#include +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +//! circular_list_algorithms provides basic algorithms to manipulate nodes +//! forming a circular doubly linked list. An empty circular list is formed by a node +//! whose pointers point to itself. +//! +//! circular_list_algorithms is configured with a NodeTraits class, which encapsulates the +//! information about the node to be manipulated. NodeTraits must support the +//! following interface: +//! +//! Typedefs: +//! +//! node: The type of the node that forms the circular list +//! +//! node_ptr: A pointer to a node +//! +//! const_node_ptr: A pointer to a const node +//! +//! Static functions: +//! +//! static node_ptr get_previous(const_node_ptr n); +//! +//! static void set_previous(node_ptr n, node_ptr prev); +//! +//! static node_ptr get_next(const_node_ptr n); +//! +//! static void set_next(node_ptr n, node_ptr next); +template +class circular_list_algorithms +{ + public: + typedef typename NodeTraits::node node; + typedef typename NodeTraits::node_ptr node_ptr; + typedef typename NodeTraits::const_node_ptr const_node_ptr; + typedef NodeTraits node_traits; + + //! Effects: Constructs an non-used list element, so that + //! inited(this_node) == true + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + BOOST_INTRUSIVE_FORCEINLINE static void init(const node_ptr &this_node) + { + const node_ptr null_node((node_ptr())); + NodeTraits::set_next(this_node, null_node); + NodeTraits::set_previous(this_node, null_node); + } + + //! Effects: Returns true is "this_node" is in a non-used state + //! as if it was initialized by the "init" function. + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + BOOST_INTRUSIVE_FORCEINLINE static bool inited(const const_node_ptr &this_node) + { return !NodeTraits::get_next(this_node); } + + //! Effects: Constructs an empty list, making this_node the only + //! node of the circular list: + //! NodeTraits::get_next(this_node) == NodeTraits::get_previous(this_node) + //! == this_node. + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + BOOST_INTRUSIVE_FORCEINLINE static void init_header(const node_ptr &this_node) + { + NodeTraits::set_next(this_node, this_node); + NodeTraits::set_previous(this_node, this_node); + } + + + //! Requires: this_node must be in a circular list or be an empty circular list. + //! + //! Effects: Returns true is "this_node" is the only node of a circular list: + //! return NodeTraits::get_next(this_node) == this_node + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + BOOST_INTRUSIVE_FORCEINLINE static bool unique(const const_node_ptr &this_node) + { + node_ptr next = NodeTraits::get_next(this_node); + return !next || next == this_node; + } + + //! Requires: this_node must be in a circular list or be an empty circular list. + //! + //! Effects: Returns the number of nodes in a circular list. If the circular list + //! is empty, returns 1. + //! + //! Complexity: Linear + //! + //! Throws: Nothing. + static std::size_t count(const const_node_ptr &this_node) + { + std::size_t result = 0; + const_node_ptr p = this_node; + do{ + p = NodeTraits::get_next(p); + ++result; + }while (p != this_node); + return result; + } + + //! Requires: this_node must be in a circular list or be an empty circular list. + //! + //! Effects: Unlinks the node from the circular list. + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + BOOST_INTRUSIVE_FORCEINLINE static node_ptr unlink(const node_ptr &this_node) + { + node_ptr next(NodeTraits::get_next(this_node)); + node_ptr prev(NodeTraits::get_previous(this_node)); + NodeTraits::set_next(prev, next); + NodeTraits::set_previous(next, prev); + return next; + } + + //! Requires: b and e must be nodes of the same circular list or an empty range. + //! + //! Effects: Unlinks the node [b, e) from the circular list. + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + BOOST_INTRUSIVE_FORCEINLINE static void unlink(const node_ptr &b, const node_ptr &e) + { + if (b != e) { + node_ptr prevb(NodeTraits::get_previous(b)); + NodeTraits::set_previous(e, prevb); + NodeTraits::set_next(prevb, e); + } + } + + //! Requires: nxt_node must be a node of a circular list. + //! + //! Effects: Links this_node before nxt_node in the circular list. + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + BOOST_INTRUSIVE_FORCEINLINE static void link_before(const node_ptr &nxt_node, const node_ptr &this_node) + { + node_ptr prev(NodeTraits::get_previous(nxt_node)); + NodeTraits::set_previous(this_node, prev); + NodeTraits::set_next(this_node, nxt_node); + //nxt_node might be an alias for prev->next_ + //so use it before NodeTraits::set_next(prev, ...) + //is called and the reference changes its value + NodeTraits::set_previous(nxt_node, this_node); + NodeTraits::set_next(prev, this_node); + } + + //! Requires: prev_node must be a node of a circular list. + //! + //! Effects: Links this_node after prev_node in the circular list. + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + BOOST_INTRUSIVE_FORCEINLINE static void link_after(const node_ptr &prev_node, const node_ptr &this_node) + { + node_ptr next(NodeTraits::get_next(prev_node)); + NodeTraits::set_previous(this_node, prev_node); + NodeTraits::set_next(this_node, next); + //prev_node might be an alias for next->next_ + //so use it before update it before NodeTraits::set_previous(next, ...) + //is called and the reference changes it's value + NodeTraits::set_next(prev_node, this_node); + NodeTraits::set_previous(next, this_node); + } + + //! Requires: this_node and other_node must be nodes inserted + //! in circular lists or be empty circular lists. + //! + //! Effects: Swaps the position of the nodes: this_node is inserted in + //! other_nodes position in the second circular list and the other_node is inserted + //! in this_node's position in the first circular list. + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + static void swap_nodes(const node_ptr &this_node, const node_ptr &other_node) + { + if (other_node == this_node) + return; + bool this_inited = inited(this_node); + bool other_inited = inited(other_node); + if(this_inited){ + init_header(this_node); + } + if(other_inited){ + init_header(other_node); + } + + node_ptr next_this(NodeTraits::get_next(this_node)); + node_ptr prev_this(NodeTraits::get_previous(this_node)); + node_ptr next_other(NodeTraits::get_next(other_node)); + node_ptr prev_other(NodeTraits::get_previous(other_node)); + //these first two swaps must happen before the other two + swap_prev(next_this, next_other); + swap_next(prev_this, prev_other); + swap_next(this_node, other_node); + swap_prev(this_node, other_node); + + if(this_inited){ + init(other_node); + } + if(other_inited){ + init(this_node); + } + } + + //! Requires: b and e must be nodes of the same circular list or an empty range. + //! and p must be a node of a different circular list or may not be an iterator in + // [b, e). + //! + //! Effects: Removes the nodes from [b, e) range from their circular list and inserts + //! them before p in p's circular list. + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + static void transfer(const node_ptr &p, const node_ptr &b, const node_ptr &e) + { + if (b != e) { + node_ptr prev_p(NodeTraits::get_previous(p)); + node_ptr prev_b(NodeTraits::get_previous(b)); + node_ptr prev_e(NodeTraits::get_previous(e)); + NodeTraits::set_next(prev_e, p); + NodeTraits::set_previous(p, prev_e); + NodeTraits::set_next(prev_b, e); + NodeTraits::set_previous(e, prev_b); + NodeTraits::set_next(prev_p, b); + NodeTraits::set_previous(b, prev_p); + } + } + + //! Requires: i must a node of a circular list + //! and p must be a node of a different circular list. + //! + //! Effects: Removes the node i from its circular list and inserts + //! it before p in p's circular list. + //! If p == i or p == NodeTraits::get_next(i), this function is a null operation. + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + static void transfer(const node_ptr &p, const node_ptr &i) + { + node_ptr n(NodeTraits::get_next(i)); + if(n != p && i != p){ + node_ptr prev_p(NodeTraits::get_previous(p)); + node_ptr prev_i(NodeTraits::get_previous(i)); + NodeTraits::set_next(prev_p, i); + NodeTraits::set_previous(i, prev_p); + NodeTraits::set_next(i, p); + NodeTraits::set_previous(p, i); + NodeTraits::set_previous(n, prev_i); + NodeTraits::set_next(prev_i, n); + + } + } + + //! Effects: Reverses the order of elements in the list. + //! + //! Throws: Nothing. + //! + //! Complexity: This function is linear time. + static void reverse(const node_ptr &p) + { + node_ptr f(NodeTraits::get_next(p)); + node_ptr i(NodeTraits::get_next(f)), e(p); + + while(i != e) { + node_ptr n = i; + i = NodeTraits::get_next(i); + transfer(f, n, i); + f = n; + } + } + + //! Effects: Moves the node p n positions towards the end of the list. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of moved positions. + static void move_backwards(const node_ptr &p, std::size_t n) + { + //Null shift, nothing to do + if(!n) return; + node_ptr first = NodeTraits::get_next(p); + //size() == 0 or 1, nothing to do + if(first == NodeTraits::get_previous(p)) return; + unlink(p); + //Now get the new first node + while(n--){ + first = NodeTraits::get_next(first); + } + link_before(first, p); + } + + //! Effects: Moves the node p n positions towards the beginning of the list. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of moved positions. + static void move_forward(const node_ptr &p, std::size_t n) + { + //Null shift, nothing to do + if(!n) return; + node_ptr last = NodeTraits::get_previous(p); + //size() == 0 or 1, nothing to do + if(last == NodeTraits::get_next(p)) return; + + unlink(p); + //Now get the new last node + while(n--){ + last = NodeTraits::get_previous(last); + } + link_after(last, p); + } + + //! Requires: f and l must be in a circular list. + //! + //! Effects: Returns the number of nodes in the range [f, l). + //! + //! Complexity: Linear + //! + //! Throws: Nothing. + static std::size_t distance(const const_node_ptr &f, const const_node_ptr &l) + { + const_node_ptr i(f); + std::size_t result = 0; + while(i != l){ + i = NodeTraits::get_next(i); + ++result; + } + return result; + } + + struct stable_partition_info + { + std::size_t num_1st_partition; + std::size_t num_2nd_partition; + node_ptr beg_2st_partition; + }; + + template + static void stable_partition(node_ptr beg, const node_ptr &end, Pred pred, stable_partition_info &info) + { + node_ptr bcur = node_traits::get_previous(beg); + node_ptr cur = beg; + node_ptr new_f = end; + + std::size_t num1 = 0, num2 = 0; + while(cur != end){ + if(pred(cur)){ + ++num1; + bcur = cur; + cur = node_traits::get_next(cur); + } + else{ + ++num2; + node_ptr last_to_remove = bcur; + new_f = cur; + bcur = cur; + cur = node_traits::get_next(cur); + BOOST_TRY{ + //Main loop + while(cur != end){ + if(pred(cur)){ //Might throw + ++num1; + //Process current node + node_traits::set_next (last_to_remove, cur); + node_traits::set_previous(cur, last_to_remove); + last_to_remove = cur; + node_ptr nxt = node_traits::get_next(cur); + node_traits::set_next (bcur, nxt); + node_traits::set_previous(nxt, bcur); + cur = nxt; + } + else{ + ++num2; + bcur = cur; + cur = node_traits::get_next(cur); + } + } + } + BOOST_CATCH(...){ + node_traits::set_next (last_to_remove, new_f); + node_traits::set_previous(new_f, last_to_remove); + BOOST_RETHROW; + } + BOOST_CATCH_END + node_traits::set_next(last_to_remove, new_f); + node_traits::set_previous(new_f, last_to_remove); + break; + } + } + info.num_1st_partition = num1; + info.num_2nd_partition = num2; + info.beg_2st_partition = new_f; + } + + private: + BOOST_INTRUSIVE_FORCEINLINE static void swap_prev(const node_ptr &this_node, const node_ptr &other_node) + { + node_ptr temp(NodeTraits::get_previous(this_node)); + NodeTraits::set_previous(this_node, NodeTraits::get_previous(other_node)); + NodeTraits::set_previous(other_node, temp); + } + + BOOST_INTRUSIVE_FORCEINLINE static void swap_next(const node_ptr &this_node, const node_ptr &other_node) + { + node_ptr temp(NodeTraits::get_next(this_node)); + NodeTraits::set_next(this_node, NodeTraits::get_next(other_node)); + NodeTraits::set_next(other_node, temp); + } +}; + +/// @cond + +template +struct get_algo +{ + typedef circular_list_algorithms type; +}; + +/// @endcond + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_CIRCULAR_LIST_ALGORITHMS_HPP diff --git a/boost/intrusive/derivation_value_traits.hpp b/boost/intrusive/derivation_value_traits.hpp new file mode 100644 index 000000000..06991983f --- /dev/null +++ b/boost/intrusive/derivation_value_traits.hpp @@ -0,0 +1,77 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_DERIVATION_VALUE_TRAITS_HPP +#define BOOST_INTRUSIVE_DERIVATION_VALUE_TRAITS_HPP + +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +//!This value traits template is used to create value traits +//!from user defined node traits where value_traits::value_type will +//!derive from node_traits::node + +template +struct derivation_value_traits +{ + public: + typedef NodeTraits node_traits; + typedef T value_type; + typedef typename node_traits::node node; + typedef typename node_traits::node_ptr node_ptr; + typedef typename node_traits::const_node_ptr const_node_ptr; + typedef typename pointer_traits:: + template rebind_pointer::type pointer; + typedef typename pointer_traits:: + template rebind_pointer::type const_pointer; + typedef typename boost::intrusive:: + pointer_traits::reference reference; + typedef typename boost::intrusive:: + pointer_traits::reference const_reference; + static const link_mode_type link_mode = LinkMode; + + static node_ptr to_node_ptr(reference value) + { return node_ptr(&value); } + + static const_node_ptr to_node_ptr(const_reference value) + { return node_ptr(&value); } + + static pointer to_value_ptr(const node_ptr &n) + { + return pointer_traits::pointer_to(static_cast(*n)); + } + + static const_pointer to_value_ptr(const const_node_ptr &n) + { + return pointer_traits::pointer_to(static_cast(*n)); + } +}; + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_DERIVATION_VALUE_TRAITS_HPP diff --git a/boost/intrusive/detail/any_node_and_algorithms.hpp b/boost/intrusive/detail/any_node_and_algorithms.hpp new file mode 100644 index 000000000..26a1edcd3 --- /dev/null +++ b/boost/intrusive/detail/any_node_and_algorithms.hpp @@ -0,0 +1,297 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_ANY_NODE_HPP +#define BOOST_INTRUSIVE_ANY_NODE_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include +#include +#include +#include + +namespace boost { +namespace intrusive { + +template +struct any_node +{ + typedef any_node node; + typedef typename pointer_rebind::type node_ptr; + typedef typename pointer_rebind::type const_node_ptr; + node_ptr node_ptr_1; + node_ptr node_ptr_2; + node_ptr node_ptr_3; + std::size_t size_t_1; +}; + +template +struct any_list_node_traits +{ + typedef any_node node; + typedef typename node::node_ptr node_ptr; + typedef typename node::const_node_ptr const_node_ptr; + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_next(const const_node_ptr & n) + { return n->node_ptr_1; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_next(const node_ptr & n, const node_ptr & next) + { n->node_ptr_1 = next; } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_previous(const const_node_ptr & n) + { return n->node_ptr_2; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_previous(const node_ptr & n, const node_ptr & prev) + { n->node_ptr_2 = prev; } +}; + + +template +struct any_slist_node_traits +{ + typedef any_node node; + typedef typename node::node_ptr node_ptr; + typedef typename node::const_node_ptr const_node_ptr; + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_next(const const_node_ptr & n) + { return n->node_ptr_1; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_next(const node_ptr & n, const node_ptr & next) + { n->node_ptr_1 = next; } +}; + + +template +struct any_unordered_node_traits + : public any_slist_node_traits +{ + typedef any_slist_node_traits reduced_slist_node_traits; + typedef typename reduced_slist_node_traits::node node; + typedef typename reduced_slist_node_traits::node_ptr node_ptr; + typedef typename reduced_slist_node_traits::const_node_ptr const_node_ptr; + + static const bool store_hash = true; + static const bool optimize_multikey = true; + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_next(const const_node_ptr & n) + { return n->node_ptr_1; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_next(const node_ptr & n, const node_ptr & next) + { n->node_ptr_1 = next; } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_prev_in_group(const const_node_ptr & n) + { return n->node_ptr_2; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_prev_in_group(const node_ptr & n, const node_ptr & prev) + { n->node_ptr_2 = prev; } + + BOOST_INTRUSIVE_FORCEINLINE static std::size_t get_hash(const const_node_ptr & n) + { return n->size_t_1; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_hash(const node_ptr & n, std::size_t h) + { n->size_t_1 = h; } +}; + + +template +struct any_rbtree_node_traits +{ + typedef any_node node; + typedef typename node::node_ptr node_ptr; + typedef typename node::const_node_ptr const_node_ptr; + + typedef std::size_t color; + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_parent(const const_node_ptr & n) + { return n->node_ptr_1; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_parent(const node_ptr & n, const node_ptr & p) + { n->node_ptr_1 = p; } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_left(const const_node_ptr & n) + { return n->node_ptr_2; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_left(const node_ptr & n, const node_ptr & l) + { n->node_ptr_2 = l; } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_right(const const_node_ptr & n) + { return n->node_ptr_3; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_right(const node_ptr & n, const node_ptr & r) + { n->node_ptr_3 = r; } + + BOOST_INTRUSIVE_FORCEINLINE static color get_color(const const_node_ptr & n) + { return n->size_t_1; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_color(const node_ptr & n, color c) + { n->size_t_1 = c; } + + BOOST_INTRUSIVE_FORCEINLINE static color black() + { return 0u; } + + BOOST_INTRUSIVE_FORCEINLINE static color red() + { return 1u; } +}; + + +template +struct any_avltree_node_traits +{ + typedef any_node node; + typedef typename node::node_ptr node_ptr; + typedef typename node::const_node_ptr const_node_ptr; + + typedef std::size_t balance; + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_parent(const const_node_ptr & n) + { return n->node_ptr_1; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_parent(const node_ptr & n, const node_ptr & p) + { n->node_ptr_1 = p; } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_left(const const_node_ptr & n) + { return n->node_ptr_2; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_left(const node_ptr & n, const node_ptr & l) + { n->node_ptr_2 = l; } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_right(const const_node_ptr & n) + { return n->node_ptr_3; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_right(const node_ptr & n, const node_ptr & r) + { n->node_ptr_3 = r; } + + BOOST_INTRUSIVE_FORCEINLINE static balance get_balance(const const_node_ptr & n) + { return n->size_t_1; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_balance(const node_ptr & n, balance b) + { n->size_t_1 = b; } + + BOOST_INTRUSIVE_FORCEINLINE static balance negative() + { return 0u; } + + BOOST_INTRUSIVE_FORCEINLINE static balance zero() + { return 1u; } + + BOOST_INTRUSIVE_FORCEINLINE static balance positive() + { return 2u; } +}; + + +template +struct any_tree_node_traits +{ + typedef any_node node; + typedef typename node::node_ptr node_ptr; + typedef typename node::const_node_ptr const_node_ptr; + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_parent(const const_node_ptr & n) + { return n->node_ptr_1; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_parent(const node_ptr & n, const node_ptr & p) + { n->node_ptr_1 = p; } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_left(const const_node_ptr & n) + { return n->node_ptr_2; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_left(const node_ptr & n, const node_ptr & l) + { n->node_ptr_2 = l; } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_right(const const_node_ptr & n) + { return n->node_ptr_3; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_right(const node_ptr & n, const node_ptr & r) + { n->node_ptr_3 = r; } +}; + +template +class any_node_traits +{ + public: + typedef any_node node; + typedef typename node::node_ptr node_ptr; + typedef typename node::const_node_ptr const_node_ptr; +}; + +template +class any_algorithms +{ + template + static void function_not_available_for_any_hooks(typename detail::enable_if >::type) + {} + + public: + typedef any_node node; + typedef typename node::node_ptr node_ptr; + typedef typename node::const_node_ptr const_node_ptr; + typedef any_node_traits node_traits; + + //! Requires: node must not be part of any tree. + //! + //! Effects: After the function unique(node) == true. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + //! + //! Nodes: If node is inserted in a tree, this function corrupts the tree. + BOOST_INTRUSIVE_FORCEINLINE static void init(const node_ptr & node) + { node->node_ptr_1 = node_ptr(); }; + + //! Effects: Returns true if node is in the same state as if called init(node) + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + BOOST_INTRUSIVE_FORCEINLINE static bool inited(const const_node_ptr & node) + { return !node->node_ptr_1; }; + + BOOST_INTRUSIVE_FORCEINLINE static bool unique(const const_node_ptr & node) + { return !node->node_ptr_1; } + + static void unlink(const node_ptr &) + { + //Auto-unlink hooks and unlink() are not available for any hooks + any_algorithms::template function_not_available_for_any_hooks(); + } + + static void swap_nodes(const node_ptr &, const node_ptr &) + { + //Any nodes have no swap_nodes capability because they don't know + //what algorithm they must use to unlink the node from the container + any_algorithms::template function_not_available_for_any_hooks(); + } +}; + +///@cond + +template +struct get_algo +{ + typedef typename pointer_rebind::type void_pointer; + typedef any_algorithms type; +}; + +///@endcond + +} //namespace intrusive +} //namespace boost + +#endif //BOOST_INTRUSIVE_ANY_NODE_HPP diff --git a/boost/intrusive/detail/hashtable_node.hpp b/boost/intrusive/detail/hashtable_node.hpp new file mode 100644 index 000000000..8f8718e9a --- /dev/null +++ b/boost/intrusive/detail/hashtable_node.hpp @@ -0,0 +1,286 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2007-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_HASHTABLE_NODE_HPP +#define BOOST_INTRUSIVE_HASHTABLE_NODE_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include +#include +#include +#include +#include //make_slist +#include +#include +#include + + +namespace boost { +namespace intrusive { +namespace detail { + +template +struct bucket_impl : public Slist +{ + typedef Slist slist_type; + BOOST_INTRUSIVE_FORCEINLINE bucket_impl() + {} + + BOOST_INTRUSIVE_FORCEINLINE bucket_impl(const bucket_impl &) + {} + + BOOST_INTRUSIVE_FORCEINLINE ~bucket_impl() + { + //This bucket is still being used! + BOOST_INTRUSIVE_INVARIANT_ASSERT(Slist::empty()); + } + + BOOST_INTRUSIVE_FORCEINLINE bucket_impl &operator=(const bucket_impl&) + { + //This bucket is still in use! + BOOST_INTRUSIVE_INVARIANT_ASSERT(Slist::empty()); + return *this; + } +}; + +template +struct bucket_traits_impl +{ + private: + BOOST_COPYABLE_AND_MOVABLE(bucket_traits_impl) + + public: + /// @cond + + typedef typename pointer_traits + ::template rebind_pointer + < bucket_impl >::type bucket_ptr; + typedef Slist slist; + typedef typename Slist::size_type size_type; + /// @endcond + + BOOST_INTRUSIVE_FORCEINLINE bucket_traits_impl(bucket_ptr buckets, size_type len) + : buckets_(buckets), buckets_len_(len) + {} + + BOOST_INTRUSIVE_FORCEINLINE bucket_traits_impl(const bucket_traits_impl &x) + : buckets_(x.buckets_), buckets_len_(x.buckets_len_) + {} + + BOOST_INTRUSIVE_FORCEINLINE bucket_traits_impl(BOOST_RV_REF(bucket_traits_impl) x) + : buckets_(x.buckets_), buckets_len_(x.buckets_len_) + { x.buckets_ = bucket_ptr(); x.buckets_len_ = 0; } + + BOOST_INTRUSIVE_FORCEINLINE bucket_traits_impl& operator=(BOOST_RV_REF(bucket_traits_impl) x) + { + buckets_ = x.buckets_; buckets_len_ = x.buckets_len_; + x.buckets_ = bucket_ptr(); x.buckets_len_ = 0; return *this; + } + + BOOST_INTRUSIVE_FORCEINLINE bucket_traits_impl& operator=(BOOST_COPY_ASSIGN_REF(bucket_traits_impl) x) + { + buckets_ = x.buckets_; buckets_len_ = x.buckets_len_; return *this; + } + + BOOST_INTRUSIVE_FORCEINLINE const bucket_ptr &bucket_begin() const + { return buckets_; } + + BOOST_INTRUSIVE_FORCEINLINE size_type bucket_count() const + { return buckets_len_; } + + private: + bucket_ptr buckets_; + size_type buckets_len_; +}; + +template +struct hash_reduced_slist_node_traits +{ + template static detail::no_type test(...); + template static detail::yes_type test(typename U::reduced_slist_node_traits*); + static const bool value = sizeof(test(0)) == sizeof(detail::yes_type); +}; + +template +struct apply_reduced_slist_node_traits +{ + typedef typename NodeTraits::reduced_slist_node_traits type; +}; + +template +struct reduced_slist_node_traits +{ + typedef typename detail::eval_if_c + < hash_reduced_slist_node_traits::value + , apply_reduced_slist_node_traits + , detail::identity + >::type type; +}; + +template +struct get_slist_impl +{ + typedef trivial_value_traits trivial_traits; + + //Reducing symbol length + struct type : make_slist + < typename NodeTraits::node + , boost::intrusive::value_traits + , boost::intrusive::constant_time_size + , boost::intrusive::size_type + >::type + {}; +}; + +} //namespace detail { + +template +class hashtable_iterator +{ + typedef typename BucketValueTraits::value_traits value_traits; + typedef typename BucketValueTraits::bucket_traits bucket_traits; + + typedef iiterator< value_traits, IsConst + , std::forward_iterator_tag> types_t; + public: + typedef typename types_t::iterator_type::difference_type difference_type; + typedef typename types_t::iterator_type::value_type value_type; + typedef typename types_t::iterator_type::pointer pointer; + typedef typename types_t::iterator_type::reference reference; + typedef typename types_t::iterator_type::iterator_category iterator_category; + + private: + typedef typename value_traits::node_traits node_traits; + typedef typename node_traits::node_ptr node_ptr; + typedef typename detail::get_slist_impl + < typename detail::reduced_slist_node_traits + ::type >::type slist_impl; + typedef typename slist_impl::iterator siterator; + typedef typename slist_impl::const_iterator const_siterator; + typedef detail::bucket_impl bucket_type; + + typedef typename pointer_traits + ::template rebind_pointer + < const BucketValueTraits >::type const_bucketvaltraits_ptr; + typedef typename slist_impl::size_type size_type; + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr downcast_bucket(typename bucket_type::node_ptr p) + { + return pointer_traits:: + pointer_to(static_cast(*p)); + } + + public: + + BOOST_INTRUSIVE_FORCEINLINE hashtable_iterator () + : slist_it_() //Value initialization to achieve "null iterators" (N3644) + {} + + explicit hashtable_iterator(siterator ptr, const BucketValueTraits *cont) + : slist_it_ (ptr) + , traitsptr_ (cont ? pointer_traits::pointer_to(*cont) : const_bucketvaltraits_ptr() ) + {} + + BOOST_INTRUSIVE_FORCEINLINE hashtable_iterator(const hashtable_iterator &other) + : slist_it_(other.slist_it()), traitsptr_(other.get_bucket_value_traits()) + {} + + BOOST_INTRUSIVE_FORCEINLINE const siterator &slist_it() const + { return slist_it_; } + + BOOST_INTRUSIVE_FORCEINLINE hashtable_iterator unconst() const + { return hashtable_iterator(this->slist_it(), this->get_bucket_value_traits()); } + + BOOST_INTRUSIVE_FORCEINLINE hashtable_iterator& operator++() + { this->increment(); return *this; } + + hashtable_iterator operator++(int) + { + hashtable_iterator result (*this); + this->increment(); + return result; + } + + BOOST_INTRUSIVE_FORCEINLINE friend bool operator== (const hashtable_iterator& i, const hashtable_iterator& i2) + { return i.slist_it_ == i2.slist_it_; } + + BOOST_INTRUSIVE_FORCEINLINE friend bool operator!= (const hashtable_iterator& i, const hashtable_iterator& i2) + { return !(i == i2); } + + BOOST_INTRUSIVE_FORCEINLINE reference operator*() const + { return *this->operator ->(); } + + BOOST_INTRUSIVE_FORCEINLINE pointer operator->() const + { + return this->priv_value_traits().to_value_ptr + (downcast_bucket(slist_it_.pointed_node())); + } + + BOOST_INTRUSIVE_FORCEINLINE const const_bucketvaltraits_ptr &get_bucket_value_traits() const + { return traitsptr_; } + + BOOST_INTRUSIVE_FORCEINLINE const value_traits &priv_value_traits() const + { return traitsptr_->priv_value_traits(); } + + BOOST_INTRUSIVE_FORCEINLINE const bucket_traits &priv_bucket_traits() const + { return traitsptr_->priv_bucket_traits(); } + + private: + void increment() + { + const bucket_traits &rbuck_traits = this->priv_bucket_traits(); + bucket_type* const buckets = boost::intrusive::detail::to_raw_pointer(rbuck_traits.bucket_begin()); + const size_type buckets_len = rbuck_traits.bucket_count(); + + ++slist_it_; + const typename slist_impl::node_ptr n = slist_it_.pointed_node(); + const siterator first_bucket_bbegin = buckets->end(); + if(first_bucket_bbegin.pointed_node() <= n && n <= buckets[buckets_len-1].cend().pointed_node()){ + //If one-past the node is inside the bucket then look for the next non-empty bucket + //1. get the bucket_impl from the iterator + const bucket_type &b = static_cast + (bucket_type::slist_type::container_from_end_iterator(slist_it_)); + + //2. Now just calculate the index b has in the bucket array + size_type n_bucket = static_cast(&b - buckets); + + //3. Iterate until a non-empty bucket is found + do{ + if (++n_bucket >= buckets_len){ //bucket overflow, return end() iterator + slist_it_ = buckets->before_begin(); + return; + } + } + while (buckets[n_bucket].empty()); + slist_it_ = buckets[n_bucket].begin(); + } + else{ + //++slist_it_ yield to a valid object + } + } + + siterator slist_it_; + const_bucketvaltraits_ptr traitsptr_; +}; + +} //namespace intrusive { +} //namespace boost { + +#endif diff --git a/boost/intrusive/detail/list_iterator.hpp b/boost/intrusive/detail/list_iterator.hpp new file mode 100644 index 000000000..6c5f16167 --- /dev/null +++ b/boost/intrusive/detail/list_iterator.hpp @@ -0,0 +1,134 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Olaf Krzikalla 2004-2006. +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_LIST_ITERATOR_HPP +#define BOOST_INTRUSIVE_LIST_ITERATOR_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include +#include +#include + +namespace boost { +namespace intrusive { + +// list_iterator provides some basic functions for a +// node oriented bidirectional iterator: +template +class list_iterator +{ + private: + typedef iiterator + types_t; + + static const bool stateful_value_traits = types_t::stateful_value_traits; + + typedef ValueTraits value_traits; + typedef typename types_t::node_traits node_traits; + + typedef typename types_t::node node; + typedef typename types_t::node_ptr node_ptr; + typedef typename types_t::const_value_traits_ptr const_value_traits_ptr; + + public: + typedef typename types_t::iterator_type::difference_type difference_type; + typedef typename types_t::iterator_type::value_type value_type; + typedef typename types_t::iterator_type::pointer pointer; + typedef typename types_t::iterator_type::reference reference; + typedef typename types_t::iterator_type::iterator_category iterator_category; + + BOOST_INTRUSIVE_FORCEINLINE list_iterator() + {} + + BOOST_INTRUSIVE_FORCEINLINE explicit list_iterator(const node_ptr & nodeptr, const const_value_traits_ptr &traits_ptr) + : members_(nodeptr, traits_ptr) + {} + + BOOST_INTRUSIVE_FORCEINLINE list_iterator(list_iterator const& other) + : members_(other.pointed_node(), other.get_value_traits()) + {} + + BOOST_INTRUSIVE_FORCEINLINE const node_ptr &pointed_node() const + { return members_.nodeptr_; } + + BOOST_INTRUSIVE_FORCEINLINE list_iterator &operator=(const node_ptr &node) + { members_.nodeptr_ = node; return static_cast(*this); } + + BOOST_INTRUSIVE_FORCEINLINE const_value_traits_ptr get_value_traits() const + { return members_.get_ptr(); } + + public: + BOOST_INTRUSIVE_FORCEINLINE list_iterator& operator++() + { + node_ptr p = node_traits::get_next(members_.nodeptr_); + members_.nodeptr_ = p; + return static_cast (*this); + } + + BOOST_INTRUSIVE_FORCEINLINE list_iterator operator++(int) + { + list_iterator result (*this); + members_.nodeptr_ = node_traits::get_next(members_.nodeptr_); + return result; + } + + BOOST_INTRUSIVE_FORCEINLINE list_iterator& operator--() + { + members_.nodeptr_ = node_traits::get_previous(members_.nodeptr_); + return static_cast (*this); + } + + BOOST_INTRUSIVE_FORCEINLINE list_iterator operator--(int) + { + list_iterator result (*this); + members_.nodeptr_ = node_traits::get_previous(members_.nodeptr_); + return result; + } + + BOOST_INTRUSIVE_FORCEINLINE friend bool operator== (const list_iterator& l, const list_iterator& r) + { return l.pointed_node() == r.pointed_node(); } + + BOOST_INTRUSIVE_FORCEINLINE friend bool operator!= (const list_iterator& l, const list_iterator& r) + { return !(l == r); } + + BOOST_INTRUSIVE_FORCEINLINE reference operator*() const + { return *operator->(); } + + BOOST_INTRUSIVE_FORCEINLINE pointer operator->() const + { return this->operator_arrow(detail::bool_()); } + + list_iterator unconst() const + { return list_iterator(this->pointed_node(), this->get_value_traits()); } + + private: + BOOST_INTRUSIVE_FORCEINLINE pointer operator_arrow(detail::false_) const + { return ValueTraits::to_value_ptr(members_.nodeptr_); } + + BOOST_INTRUSIVE_FORCEINLINE pointer operator_arrow(detail::true_) const + { return this->get_value_traits()->to_value_ptr(members_.nodeptr_); } + + iiterator_members members_; +}; + +} //namespace intrusive +} //namespace boost + +#endif //BOOST_INTRUSIVE_LIST_ITERATOR_HPP diff --git a/boost/intrusive/detail/list_node.hpp b/boost/intrusive/detail/list_node.hpp new file mode 100644 index 000000000..c3b484701 --- /dev/null +++ b/boost/intrusive/detail/list_node.hpp @@ -0,0 +1,72 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Olaf Krzikalla 2004-2006. +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_LIST_NODE_HPP +#define BOOST_INTRUSIVE_LIST_NODE_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include + +namespace boost { +namespace intrusive { + +// list_node_traits can be used with circular_list_algorithms and supplies +// a list_node holding the pointers needed for a double-linked list +// it is used by list_derived_node and list_member_node + +template +struct list_node +{ + typedef typename pointer_rebind::type node_ptr; + node_ptr next_; + node_ptr prev_; +}; + +template +struct list_node_traits +{ + typedef list_node node; + typedef typename node::node_ptr node_ptr; + typedef typename pointer_rebind::type const_node_ptr; + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_previous(const const_node_ptr & n) + { return n->prev_; } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_previous(const node_ptr & n) + { return n->prev_; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_previous(const node_ptr & n, const node_ptr & prev) + { n->prev_ = prev; } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_next(const const_node_ptr & n) + { return n->next_; } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_next(const node_ptr & n) + { return n->next_; } + + BOOST_INTRUSIVE_FORCEINLINE static void set_next(const node_ptr & n, const node_ptr & next) + { n->next_ = next; } +}; + +} //namespace intrusive +} //namespace boost + +#endif //BOOST_INTRUSIVE_LIST_NODE_HPP diff --git a/boost/intrusive/detail/node_to_value.hpp b/boost/intrusive/detail/node_to_value.hpp new file mode 100644 index 000000000..5af334734 --- /dev/null +++ b/boost/intrusive/detail/node_to_value.hpp @@ -0,0 +1,130 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2014-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_DETAIL_NODE_TO_VALUE_HPP +#define BOOST_INTRUSIVE_DETAIL_NODE_TO_VALUE_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include +#include + +namespace boost { +namespace intrusive { +namespace detail { + +template +struct dummy_constptr +{ + typedef typename boost::intrusive::pointer_traits:: + template rebind_pointer::type ConstVoidPtr; + + explicit dummy_constptr(ConstVoidPtr) + {} + + dummy_constptr() + {} + + ConstVoidPtr get_ptr() const + { return ConstVoidPtr(); } +}; + +template +struct constptr +{ + typedef typename boost::intrusive::pointer_traits:: + template rebind_pointer::type ConstVoidPtr; + + constptr() + {} + + explicit constptr(const ConstVoidPtr &ptr) + : const_void_ptr_(ptr) + {} + + const void *get_ptr() const + { return boost::intrusive::detail::to_raw_pointer(const_void_ptr_); } + + ConstVoidPtr const_void_ptr_; +}; + +template +struct select_constptr +{ + typedef typename if_c + < store_ptr + , constptr + , dummy_constptr + >::type type; +}; + + +template +struct node_to_value + : public select_constptr + < typename pointer_traits + ::template rebind_pointer::type + , is_stateful_value_traits::value + >::type +{ + static const bool stateful_value_traits = is_stateful_value_traits::value; + typedef typename select_constptr + < typename pointer_traits + :: + template rebind_pointer::type + , stateful_value_traits >::type Base; + + typedef ValueTraits value_traits; + typedef typename value_traits::value_type value_type; + typedef typename value_traits::node_traits::node node; + typedef typename add_const_if_c + ::type vtype; + typedef typename add_const_if_c + ::type ntype; + typedef typename pointer_traits + :: + template rebind_pointer::type npointer; + typedef typename pointer_traits:: + template rebind_pointer::type const_value_traits_ptr; + + node_to_value(const const_value_traits_ptr &ptr) + : Base(ptr) + {} + + typedef vtype & result_type; + typedef ntype & first_argument_type; + + const_value_traits_ptr get_value_traits() const + { return pointer_traits::static_cast_from(Base::get_ptr()); } + + result_type to_value(first_argument_type arg, false_) const + { return *(value_traits::to_value_ptr(pointer_traits::pointer_to(arg))); } + + result_type to_value(first_argument_type arg, true_) const + { return *(this->get_value_traits()->to_value_ptr(pointer_traits::pointer_to(arg))); } + + result_type operator()(first_argument_type arg) const + { return this->to_value(arg, bool_()); } +}; + +} //namespace detail{ +} //namespace intrusive{ +} //namespace boost{ + +#endif //BOOST_INTRUSIVE_DETAIL_NODE_TO_VALUE_HPP diff --git a/boost/intrusive/detail/transform_iterator.hpp b/boost/intrusive/detail/transform_iterator.hpp new file mode 100644 index 000000000..0a715754d --- /dev/null +++ b/boost/intrusive/detail/transform_iterator.hpp @@ -0,0 +1,172 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2007-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_DETAIL_TRANSFORM_ITERATOR_HPP +#define BOOST_INTRUSIVE_DETAIL_TRANSFORM_ITERATOR_HPP + +#ifndef BOOST_CONFIG_HPP +# include +#endif + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#include +#include +#include +#include + +namespace boost { +namespace intrusive { +namespace detail { + +template +struct operator_arrow_proxy +{ + BOOST_INTRUSIVE_FORCEINLINE operator_arrow_proxy(const PseudoReference &px) + : m_value(px) + {} + + BOOST_INTRUSIVE_FORCEINLINE PseudoReference* operator->() const { return &m_value; } + // This function is needed for MWCW and BCC, which won't call operator-> + // again automatically per 13.3.1.2 para 8 +// operator T*() const { return &m_value; } + mutable PseudoReference m_value; +}; + +template +struct operator_arrow_proxy +{ + BOOST_INTRUSIVE_FORCEINLINE operator_arrow_proxy(T &px) + : m_value(px) + {} + + BOOST_INTRUSIVE_FORCEINLINE T* operator->() const { return &m_value; } + // This function is needed for MWCW and BCC, which won't call operator-> + // again automatically per 13.3.1.2 para 8 +// operator T*() const { return &m_value; } + T &m_value; +}; + +template +class transform_iterator +{ + public: + typedef typename Iterator::iterator_category iterator_category; + typedef typename detail::remove_reference::type value_type; + typedef typename Iterator::difference_type difference_type; + typedef operator_arrow_proxy pointer; + typedef typename UnaryFunction::result_type reference; + + explicit transform_iterator(const Iterator &it, const UnaryFunction &f = UnaryFunction()) + : members_(it, f) + {} + + explicit transform_iterator() + : members_() + {} + + BOOST_INTRUSIVE_FORCEINLINE Iterator get_it() const + { return members_.m_it; } + + //Constructors + BOOST_INTRUSIVE_FORCEINLINE transform_iterator& operator++() + { increment(); return *this; } + + BOOST_INTRUSIVE_FORCEINLINE transform_iterator operator++(int) + { + transform_iterator result (*this); + increment(); + return result; + } + + BOOST_INTRUSIVE_FORCEINLINE friend bool operator== (const transform_iterator& i, const transform_iterator& i2) + { return i.equal(i2); } + + BOOST_INTRUSIVE_FORCEINLINE friend bool operator!= (const transform_iterator& i, const transform_iterator& i2) + { return !(i == i2); } + + BOOST_INTRUSIVE_FORCEINLINE friend typename Iterator::difference_type operator- (const transform_iterator& i, const transform_iterator& i2) + { return i2.distance_to(i); } + + //Arithmetic + transform_iterator& operator+=(typename Iterator::difference_type off) + { this->advance(off); return *this; } + + BOOST_INTRUSIVE_FORCEINLINE transform_iterator operator+(typename Iterator::difference_type off) const + { + transform_iterator other(*this); + other.advance(off); + return other; + } + + BOOST_INTRUSIVE_FORCEINLINE friend transform_iterator operator+(typename Iterator::difference_type off, const transform_iterator& right) + { return right + off; } + + BOOST_INTRUSIVE_FORCEINLINE transform_iterator& operator-=(typename Iterator::difference_type off) + { this->advance(-off); return *this; } + + BOOST_INTRUSIVE_FORCEINLINE transform_iterator operator-(typename Iterator::difference_type off) const + { return *this + (-off); } + + BOOST_INTRUSIVE_FORCEINLINE typename UnaryFunction::result_type operator*() const + { return dereference(); } + + BOOST_INTRUSIVE_FORCEINLINE operator_arrow_proxy + operator->() const + { return operator_arrow_proxy(dereference()); } + + private: + struct members + : UnaryFunction + { + BOOST_INTRUSIVE_FORCEINLINE members(const Iterator &it, const UnaryFunction &f) + : UnaryFunction(f), m_it(it) + {} + + BOOST_INTRUSIVE_FORCEINLINE members() + {} + + Iterator m_it; + } members_; + + + BOOST_INTRUSIVE_FORCEINLINE void increment() + { ++members_.m_it; } + + BOOST_INTRUSIVE_FORCEINLINE void decrement() + { --members_.m_it; } + + BOOST_INTRUSIVE_FORCEINLINE bool equal(const transform_iterator &other) const + { return members_.m_it == other.members_.m_it; } + + BOOST_INTRUSIVE_FORCEINLINE bool less(const transform_iterator &other) const + { return other.members_.m_it < members_.m_it; } + + typename UnaryFunction::result_type dereference() const + { return members_(*members_.m_it); } + + void advance(typename Iterator::difference_type n) + { boost::intrusive::iterator_advance(members_.m_it, n); } + + typename Iterator::difference_type distance_to(const transform_iterator &other)const + { return boost::intrusive::iterator_distance(other.members_.m_it, members_.m_it); } +}; + +} //namespace detail +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_DETAIL_TRANSFORM_ITERATOR_HPP diff --git a/boost/intrusive/hashtable.hpp b/boost/intrusive/hashtable.hpp new file mode 100644 index 000000000..313da829d --- /dev/null +++ b/boost/intrusive/hashtable.hpp @@ -0,0 +1,3585 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// +#ifndef BOOST_INTRUSIVE_HASHTABLE_HPP +#define BOOST_INTRUSIVE_HASHTABLE_HPP + +#include +#include + +//General intrusive utilities +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +//Implementation utilities +#include +#include +#include +#include + +//boost +#include +#include +#include +#include +#include + +//std C++ +#include //std::equal_to +#include //std::pair +#include //std::lower_bound, std::upper_bound +#include //std::size_t + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +/// @cond + +template +InputIt priv_algo_find(InputIt first, InputIt last, const T& value) +{ + for (; first != last; ++first) { + if (*first == value) { + return first; + } + } + return last; +} + +template +typename boost::intrusive::iterator_traits::difference_type + priv_algo_count(InputIt first, InputIt last, const T& value) +{ + typename boost::intrusive::iterator_traits::difference_type ret = 0; + for (; first != last; ++first) { + if (*first == value) { + ret++; + } + } + return ret; +} + +template +bool priv_algo_is_permutation(ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2) +{ + typedef typename + boost::intrusive::iterator_traits::difference_type + distance_type; + //Efficiently compare identical prefixes: O(N) if sequences + //have the same elements in the same order. + for ( ; first1 != last1; ++first1, ++first2){ + if (! (*first1 == *first2)) + break; + } + if (first1 == last1){ + return true; + } + + //Establish last2 assuming equal ranges by iterating over the + //rest of the list. + ForwardIterator2 last2 = first2; + boost::intrusive::iterator_advance(last2, boost::intrusive::iterator_distance(first1, last1)); + for(ForwardIterator1 scan = first1; scan != last1; ++scan){ + if (scan != (priv_algo_find)(first1, scan, *scan)){ + continue; //We've seen this one before. + } + distance_type matches = (priv_algo_count)(first2, last2, *scan); + if (0 == matches || (priv_algo_count)(scan, last1, *scan != matches)){ + return false; + } + } + return true; +} + +template +struct prime_list_holder +{ + static const std::size_t prime_list[]; + static const std::size_t prime_list_size; +}; + +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +//We only support LLP64(Win64) or LP64(most Unix) data models +#ifdef _WIN64 //In 64 bit windows sizeof(size_t) == sizeof(unsigned long long) + #define BOOST_INTRUSIVE_PRIME_C(NUMBER) NUMBER##ULL + #define BOOST_INTRUSIVE_64_BIT_SIZE_T 1 +#else //In 32 bit windows and 32/64 bit unixes sizeof(size_t) == sizeof(unsigned long) + #define BOOST_INTRUSIVE_PRIME_C(NUMBER) NUMBER##UL + #define BOOST_INTRUSIVE_64_BIT_SIZE_T (((((ULONG_MAX>>16)>>16)>>16)>>15) != 0) +#endif + +template +const std::size_t prime_list_holder::prime_list[] = { + BOOST_INTRUSIVE_PRIME_C(3), BOOST_INTRUSIVE_PRIME_C(7), + BOOST_INTRUSIVE_PRIME_C(11), BOOST_INTRUSIVE_PRIME_C(17), + BOOST_INTRUSIVE_PRIME_C(29), BOOST_INTRUSIVE_PRIME_C(53), + BOOST_INTRUSIVE_PRIME_C(97), BOOST_INTRUSIVE_PRIME_C(193), + BOOST_INTRUSIVE_PRIME_C(389), BOOST_INTRUSIVE_PRIME_C(769), + BOOST_INTRUSIVE_PRIME_C(1543), BOOST_INTRUSIVE_PRIME_C(3079), + BOOST_INTRUSIVE_PRIME_C(6151), BOOST_INTRUSIVE_PRIME_C(12289), + BOOST_INTRUSIVE_PRIME_C(24593), BOOST_INTRUSIVE_PRIME_C(49157), + BOOST_INTRUSIVE_PRIME_C(98317), BOOST_INTRUSIVE_PRIME_C(196613), + BOOST_INTRUSIVE_PRIME_C(393241), BOOST_INTRUSIVE_PRIME_C(786433), + BOOST_INTRUSIVE_PRIME_C(1572869), BOOST_INTRUSIVE_PRIME_C(3145739), + BOOST_INTRUSIVE_PRIME_C(6291469), BOOST_INTRUSIVE_PRIME_C(12582917), + BOOST_INTRUSIVE_PRIME_C(25165843), BOOST_INTRUSIVE_PRIME_C(50331653), + BOOST_INTRUSIVE_PRIME_C(100663319), BOOST_INTRUSIVE_PRIME_C(201326611), + BOOST_INTRUSIVE_PRIME_C(402653189), BOOST_INTRUSIVE_PRIME_C(805306457), + BOOST_INTRUSIVE_PRIME_C(1610612741), BOOST_INTRUSIVE_PRIME_C(3221225473), +#if BOOST_INTRUSIVE_64_BIT_SIZE_T + //Taken from Boost.MultiIndex code, thanks to Joaquin M Lopez Munoz. + BOOST_INTRUSIVE_PRIME_C(6442450939), BOOST_INTRUSIVE_PRIME_C(12884901893), + BOOST_INTRUSIVE_PRIME_C(25769803751), BOOST_INTRUSIVE_PRIME_C(51539607551), + BOOST_INTRUSIVE_PRIME_C(103079215111), BOOST_INTRUSIVE_PRIME_C(206158430209), + BOOST_INTRUSIVE_PRIME_C(412316860441), BOOST_INTRUSIVE_PRIME_C(824633720831), + BOOST_INTRUSIVE_PRIME_C(1649267441651), BOOST_INTRUSIVE_PRIME_C(3298534883309), + BOOST_INTRUSIVE_PRIME_C(6597069766657), BOOST_INTRUSIVE_PRIME_C(13194139533299), + BOOST_INTRUSIVE_PRIME_C(26388279066623), BOOST_INTRUSIVE_PRIME_C(52776558133303), + BOOST_INTRUSIVE_PRIME_C(105553116266489), BOOST_INTRUSIVE_PRIME_C(211106232532969), + BOOST_INTRUSIVE_PRIME_C(422212465066001), BOOST_INTRUSIVE_PRIME_C(844424930131963), + BOOST_INTRUSIVE_PRIME_C(1688849860263953), BOOST_INTRUSIVE_PRIME_C(3377699720527861), + BOOST_INTRUSIVE_PRIME_C(6755399441055731), BOOST_INTRUSIVE_PRIME_C(13510798882111483), + BOOST_INTRUSIVE_PRIME_C(27021597764222939), BOOST_INTRUSIVE_PRIME_C(54043195528445957), + BOOST_INTRUSIVE_PRIME_C(108086391056891903), BOOST_INTRUSIVE_PRIME_C(216172782113783843), + BOOST_INTRUSIVE_PRIME_C(432345564227567621), BOOST_INTRUSIVE_PRIME_C(864691128455135207), + BOOST_INTRUSIVE_PRIME_C(1729382256910270481), BOOST_INTRUSIVE_PRIME_C(3458764513820540933), + BOOST_INTRUSIVE_PRIME_C(6917529027641081903), BOOST_INTRUSIVE_PRIME_C(13835058055282163729), + BOOST_INTRUSIVE_PRIME_C(18446744073709551557) +#else + BOOST_INTRUSIVE_PRIME_C(4294967291) +#endif + }; + +#undef BOOST_INTRUSIVE_PRIME_C +#undef BOOST_INTRUSIVE_64_BIT_SIZE_T + +#endif //#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +template +const std::size_t prime_list_holder::prime_list_size + = sizeof(prime_list)/sizeof(std::size_t); + +struct hash_bool_flags +{ + static const std::size_t unique_keys_pos = 1u; + static const std::size_t constant_time_size_pos = 2u; + static const std::size_t power_2_buckets_pos = 4u; + static const std::size_t cache_begin_pos = 8u; + static const std::size_t compare_hash_pos = 16u; + static const std::size_t incremental_pos = 32u; +}; + +namespace detail { + +template +struct get_slist_impl_from_supposed_value_traits +{ + typedef SupposedValueTraits value_traits; + typedef typename detail::get_node_traits + ::type node_traits; + typedef typename get_slist_impl + ::type + >::type type; +}; + +template +struct unordered_bucket_impl +{ + typedef typename + get_slist_impl_from_supposed_value_traits + ::type slist_impl; + typedef detail::bucket_impl implementation_defined; + typedef implementation_defined type; +}; + +template +struct unordered_bucket_ptr_impl +{ + typedef typename detail::get_node_traits + ::type::node_ptr node_ptr; + typedef typename unordered_bucket_impl + ::type bucket_type; + + typedef typename pointer_traits + ::template rebind_pointer + < bucket_type >::type implementation_defined; + typedef implementation_defined type; +}; + +template +struct store_hash_is_true +{ + template + struct two_or_three {yes_type _[2 + Add];}; + template static yes_type test(...); + template static two_or_three test (int); + static const bool value = sizeof(test(0)) > sizeof(yes_type)*2; +}; + +template +struct optimize_multikey_is_true +{ + template + struct two_or_three {yes_type _[2 + Add];}; + template static yes_type test(...); + template static two_or_three test (int); + static const bool value = sizeof(test(0)) > sizeof(yes_type)*2; +}; + +struct insert_commit_data_impl +{ + std::size_t hash; +}; + +template +BOOST_INTRUSIVE_FORCEINLINE typename pointer_traits::template rebind_pointer::type + dcast_bucket_ptr(const SlistNodePtr &p) +{ + typedef typename pointer_traits::template rebind_pointer::type node_ptr; + return pointer_traits::pointer_to(static_cast(*p)); +} + +template +struct group_functions +{ + // A group is reverse-linked + // + // A is "first in group" + // C is "last in group" + // __________________ + // | _____ _____ | + // | | | | | | <- Group links + // ^ V ^ V ^ V + // _ _ _ _ + // A|_| B|_| C|_| D|_| + // + // ^ | ^ | ^ | ^ V <- Bucket links + // _ _____| |_____| |______| |____| | + // |B| | + // ^________________________________| + // + + typedef NodeTraits node_traits; + typedef unordered_group_adapter group_traits; + typedef typename node_traits::node_ptr node_ptr; + typedef typename node_traits::node node; + typedef typename reduced_slist_node_traits + ::type reduced_node_traits; + typedef typename reduced_node_traits::node_ptr slist_node_ptr; + typedef typename reduced_node_traits::node slist_node; + typedef circular_slist_algorithms group_algorithms; + typedef circular_slist_algorithms node_algorithms; + + static slist_node_ptr get_bucket_before_begin + (const slist_node_ptr &bucket_beg, const slist_node_ptr &bucket_end, const node_ptr &p) + { + //First find the last node of p's group. + //This requires checking the first node of the next group or + //the bucket node. + node_ptr prev_node = p; + node_ptr nxt(node_traits::get_next(p)); + while(!(bucket_beg <= nxt && nxt <= bucket_end) && + (group_traits::get_next(nxt) == prev_node)){ + prev_node = nxt; + nxt = node_traits::get_next(nxt); + } + + //If we've reached the bucket node just return it. + if(bucket_beg <= nxt && nxt <= bucket_end){ + return nxt; + } + + //Otherwise, iterate using group links until the bucket node + node_ptr first_node_of_group = nxt; + node_ptr last_node_group = group_traits::get_next(first_node_of_group); + slist_node_ptr possible_end = node_traits::get_next(last_node_group); + + while(!(bucket_beg <= possible_end && possible_end <= bucket_end)){ + first_node_of_group = detail::dcast_bucket_ptr(possible_end); + last_node_group = group_traits::get_next(first_node_of_group); + possible_end = node_traits::get_next(last_node_group); + } + return possible_end; + } + + static node_ptr get_prev_to_first_in_group(const slist_node_ptr &bucket_node, const node_ptr &first_in_group) + { + node_ptr nb = detail::dcast_bucket_ptr(bucket_node); + node_ptr n; + while((n = node_traits::get_next(nb)) != first_in_group){ + nb = group_traits::get_next(n); //go to last in group + } + return nb; + } + + static void erase_from_group(const slist_node_ptr &end_ptr, const node_ptr &to_erase_ptr, detail::true_) + { + node_ptr const nxt_ptr(node_traits::get_next(to_erase_ptr)); + //Check if the next node is in the group (not end node) and reverse linked to + //'to_erase_ptr'. Erase if that's the case. + if(nxt_ptr != end_ptr && to_erase_ptr == group_traits::get_next(nxt_ptr)){ + group_algorithms::unlink_after(nxt_ptr); + } + } + + BOOST_INTRUSIVE_FORCEINLINE static void erase_from_group(const slist_node_ptr&, const node_ptr&, detail::false_) + {} + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_last_in_group(const node_ptr &first_in_group, detail::true_) + { return group_traits::get_next(first_in_group); } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_last_in_group(node_ptr n, detail::false_) + { return n; } + + static node_ptr get_first_in_group(node_ptr n, detail::true_) + { + node_ptr ng; + while(n == node_traits::get_next((ng = group_traits::get_next(n)))){ + n = ng; + } + return n; + } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr next_group_if_first_in_group(node_ptr ptr) + { + return node_traits::get_next(group_traits::get_next(ptr)); + } + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_first_in_group(const node_ptr &n, detail::false_) + { return n; } + + BOOST_INTRUSIVE_FORCEINLINE static void insert_in_group(const node_ptr &first_in_group, const node_ptr &n, true_) + { group_algorithms::link_after(first_in_group, n); } + + static void insert_in_group(const node_ptr&, const node_ptr&, false_) + {} + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr split_group(node_ptr const new_first_in_group) + { + node_ptr const first((get_first_in_group)(new_first_in_group, detail::true_())); + if(first != new_first_in_group){ + node_ptr const last = group_traits::get_next(first); + group_traits::set_next(first, group_traits::get_next(new_first_in_group)); + group_traits::set_next(new_first_in_group, last); + } + return first; + } +}; + +template +class incremental_rehash_rollback +{ + private: + typedef BucketType bucket_type; + typedef SplitTraits split_traits; + + incremental_rehash_rollback(); + incremental_rehash_rollback & operator=(const incremental_rehash_rollback &); + incremental_rehash_rollback (const incremental_rehash_rollback &); + + public: + incremental_rehash_rollback + (bucket_type &source_bucket, bucket_type &destiny_bucket, split_traits &split_traits) + : source_bucket_(source_bucket), destiny_bucket_(destiny_bucket) + , split_traits_(split_traits), released_(false) + {} + + BOOST_INTRUSIVE_FORCEINLINE void release() + { released_ = true; } + + ~incremental_rehash_rollback() + { + if(!released_){ + //If an exception is thrown, just put all moved nodes back in the old bucket + //and move back the split mark. + destiny_bucket_.splice_after(destiny_bucket_.before_begin(), source_bucket_); + split_traits_.decrement(); + } + } + + private: + bucket_type &source_bucket_; + bucket_type &destiny_bucket_; + split_traits &split_traits_; + bool released_; +}; + +template +struct node_functions +{ + BOOST_INTRUSIVE_FORCEINLINE static void store_hash(typename NodeTraits::node_ptr p, std::size_t h, true_) + { return NodeTraits::set_hash(p, h); } + + BOOST_INTRUSIVE_FORCEINLINE static void store_hash(typename NodeTraits::node_ptr, std::size_t, false_) + {} +}; + +BOOST_INTRUSIVE_FORCEINLINE std::size_t hash_to_bucket(std::size_t hash_value, std::size_t bucket_cnt, detail::false_) +{ return hash_value % bucket_cnt; } + +BOOST_INTRUSIVE_FORCEINLINE std::size_t hash_to_bucket(std::size_t hash_value, std::size_t bucket_cnt, detail::true_) +{ return hash_value & (bucket_cnt - 1); } + +template +BOOST_INTRUSIVE_FORCEINLINE std::size_t hash_to_bucket_split(std::size_t hash_value, std::size_t bucket_cnt, std::size_t split) +{ + std::size_t bucket_number = detail::hash_to_bucket(hash_value, bucket_cnt, detail::bool_()); + if(Incremental) + bucket_number -= static_cast(bucket_number >= split)*(bucket_cnt/2); + return bucket_number; +} + +} //namespace detail { + +//!This metafunction will obtain the type of a bucket +//!from the value_traits or hook option to be used with +//!a hash container. +template +struct unordered_bucket + : public detail::unordered_bucket_impl + ::proto_value_traits + > +{}; + +//!This metafunction will obtain the type of a bucket pointer +//!from the value_traits or hook option to be used with +//!a hash container. +template +struct unordered_bucket_ptr + : public detail::unordered_bucket_ptr_impl + ::proto_value_traits + > +{}; + +//!This metafunction will obtain the type of the default bucket traits +//!(when the user does not specify the bucket_traits<> option) from the +//!value_traits or hook option to be used with +//!a hash container. +template +struct unordered_default_bucket_traits +{ + typedef typename ValueTraitsOrHookOption:: + template pack::proto_value_traits supposed_value_traits; + typedef typename detail:: + get_slist_impl_from_supposed_value_traits + ::type slist_impl; + typedef detail::bucket_traits_impl + implementation_defined; + typedef implementation_defined type; +}; + +struct default_bucket_traits; + +//hashtable default hook traits +struct default_hashtable_hook_applier +{ template struct apply{ typedef typename T::default_hashtable_hook type; }; }; + +template<> +struct is_default_hook_tag +{ static const bool value = true; }; + +struct hashtable_defaults +{ + typedef default_hashtable_hook_applier proto_value_traits; + typedef std::size_t size_type; + typedef void key_of_value; + typedef void equal; + typedef void hash; + typedef default_bucket_traits bucket_traits; + static const bool constant_time_size = true; + static const bool power_2_buckets = false; + static const bool cache_begin = false; + static const bool compare_hash = false; + static const bool incremental = false; +}; + +template +struct downcast_node_to_value_t + : public detail::node_to_value +{ + typedef detail::node_to_value base_t; + typedef typename base_t::result_type result_type; + typedef ValueTraits value_traits; + typedef typename detail::get_slist_impl + ::type + >::type slist_impl; + typedef typename detail::add_const_if_c + ::type & first_argument_type; + typedef typename detail::add_const_if_c + < typename ValueTraits::node_traits::node + , IsConst>::type & intermediate_argument_type; + typedef typename pointer_traits + :: + template rebind_pointer + ::type const_value_traits_ptr; + + BOOST_INTRUSIVE_FORCEINLINE downcast_node_to_value_t(const const_value_traits_ptr &ptr) + : base_t(ptr) + {} + + BOOST_INTRUSIVE_FORCEINLINE result_type operator()(first_argument_type arg) const + { return this->base_t::operator()(static_cast(arg)); } +}; + +template +struct node_cast_adaptor + //Use public inheritance to avoid MSVC bugs with closures + : public detail::ebo_functor_holder +{ + typedef detail::ebo_functor_holder base_t; + + typedef typename pointer_traits::element_type slist_node; + typedef typename pointer_traits::element_type node; + + template + BOOST_INTRUSIVE_FORCEINLINE node_cast_adaptor(const ConvertibleToF &c2f, const RealValuTraits *traits) + : base_t(base_t(c2f, traits)) + {} + + BOOST_INTRUSIVE_FORCEINLINE typename base_t::node_ptr operator()(const slist_node &to_clone) + { return base_t::operator()(static_cast(to_clone)); } + + BOOST_INTRUSIVE_FORCEINLINE void operator()(SlistNodePtr to_clone) + { + base_t::operator()(pointer_traits::pointer_to(static_cast(*to_clone))); + } +}; + +//bucket_plus_vtraits stores ValueTraits + BucketTraits +//this data is needed by iterators to obtain the +//value from the iterator and detect the bucket +template +struct bucket_plus_vtraits +{ + typedef BucketTraits bucket_traits; + typedef ValueTraits value_traits; + + static const bool safemode_or_autounlink = is_safe_autounlink::value; + + typedef typename + detail::get_slist_impl_from_supposed_value_traits + ::type slist_impl; + typedef typename value_traits::node_traits node_traits; + typedef unordered_group_adapter group_traits; + typedef typename slist_impl::iterator siterator; + typedef typename slist_impl::size_type size_type; + typedef detail::bucket_impl bucket_type; + typedef detail::group_functions group_functions_t; + typedef typename slist_impl::node_algorithms node_algorithms; + typedef typename slist_impl::node_ptr slist_node_ptr; + typedef typename node_traits::node_ptr node_ptr; + typedef typename node_traits::node node; + typedef typename value_traits::value_type value_type; + typedef typename value_traits::pointer pointer; + typedef typename value_traits::const_pointer const_pointer; + typedef typename pointer_traits::reference reference; + typedef typename pointer_traits + ::reference const_reference; + typedef circular_slist_algorithms group_algorithms; + typedef typename pointer_traits + :: + template rebind_pointer + ::type const_value_traits_ptr; + typedef typename pointer_traits + :: + template rebind_pointer + ::type const_bucket_value_traits_ptr; + typedef typename detail::unordered_bucket_ptr_impl + ::type bucket_ptr; + + template + BOOST_INTRUSIVE_FORCEINLINE bucket_plus_vtraits(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits) + : data(val_traits, ::boost::forward(b_traits)) + {} + + BOOST_INTRUSIVE_FORCEINLINE bucket_plus_vtraits & operator =(const bucket_plus_vtraits &x) + { data.bucket_traits_ = x.data.bucket_traits_; return *this; } + + BOOST_INTRUSIVE_FORCEINLINE const_value_traits_ptr priv_value_traits_ptr() const + { return pointer_traits::pointer_to(this->priv_value_traits()); } + + //bucket_value_traits + // + BOOST_INTRUSIVE_FORCEINLINE const bucket_plus_vtraits &get_bucket_value_traits() const + { return *this; } + + BOOST_INTRUSIVE_FORCEINLINE bucket_plus_vtraits &get_bucket_value_traits() + { return *this; } + + BOOST_INTRUSIVE_FORCEINLINE const_bucket_value_traits_ptr bucket_value_traits_ptr() const + { return pointer_traits::pointer_to(this->get_bucket_value_traits()); } + + //value traits + // + BOOST_INTRUSIVE_FORCEINLINE const value_traits &priv_value_traits() const + { return this->data; } + + BOOST_INTRUSIVE_FORCEINLINE value_traits &priv_value_traits() + { return this->data; } + + //bucket_traits + // + BOOST_INTRUSIVE_FORCEINLINE const bucket_traits &priv_bucket_traits() const + { return this->data.bucket_traits_; } + + BOOST_INTRUSIVE_FORCEINLINE bucket_traits &priv_bucket_traits() + { return this->data.bucket_traits_; } + + //bucket operations + BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_bucket_pointer() const + { return this->priv_bucket_traits().bucket_begin(); } + + typename slist_impl::size_type priv_bucket_count() const + { return this->priv_bucket_traits().bucket_count(); } + + BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_invalid_bucket() const + { + const bucket_traits &rbt = this->priv_bucket_traits(); + return rbt.bucket_begin() + rbt.bucket_count(); + } + + BOOST_INTRUSIVE_FORCEINLINE siterator priv_invalid_local_it() const + { return this->priv_bucket_traits().bucket_begin()->before_begin(); } + + template + static size_type priv_erase_from_single_bucket(bucket_type &b, siterator sbefore_first, siterator slast, NodeDisposer node_disposer, detail::true_) //optimize multikey + { + size_type n = 0; + siterator const sfirst(++siterator(sbefore_first)); + if(sfirst != slast){ + node_ptr const nf = detail::dcast_bucket_ptr(sfirst.pointed_node()); + node_ptr const nl = detail::dcast_bucket_ptr(slast.pointed_node()); + node_ptr const ne = detail::dcast_bucket_ptr(b.end().pointed_node()); + + if(group_functions_t::next_group_if_first_in_group(nf) != nf) { + // The node is at the beginning of a group. + if(nl != ne){ + group_functions_t::split_group(nl); + } + } + else { + node_ptr const group1 = group_functions_t::split_group(nf); + if(nl != ne) { + node_ptr const group2 = group_functions_t::split_group(ne); + if(nf == group2) { //Both first and last in the same group + //so join group1 and group2 + node_ptr const end1 = group_traits::get_next(group1); + node_ptr const end2 = group_traits::get_next(group2); + group_traits::set_next(group1, end2); + group_traits::set_next(group2, end1); + } + } + } + + siterator it(++siterator(sbefore_first)); + while(it != slast){ + node_disposer((it++).pointed_node()); + ++n; + } + b.erase_after(sbefore_first, slast); + } + return n; + } + + template + static size_type priv_erase_from_single_bucket(bucket_type &b, siterator sbefore_first, siterator slast, NodeDisposer node_disposer, detail::false_) //optimize multikey + { + size_type n = 0; + siterator it(++siterator(sbefore_first)); + while(it != slast){ + node_disposer((it++).pointed_node()); + ++n; + } + b.erase_after(sbefore_first, slast); + return n; + } + + template + static void priv_erase_node(bucket_type &b, siterator i, NodeDisposer node_disposer, detail::true_) //optimize multikey + { + node_ptr const ne(detail::dcast_bucket_ptr(b.end().pointed_node())); + node_ptr n(detail::dcast_bucket_ptr(i.pointed_node())); + node_ptr pos = node_traits::get_next(group_traits::get_next(n)); + node_ptr bn; + node_ptr nn(node_traits::get_next(n)); + + if(pos != n) { + //Node is the first of the group + bn = group_functions_t::get_prev_to_first_in_group(ne, n); + + //Unlink the rest of the group if it's not the last node of its group + if(nn != ne && group_traits::get_next(nn) == n){ + group_algorithms::unlink_after(nn); + } + } + else if(nn != ne && group_traits::get_next(nn) == n){ + //Node is not the end of the group + bn = group_traits::get_next(n); + group_algorithms::unlink_after(nn); + } + else{ + //Node is the end of the group + bn = group_traits::get_next(n); + node_ptr const x(group_algorithms::get_previous_node(n)); + group_algorithms::unlink_after(x); + } + b.erase_after_and_dispose(bucket_type::s_iterator_to(*bn), node_disposer); + } + + template + BOOST_INTRUSIVE_FORCEINLINE static void priv_erase_node(bucket_type &b, siterator i, NodeDisposer node_disposer, detail::false_) //optimize multikey + { b.erase_after_and_dispose(b.previous(i), node_disposer); } + + template + size_type priv_erase_node_range( siterator const &before_first_it, size_type const first_bucket + , siterator const &last_it, size_type const last_bucket + , NodeDisposer node_disposer, detail::bool_ optimize_multikey_tag) + { + size_type num_erased(0); + siterator last_step_before_it; + if(first_bucket != last_bucket){ + bucket_type *b = (&this->priv_bucket_pointer()[0]); + num_erased += this->priv_erase_from_single_bucket + (b[first_bucket], before_first_it, b[first_bucket].end(), node_disposer, optimize_multikey_tag); + for(size_type i = 0, n = (last_bucket - first_bucket - 1); i != n; ++i){ + num_erased += this->priv_erase_whole_bucket(b[first_bucket+i+1], node_disposer); + } + last_step_before_it = b[last_bucket].before_begin(); + } + else{ + last_step_before_it = before_first_it; + } + num_erased += this->priv_erase_from_single_bucket + (this->priv_bucket_pointer()[last_bucket], last_step_before_it, last_it, node_disposer, optimize_multikey_tag); + return num_erased; + } + + static siterator priv_get_last(bucket_type &b, detail::true_) //optimize multikey + { + //First find the last node of p's group. + //This requires checking the first node of the next group or + //the bucket node. + slist_node_ptr end_ptr(b.end().pointed_node()); + node_ptr possible_end(node_traits::get_next( detail::dcast_bucket_ptr(end_ptr))); + node_ptr last_node_group(possible_end); + + while(end_ptr != possible_end){ + last_node_group = group_traits::get_next(detail::dcast_bucket_ptr(possible_end)); + possible_end = node_traits::get_next(last_node_group); + } + return bucket_type::s_iterator_to(*last_node_group); + } + + template + size_type priv_erase_whole_bucket(bucket_type &b, NodeDisposer node_disposer) + { + size_type num_erased = 0; + siterator b_begin(b.before_begin()); + siterator nxt(b_begin); + ++nxt; + siterator const end_sit(b.end()); + while(nxt != end_sit){ + //No need to init group links as we'll delete all bucket nodes + nxt = bucket_type::s_erase_after_and_dispose(b_begin, node_disposer); + ++num_erased; + } + return num_erased; + } + + BOOST_INTRUSIVE_FORCEINLINE static siterator priv_get_last(bucket_type &b, detail::false_) //NOT optimize multikey + { return b.previous(b.end()); } + + static siterator priv_get_previous(bucket_type &b, siterator i, detail::true_) //optimize multikey + { + node_ptr const elem(detail::dcast_bucket_ptr(i.pointed_node())); + node_ptr const prev_in_group(group_traits::get_next(elem)); + bool const first_in_group = node_traits::get_next(prev_in_group) != elem; + typename bucket_type::node &n = first_in_group + ? *group_functions_t::get_prev_to_first_in_group(b.end().pointed_node(), elem) + : *group_traits::get_next(elem) + ; + return bucket_type::s_iterator_to(n); + } + + BOOST_INTRUSIVE_FORCEINLINE static siterator priv_get_previous(bucket_type &b, siterator i, detail::false_) //NOT optimize multikey + { return b.previous(i); } + + std::size_t priv_get_bucket_num_no_hash_store(siterator it, detail::true_) //optimize multikey + { + const bucket_ptr f(this->priv_bucket_pointer()), l(f + this->priv_bucket_count() - 1); + slist_node_ptr bb = group_functions_t::get_bucket_before_begin + ( f->end().pointed_node() + , l->end().pointed_node() + , detail::dcast_bucket_ptr(it.pointed_node())); + //Now get the bucket_impl from the iterator + const bucket_type &b = static_cast + (bucket_type::slist_type::container_from_end_iterator(bucket_type::s_iterator_to(*bb))); + //Now just calculate the index b has in the bucket array + return static_cast(&b - &*f); + } + + std::size_t priv_get_bucket_num_no_hash_store(siterator it, detail::false_) //NO optimize multikey + { + bucket_ptr f(this->priv_bucket_pointer()), l(f + this->priv_bucket_count() - 1); + slist_node_ptr first_ptr(f->cend().pointed_node()) + , last_ptr(l->cend().pointed_node()); + + //The end node is embedded in the singly linked list: + //iterate until we reach it. + while(!(first_ptr <= it.pointed_node() && it.pointed_node() <= last_ptr)){ + ++it; + } + //Now get the bucket_impl from the iterator + const bucket_type &b = static_cast + (bucket_type::container_from_end_iterator(it)); + + //Now just calculate the index b has in the bucket array + return static_cast(&b - &*f); + } + + BOOST_INTRUSIVE_FORCEINLINE static std::size_t priv_stored_hash(slist_node_ptr n, detail::true_) //store_hash + { return node_traits::get_hash(detail::dcast_bucket_ptr(n)); } + + BOOST_INTRUSIVE_FORCEINLINE static std::size_t priv_stored_hash(slist_node_ptr, detail::false_) //NO store_hash + { return std::size_t(-1); } + + BOOST_INTRUSIVE_FORCEINLINE node &priv_value_to_node(reference v) + { return *this->priv_value_traits().to_node_ptr(v); } + + BOOST_INTRUSIVE_FORCEINLINE const node &priv_value_to_node(const_reference v) const + { return *this->priv_value_traits().to_node_ptr(v); } + + BOOST_INTRUSIVE_FORCEINLINE reference priv_value_from_slist_node(slist_node_ptr n) + { return *this->priv_value_traits().to_value_ptr(detail::dcast_bucket_ptr(n)); } + + BOOST_INTRUSIVE_FORCEINLINE const_reference priv_value_from_slist_node(slist_node_ptr n) const + { return *this->priv_value_traits().to_value_ptr(detail::dcast_bucket_ptr(n)); } + + void priv_clear_buckets(const bucket_ptr buckets_ptr, const size_type bucket_cnt) + { + bucket_ptr buckets_it = buckets_ptr; + for(size_type bucket_i = 0; bucket_i != bucket_cnt; ++buckets_it, ++bucket_i){ + if(safemode_or_autounlink){ + buckets_it->clear_and_dispose(detail::init_disposer()); + } + else{ + buckets_it->clear(); + } + } + } + + BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_stored_or_compute_hash(const value_type &v, detail::true_) const //For store_hash == true + { return node_traits::get_hash(this->priv_value_traits().to_node_ptr(v)); } + + typedef hashtable_iterator iterator; + typedef hashtable_iterator const_iterator; + + BOOST_INTRUSIVE_FORCEINLINE iterator end() + { return iterator(this->priv_invalid_local_it(), 0); } + + BOOST_INTRUSIVE_FORCEINLINE const_iterator end() const + { return this->cend(); } + + BOOST_INTRUSIVE_FORCEINLINE const_iterator cend() const + { return const_iterator(this->priv_invalid_local_it(), 0); } + + static size_type suggested_upper_bucket_count(size_type n) + { + const std::size_t *primes = &prime_list_holder<0>::prime_list[0]; + const std::size_t *primes_end = primes + prime_list_holder<0>::prime_list_size; + std::size_t const* bound = std::lower_bound(primes, primes_end, n); + bound -= (bound == primes_end); + return size_type(*bound); + } + + static size_type suggested_lower_bucket_count(size_type n) + { + const std::size_t *primes = &prime_list_holder<0>::prime_list[0]; + const std::size_t *primes_end = primes + prime_list_holder<0>::prime_list_size; + size_type const* bound = std::upper_bound(primes, primes_end, n); + bound -= (bound != primes); + return size_type(*bound); + } + + //Public functions: + struct data_type : public ValueTraits + { + template + BOOST_INTRUSIVE_FORCEINLINE data_type(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits) + : ValueTraits(val_traits), bucket_traits_(::boost::forward(b_traits)) + {} + + bucket_traits bucket_traits_; + } data; +}; + +template +struct get_hash +{ + typedef Hash type; +}; + +template +struct get_hash +{ + typedef ::boost::hash type; +}; + +template +struct get_equal_to +{ + typedef EqualTo type; +}; + +template +struct get_equal_to +{ + typedef std::equal_to type; +}; + +template +struct get_hash_key_of_value +{ + typedef KeyOfValue type; +}; + +template +struct get_hash_key_of_value +{ + typedef ::boost::intrusive::detail::identity type; +}; + +template +struct hash_key_types_base +{ + typedef typename get_hash_key_of_value + < VoidOrKeyOfValue, T>::type key_of_value; + typedef typename key_of_value::type key_type; +}; + +template +struct hash_key_hash + : get_hash + < VoidOrKeyHash + , typename hash_key_types_base::key_type + > +{}; + +template +struct hash_key_equal + : get_equal_to + < VoidOrKeyEqual + , typename hash_key_types_base::key_type + > + +{}; + +//bucket_hash_t +//Stores bucket_plus_vtraits plust the hash function +template +struct bucket_hash_t + //Use public inheritance to avoid MSVC bugs with closures + : public detail::ebo_functor_holder + ::value_traits::value_type + , VoidOrKeyOfValue + , VoidOrKeyHash + >::type + > + , bucket_plus_vtraits //4 +{ + typedef typename bucket_plus_vtraits::value_traits value_traits; + typedef typename value_traits::value_type value_type; + typedef typename value_traits::node_traits node_traits; + typedef hash_key_hash + < value_type, VoidOrKeyOfValue, VoidOrKeyHash> hash_key_hash_t; + typedef typename hash_key_hash_t::type hasher; + typedef typename hash_key_types_base::key_of_value key_of_value; + + typedef BucketTraits bucket_traits; + typedef bucket_plus_vtraits bucket_plus_vtraits_t; + typedef detail::ebo_functor_holder base_t; + + template + BOOST_INTRUSIVE_FORCEINLINE bucket_hash_t(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits, const hasher & h) + : detail::ebo_functor_holder(h), bucket_plus_vtraits_t(val_traits, ::boost::forward(b_traits)) + {} + + BOOST_INTRUSIVE_FORCEINLINE const hasher &priv_hasher() const + { return this->base_t::get(); } + + hasher &priv_hasher() + { return this->base_t::get(); } + + using bucket_plus_vtraits_t::priv_stored_or_compute_hash; //For store_hash == true + + BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_stored_or_compute_hash(const value_type &v, detail::false_) const //For store_hash == false + { return this->priv_hasher()(key_of_value()(v)); } +}; + +template +struct hashtable_equal_holder +{ + typedef detail::ebo_functor_holder + < typename hash_key_equal < typename bucket_plus_vtraits::value_traits::value_type + , VoidOrKeyOfValue + , VoidOrKeyEqual + >::type + > type; +}; + + +//bucket_hash_equal_t +//Stores bucket_hash_t and the equality function when the first +//non-empty bucket shall not be cached. +template +struct bucket_hash_equal_t + //Use public inheritance to avoid MSVC bugs with closures + : public bucket_hash_t //3 + , public hashtable_equal_holder::type //equal +{ + typedef typename hashtable_equal_holder + ::type equal_holder_t; + typedef bucket_hash_t bucket_hash_type; + typedef bucket_plus_vtraits bucket_plus_vtraits_t; + typedef ValueTraits value_traits; + typedef typename equal_holder_t::functor_type key_equal; + typedef typename bucket_hash_type::hasher hasher; + typedef BucketTraits bucket_traits; + typedef typename bucket_plus_vtraits_t::slist_impl slist_impl; + typedef typename slist_impl::size_type size_type; + typedef typename slist_impl::iterator siterator; + typedef detail::bucket_impl bucket_type; + typedef typename detail::unordered_bucket_ptr_impl::type bucket_ptr; + + template + bucket_hash_equal_t(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits, const hasher & h, const key_equal &e) + : bucket_hash_type(val_traits, ::boost::forward(b_traits), h) + , equal_holder_t(e) + {} + + BOOST_INTRUSIVE_FORCEINLINE bucket_ptr priv_get_cache() + { return this->bucket_hash_type::priv_bucket_pointer(); } + + BOOST_INTRUSIVE_FORCEINLINE void priv_set_cache(const bucket_ptr &) + {} + + BOOST_INTRUSIVE_FORCEINLINE size_type priv_get_cache_bucket_num() + { return 0u; } + + BOOST_INTRUSIVE_FORCEINLINE void priv_initialize_cache() + {} + + BOOST_INTRUSIVE_FORCEINLINE void priv_swap_cache(bucket_hash_equal_t &) + {} + + siterator priv_begin() const + { + size_type n = 0; + size_type bucket_cnt = this->bucket_hash_type::priv_bucket_count(); + for (n = 0; n < bucket_cnt; ++n){ + bucket_type &b = this->bucket_hash_type::priv_bucket_pointer()[n]; + if(!b.empty()){ + return b.begin(); + } + } + return this->bucket_hash_type::priv_invalid_local_it(); + } + + BOOST_INTRUSIVE_FORCEINLINE void priv_insertion_update_cache(size_type) + {} + + BOOST_INTRUSIVE_FORCEINLINE void priv_erasure_update_cache_range(size_type, size_type) + {} + + BOOST_INTRUSIVE_FORCEINLINE void priv_erasure_update_cache() + {} + + BOOST_INTRUSIVE_FORCEINLINE const key_equal &priv_equal() const + { return this->equal_holder_t::get(); } + + BOOST_INTRUSIVE_FORCEINLINE key_equal &priv_equal() + { return this->equal_holder_t::get(); } +}; + +//bucket_hash_equal_t +//Stores bucket_hash_t and the equality function when the first +//non-empty bucket shall be cached. +template //cache_begin == true version +struct bucket_hash_equal_t + //Use public inheritance to avoid MSVC bugs with closures + : bucket_hash_t //2 + , hashtable_equal_holder::type +{ + typedef typename hashtable_equal_holder + ::type equal_holder_t; + + typedef bucket_plus_vtraits bucket_plus_vtraits_t; + typedef ValueTraits value_traits; + typedef typename equal_holder_t::functor_type key_equal; + typedef bucket_hash_t bucket_hash_type; + typedef typename bucket_hash_type::hasher hasher; + typedef BucketTraits bucket_traits; + typedef typename bucket_plus_vtraits_t::slist_impl::size_type size_type; + typedef typename bucket_plus_vtraits_t::slist_impl::iterator siterator; + + template + bucket_hash_equal_t(const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits, const hasher & h, const key_equal &e) + : bucket_hash_type(val_traits, ::boost::forward(b_traits), h) + , equal_holder_t(e) + {} + + typedef typename detail::unordered_bucket_ptr_impl + ::type bucket_ptr; + + BOOST_INTRUSIVE_FORCEINLINE bucket_ptr &priv_get_cache() + { return cached_begin_; } + + BOOST_INTRUSIVE_FORCEINLINE const bucket_ptr &priv_get_cache() const + { return cached_begin_; } + + BOOST_INTRUSIVE_FORCEINLINE void priv_set_cache(const bucket_ptr &p) + { cached_begin_ = p; } + + BOOST_INTRUSIVE_FORCEINLINE std::size_t priv_get_cache_bucket_num() + { return this->cached_begin_ - this->bucket_hash_type::priv_bucket_pointer(); } + + BOOST_INTRUSIVE_FORCEINLINE void priv_initialize_cache() + { this->cached_begin_ = this->bucket_hash_type::priv_invalid_bucket(); } + + BOOST_INTRUSIVE_FORCEINLINE void priv_swap_cache(bucket_hash_equal_t &other) + { + ::boost::adl_move_swap(this->cached_begin_, other.cached_begin_); + } + + siterator priv_begin() const + { + if(this->cached_begin_ == this->bucket_hash_type::priv_invalid_bucket()){ + return this->bucket_hash_type::priv_invalid_local_it(); + } + else{ + return this->cached_begin_->begin(); + } + } + + void priv_insertion_update_cache(size_type insertion_bucket) + { + bucket_ptr p = this->bucket_hash_type::priv_bucket_pointer() + insertion_bucket; + if(p < this->cached_begin_){ + this->cached_begin_ = p; + } + } + + BOOST_INTRUSIVE_FORCEINLINE const key_equal &priv_equal() const + { return this->equal_holder_t::get(); } + + BOOST_INTRUSIVE_FORCEINLINE key_equal &priv_equal() + { return this->equal_holder_t::get(); } + + void priv_erasure_update_cache_range(size_type first_bucket_num, size_type last_bucket_num) + { + //If the last bucket is the end, the cache must be updated + //to the last position if all + if(this->priv_get_cache_bucket_num() == first_bucket_num && + this->bucket_hash_type::priv_bucket_pointer()[first_bucket_num].empty() ){ + this->priv_set_cache(this->bucket_hash_type::priv_bucket_pointer() + last_bucket_num); + this->priv_erasure_update_cache(); + } + } + + void priv_erasure_update_cache() + { + if(this->cached_begin_ != this->bucket_hash_type::priv_invalid_bucket()){ + size_type current_n = this->priv_get_cache() - this->bucket_hash_type::priv_bucket_pointer(); + for( const size_type num_buckets = this->bucket_hash_type::priv_bucket_count() + ; current_n < num_buckets + ; ++current_n, ++this->priv_get_cache()){ + if(!this->priv_get_cache()->empty()){ + return; + } + } + this->priv_initialize_cache(); + } + } + + bucket_ptr cached_begin_; +}; + +//This wrapper around size_traits is used +//to maintain minimal container size with compilers like MSVC +//that have problems with EBO and multiple empty base classes +template +struct hashtable_size_traits_wrapper + : public DeriveFrom +{ + template + hashtable_size_traits_wrapper( BOOST_FWD_REF(Base) base, BOOST_FWD_REF(Arg0) arg0 + , BOOST_FWD_REF(Arg1) arg1, BOOST_FWD_REF(Arg2) arg2) + : DeriveFrom(::boost::forward(base) + , ::boost::forward(arg0) + , ::boost::forward(arg1) + , ::boost::forward(arg2)) + {} + typedef detail::size_holder < true, SizeType> size_traits;//size_traits + + size_traits size_traits_; + + typedef const size_traits & size_traits_const_t; + typedef size_traits & size_traits_t; + + BOOST_INTRUSIVE_FORCEINLINE size_traits_const_t priv_size_traits() const + { return size_traits_; } + + BOOST_INTRUSIVE_FORCEINLINE size_traits_t priv_size_traits() + { return size_traits_; } +}; + +template +struct hashtable_size_traits_wrapper + : public DeriveFrom +{ + template + hashtable_size_traits_wrapper( BOOST_FWD_REF(Base) base, BOOST_FWD_REF(Arg0) arg0 + , BOOST_FWD_REF(Arg1) arg1, BOOST_FWD_REF(Arg2) arg2) + : DeriveFrom(::boost::forward(base) + , ::boost::forward(arg0) + , ::boost::forward(arg1) + , ::boost::forward(arg2)) + {} + + typedef detail::size_holder< false, SizeType> size_traits; + + typedef size_traits size_traits_const_t; + typedef size_traits size_traits_t; + + BOOST_INTRUSIVE_FORCEINLINE size_traits priv_size_traits() const + { return size_traits(); } +}; + +//hashdata_internal +//Stores bucket_hash_equal_t and split_traits +template +struct hashdata_internal + : public hashtable_size_traits_wrapper + < bucket_hash_equal_t + < ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual + , BucketTraits + , 0 != (BoolFlags & hash_bool_flags::cache_begin_pos) + > //2 + , SizeType + , (BoolFlags & hash_bool_flags::incremental_pos) != 0 + > +{ + typedef hashtable_size_traits_wrapper + < bucket_hash_equal_t + < ValueTraits, VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual + , BucketTraits + , 0 != (BoolFlags & hash_bool_flags::cache_begin_pos) + > //2 + , SizeType + , (BoolFlags & hash_bool_flags::incremental_pos) != 0 + > internal_type; + typedef typename internal_type::key_equal key_equal; + typedef typename internal_type::hasher hasher; + typedef bucket_plus_vtraits bucket_plus_vtraits_t; + typedef typename bucket_plus_vtraits_t::size_type size_type; + typedef typename internal_type::size_traits split_traits; + typedef typename bucket_plus_vtraits_t::bucket_ptr bucket_ptr; + typedef typename bucket_plus_vtraits_t::const_value_traits_ptr const_value_traits_ptr; + typedef typename bucket_plus_vtraits_t::siterator siterator; + typedef typename bucket_plus_vtraits_t::bucket_traits bucket_traits; + typedef typename bucket_plus_vtraits_t::value_traits value_traits; + typedef typename bucket_plus_vtraits_t::bucket_type bucket_type; + typedef typename value_traits::value_type value_type; + typedef typename value_traits::pointer pointer; + typedef typename value_traits::const_pointer const_pointer; + typedef typename pointer_traits::reference reference; + typedef typename pointer_traits + ::reference const_reference; + typedef typename value_traits::node_traits node_traits; + typedef typename node_traits::node node; + typedef typename node_traits::node_ptr node_ptr; + typedef typename node_traits::const_node_ptr const_node_ptr; + typedef detail::node_functions node_functions_t; + typedef typename detail::get_slist_impl + ::type + >::type slist_impl; + typedef typename slist_impl::node_algorithms node_algorithms; + typedef typename slist_impl::node_ptr slist_node_ptr; + + typedef hash_key_types_base + < typename ValueTraits::value_type + , VoidOrKeyOfValue + > hash_types_base; + typedef typename hash_types_base::key_of_value key_of_value; + + static const bool store_hash = detail::store_hash_is_true::value; + static const bool safemode_or_autounlink = is_safe_autounlink::value; + static const bool stateful_value_traits = detail::is_stateful_value_traits::value; + + typedef detail::bool_ store_hash_t; + + typedef detail::transform_iterator + < typename slist_impl::iterator + , downcast_node_to_value_t + < value_traits + , false> > local_iterator; + + typedef detail::transform_iterator + < typename slist_impl::iterator + , downcast_node_to_value_t + < value_traits + , true> > const_local_iterator; + // + + template + hashdata_internal( const ValueTraits &val_traits, BOOST_FWD_REF(BucketTraitsType) b_traits + , const hasher & h, const key_equal &e) + : internal_type(val_traits, ::boost::forward(b_traits), h, e) + {} + + BOOST_INTRUSIVE_FORCEINLINE typename internal_type::size_traits_t priv_split_traits() + { return this->priv_size_traits(); } + + BOOST_INTRUSIVE_FORCEINLINE typename internal_type::size_traits_const_t priv_split_traits() const + { return this->priv_size_traits(); } + + ~hashdata_internal() + { this->priv_clear_buckets(); } + + void priv_clear_buckets() + { + this->internal_type::priv_clear_buckets + ( this->priv_get_cache() + , this->internal_type::priv_bucket_count() + - (this->priv_get_cache() + - this->internal_type::priv_bucket_pointer())); + } + + void priv_clear_buckets_and_cache() + { + this->priv_clear_buckets(); + this->priv_initialize_cache(); + } + + void priv_initialize_buckets_and_cache() + { + this->internal_type::priv_clear_buckets + ( this->internal_type::priv_bucket_pointer() + , this->internal_type::priv_bucket_count()); + this->priv_initialize_cache(); + } + + typedef hashtable_iterator iterator; + typedef hashtable_iterator const_iterator; + + static std::size_t priv_stored_hash(slist_node_ptr n, detail::true_ true_value) + { return bucket_plus_vtraits::priv_stored_hash(n, true_value); } + + static std::size_t priv_stored_hash(slist_node_ptr n, detail::false_ false_value) + { return bucket_plus_vtraits::priv_stored_hash(n, false_value); } + + //public functions + BOOST_INTRUSIVE_FORCEINLINE SizeType split_count() const + { + return this->priv_split_traits().get_size(); + } + + BOOST_INTRUSIVE_FORCEINLINE iterator iterator_to(reference value) + { + return iterator(bucket_type::s_iterator_to + (this->priv_value_to_node(value)), &this->get_bucket_value_traits()); + } + + const_iterator iterator_to(const_reference value) const + { + siterator const sit = bucket_type::s_iterator_to + ( *pointer_traits::const_cast_from + (pointer_traits::pointer_to(this->priv_value_to_node(value))) + ); + return const_iterator(sit, &this->get_bucket_value_traits()); + } + + static local_iterator s_local_iterator_to(reference value) + { + BOOST_STATIC_ASSERT((!stateful_value_traits)); + siterator sit = bucket_type::s_iterator_to(*value_traits::to_node_ptr(value)); + return local_iterator(sit, const_value_traits_ptr()); + } + + static const_local_iterator s_local_iterator_to(const_reference value) + { + BOOST_STATIC_ASSERT((!stateful_value_traits)); + siterator const sit = bucket_type::s_iterator_to + ( *pointer_traits::const_cast_from + (value_traits::to_node_ptr(value)) + ); + return const_local_iterator(sit, const_value_traits_ptr()); + } + + local_iterator local_iterator_to(reference value) + { + siterator sit = bucket_type::s_iterator_to(this->priv_value_to_node(value)); + return local_iterator(sit, this->priv_value_traits_ptr()); + } + + const_local_iterator local_iterator_to(const_reference value) const + { + siterator sit = bucket_type::s_iterator_to + ( *pointer_traits::const_cast_from + (pointer_traits::pointer_to(this->priv_value_to_node(value))) + ); + return const_local_iterator(sit, this->priv_value_traits_ptr()); + } + + BOOST_INTRUSIVE_FORCEINLINE size_type bucket_count() const + { return this->priv_bucket_count(); } + + BOOST_INTRUSIVE_FORCEINLINE size_type bucket_size(size_type n) const + { return this->priv_bucket_pointer()[n].size(); } + + BOOST_INTRUSIVE_FORCEINLINE bucket_ptr bucket_pointer() const + { return this->priv_bucket_pointer(); } + + BOOST_INTRUSIVE_FORCEINLINE local_iterator begin(size_type n) + { return local_iterator(this->priv_bucket_pointer()[n].begin(), this->priv_value_traits_ptr()); } + + BOOST_INTRUSIVE_FORCEINLINE const_local_iterator begin(size_type n) const + { return this->cbegin(n); } + + const_local_iterator cbegin(size_type n) const + { + return const_local_iterator + ( pointer_traits::const_cast_from(this->priv_bucket_pointer())[n].begin() + , this->priv_value_traits_ptr()); + } + + using internal_type::end; + using internal_type::cend; + local_iterator end(size_type n) + { return local_iterator(this->priv_bucket_pointer()[n].end(), this->priv_value_traits_ptr()); } + + BOOST_INTRUSIVE_FORCEINLINE const_local_iterator end(size_type n) const + { return this->cend(n); } + + const_local_iterator cend(size_type n) const + { + return const_local_iterator + ( pointer_traits::const_cast_from(this->priv_bucket_pointer())[n].end() + , this->priv_value_traits_ptr()); + } + + //Public functions for hashtable_impl + + BOOST_INTRUSIVE_FORCEINLINE iterator begin() + { return iterator(this->priv_begin(), &this->get_bucket_value_traits()); } + + BOOST_INTRUSIVE_FORCEINLINE const_iterator begin() const + { return this->cbegin(); } + + BOOST_INTRUSIVE_FORCEINLINE const_iterator cbegin() const + { return const_iterator(this->priv_begin(), &this->get_bucket_value_traits()); } + + BOOST_INTRUSIVE_FORCEINLINE hasher hash_function() const + { return this->priv_hasher(); } + + BOOST_INTRUSIVE_FORCEINLINE key_equal key_eq() const + { return this->priv_equal(); } +}; + +/// @endcond + +//! The class template hashtable is an intrusive hash table container, that +//! is used to construct intrusive unordered_set and unordered_multiset containers. The +//! no-throw guarantee holds only, if the VoidOrKeyEqual object and Hasher don't throw. +//! +//! hashtable is a semi-intrusive container: each object to be stored in the +//! container must contain a proper hook, but the container also needs +//! additional auxiliary memory to work: hashtable needs a pointer to an array +//! of type `bucket_type` to be passed in the constructor. This bucket array must +//! have at least the same lifetime as the container. This makes the use of +//! hashtable more complicated than purely intrusive containers. +//! `bucket_type` is default-constructible, copyable and assignable +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<>, \c hash<> and \c equal<> +//! \c bucket_traits<>, power_2_buckets<>, cache_begin<> and incremental<>. +//! +//! hashtable only provides forward iterators but it provides 4 iterator types: +//! iterator and const_iterator to navigate through the whole container and +//! local_iterator and const_local_iterator to navigate through the values +//! stored in a single bucket. Local iterators are faster and smaller. +//! +//! It's not recommended to use non constant-time size hashtables because several +//! key functions, like "empty()", become non-constant time functions. Non +//! constant_time size hashtables are mainly provided to support auto-unlink hooks. +//! +//! hashtables, does not make automatic rehashings nor +//! offers functions related to a load factor. Rehashing can be explicitly requested +//! and the user must provide a new bucket array that will be used from that moment. +//! +//! Since no automatic rehashing is done, iterators are never invalidated when +//! inserting or erasing elements. Iterators are only invalidated when rehashing. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class hashtable_impl + : private hashtable_size_traits_wrapper + < hashdata_internal + < ValueTraits + , VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual + , BucketTraits, SizeType + , BoolFlags & (hash_bool_flags::incremental_pos | hash_bool_flags::cache_begin_pos) //1 + > + , SizeType + , (BoolFlags & hash_bool_flags::constant_time_size_pos) != 0 + > +{ + typedef hashtable_size_traits_wrapper + < hashdata_internal + < ValueTraits + , VoidOrKeyOfValue, VoidOrKeyHash, VoidOrKeyEqual + , BucketTraits, SizeType + , BoolFlags & (hash_bool_flags::incremental_pos | hash_bool_flags::cache_begin_pos) //1 + > + , SizeType + , (BoolFlags & hash_bool_flags::constant_time_size_pos) != 0 + > internal_type; + typedef typename internal_type::size_traits size_traits; + typedef hash_key_types_base + < typename ValueTraits::value_type + , VoidOrKeyOfValue + > hash_types_base; + public: + typedef ValueTraits value_traits; + + /// @cond + typedef BucketTraits bucket_traits; + + typedef typename internal_type::slist_impl slist_impl; + typedef bucket_plus_vtraits bucket_plus_vtraits_t; + typedef typename bucket_plus_vtraits_t::const_value_traits_ptr const_value_traits_ptr; + + using internal_type::begin; + using internal_type::cbegin; + using internal_type::end; + using internal_type::cend; + using internal_type::hash_function; + using internal_type::key_eq; + using internal_type::bucket_size; + using internal_type::bucket_count; + using internal_type::local_iterator_to; + using internal_type::s_local_iterator_to; + using internal_type::iterator_to; + using internal_type::bucket_pointer; + using internal_type::suggested_upper_bucket_count; + using internal_type::suggested_lower_bucket_count; + using internal_type::split_count; + + /// @endcond + + typedef typename value_traits::pointer pointer; + typedef typename value_traits::const_pointer const_pointer; + typedef typename value_traits::value_type value_type; + typedef typename hash_types_base::key_type key_type; + typedef typename hash_types_base::key_of_value key_of_value; + typedef typename pointer_traits::reference reference; + typedef typename pointer_traits::reference const_reference; + typedef typename pointer_traits::difference_type difference_type; + typedef SizeType size_type; + typedef typename internal_type::key_equal key_equal; + typedef typename internal_type::hasher hasher; + typedef detail::bucket_impl bucket_type; + typedef typename internal_type::bucket_ptr bucket_ptr; + typedef typename slist_impl::iterator siterator; + typedef typename slist_impl::const_iterator const_siterator; + typedef typename internal_type::iterator iterator; + typedef typename internal_type::const_iterator const_iterator; + typedef typename internal_type::local_iterator local_iterator; + typedef typename internal_type::const_local_iterator const_local_iterator; + typedef typename value_traits::node_traits node_traits; + typedef typename node_traits::node node; + typedef typename pointer_traits + ::template rebind_pointer + < node >::type node_ptr; + typedef typename pointer_traits + ::template rebind_pointer + < const node >::type const_node_ptr; + typedef typename pointer_traits + ::reference node_reference; + typedef typename pointer_traits + ::reference const_node_reference; + typedef typename slist_impl::node_algorithms node_algorithms; + + static const bool stateful_value_traits = internal_type::stateful_value_traits; + static const bool store_hash = internal_type::store_hash; + + static const bool unique_keys = 0 != (BoolFlags & hash_bool_flags::unique_keys_pos); + static const bool constant_time_size = 0 != (BoolFlags & hash_bool_flags::constant_time_size_pos); + static const bool cache_begin = 0 != (BoolFlags & hash_bool_flags::cache_begin_pos); + static const bool compare_hash = 0 != (BoolFlags & hash_bool_flags::compare_hash_pos); + static const bool incremental = 0 != (BoolFlags & hash_bool_flags::incremental_pos); + static const bool power_2_buckets = incremental || (0 != (BoolFlags & hash_bool_flags::power_2_buckets_pos)); + + static const bool optimize_multikey + = detail::optimize_multikey_is_true::value && !unique_keys; + + /// @cond + static const bool is_multikey = !unique_keys; + private: + + //Configuration error: compare_hash<> can't be specified without store_hash<> + //See documentation for more explanations + BOOST_STATIC_ASSERT((!compare_hash || store_hash)); + + typedef typename slist_impl::node_ptr slist_node_ptr; + typedef typename pointer_traits + ::template rebind_pointer + < void >::type void_pointer; + //We'll define group traits, but these won't be instantiated if + //optimize_multikey is not true + typedef unordered_group_adapter group_traits; + typedef circular_slist_algorithms group_algorithms; + typedef typename internal_type::store_hash_t store_hash_t; + typedef detail::bool_ optimize_multikey_t; + typedef detail::bool_ cache_begin_t; + typedef detail::bool_ power_2_buckets_t; + typedef typename internal_type::split_traits split_traits; + typedef detail::group_functions group_functions_t; + typedef detail::node_functions node_functions_t; + + private: + //noncopyable, movable + BOOST_MOVABLE_BUT_NOT_COPYABLE(hashtable_impl) + + static const bool safemode_or_autounlink = internal_type::safemode_or_autounlink; + + //Constant-time size is incompatible with auto-unlink hooks! + BOOST_STATIC_ASSERT(!(constant_time_size && ((int)value_traits::link_mode == (int)auto_unlink))); + //Cache begin is incompatible with auto-unlink hooks! + BOOST_STATIC_ASSERT(!(cache_begin && ((int)value_traits::link_mode == (int)auto_unlink))); + + template + struct typeof_node_disposer + { + typedef node_cast_adaptor + < detail::node_disposer< Disposer, value_traits, CircularSListAlgorithms> + , slist_node_ptr, node_ptr > type; + }; + + template + typename typeof_node_disposer::type + make_node_disposer(const Disposer &disposer) const + { + typedef typename typeof_node_disposer::type return_t; + return return_t(disposer, &this->priv_value_traits()); + } + + /// @endcond + + public: + typedef detail::insert_commit_data_impl insert_commit_data; + + + public: + + //! Requires: buckets must not be being used by any other resource. + //! + //! Effects: Constructs an empty unordered_set, storing a reference + //! to the bucket array and copies of the key_hasher and equal_func functors. + //! + //! Complexity: Constant. + //! + //! Throws: If value_traits::node_traits::node + //! constructor throws (this does not happen with predefined Boost.Intrusive hooks) + //! or the copy constructor or invocation of hash_func or equal_func throws. + //! + //! Notes: buckets array must be disposed only after + //! *this is disposed. + explicit hashtable_impl ( const bucket_traits &b_traits + , const hasher & hash_func = hasher() + , const key_equal &equal_func = key_equal() + , const value_traits &v_traits = value_traits()) + : internal_type(v_traits, b_traits, hash_func, equal_func) + { + this->priv_initialize_buckets_and_cache(); + this->priv_size_traits().set_size(size_type(0)); + size_type bucket_sz = this->priv_bucket_count(); + BOOST_INTRUSIVE_INVARIANT_ASSERT(bucket_sz != 0); + //Check power of two bucket array if the option is activated + BOOST_INTRUSIVE_INVARIANT_ASSERT + (!power_2_buckets || (0 == (bucket_sz & (bucket_sz-1)))); + this->priv_split_traits().set_size(bucket_sz>>1); + } + + //! Requires: buckets must not be being used by any other resource + //! and dereferencing iterator must yield an lvalue of type value_type. + //! + //! Effects: Constructs an empty container and inserts elements from + //! [b, e). + //! + //! Complexity: If N is distance(b, e): Average case is O(N) + //! (with a good hash function and with buckets_len >= N),worst case O(N^2). + //! + //! Throws: If value_traits::node_traits::node + //! constructor throws (this does not happen with predefined Boost.Intrusive hooks) + //! or the copy constructor or invocation of hasher or key_equal throws. + //! + //! Notes: buckets array must be disposed only after + //! *this is disposed. + template + hashtable_impl ( bool unique, Iterator b, Iterator e + , const bucket_traits &b_traits + , const hasher & hash_func = hasher() + , const key_equal &equal_func = key_equal() + , const value_traits &v_traits = value_traits()) + : internal_type(v_traits, b_traits, hash_func, equal_func) + { + this->priv_initialize_buckets_and_cache(); + this->priv_size_traits().set_size(size_type(0)); + size_type bucket_sz = this->priv_bucket_count(); + BOOST_INTRUSIVE_INVARIANT_ASSERT(bucket_sz != 0); + //Check power of two bucket array if the option is activated + BOOST_INTRUSIVE_INVARIANT_ASSERT + (!power_2_buckets || (0 == (bucket_sz & (bucket_sz-1)))); + this->priv_split_traits().set_size(bucket_sz>>1); + //Now insert + if(unique) + this->insert_unique(b, e); + else + this->insert_equal(b, e); + } + + //! Effects: to-do + //! + hashtable_impl(BOOST_RV_REF(hashtable_impl) x) + : internal_type( ::boost::move(x.priv_value_traits()) + , ::boost::move(x.priv_bucket_traits()) + , ::boost::move(x.priv_hasher()) + , ::boost::move(x.priv_equal()) + ) + { + this->priv_swap_cache(x); + x.priv_initialize_cache(); + this->priv_size_traits().set_size(x.priv_size_traits().get_size()); + x.priv_size_traits().set_size(size_type(0)); + this->priv_split_traits().set_size(x.priv_split_traits().get_size()); + x.priv_split_traits().set_size(size_type(0)); + } + + //! Effects: to-do + //! + hashtable_impl& operator=(BOOST_RV_REF(hashtable_impl) x) + { this->swap(x); return *this; } + + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + //! Effects: Detaches all elements from this. The objects in the unordered_set + //! are not deleted (i.e. no destructors are called). + //! + //! Complexity: Linear to the number of elements in the unordered_set, if + //! it's a safe-mode or auto-unlink value. Otherwise constant. + //! + //! Throws: Nothing. + ~hashtable_impl(); + + //! Effects: Returns an iterator pointing to the beginning of the unordered_set. + //! + //! Complexity: Amortized constant time. + //! Worst case (empty unordered_set): O(this->bucket_count()) + //! + //! Throws: Nothing. + iterator begin(); + + //! Effects: Returns a const_iterator pointing to the beginning + //! of the unordered_set. + //! + //! Complexity: Amortized constant time. + //! Worst case (empty unordered_set): O(this->bucket_count()) + //! + //! Throws: Nothing. + const_iterator begin() const; + + //! Effects: Returns a const_iterator pointing to the beginning + //! of the unordered_set. + //! + //! Complexity: Amortized constant time. + //! Worst case (empty unordered_set): O(this->bucket_count()) + //! + //! Throws: Nothing. + const_iterator cbegin() const; + + //! Effects: Returns an iterator pointing to the end of the unordered_set. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + iterator end(); + + //! Effects: Returns a const_iterator pointing to the end of the unordered_set. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + const_iterator end() const; + + //! Effects: Returns a const_iterator pointing to the end of the unordered_set. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + const_iterator cend() const; + + //! Effects: Returns the hasher object used by the unordered_set. + //! + //! Complexity: Constant. + //! + //! Throws: If hasher copy-constructor throws. + hasher hash_function() const; + + //! Effects: Returns the key_equal object used by the unordered_set. + //! + //! Complexity: Constant. + //! + //! Throws: If key_equal copy-constructor throws. + key_equal key_eq() const; + + #endif + + //! Effects: Returns true if the container is empty. + //! + //! Complexity: if constant-time size and cache_begin options are disabled, + //! average constant time (worst case, with empty() == true: O(this->bucket_count()). + //! Otherwise constant. + //! + //! Throws: Nothing. + bool empty() const + { + if(constant_time_size){ + return !this->size(); + } + else if(cache_begin){ + return this->begin() == this->end(); + } + else{ + size_type bucket_cnt = this->priv_bucket_count(); + const bucket_type *b = boost::intrusive::detail::to_raw_pointer(this->priv_bucket_pointer()); + for (size_type n = 0; n < bucket_cnt; ++n, ++b){ + if(!b->empty()){ + return false; + } + } + return true; + } + } + + //! Effects: Returns the number of elements stored in the unordered_set. + //! + //! Complexity: Linear to elements contained in *this if + //! constant_time_size is false. Constant-time otherwise. + //! + //! Throws: Nothing. + size_type size() const + { + if(constant_time_size) + return this->priv_size_traits().get_size(); + else{ + size_type len = 0; + size_type bucket_cnt = this->priv_bucket_count(); + const bucket_type *b = boost::intrusive::detail::to_raw_pointer(this->priv_bucket_pointer()); + for (size_type n = 0; n < bucket_cnt; ++n, ++b){ + len += b->size(); + } + return len; + } + } + + //! Requires: the hasher and the equality function unqualified swap + //! call should not throw. + //! + //! Effects: Swaps the contents of two unordered_sets. + //! Swaps also the contained bucket array and equality and hasher functors. + //! + //! Complexity: Constant. + //! + //! Throws: If the swap() call for the comparison or hash functors + //! found using ADL throw. Basic guarantee. + void swap(hashtable_impl& other) + { + //These can throw + ::boost::adl_move_swap(this->priv_equal(), other.priv_equal()); + ::boost::adl_move_swap(this->priv_hasher(), other.priv_hasher()); + //These can't throw + ::boost::adl_move_swap(this->priv_bucket_traits(), other.priv_bucket_traits()); + ::boost::adl_move_swap(this->priv_value_traits(), other.priv_value_traits()); + this->priv_swap_cache(other); + this->priv_size_traits().swap(other.priv_size_traits()); + this->priv_split_traits().swap(other.priv_split_traits()); + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw + //! Cloner should yield to nodes that compare equal and produce the same + //! hash than the original node. + //! + //! Effects: Erases all the elements from *this + //! calling Disposer::operator()(pointer), clones all the + //! elements from src calling Cloner::operator()(const_reference ) + //! and inserts them on *this. The hash function and the equality + //! predicate are copied from the source. + //! + //! If store_hash option is true, this method does not use the hash function. + //! + //! If any operation throws, all cloned elements are unlinked and disposed + //! calling Disposer::operator()(pointer). + //! + //! Complexity: Linear to erased plus inserted elements. + //! + //! Throws: If cloner or hasher throw or hash or equality predicate copying + //! throws. Basic guarantee. + template + BOOST_INTRUSIVE_FORCEINLINE void clone_from(const hashtable_impl &src, Cloner cloner, Disposer disposer) + { this->priv_clone_from(src, cloner, disposer); } + + //! Requires: Disposer::operator()(pointer) shouldn't throw + //! Cloner should yield to nodes that compare equal and produce the same + //! hash than the original node. + //! + //! Effects: Erases all the elements from *this + //! calling Disposer::operator()(pointer), clones all the + //! elements from src calling Cloner::operator()(reference) + //! and inserts them on *this. The hash function and the equality + //! predicate are copied from the source. + //! + //! If store_hash option is true, this method does not use the hash function. + //! + //! If any operation throws, all cloned elements are unlinked and disposed + //! calling Disposer::operator()(pointer). + //! + //! Complexity: Linear to erased plus inserted elements. + //! + //! Throws: If cloner or hasher throw or hash or equality predicate copying + //! throws. Basic guarantee. + template + BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(hashtable_impl) src, Cloner cloner, Disposer disposer) + { this->priv_clone_from(static_cast(src), cloner, disposer); } + + //! Requires: value must be an lvalue + //! + //! Effects: Inserts the value into the unordered_set. + //! + //! Returns: An iterator to the inserted value. + //! + //! Complexity: Average case O(1), worst case O(this->size()). + //! + //! Throws: If the internal hasher or the equality functor throws. Strong guarantee. + //! + //! Note: Does not affect the validity of iterators and references. + //! No copy-constructors are called. + iterator insert_equal(reference value) + { + size_type bucket_num; + std::size_t hash_value; + siterator prev; + siterator const it = this->priv_find + (key_of_value()(value), this->priv_hasher(), this->priv_equal(), bucket_num, hash_value, prev); + bool const next_is_in_group = optimize_multikey && it != this->priv_invalid_local_it(); + return this->priv_insert_equal_after_find(value, bucket_num, hash_value, prev, next_is_in_group); + } + + //! Requires: Dereferencing iterator must yield an lvalue + //! of type value_type. + //! + //! Effects: Equivalent to this->insert_equal(t) for each element in [b, e). + //! + //! Complexity: Average case O(N), where N is distance(b, e). + //! Worst case O(N*this->size()). + //! + //! Throws: If the internal hasher or the equality functor throws. Basic guarantee. + //! + //! Note: Does not affect the validity of iterators and references. + //! No copy-constructors are called. + template + void insert_equal(Iterator b, Iterator e) + { + for (; b != e; ++b) + this->insert_equal(*b); + } + + //! Requires: value must be an lvalue + //! + //! Effects: Tries to inserts value into the unordered_set. + //! + //! Returns: If the value + //! is not already present inserts it and returns a pair containing the + //! iterator to the new value and true. If there is an equivalent value + //! returns a pair containing an iterator to the already present value + //! and false. + //! + //! Complexity: Average case O(1), worst case O(this->size()). + //! + //! Throws: If the internal hasher or the equality functor throws. Strong guarantee. + //! + //! Note: Does not affect the validity of iterators and references. + //! No copy-constructors are called. + std::pair insert_unique(reference value) + { + insert_commit_data commit_data; + std::pair ret = this->insert_unique_check(key_of_value()(value), commit_data); + if(ret.second){ + ret.first = this->insert_unique_commit(value, commit_data); + } + return ret; + } + + //! Requires: Dereferencing iterator must yield an lvalue + //! of type value_type. + //! + //! Effects: Equivalent to this->insert_unique(t) for each element in [b, e). + //! + //! Complexity: Average case O(N), where N is distance(b, e). + //! Worst case O(N*this->size()). + //! + //! Throws: If the internal hasher or the equality functor throws. Basic guarantee. + //! + //! Note: Does not affect the validity of iterators and references. + //! No copy-constructors are called. + template + void insert_unique(Iterator b, Iterator e) + { + for (; b != e; ++b) + this->insert_unique(*b); + } + + //! Requires: "hash_func" must be a hash function that induces + //! the same hash values as the stored hasher. The difference is that + //! "hash_func" hashes the given key instead of the value_type. + //! + //! "equal_func" must be a equality function that induces + //! the same equality as key_equal. The difference is that + //! "equal_func" compares an arbitrary key with the contained values. + //! + //! Effects: Checks if a value can be inserted in the unordered_set, using + //! a user provided key instead of the value itself. + //! + //! Returns: If there is an equivalent value + //! returns a pair containing an iterator to the already present value + //! and false. If the value can be inserted returns true in the returned + //! pair boolean and fills "commit_data" that is meant to be used with + //! the "insert_commit" function. + //! + //! Complexity: Average case O(1), worst case O(this->size()). + //! + //! Throws: If hash_func or equal_func throw. Strong guarantee. + //! + //! Notes: This function is used to improve performance when constructing + //! a value_type is expensive: if there is an equivalent value + //! the constructed object must be discarded. Many times, the part of the + //! node that is used to impose the hash or the equality is much cheaper to + //! construct than the value_type and this function offers the possibility to + //! use that the part to check if the insertion will be successful. + //! + //! If the check is successful, the user can construct the value_type and use + //! "insert_commit" to insert the object in constant-time. + //! + //! "commit_data" remains valid for a subsequent "insert_commit" only if no more + //! objects are inserted or erased from the unordered_set. + //! + //! After a successful rehashing insert_commit_data remains valid. + template + std::pair insert_unique_check + ( const KeyType &key + , KeyHasher hash_func + , KeyEqual equal_func + , insert_commit_data &commit_data) + { + size_type bucket_num; + siterator prev; + siterator const pos = this->priv_find(key, hash_func, equal_func, bucket_num, commit_data.hash, prev); + return std::pair + ( iterator(pos, &this->get_bucket_value_traits()) + , pos == this->priv_invalid_local_it()); + } + + //! Effects: Checks if a value can be inserted in the unordered_set, using + //! a user provided key instead of the value itself. + //! + //! Returns: If there is an equivalent value + //! returns a pair containing an iterator to the already present value + //! and false. If the value can be inserted returns true in the returned + //! pair boolean and fills "commit_data" that is meant to be used with + //! the "insert_commit" function. + //! + //! Complexity: Average case O(1), worst case O(this->size()). + //! + //! Throws: If hasher or key_compare throw. Strong guarantee. + //! + //! Notes: This function is used to improve performance when constructing + //! a value_type is expensive: if there is an equivalent value + //! the constructed object must be discarded. Many times, the part of the + //! node that is used to impose the hash or the equality is much cheaper to + //! construct than the value_type and this function offers the possibility to + //! use that the part to check if the insertion will be successful. + //! + //! If the check is successful, the user can construct the value_type and use + //! "insert_commit" to insert the object in constant-time. + //! + //! "commit_data" remains valid for a subsequent "insert_commit" only if no more + //! objects are inserted or erased from the unordered_set. + //! + //! After a successful rehashing insert_commit_data remains valid. + BOOST_INTRUSIVE_FORCEINLINE std::pair insert_unique_check + ( const key_type &key, insert_commit_data &commit_data) + { return this->insert_unique_check(key, this->priv_hasher(), this->priv_equal(), commit_data); } + + //! Requires: value must be an lvalue of type value_type. commit_data + //! must have been obtained from a previous call to "insert_check". + //! No objects should have been inserted or erased from the unordered_set between + //! the "insert_check" that filled "commit_data" and the call to "insert_commit". + //! + //! Effects: Inserts the value in the unordered_set using the information obtained + //! from the "commit_data" that a previous "insert_check" filled. + //! + //! Returns: An iterator to the newly inserted object. + //! + //! Complexity: Constant time. + //! + //! Throws: Nothing. + //! + //! Notes: This function has only sense if a "insert_check" has been + //! previously executed to fill "commit_data". No value should be inserted or + //! erased between the "insert_check" and "insert_commit" calls. + //! + //! After a successful rehashing insert_commit_data remains valid. + iterator insert_unique_commit(reference value, const insert_commit_data &commit_data) + { + size_type bucket_num = this->priv_hash_to_bucket(commit_data.hash); + bucket_type &b = this->priv_bucket_pointer()[bucket_num]; + this->priv_size_traits().increment(); + node_ptr const n = pointer_traits::pointer_to(this->priv_value_to_node(value)); + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::unique(n)); + node_functions_t::store_hash(n, commit_data.hash, store_hash_t()); + this->priv_insertion_update_cache(bucket_num); + group_functions_t::insert_in_group(n, n, optimize_multikey_t()); + return iterator(b.insert_after(b.before_begin(), *n), &this->get_bucket_value_traits()); + } + + //! Effects: Erases the element pointed to by i. + //! + //! Complexity: Average case O(1), worst case O(this->size()). + //! + //! Throws: Nothing. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased element. No destructors are called. + BOOST_INTRUSIVE_FORCEINLINE void erase(const_iterator i) + { this->erase_and_dispose(i, detail::null_disposer()); } + + //! Effects: Erases the range pointed to by b end e. + //! + //! Complexity: Average case O(distance(b, e)), + //! worst case O(this->size()). + //! + //! Throws: Nothing. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. No destructors are called. + BOOST_INTRUSIVE_FORCEINLINE void erase(const_iterator b, const_iterator e) + { this->erase_and_dispose(b, e, detail::null_disposer()); } + + //! Effects: Erases all the elements with the given value. + //! + //! Returns: The number of erased elements. + //! + //! Complexity: Average case O(this->count(value)). + //! Worst case O(this->size()). + //! + //! Throws: If the internal hasher or the equality functor throws. + //! Basic guarantee. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. No destructors are called. + BOOST_INTRUSIVE_FORCEINLINE size_type erase(const key_type &key) + { return this->erase(key, this->priv_hasher(), this->priv_equal()); } + + //! Requires: "hash_func" must be a hash function that induces + //! the same hash values as the stored hasher. The difference is that + //! "hash_func" hashes the given key instead of the value_type. + //! + //! "equal_func" must be a equality function that induces + //! the same equality as key_equal. The difference is that + //! "equal_func" compares an arbitrary key with the contained values. + //! + //! Effects: Erases all the elements that have the same hash and + //! compare equal with the given key. + //! + //! Returns: The number of erased elements. + //! + //! Complexity: Average case O(this->count(value)). + //! Worst case O(this->size()). + //! + //! Throws: If hash_func or equal_func throw. Basic guarantee. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. No destructors are called. + template + BOOST_INTRUSIVE_FORCEINLINE size_type erase(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func) + { return this->erase_and_dispose(key, hash_func, equal_func, detail::null_disposer()); } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases the element pointed to by i. + //! Disposer::operator()(pointer) is called for the removed element. + //! + //! Complexity: Average case O(1), worst case O(this->size()). + //! + //! Throws: Nothing. + //! + //! Note: Invalidates the iterators + //! to the erased elements. + template + BOOST_INTRUSIVE_DOC1ST(void + , typename detail::disable_if_convertible::type) + erase_and_dispose(const_iterator i, Disposer disposer) + { + //Get the bucket number and local iterator for both iterators + siterator const first_local_it(i.slist_it()); + size_type const first_bucket_num = this->priv_get_bucket_num(first_local_it); + this->priv_erase_node(this->priv_bucket_pointer()[first_bucket_num], first_local_it, make_node_disposer(disposer), optimize_multikey_t()); + this->priv_size_traits().decrement(); + this->priv_erasure_update_cache_range(first_bucket_num, first_bucket_num); + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases the range pointed to by b end e. + //! Disposer::operator()(pointer) is called for the removed elements. + //! + //! Complexity: Average case O(distance(b, e)), + //! worst case O(this->size()). + //! + //! Throws: Nothing. + //! + //! Note: Invalidates the iterators + //! to the erased elements. + template + void erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer) + { + if(b != e){ + //Get the bucket number and local iterator for both iterators + siterator first_local_it(b.slist_it()); + size_type first_bucket_num = this->priv_get_bucket_num(first_local_it); + + const bucket_ptr buck_ptr = this->priv_bucket_pointer(); + siterator before_first_local_it + = this->priv_get_previous(buck_ptr[first_bucket_num], first_local_it); + size_type last_bucket_num; + siterator last_local_it; + + //For the end iterator, we will assign the end iterator + //of the last bucket + if(e == this->end()){ + last_bucket_num = this->bucket_count() - 1; + last_local_it = buck_ptr[last_bucket_num].end(); + } + else{ + last_local_it = e.slist_it(); + last_bucket_num = this->priv_get_bucket_num(last_local_it); + } + size_type const num_erased = this->priv_erase_node_range + ( before_first_local_it, first_bucket_num, last_local_it, last_bucket_num + , make_node_disposer(disposer), optimize_multikey_t()); + this->priv_size_traits().set_size(this->priv_size_traits().get_size()-num_erased); + this->priv_erasure_update_cache_range(first_bucket_num, last_bucket_num); + } + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases all the elements with the given value. + //! Disposer::operator()(pointer) is called for the removed elements. + //! + //! Returns: The number of erased elements. + //! + //! Complexity: Average case O(this->count(value)). + //! Worst case O(this->size()). + //! + //! Throws: If the internal hasher or the equality functor throws. + //! Basic guarantee. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. No destructors are called. + template + BOOST_INTRUSIVE_FORCEINLINE size_type erase_and_dispose(const key_type &key, Disposer disposer) + { return this->erase_and_dispose(key, this->priv_hasher(), this->priv_equal(), disposer); } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases all the elements with the given key. + //! according to the comparison functor "equal_func". + //! Disposer::operator()(pointer) is called for the removed elements. + //! + //! Returns: The number of erased elements. + //! + //! Complexity: Average case O(this->count(value)). + //! Worst case O(this->size()). + //! + //! Throws: If hash_func or equal_func throw. Basic guarantee. + //! + //! Note: Invalidates the iterators + //! to the erased elements. + template + size_type erase_and_dispose(const KeyType& key, KeyHasher hash_func + ,KeyEqual equal_func, Disposer disposer) + { + size_type bucket_num; + std::size_t h; + siterator prev; + siterator it = this->priv_find(key, hash_func, equal_func, bucket_num, h, prev); + bool const success = it != this->priv_invalid_local_it(); + + size_type cnt(0); + if(success){ + if(optimize_multikey){ + cnt = this->priv_erase_from_single_bucket + (this->priv_bucket_pointer()[bucket_num], prev, ++(priv_last_in_group)(it), make_node_disposer(disposer), optimize_multikey_t()); + } + else{ + bucket_type &b = this->priv_bucket_pointer()[bucket_num]; + siterator const end_sit = b.end(); + do{ + ++cnt; + ++it; + }while(it != end_sit && + this->priv_is_value_equal_to_key + (this->priv_value_from_slist_node(it.pointed_node()), h, key, equal_func)); + bucket_type::s_erase_after_and_dispose(prev, it, make_node_disposer(disposer)); + } + this->priv_size_traits().set_size(this->priv_size_traits().get_size()-cnt); + this->priv_erasure_update_cache(); + } + + return cnt; + } + + //! Effects: Erases all of the elements. + //! + //! Complexity: Linear to the number of elements on the container. + //! if it's a safe-mode or auto-unlink value_type. Constant time otherwise. + //! + //! Throws: Nothing. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. No destructors are called. + void clear() + { + this->priv_clear_buckets_and_cache(); + this->priv_size_traits().set_size(size_type(0)); + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases all of the elements. + //! + //! Complexity: Linear to the number of elements on the container. + //! Disposer::operator()(pointer) is called for the removed elements. + //! + //! Throws: Nothing. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. No destructors are called. + template + void clear_and_dispose(Disposer disposer) + { + if(!constant_time_size || !this->empty()){ + size_type num_buckets = this->bucket_count(); + bucket_ptr b = this->priv_bucket_pointer(); + typename typeof_node_disposer::type d(disposer, &this->priv_value_traits()); + for(; num_buckets--; ++b){ + b->clear_and_dispose(d); + } + this->priv_size_traits().set_size(size_type(0)); + } + this->priv_initialize_cache(); + } + + //! Effects: Returns the number of contained elements with the given value + //! + //! Complexity: Average case O(1), worst case O(this->size()). + //! + //! Throws: If the internal hasher or the equality functor throws. + BOOST_INTRUSIVE_FORCEINLINE size_type count(const key_type &key) const + { return this->count(key, this->priv_hasher(), this->priv_equal()); } + + //! Requires: "hash_func" must be a hash function that induces + //! the same hash values as the stored hasher. The difference is that + //! "hash_func" hashes the given key instead of the value_type. + //! + //! "equal_func" must be a equality function that induces + //! the same equality as key_equal. The difference is that + //! "equal_func" compares an arbitrary key with the contained values. + //! + //! Effects: Returns the number of contained elements with the given key + //! + //! Complexity: Average case O(1), worst case O(this->size()). + //! + //! Throws: If hash_func or equal throw. + template + size_type count(const KeyType &key, KeyHasher hash_func, KeyEqual equal_func) const + { + size_type cnt; + size_type n_bucket; + this->priv_local_equal_range(key, hash_func, equal_func, n_bucket, cnt); + return cnt; + } + + //! Effects: Finds an iterator to the first element is equal to + //! "value" or end() if that element does not exist. + //! + //! Complexity: Average case O(1), worst case O(this->size()). + //! + //! Throws: If the internal hasher or the equality functor throws. + BOOST_INTRUSIVE_FORCEINLINE iterator find(const key_type &key) + { return this->find(key, this->priv_hasher(), this->priv_equal()); } + + //! Requires: "hash_func" must be a hash function that induces + //! the same hash values as the stored hasher. The difference is that + //! "hash_func" hashes the given key instead of the value_type. + //! + //! "equal_func" must be a equality function that induces + //! the same equality as key_equal. The difference is that + //! "equal_func" compares an arbitrary key with the contained values. + //! + //! Effects: Finds an iterator to the first element whose key is + //! "key" according to the given hash and equality functor or end() if + //! that element does not exist. + //! + //! Complexity: Average case O(1), worst case O(this->size()). + //! + //! Throws: If hash_func or equal_func throw. + //! + //! Note: This function is used when constructing a value_type + //! is expensive and the value_type can be compared with a cheaper + //! key type. Usually this key is part of the value_type. + template + iterator find(const KeyType &key, KeyHasher hash_func, KeyEqual equal_func) + { + size_type bucket_n; + std::size_t hash; + siterator prev; + return iterator( this->priv_find(key, hash_func, equal_func, bucket_n, hash, prev) + , &this->get_bucket_value_traits()); + } + + //! Effects: Finds a const_iterator to the first element whose key is + //! "key" or end() if that element does not exist. + //! + //! Complexity: Average case O(1), worst case O(this->size()). + //! + //! Throws: If the internal hasher or the equality functor throws. + BOOST_INTRUSIVE_FORCEINLINE const_iterator find(const key_type &key) const + { return this->find(key, this->priv_hasher(), this->priv_equal()); } + + //! Requires: "hash_func" must be a hash function that induces + //! the same hash values as the stored hasher. The difference is that + //! "hash_func" hashes the given key instead of the value_type. + //! + //! "equal_func" must be a equality function that induces + //! the same equality as key_equal. The difference is that + //! "equal_func" compares an arbitrary key with the contained values. + //! + //! Effects: Finds an iterator to the first element whose key is + //! "key" according to the given hasher and equality functor or end() if + //! that element does not exist. + //! + //! Complexity: Average case O(1), worst case O(this->size()). + //! + //! Throws: If hash_func or equal_func throw. + //! + //! Note: This function is used when constructing a value_type + //! is expensive and the value_type can be compared with a cheaper + //! key type. Usually this key is part of the value_type. + template + const_iterator find + (const KeyType &key, KeyHasher hash_func, KeyEqual equal_func) const + { + size_type bucket_n; + std::size_t hash_value; + siterator prev; + return const_iterator( this->priv_find(key, hash_func, equal_func, bucket_n, hash_value, prev) + , &this->get_bucket_value_traits()); + } + + //! Effects: Returns a range containing all elements with values equivalent + //! to value. Returns std::make_pair(this->end(), this->end()) if no such + //! elements exist. + //! + //! Complexity: Average case O(this->count(value)). Worst case O(this->size()). + //! + //! Throws: If the internal hasher or the equality functor throws. + BOOST_INTRUSIVE_FORCEINLINE std::pair equal_range(const key_type &key) + { return this->equal_range(key, this->priv_hasher(), this->priv_equal()); } + + //! Requires: "hash_func" must be a hash function that induces + //! the same hash values as the stored hasher. The difference is that + //! "hash_func" hashes the given key instead of the value_type. + //! + //! "equal_func" must be a equality function that induces + //! the same equality as key_equal. The difference is that + //! "equal_func" compares an arbitrary key with the contained values. + //! + //! Effects: Returns a range containing all elements with equivalent + //! keys. Returns std::make_pair(this->end(), this->end()) if no such + //! elements exist. + //! + //! Complexity: Average case O(this->count(key, hash_func, equal_func)). + //! Worst case O(this->size()). + //! + //! Throws: If hash_func or the equal_func throw. + //! + //! Note: This function is used when constructing a value_type + //! is expensive and the value_type can be compared with a cheaper + //! key type. Usually this key is part of the value_type. + template + std::pair equal_range + (const KeyType &key, KeyHasher hash_func, KeyEqual equal_func) + { + std::pair ret = + this->priv_equal_range(key, hash_func, equal_func); + return std::pair + ( iterator(ret.first, &this->get_bucket_value_traits()) + , iterator(ret.second, &this->get_bucket_value_traits())); + } + + //! Effects: Returns a range containing all elements with values equivalent + //! to value. Returns std::make_pair(this->end(), this->end()) if no such + //! elements exist. + //! + //! Complexity: Average case O(this->count(value)). Worst case O(this->size()). + //! + //! Throws: If the internal hasher or the equality functor throws. + BOOST_INTRUSIVE_FORCEINLINE std::pair + equal_range(const key_type &key) const + { return this->equal_range(key, this->priv_hasher(), this->priv_equal()); } + + //! Requires: "hash_func" must be a hash function that induces + //! the same hash values as the stored hasher. The difference is that + //! "hash_func" hashes the given key instead of the value_type. + //! + //! "equal_func" must be a equality function that induces + //! the same equality as key_equal. The difference is that + //! "equal_func" compares an arbitrary key with the contained values. + //! + //! Effects: Returns a range containing all elements with equivalent + //! keys. Returns std::make_pair(this->end(), this->end()) if no such + //! elements exist. + //! + //! Complexity: Average case O(this->count(key, hash_func, equal_func)). + //! Worst case O(this->size()). + //! + //! Throws: If the hasher or equal_func throw. + //! + //! Note: This function is used when constructing a value_type + //! is expensive and the value_type can be compared with a cheaper + //! key type. Usually this key is part of the value_type. + template + std::pair equal_range + (const KeyType &key, KeyHasher hash_func, KeyEqual equal_func) const + { + std::pair ret = + this->priv_equal_range(key, hash_func, equal_func); + return std::pair + ( const_iterator(ret.first, &this->get_bucket_value_traits()) + , const_iterator(ret.second, &this->get_bucket_value_traits())); + } + + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + + //! Requires: value must be an lvalue and shall be in a unordered_set of + //! appropriate type. Otherwise the behavior is undefined. + //! + //! Effects: Returns: a valid iterator belonging to the unordered_set + //! that points to the value + //! + //! Complexity: Constant. + //! + //! Throws: If the internal hash function throws. + iterator iterator_to(reference value); + + //! Requires: value must be an lvalue and shall be in a unordered_set of + //! appropriate type. Otherwise the behavior is undefined. + //! + //! Effects: Returns: a valid const_iterator belonging to the + //! unordered_set that points to the value + //! + //! Complexity: Constant. + //! + //! Throws: If the internal hash function throws. + const_iterator iterator_to(const_reference value) const; + + //! Requires: value must be an lvalue and shall be in a unordered_set of + //! appropriate type. Otherwise the behavior is undefined. + //! + //! Effects: Returns: a valid local_iterator belonging to the unordered_set + //! that points to the value + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + //! + //! Note: This static function is available only if the value traits + //! is stateless. + static local_iterator s_local_iterator_to(reference value); + + //! Requires: value must be an lvalue and shall be in a unordered_set of + //! appropriate type. Otherwise the behavior is undefined. + //! + //! Effects: Returns: a valid const_local_iterator belonging to + //! the unordered_set that points to the value + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + //! + //! Note: This static function is available only if the value traits + //! is stateless. + static const_local_iterator s_local_iterator_to(const_reference value); + + //! Requires: value must be an lvalue and shall be in a unordered_set of + //! appropriate type. Otherwise the behavior is undefined. + //! + //! Effects: Returns: a valid local_iterator belonging to the unordered_set + //! that points to the value + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + local_iterator local_iterator_to(reference value); + + //! Requires: value must be an lvalue and shall be in a unordered_set of + //! appropriate type. Otherwise the behavior is undefined. + //! + //! Effects: Returns: a valid const_local_iterator belonging to + //! the unordered_set that points to the value + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + const_local_iterator local_iterator_to(const_reference value) const; + + //! Effects: Returns the number of buckets passed in the constructor + //! or the last rehash function. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + size_type bucket_count() const; + + //! Requires: n is in the range [0, this->bucket_count()). + //! + //! Effects: Returns the number of elements in the nth bucket. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + size_type bucket_size(size_type n) const; + #endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + + //! Effects: Returns the index of the bucket in which elements + //! with keys equivalent to k would be found, if any such element existed. + //! + //! Complexity: Constant. + //! + //! Throws: If the hash functor throws. + //! + //! Note: the return value is in the range [0, this->bucket_count()). + BOOST_INTRUSIVE_FORCEINLINE size_type bucket(const key_type& k) const + { return this->bucket(k, this->priv_hasher()); } + + //! Requires: "hash_func" must be a hash function that induces + //! the same hash values as the stored hasher. The difference is that + //! "hash_func" hashes the given key instead of the value_type. + //! + //! Effects: Returns the index of the bucket in which elements + //! with keys equivalent to k would be found, if any such element existed. + //! + //! Complexity: Constant. + //! + //! Throws: If hash_func throws. + //! + //! Note: the return value is in the range [0, this->bucket_count()). + template + BOOST_INTRUSIVE_FORCEINLINE size_type bucket(const KeyType& k, KeyHasher hash_func) const + { return this->priv_hash_to_bucket(hash_func(k)); } + + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + //! Effects: Returns the bucket array pointer passed in the constructor + //! or the last rehash function. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + bucket_ptr bucket_pointer() const; + + //! Requires: n is in the range [0, this->bucket_count()). + //! + //! Effects: Returns a local_iterator pointing to the beginning + //! of the sequence stored in the bucket n. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + //! + //! Note: [this->begin(n), this->end(n)) is a valid range + //! containing all of the elements in the nth bucket. + local_iterator begin(size_type n); + + //! Requires: n is in the range [0, this->bucket_count()). + //! + //! Effects: Returns a const_local_iterator pointing to the beginning + //! of the sequence stored in the bucket n. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + //! + //! Note: [this->begin(n), this->end(n)) is a valid range + //! containing all of the elements in the nth bucket. + const_local_iterator begin(size_type n) const; + + //! Requires: n is in the range [0, this->bucket_count()). + //! + //! Effects: Returns a const_local_iterator pointing to the beginning + //! of the sequence stored in the bucket n. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + //! + //! Note: [this->begin(n), this->end(n)) is a valid range + //! containing all of the elements in the nth bucket. + const_local_iterator cbegin(size_type n) const; + + //! Requires: n is in the range [0, this->bucket_count()). + //! + //! Effects: Returns a local_iterator pointing to the end + //! of the sequence stored in the bucket n. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + //! + //! Note: [this->begin(n), this->end(n)) is a valid range + //! containing all of the elements in the nth bucket. + local_iterator end(size_type n); + + //! Requires: n is in the range [0, this->bucket_count()). + //! + //! Effects: Returns a const_local_iterator pointing to the end + //! of the sequence stored in the bucket n. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + //! + //! Note: [this->begin(n), this->end(n)) is a valid range + //! containing all of the elements in the nth bucket. + const_local_iterator end(size_type n) const; + + //! Requires: n is in the range [0, this->bucket_count()). + //! + //! Effects: Returns a const_local_iterator pointing to the end + //! of the sequence stored in the bucket n. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + //! + //! Note: [this->begin(n), this->end(n)) is a valid range + //! containing all of the elements in the nth bucket. + const_local_iterator cend(size_type n) const; + #endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + + //! Requires: new_bucket_traits can hold a pointer to a new bucket array + //! or the same as the old bucket array with a different length. new_size is the length of the + //! the array pointed by new_buckets. If new_bucket_traits.bucket_begin() == this->bucket_pointer() + //! new_bucket_traits.bucket_count() can be bigger or smaller than this->bucket_count(). + //! 'new_bucket_traits' copy constructor should not throw. + //! + //! Effects: + //! If `new_bucket_traits.bucket_begin() == this->bucket_pointer()` is false, + //! unlinks values from the old bucket and inserts then in the new one according + //! to the hash value of values. + //! + //! If `new_bucket_traits.bucket_begin() == this->bucket_pointer()` is true, + //! the implementations avoids moving values as much as possible. + //! + //! Bucket traits hold by *this is assigned from new_bucket_traits. + //! If the container is configured as incremental<>, the split bucket is set + //! to the new bucket_count(). + //! + //! If store_hash option is true, this method does not use the hash function. + //! If false, the implementation tries to minimize calls to the hash function + //! (e.g. once for equivalent values if optimize_multikey is true). + //! + //! If rehash is successful updates the internal bucket_traits with new_bucket_traits. + //! + //! Complexity: Average case linear in this->size(), worst case quadratic. + //! + //! Throws: If the hasher functor throws. Basic guarantee. + BOOST_INTRUSIVE_FORCEINLINE void rehash(const bucket_traits &new_bucket_traits) + { this->rehash_impl(new_bucket_traits, false); } + + //! Note: This function is used when keys from inserted elements are changed + //! (e.g. a language change when key is a string) but uniqueness and hash properties are + //! preserved so a fast full rehash recovers invariants for *this without extracting and + //! reinserting all elements again. + //! + //! Requires: Calls produced to the hash function should not alter the value uniqueness + //! properties of already inserted elements. If hasher(key1) == hasher(key2) was true when + //! elements were inserted, it shall be true during calls produced in the execution of this function. + //! + //! key_equal is not called inside this function so it is assumed that key_equal(value1, value2) + //! should produce the same results as before for inserted elements. + //! + //! Effects: Reprocesses all values hold by *this, recalculating their hash values + //! and redistributing them though the buckets. + //! + //! If store_hash option is true, this method uses the hash function and updates the stored hash value. + //! + //! Complexity: Average case linear in this->size(), worst case quadratic. + //! + //! Throws: If the hasher functor throws. Basic guarantee. + BOOST_INTRUSIVE_FORCEINLINE void full_rehash() + { this->rehash_impl(this->priv_bucket_traits(), true); } + + //! Requires: + //! + //! Effects: + //! + //! Complexity: + //! + //! Throws: + //! + //! Note: this method is only available if incremental option is activated. + bool incremental_rehash(bool grow = true) + { + //This function is only available for containers with incremental hashing + BOOST_STATIC_ASSERT(( incremental && power_2_buckets )); + const size_type split_idx = this->priv_split_traits().get_size(); + const size_type bucket_cnt = this->priv_bucket_count(); + const bucket_ptr buck_ptr = this->priv_bucket_pointer(); + bool ret = false; + + if(grow){ + //Test if the split variable can be changed + if((ret = split_idx < bucket_cnt)){ + const size_type bucket_to_rehash = split_idx - bucket_cnt/2; + bucket_type &old_bucket = buck_ptr[bucket_to_rehash]; + this->priv_split_traits().increment(); + + //Anti-exception stuff: if an exception is thrown while + //moving elements from old_bucket to the target bucket, all moved + //elements are moved back to the original one. + detail::incremental_rehash_rollback rollback + ( buck_ptr[split_idx], old_bucket, this->priv_split_traits()); + for( siterator before_i(old_bucket.before_begin()), i(old_bucket.begin()), end_sit(old_bucket.end()) + ; i != end_sit; i = before_i, ++i){ + const value_type &v = this->priv_value_from_slist_node(i.pointed_node()); + const std::size_t hash_value = this->priv_stored_or_compute_hash(v, store_hash_t()); + const size_type new_n = this->priv_hash_to_bucket(hash_value); + siterator const last = (priv_last_in_group)(i); + if(new_n == bucket_to_rehash){ + before_i = last; + } + else{ + bucket_type &new_b = buck_ptr[new_n]; + new_b.splice_after(new_b.before_begin(), old_bucket, before_i, last); + } + } + rollback.release(); + this->priv_erasure_update_cache(); + } + } + else if((ret = split_idx > bucket_cnt/2)){ //!grow + const size_type target_bucket_num = split_idx - 1 - bucket_cnt/2; + bucket_type &target_bucket = buck_ptr[target_bucket_num]; + bucket_type &source_bucket = buck_ptr[split_idx-1]; + target_bucket.splice_after(target_bucket.cbefore_begin(), source_bucket); + this->priv_split_traits().decrement(); + this->priv_insertion_update_cache(target_bucket_num); + } + return ret; + } + + //! Effects: If new_bucket_traits.bucket_count() is not + //! this->bucket_count()/2 or this->bucket_count()*2, or + //! this->split_bucket() != new_bucket_traits.bucket_count() returns false + //! and does nothing. + //! + //! Otherwise, copy assigns new_bucket_traits to the internal bucket_traits + //! and transfers all the objects from old buckets to the new ones. + //! + //! Complexity: Linear to size(). + //! + //! Throws: Nothing + //! + //! Note: this method is only available if incremental option is activated. + bool incremental_rehash(const bucket_traits &new_bucket_traits) + { + //This function is only available for containers with incremental hashing + BOOST_STATIC_ASSERT(( incremental && power_2_buckets )); + size_type const new_bucket_traits_size = new_bucket_traits.bucket_count(); + size_type const cur_bucket_traits = this->priv_bucket_count(); + const size_type split_idx = this->split_count(); + + //Test new bucket size is consistent with internal bucket size and split count + if(new_bucket_traits_size/2 == cur_bucket_traits){ + if(!(split_idx >= cur_bucket_traits)) + return false; + } + else if(new_bucket_traits_size == cur_bucket_traits/2){ + if(!(split_idx <= new_bucket_traits_size)) + return false; + } + else{ + return false; + } + + const size_type ini_n = this->priv_get_cache_bucket_num(); + const bucket_ptr old_buckets = this->priv_bucket_pointer(); + this->priv_bucket_traits() = new_bucket_traits; + if(new_bucket_traits.bucket_begin() != old_buckets){ + for(size_type n = ini_n; n < split_idx; ++n){ + bucket_type &new_bucket = new_bucket_traits.bucket_begin()[n]; + bucket_type &old_bucket = old_buckets[n]; + new_bucket.splice_after(new_bucket.cbefore_begin(), old_bucket); + } + //Put cache to safe position + this->priv_initialize_cache(); + this->priv_insertion_update_cache(ini_n); + } + return true; + } + + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + + //! Requires: incremental<> option must be set + //! + //! Effects: returns the current split count + //! + //! Complexity: Constant + //! + //! Throws: Nothing + size_type split_count() const; + + //! Effects: Returns the nearest new bucket count optimized for + //! the container that is bigger or equal than n. This suggestion can be + //! used to create bucket arrays with a size that will usually improve + //! container's performance. If such value does not exist, the + //! higher possible value is returned. + //! + //! Complexity: Amortized constant time. + //! + //! Throws: Nothing. + static size_type suggested_upper_bucket_count(size_type n); + + //! Effects: Returns the nearest new bucket count optimized for + //! the container that is smaller or equal than n. This suggestion can be + //! used to create bucket arrays with a size that will usually improve + //! container's performance. If such value does not exist, the + //! lowest possible value is returned. + //! + //! Complexity: Amortized constant time. + //! + //! Throws: Nothing. + static size_type suggested_lower_bucket_count(size_type n); + #endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + + + friend bool operator==(const hashtable_impl &x, const hashtable_impl &y) + { + //Taken from N3068 + if(constant_time_size && x.size() != y.size()){ + return false; + } + for (const_iterator ix = x.cbegin(), ex = x.cend(); ix != ex; ++ix){ + std::pair eqx(x.equal_range(key_of_value()(*ix))), + eqy(y.equal_range(key_of_value()(*ix))); + if (boost::intrusive::iterator_distance(eqx.first, eqx.second) != + boost::intrusive::iterator_distance(eqy.first, eqy.second) || + !(priv_algo_is_permutation)(eqx.first, eqx.second, eqy.first) ){ + return false; + } + ix = eqx.second; + } + return true; + } + + friend bool operator!=(const hashtable_impl &x, const hashtable_impl &y) + { return !(x == y); } + + friend bool operator<(const hashtable_impl &x, const hashtable_impl &y) + { return ::boost::intrusive::algo_lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); } + + friend bool operator>(const hashtable_impl &x, const hashtable_impl &y) + { return y < x; } + + friend bool operator<=(const hashtable_impl &x, const hashtable_impl &y) + { return !(y < x); } + + friend bool operator>=(const hashtable_impl &x, const hashtable_impl &y) + { return !(x < y); } + + /// @cond + BOOST_INTRUSIVE_FORCEINLINE void check() const {} + private: + + void rehash_impl(const bucket_traits &new_bucket_traits, bool do_full_rehash) + { + const bucket_ptr new_buckets = new_bucket_traits.bucket_begin(); + size_type new_bucket_count = new_bucket_traits.bucket_count(); + const bucket_ptr old_buckets = this->priv_bucket_pointer(); + size_type old_bucket_count = this->priv_bucket_count(); + + //Check power of two bucket array if the option is activated + BOOST_INTRUSIVE_INVARIANT_ASSERT + (!power_2_buckets || (0 == (new_bucket_count & (new_bucket_count-1u)))); + + size_type n = this->priv_get_cache_bucket_num(); + const bool same_buffer = old_buckets == new_buckets; + //If the new bucket length is a common factor + //of the old one we can avoid hash calculations. + const bool fast_shrink = (!do_full_rehash) && (!incremental) && (old_bucket_count >= new_bucket_count) && + (power_2_buckets || (old_bucket_count % new_bucket_count) == 0); + //If we are shrinking the same bucket array and it's + //is a fast shrink, just rehash the last nodes + size_type new_first_bucket_num = new_bucket_count; + if(same_buffer && fast_shrink && (n < new_bucket_count)){ + new_first_bucket_num = n; + n = new_bucket_count; + } + + //Anti-exception stuff: they destroy the elements if something goes wrong. + //If the source and destination buckets are the same, the second rollback function + //is harmless, because all elements have been already unlinked and destroyed + typedef detail::init_disposer NodeDisposer; + typedef detail::exception_array_disposer ArrayDisposer; + NodeDisposer node_disp; + ArrayDisposer rollback1(new_buckets[0], node_disp, new_bucket_count); + ArrayDisposer rollback2(old_buckets[0], node_disp, old_bucket_count); + + //Put size in a safe value for rollback exception + size_type const size_backup = this->priv_size_traits().get_size(); + this->priv_size_traits().set_size(0); + //Put cache to safe position + this->priv_initialize_cache(); + this->priv_insertion_update_cache(size_type(0u)); + + //Iterate through nodes + for(; n < old_bucket_count; ++n){ + bucket_type &old_bucket = old_buckets[n]; + if(!fast_shrink){ + for( siterator before_i(old_bucket.before_begin()), i(old_bucket.begin()), end_sit(old_bucket.end()) + ; i != end_sit + ; i = before_i, ++i){ + + //First obtain hash value (and store it if do_full_rehash) + std::size_t hash_value; + if(do_full_rehash){ + value_type &v = this->priv_value_from_slist_node(i.pointed_node()); + hash_value = this->priv_hasher()(key_of_value()(v)); + node_functions_t::store_hash(pointer_traits::pointer_to(this->priv_value_to_node(v)), hash_value, store_hash_t()); + } + else{ + const value_type &v = this->priv_value_from_slist_node(i.pointed_node()); + hash_value = this->priv_stored_or_compute_hash(v, store_hash_t()); + } + + //Now calculate the new bucket position + const size_type new_n = detail::hash_to_bucket_split + (hash_value, new_bucket_count, new_bucket_count); + + //Update first used bucket cache + if(cache_begin && new_n < new_first_bucket_num) + new_first_bucket_num = new_n; + + //If the target bucket is new, transfer the whole group + siterator const last = (priv_last_in_group)(i); + + if(same_buffer && new_n == n){ + before_i = last; + } + else{ + bucket_type &new_b = new_buckets[new_n]; + new_b.splice_after(new_b.before_begin(), old_bucket, before_i, last); + } + } + } + else{ + const size_type new_n = detail::hash_to_bucket_split(n, new_bucket_count, new_bucket_count); + if(cache_begin && new_n < new_first_bucket_num) + new_first_bucket_num = new_n; + bucket_type &new_b = new_buckets[new_n]; + new_b.splice_after( new_b.before_begin() + , old_bucket + , old_bucket.before_begin() + , bucket_plus_vtraits_t::priv_get_last(old_bucket, optimize_multikey_t())); + } + } + + this->priv_size_traits().set_size(size_backup); + this->priv_split_traits().set_size(new_bucket_count); + if(&new_bucket_traits != &this->priv_bucket_traits()){ + this->priv_bucket_traits() = new_bucket_traits; + } + this->priv_initialize_cache(); + this->priv_insertion_update_cache(new_first_bucket_num); + rollback1.release(); + rollback2.release(); + } + + template + void priv_clone_from(MaybeConstHashtableImpl &src, Cloner cloner, Disposer disposer) + { + this->clear_and_dispose(disposer); + if(!constant_time_size || !src.empty()){ + const size_type src_bucket_count = src.bucket_count(); + const size_type dst_bucket_count = this->bucket_count(); + //Check power of two bucket array if the option is activated + BOOST_INTRUSIVE_INVARIANT_ASSERT + (!power_2_buckets || (0 == (src_bucket_count & (src_bucket_count-1)))); + BOOST_INTRUSIVE_INVARIANT_ASSERT + (!power_2_buckets || (0 == (dst_bucket_count & (dst_bucket_count-1)))); + //If src bucket count is bigger or equal, structural copy is possible + const bool structural_copy = (!incremental) && (src_bucket_count >= dst_bucket_count) && + (power_2_buckets || (src_bucket_count % dst_bucket_count) == 0); + if(structural_copy){ + this->priv_structural_clone_from(src, cloner, disposer); + } + else{ + //Unlike previous cloning algorithm, this can throw + //if cloner, hasher or comparison functor throw + typedef typename detail::if_c< detail::is_const::value + , typename MaybeConstHashtableImpl::const_iterator + , typename MaybeConstHashtableImpl::iterator + >::type clone_iterator; + clone_iterator b(src.begin()), e(src.end()); + detail::exception_disposer rollback(*this, disposer); + for(; b != e; ++b){ + //No need to check for duplicates and insert it in the first position + //as this is an unordered container. So use minimal insertion code + std::size_t const hash_to_store = this->priv_stored_or_compute_hash(*b, store_hash_t());; + size_type const bucket_number = this->priv_hash_to_bucket(hash_to_store); + typedef typename detail::if_c + ::value, const_reference, reference>::type reference_type; + reference_type r = *b; + this->priv_clone_front_in_bucket(bucket_number, r, hash_to_store, cloner); + } + rollback.release(); + } + } + } + + template + void priv_clone_front_in_bucket( size_type const bucket_number + , typename detail::identity::type src_ref + , std::size_t const hash_to_store, Cloner cloner) + { + //No need to check for duplicates and insert it in the first position + //as this is an unordered container. So use minimal insertion code + //std::size_t const hash_value = this->priv_stored_or_compute_hash(src_ref, store_hash_t());; + //size_type const bucket_number = this->priv_hash_to_bucket(hash_value); + bucket_type &cur_bucket = this->priv_bucket_pointer()[bucket_number]; + siterator const prev(cur_bucket.before_begin()); + //Just check if the cloned node is equal to the first inserted value in the new bucket + //as equal src values were contiguous and they should be already inserted in the + //destination bucket. + bool const next_is_in_group = optimize_multikey && !cur_bucket.empty() && + this->priv_equal()( key_of_value()(src_ref) + , key_of_value()(this->priv_value_from_slist_node((++siterator(prev)).pointed_node()))); + this->priv_insert_equal_after_find(*cloner(src_ref), bucket_number, hash_to_store, prev, next_is_in_group); + } + + template + void priv_structural_clone_from(MaybeConstHashtableImpl &src, Cloner cloner, Disposer disposer) + { + //First clone the first ones + const size_type src_bucket_count = src.bucket_count(); + const size_type dst_bucket_count = this->bucket_count(); + const bucket_ptr src_buckets = src.priv_bucket_pointer(); + const bucket_ptr dst_buckets = this->priv_bucket_pointer(); + size_type constructed = 0; + typedef node_cast_adaptor< detail::node_disposer + , slist_node_ptr, node_ptr > NodeDisposer; + NodeDisposer node_disp(disposer, &this->priv_value_traits()); + + detail::exception_array_disposer + rollback(dst_buckets[0], node_disp, constructed); + //Now insert the remaining ones using the modulo trick + for( //"constructed" already initialized + ; constructed < src_bucket_count + ; ++constructed){ + //Since incremental hashing can't be structurally copied, avoid hash_to_bucket_split + const std::size_t new_n = detail::hash_to_bucket(constructed, dst_bucket_count, detail::bool_()); + bucket_type &src_b = src_buckets[constructed]; + for( siterator b(src_b.begin()), e(src_b.end()); b != e; ++b){ + slist_node_ptr const n(b.pointed_node()); + typedef typename detail::if_c + ::value, const_reference, reference>::type reference_type; + reference_type r = this->priv_value_from_slist_node(n); + this->priv_clone_front_in_bucket + (new_n, r, this->priv_stored_hash(n, store_hash_t()), cloner); + } + } + this->priv_hasher() = src.priv_hasher(); + this->priv_equal() = src.priv_equal(); + rollback.release(); + this->priv_size_traits().set_size(src.priv_size_traits().get_size()); + this->priv_split_traits().set_size(dst_bucket_count); + this->priv_insertion_update_cache(0u); + this->priv_erasure_update_cache(); + } + + std::size_t priv_hash_to_bucket(std::size_t hash_value) const + { + return detail::hash_to_bucket_split + (hash_value, this->priv_bucket_traits().bucket_count(), this->priv_split_traits().get_size()); + } + + iterator priv_insert_equal_after_find(reference value, size_type bucket_num, std::size_t hash_value, siterator prev, bool const next_is_in_group) + { + //Now store hash if needed + node_ptr n = pointer_traits::pointer_to(this->priv_value_to_node(value)); + node_functions_t::store_hash(n, hash_value, store_hash_t()); + //Checks for some modes + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::unique(n)); + //Shortcut to optimize_multikey cases + group_functions_t::insert_in_group + ( next_is_in_group ? detail::dcast_bucket_ptr((++siterator(prev)).pointed_node()) : n + , n, optimize_multikey_t()); + //Update cache and increment size if needed + this->priv_insertion_update_cache(bucket_num); + this->priv_size_traits().increment(); + //Insert the element in the bucket after it + return iterator(bucket_type::s_insert_after(prev, *n), &this->get_bucket_value_traits()); + } + + template + siterator priv_find //In case it is not found previt is bucket.before_begin() + ( const KeyType &key, KeyHasher hash_func + , KeyEqual equal_func, size_type &bucket_number, std::size_t &h, siterator &previt) const + { + h = hash_func(key); + return this->priv_find_with_hash(key, equal_func, bucket_number, h, previt); + } + + template + bool priv_is_value_equal_to_key(const value_type &v, const std::size_t h, const KeyType &key, KeyEqual equal_func) const + { + (void)h; + return (!compare_hash || this->priv_stored_or_compute_hash(v, store_hash_t()) == h) && equal_func(key, key_of_value()(v)); + } + + //return previous iterator to the next equal range group in case + static siterator priv_last_in_group(const siterator &it_first_in_group) + { + return bucket_type::s_iterator_to + (*group_functions_t::get_last_in_group + (detail::dcast_bucket_ptr(it_first_in_group.pointed_node()), optimize_multikey_t())); + } + + template + siterator priv_find_with_hash //In case it is not found previt is bucket.before_begin() + ( const KeyType &key, KeyEqual equal_func, size_type &bucket_number, const std::size_t h, siterator &previt) const + { + bucket_number = this->priv_hash_to_bucket(h); + bucket_type &b = this->priv_bucket_pointer()[bucket_number]; + previt = b.before_begin(); + siterator it = previt; + siterator const endit = b.end(); + + while(++it != endit){ + if(this->priv_is_value_equal_to_key(this->priv_value_from_slist_node(it.pointed_node()), h, key, equal_func)){ + return it; + } + previt = it = (priv_last_in_group)(it); + } + previt = b.before_begin(); + return this->priv_invalid_local_it(); + } + + template + std::pair priv_local_equal_range + ( const KeyType &key + , KeyHasher hash_func + , KeyEqual equal_func + , size_type &found_bucket + , size_type &cnt) const + { + cnt = 0; + //Let's see if the element is present + + siterator prev; + size_type n_bucket; + std::size_t h; + std::pair to_return + ( this->priv_find(key, hash_func, equal_func, n_bucket, h, prev) + , this->priv_invalid_local_it()); + + if(to_return.first != to_return.second){ + found_bucket = n_bucket; + //If it's present, find the first that it's not equal in + //the same bucket + bucket_type &b = this->priv_bucket_pointer()[n_bucket]; + siterator it = to_return.first; + ++cnt; //At least one is found + if(optimize_multikey){ + to_return.second = ++(priv_last_in_group)(it); + cnt += boost::intrusive::iterator_distance(++it, to_return.second); + } + else{ + siterator const bend = b.end(); + while(++it != bend && + this->priv_is_value_equal_to_key(this->priv_value_from_slist_node(it.pointed_node()), h, key, equal_func)){ + ++cnt; + } + to_return.second = it; + } + } + return to_return; + } + + template + std::pair priv_equal_range + ( const KeyType &key + , KeyHasher hash_func + , KeyEqual equal_func) const + { + size_type n_bucket; + size_type cnt; + + //Let's see if the element is present + std::pair to_return + (this->priv_local_equal_range(key, hash_func, equal_func, n_bucket, cnt)); + //If not, find the next element as ".second" if ".second" local iterator + //is not pointing to an element. + bucket_ptr const bp = this->priv_bucket_pointer(); + if(to_return.first != to_return.second && + to_return.second == bp[n_bucket].end()){ + to_return.second = this->priv_invalid_local_it(); + ++n_bucket; + for( const size_type max_bucket = this->priv_bucket_count() + ; n_bucket != max_bucket + ; ++n_bucket){ + bucket_type &b = bp[n_bucket]; + if(!b.empty()){ + to_return.second = b.begin(); + break; + } + } + } + return to_return; + } + + std::size_t priv_get_bucket_num(siterator it) + { return this->priv_get_bucket_num_hash_dispatch(it, store_hash_t()); } + + std::size_t priv_get_bucket_num_hash_dispatch(siterator it, detail::true_) //store_hash + { + return this->priv_hash_to_bucket + (this->priv_stored_hash(it.pointed_node(), store_hash_t())); + } + + std::size_t priv_get_bucket_num_hash_dispatch(siterator it, detail::false_) //NO store_hash + { return this->priv_get_bucket_num_no_hash_store(it, optimize_multikey_t()); } + + static siterator priv_get_previous(bucket_type &b, siterator i) + { return bucket_plus_vtraits_t::priv_get_previous(b, i, optimize_multikey_t()); } + + /// @endcond +}; + +/// @cond +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template < class T + , bool UniqueKeys + , class PackedOptions + > +#else +template +#endif +struct make_bucket_traits +{ + //Real value traits must be calculated from options + typedef typename detail::get_value_traits + ::type value_traits; + + typedef typename PackedOptions::bucket_traits specified_bucket_traits; + + //Real bucket traits must be calculated from options and calculated value_traits + typedef typename detail::get_slist_impl + ::type + >::type slist_impl; + + typedef typename + detail::if_c< detail::is_same + < specified_bucket_traits + , default_bucket_traits + >::value + , detail::bucket_traits_impl + , specified_bucket_traits + >::type type; +}; +/// @endcond + +//! Helper metafunction to define a \c hashtable that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_hashtable +{ + /// @cond + typedef typename pack_options + < hashtable_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6, O7, O8, O9, O10 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef typename make_bucket_traits + ::type bucket_traits; + + typedef hashtable_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::hash + , typename packed_options::equal + , bucket_traits + , typename packed_options::size_type + , (std::size_t(false)*hash_bool_flags::unique_keys_pos) + |(std::size_t(packed_options::constant_time_size)*hash_bool_flags::constant_time_size_pos) + |(std::size_t(packed_options::power_2_buckets)*hash_bool_flags::power_2_buckets_pos) + |(std::size_t(packed_options::cache_begin)*hash_bool_flags::cache_begin_pos) + |(std::size_t(packed_options::compare_hash)*hash_bool_flags::compare_hash_pos) + |(std::size_t(packed_options::incremental)*hash_bool_flags::incremental_pos) + > implementation_defined; + + /// @endcond + typedef implementation_defined type; +}; + +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +#if defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class hashtable + : public make_hashtable::type +{ + typedef typename make_hashtable::type Base; + BOOST_MOVABLE_BUT_NOT_COPYABLE(hashtable) + + public: + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + typedef typename Base::bucket_ptr bucket_ptr; + typedef typename Base::size_type size_type; + typedef typename Base::hasher hasher; + typedef typename Base::bucket_traits bucket_traits; + typedef typename Base::key_equal key_equal; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + + BOOST_INTRUSIVE_FORCEINLINE explicit hashtable ( const bucket_traits &b_traits + , const hasher & hash_func = hasher() + , const key_equal &equal_func = key_equal() + , const value_traits &v_traits = value_traits()) + : Base(b_traits, hash_func, equal_func, v_traits) + {} + + BOOST_INTRUSIVE_FORCEINLINE hashtable(BOOST_RV_REF(hashtable) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + BOOST_INTRUSIVE_FORCEINLINE hashtable& operator=(BOOST_RV_REF(hashtable) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + BOOST_INTRUSIVE_FORCEINLINE void clone_from(const hashtable &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(hashtable) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } +}; + +#endif + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_HASHTABLE_HPP diff --git a/boost/intrusive/list.hpp b/boost/intrusive/list.hpp new file mode 100644 index 000000000..a955c441e --- /dev/null +++ b/boost/intrusive/list.hpp @@ -0,0 +1,1509 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Olaf Krzikalla 2004-2006. +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_LIST_HPP +#define BOOST_INTRUSIVE_LIST_HPP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include //std::less +#include //std::size_t, etc. + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +/// @cond + +struct default_list_hook_applier +{ template struct apply{ typedef typename T::default_list_hook type; }; }; + +template<> +struct is_default_hook_tag +{ static const bool value = true; }; + +struct list_defaults +{ + typedef default_list_hook_applier proto_value_traits; + static const bool constant_time_size = true; + typedef std::size_t size_type; + typedef void header_holder_type; +}; + +/// @endcond + +//! The class template list is an intrusive container that mimics most of the +//! interface of std::list as described in the C++ standard. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<> and \c size_type<>. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class list_impl +{ + //Public typedefs + public: + typedef ValueTraits value_traits; + typedef typename value_traits::pointer pointer; + typedef typename value_traits::const_pointer const_pointer; + typedef typename pointer_traits::element_type value_type; + typedef typename pointer_traits::reference reference; + typedef typename pointer_traits::reference const_reference; + typedef typename pointer_traits::difference_type difference_type; + typedef SizeType size_type; + typedef list_iterator iterator; + typedef list_iterator const_iterator; + typedef boost::intrusive::reverse_iterator reverse_iterator; + typedef boost::intrusive::reverse_iterator const_reverse_iterator; + typedef typename value_traits::node_traits node_traits; + typedef typename node_traits::node node; + typedef typename node_traits::node_ptr node_ptr; + typedef typename node_traits::const_node_ptr const_node_ptr; + typedef circular_list_algorithms node_algorithms; + typedef typename detail::get_header_holder_type + < value_traits, HeaderHolder >::type header_holder_type; + + static const bool constant_time_size = ConstantTimeSize; + static const bool stateful_value_traits = detail::is_stateful_value_traits::value; + static const bool has_container_from_iterator = + detail::is_same< header_holder_type, detail::default_header_holder< node_traits > >::value; + + /// @cond + + private: + typedef detail::size_holder size_traits; + + //noncopyable + BOOST_MOVABLE_BUT_NOT_COPYABLE(list_impl) + + static const bool safemode_or_autounlink = is_safe_autounlink::value; + + //Constant-time size is incompatible with auto-unlink hooks! + BOOST_STATIC_ASSERT(!(constant_time_size && + ((int)value_traits::link_mode == (int)auto_unlink) + )); + + node_ptr get_root_node() + { return data_.root_plus_size_.m_header.get_node(); } + + const_node_ptr get_root_node() const + { return data_.root_plus_size_.m_header.get_node(); } + + struct root_plus_size : public size_traits + { + header_holder_type m_header; + }; + + struct data_t : public value_traits + { + typedef typename list_impl::value_traits value_traits; + explicit data_t(const value_traits &val_traits) + : value_traits(val_traits) + {} + + root_plus_size root_plus_size_; + } data_; + + size_traits &priv_size_traits() + { return data_.root_plus_size_; } + + const size_traits &priv_size_traits() const + { return data_.root_plus_size_; } + + const value_traits &priv_value_traits() const + { return data_; } + + value_traits &priv_value_traits() + { return data_; } + + typedef typename boost::intrusive::value_traits_pointers + ::const_value_traits_ptr const_value_traits_ptr; + + const_value_traits_ptr priv_value_traits_ptr() const + { return pointer_traits::pointer_to(this->priv_value_traits()); } + + /// @endcond + + public: + + //! Effects: constructs an empty list. + //! + //! Complexity: Constant + //! + //! Throws: If value_traits::node_traits::node + //! constructor throws (this does not happen with predefined Boost.Intrusive hooks). + list_impl() + : data_(value_traits()) + { + this->priv_size_traits().set_size(size_type(0)); + node_algorithms::init_header(this->get_root_node()); + } + + //! Effects: constructs an empty list. + //! + //! Complexity: Constant + //! + //! Throws: If value_traits::node_traits::node + //! constructor throws (this does not happen with predefined Boost.Intrusive hooks). + explicit list_impl(const value_traits &v_traits) + : data_(v_traits) + { + this->priv_size_traits().set_size(size_type(0)); + node_algorithms::init_header(this->get_root_node()); + } + + //! Requires: Dereferencing iterator must yield an lvalue of type value_type. + //! + //! Effects: Constructs a list equal to the range [first,last). + //! + //! Complexity: Linear in distance(b, e). No copy constructors are called. + //! + //! Throws: If value_traits::node_traits::node + //! constructor throws (this does not happen with predefined Boost.Intrusive hooks). + template + list_impl(Iterator b, Iterator e, const value_traits &v_traits = value_traits()) + : data_(v_traits) + { + //nothrow, no need to rollback to release elements on exception + this->priv_size_traits().set_size(size_type(0)); + node_algorithms::init_header(this->get_root_node()); + //nothrow, no need to rollback to release elements on exception + this->insert(this->cend(), b, e); + } + + //! Effects: to-do + //! + list_impl(BOOST_RV_REF(list_impl) x) + : data_(::boost::move(x.priv_value_traits())) + { + this->priv_size_traits().set_size(size_type(0)); + node_algorithms::init_header(this->get_root_node()); + //nothrow, no need to rollback to release elements on exception + this->swap(x); + } + + //! Effects: to-do + //! + list_impl& operator=(BOOST_RV_REF(list_impl) x) + { this->swap(x); return *this; } + + //! Effects: If it's not a safe-mode or an auto-unlink value_type + //! the destructor does nothing + //! (ie. no code is generated). Otherwise it detaches all elements from this. + //! In this case the objects in the list are not deleted (i.e. no destructors + //! are called), but the hooks according to the ValueTraits template parameter + //! are set to their default value. + //! + //! Complexity: Linear to the number of elements in the list, if + //! it's a safe-mode or auto-unlink value . Otherwise constant. + ~list_impl() + { + if(is_safe_autounlink::value){ + this->clear(); + node_algorithms::init(this->get_root_node()); + } + } + + //! Requires: value must be an lvalue. + //! + //! Effects: Inserts the value in the back of the list. + //! No copy constructors are called. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + //! + //! Note: Does not affect the validity of iterators and references. + void push_back(reference value) + { + node_ptr to_insert = priv_value_traits().to_node_ptr(value); + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::inited(to_insert)); + node_algorithms::link_before(this->get_root_node(), to_insert); + this->priv_size_traits().increment(); + } + + //! Requires: value must be an lvalue. + //! + //! Effects: Inserts the value in the front of the list. + //! No copy constructors are called. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + //! + //! Note: Does not affect the validity of iterators and references. + void push_front(reference value) + { + node_ptr to_insert = priv_value_traits().to_node_ptr(value); + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::inited(to_insert)); + node_algorithms::link_before(node_traits::get_next(this->get_root_node()), to_insert); + this->priv_size_traits().increment(); + } + + //! Effects: Erases the last element of the list. + //! No destructors are called. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + //! + //! Note: Invalidates the iterators (but not the references) to the erased element. + void pop_back() + { return this->pop_back_and_dispose(detail::null_disposer()); } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases the last element of the list. + //! No destructors are called. + //! Disposer::operator()(pointer) is called for the removed element. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + //! + //! Note: Invalidates the iterators to the erased element. + template + void pop_back_and_dispose(Disposer disposer) + { + node_ptr to_erase = node_traits::get_previous(this->get_root_node()); + node_algorithms::unlink(to_erase); + this->priv_size_traits().decrement(); + if(safemode_or_autounlink) + node_algorithms::init(to_erase); + disposer(priv_value_traits().to_value_ptr(to_erase)); + } + + //! Effects: Erases the first element of the list. + //! No destructors are called. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + //! + //! Note: Invalidates the iterators (but not the references) to the erased element. + void pop_front() + { return this->pop_front_and_dispose(detail::null_disposer()); } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases the first element of the list. + //! No destructors are called. + //! Disposer::operator()(pointer) is called for the removed element. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + //! + //! Note: Invalidates the iterators to the erased element. + template + void pop_front_and_dispose(Disposer disposer) + { + node_ptr to_erase = node_traits::get_next(this->get_root_node()); + node_algorithms::unlink(to_erase); + this->priv_size_traits().decrement(); + if(safemode_or_autounlink) + node_algorithms::init(to_erase); + disposer(priv_value_traits().to_value_ptr(to_erase)); + } + + //! Effects: Returns a reference to the first element of the list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + reference front() + { return *priv_value_traits().to_value_ptr(node_traits::get_next(this->get_root_node())); } + + //! Effects: Returns a const_reference to the first element of the list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + const_reference front() const + { return *priv_value_traits().to_value_ptr(node_traits::get_next(this->get_root_node())); } + + //! Effects: Returns a reference to the last element of the list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + reference back() + { return *priv_value_traits().to_value_ptr(node_traits::get_previous(this->get_root_node())); } + + //! Effects: Returns a const_reference to the last element of the list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + const_reference back() const + { return *priv_value_traits().to_value_ptr(detail::uncast(node_traits::get_previous(this->get_root_node()))); } + + //! Effects: Returns an iterator to the first element contained in the list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + iterator begin() + { return iterator(node_traits::get_next(this->get_root_node()), this->priv_value_traits_ptr()); } + + //! Effects: Returns a const_iterator to the first element contained in the list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + const_iterator begin() const + { return this->cbegin(); } + + //! Effects: Returns a const_iterator to the first element contained in the list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + const_iterator cbegin() const + { return const_iterator(node_traits::get_next(this->get_root_node()), this->priv_value_traits_ptr()); } + + //! Effects: Returns an iterator to the end of the list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + iterator end() + { return iterator(this->get_root_node(), this->priv_value_traits_ptr()); } + + //! Effects: Returns a const_iterator to the end of the list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + const_iterator end() const + { return this->cend(); } + + //! Effects: Returns a constant iterator to the end of the list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + const_iterator cend() const + { return const_iterator(detail::uncast(this->get_root_node()), this->priv_value_traits_ptr()); } + + //! Effects: Returns a reverse_iterator pointing to the beginning + //! of the reversed list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + reverse_iterator rbegin() + { return reverse_iterator(this->end()); } + + //! Effects: Returns a const_reverse_iterator pointing to the beginning + //! of the reversed list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + const_reverse_iterator rbegin() const + { return this->crbegin(); } + + //! Effects: Returns a const_reverse_iterator pointing to the beginning + //! of the reversed list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + const_reverse_iterator crbegin() const + { return const_reverse_iterator(end()); } + + //! Effects: Returns a reverse_iterator pointing to the end + //! of the reversed list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + reverse_iterator rend() + { return reverse_iterator(begin()); } + + //! Effects: Returns a const_reverse_iterator pointing to the end + //! of the reversed list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + const_reverse_iterator rend() const + { return this->crend(); } + + //! Effects: Returns a const_reverse_iterator pointing to the end + //! of the reversed list. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + const_reverse_iterator crend() const + { return const_reverse_iterator(this->begin()); } + + //! Precondition: end_iterator must be a valid end iterator + //! of list. + //! + //! Effects: Returns a const reference to the list associated to the end iterator + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + static list_impl &container_from_end_iterator(iterator end_iterator) + { return list_impl::priv_container_from_end_iterator(end_iterator); } + + //! Precondition: end_iterator must be a valid end const_iterator + //! of list. + //! + //! Effects: Returns a const reference to the list associated to the end iterator + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + static const list_impl &container_from_end_iterator(const_iterator end_iterator) + { return list_impl::priv_container_from_end_iterator(end_iterator); } + + //! Effects: Returns the number of the elements contained in the list. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of elements contained in the list. + //! if constant-time size option is disabled. Constant time otherwise. + //! + //! Note: Does not affect the validity of iterators and references. + size_type size() const + { + if(constant_time_size) + return this->priv_size_traits().get_size(); + else + return node_algorithms::count(this->get_root_node()) - 1; + } + + //! Effects: Returns true if the list contains no elements. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + //! + //! Note: Does not affect the validity of iterators and references. + bool empty() const + { return node_algorithms::unique(this->get_root_node()); } + + //! Effects: Swaps the elements of x and *this. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + //! + //! Note: Does not affect the validity of iterators and references. + void swap(list_impl& other) + { + node_algorithms::swap_nodes(this->get_root_node(), other.get_root_node()); + this->priv_size_traits().swap(other.priv_size_traits()); + } + + //! Effects: Moves backwards all the elements, so that the first + //! element becomes the second, the second becomes the third... + //! the last element becomes the first one. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of shifts. + //! + //! Note: Does not affect the validity of iterators and references. + void shift_backwards(size_type n = 1) + { node_algorithms::move_forward(this->get_root_node(), n); } + + //! Effects: Moves forward all the elements, so that the second + //! element becomes the first, the third becomes the second... + //! the first element becomes the last one. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of shifts. + //! + //! Note: Does not affect the validity of iterators and references. + void shift_forward(size_type n = 1) + { node_algorithms::move_backwards(this->get_root_node(), n); } + + //! Effects: Erases the element pointed by i of the list. + //! No destructors are called. + //! + //! Returns: the first element remaining beyond the removed element, + //! or end() if no such element exists. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + //! + //! Note: Invalidates the iterators (but not the references) to the + //! erased element. + iterator erase(const_iterator i) + { return this->erase_and_dispose(i, detail::null_disposer()); } + + //! Requires: b and e must be valid iterators to elements in *this. + //! + //! Effects: Erases the element range pointed by b and e + //! No destructors are called. + //! + //! Returns: the first element remaining beyond the removed elements, + //! or end() if no such element exists. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of erased elements if it's a safe-mode + //! or auto-unlink value, or constant-time size is enabled. Constant-time otherwise. + //! + //! Note: Invalidates the iterators (but not the references) to the + //! erased elements. + iterator erase(const_iterator b, const_iterator e) + { + if(safemode_or_autounlink || constant_time_size){ + return this->erase_and_dispose(b, e, detail::null_disposer()); + } + else{ + node_algorithms::unlink(b.pointed_node(), e.pointed_node()); + return e.unconst(); + } + } + + //! Requires: b and e must be valid iterators to elements in *this. + //! n must be distance(b, e). + //! + //! Effects: Erases the element range pointed by b and e + //! No destructors are called. + //! + //! Returns: the first element remaining beyond the removed elements, + //! or end() if no such element exists. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of erased elements if it's a safe-mode + //! or auto-unlink value is enabled. Constant-time otherwise. + //! + //! Note: Invalidates the iterators (but not the references) to the + //! erased elements. + iterator erase(const_iterator b, const_iterator e, size_type n) + { + BOOST_INTRUSIVE_INVARIANT_ASSERT(node_algorithms::distance(b.pointed_node(), e.pointed_node()) == n); + if(safemode_or_autounlink || constant_time_size){ + return this->erase_and_dispose(b, e, detail::null_disposer()); + } + else{ + if(constant_time_size){ + this->priv_size_traits().decrease(n); + } + node_algorithms::unlink(b.pointed_node(), e.pointed_node()); + return e.unconst(); + } + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases the element pointed by i of the list. + //! No destructors are called. + //! Disposer::operator()(pointer) is called for the removed element. + //! + //! Returns: the first element remaining beyond the removed element, + //! or end() if no such element exists. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + //! + //! Note: Invalidates the iterators to the erased element. + template + iterator erase_and_dispose(const_iterator i, Disposer disposer) + { + node_ptr to_erase(i.pointed_node()); + ++i; + node_algorithms::unlink(to_erase); + this->priv_size_traits().decrement(); + if(safemode_or_autounlink) + node_algorithms::init(to_erase); + disposer(this->priv_value_traits().to_value_ptr(to_erase)); + return i.unconst(); + } + + #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + template + iterator erase_and_dispose(iterator i, Disposer disposer) + { return this->erase_and_dispose(const_iterator(i), disposer); } + #endif + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases the element range pointed by b and e + //! No destructors are called. + //! Disposer::operator()(pointer) is called for the removed elements. + //! + //! Returns: the first element remaining beyond the removed elements, + //! or end() if no such element exists. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of elements erased. + //! + //! Note: Invalidates the iterators to the erased elements. + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer) + { + node_ptr bp(b.pointed_node()), ep(e.pointed_node()); + node_algorithms::unlink(bp, ep); + while(bp != ep){ + node_ptr to_erase(bp); + bp = node_traits::get_next(bp); + if(safemode_or_autounlink) + node_algorithms::init(to_erase); + disposer(priv_value_traits().to_value_ptr(to_erase)); + this->priv_size_traits().decrement(); + } + return e.unconst(); + } + + //! Effects: Erases all the elements of the container. + //! No destructors are called. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of elements of the list. + //! if it's a safe-mode or auto-unlink value_type. Constant time otherwise. + //! + //! Note: Invalidates the iterators (but not the references) to the erased elements. + void clear() + { + if(safemode_or_autounlink){ + this->clear_and_dispose(detail::null_disposer()); + } + else{ + node_algorithms::init_header(this->get_root_node()); + this->priv_size_traits().set_size(size_type(0)); + } + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases all the elements of the container. + //! No destructors are called. + //! Disposer::operator()(pointer) is called for the removed elements. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of elements of the list. + //! + //! Note: Invalidates the iterators to the erased elements. + template + void clear_and_dispose(Disposer disposer) + { + const_iterator it(this->begin()), itend(this->end()); + while(it != itend){ + node_ptr to_erase(it.pointed_node()); + ++it; + if(safemode_or_autounlink) + node_algorithms::init(to_erase); + disposer(priv_value_traits().to_value_ptr(to_erase)); + } + node_algorithms::init_header(this->get_root_node()); + this->priv_size_traits().set_size(0); + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! Cloner should yield to nodes equivalent to the original nodes. + //! + //! Effects: Erases all the elements from *this + //! calling Disposer::operator()(pointer), clones all the + //! elements from src calling Cloner::operator()(const_reference ) + //! and inserts them on *this. + //! + //! If cloner throws, all cloned elements are unlinked and disposed + //! calling Disposer::operator()(pointer). + //! + //! Complexity: Linear to erased plus inserted elements. + //! + //! Throws: If cloner throws. Basic guarantee. + template + void clone_from(const list_impl &src, Cloner cloner, Disposer disposer) + { + this->clear_and_dispose(disposer); + detail::exception_disposer + rollback(*this, disposer); + const_iterator b(src.begin()), e(src.end()); + for(; b != e; ++b){ + this->push_back(*cloner(*b)); + } + rollback.release(); + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! Cloner should yield to nodes equivalent to the original nodes. + //! + //! Effects: Erases all the elements from *this + //! calling Disposer::operator()(pointer), clones all the + //! elements from src calling Cloner::operator()(reference) + //! and inserts them on *this. + //! + //! If cloner throws, all cloned elements are unlinked and disposed + //! calling Disposer::operator()(pointer). + //! + //! Complexity: Linear to erased plus inserted elements. + //! + //! Throws: If cloner throws. Basic guarantee. + template + void clone_from(BOOST_RV_REF(list_impl) src, Cloner cloner, Disposer disposer) + { + this->clear_and_dispose(disposer); + detail::exception_disposer + rollback(*this, disposer); + iterator b(src.begin()), e(src.end()); + for(; b != e; ++b){ + this->push_back(*cloner(*b)); + } + rollback.release(); + } + + //! Requires: value must be an lvalue and p must be a valid iterator of *this. + //! + //! Effects: Inserts the value before the position pointed by p. + //! + //! Returns: An iterator to the inserted element. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant time. No copy constructors are called. + //! + //! Note: Does not affect the validity of iterators and references. + iterator insert(const_iterator p, reference value) + { + node_ptr to_insert = this->priv_value_traits().to_node_ptr(value); + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::inited(to_insert)); + node_algorithms::link_before(p.pointed_node(), to_insert); + this->priv_size_traits().increment(); + return iterator(to_insert, this->priv_value_traits_ptr()); + } + + //! Requires: Dereferencing iterator must yield + //! an lvalue of type value_type and p must be a valid iterator of *this. + //! + //! Effects: Inserts the range pointed by b and e before the position p. + //! No copy constructors are called. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of elements inserted. + //! + //! Note: Does not affect the validity of iterators and references. + template + void insert(const_iterator p, Iterator b, Iterator e) + { + for (; b != e; ++b) + this->insert(p, *b); + } + + //! Requires: Dereferencing iterator must yield + //! an lvalue of type value_type. + //! + //! Effects: Clears the list and inserts the range pointed by b and e. + //! No destructors or copy constructors are called. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of elements inserted plus + //! linear to the elements contained in the list if it's a safe-mode + //! or auto-unlink value. + //! Linear to the number of elements inserted in the list otherwise. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. + template + void assign(Iterator b, Iterator e) + { + this->clear(); + this->insert(this->cend(), b, e); + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Requires: Dereferencing iterator must yield + //! an lvalue of type value_type. + //! + //! Effects: Clears the list and inserts the range pointed by b and e. + //! No destructors or copy constructors are called. + //! Disposer::operator()(pointer) is called for the removed elements. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of elements inserted plus + //! linear to the elements contained in the list. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. + template + void dispose_and_assign(Disposer disposer, Iterator b, Iterator e) + { + this->clear_and_dispose(disposer); + this->insert(this->cend(), b, e); + } + + //! Requires: p must be a valid iterator of *this. + //! + //! Effects: Transfers all the elements of list x to this list, before the + //! the element pointed by p. No destructors or copy constructors are called. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + //! + //! Note: 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, list_impl& x) + { + if(!x.empty()){ + node_algorithms::transfer + (p.pointed_node(), x.begin().pointed_node(), x.end().pointed_node()); + size_traits &thist = this->priv_size_traits(); + size_traits &xt = x.priv_size_traits(); + thist.increase(xt.get_size()); + xt.set_size(size_type(0)); + } + } + + //! Requires: p must be a valid iterator of *this. + //! new_ele must point to an element contained in list x. + //! + //! Effects: Transfers the value pointed by new_ele, from list x to this list, + //! before the element pointed by p. No destructors or copy constructors are called. + //! If p == new_ele or p == ++new_ele, this function is a null operation. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + //! + //! Note: 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, list_impl&x, const_iterator new_ele) + { + node_algorithms::transfer(p.pointed_node(), new_ele.pointed_node()); + x.priv_size_traits().decrement(); + this->priv_size_traits().increment(); + } + + //! Requires: p must be a valid iterator of *this. + //! f and e must point to elements contained in list x. + //! + //! Effects: Transfers the range pointed by f and e from list x to this list, + //! before the element pointed by p. No destructors or copy constructors are called. + //! + //! Throws: Nothing. + //! + //! Complexity: Linear to the number of elements transferred + //! if constant-time size option is enabled. Constant-time otherwise. + //! + //! Note: 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, list_impl&x, const_iterator f, const_iterator e) + { + if(constant_time_size) + this->splice(p, x, f, e, node_algorithms::distance(f.pointed_node(), e.pointed_node())); + else + this->splice(p, x, f, e, 1);//intrusive::iterator_distance is a dummy value + } + + //! Requires: p must be a valid iterator of *this. + //! f and e must point to elements contained in list x. + //! n == distance(f, e) + //! + //! Effects: Transfers the range pointed by f and e from list x to this list, + //! before the element pointed by p. No destructors or copy constructors are called. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant. + //! + //! Note: 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, list_impl&x, const_iterator f, const_iterator e, size_type n) + { + if(n){ + if(constant_time_size){ + BOOST_INTRUSIVE_INVARIANT_ASSERT(n == node_algorithms::distance(f.pointed_node(), e.pointed_node())); + node_algorithms::transfer(p.pointed_node(), f.pointed_node(), e.pointed_node()); + size_traits &thist = this->priv_size_traits(); + size_traits &xt = x.priv_size_traits(); + thist.increase(n); + xt.decrease(n); + } + else{ + node_algorithms::transfer(p.pointed_node(), f.pointed_node(), e.pointed_node()); + } + } + } + + //! Effects: This function sorts the list *this according to std::less. + //! The sort is stable, that is, the relative order of equivalent elements is preserved. + //! + //! Throws: If value_traits::node_traits::node + //! constructor throws (this does not happen with predefined Boost.Intrusive hooks) + //! or std::less throws. Basic guarantee. + //! + //! Notes: Iterators and references are not invalidated. + //! + //! Complexity: The number of comparisons is approximately N log N, where N + //! is the list's size. + void sort() + { this->sort(std::less()); } + + //! Requires: p must be a comparison function that induces a strict weak ordering + //! + //! Effects: This function sorts the list *this according to p. The sort is + //! stable, that is, the relative order of equivalent elements is preserved. + //! + //! Throws: If value_traits::node_traits::node + //! constructor throws (this does not happen with predefined Boost.Intrusive hooks) + //! or the predicate throws. Basic guarantee. + //! + //! Notes: This won't throw if list_base_hook<> or + //! list_member_hook are used. + //! Iterators and references are not invalidated. + //! + //! Complexity: The number of comparisons is approximately N log N, where N + //! is the list's size. + template + void sort(Predicate p) + { + if(node_traits::get_next(this->get_root_node()) + != node_traits::get_previous(this->get_root_node())){ + list_impl carry(this->priv_value_traits()); + detail::array_initializer counter(this->priv_value_traits()); + int fill = 0; + while(!this->empty()){ + carry.splice(carry.cbegin(), *this, this->cbegin()); + int i = 0; + while(i < fill && !counter[i].empty()) { + counter[i].merge(carry, p); + carry.swap(counter[i++]); + } + carry.swap(counter[i]); + if(i == fill) + ++fill; + } + for (int i = 1; i < fill; ++i) + counter[i].merge(counter[i-1], p); + this->swap(counter[fill-1]); + } + } + + //! Effects: This function removes all of x's elements and inserts them + //! in order into *this according to std::less. The merge is stable; + //! that is, if an element from *this is equivalent to one from x, then the element + //! from *this will precede the one from x. + //! + //! Throws: If std::less throws. Basic guarantee. + //! + //! Complexity: This function is linear time: it performs at most + //! size() + x.size() - 1 comparisons. + //! + //! Note: Iterators and references are not invalidated + void merge(list_impl& x) + { this->merge(x, std::less()); } + + //! Requires: p must be a comparison function that induces a strict weak + //! ordering and both *this and x must be sorted according to that ordering + //! The lists x and *this must be distinct. + //! + //! Effects: This function removes all of x's elements and inserts them + //! in order into *this. The merge is stable; that is, if an element from *this is + //! equivalent to one from x, then the element from *this will precede the one from x. + //! + //! Throws: If the predicate throws. Basic guarantee. + //! + //! Complexity: This function is linear time: it performs at most + //! size() + x.size() - 1 comparisons. + //! + //! Note: Iterators and references are not invalidated. + template + void merge(list_impl& x, Predicate p) + { + const_iterator e(this->cend()), ex(x.cend()); + const_iterator b(this->cbegin()); + while(!x.empty()){ + const_iterator ix(x.cbegin()); + while (b != e && !p(*ix, *b)){ + ++b; + } + if(b == e){ + //Now transfer the rest to the end of the container + this->splice(e, x); + break; + } + else{ + size_type n(0); + do{ + ++ix; ++n; + } while(ix != ex && p(*ix, *b)); + this->splice(b, x, x.begin(), ix, n); + } + } + } + + //! Effects: Reverses the order of elements in the list. + //! + //! Throws: Nothing. + //! + //! Complexity: This function is linear time. + //! + //! Note: Iterators and references are not invalidated + void reverse() + { node_algorithms::reverse(this->get_root_node()); } + + //! Effects: Removes all the elements that compare equal to value. + //! No destructors are called. + //! + //! Throws: If std::equal_to throws. Basic guarantee. + //! + //! Complexity: Linear time. It performs exactly size() comparisons for equality. + //! + //! Note: The relative order of elements that are not removed is unchanged, + //! and iterators to elements that are not removed remain valid. + void remove(const_reference value) + { this->remove_if(detail::equal_to_value(value)); } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Removes all the elements that compare equal to value. + //! Disposer::operator()(pointer) is called for every removed element. + //! + //! Throws: If std::equal_to throws. Basic guarantee. + //! + //! Complexity: Linear time. It performs exactly size() comparisons for equality. + //! + //! Note: The relative order of elements that are not removed is unchanged, + //! and iterators to elements that are not removed remain valid. + template + void remove_and_dispose(const_reference value, Disposer disposer) + { this->remove_and_dispose_if(detail::equal_to_value(value), disposer); } + + //! Effects: Removes all the elements for which a specified + //! predicate is satisfied. No destructors are called. + //! + //! Throws: If pred throws. Basic guarantee. + //! + //! Complexity: Linear time. It performs exactly size() calls to the predicate. + //! + //! Note: The relative order of elements that are not removed is unchanged, + //! and iterators to elements that are not removed remain valid. + template + void remove_if(Pred pred) + { + const node_ptr root_node = this->get_root_node(); + typename node_algorithms::stable_partition_info info; + node_algorithms::stable_partition + (node_traits::get_next(root_node), root_node, detail::key_nodeptr_comp(pred, &this->priv_value_traits()), info); + //Invariants preserved by stable_partition so erase can be safely called + //The first element might have changed so calculate it again + this->erase( const_iterator(node_traits::get_next(root_node), this->priv_value_traits_ptr()) + , const_iterator(info.beg_2st_partition, this->priv_value_traits_ptr()) + , info.num_1st_partition); + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Removes all the elements for which a specified + //! predicate is satisfied. + //! Disposer::operator()(pointer) is called for every removed element. + //! + //! Throws: If pred throws. Basic guarantee. + //! + //! Complexity: Linear time. It performs exactly size() comparisons for equality. + //! + //! Note: The relative order of elements that are not removed is unchanged, + //! and iterators to elements that are not removed remain valid. + template + void remove_and_dispose_if(Pred pred, Disposer disposer) + { + const node_ptr root_node = this->get_root_node(); + typename node_algorithms::stable_partition_info info; + node_algorithms::stable_partition + (node_traits::get_next(root_node), root_node, detail::key_nodeptr_comp(pred, &this->priv_value_traits()), info); + //Invariants preserved by stable_partition so erase can be safely called + //The first element might have changed so calculate it again + this->erase_and_dispose( const_iterator(node_traits::get_next(root_node), this->priv_value_traits_ptr()) + , const_iterator(info.beg_2st_partition, this->priv_value_traits_ptr()) + , disposer); + } + + //! Effects: Removes adjacent duplicate elements or adjacent + //! elements that are equal from the list. No destructors are called. + //! + //! Throws: If std::equal_toComplexity: Linear time (size()-1 comparisons calls to pred()). + //! + //! Note: The relative order of elements that are not removed is unchanged, + //! and iterators to elements that are not removed remain valid. + void unique() + { this->unique_and_dispose(std::equal_to(), detail::null_disposer()); } + + //! Effects: Removes adjacent duplicate elements or adjacent + //! elements that satisfy some binary predicate from the list. + //! No destructors are called. + //! + //! Throws: If pred throws. Basic guarantee. + //! + //! Complexity: Linear time (size()-1 comparisons equality comparisons). + //! + //! Note: The relative order of elements that are not removed is unchanged, + //! and iterators to elements that are not removed remain valid. + template + void unique(BinaryPredicate pred) + { this->unique_and_dispose(pred, detail::null_disposer()); } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Removes adjacent duplicate elements or adjacent + //! elements that are equal from the list. + //! Disposer::operator()(pointer) is called for every removed element. + //! + //! Throws: If std::equal_toComplexity: Linear time (size()-1) comparisons equality comparisons. + //! + //! Note: The relative order of elements that are not removed is unchanged, + //! and iterators to elements that are not removed remain valid. + template + void unique_and_dispose(Disposer disposer) + { this->unique_and_dispose(std::equal_to(), disposer); } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Removes adjacent duplicate elements or adjacent + //! elements that satisfy some binary predicate from the list. + //! Disposer::operator()(pointer) is called for every removed element. + //! + //! Throws: If pred throws. Basic guarantee. + //! + //! Complexity: Linear time (size()-1) comparisons equality comparisons. + //! + //! Note: The relative order of elements that are not removed is unchanged, + //! and iterators to elements that are not removed remain valid. + template + void unique_and_dispose(BinaryPredicate pred, Disposer disposer) + { + const_iterator itend(this->cend()); + const_iterator cur(this->cbegin()); + + if(cur != itend){ + const_iterator after(cur); + ++after; + while(after != itend){ + if(pred(*cur, *after)){ + after = this->erase_and_dispose(after, disposer); + } + else{ + cur = after; + ++after; + } + } + } + } + + //! Requires: value must be a reference to a value inserted in a list. + //! + //! Effects: This function returns a const_iterator pointing to the element + //! + //! Throws: Nothing. + //! + //! Complexity: Constant time. + //! + //! Note: Iterators and references are not invalidated. + //! This static function is available only if the value traits + //! is stateless. + static iterator s_iterator_to(reference value) + { + BOOST_STATIC_ASSERT((!stateful_value_traits)); + BOOST_INTRUSIVE_INVARIANT_ASSERT(!node_algorithms::inited(value_traits::to_node_ptr(value))); + return iterator(value_traits::to_node_ptr(value), const_value_traits_ptr()); + } + + //! Requires: value must be a const reference to a value inserted in a list. + //! + //! Effects: This function returns an iterator pointing to the element. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant time. + //! + //! Note: Iterators and references are not invalidated. + //! This static function is available only if the value traits + //! is stateless. + static const_iterator s_iterator_to(const_reference value) + { + BOOST_STATIC_ASSERT((!stateful_value_traits)); + reference r =*detail::uncast(pointer_traits::pointer_to(value)); + BOOST_INTRUSIVE_INVARIANT_ASSERT(!node_algorithms::inited(value_traits::to_node_ptr(r))); + return const_iterator(value_traits::to_node_ptr(r), const_value_traits_ptr()); + } + + //! Requires: value must be a reference to a value inserted in a list. + //! + //! Effects: This function returns a const_iterator pointing to the element + //! + //! Throws: Nothing. + //! + //! Complexity: Constant time. + //! + //! Note: Iterators and references are not invalidated. + iterator iterator_to(reference value) + { + BOOST_INTRUSIVE_INVARIANT_ASSERT(!node_algorithms::inited(this->priv_value_traits().to_node_ptr(value))); + return iterator(this->priv_value_traits().to_node_ptr(value), this->priv_value_traits_ptr()); + } + + //! Requires: value must be a const reference to a value inserted in a list. + //! + //! Effects: This function returns an iterator pointing to the element. + //! + //! Throws: Nothing. + //! + //! Complexity: Constant time. + //! + //! Note: Iterators and references are not invalidated. + const_iterator iterator_to(const_reference value) const + { + reference r = *detail::uncast(pointer_traits::pointer_to(value)); + BOOST_INTRUSIVE_INVARIANT_ASSERT(!node_algorithms::inited(this->priv_value_traits().to_node_ptr(r))); + return const_iterator(this->priv_value_traits().to_node_ptr(r), this->priv_value_traits_ptr()); + } + + //! Effects: Asserts the integrity of the container. + //! + //! Complexity: Linear time. + //! + //! Note: The method has no effect when asserts are turned off (e.g., with NDEBUG). + //! Experimental function, interface might change in future versions. + void check() const + { + const_node_ptr header_ptr = get_root_node(); + // header's next and prev are never null + BOOST_INTRUSIVE_INVARIANT_ASSERT(node_traits::get_next(header_ptr)); + BOOST_INTRUSIVE_INVARIANT_ASSERT(node_traits::get_previous(header_ptr)); + // header's next and prev either both point to header (empty list) or neither does + BOOST_INTRUSIVE_INVARIANT_ASSERT((node_traits::get_next(header_ptr) == header_ptr) + == (node_traits::get_previous(header_ptr) == header_ptr)); + if (node_traits::get_next(header_ptr) == header_ptr) + { + if (constant_time_size) + BOOST_INTRUSIVE_INVARIANT_ASSERT(this->priv_size_traits().get_size() == 0); + return; + } + size_t node_count = 0; + const_node_ptr p = header_ptr; + while (true) + { + const_node_ptr next_p = node_traits::get_next(p); + BOOST_INTRUSIVE_INVARIANT_ASSERT(next_p); + BOOST_INTRUSIVE_INVARIANT_ASSERT(node_traits::get_previous(next_p) == p); + p = next_p; + if (p == header_ptr) break; + ++node_count; + } + if (constant_time_size) + BOOST_INTRUSIVE_INVARIANT_ASSERT(this->priv_size_traits().get_size() == node_count); + } + + friend bool operator==(const list_impl &x, const list_impl &y) + { + if(constant_time_size && x.size() != y.size()){ + return false; + } + return ::boost::intrusive::algo_equal(x.cbegin(), x.cend(), y.cbegin(), y.cend()); + } + + friend bool operator!=(const list_impl &x, const list_impl &y) + { return !(x == y); } + + friend bool operator<(const list_impl &x, const list_impl &y) + { return ::boost::intrusive::algo_lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); } + + friend bool operator>(const list_impl &x, const list_impl &y) + { return y < x; } + + friend bool operator<=(const list_impl &x, const list_impl &y) + { return !(y < x); } + + friend bool operator>=(const list_impl &x, const list_impl &y) + { return !(x < y); } + + friend void swap(list_impl &x, list_impl &y) + { x.swap(y); } + + /// @cond + + private: + static list_impl &priv_container_from_end_iterator(const const_iterator &end_iterator) + { + BOOST_STATIC_ASSERT((has_container_from_iterator)); + node_ptr p = end_iterator.pointed_node(); + header_holder_type* h = header_holder_type::get_holder(p); + root_plus_size* r = detail::parent_from_member + < root_plus_size, header_holder_type>(h, &root_plus_size::m_header); + data_t *d = detail::parent_from_member + ( r, &data_t::root_plus_size_); + list_impl *s = detail::parent_from_member(d, &list_impl::data_); + return *s; + } + /// @endcond +}; + + +//! Helper metafunction to define a \c list that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_list +{ + /// @cond + typedef typename pack_options + < list_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + typedef list_impl + < + value_traits, + typename packed_options::size_type, + packed_options::constant_time_size, + typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class list + : public make_list::type +{ + typedef typename make_list + ::type Base; + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + BOOST_MOVABLE_BUT_NOT_COPYABLE(list) + + public: + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + + list() + : Base() + {} + + explicit list(const value_traits &v_traits) + : Base(v_traits) + {} + + template + list(Iterator b, Iterator e, const value_traits &v_traits = value_traits()) + : Base(b, e, v_traits) + {} + + list(BOOST_RV_REF(list) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + list& operator=(BOOST_RV_REF(list) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + void clone_from(const list &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(list) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static list &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const list &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } +}; + +#endif + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_LIST_HPP diff --git a/boost/intrusive/list_hook.hpp b/boost/intrusive/list_hook.hpp new file mode 100644 index 000000000..892e4e20d --- /dev/null +++ b/boost/intrusive/list_hook.hpp @@ -0,0 +1,289 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Olaf Krzikalla 2004-2006. +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_LIST_HOOK_HPP +#define BOOST_INTRUSIVE_LIST_HOOK_HPP + +#include +#include + +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + + +namespace boost { +namespace intrusive { + +//! Helper metafunction to define a \c \c list_base_hook that yields to the same +//! type when the same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_list_base_hook +{ + /// @cond + typedef typename pack_options + < hook_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3 + #else + Options... + #endif + >::type packed_options; + + typedef generic_hook + < CircularListAlgorithms + , list_node_traits + , typename packed_options::tag + , packed_options::link_mode + , ListBaseHookId + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +//! Derive a class from this hook in order to store objects of that class +//! in an list. +//! +//! The hook admits the following options: \c tag<>, \c void_pointer<> and +//! \c link_mode<>. +//! +//! \c tag<> defines a tag to identify the node. +//! The same tag value can be used in different classes, but if a class is +//! derived from more than one \c list_base_hook, then each \c list_base_hook needs its +//! unique tag. +//! +//! \c link_mode<> will specify the linking mode of the hook (\c normal_link, +//! \c auto_unlink or \c safe_link). +//! +//! \c void_pointer<> is the pointer type that will be used internally in the hook +//! and the container configured to use this hook. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class list_base_hook + : public make_list_base_hook + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + + #else + + #endif + ::type +{ + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + public: + //! Effects: If link_mode is \c auto_unlink or \c safe_link + //! initializes the node to an unlinked state. + //! + //! Throws: Nothing. + list_base_hook(); + + //! Effects: If link_mode is \c auto_unlink or \c safe_link + //! initializes the node to an unlinked state. The argument is ignored. + //! + //! Throws: Nothing. + //! + //! Rationale: Providing a copy-constructor + //! makes classes using the hook STL-compliant without forcing the + //! user to do some additional work. \c swap can be used to emulate + //! move-semantics. + list_base_hook(const list_base_hook& ); + + //! Effects: Empty function. The argument is ignored. + //! + //! Throws: Nothing. + //! + //! Rationale: Providing an assignment operator + //! makes classes using the hook STL-compliant without forcing the + //! user to do some additional work. \c swap can be used to emulate + //! move-semantics. + list_base_hook& operator=(const list_base_hook& ); + + //! Effects: If link_mode is \c normal_link, the destructor does + //! nothing (ie. no code is generated). If link_mode is \c safe_link and the + //! object is stored in an list an assertion is raised. If link_mode is + //! \c auto_unlink and \c is_linked() is true, the node is unlinked. + //! + //! Throws: Nothing. + ~list_base_hook(); + + //! Effects: Swapping two nodes swaps the position of the elements + //! related to those nodes in one or two containers. That is, if the node + //! this is part of the element e1, the node x is part of the element e2 + //! and both elements are included in the containers s1 and s2, then after + //! the swap-operation e1 is in s2 at the position of e2 and e2 is in s1 + //! at the position of e1. If one element is not in a container, then + //! after the swap-operation the other element is not in a container. + //! Iterators to e1 and e2 related to those nodes are invalidated. + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + void swap_nodes(list_base_hook &other); + + //! Precondition: link_mode must be \c safe_link or \c auto_unlink. + //! + //! Returns: true, if the node belongs to a container, false + //! otherwise. This function can be used to test whether \c list::iterator_to + //! will return a valid iterator. + //! + //! Complexity: Constant + bool is_linked() const; + + //! Effects: Removes the node if it's inserted in a container. + //! This function is only allowed if link_mode is \c auto_unlink. + //! + //! Throws: Nothing. + void unlink(); + #endif +}; + +//! Helper metafunction to define a \c \c list_member_hook that yields to the same +//! type when the same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_list_member_hook +{ + /// @cond + typedef typename pack_options + < hook_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3 + #else + Options... + #endif + >::type packed_options; + + typedef generic_hook + < CircularListAlgorithms + , list_node_traits + , member_tag + , packed_options::link_mode + , NoBaseHookId + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +//! Store this hook in a class to be inserted +//! in an list. +//! +//! The hook admits the following options: \c void_pointer<> and +//! \c link_mode<>. +//! +//! \c link_mode<> will specify the linking mode of the hook (\c normal_link, +//! \c auto_unlink or \c safe_link). +//! +//! \c void_pointer<> is the pointer type that will be used internally in the hook +//! and the container configured to use this hook. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class list_member_hook + : public make_list_member_hook + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + + #else + + #endif + ::type +{ + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + public: + //! Effects: If link_mode is \c auto_unlink or \c safe_link + //! initializes the node to an unlinked state. + //! + //! Throws: Nothing. + list_member_hook(); + + //! Effects: If link_mode is \c auto_unlink or \c safe_link + //! initializes the node to an unlinked state. The argument is ignored. + //! + //! Throws: Nothing. + //! + //! Rationale: Providing a copy-constructor + //! makes classes using the hook STL-compliant without forcing the + //! user to do some additional work. \c swap can be used to emulate + //! move-semantics. + list_member_hook(const list_member_hook& ); + + //! Effects: Empty function. The argument is ignored. + //! + //! Throws: Nothing. + //! + //! Rationale: Providing an assignment operator + //! makes classes using the hook STL-compliant without forcing the + //! user to do some additional work. \c swap can be used to emulate + //! move-semantics. + list_member_hook& operator=(const list_member_hook& ); + + //! Effects: If link_mode is \c normal_link, the destructor does + //! nothing (ie. no code is generated). If link_mode is \c safe_link and the + //! object is stored in an list an assertion is raised. If link_mode is + //! \c auto_unlink and \c is_linked() is true, the node is unlinked. + //! + //! Throws: Nothing. + ~list_member_hook(); + + //! Effects: Swapping two nodes swaps the position of the elements + //! related to those nodes in one or two containers. That is, if the node + //! this is part of the element e1, the node x is part of the element e2 + //! and both elements are included in the containers s1 and s2, then after + //! the swap-operation e1 is in s2 at the position of e2 and e2 is in s1 + //! at the position of e1. If one element is not in a container, then + //! after the swap-operation the other element is not in a container. + //! Iterators to e1 and e2 related to those nodes are invalidated. + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + void swap_nodes(list_member_hook &other); + + //! Precondition: link_mode must be \c safe_link or \c auto_unlink. + //! + //! Returns: true, if the node belongs to a container, false + //! otherwise. This function can be used to test whether \c list::iterator_to + //! will return a valid iterator. + //! + //! Complexity: Constant + bool is_linked() const; + + //! Effects: Removes the node if it's inserted in a container. + //! This function is only allowed if link_mode is \c auto_unlink. + //! + //! Throws: Nothing. + void unlink(); + #endif +}; + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_LIST_HOOK_HPP diff --git a/boost/intrusive/member_value_traits.hpp b/boost/intrusive/member_value_traits.hpp new file mode 100644 index 000000000..4efe79ebd --- /dev/null +++ b/boost/intrusive/member_value_traits.hpp @@ -0,0 +1,85 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_MEMBER_VALUE_TRAITS_HPP +#define BOOST_INTRUSIVE_MEMBER_VALUE_TRAITS_HPP + +#include +#include + +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +//!This value traits template is used to create value traits +//!from user defined node traits where value_traits::value_type will +//!store a node_traits::node +template< class T, class NodeTraits + , typename NodeTraits::node T::* PtrToMember + , link_mode_type LinkMode + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + = safe_link + #endif +> +struct member_value_traits +{ + public: + typedef NodeTraits node_traits; + typedef T value_type; + typedef typename node_traits::node node; + typedef typename node_traits::node_ptr node_ptr; + typedef typename node_traits::const_node_ptr const_node_ptr; + typedef pointer_traits node_ptr_traits; + typedef typename pointer_traits::template + rebind_pointer::type pointer; + typedef typename pointer_traits::template + rebind_pointer::type const_pointer; + //typedef typename pointer_traits::reference reference; + //typedef typename pointer_traits::reference const_reference; + typedef value_type & reference; + typedef const value_type & const_reference; + static const link_mode_type link_mode = LinkMode; + + BOOST_INTRUSIVE_FORCEINLINE static node_ptr to_node_ptr(reference value) + { return pointer_traits::pointer_to(value.*PtrToMember); } + + BOOST_INTRUSIVE_FORCEINLINE static const_node_ptr to_node_ptr(const_reference value) + { return pointer_traits::pointer_to(value.*PtrToMember); } + + BOOST_INTRUSIVE_FORCEINLINE static pointer to_value_ptr(const node_ptr &n) + { + return pointer_traits::pointer_to(*detail::parent_from_member + (boost::intrusive::detail::to_raw_pointer(n), PtrToMember)); + } + + BOOST_INTRUSIVE_FORCEINLINE static const_pointer to_value_ptr(const const_node_ptr &n) + { + return pointer_traits::pointer_to(*detail::parent_from_member + (boost::intrusive::detail::to_raw_pointer(n), PtrToMember)); + + } +}; + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_MEMBER_VALUE_TRAITS_HPP diff --git a/boost/intrusive/priority_compare.hpp b/boost/intrusive/priority_compare.hpp new file mode 100644 index 000000000..f5589ce27 --- /dev/null +++ b/boost/intrusive/priority_compare.hpp @@ -0,0 +1,82 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2008 +// +// Distributed under the 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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_PRIORITY_COMPARE_HPP +#define BOOST_INTRUSIVE_PRIORITY_COMPARE_HPP + +#include +#include +#include + +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +/// @cond + +template +void priority_order(); + +/// @endcond + +template +struct priority_compare +{ + //Compatibility with std::binary_function + typedef T first_argument_type; + typedef T second_argument_type; + typedef bool result_type; + + BOOST_INTRUSIVE_FORCEINLINE bool operator()(const T &val, const T &val2) const + { + return priority_order(val, val2); + } +}; + +template <> +struct priority_compare +{ + template + BOOST_INTRUSIVE_FORCEINLINE bool operator()(const T &t, const U &u) const + { + return priority_order(t, u); + } +}; + +/// @cond + +template +struct get_prio +{ + typedef PrioComp type; +}; + + +template +struct get_prio +{ + typedef ::boost::intrusive::priority_compare type; +}; + +/// @endcond + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_PRIORITY_COMPARE_HPP diff --git a/boost/intrusive/set.hpp b/boost/intrusive/set.hpp new file mode 100644 index 000000000..3cd9013d4 --- /dev/null +++ b/boost/intrusive/set.hpp @@ -0,0 +1,1073 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Olaf Krzikalla 2004-2006. +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// +#ifndef BOOST_INTRUSIVE_SET_HPP +#define BOOST_INTRUSIVE_SET_HPP + +#include +#include + +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +class multiset_impl; +#endif + +//! The class template set is an intrusive container, that mimics most of +//! the interface of std::set as described in the C++ standard. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<> and +//! \c compare<>. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class set_impl +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + : public bstree_impl +#endif +{ + /// @cond + typedef bstree_impl tree_type; + BOOST_MOVABLE_BUT_NOT_COPYABLE(set_impl) + + typedef tree_type implementation_defined; + /// @endcond + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::value_compare value_compare; + typedef typename implementation_defined::key_compare key_compare; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::reverse_iterator reverse_iterator; + typedef typename implementation_defined::const_reverse_iterator const_reverse_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + static const bool constant_time_size = tree_type::constant_time_size; + + public: + //! @copydoc ::boost::intrusive::rbtree::rbtree() + set_impl() + : tree_type() + {} + + //! @copydoc ::boost::intrusive::rbtree::rbtree(const key_compare &,const value_traits &) + explicit set_impl( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : tree_type(cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::rbtree::rbtree(bool,Iterator,Iterator,const key_compare &,const value_traits &) + template + set_impl( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(true, b, e, cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::rbtree::rbtree(rbtree &&) + set_impl(BOOST_RV_REF(set_impl) x) + : tree_type(BOOST_MOVE_BASE(tree_type, x)) + {} + + //! @copydoc ::boost::intrusive::rbtree::operator=(rbtree &&) + set_impl& operator=(BOOST_RV_REF(set_impl) x) + { return static_cast(tree_type::operator=(BOOST_MOVE_BASE(tree_type, x))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::rbtree::~rbtree() + ~set_impl(); + + //! @copydoc ::boost::intrusive::rbtree::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::rbtree::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::rbtree::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::rbtree::end() + iterator end(); + + //! @copydoc ::boost::intrusive::rbtree::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::rbtree::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::rbtree::rbegin() + reverse_iterator rbegin(); + + //! @copydoc ::boost::intrusive::rbtree::rbegin()const + const_reverse_iterator rbegin() const; + + //! @copydoc ::boost::intrusive::rbtree::crbegin()const + const_reverse_iterator crbegin() const; + + //! @copydoc ::boost::intrusive::rbtree::rend() + reverse_iterator rend(); + + //! @copydoc ::boost::intrusive::rbtree::rend()const + const_reverse_iterator rend() const; + + //! @copydoc ::boost::intrusive::rbtree::crend()const + const_reverse_iterator crend() const; + + //! @copydoc ::boost::intrusive::rbtree::root() + iterator root(); + + //! @copydoc ::boost::intrusive::rbtree::root()const + const_iterator root() const; + + //! @copydoc ::boost::intrusive::rbtree::croot()const + const_iterator croot() const; + + //! @copydoc ::boost::intrusive::rbtree::container_from_end_iterator(iterator) + static set_impl &container_from_end_iterator(iterator end_iterator); + + //! @copydoc ::boost::intrusive::rbtree::container_from_end_iterator(const_iterator) + static const set_impl &container_from_end_iterator(const_iterator end_iterator); + + //! @copydoc ::boost::intrusive::rbtree::container_from_iterator(iterator) + static set_impl &container_from_iterator(iterator it); + + //! @copydoc ::boost::intrusive::rbtree::container_from_iterator(const_iterator) + static const set_impl &container_from_iterator(const_iterator it); + + //! @copydoc ::boost::intrusive::rbtree::key_comp()const + key_compare key_comp() const; + + //! @copydoc ::boost::intrusive::rbtree::value_comp()const + value_compare value_comp() const; + + //! @copydoc ::boost::intrusive::rbtree::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::rbtree::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::rbtree::swap + void swap(set_impl& other); + + //! @copydoc ::boost::intrusive::rbtree::clone_from(const rbtree&,Cloner,Disposer) + template + void clone_from(const set_impl &src, Cloner cloner, Disposer disposer); + + #else + + using tree_type::clone_from; + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::rbtree::clone_from(rbtree&&,Cloner,Disposer) + template + void clone_from(BOOST_RV_REF(set_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } + + //! @copydoc ::boost::intrusive::rbtree::insert_unique(reference) + std::pair insert(reference value) + { return tree_type::insert_unique(value); } + + //! @copydoc ::boost::intrusive::rbtree::insert_unique(const_iterator,reference) + iterator insert(const_iterator hint, reference value) + { return tree_type::insert_unique(hint, value); } + + //! @copydoc ::boost::intrusive::rbtree::insert_unique_check(const key_type&,insert_commit_data&) + std::pair insert_check + (const key_type &key, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(key, commit_data); } + + //! @copydoc ::boost::intrusive::rbtree::insert_unique_check(const_iterator,const key_type&,insert_commit_data&) + std::pair insert_check + (const_iterator hint, const key_type &key + ,insert_commit_data &commit_data) + { return tree_type::insert_unique_check(hint, key, commit_data); } + + //! @copydoc ::boost::intrusive::rbtree::insert_unique_check(const KeyType&,KeyTypeKeyCompare,insert_commit_data&) + template + std::pair insert_check + (const KeyType &key, KeyTypeKeyCompare comp, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(key, comp, commit_data); } + + //! @copydoc ::boost::intrusive::rbtree::insert_unique_check(const_iterator,const KeyType&,KeyTypeKeyCompare,insert_commit_data&) + template + std::pair insert_check + (const_iterator hint, const KeyType &key + ,KeyTypeKeyCompare comp, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(hint, key, comp, commit_data); } + + //! @copydoc ::boost::intrusive::rbtree::insert_unique(Iterator,Iterator) + template + void insert(Iterator b, Iterator e) + { tree_type::insert_unique(b, e); } + + //! @copydoc ::boost::intrusive::rbtree::insert_unique_commit + iterator insert_commit(reference value, const insert_commit_data &commit_data) + { return tree_type::insert_unique_commit(value, commit_data); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::rbtree::insert_before + iterator insert_before(const_iterator pos, reference value); + + //! @copydoc ::boost::intrusive::rbtree::push_back + void push_back(reference value); + + //! @copydoc ::boost::intrusive::rbtree::push_front + void push_front(reference value); + + //! @copydoc ::boost::intrusive::rbtree::erase(const_iterator) + iterator erase(const_iterator i); + + //! @copydoc ::boost::intrusive::rbtree::erase(const_iterator,const_iterator) + iterator erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::rbtree::erase(const key_type &) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::rbtree::erase(const KeyType&,KeyTypeKeyCompare) + template + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::rbtree::erase_and_dispose(const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::rbtree::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::rbtree::erase_and_dispose(const key_type &, Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::rbtree::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); + + //! @copydoc ::boost::intrusive::rbtree::clear + void clear(); + + //! @copydoc ::boost::intrusive::rbtree::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::rbtree::count(const key_type &)const + size_type count(const key_type &key) const + { return static_cast(this->tree_type::find(key) != this->tree_type::cend()); } + + //! @copydoc ::boost::intrusive::rbtree::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const + { return static_cast(this->tree_type::find(key, comp) != this->tree_type::cend()); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::rbtree::lower_bound(const key_type &) + iterator lower_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::rbtree::lower_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::rbtree::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::rbtree::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::rbtree::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::rbtree::upper_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::rbtree::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::rbtree::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::rbtree::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::rbtree::find(const KeyType&,KeyTypeKeyCompare) + template + iterator find(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::rbtree::find(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::rbtree::find(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::rbtree::equal_range(const key_type &) + std::pair equal_range(const key_type &key) + { return this->tree_type::lower_bound_range(key); } + + //! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyTypeKeyCompare) + template + std::pair equal_range(const KeyType& key, KeyTypeKeyCompare comp) + { return this->tree_type::equal_range(key, comp); } + + //! @copydoc ::boost::intrusive::rbtree::equal_range(const key_type &)const + std::pair + equal_range(const key_type &key) const + { return this->tree_type::lower_bound_range(key); } + + //! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyTypeKeyCompare)const + template + std::pair + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const + { return this->tree_type::equal_range(key, comp); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::rbtree::bounded_range(const key_type &,const key_type &,bool,bool) + std::pair bounded_range + (const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::rbtree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::rbtree::bounded_range(const key_type &,const key_type &,bool,bool)const + std::pair + bounded_range(const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::rbtree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::rbtree::s_iterator_to(reference) + static iterator s_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::rbtree::s_iterator_to(const_reference) + static const_iterator s_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::rbtree::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::rbtree::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::rbtree::init_node(reference) + static void init_node(reference value); + + //! @copydoc ::boost::intrusive::rbtree::unlink_leftmost_without_rebalance + pointer unlink_leftmost_without_rebalance(); + + //! @copydoc ::boost::intrusive::rbtree::replace_node + void replace_node(iterator replace_this, reference with_this); + + //! @copydoc ::boost::intrusive::rbtree::remove_node + void remove_node(reference value); + + //! @copydoc ::boost::intrusive::rbtree::merge_unique + template + void merge(set &source); + + //! @copydoc ::boost::intrusive::rbtree::merge_unique + template + void merge(multiset &source); + + #else + + template + void merge(set_impl &source) + { return tree_type::merge_unique(source); } + + + template + void merge(multiset_impl &source) + { return tree_type::merge_unique(source); } + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED +}; + +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +template +bool operator!= (const set_impl &x, const set_impl &y); + +template +bool operator>(const set_impl &x, const set_impl &y); + +template +bool operator<=(const set_impl &x, const set_impl &y); + +template +bool operator>=(const set_impl &x, const set_impl &y); + +template +void swap(set_impl &x, set_impl &y); + +#endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +//! Helper metafunction to define a \c set that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_set +{ + /// @cond + typedef typename pack_options + < rbtree_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef set_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::compare + , typename packed_options::size_type + , packed_options::constant_time_size + , typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class set + : public make_set::type +{ + typedef typename make_set + ::type Base; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(set) + public: + typedef typename Base::key_compare key_compare; + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + + set() + : Base() + {} + + explicit set( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : Base(cmp, v_traits) + {} + + template + set( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : Base(b, e, cmp, v_traits) + {} + + set(BOOST_RV_REF(set) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + set& operator=(BOOST_RV_REF(set) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + void clone_from(const set &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(set) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static set &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const set &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static set &container_from_iterator(iterator it) + { return static_cast(Base::container_from_iterator(it)); } + + static const set &container_from_iterator(const_iterator it) + { return static_cast(Base::container_from_iterator(it)); } +}; + +#endif + +//! The class template multiset is an intrusive container, that mimics most of +//! the interface of std::multiset as described in the C++ standard. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<> and +//! \c compare<>. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class multiset_impl +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + : public bstree_impl +#endif +{ + /// @cond + typedef bstree_impl tree_type; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(multiset_impl) + typedef tree_type implementation_defined; + /// @endcond + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::value_compare value_compare; + typedef typename implementation_defined::key_compare key_compare; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::reverse_iterator reverse_iterator; + typedef typename implementation_defined::const_reverse_iterator const_reverse_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + static const bool constant_time_size = tree_type::constant_time_size; + + public: + //! @copydoc ::boost::intrusive::rbtree::rbtree() + multiset_impl() + : tree_type() + {} + + //! @copydoc ::boost::intrusive::rbtree::rbtree(const key_compare &,const value_traits &) + explicit multiset_impl( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : tree_type(cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::rbtree::rbtree(bool,Iterator,Iterator,const key_compare &,const value_traits &) + template + multiset_impl( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(false, b, e, cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::rbtree::rbtree(rbtree &&) + multiset_impl(BOOST_RV_REF(multiset_impl) x) + : tree_type(BOOST_MOVE_BASE(tree_type, x)) + {} + + //! @copydoc ::boost::intrusive::rbtree::operator=(rbtree &&) + multiset_impl& operator=(BOOST_RV_REF(multiset_impl) x) + { return static_cast(tree_type::operator=(BOOST_MOVE_BASE(tree_type, x))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::rbtree::~rbtree() + ~multiset_impl(); + + //! @copydoc ::boost::intrusive::rbtree::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::rbtree::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::rbtree::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::rbtree::end() + iterator end(); + + //! @copydoc ::boost::intrusive::rbtree::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::rbtree::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::rbtree::rbegin() + reverse_iterator rbegin(); + + //! @copydoc ::boost::intrusive::rbtree::rbegin()const + const_reverse_iterator rbegin() const; + + //! @copydoc ::boost::intrusive::rbtree::crbegin()const + const_reverse_iterator crbegin() const; + + //! @copydoc ::boost::intrusive::rbtree::rend() + reverse_iterator rend(); + + //! @copydoc ::boost::intrusive::rbtree::rend()const + const_reverse_iterator rend() const; + + //! @copydoc ::boost::intrusive::rbtree::crend()const + const_reverse_iterator crend() const; + + //! @copydoc ::boost::intrusive::rbtree::root() + iterator root(); + + //! @copydoc ::boost::intrusive::rbtree::root()const + const_iterator root() const; + + //! @copydoc ::boost::intrusive::rbtree::croot()const + const_iterator croot() const; + + //! @copydoc ::boost::intrusive::rbtree::container_from_end_iterator(iterator) + static multiset_impl &container_from_end_iterator(iterator end_iterator); + + //! @copydoc ::boost::intrusive::rbtree::container_from_end_iterator(const_iterator) + static const multiset_impl &container_from_end_iterator(const_iterator end_iterator); + + //! @copydoc ::boost::intrusive::rbtree::container_from_iterator(iterator) + static multiset_impl &container_from_iterator(iterator it); + + //! @copydoc ::boost::intrusive::rbtree::container_from_iterator(const_iterator) + static const multiset_impl &container_from_iterator(const_iterator it); + + //! @copydoc ::boost::intrusive::rbtree::key_comp()const + key_compare key_comp() const; + + //! @copydoc ::boost::intrusive::rbtree::value_comp()const + value_compare value_comp() const; + + //! @copydoc ::boost::intrusive::rbtree::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::rbtree::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::rbtree::swap + void swap(multiset_impl& other); + + //! @copydoc ::boost::intrusive::rbtree::clone_from(const rbtree&,Cloner,Disposer) + template + void clone_from(const multiset_impl &src, Cloner cloner, Disposer disposer); + + #else + + using tree_type::clone_from; + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::rbtree::clone_from(rbtree&&,Cloner,Disposer) + template + void clone_from(BOOST_RV_REF(multiset_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } + + //! @copydoc ::boost::intrusive::rbtree::insert_equal(reference) + iterator insert(reference value) + { return tree_type::insert_equal(value); } + + //! @copydoc ::boost::intrusive::rbtree::insert_equal(const_iterator,reference) + iterator insert(const_iterator hint, reference value) + { return tree_type::insert_equal(hint, value); } + + //! @copydoc ::boost::intrusive::rbtree::insert_equal(Iterator,Iterator) + template + void insert(Iterator b, Iterator e) + { tree_type::insert_equal(b, e); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::rbtree::insert_before + iterator insert_before(const_iterator pos, reference value); + + //! @copydoc ::boost::intrusive::rbtree::push_back + void push_back(reference value); + + //! @copydoc ::boost::intrusive::rbtree::push_front + void push_front(reference value); + + //! @copydoc ::boost::intrusive::rbtree::erase(const_iterator) + iterator erase(const_iterator i); + + //! @copydoc ::boost::intrusive::rbtree::erase(const_iterator,const_iterator) + iterator erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::rbtree::erase(const key_type &) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::rbtree::erase(const KeyType&,KeyTypeKeyCompare) + template + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::rbtree::erase_and_dispose(const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::rbtree::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::rbtree::erase_and_dispose(const key_type &, Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::rbtree::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); + + //! @copydoc ::boost::intrusive::rbtree::clear + void clear(); + + //! @copydoc ::boost::intrusive::rbtree::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + //! @copydoc ::boost::intrusive::rbtree::count(const key_type &)const + size_type count(const key_type &key) const; + + //! @copydoc ::boost::intrusive::rbtree::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::rbtree::lower_bound(const key_type &) + iterator lower_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::rbtree::lower_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::rbtree::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::rbtree::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::rbtree::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::rbtree::upper_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::rbtree::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::rbtree::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::rbtree::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::rbtree::find(const KeyType&,KeyTypeKeyCompare) + template + iterator find(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::rbtree::find(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::rbtree::find(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::rbtree::equal_range(const key_type &) + std::pair equal_range(const key_type &key); + + //! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyTypeKeyCompare) + template + std::pair equal_range(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::rbtree::equal_range(const key_type &)const + std::pair + equal_range(const key_type &key) const; + + //! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyTypeKeyCompare)const + template + std::pair + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::rbtree::bounded_range(const key_type &,const key_type &,bool,bool) + std::pair bounded_range + (const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::rbtree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::rbtree::bounded_range(const key_type &,const key_type &,bool,bool)const + std::pair + bounded_range(const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::rbtree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::rbtree::s_iterator_to(reference) + static iterator s_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::rbtree::s_iterator_to(const_reference) + static const_iterator s_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::rbtree::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::rbtree::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::rbtree::init_node(reference) + static void init_node(reference value); + + //! @copydoc ::boost::intrusive::rbtree::unlink_leftmost_without_rebalance + pointer unlink_leftmost_without_rebalance(); + + //! @copydoc ::boost::intrusive::rbtree::replace_node + void replace_node(iterator replace_this, reference with_this); + + //! @copydoc ::boost::intrusive::rbtree::remove_node + void remove_node(reference value); + + //! @copydoc ::boost::intrusive::rbtree::merge_equal + template + void merge(multiset &source); + + //! @copydoc ::boost::intrusive::rbtree::merge_equal + template + void merge(set &source); + + #else + + template + void merge(multiset_impl &source) + { return tree_type::merge_equal(source); } + + template + void merge(set_impl &source) + { return tree_type::merge_equal(source); } + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED +}; + +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +template +bool operator!= (const multiset_impl &x, const multiset_impl &y); + +template +bool operator>(const multiset_impl &x, const multiset_impl &y); + +template +bool operator<=(const multiset_impl &x, const multiset_impl &y); + +template +bool operator>=(const multiset_impl &x, const multiset_impl &y); + +template +void swap(multiset_impl &x, multiset_impl &y); + +#endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +//! Helper metafunction to define a \c multiset that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_multiset +{ + /// @cond + typedef typename pack_options + < rbtree_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef multiset_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::compare + , typename packed_options::size_type + , packed_options::constant_time_size + , typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class multiset + : public make_multiset::type +{ + typedef typename make_multiset::type Base; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(multiset) + + public: + typedef typename Base::key_compare key_compare; + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + + multiset() + : Base() + {} + + explicit multiset( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : Base(cmp, v_traits) + {} + + template + multiset( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : Base(b, e, cmp, v_traits) + {} + + multiset(BOOST_RV_REF(multiset) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + multiset& operator=(BOOST_RV_REF(multiset) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + void clone_from(const multiset &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(multiset) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static multiset &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const multiset &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static multiset &container_from_iterator(iterator it) + { return static_cast(Base::container_from_iterator(it)); } + + static const multiset &container_from_iterator(const_iterator it) + { return static_cast(Base::container_from_iterator(it)); } +}; + +#endif + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_SET_HPP diff --git a/boost/intrusive/sg_set.hpp b/boost/intrusive/sg_set.hpp new file mode 100644 index 000000000..745c3790b --- /dev/null +++ b/boost/intrusive/sg_set.hpp @@ -0,0 +1,1094 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2007-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// +#ifndef BOOST_INTRUSIVE_SG_SET_HPP +#define BOOST_INTRUSIVE_SG_SET_HPP + +#include +#include +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +class sg_multiset_impl; +#endif + +//! The class template sg_set is an intrusive container, that mimics most of +//! the interface of std::sg_set as described in the C++ standard. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c floating_point<>, \c size_type<> and +//! \c compare<>. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class sg_set_impl +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + : public sgtree_impl +#endif +{ + /// @cond + typedef sgtree_impl tree_type; + BOOST_MOVABLE_BUT_NOT_COPYABLE(sg_set_impl) + + typedef tree_type implementation_defined; + /// @endcond + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::value_compare value_compare; + typedef typename implementation_defined::key_compare key_compare; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::reverse_iterator reverse_iterator; + typedef typename implementation_defined::const_reverse_iterator const_reverse_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + static const bool constant_time_size = tree_type::constant_time_size; + + public: + //! @copydoc ::boost::intrusive::sgtree::sgtree() + sg_set_impl() + : tree_type() + {} + + //! @copydoc ::boost::intrusive::sgtree::sgtree(const key_compare &,const value_traits &) + explicit sg_set_impl( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : tree_type(cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::sgtree::sgtree(bool,Iterator,Iterator,const key_compare &,const value_traits &) + template + sg_set_impl( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(true, b, e, cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::sgtree::sgtree(sgtree &&) + sg_set_impl(BOOST_RV_REF(sg_set_impl) x) + : tree_type(BOOST_MOVE_BASE(tree_type, x)) + {} + + //! @copydoc ::boost::intrusive::sgtree::operator=(sgtree &&) + sg_set_impl& operator=(BOOST_RV_REF(sg_set_impl) x) + { return static_cast(tree_type::operator=(BOOST_MOVE_BASE(tree_type, x))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::sgtree::~sgtree() + ~sg_set_impl(); + + //! @copydoc ::boost::intrusive::sgtree::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::sgtree::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::sgtree::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::sgtree::end() + iterator end(); + + //! @copydoc ::boost::intrusive::sgtree::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::sgtree::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::sgtree::rbegin() + reverse_iterator rbegin(); + + //! @copydoc ::boost::intrusive::sgtree::rbegin()const + const_reverse_iterator rbegin() const; + + //! @copydoc ::boost::intrusive::sgtree::crbegin()const + const_reverse_iterator crbegin() const; + + //! @copydoc ::boost::intrusive::sgtree::rend() + reverse_iterator rend(); + + //! @copydoc ::boost::intrusive::sgtree::rend()const + const_reverse_iterator rend() const; + + //! @copydoc ::boost::intrusive::sgtree::crend()const + const_reverse_iterator crend() const; + + //! @copydoc ::boost::intrusive::sgtree::root() + iterator root(); + + //! @copydoc ::boost::intrusive::sgtree::root()const + const_iterator root() const; + + //! @copydoc ::boost::intrusive::sgtree::croot()const + const_iterator croot() const; + + //! @copydoc ::boost::intrusive::sgtree::container_from_end_iterator(iterator) + static sg_set_impl &container_from_end_iterator(iterator end_iterator); + + //! @copydoc ::boost::intrusive::sgtree::container_from_end_iterator(const_iterator) + static const sg_set_impl &container_from_end_iterator(const_iterator end_iterator); + + //! @copydoc ::boost::intrusive::sgtree::container_from_iterator(iterator) + static sg_set_impl &container_from_iterator(iterator it); + + //! @copydoc ::boost::intrusive::sgtree::container_from_iterator(const_iterator) + static const sg_set_impl &container_from_iterator(const_iterator it); + + //! @copydoc ::boost::intrusive::sgtree::key_comp()const + key_compare key_comp() const; + + //! @copydoc ::boost::intrusive::sgtree::value_comp()const + value_compare value_comp() const; + + //! @copydoc ::boost::intrusive::sgtree::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::sgtree::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::sgtree::swap + void swap(sg_set_impl& other); + + //! @copydoc ::boost::intrusive::sgtree::clone_from(const sgtree&,Cloner,Disposer) + template + void clone_from(const sg_set_impl &src, Cloner cloner, Disposer disposer); + + #else + + using tree_type::clone_from; + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::sgtree::clone_from(sgtree&&,Cloner,Disposer) + template + void clone_from(BOOST_RV_REF(sg_set_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } + + //! @copydoc ::boost::intrusive::sgtree::insert_unique(reference) + std::pair insert(reference value) + { return tree_type::insert_unique(value); } + + //! @copydoc ::boost::intrusive::sgtree::insert_unique(const_iterator,reference) + iterator insert(const_iterator hint, reference value) + { return tree_type::insert_unique(hint, value); } + + //! @copydoc ::boost::intrusive::sgtree::insert_unique_check(const key_type&,insert_commit_data&) + std::pair insert_check + (const key_type &key, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(key, commit_data); } + + //! @copydoc ::boost::intrusive::sgtree::insert_unique_check(const_iterator,const key_type&,insert_commit_data&) + std::pair insert_check + (const_iterator hint, const key_type &key + ,insert_commit_data &commit_data) + { return tree_type::insert_unique_check(hint, key, commit_data); } + + //! @copydoc ::boost::intrusive::sgtree::insert_unique_check(const KeyType&,KeyTypeKeyCompare,insert_commit_data&) + template + std::pair insert_check + (const KeyType &key, KeyTypeKeyCompare comp, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(key, comp, commit_data); } + + //! @copydoc ::boost::intrusive::sgtree::insert_unique_check(const_iterator,const KeyType&,KeyTypeKeyCompare,insert_commit_data&) + template + std::pair insert_check + (const_iterator hint, const KeyType &key + ,KeyTypeKeyCompare comp, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(hint, key, comp, commit_data); } + + //! @copydoc ::boost::intrusive::sgtree::insert_unique(Iterator,Iterator) + template + void insert(Iterator b, Iterator e) + { tree_type::insert_unique(b, e); } + + //! @copydoc ::boost::intrusive::sgtree::insert_unique_commit + iterator insert_commit(reference value, const insert_commit_data &commit_data) + { return tree_type::insert_unique_commit(value, commit_data); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::sgtree::insert_before + iterator insert_before(const_iterator pos, reference value); + + //! @copydoc ::boost::intrusive::sgtree::push_back + void push_back(reference value); + + //! @copydoc ::boost::intrusive::sgtree::push_front + void push_front(reference value); + + //! @copydoc ::boost::intrusive::sgtree::erase(const_iterator) + iterator erase(const_iterator i); + + //! @copydoc ::boost::intrusive::sgtree::erase(const_iterator,const_iterator) + iterator erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::sgtree::erase(const key_type &) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::sgtree::erase(const KeyType&,KeyTypeKeyCompare) + template + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const key_type &, Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); + + //! @copydoc ::boost::intrusive::sgtree::clear + void clear(); + + //! @copydoc ::boost::intrusive::sgtree::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::sgtree::count(const key_type &)const + size_type count(const key_type &key) const + { return static_cast(this->tree_type::find(key) != this->tree_type::cend()); } + + //! @copydoc ::boost::intrusive::sgtree::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const + { return static_cast(this->tree_type::find(key, comp) != this->tree_type::cend()); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const key_type &) + iterator lower_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::sgtree::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::sgtree::find(const KeyType&,KeyTypeKeyCompare) + template + iterator find(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::sgtree::find(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::sgtree::find(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::sgtree::equal_range(const key_type &) + std::pair equal_range(const key_type &key) + { return this->tree_type::lower_bound_range(key); } + + //! @copydoc ::boost::intrusive::sgtree::equal_range(const KeyType&,KeyTypeKeyCompare) + template + std::pair equal_range(const KeyType& key, KeyTypeKeyCompare comp) + { return this->tree_type::equal_range(key, comp); } + + //! @copydoc ::boost::intrusive::sgtree::equal_range(const key_type &)const + std::pair + equal_range(const key_type &key) const + { return this->tree_type::lower_bound_range(key); } + + //! @copydoc ::boost::intrusive::sgtree::equal_range(const KeyType&,KeyTypeKeyCompare)const + template + std::pair + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const + { return this->tree_type::equal_range(key, comp); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const key_type &,const key_type &,bool,bool) + std::pair bounded_range + (const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const key_type &,const key_type &,bool,bool)const + std::pair + bounded_range(const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::sgtree::s_iterator_to(reference) + static iterator s_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::sgtree::s_iterator_to(const_reference) + static const_iterator s_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::sgtree::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::sgtree::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::sgtree::init_node(reference) + static void init_node(reference value); + + //! @copydoc ::boost::intrusive::sgtree::unlink_leftmost_without_rebalance + pointer unlink_leftmost_without_rebalance(); + + //! @copydoc ::boost::intrusive::sgtree::replace_node + void replace_node(iterator replace_this, reference with_this); + + //! @copydoc ::boost::intrusive::sgtree::remove_node + void remove_node(reference value); + + //! @copydoc ::boost::intrusive::sgtree::rebalance + void rebalance(); + + //! @copydoc ::boost::intrusive::sgtree::rebalance_subtree + iterator rebalance_subtree(iterator root); + + //! @copydoc ::boost::intrusive::sgtree::balance_factor() + float balance_factor() const; + + //! @copydoc ::boost::intrusive::sgtree::balance_factor(float) + void balance_factor(float new_alpha); + + //! @copydoc ::boost::intrusive::rbtree::merge_unique + template + void merge(sg_set &source); + + //! @copydoc ::boost::intrusive::rbtree::merge_unique + template + void merge(sg_multiset &source); + + #else + + template + void merge(sg_set_impl &source) + { return tree_type::merge_unique(source); } + + template + void merge(sg_multiset_impl &source) + { return tree_type::merge_unique(source); } + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED +}; + +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +template +bool operator!= (const sg_set_impl &x, const sg_set_impl &y); + +template +bool operator>(const sg_set_impl &x, const sg_set_impl &y); + +template +bool operator<=(const sg_set_impl &x, const sg_set_impl &y); + +template +bool operator>=(const sg_set_impl &x, const sg_set_impl &y); + +template +void swap(sg_set_impl &x, sg_set_impl &y); + +#endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +//! Helper metafunction to define a \c sg_set that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_sg_set +{ + /// @cond + typedef typename pack_options + < sgtree_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef sg_set_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::compare + , typename packed_options::size_type + , packed_options::floating_point + , typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class sg_set + : public make_sg_set::type +{ + typedef typename make_sg_set + ::type Base; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(sg_set) + public: + typedef typename Base::key_compare key_compare; + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + + sg_set() + : Base() + {} + + explicit sg_set( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : Base(cmp, v_traits) + {} + + template + sg_set( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : Base(b, e, cmp, v_traits) + {} + + sg_set(BOOST_RV_REF(sg_set) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + sg_set& operator=(BOOST_RV_REF(sg_set) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + void clone_from(const sg_set &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(sg_set) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static sg_set &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const sg_set &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static sg_set &container_from_iterator(iterator it) + { return static_cast(Base::container_from_iterator(it)); } + + static const sg_set &container_from_iterator(const_iterator it) + { return static_cast(Base::container_from_iterator(it)); } +}; + +#endif + +//! The class template sg_multiset is an intrusive container, that mimics most of +//! the interface of std::sg_multiset as described in the C++ standard. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c floating_point<>, \c size_type<> and +//! \c compare<>. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class sg_multiset_impl +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + : public sgtree_impl +#endif +{ + /// @cond + typedef sgtree_impl tree_type; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(sg_multiset_impl) + typedef tree_type implementation_defined; + /// @endcond + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::value_compare value_compare; + typedef typename implementation_defined::key_compare key_compare; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::reverse_iterator reverse_iterator; + typedef typename implementation_defined::const_reverse_iterator const_reverse_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + static const bool constant_time_size = tree_type::constant_time_size; + + public: + //! @copydoc ::boost::intrusive::sgtree::sgtree() + sg_multiset_impl() + : tree_type() + {} + + //! @copydoc ::boost::intrusive::sgtree::sgtree(const key_compare &,const value_traits &) + explicit sg_multiset_impl( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : tree_type(cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::sgtree::sgtree(bool,Iterator,Iterator,const key_compare &,const value_traits &) + template + sg_multiset_impl( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(false, b, e, cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::sgtree::sgtree(sgtree &&) + sg_multiset_impl(BOOST_RV_REF(sg_multiset_impl) x) + : tree_type(BOOST_MOVE_BASE(tree_type, x)) + {} + + //! @copydoc ::boost::intrusive::sgtree::operator=(sgtree &&) + sg_multiset_impl& operator=(BOOST_RV_REF(sg_multiset_impl) x) + { return static_cast(tree_type::operator=(BOOST_MOVE_BASE(tree_type, x))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::sgtree::~sgtree() + ~sg_multiset_impl(); + + //! @copydoc ::boost::intrusive::sgtree::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::sgtree::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::sgtree::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::sgtree::end() + iterator end(); + + //! @copydoc ::boost::intrusive::sgtree::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::sgtree::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::sgtree::rbegin() + reverse_iterator rbegin(); + + //! @copydoc ::boost::intrusive::sgtree::rbegin()const + const_reverse_iterator rbegin() const; + + //! @copydoc ::boost::intrusive::sgtree::crbegin()const + const_reverse_iterator crbegin() const; + + //! @copydoc ::boost::intrusive::sgtree::rend() + reverse_iterator rend(); + + //! @copydoc ::boost::intrusive::sgtree::rend()const + const_reverse_iterator rend() const; + + //! @copydoc ::boost::intrusive::sgtree::crend()const + const_reverse_iterator crend() const; + + //! @copydoc ::boost::intrusive::sgtree::root() + iterator root(); + + //! @copydoc ::boost::intrusive::sgtree::root()const + const_iterator root() const; + + //! @copydoc ::boost::intrusive::sgtree::croot()const + const_iterator croot() const; + + //! @copydoc ::boost::intrusive::sgtree::container_from_end_iterator(iterator) + static sg_multiset_impl &container_from_end_iterator(iterator end_iterator); + + //! @copydoc ::boost::intrusive::sgtree::container_from_end_iterator(const_iterator) + static const sg_multiset_impl &container_from_end_iterator(const_iterator end_iterator); + + //! @copydoc ::boost::intrusive::sgtree::container_from_iterator(iterator) + static sg_multiset_impl &container_from_iterator(iterator it); + + //! @copydoc ::boost::intrusive::sgtree::container_from_iterator(const_iterator) + static const sg_multiset_impl &container_from_iterator(const_iterator it); + + //! @copydoc ::boost::intrusive::sgtree::key_comp()const + key_compare key_comp() const; + + //! @copydoc ::boost::intrusive::sgtree::value_comp()const + value_compare value_comp() const; + + //! @copydoc ::boost::intrusive::sgtree::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::sgtree::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::sgtree::swap + void swap(sg_multiset_impl& other); + + //! @copydoc ::boost::intrusive::sgtree::clone_from(const sgtree&,Cloner,Disposer) + template + void clone_from(const sg_multiset_impl &src, Cloner cloner, Disposer disposer); + + #else + + using tree_type::clone_from; + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::sgtree::clone_from(sgtree&&,Cloner,Disposer) + template + void clone_from(BOOST_RV_REF(sg_multiset_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } + + //! @copydoc ::boost::intrusive::sgtree::insert_equal(reference) + iterator insert(reference value) + { return tree_type::insert_equal(value); } + + //! @copydoc ::boost::intrusive::sgtree::insert_equal(const_iterator,reference) + iterator insert(const_iterator hint, reference value) + { return tree_type::insert_equal(hint, value); } + + //! @copydoc ::boost::intrusive::sgtree::insert_equal(Iterator,Iterator) + template + void insert(Iterator b, Iterator e) + { tree_type::insert_equal(b, e); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::sgtree::insert_before + iterator insert_before(const_iterator pos, reference value); + + //! @copydoc ::boost::intrusive::sgtree::push_back + void push_back(reference value); + + //! @copydoc ::boost::intrusive::sgtree::push_front + void push_front(reference value); + + //! @copydoc ::boost::intrusive::sgtree::erase(const_iterator) + iterator erase(const_iterator i); + + //! @copydoc ::boost::intrusive::sgtree::erase(const_iterator,const_iterator) + iterator erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::sgtree::erase(const key_type &) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::sgtree::erase(const KeyType&,KeyTypeKeyCompare) + template + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const key_type &, Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::sgtree::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); + + //! @copydoc ::boost::intrusive::sgtree::clear + void clear(); + + //! @copydoc ::boost::intrusive::sgtree::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + //! @copydoc ::boost::intrusive::sgtree::count(const key_type &)const + size_type count(const key_type &key) const; + + //! @copydoc ::boost::intrusive::sgtree::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const key_type &) + iterator lower_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::sgtree::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::sgtree::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::sgtree::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::sgtree::find(const KeyType&,KeyTypeKeyCompare) + template + iterator find(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::sgtree::find(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::sgtree::find(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::sgtree::equal_range(const key_type &) + std::pair equal_range(const key_type &key); + + //! @copydoc ::boost::intrusive::sgtree::equal_range(const KeyType&,KeyTypeKeyCompare) + template + std::pair equal_range(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::sgtree::equal_range(const key_type &)const + std::pair + equal_range(const key_type &key) const; + + //! @copydoc ::boost::intrusive::sgtree::equal_range(const KeyType&,KeyTypeKeyCompare)const + template + std::pair + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const key_type &,const key_type &,bool,bool) + std::pair bounded_range + (const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const key_type &,const key_type &,bool,bool)const + std::pair + bounded_range(const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::sgtree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::sgtree::s_iterator_to(reference) + static iterator s_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::sgtree::s_iterator_to(const_reference) + static const_iterator s_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::sgtree::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::sgtree::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::sgtree::init_node(reference) + static void init_node(reference value); + + //! @copydoc ::boost::intrusive::sgtree::unlink_leftmost_without_rebalance + pointer unlink_leftmost_without_rebalance(); + + //! @copydoc ::boost::intrusive::sgtree::replace_node + void replace_node(iterator replace_this, reference with_this); + + //! @copydoc ::boost::intrusive::sgtree::remove_node + void remove_node(reference value); + + //! @copydoc ::boost::intrusive::sgtree::rebalance + void rebalance(); + + //! @copydoc ::boost::intrusive::sgtree::rebalance_subtree + iterator rebalance_subtree(iterator root); + + //! @copydoc ::boost::intrusive::sgtree::balance_factor() + float balance_factor() const; + + //! @copydoc ::boost::intrusive::sgtree::balance_factor(float) + void balance_factor(float new_alpha); + + //! @copydoc ::boost::intrusive::treap::merge_unique + template + void merge(sg_multiset &source); + + //! @copydoc ::boost::intrusive::treap::merge_unique + template + void merge(sg_set &source); + + #else + + template + void merge(sg_multiset_impl &source) + { return tree_type::merge_equal(source); } + + template + void merge(sg_set_impl &source) + { return tree_type::merge_equal(source); } + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED +}; + +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +template +bool operator!= (const sg_multiset_impl &x, const sg_multiset_impl &y); + +template +bool operator>(const sg_multiset_impl &x, const sg_multiset_impl &y); + +template +bool operator<=(const sg_multiset_impl &x, const sg_multiset_impl &y); + +template +bool operator>=(const sg_multiset_impl &x, const sg_multiset_impl &y); + +template +void swap(sg_multiset_impl &x, sg_multiset_impl &y); + +#endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +//! Helper metafunction to define a \c sg_multiset that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_sg_multiset +{ + /// @cond + typedef typename pack_options + < sgtree_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef sg_multiset_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::compare + , typename packed_options::size_type + , packed_options::floating_point + , typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class sg_multiset + : public make_sg_multiset::type +{ + typedef typename make_sg_multiset::type Base; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(sg_multiset) + + public: + typedef typename Base::key_compare key_compare; + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + + sg_multiset() + : Base() + {} + + explicit sg_multiset( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : Base(cmp, v_traits) + {} + + template + sg_multiset( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : Base(b, e, cmp, v_traits) + {} + + sg_multiset(BOOST_RV_REF(sg_multiset) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + sg_multiset& operator=(BOOST_RV_REF(sg_multiset) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + void clone_from(const sg_multiset &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(sg_multiset) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static sg_multiset &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const sg_multiset &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static sg_multiset &container_from_iterator(iterator it) + { return static_cast(Base::container_from_iterator(it)); } + + static const sg_multiset &container_from_iterator(const_iterator it) + { return static_cast(Base::container_from_iterator(it)); } +}; + +#endif + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_SG_SET_HPP diff --git a/boost/intrusive/splay_set.hpp b/boost/intrusive/splay_set.hpp new file mode 100644 index 000000000..da7662eeb --- /dev/null +++ b/boost/intrusive/splay_set.hpp @@ -0,0 +1,1110 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2007-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// +#ifndef BOOST_INTRUSIVE_SPLAY_SET_HPP +#define BOOST_INTRUSIVE_SPLAY_SET_HPP + +#include +#include +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +class splay_multiset_impl; +#endif + +namespace boost { +namespace intrusive { + +//! The class template splay_set is an intrusive container, that mimics most of +//! the interface of std::set as described in the C++ standard. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<> and +//! \c compare<>. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class splay_set_impl +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + : public splaytree_impl +#endif +{ + /// @cond + typedef splaytree_impl tree_type; + BOOST_MOVABLE_BUT_NOT_COPYABLE(splay_set_impl) + + typedef tree_type implementation_defined; + /// @endcond + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::value_compare value_compare; + typedef typename implementation_defined::key_compare key_compare; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::reverse_iterator reverse_iterator; + typedef typename implementation_defined::const_reverse_iterator const_reverse_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + static const bool constant_time_size = tree_type::constant_time_size; + + public: + //! @copydoc ::boost::intrusive::splaytree::splaytree() + splay_set_impl() + : tree_type() + {} + + //! @copydoc ::boost::intrusive::splaytree::splaytree(const key_compare &,const value_traits &) + explicit splay_set_impl( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : tree_type(cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::splaytree::splaytree(bool,Iterator,Iterator,const key_compare &,const value_traits &) + template + splay_set_impl( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(true, b, e, cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::splaytree::splaytree(splaytree &&) + splay_set_impl(BOOST_RV_REF(splay_set_impl) x) + : tree_type(BOOST_MOVE_BASE(tree_type, x)) + {} + + //! @copydoc ::boost::intrusive::splaytree::operator=(splaytree &&) + splay_set_impl& operator=(BOOST_RV_REF(splay_set_impl) x) + { return static_cast(tree_type::operator=(BOOST_MOVE_BASE(tree_type, x))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::splaytree::~splaytree() + ~splay_set_impl(); + + //! @copydoc ::boost::intrusive::splaytree::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::splaytree::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::splaytree::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::splaytree::end() + iterator end(); + + //! @copydoc ::boost::intrusive::splaytree::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::splaytree::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::splaytree::rbegin() + reverse_iterator rbegin(); + + //! @copydoc ::boost::intrusive::splaytree::rbegin()const + const_reverse_iterator rbegin() const; + + //! @copydoc ::boost::intrusive::splaytree::crbegin()const + const_reverse_iterator crbegin() const; + + //! @copydoc ::boost::intrusive::splaytree::rend() + reverse_iterator rend(); + + //! @copydoc ::boost::intrusive::splaytree::rend()const + const_reverse_iterator rend() const; + + //! @copydoc ::boost::intrusive::splaytree::crend()const + const_reverse_iterator crend() const; + + //! @copydoc ::boost::intrusive::splaytree::root() + iterator root(); + + //! @copydoc ::boost::intrusive::splaytree::root()const + const_iterator root() const; + + //! @copydoc ::boost::intrusive::splaytree::croot()const + const_iterator croot() const; + + //! @copydoc ::boost::intrusive::splaytree::container_from_end_iterator(iterator) + static splay_set_impl &container_from_end_iterator(iterator end_iterator); + + //! @copydoc ::boost::intrusive::splaytree::container_from_end_iterator(const_iterator) + static const splay_set_impl &container_from_end_iterator(const_iterator end_iterator); + + //! @copydoc ::boost::intrusive::splaytree::container_from_iterator(iterator) + static splay_set_impl &container_from_iterator(iterator it); + + //! @copydoc ::boost::intrusive::splaytree::container_from_iterator(const_iterator) + static const splay_set_impl &container_from_iterator(const_iterator it); + + //! @copydoc ::boost::intrusive::splaytree::key_comp()const + key_compare key_comp() const; + + //! @copydoc ::boost::intrusive::splaytree::value_comp()const + value_compare value_comp() const; + + //! @copydoc ::boost::intrusive::splaytree::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::splaytree::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::splaytree::swap + void swap(splay_set_impl& other); + + //! @copydoc ::boost::intrusive::splaytree::clone_from(const splaytree&,Cloner,Disposer) + template + void clone_from(const splay_set_impl &src, Cloner cloner, Disposer disposer); + + #else + + using tree_type::clone_from; + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::splaytree::clone_from(splaytree&&,Cloner,Disposer) + template + void clone_from(BOOST_RV_REF(splay_set_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } + + //! @copydoc ::boost::intrusive::splaytree::insert_unique(reference) + std::pair insert(reference value) + { return tree_type::insert_unique(value); } + + //! @copydoc ::boost::intrusive::splaytree::insert_unique(const_iterator,reference) + iterator insert(const_iterator hint, reference value) + { return tree_type::insert_unique(hint, value); } + + //! @copydoc ::boost::intrusive::rbtree::insert_unique_check(const key_type&,insert_commit_data&) + std::pair insert_check + (const key_type &key, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(key, commit_data); } + + //! @copydoc ::boost::intrusive::rbtree::insert_unique_check(const_iterator,const key_type&,insert_commit_data&) + std::pair insert_check + (const_iterator hint, const key_type &key + ,insert_commit_data &commit_data) + { return tree_type::insert_unique_check(hint, key, commit_data); } + + //! @copydoc ::boost::intrusive::splaytree::insert_unique_check(const KeyType&,KeyTypeKeyCompare,insert_commit_data&) + template + std::pair insert_check + (const KeyType &key, KeyTypeKeyCompare comp, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(key, comp, commit_data); } + + //! @copydoc ::boost::intrusive::splaytree::insert_unique_check(const_iterator,const KeyType&,KeyTypeKeyCompare,insert_commit_data&) + template + std::pair insert_check + (const_iterator hint, const KeyType &key + ,KeyTypeKeyCompare comp, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(hint, key, comp, commit_data); } + + //! @copydoc ::boost::intrusive::splaytree::insert_unique(Iterator,Iterator) + template + void insert(Iterator b, Iterator e) + { tree_type::insert_unique(b, e); } + + //! @copydoc ::boost::intrusive::splaytree::insert_unique_commit + iterator insert_commit(reference value, const insert_commit_data &commit_data) + { return tree_type::insert_unique_commit(value, commit_data); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::splaytree::insert_before + iterator insert_before(const_iterator pos, reference value); + + //! @copydoc ::boost::intrusive::splaytree::push_back + void push_back(reference value); + + //! @copydoc ::boost::intrusive::splaytree::push_front + void push_front(reference value); + + //! @copydoc ::boost::intrusive::splaytree::erase(const_iterator) + iterator erase(const_iterator i); + + //! @copydoc ::boost::intrusive::splaytree::erase(const_iterator,const_iterator) + iterator erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::splaytree::erase(const key_type &) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::splaytree::erase(const KeyType&,KeyTypeKeyCompare) + template + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::splaytree::erase_and_dispose(const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::splaytree::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::splaytree::erase_and_dispose(const key_type &, Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::splaytree::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); + + //! @copydoc ::boost::intrusive::splaytree::clear + void clear(); + + //! @copydoc ::boost::intrusive::splaytree::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::splaytree::count(const key_type &)const + size_type count(const key_type &key) const + { return static_cast(this->tree_type::find(key) != this->tree_type::cend()); } + + //! @copydoc ::boost::intrusive::splaytree::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const + { return static_cast(this->tree_type::find(key, comp) != this->tree_type::cend()); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::splaytree::count(const key_type &)const + size_type count(const key_type &key) const; + + //! @copydoc ::boost::intrusive::splaytree::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::splaytree::lower_bound(const key_type &) + iterator lower_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::splaytree::lower_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::splaytree::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::splaytree::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::splaytree::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::splaytree::upper_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::splaytree::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::splaytree::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::splaytree::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::splaytree::find(const KeyType&,KeyTypeKeyCompare) + template + iterator find(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::splaytree::find(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::splaytree::find(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::rbtree::equal_range(const key_type &) + std::pair equal_range(const key_type &key) + { return this->tree_type::lower_bound_range(key); } + + //! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyTypeKeyCompare) + template + std::pair equal_range(const KeyType& key, KeyTypeKeyCompare comp) + { return this->tree_type::equal_range(key, comp); } + + //! @copydoc ::boost::intrusive::rbtree::equal_range(const key_type &)const + std::pair + equal_range(const key_type &key) const + { return this->tree_type::lower_bound_range(key); } + + //! @copydoc ::boost::intrusive::rbtree::equal_range(const KeyType&,KeyTypeKeyCompare)const + template + std::pair + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const + { return this->tree_type::equal_range(key, comp); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::splaytree::bounded_range(const key_type&,const key_type&,bool,bool) + std::pair bounded_range + (const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::splaytree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::splaytree::bounded_range(const key_type&,const key_type&,bool,bool)const + std::pair bounded_range + (const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::splaytree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::splaytree::s_iterator_to(reference) + static iterator s_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::splaytree::s_iterator_to(const_reference) + static const_iterator s_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::splaytree::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::splaytree::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::splaytree::init_node(reference) + static void init_node(reference value); + + //! @copydoc ::boost::intrusive::splaytree::unlink_leftmost_without_rebalance + pointer unlink_leftmost_without_rebalance(); + + //! @copydoc ::boost::intrusive::splaytree::replace_node + void replace_node(iterator replace_this, reference with_this); + + //! @copydoc ::boost::intrusive::splaytree::remove_node + void remove_node(reference value); + + //! @copydoc ::boost::intrusive::splaytree::splay_up(iterator) + void splay_up(iterator i); + + //! @copydoc ::boost::intrusive::splaytree::splay_down(const KeyType&,KeyTypeKeyCompare) + template + iterator splay_down(const KeyType &key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::splaytree::splay_down(const key_type &key) + iterator splay_down(const key_type &key); + + //! @copydoc ::boost::intrusive::splaytree::rebalance + void rebalance(); + + //! @copydoc ::boost::intrusive::splaytree::rebalance_subtree + iterator rebalance_subtree(iterator root); + + //! @copydoc ::boost::intrusive::splaytree::merge_unique + template + void merge(splay_set &source); + + //! @copydoc ::boost::intrusive::splaytree::merge_unique + template + void merge(splay_multiset &source); + + #else + + template + void merge(splay_set_impl &source) + { return tree_type::merge_unique(source); } + + + template + void merge(splay_multiset_impl &source) + { return tree_type::merge_unique(source); } + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED +}; + +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +template +bool operator!= (const splay_set_impl &x, const splay_set_impl &y); + +template +bool operator>(const splay_set_impl &x, const splay_set_impl &y); + +template +bool operator<=(const splay_set_impl &x, const splay_set_impl &y); + +template +bool operator>=(const splay_set_impl &x, const splay_set_impl &y); + +template +void swap(splay_set_impl &x, splay_set_impl &y); + +#endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +//! Helper metafunction to define a \c splay_set that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_splay_set +{ + /// @cond + typedef typename pack_options + < splaytree_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef splay_set_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::compare + , typename packed_options::size_type + , packed_options::constant_time_size + , typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class splay_set + : public make_splay_set::type +{ + typedef typename make_splay_set + ::type Base; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(splay_set) + public: + typedef typename Base::key_compare key_compare; + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + + splay_set() + : Base() + {} + + explicit splay_set( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : Base(cmp, v_traits) + {} + + template + splay_set( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : Base(b, e, cmp, v_traits) + {} + + splay_set(BOOST_RV_REF(splay_set) x) + : Base(::boost::move(static_cast(x))) + {} + + splay_set& operator=(BOOST_RV_REF(splay_set) x) + { return static_cast(this->Base::operator=(::boost::move(static_cast(x)))); } + + template + void clone_from(const splay_set &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(splay_set) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static splay_set &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const splay_set &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static splay_set &container_from_iterator(iterator it) + { return static_cast(Base::container_from_iterator(it)); } + + static const splay_set &container_from_iterator(const_iterator it) + { return static_cast(Base::container_from_iterator(it)); } +}; + +#endif + +//! The class template splay_multiset is an intrusive container, that mimics most of +//! the interface of std::multiset as described in the C++ standard. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<> and +//! \c compare<>. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class splay_multiset_impl +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + : public splaytree_impl +#endif +{ + /// @cond + typedef splaytree_impl tree_type; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(splay_multiset_impl) + typedef tree_type implementation_defined; + /// @endcond + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::value_compare value_compare; + typedef typename implementation_defined::key_compare key_compare; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::reverse_iterator reverse_iterator; + typedef typename implementation_defined::const_reverse_iterator const_reverse_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + static const bool constant_time_size = tree_type::constant_time_size; + + public: + //! @copydoc ::boost::intrusive::splaytree::splaytree() + splay_multiset_impl() + : tree_type() + {} + + //! @copydoc ::boost::intrusive::splaytree::splaytree(const key_compare &,const value_traits &) + explicit splay_multiset_impl(const key_compare &cmp, const value_traits &v_traits = value_traits()) + : tree_type(cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::splaytree::splaytree(bool,Iterator,Iterator,const key_compare &,const value_traits &) + template + splay_multiset_impl( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(false, b, e, cmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::splaytree::splaytree(splaytree &&) + splay_multiset_impl(BOOST_RV_REF(splay_multiset_impl) x) + : tree_type(::boost::move(static_cast(x))) + {} + + //! @copydoc ::boost::intrusive::splaytree::operator=(splaytree &&) + splay_multiset_impl& operator=(BOOST_RV_REF(splay_multiset_impl) x) + { return static_cast(tree_type::operator=(::boost::move(static_cast(x)))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::splaytree::~splaytree() + ~splay_multiset_impl(); + + //! @copydoc ::boost::intrusive::splaytree::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::splaytree::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::splaytree::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::splaytree::end() + iterator end(); + + //! @copydoc ::boost::intrusive::splaytree::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::splaytree::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::splaytree::rbegin() + reverse_iterator rbegin(); + + //! @copydoc ::boost::intrusive::splaytree::rbegin()const + const_reverse_iterator rbegin() const; + + //! @copydoc ::boost::intrusive::splaytree::crbegin()const + const_reverse_iterator crbegin() const; + + //! @copydoc ::boost::intrusive::splaytree::rend() + reverse_iterator rend(); + + //! @copydoc ::boost::intrusive::splaytree::rend()const + const_reverse_iterator rend() const; + + //! @copydoc ::boost::intrusive::splaytree::crend()const + const_reverse_iterator crend() const; + + //! @copydoc ::boost::intrusive::splaytree::root() + iterator root(); + + //! @copydoc ::boost::intrusive::splaytree::root()const + const_iterator root() const; + + //! @copydoc ::boost::intrusive::splaytree::croot()const + const_iterator croot() const; + + //! @copydoc ::boost::intrusive::splaytree::container_from_end_iterator(iterator) + static splay_multiset_impl &container_from_end_iterator(iterator end_iterator); + + //! @copydoc ::boost::intrusive::splaytree::container_from_end_iterator(const_iterator) + static const splay_multiset_impl &container_from_end_iterator(const_iterator end_iterator); + + //! @copydoc ::boost::intrusive::splaytree::container_from_iterator(iterator) + static splay_multiset_impl &container_from_iterator(iterator it); + + //! @copydoc ::boost::intrusive::splaytree::container_from_iterator(const_iterator) + static const splay_multiset_impl &container_from_iterator(const_iterator it); + + //! @copydoc ::boost::intrusive::splaytree::key_comp()const + key_compare key_comp() const; + + //! @copydoc ::boost::intrusive::splaytree::value_comp()const + value_compare value_comp() const; + + //! @copydoc ::boost::intrusive::splaytree::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::splaytree::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::splaytree::swap + void swap(splay_multiset_impl& other); + + //! @copydoc ::boost::intrusive::splaytree::clone_from(const splaytree&,Cloner,Disposer) + template + void clone_from(const splay_multiset_impl &src, Cloner cloner, Disposer disposer); + + #else + + using tree_type::clone_from; + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::splaytree::clone_from(splaytree&&,Cloner,Disposer) + template + void clone_from(BOOST_RV_REF(splay_multiset_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } + + //! @copydoc ::boost::intrusive::splaytree::insert_equal(reference) + iterator insert(reference value) + { return tree_type::insert_equal(value); } + + //! @copydoc ::boost::intrusive::splaytree::insert_equal(const_iterator,reference) + iterator insert(const_iterator hint, reference value) + { return tree_type::insert_equal(hint, value); } + + //! @copydoc ::boost::intrusive::splaytree::insert_equal(Iterator,Iterator) + template + void insert(Iterator b, Iterator e) + { tree_type::insert_equal(b, e); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::splaytree::insert_before + iterator insert_before(const_iterator pos, reference value); + + //! @copydoc ::boost::intrusive::splaytree::push_back + void push_back(reference value); + + //! @copydoc ::boost::intrusive::splaytree::push_front + void push_front(reference value); + + //! @copydoc ::boost::intrusive::splaytree::erase(const_iterator) + iterator erase(const_iterator i); + + //! @copydoc ::boost::intrusive::splaytree::erase(const_iterator,const_iterator) + iterator erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::splaytree::erase(const key_type&) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::splaytree::erase(const KeyType&,KeyTypeKeyCompare) + template + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::splaytree::erase_and_dispose(const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::splaytree::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::splaytree::erase_and_dispose(const key_type&, Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::splaytree::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); + + //! @copydoc ::boost::intrusive::splaytree::clear + void clear(); + + //! @copydoc ::boost::intrusive::splaytree::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + //! @copydoc ::boost::intrusive::splaytree::count(const key_type&) + size_type count(const key_type&); + + //! @copydoc ::boost::intrusive::splaytree::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::splaytree::lower_bound(const key_type&) + iterator lower_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::splaytree::lower_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::splaytree::lower_bound(const key_type&)const + const_iterator lower_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::splaytree::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::splaytree::upper_bound(const key_type&) + iterator upper_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::splaytree::upper_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::splaytree::upper_bound(const key_type&)const + const_iterator upper_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::splaytree::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::splaytree::find(const key_type&) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::splaytree::find(const KeyType&,KeyTypeKeyCompare) + template + iterator find(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::splaytree::find(const key_type&)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::splaytree::find(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::splaytree::equal_range(const key_type&) + std::pair equal_range(const key_type &key); + + //! @copydoc ::boost::intrusive::splaytree::equal_range(const KeyType&,KeyTypeKeyCompare) + template + std::pair equal_range(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::splaytree::equal_range(const key_type&)const + std::pair + equal_range(const key_type &key) const; + + //! @copydoc ::boost::intrusive::splaytree::equal_range(const KeyType&,KeyTypeKeyCompare)const + template + std::pair + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::splaytree::bounded_range(const key_type&, const key_type&,bool,bool) + std::pair bounded_range + (const_reference lower_value, const_reference upper_value, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::splaytree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::splaytree::bounded_range(const key_type&, const key_type&,bool,bool)const + std::pair bounded_range + (const_reference lower_value, const_reference upper_value, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::splaytree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::splaytree::s_iterator_to(reference) + static iterator s_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::splaytree::s_iterator_to(const_reference) + static const_iterator s_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::splaytree::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::splaytree::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::splaytree::init_node(reference) + static void init_node(reference value); + + //! @copydoc ::boost::intrusive::splaytree::unlink_leftmost_without_rebalance + pointer unlink_leftmost_without_rebalance(); + + //! @copydoc ::boost::intrusive::splaytree::replace_node + void replace_node(iterator replace_this, reference with_this); + + //! @copydoc ::boost::intrusive::splaytree::remove_node + void remove_node(reference value); + + //! @copydoc ::boost::intrusive::splaytree::splay_up(iterator) + void splay_up(iterator i); + + //! @copydoc ::boost::intrusive::splaytree::splay_down(const KeyType&,KeyTypeKeyCompare) + template + iterator splay_down(const KeyType &key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::splaytree::splay_down(const key_type &key) + iterator splay_down(const key_type &key); + + //! @copydoc ::boost::intrusive::splaytree::rebalance + void rebalance(); + + //! @copydoc ::boost::intrusive::splaytree::rebalance_subtree + iterator rebalance_subtree(iterator root); + + //! @copydoc ::boost::intrusive::splaytree::merge_equal + template + void merge(splay_multiset &source); + + //! @copydoc ::boost::intrusive::splaytree::merge_equal + template + void merge(splay_set &source); + + #else + + template + void merge(splay_multiset_impl &source) + { return tree_type::merge_equal(source); } + + template + void merge(splay_set_impl &source) + { return tree_type::merge_equal(source); } + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED +}; + +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +template +bool operator!= (const splay_multiset_impl &x, const splay_multiset_impl &y); + +template +bool operator>(const splay_multiset_impl &x, const splay_multiset_impl &y); + +template +bool operator<=(const splay_multiset_impl &x, const splay_multiset_impl &y); + +template +bool operator>=(const splay_multiset_impl &x, const splay_multiset_impl &y); + +template +void swap(splay_multiset_impl &x, splay_multiset_impl &y); + +#endif //#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + +//! Helper metafunction to define a \c splay_multiset that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_splay_multiset +{ + /// @cond + typedef typename pack_options + < splaytree_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef splay_multiset_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::compare + , typename packed_options::size_type + , packed_options::constant_time_size + , typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class splay_multiset + : public make_splay_multiset::type +{ + typedef typename make_splay_multiset::type Base; + + BOOST_MOVABLE_BUT_NOT_COPYABLE(splay_multiset) + + public: + typedef typename Base::key_compare key_compare; + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + + splay_multiset() + : Base() + {} + + explicit splay_multiset( const key_compare &cmp, const value_traits &v_traits = value_traits()) + : Base(cmp, v_traits) + {} + + template + splay_multiset( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const value_traits &v_traits = value_traits()) + : Base(b, e, cmp, v_traits) + {} + + splay_multiset(BOOST_RV_REF(splay_multiset) x) + : Base(::boost::move(static_cast(x))) + {} + + splay_multiset& operator=(BOOST_RV_REF(splay_multiset) x) + { return static_cast(this->Base::operator=(::boost::move(static_cast(x)))); } + + template + void clone_from(const splay_multiset &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(splay_multiset) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static splay_multiset &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const splay_multiset &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static splay_multiset &container_from_iterator(iterator it) + { return static_cast(Base::container_from_iterator(it)); } + + static const splay_multiset &container_from_iterator(const_iterator it) + { return static_cast(Base::container_from_iterator(it)); } +}; + +#endif + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_SPLAY_SET_HPP diff --git a/boost/intrusive/treap.hpp b/boost/intrusive/treap.hpp new file mode 100644 index 000000000..8567072d5 --- /dev/null +++ b/boost/intrusive/treap.hpp @@ -0,0 +1,1344 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2008-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// +#ifndef BOOST_INTRUSIVE_TREAP_HPP +#define BOOST_INTRUSIVE_TREAP_HPP + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include //std::pair + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +/// @cond + +struct treap_defaults + : bstree_defaults +{ + typedef void priority; +}; + +/// @endcond + +//! The class template treap is an intrusive treap container that +//! is used to construct intrusive set and multiset containers. The no-throw +//! guarantee holds only, if the key_compare object and priority_compare object +//! don't throw. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<>, +//! \c compare<> and \c priority_compare<> +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class treap_impl + /// @cond + : public bstree_impl + //Use public inheritance to avoid MSVC bugs with closures + , public detail::ebo_functor_holder + < typename get_prio + < VoidOrPrioComp + , typename bstree_impl + ::key_type>::type + > + /// @endcond +{ + public: + typedef ValueTraits value_traits; + /// @cond + typedef bstree_impl< ValueTraits, VoidOrKeyOfValue, VoidOrKeyComp, SizeType + , ConstantTimeSize, BsTreeAlgorithms + , HeaderHolder> tree_type; + typedef tree_type implementation_defined; + typedef get_prio + < VoidOrPrioComp + , typename tree_type::key_type> get_prio_type; + + typedef detail::ebo_functor_holder + prio_base; + + /// @endcond + + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::value_compare value_compare; + typedef typename implementation_defined::key_compare key_compare; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::reverse_iterator reverse_iterator; + typedef typename implementation_defined::const_reverse_iterator const_reverse_iterator; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef BOOST_INTRUSIVE_IMPDEF(treap_algorithms) node_algorithms; + typedef BOOST_INTRUSIVE_IMPDEF(typename get_prio_type::type) priority_compare; + + static const bool constant_time_size = implementation_defined::constant_time_size; + static const bool stateful_value_traits = implementation_defined::stateful_value_traits; + static const bool safemode_or_autounlink = is_safe_autounlink::value; + + typedef detail::key_nodeptr_comp key_node_prio_comp_t; + + template + detail::key_nodeptr_comp key_node_prio_comp(KeyPrioComp keypriocomp) const + { return detail::key_nodeptr_comp(keypriocomp, &this->get_value_traits()); } + + /// @cond + private: + + //noncopyable + BOOST_MOVABLE_BUT_NOT_COPYABLE(treap_impl) + + const priority_compare &priv_pcomp() const + { return static_cast(*this).get(); } + + priority_compare &priv_pcomp() + { return static_cast(*this).get(); } + + /// @endcond + + public: + typedef typename node_algorithms::insert_commit_data insert_commit_data; + + //! Effects: Constructs an empty container. + //! + //! Complexity: Constant. + //! + //! Throws: If value_traits::node_traits::node + //! constructor throws (this does not happen with predefined Boost.Intrusive hooks) + //! or the copy constructor of the value_compare/priority_compare objects throw. Basic guarantee. + treap_impl() + : tree_type(), prio_base(priority_compare()) + {} + + //! Effects: Constructs an empty container. + //! + //! Complexity: Constant. + //! + //! Throws: If value_traits::node_traits::node + //! constructor throws (this does not happen with predefined Boost.Intrusive hooks) + //! or the copy constructor of the value_compare/priority_compare objects throw. Basic guarantee. + explicit treap_impl( const key_compare &cmp + , const priority_compare &pcmp = priority_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(cmp, v_traits), prio_base(pcmp) + {} + + //! Requires: Dereferencing iterator must yield an lvalue of type value_type. + //! cmp must be a comparison function that induces a strict weak ordering. + //! + //! Effects: Constructs an empty container and inserts elements from + //! [b, e). + //! + //! Complexity: Linear in N if [b, e) is already sorted using + //! comp and otherwise N * log N, where N is the distance between first and last. + //! + //! Throws: If value_traits::node_traits::node + //! constructor throws (this does not happen with predefined Boost.Intrusive hooks) + //! or the copy constructor/operator() of the key_compare/priority_compare objects + //! throw. Basic guarantee. + template + treap_impl( bool unique, Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const priority_compare &pcmp = priority_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(cmp, v_traits), prio_base(pcmp) + { + if(unique) + this->insert_unique(b, e); + else + this->insert_equal(b, e); + } + + //! @copydoc ::boost::intrusive::bstree::bstree(bstree &&) + treap_impl(BOOST_RV_REF(treap_impl) x) + : tree_type(BOOST_MOVE_BASE(tree_type, x)) + , prio_base(::boost::move(x.priv_pcomp())) + {} + + //! @copydoc ::boost::intrusive::bstree::operator=(bstree &&) + treap_impl& operator=(BOOST_RV_REF(treap_impl) x) + { this->swap(x); return *this; } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::bstree::~bstree() + ~treap_impl(); + + //! @copydoc ::boost::intrusive::bstree::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::bstree::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::bstree::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::bstree::end() + iterator end(); + + //! @copydoc ::boost::intrusive::bstree::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::bstree::cend()const + const_iterator cend() const; + #endif + + //! Effects: Returns an iterator pointing to the highest priority object of the treap. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + iterator top() + { return this->tree_type::root(); } + + //! Effects: Returns a const_iterator pointing to the highest priority object of the treap.. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + const_iterator top() const + { return this->ctop(); } + + //! Effects: Returns a const_iterator pointing to the highest priority object of the treap.. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + const_iterator ctop() const + { return this->tree_type::root(); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::bstree::rbegin() + reverse_iterator rbegin(); + + //! @copydoc ::boost::intrusive::bstree::rbegin()const + const_reverse_iterator rbegin() const; + + //! @copydoc ::boost::intrusive::bstree::crbegin()const + const_reverse_iterator crbegin() const; + + //! @copydoc ::boost::intrusive::bstree::rend() + reverse_iterator rend(); + + //! @copydoc ::boost::intrusive::bstree::rend()const + const_reverse_iterator rend() const; + + //! @copydoc ::boost::intrusive::bstree::crend()const + const_reverse_iterator crend() const; + + //! @copydoc ::boost::intrusive::bstree::root() + iterator root(); + + //! @copydoc ::boost::intrusive::bstree::root()const + const_iterator root() const; + + //! @copydoc ::boost::intrusive::bstree::croot()const + const_iterator croot() const; + + #endif + + //! Effects: Returns a reverse_iterator pointing to the highest priority object of the + //! reversed treap. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + reverse_iterator rtop() + { return reverse_iterator(this->top()); } + + //! Effects: Returns a const_reverse_iterator pointing to the highest priority objec + //! of the reversed treap. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + const_reverse_iterator rtop() const + { return const_reverse_iterator(this->top()); } + + //! Effects: Returns a const_reverse_iterator pointing to the highest priority object + //! of the reversed treap. + //! + //! Complexity: Constant. + //! + //! Throws: Nothing. + const_reverse_iterator crtop() const + { return const_reverse_iterator(this->top()); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::bstree::container_from_end_iterator(iterator) + static treap_impl &container_from_end_iterator(iterator end_iterator); + + //! @copydoc ::boost::intrusive::bstree::container_from_end_iterator(const_iterator) + static const treap_impl &container_from_end_iterator(const_iterator end_iterator); + + //! @copydoc ::boost::intrusive::bstree::container_from_iterator(iterator) + static treap_impl &container_from_iterator(iterator it); + + //! @copydoc ::boost::intrusive::bstree::container_from_iterator(const_iterator) + static const treap_impl &container_from_iterator(const_iterator it); + + //! @copydoc ::boost::intrusive::bstree::key_comp()const + key_compare key_comp() const; + + //! @copydoc ::boost::intrusive::bstree::value_comp()const + value_compare value_comp() const; + + //! @copydoc ::boost::intrusive::bstree::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::bstree::size()const + size_type size() const; + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! Effects: Returns the priority_compare object used by the container. + //! + //! Complexity: Constant. + //! + //! Throws: If priority_compare copy-constructor throws. + priority_compare priority_comp() const + { return this->priv_pcomp(); } + + //! Effects: Swaps the contents of two treaps. + //! + //! Complexity: Constant. + //! + //! Throws: If the comparison functor's swap call throws. + void swap(treap_impl& other) + { + tree_type::swap(other); + //This can throw + ::boost::adl_move_swap(this->priv_pcomp(), other.priv_pcomp()); + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! Cloner should yield to nodes equivalent to the original nodes. + //! + //! Effects: Erases all the elements from *this + //! calling Disposer::operator()(pointer), clones all the + //! elements from src calling Cloner::operator()(const_reference ) + //! and inserts them on *this. Copies the predicate from the source container. + //! + //! If cloner throws, all cloned elements are unlinked and disposed + //! calling Disposer::operator()(pointer). + //! + //! Complexity: Linear to erased plus inserted elements. + //! + //! Throws: If cloner throws or predicate copy assignment throws. Basic guarantee. + template + void clone_from(const treap_impl &src, Cloner cloner, Disposer disposer) + { + tree_type::clone_from(src, cloner, disposer); + this->priv_pcomp() = src.priv_pcomp(); + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! Cloner should yield to nodes equivalent to the original nodes. + //! + //! Effects: Erases all the elements from *this + //! calling Disposer::operator()(pointer), clones all the + //! elements from src calling Cloner::operator()(reference) + //! and inserts them on *this. Copies the predicate from the source container. + //! + //! If cloner throws, all cloned elements are unlinked and disposed + //! calling Disposer::operator()(pointer). + //! + //! Complexity: Linear to erased plus inserted elements. + //! + //! Throws: If cloner throws or predicate copy assignment throws. Basic guarantee. + template + void clone_from(BOOST_RV_REF(treap_impl) src, Cloner cloner, Disposer disposer) + { + tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); + this->priv_pcomp() = ::boost::move(src.priv_pcomp()); + } + + //! Requires: value must be an lvalue + //! + //! Effects: Inserts value into the container before the upper bound. + //! + //! Complexity: Average complexity for insert element is at + //! most logarithmic. + //! + //! Throws: If the internal key_compare or priority_compare functions throw. Strong guarantee. + //! + //! Note: Does not affect the validity of iterators and references. + //! No copy-constructors are called. + iterator insert_equal(reference value) + { + node_ptr to_insert(this->get_value_traits().to_node_ptr(value)); + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::unique(to_insert)); + iterator ret + ( node_algorithms::insert_equal_upper_bound + ( this->tree_type::header_ptr() + , to_insert + , this->key_node_comp(this->key_comp()) + , this->key_node_prio_comp(this->priv_pcomp())) + , this->priv_value_traits_ptr()); + this->tree_type::sz_traits().increment(); + return ret; + } + + //! Requires: value must be an lvalue, and "hint" must be + //! a valid iterator. + //! + //! Effects: Inserts x into the container, using "hint" as a hint to + //! where it will be inserted. If "hint" is the upper_bound + //! the insertion takes constant time (two comparisons in the worst case) + //! + //! Complexity: Logarithmic in general, but it is amortized + //! constant time if t is inserted immediately before hint. + //! + //! Throws: If the internal key_compare or priority_compare functions throw. Strong guarantee. + //! + //! Note: Does not affect the validity of iterators and references. + //! No copy-constructors are called. + iterator insert_equal(const_iterator hint, reference value) + { + node_ptr to_insert(this->get_value_traits().to_node_ptr(value)); + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::unique(to_insert)); + iterator ret + (node_algorithms::insert_equal + ( this->tree_type::header_ptr() + , hint.pointed_node() + , to_insert + , this->key_node_comp(this->key_comp()) + , this->key_node_prio_comp(this->priv_pcomp())) + , this->priv_value_traits_ptr()); + this->tree_type::sz_traits().increment(); + return ret; + } + + //! Requires: Dereferencing iterator must yield an lvalue + //! of type value_type. + //! + //! Effects: Inserts a each element of a range into the container + //! before the upper bound of the key of each element. + //! + //! Complexity: Insert range is in general O(N * log(N)), where N is the + //! size of the range. However, it is linear in N if the range is already sorted + //! by key_comp(). + //! + //! Throws: If the internal key_compare or priority_compare functions throw. + //! Strong guarantee. + //! + //! Note: Does not affect the validity of iterators and references. + //! No copy-constructors are called. + template + void insert_equal(Iterator b, Iterator e) + { + iterator iend(this->end()); + for (; b != e; ++b) + this->insert_equal(iend, *b); + } + + //! Requires: value must be an lvalue + //! + //! Effects: Inserts value into the container if the value + //! is not already present. + //! + //! Complexity: Average complexity for insert element is at + //! most logarithmic. + //! + //! Throws: If the internal key_compare or priority_compare functions throw. + //! Strong guarantee. + //! + //! Note: Does not affect the validity of iterators and references. + //! No copy-constructors are called. + std::pair insert_unique(reference value) + { + insert_commit_data commit_data; + std::pair ret = this->insert_unique_check(key_of_value()(value), commit_data); + if(!ret.second) + return ret; + return std::pair (this->insert_unique_commit(value, commit_data), true); + } + + //! Requires: value must be an lvalue, and "hint" must be + //! a valid iterator + //! + //! Effects: Tries to insert x into the container, using "hint" as a hint + //! to where it will be inserted. + //! + //! Complexity: Logarithmic in general, but it is amortized + //! constant time (two comparisons in the worst case) + //! if t is inserted immediately before hint. + //! + //! Throws: If the internal key_compare or priority_compare functions throw. + //! Strong guarantee. + //! + //! Note: Does not affect the validity of iterators and references. + //! No copy-constructors are called. + iterator insert_unique(const_iterator hint, reference value) + { + insert_commit_data commit_data; + std::pair ret = this->insert_unique_check(hint, key_of_value()(value), commit_data); + if(!ret.second) + return ret.first; + return this->insert_unique_commit(value, commit_data); + } + + //! Requires: Dereferencing iterator must yield an lvalue + //! of type value_type. + //! + //! Effects: Tries to insert each element of a range into the container. + //! + //! Complexity: Insert range is in general O(N * log(N)), where N is the + //! size of the range. However, it is linear in N if the range is already sorted + //! by key_comp(). + //! + //! Throws: If the internal key_compare or priority_compare functions throw. + //! Strong guarantee. + //! + //! Note: Does not affect the validity of iterators and references. + //! No copy-constructors are called. + template + void insert_unique(Iterator b, Iterator e) + { + if(this->empty()){ + iterator iend(this->end()); + for (; b != e; ++b) + this->insert_unique(iend, *b); + } + else{ + for (; b != e; ++b) + this->insert_unique(*b); + } + } + + //! Effects: Checks if a value can be inserted in the container, using + //! a user provided key instead of the value itself. + //! + //! Returns: If there is an equivalent value + //! returns a pair containing an iterator to the already present value + //! and false. If the value can be inserted returns true in the returned + //! pair boolean and fills "commit_data" that is meant to be used with + //! the "insert_commit" function. + //! + //! Complexity: Average complexity is at most logarithmic. + //! + //! Throws: If the comparison or predicate functions throw. Strong guarantee. + //! + //! Notes: This function is used to improve performance when constructing + //! a value_type is expensive: if there is an equivalent value + //! the constructed object must be discarded. Many times, the part of the + //! node that is used to impose the order is much cheaper to construct + //! than the value_type and this function offers the possibility to use that + //! part to check if the insertion will be successful. + //! + //! If the check is successful, the user can construct the value_type and use + //! "insert_commit" to insert the object in constant-time. This gives a total + //! logarithmic complexity to the insertion: check(O(log(N)) + commit(O(1)). + //! + //! "commit_data" remains valid for a subsequent "insert_commit" only if no more + //! objects are inserted or erased from the container. + std::pair insert_unique_check + ( const key_type &key, insert_commit_data &commit_data) + { return this->insert_unique_check(key, this->key_comp(), this->priv_pcomp(), commit_data); } + + //! Effects: Checks if a value can be inserted in the container, using + //! a user provided key instead of the value itself, using "hint" + //! as a hint to where it will be inserted. + //! + //! Returns: If there is an equivalent value + //! returns a pair containing an iterator to the already present value + //! and false. If the value can be inserted returns true in the returned + //! pair boolean and fills "commit_data" that is meant to be used with + //! the "insert_commit" function. + //! + //! Complexity: Logarithmic in general, but it's amortized + //! constant time if t is inserted immediately before hint. + //! + //! Throws: If the comparison or predicate functions throw. Strong guarantee. + //! + //! Notes: This function is used to improve performance when constructing + //! a value_type is expensive: if there is an equivalent value + //! the constructed object must be discarded. Many times, the part of the + //! constructing that is used to impose the order is much cheaper to construct + //! than the value_type and this function offers the possibility to use that key + //! to check if the insertion will be successful. + //! + //! If the check is successful, the user can construct the value_type and use + //! "insert_commit" to insert the object in constant-time. This can give a total + //! constant-time complexity to the insertion: check(O(1)) + commit(O(1)). + //! + //! "commit_data" remains valid for a subsequent "insert_commit" only if no more + //! objects are inserted or erased from the container. + std::pair insert_unique_check + ( const_iterator hint, const key_type &key, insert_commit_data &commit_data) + { return this->insert_unique_check(hint, key, this->key_comp(), this->priv_pcomp(), commit_data); } + + //! Requires: comp must be a comparison function that induces + //! the same strict weak ordering as key_compare. + //! key_value_pcomp must be a comparison function that induces + //! the same strict weak ordering as priority_compare. The difference is that + //! key_value_pcomp and comp compare an arbitrary key with the contained values. + //! + //! Effects: Checks if a value can be inserted in the container, using + //! a user provided key instead of the value itself. + //! + //! Returns: If there is an equivalent value + //! returns a pair containing an iterator to the already present value + //! and false. If the value can be inserted returns true in the returned + //! pair boolean and fills "commit_data" that is meant to be used with + //! the "insert_commit" function. + //! + //! Complexity: Average complexity is at most logarithmic. + //! + //! Throws: If the comp or key_value_pcomp + //! ordering functions throw. Strong guarantee. + //! + //! Notes: This function is used to improve performance when constructing + //! a value_type is expensive: if there is an equivalent value + //! the constructed object must be discarded. Many times, the part of the + //! node that is used to impose the order is much cheaper to construct + //! than the value_type and this function offers the possibility to use that + //! part to check if the insertion will be successful. + //! + //! If the check is successful, the user can construct the value_type and use + //! "insert_commit" to insert the object in constant-time. This gives a total + //! logarithmic complexity to the insertion: check(O(log(N)) + commit(O(1)). + //! + //! "commit_data" remains valid for a subsequent "insert_commit" only if no more + //! objects are inserted or erased from the container. + template + BOOST_INTRUSIVE_DOC1ST(std::pair + , typename detail::disable_if_convertible + >::type) + insert_unique_check + ( const KeyType &key, KeyTypeKeyCompare comp + , KeyValuePrioCompare key_value_pcomp, insert_commit_data &commit_data) + { + std::pair const ret = + (node_algorithms::insert_unique_check + ( this->tree_type::header_ptr(), key + , this->key_node_comp(comp), this->key_node_prio_comp(key_value_pcomp), commit_data)); + return std::pair(iterator(ret.first, this->priv_value_traits_ptr()), ret.second); + } + + //! Requires: comp must be a comparison function that induces + //! the same strict weak ordering as key_compare. + //! key_value_pcomp must be a comparison function that induces + //! the same strict weak ordering as priority_compare. The difference is that + //! key_value_pcomp and comp compare an arbitrary key with the contained values. + //! + //! Effects: Checks if a value can be inserted in the container, using + //! a user provided key instead of the value itself, using "hint" + //! as a hint to where it will be inserted. + //! + //! Returns: If there is an equivalent value + //! returns a pair containing an iterator to the already present value + //! and false. If the value can be inserted returns true in the returned + //! pair boolean and fills "commit_data" that is meant to be used with + //! the "insert_commit" function. + //! + //! Complexity: Logarithmic in general, but it's amortized + //! constant time if t is inserted immediately before hint. + //! + //! Throws: If the comp or key_value_pcomp + //! ordering functions throw. Strong guarantee. + //! + //! Notes: This function is used to improve performance when constructing + //! a value_type is expensive: if there is an equivalent value + //! the constructed object must be discarded. Many times, the part of the + //! constructing that is used to impose the order is much cheaper to construct + //! than the value_type and this function offers the possibility to use that key + //! to check if the insertion will be successful. + //! + //! If the check is successful, the user can construct the value_type and use + //! "insert_commit" to insert the object in constant-time. This can give a total + //! constant-time complexity to the insertion: check(O(1)) + commit(O(1)). + //! + //! "commit_data" remains valid for a subsequent "insert_commit" only if no more + //! objects are inserted or erased from the container. + template + std::pair insert_unique_check + ( const_iterator hint, const KeyType &key + , KeyTypeKeyCompare comp + , KeyValuePrioCompare key_value_pcomp + , insert_commit_data &commit_data) + { + std::pair const ret = + (node_algorithms::insert_unique_check + ( this->tree_type::header_ptr(), hint.pointed_node(), key + , this->key_node_comp(comp), this->key_node_prio_comp(key_value_pcomp), commit_data)); + return std::pair(iterator(ret.first, this->priv_value_traits_ptr()), ret.second); + } + + //! Requires: value must be an lvalue of type value_type. commit_data + //! must have been obtained from a previous call to "insert_check". + //! No objects should have been inserted or erased from the container between + //! the "insert_check" that filled "commit_data" and the call to "insert_commit". + //! + //! Effects: Inserts the value in the avl_set using the information obtained + //! from the "commit_data" that a previous "insert_check" filled. + //! + //! Returns: An iterator to the newly inserted object. + //! + //! Complexity: Constant time. + //! + //! Throws: Nothing + //! + //! Notes: This function has only sense if a "insert_check" has been + //! previously executed to fill "commit_data". No value should be inserted or + //! erased between the "insert_check" and "insert_commit" calls. + iterator insert_unique_commit(reference value, const insert_commit_data &commit_data) + { + node_ptr to_insert(this->get_value_traits().to_node_ptr(value)); + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::unique(to_insert)); + node_algorithms::insert_unique_commit(this->tree_type::header_ptr(), to_insert, commit_data); + this->tree_type::sz_traits().increment(); + return iterator(to_insert, this->priv_value_traits_ptr()); + } + + //! Requires: value must be an lvalue, "pos" must be + //! a valid iterator (or end) and must be the succesor of value + //! once inserted according to the predicate + //! + //! Effects: Inserts x into the container before "pos". + //! + //! Complexity: Constant time. + //! + //! Throws: If the internal priority_compare function throws. Strong guarantee. + //! + //! Note: This function does not check preconditions so if "pos" is not + //! the successor of "value" container ordering invariant will be broken. + //! This is a low-level function to be used only for performance reasons + //! by advanced users. + iterator insert_before(const_iterator pos, reference value) + { + node_ptr to_insert(this->get_value_traits().to_node_ptr(value)); + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::unique(to_insert)); + iterator ret + ( node_algorithms::insert_before + ( this->tree_type::header_ptr() + , pos.pointed_node() + , to_insert + , this->key_node_prio_comp(this->priv_pcomp()) + ) + , this->priv_value_traits_ptr()); + this->tree_type::sz_traits().increment(); + return ret; + } + + //! Requires: value must be an lvalue, and it must be no less + //! than the greatest inserted key + //! + //! Effects: Inserts x into the container in the last position. + //! + //! Complexity: Constant time. + //! + //! Throws: If the internal priority_compare function throws. Strong guarantee. + //! + //! Note: This function does not check preconditions so if value is + //! less than the greatest inserted key container ordering invariant will be broken. + //! This function is slightly more efficient than using "insert_before". + //! This is a low-level function to be used only for performance reasons + //! by advanced users. + void push_back(reference value) + { + node_ptr to_insert(this->get_value_traits().to_node_ptr(value)); + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::unique(to_insert)); + node_algorithms::push_back + (this->tree_type::header_ptr(), to_insert, this->key_node_prio_comp(this->priv_pcomp())); + this->tree_type::sz_traits().increment(); + } + + //! Requires: value must be an lvalue, and it must be no greater + //! than the minimum inserted key + //! + //! Effects: Inserts x into the container in the first position. + //! + //! Complexity: Constant time. + //! + //! Throws: If the internal priority_compare function throws. Strong guarantee. + //! + //! Note: This function does not check preconditions so if value is + //! greater than the minimum inserted key container ordering invariant will be broken. + //! This function is slightly more efficient than using "insert_before". + //! This is a low-level function to be used only for performance reasons + //! by advanced users. + void push_front(reference value) + { + node_ptr to_insert(this->get_value_traits().to_node_ptr(value)); + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || node_algorithms::unique(to_insert)); + node_algorithms::push_front + (this->tree_type::header_ptr(), to_insert, this->key_node_prio_comp(this->priv_pcomp())); + this->tree_type::sz_traits().increment(); + } + + //! Effects: Erases the element pointed to by i. + //! + //! Complexity: Average complexity for erase element is constant time. + //! + //! Throws: if the internal priority_compare function throws. Strong guarantee. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. No destructors are called. + iterator erase(const_iterator i) + { + const_iterator ret(i); + ++ret; + node_ptr to_erase(i.pointed_node()); + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || !node_algorithms::unique(to_erase)); + node_algorithms::erase + (this->tree_type::header_ptr(), to_erase, this->key_node_prio_comp(this->priv_pcomp())); + this->tree_type::sz_traits().decrement(); + if(safemode_or_autounlink) + node_algorithms::init(to_erase); + return ret.unconst(); + } + + //! Effects: Erases the range pointed to by b end e. + //! + //! Complexity: Average complexity for erase range is at most + //! O(log(size() + N)), where N is the number of elements in the range. + //! + //! Throws: if the internal priority_compare function throws. Strong guarantee. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. No destructors are called. + iterator erase(const_iterator b, const_iterator e) + { size_type n; return private_erase(b, e, n); } + + //! Effects: Erases all the elements with the given value. + //! + //! Returns: The number of erased elements. + //! + //! Complexity: O(log(size() + N). + //! + //! Throws: if the internal priority_compare function throws. Strong guarantee. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. No destructors are called. + size_type erase(const key_type &key) + { return this->erase(key, this->key_comp()); } + + //! Effects: Erases all the elements with the given key. + //! according to the comparison functor "comp". + //! + //! Returns: The number of erased elements. + //! + //! Complexity: O(log(size() + N). + //! + //! Throws: if the internal priority_compare function throws. + //! Equivalent guarantee to while(beg != end) erase(beg++); + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. No destructors are called. + template + BOOST_INTRUSIVE_DOC1ST(size_type + , typename detail::disable_if_convertible::type) + erase(const KeyType& key, KeyTypeKeyCompare comp) + { + std::pair p = this->equal_range(key, comp); + size_type n; + private_erase(p.first, p.second, n); + return n; + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases the element pointed to by i. + //! Disposer::operator()(pointer) is called for the removed element. + //! + //! Complexity: Average complexity for erase element is constant time. + //! + //! Throws: if the internal priority_compare function throws. Strong guarantee. + //! + //! Note: Invalidates the iterators + //! to the erased elements. + template + iterator erase_and_dispose(const_iterator i, Disposer disposer) + { + node_ptr to_erase(i.pointed_node()); + iterator ret(this->erase(i)); + disposer(this->get_value_traits().to_value_ptr(to_erase)); + return ret; + } + + #if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + template + iterator erase_and_dispose(iterator i, Disposer disposer) + { return this->erase_and_dispose(const_iterator(i), disposer); } + #endif + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases the range pointed to by b end e. + //! Disposer::operator()(pointer) is called for the removed elements. + //! + //! Complexity: Average complexity for erase range is at most + //! O(log(size() + N)), where N is the number of elements in the range. + //! + //! Throws: if the internal priority_compare function throws. Strong guarantee. + //! + //! Note: Invalidates the iterators + //! to the erased elements. + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer) + { size_type n; return private_erase(b, e, n, disposer); } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases all the elements with the given value. + //! Disposer::operator()(pointer) is called for the removed elements. + //! + //! Returns: The number of erased elements. + //! + //! Complexity: O(log(size() + N). + //! + //! Throws: if the priority_compare function throws then weak guarantee and heap invariants are broken. + //! The safest thing would be to clear or destroy the container. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. No destructors are called. + template + size_type erase_and_dispose(const key_type &key, Disposer disposer) + { + std::pair p = this->equal_range(key); + size_type n; + private_erase(p.first, p.second, n, disposer); + return n; + } + + //! Requires: Disposer::operator()(pointer) shouldn't throw. + //! + //! Effects: Erases all the elements with the given key. + //! according to the comparison functor "comp". + //! Disposer::operator()(pointer) is called for the removed elements. + //! + //! Returns: The number of erased elements. + //! + //! Complexity: O(log(size() + N). + //! + //! Throws: if the priority_compare function throws then weak guarantee and heap invariants are broken. + //! The safest thing would be to clear or destroy the container. + //! + //! Note: Invalidates the iterators + //! to the erased elements. + template + BOOST_INTRUSIVE_DOC1ST(size_type + , typename detail::disable_if_convertible::type) + erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer) + { + std::pair p = this->equal_range(key, comp); + size_type n; + private_erase(p.first, p.second, n, disposer); + return n; + } + + //! Effects: Erases all of the elements. + //! + //! Complexity: Linear to the number of elements on the container. + //! if it's a safe-mode or auto-unlink value_type. Constant time otherwise. + //! + //! Throws: Nothing. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. No destructors are called. + void clear() + { tree_type::clear(); } + + //! Effects: Erases all of the elements calling disposer(p) for + //! each node to be erased. + //! Complexity: Average complexity for is at most O(log(size() + N)), + //! where N is the number of elements in the container. + //! + //! Throws: Nothing. + //! + //! Note: Invalidates the iterators (but not the references) + //! to the erased elements. Calls N times to disposer functor. + template + void clear_and_dispose(Disposer disposer) + { + node_algorithms::clear_and_dispose(this->tree_type::header_ptr() + , detail::node_disposer(disposer, &this->get_value_traits())); + node_algorithms::init_header(this->tree_type::header_ptr()); + this->tree_type::sz_traits().set_size(0); + } + + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + //! @copydoc ::boost::intrusive::bstree::merge_unique + template void merge_unique(sgtree &); + #else + template + void merge_unique(treap_impl + &source) + #endif + { + node_ptr it (node_algorithms::begin_node(source.header_ptr())) + , itend(node_algorithms::end_node (source.header_ptr())); + + while(it != itend){ + node_ptr const p(it); + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || !node_algorithms::unique(p)); + it = node_algorithms::next_node(it); + + if( node_algorithms::transfer_unique + ( this->header_ptr(), this->key_node_comp(this->key_comp()) + , this->key_node_prio_comp(this->priv_pcomp()), source.header_ptr(), p) ){ + this->sz_traits().increment(); + source.sz_traits().decrement(); + } + } + } + + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + //! @copydoc ::boost::intrusive::bstree::merge_equal(bstree&) + template void merge_equal(sgtree &); + #else + template + void merge_equal(treap_impl + &source) + #endif + { + node_ptr it (node_algorithms::begin_node(source.header_ptr())) + , itend(node_algorithms::end_node (source.header_ptr())); + + while(it != itend){ + node_ptr const p(it); + BOOST_INTRUSIVE_SAFE_HOOK_DEFAULT_ASSERT(!safemode_or_autounlink || !node_algorithms::unique(p)); + it = node_algorithms::next_node(it); + node_algorithms::transfer_equal + ( this->header_ptr(), this->key_node_comp(this->key_comp()) + , this->key_node_prio_comp(this->priv_pcomp()), source.header_ptr(), p); + this->sz_traits().increment(); + source.sz_traits().decrement(); + } + } + + //! @copydoc ::boost::intrusive::bstree::check(ExtraChecker)const + template + void check(ExtraChecker extra_checker) const + { + typedef detail::key_nodeptr_comp nodeptr_prio_comp_t; + tree_type::check(detail::treap_node_extra_checker + + (this->key_node_prio_comp(this->priv_pcomp()), extra_checker)); + } + + //! @copydoc ::boost::intrusive::bstree::check()const + void check() const + { check(detail::empty_node_checker()); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::bstree::count(const key_type &)const + size_type count(const key_type &key) const; + + //! @copydoc ::boost::intrusive::bstree::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::bstree::lower_bound(const key_type &) + iterator lower_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::bstree::lower_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::bstree::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::bstree::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::bstree::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::bstree::upper_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::bstree::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::bstree::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::bstree::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::bstree::find(const KeyType&,KeyTypeKeyCompare) + template + iterator find(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::bstree::find(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::bstree::find(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::bstree::equal_range(const key_type &) + std::pair equal_range(const key_type &key); + + //! @copydoc ::boost::intrusive::bstree::equal_range(const KeyType&,KeyTypeKeyCompare) + template + std::pair equal_range(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::bstree::equal_range(const key_type &)const + std::pair + equal_range(const key_type &key) const; + + //! @copydoc ::boost::intrusive::bstree::equal_range(const KeyType&,KeyTypeKeyCompare)const + template + std::pair + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::bstree::bounded_range(const key_type &,const key_type &,bool,bool) + std::pair bounded_range + (const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::bstree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::bstree::bounded_range(const key_type &,const key_type &,bool,bool)const + std::pair + bounded_range(const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::bstree::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::bstree::s_iterator_to(reference) + static iterator s_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::bstree::s_iterator_to(const_reference) + static const_iterator s_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::bstree::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::bstree::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::bstree::init_node(reference) + static void init_node(reference value); + + //! @copydoc ::boost::intrusive::bstree::unlink_leftmost_without_rebalance + pointer unlink_leftmost_without_rebalance(); + + //! @copydoc ::boost::intrusive::bstree::replace_node + void replace_node(iterator replace_this, reference with_this); + + //! @copydoc ::boost::intrusive::bstree::remove_node + void remove_node(reference value); + + friend bool operator< (const treap_impl &x, const treap_impl &y); + + friend bool operator==(const treap_impl &x, const treap_impl &y); + + friend bool operator!= (const treap_impl &x, const treap_impl &y); + + friend bool operator>(const treap_impl &x, const treap_impl &y); + + friend bool operator<=(const treap_impl &x, const treap_impl &y); + + friend bool operator>=(const treap_impl &x, const treap_impl &y); + + friend void swap(treap_impl &x, treap_impl &y); + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + /// @cond + private: + template + iterator private_erase(const_iterator b, const_iterator e, size_type &n, Disposer disposer) + { + for(n = 0; b != e; ++n) + this->erase_and_dispose(b++, disposer); + return b.unconst(); + } + + iterator private_erase(const_iterator b, const_iterator e, size_type &n) + { + for(n = 0; b != e; ++n) + this->erase(b++); + return b.unconst(); + } + /// @endcond +}; + + +//! Helper metafunction to define a \c treap that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_treap +{ + typedef typename pack_options + < treap_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef treap_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::compare + , typename packed_options::priority + , typename packed_options::size_type + , packed_options::constant_time_size + , typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class treap + : public make_treap::type +{ + typedef typename make_treap + ::type Base; + BOOST_MOVABLE_BUT_NOT_COPYABLE(treap) + + public: + typedef typename Base::key_compare key_compare; + typedef typename Base::priority_compare priority_compare; + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + typedef typename Base::reverse_iterator reverse_iterator; + typedef typename Base::const_reverse_iterator const_reverse_iterator; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + treap() + : Base() + {} + + explicit treap( const key_compare &cmp + , const priority_compare &pcmp = priority_compare() + , const value_traits &v_traits = value_traits()) + : Base(cmp, pcmp, v_traits) + {} + + template + treap( bool unique, Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const priority_compare &pcmp = priority_compare() + , const value_traits &v_traits = value_traits()) + : Base(unique, b, e, cmp, pcmp, v_traits) + {} + + treap(BOOST_RV_REF(treap) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + treap& operator=(BOOST_RV_REF(treap) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + void clone_from(const treap &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(treap) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static treap &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const treap &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static treap &container_from_iterator(iterator it) + { return static_cast(Base::container_from_iterator(it)); } + + static const treap &container_from_iterator(const_iterator it) + { return static_cast(Base::container_from_iterator(it)); } +}; + +#endif + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_TREAP_HPP diff --git a/boost/intrusive/treap_algorithms.hpp b/boost/intrusive/treap_algorithms.hpp new file mode 100644 index 000000000..b1a82b3d0 --- /dev/null +++ b/boost/intrusive/treap_algorithms.hpp @@ -0,0 +1,699 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_TREAP_ALGORITHMS_HPP +#define BOOST_INTRUSIVE_TREAP_ALGORITHMS_HPP + +#include +#include + +#include + +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + +namespace detail +{ + +template +struct treap_node_extra_checker + : public ExtraChecker +{ + typedef ExtraChecker base_checker_t; + typedef ValueTraits value_traits; + typedef typename value_traits::node_traits node_traits; + typedef typename node_traits::const_node_ptr const_node_ptr; + + typedef typename base_checker_t::return_type return_type; + + treap_node_extra_checker(const NodePtrPrioCompare& prio_comp, ExtraChecker extra_checker) + : base_checker_t(extra_checker), prio_comp_(prio_comp) + {} + + void operator () (const const_node_ptr& p, + const return_type& check_return_left, const return_type& check_return_right, + return_type& check_return) + { + if (node_traits::get_left(p)) + BOOST_INTRUSIVE_INVARIANT_ASSERT(!prio_comp_(node_traits::get_left(p), p)); + if (node_traits::get_right(p)) + BOOST_INTRUSIVE_INVARIANT_ASSERT(!prio_comp_(node_traits::get_right(p), p)); + base_checker_t::operator()(p, check_return_left, check_return_right, check_return); + } + + const NodePtrPrioCompare prio_comp_; +}; + +} // namespace detail + +#endif //#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + +//! treap_algorithms provides basic algorithms to manipulate +//! nodes forming a treap. +//! +//! (1) the header node is maintained with links not only to the root +//! but also to the leftmost node of the tree, to enable constant time +//! begin(), and to the rightmost node of the tree, to enable linear time +//! performance when used with the generic set algorithms (set_union, +//! etc.); +//! +//! (2) when a node being deleted has two children its successor node is +//! relinked into its place, rather than copied, so that the only +//! pointers invalidated are those referring to the deleted node. +//! +//! treap_algorithms is configured with a NodeTraits class, which encapsulates the +//! information about the node to be manipulated. NodeTraits must support the +//! following interface: +//! +//! Typedefs: +//! +//! node: The type of the node that forms the treap +//! +//! node_ptr: A pointer to a node +//! +//! const_node_ptr: A pointer to a const node +//! +//! Static functions: +//! +//! static node_ptr get_parent(const_node_ptr n); +//! +//! static void set_parent(node_ptr n, node_ptr parent); +//! +//! static node_ptr get_left(const_node_ptr n); +//! +//! static void set_left(node_ptr n, node_ptr left); +//! +//! static node_ptr get_right(const_node_ptr n); +//! +//! static void set_right(node_ptr n, node_ptr right); +template +class treap_algorithms + #ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + : public bstree_algorithms + #endif +{ + public: + typedef NodeTraits node_traits; + typedef typename NodeTraits::node node; + typedef typename NodeTraits::node_ptr node_ptr; + typedef typename NodeTraits::const_node_ptr const_node_ptr; + + /// @cond + private: + + typedef bstree_algorithms bstree_algo; + + class rerotate_on_destroy + { + rerotate_on_destroy& operator=(const rerotate_on_destroy&); + + public: + rerotate_on_destroy(const node_ptr & header, const node_ptr & p, std::size_t &n) + : header_(header), p_(p), n_(n), remove_it_(true) + {} + + ~rerotate_on_destroy() + { + if(remove_it_){ + rotate_up_n(header_, p_, n_); + } + } + + void release() + { remove_it_ = false; } + + const node_ptr header_; + const node_ptr p_; + std::size_t &n_; + bool remove_it_; + }; + + static void rotate_up_n(const node_ptr header, const node_ptr p, std::size_t n) + { + node_ptr p_parent(NodeTraits::get_parent(p)); + node_ptr p_grandparent(NodeTraits::get_parent(p_parent)); + while(n--){ + if(p == NodeTraits::get_left(p_parent)){ //p is left child + bstree_algo::rotate_right(p_parent, p, p_grandparent, header); + } + else{ //p is right child + bstree_algo::rotate_left(p_parent, p, p_grandparent, header); + } + p_parent = p_grandparent; + p_grandparent = NodeTraits::get_parent(p_parent); + } + } + + /// @endcond + + public: + //! This type is the information that will be + //! filled by insert_unique_check + struct insert_commit_data + /// @cond + : public bstree_algo::insert_commit_data + /// @endcond + { + /// @cond + std::size_t rotations; + /// @endcond + }; + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::bstree_algorithms::get_header(const const_node_ptr&) + static node_ptr get_header(const const_node_ptr & n); + + //! @copydoc ::boost::intrusive::bstree_algorithms::begin_node + static node_ptr begin_node(const const_node_ptr & header); + + //! @copydoc ::boost::intrusive::bstree_algorithms::end_node + static node_ptr end_node(const const_node_ptr & header); + + //! @copydoc ::boost::intrusive::bstree_algorithms::swap_tree + static void swap_tree(const node_ptr & header1, const node_ptr & header2); + + //! @copydoc ::boost::intrusive::bstree_algorithms::swap_nodes(const node_ptr&,const node_ptr&) + static void swap_nodes(const node_ptr & node1, const node_ptr & node2); + + //! @copydoc ::boost::intrusive::bstree_algorithms::swap_nodes(const node_ptr&,const node_ptr&,const node_ptr&,const node_ptr&) + static void swap_nodes(const node_ptr & node1, const node_ptr & header1, const node_ptr & node2, const node_ptr & header2); + + //! @copydoc ::boost::intrusive::bstree_algorithms::replace_node(const node_ptr&,const node_ptr&) + static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & new_node); + + //! @copydoc ::boost::intrusive::bstree_algorithms::replace_node(const node_ptr&,const node_ptr&,const node_ptr&) + static void replace_node(const node_ptr & node_to_be_replaced, const node_ptr & header, const node_ptr & new_node); + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::bstree_algorithms::unlink(const node_ptr&) + template + static void unlink(const node_ptr & node, NodePtrPriorityCompare pcomp) + { + node_ptr x = NodeTraits::get_parent(node); + if(x){ + while(!bstree_algo::is_header(x)) + x = NodeTraits::get_parent(x); + erase(x, node, pcomp); + } + } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::bstree_algorithms::unlink_leftmost_without_rebalance + static node_ptr unlink_leftmost_without_rebalance(const node_ptr & header); + + //! @copydoc ::boost::intrusive::bstree_algorithms::unique(const const_node_ptr&) + static bool unique(const const_node_ptr & node); + + //! @copydoc ::boost::intrusive::bstree_algorithms::size(const const_node_ptr&) + static std::size_t size(const const_node_ptr & header); + + //! @copydoc ::boost::intrusive::bstree_algorithms::next_node(const node_ptr&) + static node_ptr next_node(const node_ptr & node); + + //! @copydoc ::boost::intrusive::bstree_algorithms::prev_node(const node_ptr&) + static node_ptr prev_node(const node_ptr & node); + + //! @copydoc ::boost::intrusive::bstree_algorithms::init(const node_ptr&) + static void init(const node_ptr & node); + + //! @copydoc ::boost::intrusive::bstree_algorithms::init_header(const node_ptr&) + static void init_header(const node_ptr & header); + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::bstree_algorithms::erase(const node_ptr&,const node_ptr&) + template + static node_ptr erase(const node_ptr & header, const node_ptr & z, NodePtrPriorityCompare pcomp) + { + rebalance_for_erasure(header, z, pcomp); + bstree_algo::erase(header, z); + return z; + } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::bstree_algorithms::clone(const const_node_ptr&,const node_ptr&,Cloner,Disposer) + template + static void clone + (const const_node_ptr & source_header, const node_ptr & target_header, Cloner cloner, Disposer disposer); + + //! @copydoc ::boost::intrusive::bstree_algorithms::clear_and_dispose(const node_ptr&,Disposer) + template + static void clear_and_dispose(const node_ptr & header, Disposer disposer); + + //! @copydoc ::boost::intrusive::bstree_algorithms::lower_bound(const const_node_ptr&,const KeyType&,KeyNodePtrCompare) + template + static node_ptr lower_bound + (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp); + + //! @copydoc ::boost::intrusive::bstree_algorithms::upper_bound(const const_node_ptr&,const KeyType&,KeyNodePtrCompare) + template + static node_ptr upper_bound + (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp); + + //! @copydoc ::boost::intrusive::bstree_algorithms::find(const const_node_ptr&, const KeyType&,KeyNodePtrCompare) + template + static node_ptr find + (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp); + + //! @copydoc ::boost::intrusive::bstree_algorithms::equal_range(const const_node_ptr&,const KeyType&,KeyNodePtrCompare) + template + static std::pair equal_range + (const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp); + + //! @copydoc ::boost::intrusive::bstree_algorithms::bounded_range(const const_node_ptr&,const KeyType&,const KeyType&,KeyNodePtrCompare,bool,bool) + template + static std::pair bounded_range + (const const_node_ptr & header, const KeyType &lower_key, const KeyType &upper_key, KeyNodePtrCompare comp + , bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::bstree_algorithms::count(const const_node_ptr&,const KeyType&,KeyNodePtrCompare) + template + static std::size_t count(const const_node_ptr & header, const KeyType &key, KeyNodePtrCompare comp); + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! Requires: "h" must be the header node of a tree. + //! NodePtrCompare is a function object that induces a strict weak + //! ordering compatible with the strict weak ordering used to create the + //! the tree. NodePtrCompare compares two node_ptrs. + //! NodePtrPriorityCompare is a priority function object that induces a strict weak + //! ordering compatible with the one used to create the + //! the tree. NodePtrPriorityCompare compares two node_ptrs. + //! + //! Effects: Inserts new_node into the tree before the upper bound + //! according to "comp" and rotates the tree according to "pcomp". + //! + //! Complexity: Average complexity for insert element is at + //! most logarithmic. + //! + //! Throws: If "comp" throw or "pcomp" throw. + template + static node_ptr insert_equal_upper_bound + (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp, NodePtrPriorityCompare pcomp) + { + insert_commit_data commit_data; + bstree_algo::insert_equal_upper_bound_check(h, new_node, comp, commit_data); + rebalance_check_and_commit(h, new_node, pcomp, commit_data); + return new_node; + } + + //! Requires: "h" must be the header node of a tree. + //! NodePtrCompare is a function object that induces a strict weak + //! ordering compatible with the strict weak ordering used to create the + //! the tree. NodePtrCompare compares two node_ptrs. + //! NodePtrPriorityCompare is a priority function object that induces a strict weak + //! ordering compatible with the one used to create the + //! the tree. NodePtrPriorityCompare compares two node_ptrs. + //! + //! Effects: Inserts new_node into the tree before the upper bound + //! according to "comp" and rotates the tree according to "pcomp". + //! + //! Complexity: Average complexity for insert element is at + //! most logarithmic. + //! + //! Throws: If "comp" throws. + template + static node_ptr insert_equal_lower_bound + (const node_ptr & h, const node_ptr & new_node, NodePtrCompare comp, NodePtrPriorityCompare pcomp) + { + insert_commit_data commit_data; + bstree_algo::insert_equal_lower_bound_check(h, new_node, comp, commit_data); + rebalance_check_and_commit(h, new_node, pcomp, commit_data); + return new_node; + } + + //! Requires: "header" must be the header node of a tree. + //! NodePtrCompare is a function object that induces a strict weak + //! ordering compatible with the strict weak ordering used to create the + //! the tree. NodePtrCompare compares two node_ptrs. "hint" is node from + //! the "header"'s tree. + //! NodePtrPriorityCompare is a priority function object that induces a strict weak + //! ordering compatible with the one used to create the + //! the tree. NodePtrPriorityCompare compares two node_ptrs. + //! + //! Effects: Inserts new_node into the tree, using "hint" as a hint to + //! where it will be inserted. If "hint" is the upper_bound + //! the insertion takes constant time (two comparisons in the worst case). + //! Rotates the tree according to "pcomp". + //! + //! Complexity: Logarithmic in general, but it is amortized + //! constant time if new_node is inserted immediately before "hint". + //! + //! Throws: If "comp" throw or "pcomp" throw. + template + static node_ptr insert_equal + (const node_ptr & h, const node_ptr & hint, const node_ptr & new_node, NodePtrCompare comp, NodePtrPriorityCompare pcomp) + { + insert_commit_data commit_data; + bstree_algo::insert_equal_check(h, hint, new_node, comp, commit_data); + rebalance_check_and_commit(h, new_node, pcomp, commit_data); + return new_node; + } + + //! Requires: "header" must be the header node of a tree. + //! "pos" must be a valid node of the tree (including header end) node. + //! "pos" must be a node pointing to the successor to "new_node" + //! once inserted according to the order of already inserted nodes. This function does not + //! check "pos" and this precondition must be guaranteed by the caller. + //! NodePtrPriorityCompare is a priority function object that induces a strict weak + //! ordering compatible with the one used to create the + //! the tree. NodePtrPriorityCompare compares two node_ptrs. + //! + //! Effects: Inserts new_node into the tree before "pos" + //! and rotates the tree according to "pcomp". + //! + //! Complexity: Constant-time. + //! + //! Throws: If "pcomp" throws, strong guarantee. + //! + //! Note: If "pos" is not the successor of the newly inserted "new_node" + //! tree invariants might be broken. + template + static node_ptr insert_before + (const node_ptr & header, const node_ptr & pos, const node_ptr & new_node, NodePtrPriorityCompare pcomp) + { + insert_commit_data commit_data; + bstree_algo::insert_before_check(header, pos, commit_data); + rebalance_check_and_commit(header, new_node, pcomp, commit_data); + return new_node; + } + + //! Requires: "header" must be the header node of a tree. + //! "new_node" must be, according to the used ordering no less than the + //! greatest inserted key. + //! NodePtrPriorityCompare is a priority function object that induces a strict weak + //! ordering compatible with the one used to create the + //! the tree. NodePtrPriorityCompare compares two node_ptrs. + //! + //! Effects: Inserts x into the tree in the last position + //! and rotates the tree according to "pcomp". + //! + //! Complexity: Constant-time. + //! + //! Throws: If "pcomp" throws, strong guarantee. + //! + //! Note: If "new_node" is less than the greatest inserted key + //! tree invariants are broken. This function is slightly faster than + //! using "insert_before". + template + static void push_back(const node_ptr & header, const node_ptr & new_node, NodePtrPriorityCompare pcomp) + { + insert_commit_data commit_data; + bstree_algo::push_back_check(header, commit_data); + rebalance_check_and_commit(header, new_node, pcomp, commit_data); + } + + //! Requires: "header" must be the header node of a tree. + //! "new_node" must be, according to the used ordering, no greater than the + //! lowest inserted key. + //! NodePtrPriorityCompare is a priority function object that induces a strict weak + //! ordering compatible with the one used to create the + //! the tree. NodePtrPriorityCompare compares two node_ptrs. + //! + //! Effects: Inserts x into the tree in the first position + //! and rotates the tree according to "pcomp". + //! + //! Complexity: Constant-time. + //! + //! Throws: If "pcomp" throws, strong guarantee. + //! + //! Note: If "new_node" is greater than the lowest inserted key + //! tree invariants are broken. This function is slightly faster than + //! using "insert_before". + template + static void push_front(const node_ptr & header, const node_ptr & new_node, NodePtrPriorityCompare pcomp) + { + insert_commit_data commit_data; + bstree_algo::push_front_check(header, commit_data); + rebalance_check_and_commit(header, new_node, pcomp, commit_data); + } + + //! Requires: "header" must be the header node of a tree. + //! KeyNodePtrCompare is a function object that induces a strict weak + //! ordering compatible with the strict weak ordering used to create the + //! the tree. NodePtrCompare compares KeyType with a node_ptr. + //! + //! Effects: Checks if there is an equivalent node to "key" in the + //! tree according to "comp" and obtains the needed information to realize + //! a constant-time node insertion if there is no equivalent node. + //! + //! Returns: If there is an equivalent value + //! returns a pair containing a node_ptr to the already present node + //! and false. If there is not equivalent key can be inserted returns true + //! in the returned pair's boolean and fills "commit_data" that is meant to + //! be used with the "insert_commit" function to achieve a constant-time + //! insertion function. + //! + //! Complexity: Average complexity is at most logarithmic. + //! + //! Throws: If "comp" throws. + //! + //! Notes: This function is used to improve performance when constructing + //! a node is expensive and the user does not want to have two equivalent nodes + //! in the tree: if there is an equivalent value + //! the constructed object must be discarded. Many times, the part of the + //! node that is used to impose the order is much cheaper to construct + //! than the node and this function offers the possibility to use that part + //! to check if the insertion will be successful. + //! + //! If the check is successful, the user can construct the node and use + //! "insert_commit" to insert the node in constant-time. This gives a total + //! logarithmic complexity to the insertion: check(O(log(N)) + commit(O(1)). + //! + //! "commit_data" remains valid for a subsequent "insert_unique_commit" only + //! if no more objects are inserted or erased from the set. + template + static std::pair insert_unique_check + (const const_node_ptr & header, const KeyType &key + ,KeyNodePtrCompare comp, KeyNodePtrPrioCompare pcomp + ,insert_commit_data &commit_data) + { + std::pair ret = + bstree_algo::insert_unique_check(header, key, comp, commit_data); + if(ret.second) + rebalance_after_insertion_check(header, commit_data.node, key, pcomp, commit_data.rotations); + return ret; + } + + //! Requires: "header" must be the header node of a tree. + //! KeyNodePtrCompare is a function object that induces a strict weak + //! ordering compatible with the strict weak ordering used to create the + //! the tree. NodePtrCompare compares KeyType with a node_ptr. + //! "hint" is node from the "header"'s tree. + //! + //! Effects: Checks if there is an equivalent node to "key" in the + //! tree according to "comp" using "hint" as a hint to where it should be + //! inserted and obtains the needed information to realize + //! a constant-time node insertion if there is no equivalent node. + //! If "hint" is the upper_bound the function has constant time + //! complexity (two comparisons in the worst case). + //! + //! Returns: If there is an equivalent value + //! returns a pair containing a node_ptr to the already present node + //! and false. If there is not equivalent key can be inserted returns true + //! in the returned pair's boolean and fills "commit_data" that is meant to + //! be used with the "insert_commit" function to achieve a constant-time + //! insertion function. + //! + //! Complexity: Average complexity is at most logarithmic, but it is + //! amortized constant time if new_node should be inserted immediately before "hint". + //! + //! Throws: If "comp" throws. + //! + //! Notes: This function is used to improve performance when constructing + //! a node is expensive and the user does not want to have two equivalent nodes + //! in the tree: if there is an equivalent value + //! the constructed object must be discarded. Many times, the part of the + //! node that is used to impose the order is much cheaper to construct + //! than the node and this function offers the possibility to use that part + //! to check if the insertion will be successful. + //! + //! If the check is successful, the user can construct the node and use + //! "insert_commit" to insert the node in constant-time. This gives a total + //! logarithmic complexity to the insertion: check(O(log(N)) + commit(O(1)). + //! + //! "commit_data" remains valid for a subsequent "insert_unique_commit" only + //! if no more objects are inserted or erased from the set. + template + static std::pair insert_unique_check + (const const_node_ptr & header, const node_ptr & hint, const KeyType &key + ,KeyNodePtrCompare comp, KeyNodePtrPrioCompare pcomp, insert_commit_data &commit_data) + { + std::pair ret = + bstree_algo::insert_unique_check(header, hint, key, comp, commit_data); + if(ret.second) + rebalance_after_insertion_check(header, commit_data.node, key, pcomp, commit_data.rotations); + return ret; + } + + //! Requires: "header" must be the header node of a tree. + //! "commit_data" must have been obtained from a previous call to + //! "insert_unique_check". No objects should have been inserted or erased + //! from the set between the "insert_unique_check" that filled "commit_data" + //! and the call to "insert_commit". + //! + //! + //! Effects: Inserts new_node in the set using the information obtained + //! from the "commit_data" that a previous "insert_check" filled. + //! + //! Complexity: Constant time. + //! + //! Throws: Nothing. + //! + //! Notes: This function has only sense if a "insert_unique_check" has been + //! previously executed to fill "commit_data". No value should be inserted or + //! erased between the "insert_check" and "insert_commit" calls. + static void insert_unique_commit + (const node_ptr & header, const node_ptr & new_node, const insert_commit_data &commit_data) + { + bstree_algo::insert_unique_commit(header, new_node, commit_data); + rotate_up_n(header, new_node, commit_data.rotations); + } + + //! @copydoc ::boost::intrusive::bstree_algorithms::transfer_unique + template + static bool transfer_unique + (const node_ptr & header1, NodePtrCompare comp, KeyNodePtrPrioCompare pcomp, const node_ptr &header2, const node_ptr & z) + { + insert_commit_data commit_data; + bool const transferable = insert_unique_check(header1, z, comp, pcomp, commit_data).second; + if(transferable){ + erase(header2, z, pcomp); + insert_unique_commit(header1, z, commit_data); + } + return transferable; + } + + //! @copydoc ::boost::intrusive::bstree_algorithms::transfer_equal + template + static void transfer_equal + (const node_ptr & header1, NodePtrCompare comp, KeyNodePtrPrioCompare pcomp, const node_ptr &header2, const node_ptr & z) + { + insert_commit_data commit_data; + bstree_algo::insert_equal_upper_bound_check(header1, z, comp, commit_data); + rebalance_after_insertion_check(header1, commit_data.node, z, pcomp, commit_data.rotations); + rebalance_for_erasure(header2, z, pcomp); + bstree_algo::erase(header2, z); + bstree_algo::insert_unique_commit(header1, z, commit_data); + rotate_up_n(header1, z, commit_data.rotations); + } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::bstree_algorithms::is_header + static bool is_header(const const_node_ptr & p); + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + /// @cond + private: + + template + static void rebalance_for_erasure(const node_ptr & header, const node_ptr & z, NodePtrPriorityCompare pcomp) + { + std::size_t n = 0; + rerotate_on_destroy rb(header, z, n); + + node_ptr z_left = NodeTraits::get_left(z); + node_ptr z_right = NodeTraits::get_right(z); + while(z_left || z_right){ + const node_ptr z_parent(NodeTraits::get_parent(z)); + if(!z_right || (z_left && pcomp(z_left, z_right))){ + bstree_algo::rotate_right(z, z_left, z_parent, header); + } + else{ + bstree_algo::rotate_left(z, z_right, z_parent, header); + } + ++n; + z_left = NodeTraits::get_left(z); + z_right = NodeTraits::get_right(z); + } + rb.release(); + } + + template + static void rebalance_check_and_commit + (const node_ptr & h, const node_ptr & new_node, NodePtrPriorityCompare pcomp, insert_commit_data &commit_data) + { + rebalance_after_insertion_check(h, commit_data.node, new_node, pcomp, commit_data.rotations); + //No-throw + bstree_algo::insert_unique_commit(h, new_node, commit_data); + rotate_up_n(h, new_node, commit_data.rotations); + } + + template + static void rebalance_after_insertion_check + (const const_node_ptr &header, const const_node_ptr & up, const Key &k + , KeyNodePriorityCompare pcomp, std::size_t &num_rotations) + { + const_node_ptr upnode(up); + //First check rotations since pcomp can throw + num_rotations = 0; + std::size_t n = 0; + while(upnode != header && pcomp(k, upnode)){ + ++n; + upnode = NodeTraits::get_parent(upnode); + } + num_rotations = n; + } + + template + static bool check_invariant(const const_node_ptr & header, NodePtrPriorityCompare pcomp) + { + node_ptr beg = begin_node(header); + node_ptr end = end_node(header); + + while(beg != end){ + node_ptr p = NodeTraits::get_parent(beg); + if(p != header){ + if(pcomp(beg, p)) + return false; + } + beg = next_node(beg); + } + return true; + } + + /// @endcond +}; + +/// @cond + +template +struct get_algo +{ + typedef treap_algorithms type; +}; + +template +struct get_node_checker +{ + typedef detail::bstree_node_checker type; +}; + +/// @endcond + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_TREAP_ALGORITHMS_HPP diff --git a/boost/intrusive/treap_set.hpp b/boost/intrusive/treap_set.hpp new file mode 100644 index 000000000..bf162badf --- /dev/null +++ b/boost/intrusive/treap_set.hpp @@ -0,0 +1,1106 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2007-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// +#ifndef BOOST_INTRUSIVE_TREAP_SET_HPP +#define BOOST_INTRUSIVE_TREAP_SET_HPP + +#include +#include +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +#if !defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +class treap_multiset_impl; +#endif + +//! The class template treap_set is an intrusive container, that mimics most of +//! the interface of std::set as described in the C++ standard. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<>, +//! \c compare<> and \c priority_compare<> +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class treap_set_impl +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + : public treap_impl +#endif +{ + /// @cond + public: + typedef treap_impl tree_type; + BOOST_MOVABLE_BUT_NOT_COPYABLE(treap_set_impl) + + typedef tree_type implementation_defined; + /// @endcond + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::value_compare value_compare; + typedef typename implementation_defined::key_compare key_compare; + typedef typename implementation_defined::priority_compare priority_compare; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::reverse_iterator reverse_iterator; + typedef typename implementation_defined::const_reverse_iterator const_reverse_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + static const bool constant_time_size = implementation_defined::constant_time_size; + + public: + //! @copydoc ::boost::intrusive::treap::treap() + treap_set_impl() + : tree_type() + {} + + //! @copydoc ::boost::intrusive::treap::treap(const key_compare &,const priority_compare &,const value_traits &) + explicit treap_set_impl( const key_compare &cmp + , const priority_compare &pcmp = priority_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(cmp, pcmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::treap::treap(bool,Iterator,Iterator,const key_compare &,const priority_compare &,const value_traits &) + template + treap_set_impl( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const priority_compare &pcmp = priority_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(true, b, e, cmp, pcmp, v_traits) + {} + + //! Effects: to-do + //! + treap_set_impl(BOOST_RV_REF(treap_set_impl) x) + : tree_type(BOOST_MOVE_BASE(tree_type, x)) + {} + + //! Effects: to-do + //! + treap_set_impl& operator=(BOOST_RV_REF(treap_set_impl) x) + { return static_cast(tree_type::operator=(BOOST_MOVE_BASE(tree_type, x))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::treap::~treap() + ~treap_set_impl(); + + //! @copydoc ::boost::intrusive::treap::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::treap::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::treap::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::treap::end() + iterator end(); + + //! @copydoc ::boost::intrusive::treap::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::treap::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::treap::rbegin() + reverse_iterator rbegin(); + + //! @copydoc ::boost::intrusive::treap::rbegin()const + const_reverse_iterator rbegin() const; + + //! @copydoc ::boost::intrusive::treap::crbegin()const + const_reverse_iterator crbegin() const; + + //! @copydoc ::boost::intrusive::treap::rend() + reverse_iterator rend(); + + //! @copydoc ::boost::intrusive::treap::rend()const + const_reverse_iterator rend() const; + + //! @copydoc ::boost::intrusive::treap::crend()const + const_reverse_iterator crend() const; + + //! @copydoc ::boost::intrusive::treap::root() + iterator root(); + + //! @copydoc ::boost::intrusive::treap::root()const + const_iterator root() const; + + //! @copydoc ::boost::intrusive::treap::croot()const + const_iterator croot() const; + + //! @copydoc ::boost::intrusive::treap::container_from_end_iterator(iterator) + static treap_set_impl &container_from_end_iterator(iterator end_iterator); + + //! @copydoc ::boost::intrusive::treap::container_from_end_iterator(const_iterator) + static const treap_set_impl &container_from_end_iterator(const_iterator end_iterator); + + //! @copydoc ::boost::intrusive::treap::container_from_iterator(iterator) + static treap_set_impl &container_from_iterator(iterator it); + + //! @copydoc ::boost::intrusive::treap::container_from_iterator(const_iterator) + static const treap_set_impl &container_from_iterator(const_iterator it); + + //! @copydoc ::boost::intrusive::treap::key_comp()const + key_compare key_comp() const; + + //! @copydoc ::boost::intrusive::treap::value_comp()const + value_compare value_comp() const; + + //! @copydoc ::boost::intrusive::treap::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::treap::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::treap::swap + void swap(treap_set_impl& other); + + //! @copydoc ::boost::intrusive::treap::clone_from(const treap&,Cloner,Disposer) + template + void clone_from(const treap_set_impl &src, Cloner cloner, Disposer disposer); + + #else + + using tree_type::clone_from; + + #endif + + //! @copydoc ::boost::intrusive::treap::clone_from(treap&&,Cloner,Disposer) + template + void clone_from(BOOST_RV_REF(treap_set_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } + + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + + //! @copydoc ::boost::intrusive::treap::top() + iterator top(); + + //! @copydoc ::boost::intrusive::treap::top()const + const_iterator top() const; + + //! @copydoc ::boost::intrusive::treap::ctop()const + const_iterator ctop() const; + + //! @copydoc ::boost::intrusive::treap::rtop() + reverse_iterator rtop(); + + //! @copydoc ::boost::intrusive::treap::rtop()const + const_reverse_iterator rtop() const; + + //! @copydoc ::boost::intrusive::treap::crtop()const + const_reverse_iterator crtop() const; + + //! @copydoc ::boost::intrusive::treap::crtop() const + priority_compare priority_comp() const; + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::treap::insert_unique(reference) + std::pair insert(reference value) + { return tree_type::insert_unique(value); } + + //! @copydoc ::boost::intrusive::treap::insert_unique(const_iterator,reference) + iterator insert(const_iterator hint, reference value) + { return tree_type::insert_unique(hint, value); } + + //! @copydoc ::boost::intrusive::treap::insert_unique_check(const key_type&,insert_commit_data&) + std::pair insert_check( const key_type &key, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(key, commit_data); } + + //! @copydoc ::boost::intrusive::treap::insert_unique_check(const_iterator,const key_type&,insert_commit_data&) + std::pair insert_check + ( const_iterator hint, const key_type &key, insert_commit_data &commit_data) + { return tree_type::insert_unique_check(hint, key, commit_data); } + + //! @copydoc ::boost::intrusive::treap::insert_unique_check(const KeyType&,KeyTypeKeyCompare,KeyValuePrioCompare,insert_commit_data&) + template + std::pair insert_check + ( const KeyType &key, KeyTypeKeyCompare comp, KeyValuePrioCompare key_value_pcomp + , insert_commit_data &commit_data) + { return tree_type::insert_unique_check(key, comp, key_value_pcomp, commit_data); } + + //! @copydoc ::boost::intrusive::treap::insert_unique_check(const_iterator,const KeyType&,KeyTypeKeyCompare,KeyValuePrioCompare,insert_commit_data&) + template + std::pair insert_check + ( const_iterator hint, const KeyType &key + , KeyTypeKeyCompare comp, KeyValuePrioCompare key_value_pcomp + , insert_commit_data &commit_data) + { return tree_type::insert_unique_check(hint, key, comp, key_value_pcomp, commit_data); } + + //! @copydoc ::boost::intrusive::treap::insert_unique(Iterator,Iterator) + template + void insert(Iterator b, Iterator e) + { tree_type::insert_unique(b, e); } + + //! @copydoc ::boost::intrusive::treap::insert_unique_commit + iterator insert_commit(reference value, const insert_commit_data &commit_data) + { return tree_type::insert_unique_commit(value, commit_data); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::treap::insert_before + iterator insert_before(const_iterator pos, reference value); + + //! @copydoc ::boost::intrusive::treap::push_back + void push_back(reference value); + + //! @copydoc ::boost::intrusive::treap::push_front + void push_front(reference value); + + //! @copydoc ::boost::intrusive::treap::erase(const_iterator) + iterator erase(const_iterator i); + + //! @copydoc ::boost::intrusive::treap::erase(const_iterator,const_iterator) + iterator erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::treap::erase(const key_type &) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::treap::erase(const KeyType&,KeyTypeKeyCompare) + template + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::treap::erase_and_dispose(const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::treap::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::treap::erase_and_dispose(const key_type &, Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::treap::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); + + //! @copydoc ::boost::intrusive::treap::clear + void clear(); + + //! @copydoc ::boost::intrusive::treap::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::treap::count(const key_type &)const + size_type count(const key_type &key) const + { return static_cast(this->tree_type::find(key) != this->tree_type::cend()); } + + //! @copydoc ::boost::intrusive::treap::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const + { return static_cast(this->tree_type::find(key, comp) != this->tree_type::cend()); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::treap::lower_bound(const key_type &) + iterator lower_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::treap::lower_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::treap::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::treap::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::treap::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::treap::upper_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::treap::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::treap::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::treap::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::treap::find(const KeyType&,KeyTypeKeyCompare) + template + iterator find(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::treap::find(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::treap::find(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::treap::equal_range(const key_type &) + std::pair equal_range(const key_type &key) + { return this->tree_type::lower_bound_range(key); } + + //! @copydoc ::boost::intrusive::treap::equal_range(const KeyType&,KeyTypeKeyCompare) + template + std::pair equal_range(const KeyType& key, KeyTypeKeyCompare comp) + { return this->tree_type::equal_range(key, comp); } + + //! @copydoc ::boost::intrusive::treap::equal_range(const key_type &)const + std::pair + equal_range(const key_type &key) const + { return this->tree_type::lower_bound_range(key); } + + //! @copydoc ::boost::intrusive::treap::equal_range(const KeyType&,KeyTypeKeyCompare)const + template + std::pair + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const + { return this->tree_type::equal_range(key, comp); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::treap::bounded_range(const key_type &,const key_type &,bool,bool) + std::pair bounded_range + (const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::treap::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::treap::bounded_range(const key_type &,const key_type &,bool,bool)const + std::pair + bounded_range(const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::treap::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::treap::s_iterator_to(reference) + static iterator s_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::treap::s_iterator_to(const_reference) + static const_iterator s_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::treap::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::treap::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::treap::init_node(reference) + static void init_node(reference value); + + //! @copydoc ::boost::intrusive::treap::unlink_leftmost_without_rebalance + pointer unlink_leftmost_without_rebalance(); + + //! @copydoc ::boost::intrusive::treap::replace_node + void replace_node(iterator replace_this, reference with_this); + + //! @copydoc ::boost::intrusive::treap::remove_node + void remove_node(reference value); + + + //! @copydoc ::boost::intrusive::treap::merge_unique + template + void merge(treap_set &source); + + //! @copydoc ::boost::intrusive::treap::merge_unique + template + void merge(treap_multiset &source); + + #else + + template + void merge(treap_set_impl &source) + { return tree_type::merge_unique(source); } + + template + void merge(treap_multiset_impl &source) + { return tree_type::merge_unique(source); } + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED +}; + + +//! Helper metafunction to define a \c treap_set that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_treap_set +{ + typedef typename pack_options + < treap_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef treap_set_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::compare + , typename packed_options::priority + , typename packed_options::size_type + , packed_options::constant_time_size + , typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class treap_set + : public make_treap_set::type +{ + typedef typename make_treap_set + ::type Base; + BOOST_MOVABLE_BUT_NOT_COPYABLE(treap_set) + + public: + typedef typename Base::key_compare key_compare; + typedef typename Base::priority_compare priority_compare; + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + + treap_set() + : Base() + {} + + explicit treap_set( const key_compare &cmp + , const priority_compare &pcmp = priority_compare() + , const value_traits &v_traits = value_traits()) + : Base(cmp, pcmp, v_traits) + {} + + template + treap_set( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const priority_compare &pcmp = priority_compare() + , const value_traits &v_traits = value_traits()) + : Base(b, e, cmp, pcmp, v_traits) + {} + + treap_set(BOOST_RV_REF(treap_set) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + treap_set& operator=(BOOST_RV_REF(treap_set) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + void clone_from(const treap_set &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(treap_set) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static treap_set &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const treap_set &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static treap_set &container_from_iterator(iterator it) + { return static_cast(Base::container_from_iterator(it)); } + + static const treap_set &container_from_iterator(const_iterator it) + { return static_cast(Base::container_from_iterator(it)); } +}; + +#endif + +//! The class template treap_multiset is an intrusive container, that mimics most of +//! the interface of std::treap_multiset as described in the C++ standard. +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<>, +//! \c compare<> and \c priority_compare<> +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class treap_multiset_impl +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + : public treap_impl +#endif +{ + /// @cond + typedef treap_impl tree_type; + BOOST_MOVABLE_BUT_NOT_COPYABLE(treap_multiset_impl) + + typedef tree_type implementation_defined; + /// @endcond + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::value_compare value_compare; + typedef typename implementation_defined::key_compare key_compare; + typedef typename implementation_defined::priority_compare priority_compare; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::reverse_iterator reverse_iterator; + typedef typename implementation_defined::const_reverse_iterator const_reverse_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + static const bool constant_time_size = implementation_defined::constant_time_size; + + public: + + //! @copydoc ::boost::intrusive::treap::treap() + treap_multiset_impl() + : tree_type() + {} + + //! @copydoc ::boost::intrusive::treap::treap(const key_compare &,const priority_compare &,const value_traits &) + explicit treap_multiset_impl( const key_compare &cmp + , const priority_compare &pcmp = priority_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(cmp, pcmp, v_traits) + {} + + //! @copydoc ::boost::intrusive::treap::treap(bool,Iterator,Iterator,const key_compare &,const priority_compare &,const value_traits &) + template + treap_multiset_impl( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const priority_compare &pcmp = priority_compare() + , const value_traits &v_traits = value_traits()) + : tree_type(false, b, e, cmp, pcmp, v_traits) + {} + + //! Effects: to-do + //! + treap_multiset_impl(BOOST_RV_REF(treap_multiset_impl) x) + : tree_type(BOOST_MOVE_BASE(tree_type, x)) + {} + + //! Effects: to-do + //! + treap_multiset_impl& operator=(BOOST_RV_REF(treap_multiset_impl) x) + { return static_cast(tree_type::operator=(BOOST_MOVE_BASE(tree_type, x))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::treap::~treap() + ~treap_multiset_impl(); + + //! @copydoc ::boost::intrusive::treap::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::treap::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::treap::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::treap::end() + iterator end(); + + //! @copydoc ::boost::intrusive::treap::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::treap::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::treap::rbegin() + reverse_iterator rbegin(); + + //! @copydoc ::boost::intrusive::treap::rbegin()const + const_reverse_iterator rbegin() const; + + //! @copydoc ::boost::intrusive::treap::crbegin()const + const_reverse_iterator crbegin() const; + + //! @copydoc ::boost::intrusive::treap::rend() + reverse_iterator rend(); + + //! @copydoc ::boost::intrusive::treap::rend()const + const_reverse_iterator rend() const; + + //! @copydoc ::boost::intrusive::treap::crend()const + const_reverse_iterator crend() const; + + //! @copydoc ::boost::intrusive::treap::root() + iterator root(); + + //! @copydoc ::boost::intrusive::treap::root()const + const_iterator root() const; + + //! @copydoc ::boost::intrusive::treap::croot()const + const_iterator croot() const; + + //! @copydoc ::boost::intrusive::treap::container_from_end_iterator(iterator) + static treap_multiset_impl &container_from_end_iterator(iterator end_iterator); + + //! @copydoc ::boost::intrusive::treap::container_from_end_iterator(const_iterator) + static const treap_multiset_impl &container_from_end_iterator(const_iterator end_iterator); + + //! @copydoc ::boost::intrusive::treap::container_from_iterator(iterator) + static treap_multiset_impl &container_from_iterator(iterator it); + + //! @copydoc ::boost::intrusive::treap::container_from_iterator(const_iterator) + static const treap_multiset_impl &container_from_iterator(const_iterator it); + + //! @copydoc ::boost::intrusive::treap::key_comp()const + key_compare key_comp() const; + + //! @copydoc ::boost::intrusive::treap::value_comp()const + value_compare value_comp() const; + + //! @copydoc ::boost::intrusive::treap::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::treap::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::treap::swap + void swap(treap_multiset_impl& other); + + //! @copydoc ::boost::intrusive::treap::clone_from(const treap&,Cloner,Disposer) + template + void clone_from(const treap_multiset_impl &src, Cloner cloner, Disposer disposer); + + #else + + using tree_type::clone_from; + + #endif + + //! @copydoc ::boost::intrusive::treap::clone_from(treap&&,Cloner,Disposer) + template + void clone_from(BOOST_RV_REF(treap_multiset_impl) src, Cloner cloner, Disposer disposer) + { tree_type::clone_from(BOOST_MOVE_BASE(tree_type, src), cloner, disposer); } + + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + + //! @copydoc ::boost::intrusive::treap::top() + iterator top(); + + //! @copydoc ::boost::intrusive::treap::top()const + const_iterator top() const; + + //! @copydoc ::boost::intrusive::treap::ctop()const + const_iterator ctop() const; + + //! @copydoc ::boost::intrusive::treap::rtop() + reverse_iterator rtop(); + + //! @copydoc ::boost::intrusive::treap::rtop()const + const_reverse_iterator rtop() const; + + //! @copydoc ::boost::intrusive::treap::crtop()const + const_reverse_iterator crtop() const; + + //! @copydoc ::boost::intrusive::treap::crtop() const + priority_compare priority_comp() const; + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::treap::insert_equal(reference) + iterator insert(reference value) + { return tree_type::insert_equal(value); } + + //! @copydoc ::boost::intrusive::treap::insert_equal(const_iterator,reference) + iterator insert(const_iterator hint, reference value) + { return tree_type::insert_equal(hint, value); } + + //! @copydoc ::boost::intrusive::treap::insert_equal(Iterator,Iterator) + template + void insert(Iterator b, Iterator e) + { tree_type::insert_equal(b, e); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::treap::insert_before + iterator insert_before(const_iterator pos, reference value); + + //! @copydoc ::boost::intrusive::treap::push_back + void push_back(reference value); + + //! @copydoc ::boost::intrusive::treap::push_front + void push_front(reference value); + + //! @copydoc ::boost::intrusive::treap::erase(const_iterator) + iterator erase(const_iterator i); + + //! @copydoc ::boost::intrusive::treap::erase(const_iterator,const_iterator) + iterator erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::treap::erase(const key_type &) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::treap::erase(const KeyType&,KeyTypeKeyCompare) + template + size_type erase(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::treap::erase_and_dispose(const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::treap::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + iterator erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::treap::erase_and_dispose(const key_type &, Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::treap::erase_and_dispose(const KeyType&,KeyTypeKeyCompare,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyTypeKeyCompare comp, Disposer disposer); + + //! @copydoc ::boost::intrusive::treap::clear + void clear(); + + //! @copydoc ::boost::intrusive::treap::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + //! @copydoc ::boost::intrusive::treap::count(const key_type &)const + size_type count(const key_type &key) const; + + //! @copydoc ::boost::intrusive::treap::count(const KeyType&,KeyTypeKeyCompare)const + template + size_type count(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::treap::lower_bound(const key_type &) + iterator lower_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::treap::lower_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::treap::lower_bound(const key_type &)const + const_iterator lower_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::treap::lower_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator lower_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::treap::upper_bound(const key_type &) + iterator upper_bound(const key_type &key); + + //! @copydoc ::boost::intrusive::treap::upper_bound(const KeyType&,KeyTypeKeyCompare) + template + iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::treap::upper_bound(const key_type &)const + const_iterator upper_bound(const key_type &key) const; + + //! @copydoc ::boost::intrusive::treap::upper_bound(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator upper_bound(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::treap::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::treap::find(const KeyType&,KeyTypeKeyCompare) + template + iterator find(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::treap::find(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::treap::find(const KeyType&,KeyTypeKeyCompare)const + template + const_iterator find(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::treap::equal_range(const key_type &) + std::pair equal_range(const key_type &key); + + //! @copydoc ::boost::intrusive::treap::equal_range(const KeyType&,KeyTypeKeyCompare) + template + std::pair equal_range(const KeyType& key, KeyTypeKeyCompare comp); + + //! @copydoc ::boost::intrusive::treap::equal_range(const key_type &)const + std::pair + equal_range(const key_type &key) const; + + //! @copydoc ::boost::intrusive::treap::equal_range(const KeyType&,KeyTypeKeyCompare)const + template + std::pair + equal_range(const KeyType& key, KeyTypeKeyCompare comp) const; + + //! @copydoc ::boost::intrusive::treap::bounded_range(const key_type &,const key_type &,bool,bool) + std::pair bounded_range + (const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::treap::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool) + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed); + + //! @copydoc ::boost::intrusive::treap::bounded_range(const key_type &,const key_type &,bool,bool)const + std::pair + bounded_range(const key_type &lower_key, const key_type &upper_key, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::treap::bounded_range(const KeyType&,const KeyType&,KeyTypeKeyCompare,bool,bool)const + template + std::pair bounded_range + (const KeyType& lower_key, const KeyType& upper_key, KeyTypeKeyCompare comp, bool left_closed, bool right_closed) const; + + //! @copydoc ::boost::intrusive::treap::s_iterator_to(reference) + static iterator s_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::treap::s_iterator_to(const_reference) + static const_iterator s_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::treap::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::treap::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::treap::init_node(reference) + static void init_node(reference value); + + //! @copydoc ::boost::intrusive::treap::unlink_leftmost_without_rebalance + pointer unlink_leftmost_without_rebalance(); + + //! @copydoc ::boost::intrusive::treap::replace_node + void replace_node(iterator replace_this, reference with_this); + + //! @copydoc ::boost::intrusive::treap::remove_node + void remove_node(reference value); + + //! @copydoc ::boost::intrusive::treap::merge_unique + template + void merge(treap_multiset &source); + + //! @copydoc ::boost::intrusive::treap::merge_unique + template + void merge(treap_set &source); + + #else + + template + void merge(treap_multiset_impl &source) + { return tree_type::merge_equal(source); } + + template + void merge(treap_set_impl &source) + { return tree_type::merge_equal(source); } + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED +}; + + +//! Helper metafunction to define a \c treap_multiset that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_treap_multiset +{ + typedef typename pack_options + < treap_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef treap_multiset_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::compare + , typename packed_options::priority + , typename packed_options::size_type + , packed_options::constant_time_size + , typename packed_options::header_holder_type + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class treap_multiset + : public make_treap_multiset::type +{ + typedef typename make_treap_multiset + ::type Base; + BOOST_MOVABLE_BUT_NOT_COPYABLE(treap_multiset) + + public: + typedef typename Base::key_compare key_compare; + typedef typename Base::priority_compare priority_compare; + typedef typename Base::value_traits value_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + + treap_multiset() + : Base() + {} + + explicit treap_multiset( const key_compare &cmp + , const priority_compare &pcmp = priority_compare() + , const value_traits &v_traits = value_traits()) + : Base(cmp, pcmp, v_traits) + {} + + template + treap_multiset( Iterator b, Iterator e + , const key_compare &cmp = key_compare() + , const priority_compare &pcmp = priority_compare() + , const value_traits &v_traits = value_traits()) + : Base(b, e, cmp, pcmp, v_traits) + {} + + treap_multiset(BOOST_RV_REF(treap_multiset) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + treap_multiset& operator=(BOOST_RV_REF(treap_multiset) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + void clone_from(const treap_multiset &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + void clone_from(BOOST_RV_REF(treap_multiset) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } + + static treap_multiset &container_from_end_iterator(iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static const treap_multiset &container_from_end_iterator(const_iterator end_iterator) + { return static_cast(Base::container_from_end_iterator(end_iterator)); } + + static treap_multiset &container_from_iterator(iterator it) + { return static_cast(Base::container_from_iterator(it)); } + + static const treap_multiset &container_from_iterator(const_iterator it) + { return static_cast(Base::container_from_iterator(it)); } +}; + +#endif + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_TREAP_SET_HPP diff --git a/boost/intrusive/trivial_value_traits.hpp b/boost/intrusive/trivial_value_traits.hpp new file mode 100644 index 000000000..84fac665d --- /dev/null +++ b/boost/intrusive/trivial_value_traits.hpp @@ -0,0 +1,59 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_TRIVIAL_VALUE_TRAITS_HPP +#define BOOST_INTRUSIVE_TRIVIAL_VALUE_TRAITS_HPP + +#include +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +//!This value traits template is used to create value traits +//!from user defined node traits where value_traits::value_type and +//!node_traits::node should be equal +template +struct trivial_value_traits +{ + typedef NodeTraits node_traits; + typedef typename node_traits::node_ptr node_ptr; + typedef typename node_traits::const_node_ptr const_node_ptr; + typedef typename node_traits::node value_type; + typedef node_ptr pointer; + typedef const_node_ptr const_pointer; + static const link_mode_type link_mode = LinkMode; + BOOST_INTRUSIVE_FORCEINLINE static node_ptr to_node_ptr (value_type &value) + { return pointer_traits::pointer_to(value); } + BOOST_INTRUSIVE_FORCEINLINE static const_node_ptr to_node_ptr (const value_type &value) + { return pointer_traits::pointer_to(value); } + BOOST_INTRUSIVE_FORCEINLINE static const pointer & to_value_ptr(const node_ptr &n) { return n; } + BOOST_INTRUSIVE_FORCEINLINE static const const_pointer &to_value_ptr(const const_node_ptr &n) { return n; } +}; + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_TRIVIAL_VALUE_TRAITS_HPP diff --git a/boost/intrusive/unordered_set.hpp b/boost/intrusive/unordered_set.hpp new file mode 100644 index 000000000..cf60dc4f7 --- /dev/null +++ b/boost/intrusive/unordered_set.hpp @@ -0,0 +1,990 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Olaf Krzikalla 2004-2006. +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// +#ifndef BOOST_INTRUSIVE_UNORDERED_SET_HPP +#define BOOST_INTRUSIVE_UNORDERED_SET_HPP + +#include +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +//! The class template unordered_set is an intrusive container, that mimics most of +//! the interface of std::tr1::unordered_set as described in the C++ TR1. +//! +//! unordered_set is a semi-intrusive container: each object to be stored in the +//! container must contain a proper hook, but the container also needs +//! additional auxiliary memory to work: unordered_set needs a pointer to an array +//! of type `bucket_type` to be passed in the constructor. This bucket array must +//! have at least the same lifetime as the container. This makes the use of +//! unordered_set more complicated than purely intrusive containers. +//! `bucket_type` is default-constructible, copyable and assignable +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<>, \c hash<> and \c equal<> +//! \c bucket_traits<>, \c power_2_buckets<> and \c cache_begin<>. +//! +//! unordered_set only provides forward iterators but it provides 4 iterator types: +//! iterator and const_iterator to navigate through the whole container and +//! local_iterator and const_local_iterator to navigate through the values +//! stored in a single bucket. Local iterators are faster and smaller. +//! +//! It's not recommended to use non constant-time size unordered_sets because several +//! key functions, like "empty()", become non-constant time functions. Non +//! constant-time size unordered_sets are mainly provided to support auto-unlink hooks. +//! +//! unordered_set, unlike std::unordered_set, does not make automatic rehashings nor +//! offers functions related to a load factor. Rehashing can be explicitly requested +//! and the user must provide a new bucket array that will be used from that moment. +//! +//! Since no automatic rehashing is done, iterators are never invalidated when +//! inserting or erasing elements. Iterators are only invalidated when rehasing. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class unordered_set_impl + : public hashtable_impl +{ + /// @cond + private: + typedef hashtable_impl table_type; + + template + static std::pair priv_equal_range(MaybeConstThis &c, const KeyType& key, KeyHasher hash_func, KeyEqual equal_func) + { + Iterator const it = c.find(key, hash_func, equal_func); + std::pair ret(it, it); + if(it != c.end()) + ++ret.second; + return ret; + } + + //! This class is + //! movable + BOOST_MOVABLE_BUT_NOT_COPYABLE(unordered_set_impl) + + typedef table_type implementation_defined; + /// @endcond + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::key_of_value key_of_value; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::bucket_traits bucket_traits; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::key_equal key_equal; + typedef typename implementation_defined::hasher hasher; + typedef typename implementation_defined::bucket_type bucket_type; + typedef typename implementation_defined::bucket_ptr bucket_ptr; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::local_iterator local_iterator; + typedef typename implementation_defined::const_local_iterator const_local_iterator; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + public: + + //! @copydoc ::boost::intrusive::hashtable::hashtable(const bucket_traits &,const hasher &,const key_equal &,const value_traits &) + BOOST_INTRUSIVE_FORCEINLINE explicit unordered_set_impl( const bucket_traits &b_traits + , const hasher & hash_func = hasher() + , const key_equal &equal_func = key_equal() + , const value_traits &v_traits = value_traits()) + : table_type(b_traits, hash_func, equal_func, v_traits) + {} + + //! @copydoc ::boost::intrusive::hashtable::hashtable(bool,Iterator,Iterator,const bucket_traits &,const hasher &,const key_equal &,const value_traits &) + template + BOOST_INTRUSIVE_FORCEINLINE unordered_set_impl( Iterator b + , Iterator e + , const bucket_traits &b_traits + , const hasher & hash_func = hasher() + , const key_equal &equal_func = key_equal() + , const value_traits &v_traits = value_traits()) + : table_type(true, b, e, b_traits, hash_func, equal_func, v_traits) + {} + + //! @copydoc ::boost::intrusive::hashtable::hashtable(hashtable&&) + BOOST_INTRUSIVE_FORCEINLINE unordered_set_impl(BOOST_RV_REF(unordered_set_impl) x) + : table_type(BOOST_MOVE_BASE(table_type, x)) + {} + + //! @copydoc ::boost::intrusive::hashtable::operator=(hashtable&&) + BOOST_INTRUSIVE_FORCEINLINE unordered_set_impl& operator=(BOOST_RV_REF(unordered_set_impl) x) + { return static_cast(table_type::operator=(BOOST_MOVE_BASE(table_type, x))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + //! @copydoc ::boost::intrusive::hashtable::~hashtable() + ~unordered_set_impl(); + + //! @copydoc ::boost::intrusive::hashtable::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::hashtable::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::hashtable::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::hashtable::end() + iterator end(); + + //! @copydoc ::boost::intrusive::hashtable::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::hashtable::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::hashtable::hash_function()const + hasher hash_function() const; + + //! @copydoc ::boost::intrusive::hashtable::key_eq()const + key_equal key_eq() const; + + //! @copydoc ::boost::intrusive::hashtable::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::hashtable::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::hashtable::hashtable + void swap(unordered_set_impl& other); + + //! @copydoc ::boost::intrusive::hashtable::clone_from(const hashtable&,Cloner,Disposer) + template + void clone_from(const unordered_set_impl &src, Cloner cloner, Disposer disposer); + + #else + + using table_type::clone_from; + + #endif //#ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::hashtable::clone_from(hashtable&&,Cloner,Disposer) + template + BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(unordered_set_impl) src, Cloner cloner, Disposer disposer) + { table_type::clone_from(BOOST_MOVE_BASE(table_type, src), cloner, disposer); } + + //! @copydoc ::boost::intrusive::hashtable::insert_unique(reference) + BOOST_INTRUSIVE_FORCEINLINE std::pair insert(reference value) + { return table_type::insert_unique(value); } + + //! @copydoc ::boost::intrusive::hashtable::insert_unique(Iterator,Iterator) + template + BOOST_INTRUSIVE_FORCEINLINE void insert(Iterator b, Iterator e) + { table_type::insert_unique(b, e); } + + //! @copydoc ::boost::intrusive::hashtable::insert_unique_check(const key_type&,insert_commit_data&) + BOOST_INTRUSIVE_FORCEINLINE std::pair insert_check(const key_type &key, insert_commit_data &commit_data) + { return table_type::insert_unique_check(key, commit_data); } + + //! @copydoc ::boost::intrusive::hashtable::insert_unique_check(const KeyType&,KeyHasher,KeyEqual,insert_commit_data&) + template + BOOST_INTRUSIVE_FORCEINLINE std::pair insert_check + (const KeyType &key, KeyHasher hasher, KeyEqual key_value_equal, insert_commit_data &commit_data) + { return table_type::insert_unique_check(key, hasher, key_value_equal, commit_data); } + + //! @copydoc ::boost::intrusive::hashtable::insert_unique_commit + BOOST_INTRUSIVE_FORCEINLINE iterator insert_commit(reference value, const insert_commit_data &commit_data) + { return table_type::insert_unique_commit(value, commit_data); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::hashtable::erase(const_iterator) + void erase(const_iterator i); + + //! @copydoc ::boost::intrusive::hashtable::erase(const_iterator,const_iterator) + void erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::hashtable::erase(const key_type &) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::hashtable::erase(const KeyType&,KeyHasher,KeyEqual) + template + size_type erase(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func); + + //! @copydoc ::boost::intrusive::hashtable::erase_and_dispose(const_iterator,Disposer) + template + BOOST_INTRUSIVE_DOC1ST(void + , typename detail::disable_if_convertible::type) + erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::hashtable::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + void erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::hashtable::erase_and_dispose(const key_type &,Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::hashtable::erase_and_dispose(const KeyType&,KeyHasher,KeyEqual,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func, Disposer disposer); + + //! @copydoc ::boost::intrusive::hashtable::clear + void clear(); + + //! @copydoc ::boost::intrusive::hashtable::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + //! @copydoc ::boost::intrusive::hashtable::count(const key_type &)const + size_type count(const key_type &key) const; + + //! @copydoc ::boost::intrusive::hashtable::count(const KeyType&,KeyHasher,KeyEqual)const + template + size_type count(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func) const; + + //! @copydoc ::boost::intrusive::hashtable::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::hashtable::find(const KeyType &,KeyHasher,KeyEqual) + template + iterator find(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func); + + //! @copydoc ::boost::intrusive::hashtable::count(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::hashtable::find(const KeyType &,KeyHasher,KeyEqual)const + template + const_iterator find(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func) const; + #endif + + //! @copydoc ::boost::intrusive::hashtable::equal_range(const key_type&) + std::pair equal_range(const key_type &key) + { return this->equal_range(key, this->hash_function(), this->key_eq()); } + + //! @copydoc ::boost::intrusive::hashtable::equal_range(const KeyType &,KeyHasher,KeyEqual) + template + std::pair equal_range(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func) + { return this->priv_equal_range(*this, key, hash_func, equal_func); } + + //! @copydoc ::boost::intrusive::hashtable::equal_range(const key_type&)const + std::pair + equal_range(const key_type &key) const + { return this->equal_range(key, this->hash_function(), this->key_eq()); } + + //! @copydoc ::boost::intrusive::hashtable::equal_range(const KeyType &,KeyHasher,KeyEqual)const + template + std::pair + equal_range(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func) const + { return this->priv_equal_range(*this, key, hash_func, equal_func); } + + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + //! @copydoc ::boost::intrusive::hashtable::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::hashtable::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::hashtable::s_local_iterator_to(reference) + static local_iterator s_local_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::hashtable::s_local_iterator_to(const_reference) + static const_local_iterator s_local_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::hashtable::local_iterator_to(reference) + local_iterator local_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::hashtable::local_iterator_to(const_reference) + const_local_iterator local_iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::hashtable::bucket_count + size_type bucket_count() const; + + //! @copydoc ::boost::intrusive::hashtable::bucket_size + size_type bucket_size(size_type n) const; + + //! @copydoc ::boost::intrusive::hashtable::bucket(const key_type&)const + size_type bucket(const key_type& k) const; + + //! @copydoc ::boost::intrusive::hashtable::bucket(const KeyType&,KeyHasher)const + template + size_type bucket(const KeyType& k, KeyHasher hash_func) const; + + //! @copydoc ::boost::intrusive::hashtable::bucket_pointer + bucket_ptr bucket_pointer() const; + + //! @copydoc ::boost::intrusive::hashtable::begin(size_type) + local_iterator begin(size_type n); + + //! @copydoc ::boost::intrusive::hashtable::begin(size_type)const + const_local_iterator begin(size_type n) const; + + //! @copydoc ::boost::intrusive::hashtable::cbegin(size_type)const + const_local_iterator cbegin(size_type n) const; + + //! @copydoc ::boost::intrusive::hashtable::end(size_type) + local_iterator end(size_type n); + + //! @copydoc ::boost::intrusive::hashtable::end(size_type)const + const_local_iterator end(size_type n) const; + + //! @copydoc ::boost::intrusive::hashtable::cend(size_type)const + const_local_iterator cend(size_type n) const; + + //! @copydoc ::boost::intrusive::hashtable::rehash(const bucket_traits &) + void rehash(const bucket_traits &new_bucket_traits); + + //! @copydoc ::boost::intrusive::hashtable::full_rehash + void full_rehash(); + + //! @copydoc ::boost::intrusive::hashtable::incremental_rehash(bool) + bool incremental_rehash(bool grow = true); + + //! @copydoc ::boost::intrusive::hashtable::incremental_rehash(const bucket_traits &) + bool incremental_rehash(const bucket_traits &new_bucket_traits); + + //! @copydoc ::boost::intrusive::hashtable::split_count + size_type split_count() const; + + //! @copydoc ::boost::intrusive::hashtable::suggested_upper_bucket_count + static size_type suggested_upper_bucket_count(size_type n); + + //! @copydoc ::boost::intrusive::hashtable::suggested_lower_bucket_count + static size_type suggested_lower_bucket_count(size_type n); + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + friend bool operator==(const unordered_set_impl &x, const unordered_set_impl &y) + { + if(table_type::constant_time_size && x.size() != y.size()){ + return false; + } + //Find each element of x in y + for (const_iterator ix = x.cbegin(), ex = x.cend(), ey = y.cend(); ix != ex; ++ix){ + const_iterator iy = y.find(key_of_value()(*ix)); + if (iy == ey || !(*ix == *iy)) + return false; + } + return true; + } + + friend bool operator!=(const unordered_set_impl &x, const unordered_set_impl &y) + { return !(x == y); } + + friend bool operator<(const unordered_set_impl &x, const unordered_set_impl &y) + { return ::boost::intrusive::algo_lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); } + + friend bool operator>(const unordered_set_impl &x, const unordered_set_impl &y) + { return y < x; } + + friend bool operator<=(const unordered_set_impl &x, const unordered_set_impl &y) + { return !(y < x); } + + friend bool operator>=(const unordered_set_impl &x, const unordered_set_impl &y) + { return !(x < y); } +}; + +//! Helper metafunction to define an \c unordered_set that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_unordered_set +{ + /// @cond + typedef typename pack_options + < hashtable_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6, O7, O8, O9, O10 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef typename make_bucket_traits + ::type bucket_traits; + + typedef unordered_set_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::hash + , typename packed_options::equal + , typename packed_options::size_type + , bucket_traits + , (std::size_t(true)*hash_bool_flags::unique_keys_pos) + | (std::size_t(packed_options::constant_time_size)*hash_bool_flags::constant_time_size_pos) + | (std::size_t(packed_options::power_2_buckets)*hash_bool_flags::power_2_buckets_pos) + | (std::size_t(packed_options::cache_begin)*hash_bool_flags::cache_begin_pos) + | (std::size_t(packed_options::compare_hash)*hash_bool_flags::compare_hash_pos) + | (std::size_t(packed_options::incremental)*hash_bool_flags::incremental_pos) + > implementation_defined; + + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class unordered_set + : public make_unordered_set::type +{ + typedef typename make_unordered_set + ::type Base; + + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + BOOST_MOVABLE_BUT_NOT_COPYABLE(unordered_set) + + public: + typedef typename Base::value_traits value_traits; + typedef typename Base::bucket_traits bucket_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + typedef typename Base::bucket_ptr bucket_ptr; + typedef typename Base::size_type size_type; + typedef typename Base::hasher hasher; + typedef typename Base::key_equal key_equal; + + explicit unordered_set ( const bucket_traits &b_traits + , const hasher & hash_func = hasher() + , const key_equal &equal_func = key_equal() + , const value_traits &v_traits = value_traits()) + : Base(b_traits, hash_func, equal_func, v_traits) + {} + + template + BOOST_INTRUSIVE_FORCEINLINE unordered_set + ( Iterator b, Iterator e + , const bucket_traits &b_traits + , const hasher & hash_func = hasher() + , const key_equal &equal_func = key_equal() + , const value_traits &v_traits = value_traits()) + : Base(b, e, b_traits, hash_func, equal_func, v_traits) + {} + + BOOST_INTRUSIVE_FORCEINLINE unordered_set(BOOST_RV_REF(unordered_set) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + BOOST_INTRUSIVE_FORCEINLINE unordered_set& operator=(BOOST_RV_REF(unordered_set) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + BOOST_INTRUSIVE_FORCEINLINE void clone_from(const unordered_set &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(unordered_set) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } +}; + +#endif + + +//! The class template unordered_multiset is an intrusive container, that mimics most of +//! the interface of std::tr1::unordered_multiset as described in the C++ TR1. +//! +//! unordered_multiset is a semi-intrusive container: each object to be stored in the +//! container must contain a proper hook, but the container also needs +//! additional auxiliary memory to work: unordered_multiset needs a pointer to an array +//! of type `bucket_type` to be passed in the constructor. This bucket array must +//! have at least the same lifetime as the container. This makes the use of +//! unordered_multiset more complicated than purely intrusive containers. +//! `bucket_type` is default-constructible, copyable and assignable +//! +//! The template parameter \c T is the type to be managed by the container. +//! The user can specify additional options and if no options are provided +//! default options are used. +//! +//! The container supports the following options: +//! \c base_hook<>/member_hook<>/value_traits<>, +//! \c constant_time_size<>, \c size_type<>, \c hash<> and \c equal<> +//! \c bucket_traits<>, \c power_2_buckets<> and \c cache_begin<>. +//! +//! unordered_multiset only provides forward iterators but it provides 4 iterator types: +//! iterator and const_iterator to navigate through the whole container and +//! local_iterator and const_local_iterator to navigate through the values +//! stored in a single bucket. Local iterators are faster and smaller. +//! +//! It's not recommended to use non constant-time size unordered_multisets because several +//! key functions, like "empty()", become non-constant time functions. Non +//! constant-time size unordered_multisets are mainly provided to support auto-unlink hooks. +//! +//! unordered_multiset, unlike std::unordered_set, does not make automatic rehashings nor +//! offers functions related to a load factor. Rehashing can be explicitly requested +//! and the user must provide a new bucket array that will be used from that moment. +//! +//! Since no automatic rehashing is done, iterators are never invalidated when +//! inserting or erasing elements. Iterators are only invalidated when rehasing. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) +template +#else +template +#endif +class unordered_multiset_impl + : public hashtable_impl +{ + /// @cond + private: + typedef hashtable_impl table_type; + /// @endcond + + //Movable + BOOST_MOVABLE_BUT_NOT_COPYABLE(unordered_multiset_impl) + + typedef table_type implementation_defined; + + public: + typedef typename implementation_defined::value_type value_type; + typedef typename implementation_defined::key_type key_type; + typedef typename implementation_defined::value_traits value_traits; + typedef typename implementation_defined::bucket_traits bucket_traits; + typedef typename implementation_defined::pointer pointer; + typedef typename implementation_defined::const_pointer const_pointer; + typedef typename implementation_defined::reference reference; + typedef typename implementation_defined::const_reference const_reference; + typedef typename implementation_defined::difference_type difference_type; + typedef typename implementation_defined::size_type size_type; + typedef typename implementation_defined::key_equal key_equal; + typedef typename implementation_defined::hasher hasher; + typedef typename implementation_defined::bucket_type bucket_type; + typedef typename implementation_defined::bucket_ptr bucket_ptr; + typedef typename implementation_defined::iterator iterator; + typedef typename implementation_defined::const_iterator const_iterator; + typedef typename implementation_defined::insert_commit_data insert_commit_data; + typedef typename implementation_defined::local_iterator local_iterator; + typedef typename implementation_defined::const_local_iterator const_local_iterator; + typedef typename implementation_defined::node_traits node_traits; + typedef typename implementation_defined::node node; + typedef typename implementation_defined::node_ptr node_ptr; + typedef typename implementation_defined::const_node_ptr const_node_ptr; + typedef typename implementation_defined::node_algorithms node_algorithms; + + public: + + //! @copydoc ::boost::intrusive::hashtable::hashtable(const bucket_traits &,const hasher &,const key_equal &,const value_traits &) + BOOST_INTRUSIVE_FORCEINLINE explicit unordered_multiset_impl ( const bucket_traits &b_traits + , const hasher & hash_func = hasher() + , const key_equal &equal_func = key_equal() + , const value_traits &v_traits = value_traits()) + : table_type(b_traits, hash_func, equal_func, v_traits) + {} + + //! @copydoc ::boost::intrusive::hashtable::hashtable(bool,Iterator,Iterator,const bucket_traits &,const hasher &,const key_equal &,const value_traits &) + template + BOOST_INTRUSIVE_FORCEINLINE unordered_multiset_impl ( Iterator b + , Iterator e + , const bucket_traits &b_traits + , const hasher & hash_func = hasher() + , const key_equal &equal_func = key_equal() + , const value_traits &v_traits = value_traits()) + : table_type(false, b, e, b_traits, hash_func, equal_func, v_traits) + {} + + //! Effects: to-do + //! + BOOST_INTRUSIVE_FORCEINLINE unordered_multiset_impl(BOOST_RV_REF(unordered_multiset_impl) x) + : table_type(BOOST_MOVE_BASE(table_type, x)) + {} + + //! Effects: to-do + //! + BOOST_INTRUSIVE_FORCEINLINE unordered_multiset_impl& operator=(BOOST_RV_REF(unordered_multiset_impl) x) + { return static_cast(table_type::operator=(BOOST_MOVE_BASE(table_type, x))); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::hashtable::~hashtable() + ~unordered_multiset_impl(); + + //! @copydoc ::boost::intrusive::hashtable::begin() + iterator begin(); + + //! @copydoc ::boost::intrusive::hashtable::begin()const + const_iterator begin() const; + + //! @copydoc ::boost::intrusive::hashtable::cbegin()const + const_iterator cbegin() const; + + //! @copydoc ::boost::intrusive::hashtable::end() + iterator end(); + + //! @copydoc ::boost::intrusive::hashtable::end()const + const_iterator end() const; + + //! @copydoc ::boost::intrusive::hashtable::cend()const + const_iterator cend() const; + + //! @copydoc ::boost::intrusive::hashtable::hash_function()const + hasher hash_function() const; + + //! @copydoc ::boost::intrusive::hashtable::key_eq()const + key_equal key_eq() const; + + //! @copydoc ::boost::intrusive::hashtable::empty()const + bool empty() const; + + //! @copydoc ::boost::intrusive::hashtable::size()const + size_type size() const; + + //! @copydoc ::boost::intrusive::hashtable::hashtable + void swap(unordered_multiset_impl& other); + + //! @copydoc ::boost::intrusive::hashtable::clone_from(const hashtable&,Cloner,Disposer) + template + void clone_from(const unordered_multiset_impl &src, Cloner cloner, Disposer disposer); + + #else + + using table_type::clone_from; + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::hashtable::clone_from(hashtable&&,Cloner,Disposer) + template + BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(unordered_multiset_impl) src, Cloner cloner, Disposer disposer) + { table_type::clone_from(BOOST_MOVE_BASE(table_type, src), cloner, disposer); } + + //! @copydoc ::boost::intrusive::hashtable::insert_equal(reference) + BOOST_INTRUSIVE_FORCEINLINE iterator insert(reference value) + { return table_type::insert_equal(value); } + + //! @copydoc ::boost::intrusive::hashtable::insert_equal(Iterator,Iterator) + template + BOOST_INTRUSIVE_FORCEINLINE void insert(Iterator b, Iterator e) + { table_type::insert_equal(b, e); } + + #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED + + //! @copydoc ::boost::intrusive::hashtable::erase(const_iterator) + void erase(const_iterator i); + + //! @copydoc ::boost::intrusive::hashtable::erase(const_iterator,const_iterator) + void erase(const_iterator b, const_iterator e); + + //! @copydoc ::boost::intrusive::hashtable::erase(const key_type &) + size_type erase(const key_type &key); + + //! @copydoc ::boost::intrusive::hashtable::erase(const KeyType&,KeyHasher,KeyEqual) + template + size_type erase(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func); + + //! @copydoc ::boost::intrusive::hashtable::erase_and_dispose(const_iterator,Disposer) + template + BOOST_INTRUSIVE_DOC1ST(void + , typename detail::disable_if_convertible::type) + erase_and_dispose(const_iterator i, Disposer disposer); + + //! @copydoc ::boost::intrusive::hashtable::erase_and_dispose(const_iterator,const_iterator,Disposer) + template + void erase_and_dispose(const_iterator b, const_iterator e, Disposer disposer); + + //! @copydoc ::boost::intrusive::hashtable::erase_and_dispose(const key_type &,Disposer) + template + size_type erase_and_dispose(const key_type &key, Disposer disposer); + + //! @copydoc ::boost::intrusive::hashtable::erase_and_dispose(const KeyType&,KeyHasher,KeyEqual,Disposer) + template + size_type erase_and_dispose(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func, Disposer disposer); + + //! @copydoc ::boost::intrusive::hashtable::clear + void clear(); + + //! @copydoc ::boost::intrusive::hashtable::clear_and_dispose + template + void clear_and_dispose(Disposer disposer); + + //! @copydoc ::boost::intrusive::hashtable::count(const key_type &)const + size_type count(const key_type &key) const; + + //! @copydoc ::boost::intrusive::hashtable::count(const KeyType&,KeyHasher,KeyEqual)const + template + size_type count(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func) const; + + //! @copydoc ::boost::intrusive::hashtable::find(const key_type &) + iterator find(const key_type &key); + + //! @copydoc ::boost::intrusive::hashtable::find(const KeyType &,KeyHasher,KeyEqual) + template + iterator find(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func); + + //! @copydoc ::boost::intrusive::hashtable::count(const key_type &)const + const_iterator find(const key_type &key) const; + + //! @copydoc ::boost::intrusive::hashtable::find(const KeyType &,KeyHasher,KeyEqual)const + template + const_iterator find(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func) const; + + //! @copydoc ::boost::intrusive::hashtable::equal_range(const key_type&) + std::pair equal_range(const key_type &key); + + //! @copydoc ::boost::intrusive::hashtable::equal_range(const KeyType &,KeyHasher,KeyEqual) + template + std::pair equal_range(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func); + + //! @copydoc ::boost::intrusive::hashtable::equal_range(const key_type&)const + std::pair + equal_range(const key_type &key) const; + + //! @copydoc ::boost::intrusive::hashtable::equal_range(const KeyType &,KeyHasher,KeyEqual)const + template + std::pair + equal_range(const KeyType& key, KeyHasher hash_func, KeyEqual equal_func) const; + + //! @copydoc ::boost::intrusive::hashtable::iterator_to(reference) + iterator iterator_to(reference value); + + //! @copydoc ::boost::intrusive::hashtable::iterator_to(const_reference)const + const_iterator iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::hashtable::s_local_iterator_to(reference) + static local_iterator s_local_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::hashtable::s_local_iterator_to(const_reference) + static const_local_iterator s_local_iterator_to(const_reference value); + + //! @copydoc ::boost::intrusive::hashtable::local_iterator_to(reference) + local_iterator local_iterator_to(reference value); + + //! @copydoc ::boost::intrusive::hashtable::local_iterator_to(const_reference) + const_local_iterator local_iterator_to(const_reference value) const; + + //! @copydoc ::boost::intrusive::hashtable::bucket_count + size_type bucket_count() const; + + //! @copydoc ::boost::intrusive::hashtable::bucket_size + size_type bucket_size(size_type n) const; + + //! @copydoc ::boost::intrusive::hashtable::bucket(const key_type&)const + size_type bucket(const key_type& k) const; + + //! @copydoc ::boost::intrusive::hashtable::bucket(const KeyType&,KeyHasher)const + template + size_type bucket(const KeyType& k, KeyHasher hash_func) const; + + //! @copydoc ::boost::intrusive::hashtable::bucket_pointer + bucket_ptr bucket_pointer() const; + + //! @copydoc ::boost::intrusive::hashtable::begin(size_type) + local_iterator begin(size_type n); + + //! @copydoc ::boost::intrusive::hashtable::begin(size_type)const + const_local_iterator begin(size_type n) const; + + //! @copydoc ::boost::intrusive::hashtable::cbegin(size_type)const + const_local_iterator cbegin(size_type n) const; + + //! @copydoc ::boost::intrusive::hashtable::end(size_type) + local_iterator end(size_type n); + + //! @copydoc ::boost::intrusive::hashtable::end(size_type)const + const_local_iterator end(size_type n) const; + + //! @copydoc ::boost::intrusive::hashtable::cend(size_type)const + const_local_iterator cend(size_type n) const; + + //! @copydoc ::boost::intrusive::hashtable::rehash(const bucket_traits &) + void rehash(const bucket_traits &new_bucket_traits); + + //! @copydoc ::boost::intrusive::hashtable::full_rehash + void full_rehash(); + + //! @copydoc ::boost::intrusive::hashtable::incremental_rehash(bool) + bool incremental_rehash(bool grow = true); + + //! @copydoc ::boost::intrusive::hashtable::incremental_rehash(const bucket_traits &) + bool incremental_rehash(const bucket_traits &new_bucket_traits); + + //! @copydoc ::boost::intrusive::hashtable::split_count + size_type split_count() const; + + //! @copydoc ::boost::intrusive::hashtable::suggested_upper_bucket_count + static size_type suggested_upper_bucket_count(size_type n); + + //! @copydoc ::boost::intrusive::hashtable::suggested_lower_bucket_count + static size_type suggested_lower_bucket_count(size_type n); + + #endif // #ifdef BOOST_INTRUSIVE_DOXYGEN_INVOKED +}; + +//! Helper metafunction to define an \c unordered_multiset that yields to the same type when the +//! same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_unordered_multiset +{ + /// @cond + typedef typename pack_options + < hashtable_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4, O5, O6, O7, O8, O9, O10 + #else + Options... + #endif + >::type packed_options; + + typedef typename detail::get_value_traits + ::type value_traits; + + typedef typename make_bucket_traits + ::type bucket_traits; + + typedef unordered_multiset_impl + < value_traits + , typename packed_options::key_of_value + , typename packed_options::hash + , typename packed_options::equal + , typename packed_options::size_type + , bucket_traits + , (std::size_t(false)*hash_bool_flags::unique_keys_pos) + | (std::size_t(packed_options::constant_time_size)*hash_bool_flags::constant_time_size_pos) + | (std::size_t(packed_options::power_2_buckets)*hash_bool_flags::power_2_buckets_pos) + | (std::size_t(packed_options::cache_begin)*hash_bool_flags::cache_begin_pos) + | (std::size_t(packed_options::compare_hash)*hash_bool_flags::compare_hash_pos) + | (std::size_t(packed_options::incremental)*hash_bool_flags::incremental_pos) + > implementation_defined; + + /// @endcond + typedef implementation_defined type; +}; + +#ifndef BOOST_INTRUSIVE_DOXYGEN_INVOKED + +#if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class unordered_multiset + : public make_unordered_multiset::type +{ + typedef typename make_unordered_multiset + ::type Base; + //Assert if passed value traits are compatible with the type + BOOST_STATIC_ASSERT((detail::is_same::value)); + BOOST_MOVABLE_BUT_NOT_COPYABLE(unordered_multiset) + + public: + typedef typename Base::value_traits value_traits; + typedef typename Base::bucket_traits bucket_traits; + typedef typename Base::iterator iterator; + typedef typename Base::const_iterator const_iterator; + typedef typename Base::bucket_ptr bucket_ptr; + typedef typename Base::size_type size_type; + typedef typename Base::hasher hasher; + typedef typename Base::key_equal key_equal; + + explicit unordered_multiset( const bucket_traits &b_traits + , const hasher & hash_func = hasher() + , const key_equal &equal_func = key_equal() + , const value_traits &v_traits = value_traits()) + : Base(b_traits, hash_func, equal_func, v_traits) + {} + + template BOOST_INTRUSIVE_FORCEINLINE + unordered_multiset( Iterator b + , Iterator e + , const bucket_traits &b_traits + , const hasher & hash_func = hasher() + , const key_equal &equal_func = key_equal() + , const value_traits &v_traits = value_traits()) + : Base(b, e, b_traits, hash_func, equal_func, v_traits) + {} + + BOOST_INTRUSIVE_FORCEINLINE unordered_multiset(BOOST_RV_REF(unordered_multiset) x) + : Base(BOOST_MOVE_BASE(Base, x)) + {} + + BOOST_INTRUSIVE_FORCEINLINE unordered_multiset& operator=(BOOST_RV_REF(unordered_multiset) x) + { return static_cast(this->Base::operator=(BOOST_MOVE_BASE(Base, x))); } + + template + BOOST_INTRUSIVE_FORCEINLINE void clone_from(const unordered_multiset &src, Cloner cloner, Disposer disposer) + { Base::clone_from(src, cloner, disposer); } + + template + BOOST_INTRUSIVE_FORCEINLINE void clone_from(BOOST_RV_REF(unordered_multiset) src, Cloner cloner, Disposer disposer) + { Base::clone_from(BOOST_MOVE_BASE(Base, src), cloner, disposer); } +}; + +#endif + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_UNORDERED_SET_HPP diff --git a/boost/intrusive/unordered_set_hook.hpp b/boost/intrusive/unordered_set_hook.hpp new file mode 100644 index 000000000..a18d2354c --- /dev/null +++ b/boost/intrusive/unordered_set_hook.hpp @@ -0,0 +1,459 @@ +///////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright Olaf Krzikalla 2004-2006. +// (C) Copyright Ion Gaztanaga 2006-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/intrusive for documentation. +// +///////////////////////////////////////////////////////////////////////////// + +#ifndef BOOST_INTRUSIVE_UNORDERED_SET_HOOK_HPP +#define BOOST_INTRUSIVE_UNORDERED_SET_HOOK_HPP + +#include +#include + +#include +#include +#include +#include + +#if defined(BOOST_HAS_PRAGMA_ONCE) +# pragma once +#endif + +namespace boost { +namespace intrusive { + +/// @cond + +template +struct unordered_node + : public slist_node +{ + typedef typename pointer_traits + ::template rebind_pointer + < unordered_node >::type + node_ptr; + node_ptr prev_in_group_; + std::size_t hash_; +}; + +template +struct unordered_node + : public slist_node +{ + typedef typename pointer_traits + ::template rebind_pointer + < unordered_node >::type + node_ptr; + node_ptr prev_in_group_; +}; + +template +struct unordered_node + : public slist_node +{ + typedef typename pointer_traits + ::template rebind_pointer + < unordered_node >::type + node_ptr; + std::size_t hash_; +}; + +template +struct unordered_node_traits + : public slist_node_traits +{ + typedef slist_node_traits reduced_slist_node_traits; + typedef unordered_node node; + + typedef typename pointer_traits + ::template rebind_pointer + < node >::type node_ptr; + typedef typename pointer_traits + ::template rebind_pointer + < const node >::type const_node_ptr; + + static const bool store_hash = StoreHash; + static const bool optimize_multikey = OptimizeMultiKey; + + static node_ptr get_next(const const_node_ptr & n) + { return pointer_traits::static_cast_from(n->next_); } + + static void set_next(const node_ptr & n, const node_ptr & next) + { n->next_ = next; } + + static node_ptr get_prev_in_group(const const_node_ptr & n) + { return n->prev_in_group_; } + + static void set_prev_in_group(const node_ptr & n, const node_ptr & prev) + { n->prev_in_group_ = prev; } + + static std::size_t get_hash(const const_node_ptr & n) + { return n->hash_; } + + static void set_hash(const node_ptr & n, std::size_t h) + { n->hash_ = h; } +}; + +template +struct unordered_group_adapter +{ + typedef typename NodeTraits::node node; + typedef typename NodeTraits::node_ptr node_ptr; + typedef typename NodeTraits::const_node_ptr const_node_ptr; + + static node_ptr get_next(const const_node_ptr & n) + { return NodeTraits::get_prev_in_group(n); } + + static void set_next(const node_ptr & n, const node_ptr & next) + { NodeTraits::set_prev_in_group(n, next); } +}; + +template +struct unordered_algorithms + : public circular_slist_algorithms +{ + typedef circular_slist_algorithms base_type; + typedef unordered_group_adapter group_traits; + typedef circular_slist_algorithms group_algorithms; + typedef NodeTraits node_traits; + typedef typename NodeTraits::node node; + typedef typename NodeTraits::node_ptr node_ptr; + typedef typename NodeTraits::const_node_ptr const_node_ptr; + + static void init(typename base_type::node_ptr n) + { + base_type::init(n); + group_algorithms::init(n); + } + + static void init_header(typename base_type::node_ptr n) + { + base_type::init_header(n); + group_algorithms::init_header(n); + } + + static void unlink(typename base_type::node_ptr n) + { + base_type::unlink(n); + group_algorithms::unlink(n); + } +}; + +//Class to avoid defining the same algo as a circular list, as hooks would be ambiguous between them +template +struct uset_algo_wrapper : public Algo +{}; + +template +struct get_uset_node_traits +{ + typedef typename detail::if_c + < (StoreHash || OptimizeMultiKey) + , unordered_node_traits + , slist_node_traits + >::type type; +}; + +template +struct get_uset_algo_type +{ + static const algo_types value = OptimizeMultiKey ? UnorderedAlgorithms : UnorderedCircularSlistAlgorithms; +}; + +template +struct get_algo +{ + typedef unordered_algorithms type; +}; + +template +struct get_algo +{ + typedef uset_algo_wrapper< circular_slist_algorithms > type; +}; + +/// @endcond + +//! Helper metafunction to define a \c unordered_set_base_hook that yields to the same +//! type when the same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_unordered_set_base_hook +{ + /// @cond + typedef typename pack_options + < hook_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4 + #else + Options... + #endif + >::type packed_options; + + typedef generic_hook + < get_uset_algo_type ::value + , typename get_uset_node_traits < typename packed_options::void_pointer + , packed_options::store_hash + , packed_options::optimize_multikey + >::type + , typename packed_options::tag + , packed_options::link_mode + , HashBaseHookId + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +//! Derive a class from unordered_set_base_hook in order to store objects in +//! in an unordered_set/unordered_multi_set. unordered_set_base_hook holds the data necessary to maintain +//! the unordered_set/unordered_multi_set and provides an appropriate value_traits class for unordered_set/unordered_multi_set. +//! +//! The hook admits the following options: \c tag<>, \c void_pointer<>, +//! \c link_mode<>, \c store_hash<> and \c optimize_multikey<>. +//! +//! \c tag<> defines a tag to identify the node. +//! The same tag value can be used in different classes, but if a class is +//! derived from more than one \c list_base_hook, then each \c list_base_hook needs its +//! unique tag. +//! +//! \c void_pointer<> is the pointer type that will be used internally in the hook +//! and the container configured to use this hook. +//! +//! \c link_mode<> will specify the linking mode of the hook (\c normal_link, +//! \c auto_unlink or \c safe_link). +//! +//! \c store_hash<> will tell the hook to store the hash of the value +//! to speed up rehashings. +//! +//! \c optimize_multikey<> will tell the hook to store a link to form a group +//! with other value with the same value to speed up searches and insertions +//! in unordered_multisets with a great number of with equivalent keys. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class unordered_set_base_hook + : public make_unordered_set_base_hook< + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4 + #else + Options... + #endif + >::type +{ + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + public: + //! Effects: If link_mode is \c auto_unlink or \c safe_link + //! initializes the node to an unlinked state. + //! + //! Throws: Nothing. + unordered_set_base_hook(); + + //! Effects: If link_mode is \c auto_unlink or \c safe_link + //! initializes the node to an unlinked state. The argument is ignored. + //! + //! Throws: Nothing. + //! + //! Rationale: Providing a copy-constructor + //! makes classes using the hook STL-compliant without forcing the + //! user to do some additional work. \c swap can be used to emulate + //! move-semantics. + unordered_set_base_hook(const unordered_set_base_hook& ); + + //! Effects: Empty function. The argument is ignored. + //! + //! Throws: Nothing. + //! + //! Rationale: Providing an assignment operator + //! makes classes using the hook STL-compliant without forcing the + //! user to do some additional work. \c swap can be used to emulate + //! move-semantics. + unordered_set_base_hook& operator=(const unordered_set_base_hook& ); + + //! Effects: If link_mode is \c normal_link, the destructor does + //! nothing (ie. no code is generated). If link_mode is \c safe_link and the + //! object is stored in an unordered_set an assertion is raised. If link_mode is + //! \c auto_unlink and \c is_linked() is true, the node is unlinked. + //! + //! Throws: Nothing. + ~unordered_set_base_hook(); + + //! Effects: Swapping two nodes swaps the position of the elements + //! related to those nodes in one or two containers. That is, if the node + //! this is part of the element e1, the node x is part of the element e2 + //! and both elements are included in the containers s1 and s2, then after + //! the swap-operation e1 is in s2 at the position of e2 and e2 is in s1 + //! at the position of e1. If one element is not in a container, then + //! after the swap-operation the other element is not in a container. + //! Iterators to e1 and e2 related to those nodes are invalidated. + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + void swap_nodes(unordered_set_base_hook &other); + + //! Precondition: link_mode must be \c safe_link or \c auto_unlink. + //! + //! Returns: true, if the node belongs to a container, false + //! otherwise. This function can be used to test whether \c unordered_set::iterator_to + //! will return a valid iterator. + //! + //! Complexity: Constant + bool is_linked() const; + + //! Effects: Removes the node if it's inserted in a container. + //! This function is only allowed if link_mode is \c auto_unlink. + //! + //! Throws: Nothing. + void unlink(); + #endif +}; + + +//! Helper metafunction to define a \c unordered_set_member_hook that yields to the same +//! type when the same options (either explicitly or implicitly) are used. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +struct make_unordered_set_member_hook +{ + /// @cond + typedef typename pack_options + < hook_defaults, + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4 + #else + Options... + #endif + >::type packed_options; + + typedef generic_hook + < get_uset_algo_type ::value + , typename get_uset_node_traits < typename packed_options::void_pointer + , packed_options::store_hash + , packed_options::optimize_multikey + >::type + , member_tag + , packed_options::link_mode + , NoBaseHookId + > implementation_defined; + /// @endcond + typedef implementation_defined type; +}; + +//! Put a public data member unordered_set_member_hook in order to store objects of this class in +//! an unordered_set/unordered_multi_set. unordered_set_member_hook holds the data necessary for maintaining the +//! unordered_set/unordered_multi_set and provides an appropriate value_traits class for unordered_set/unordered_multi_set. +//! +//! The hook admits the following options: \c void_pointer<>, +//! \c link_mode<> and \c store_hash<>. +//! +//! \c void_pointer<> is the pointer type that will be used internally in the hook +//! and the container configured to use this hook. +//! +//! \c link_mode<> will specify the linking mode of the hook (\c normal_link, +//! \c auto_unlink or \c safe_link). +//! +//! \c store_hash<> will tell the hook to store the hash of the value +//! to speed up rehashings. +#if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) +template +#else +template +#endif +class unordered_set_member_hook + : public make_unordered_set_member_hook< + #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES) + O1, O2, O3, O4 + #else + Options... + #endif + >::type +{ + #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) + public: + //! Effects: If link_mode is \c auto_unlink or \c safe_link + //! initializes the node to an unlinked state. + //! + //! Throws: Nothing. + unordered_set_member_hook(); + + //! Effects: If link_mode is \c auto_unlink or \c safe_link + //! initializes the node to an unlinked state. The argument is ignored. + //! + //! Throws: Nothing. + //! + //! Rationale: Providing a copy-constructor + //! makes classes using the hook STL-compliant without forcing the + //! user to do some additional work. \c swap can be used to emulate + //! move-semantics. + unordered_set_member_hook(const unordered_set_member_hook& ); + + //! Effects: Empty function. The argument is ignored. + //! + //! Throws: Nothing. + //! + //! Rationale: Providing an assignment operator + //! makes classes using the hook STL-compliant without forcing the + //! user to do some additional work. \c swap can be used to emulate + //! move-semantics. + unordered_set_member_hook& operator=(const unordered_set_member_hook& ); + + //! Effects: If link_mode is \c normal_link, the destructor does + //! nothing (ie. no code is generated). If link_mode is \c safe_link and the + //! object is stored in an unordered_set an assertion is raised. If link_mode is + //! \c auto_unlink and \c is_linked() is true, the node is unlinked. + //! + //! Throws: Nothing. + ~unordered_set_member_hook(); + + //! Effects: Swapping two nodes swaps the position of the elements + //! related to those nodes in one or two containers. That is, if the node + //! this is part of the element e1, the node x is part of the element e2 + //! and both elements are included in the containers s1 and s2, then after + //! the swap-operation e1 is in s2 at the position of e2 and e2 is in s1 + //! at the position of e1. If one element is not in a container, then + //! after the swap-operation the other element is not in a container. + //! Iterators to e1 and e2 related to those nodes are invalidated. + //! + //! Complexity: Constant + //! + //! Throws: Nothing. + void swap_nodes(unordered_set_member_hook &other); + + //! Precondition: link_mode must be \c safe_link or \c auto_unlink. + //! + //! Returns: true, if the node belongs to a container, false + //! otherwise. This function can be used to test whether \c unordered_set::iterator_to + //! will return a valid iterator. + //! + //! Complexity: Constant + bool is_linked() const; + + //! Effects: Removes the node if it's inserted in a container. + //! This function is only allowed if link_mode is \c auto_unlink. + //! + //! Throws: Nothing. + void unlink(); + #endif +}; + +} //namespace intrusive +} //namespace boost + +#include + +#endif //BOOST_INTRUSIVE_UNORDERED_SET_HOOK_HPP diff --git a/boost/multi_index/composite_key.hpp b/boost/multi_index/composite_key.hpp new file mode 100644 index 000000000..787cdf831 --- /dev/null +++ b/boost/multi_index/composite_key.hpp @@ -0,0 +1,1513 @@ +/* Copyright 2003-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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_COMPOSITE_KEY_HPP +#define BOOST_MULTI_INDEX_COMPOSITE_KEY_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include /* keep it first to prevent nasty warns in MSVC */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) +#include +#endif + +#if !defined(BOOST_NO_SFINAE) +#include +#endif + +#if !defined(BOOST_NO_CXX11_HDR_TUPLE)&&\ + !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +#include +#endif + +/* A composite key stores n key extractors and "computes" the + * result on a given value as a packed reference to the value and + * the composite key itself. Actual invocations to the component + * key extractors are lazily performed when executing an operation + * on composite_key results (equality, comparison, hashing.) + * As the other key extractors in Boost.MultiIndex, composite_key + * is overloaded to work on chained pointers to T and reference_wrappers + * of T. + */ + +/* This user_definable macro limits the number of elements of a composite + * key; useful for shortening resulting symbol names (MSVC++ 6.0, for + * instance has problems coping with very long symbol names.) + * NB: This cannot exceed the maximum number of arguments of + * boost::tuple. In Boost 1.32, the limit is 10. + */ + +#if !defined(BOOST_MULTI_INDEX_LIMIT_COMPOSITE_KEY_SIZE) +#define BOOST_MULTI_INDEX_LIMIT_COMPOSITE_KEY_SIZE 10 +#endif + +/* maximum number of key extractors in a composite key */ + +#if BOOST_MULTI_INDEX_LIMIT_COMPOSITE_KEY_SIZE<10 /* max length of a tuple */ +#define BOOST_MULTI_INDEX_COMPOSITE_KEY_SIZE \ + BOOST_MULTI_INDEX_LIMIT_COMPOSITE_KEY_SIZE +#else +#define BOOST_MULTI_INDEX_COMPOSITE_KEY_SIZE 10 +#endif + +/* BOOST_PP_ENUM of BOOST_MULTI_INDEX_COMPOSITE_KEY_SIZE elements */ + +#define BOOST_MULTI_INDEX_CK_ENUM(macro,data) \ + BOOST_PP_ENUM(BOOST_MULTI_INDEX_COMPOSITE_KEY_SIZE,macro,data) + +/* BOOST_PP_ENUM_PARAMS of BOOST_MULTI_INDEX_COMPOSITE_KEY_SIZE elements */ + +#define BOOST_MULTI_INDEX_CK_ENUM_PARAMS(param) \ + BOOST_PP_ENUM_PARAMS(BOOST_MULTI_INDEX_COMPOSITE_KEY_SIZE,param) + +/* if n==0 -> text0 + * otherwise -> textn=tuples::null_type + */ + +#define BOOST_MULTI_INDEX_CK_TEMPLATE_PARM(z,n,text) \ + typename BOOST_PP_CAT(text,n) BOOST_PP_EXPR_IF(n,=tuples::null_type) + +/* const textn& kn=textn() */ + +#define BOOST_MULTI_INDEX_CK_CTOR_ARG(z,n,text) \ + const BOOST_PP_CAT(text,n)& BOOST_PP_CAT(k,n) = BOOST_PP_CAT(text,n)() + +/* typename list(0)::type */ + +#define BOOST_MULTI_INDEX_CK_APPLY_METAFUNCTION_N(z,n,list) \ + BOOST_DEDUCED_TYPENAME BOOST_PP_LIST_AT(list,0)< \ + BOOST_PP_LIST_AT(list,1),n \ + >::type + +namespace boost{ + +template class reference_wrapper; /* fwd decl. */ + +namespace multi_index{ + +namespace detail{ + +/* n-th key extractor of a composite key */ + +template +struct nth_key_from_value +{ + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename mpl::eval_if_c< + N::value, + tuples::element, + mpl::identity + >::type type; +}; + +/* nth_composite_key_##name::type yields + * functor >, or tuples::null_type + * if N exceeds the length of the composite key. + */ + +#define BOOST_MULTI_INDEX_CK_NTH_COMPOSITE_KEY_FUNCTOR(name,functor) \ +template \ +struct BOOST_PP_CAT(key_,name) \ +{ \ + typedef functor type; \ +}; \ + \ +template<> \ +struct BOOST_PP_CAT(key_,name) \ +{ \ + typedef tuples::null_type type; \ +}; \ + \ +template \ +struct BOOST_PP_CAT(nth_composite_key_,name) \ +{ \ + typedef typename nth_key_from_value::type key_from_value; \ + typedef typename BOOST_PP_CAT(key_,name)::type type; \ +}; + +/* nth_composite_key_equal_to + * nth_composite_key_less + * nth_composite_key_greater + * nth_composite_key_hash + */ + +BOOST_MULTI_INDEX_CK_NTH_COMPOSITE_KEY_FUNCTOR(equal_to,std::equal_to) +BOOST_MULTI_INDEX_CK_NTH_COMPOSITE_KEY_FUNCTOR(less,std::less) +BOOST_MULTI_INDEX_CK_NTH_COMPOSITE_KEY_FUNCTOR(greater,std::greater) +BOOST_MULTI_INDEX_CK_NTH_COMPOSITE_KEY_FUNCTOR(hash,boost::hash) + +/* used for defining equality and comparison ops of composite_key_result */ + +#define BOOST_MULTI_INDEX_CK_IDENTITY_ENUM_MACRO(z,n,text) text + +struct generic_operator_equal +{ + template + bool operator()(const T& x,const Q& y)const{return x==y;} +}; + +typedef tuple< + BOOST_MULTI_INDEX_CK_ENUM( + BOOST_MULTI_INDEX_CK_IDENTITY_ENUM_MACRO, + detail::generic_operator_equal)> generic_operator_equal_tuple; + +struct generic_operator_less +{ + template + bool operator()(const T& x,const Q& y)const{return x generic_operator_less_tuple; + +/* Metaprogramming machinery for implementing equality, comparison and + * hashing operations of composite_key_result. + * + * equal_* checks for equality between composite_key_results and + * between those and tuples, accepting a tuple of basic equality functors. + * compare_* does lexicographical comparison. + * hash_* computes a combination of elementwise hash values. + */ + +template +< + typename KeyCons1,typename Value1, + typename KeyCons2, typename Value2, + typename EqualCons +> +struct equal_ckey_ckey; /* fwd decl. */ + +template +< + typename KeyCons1,typename Value1, + typename KeyCons2, typename Value2, + typename EqualCons +> +struct equal_ckey_ckey_terminal +{ + static bool compare( + const KeyCons1&,const Value1&, + const KeyCons2&,const Value2&, + const EqualCons&) + { + return true; + } +}; + +template +< + typename KeyCons1,typename Value1, + typename KeyCons2, typename Value2, + typename EqualCons +> +struct equal_ckey_ckey_normal +{ + static bool compare( + const KeyCons1& c0,const Value1& v0, + const KeyCons2& c1,const Value2& v1, + const EqualCons& eq) + { + if(!eq.get_head()(c0.get_head()(v0),c1.get_head()(v1)))return false; + return equal_ckey_ckey< + BOOST_DEDUCED_TYPENAME KeyCons1::tail_type,Value1, + BOOST_DEDUCED_TYPENAME KeyCons2::tail_type,Value2, + BOOST_DEDUCED_TYPENAME EqualCons::tail_type + >::compare(c0.get_tail(),v0,c1.get_tail(),v1,eq.get_tail()); + } +}; + +template +< + typename KeyCons1,typename Value1, + typename KeyCons2, typename Value2, + typename EqualCons +> +struct equal_ckey_ckey: + mpl::if_< + mpl::or_< + is_same, + is_same + >, + equal_ckey_ckey_terminal, + equal_ckey_ckey_normal + >::type +{ +}; + +template +< + typename KeyCons,typename Value, + typename ValCons,typename EqualCons +> +struct equal_ckey_cval; /* fwd decl. */ + +template +< + typename KeyCons,typename Value, + typename ValCons,typename EqualCons +> +struct equal_ckey_cval_terminal +{ + static bool compare( + const KeyCons&,const Value&,const ValCons&,const EqualCons&) + { + return true; + } + + static bool compare( + const ValCons&,const KeyCons&,const Value&,const EqualCons&) + { + return true; + } +}; + +template +< + typename KeyCons,typename Value, + typename ValCons,typename EqualCons +> +struct equal_ckey_cval_normal +{ + static bool compare( + const KeyCons& c,const Value& v,const ValCons& vc, + const EqualCons& eq) + { + if(!eq.get_head()(c.get_head()(v),vc.get_head()))return false; + return equal_ckey_cval< + BOOST_DEDUCED_TYPENAME KeyCons::tail_type,Value, + BOOST_DEDUCED_TYPENAME ValCons::tail_type, + BOOST_DEDUCED_TYPENAME EqualCons::tail_type + >::compare(c.get_tail(),v,vc.get_tail(),eq.get_tail()); + } + + static bool compare( + const ValCons& vc,const KeyCons& c,const Value& v, + const EqualCons& eq) + { + if(!eq.get_head()(vc.get_head(),c.get_head()(v)))return false; + return equal_ckey_cval< + BOOST_DEDUCED_TYPENAME KeyCons::tail_type,Value, + BOOST_DEDUCED_TYPENAME ValCons::tail_type, + BOOST_DEDUCED_TYPENAME EqualCons::tail_type + >::compare(vc.get_tail(),c.get_tail(),v,eq.get_tail()); + } +}; + +template +< + typename KeyCons,typename Value, + typename ValCons,typename EqualCons +> +struct equal_ckey_cval: + mpl::if_< + mpl::or_< + is_same, + is_same + >, + equal_ckey_cval_terminal, + equal_ckey_cval_normal + >::type +{ +}; + +template +< + typename KeyCons1,typename Value1, + typename KeyCons2, typename Value2, + typename CompareCons +> +struct compare_ckey_ckey; /* fwd decl. */ + +template +< + typename KeyCons1,typename Value1, + typename KeyCons2, typename Value2, + typename CompareCons +> +struct compare_ckey_ckey_terminal +{ + static bool compare( + const KeyCons1&,const Value1&, + const KeyCons2&,const Value2&, + const CompareCons&) + { + return false; + } +}; + +template +< + typename KeyCons1,typename Value1, + typename KeyCons2, typename Value2, + typename CompareCons +> +struct compare_ckey_ckey_normal +{ + static bool compare( + const KeyCons1& c0,const Value1& v0, + const KeyCons2& c1,const Value2& v1, + const CompareCons& comp) + { + if(comp.get_head()(c0.get_head()(v0),c1.get_head()(v1)))return true; + if(comp.get_head()(c1.get_head()(v1),c0.get_head()(v0)))return false; + return compare_ckey_ckey< + BOOST_DEDUCED_TYPENAME KeyCons1::tail_type,Value1, + BOOST_DEDUCED_TYPENAME KeyCons2::tail_type,Value2, + BOOST_DEDUCED_TYPENAME CompareCons::tail_type + >::compare(c0.get_tail(),v0,c1.get_tail(),v1,comp.get_tail()); + } +}; + +template +< + typename KeyCons1,typename Value1, + typename KeyCons2, typename Value2, + typename CompareCons +> +struct compare_ckey_ckey: + mpl::if_< + mpl::or_< + is_same, + is_same + >, + compare_ckey_ckey_terminal, + compare_ckey_ckey_normal + >::type +{ +}; + +template +< + typename KeyCons,typename Value, + typename ValCons,typename CompareCons +> +struct compare_ckey_cval; /* fwd decl. */ + +template +< + typename KeyCons,typename Value, + typename ValCons,typename CompareCons +> +struct compare_ckey_cval_terminal +{ + static bool compare( + const KeyCons&,const Value&,const ValCons&,const CompareCons&) + { + return false; + } + + static bool compare( + const ValCons&,const KeyCons&,const Value&,const CompareCons&) + { + return false; + } +}; + +template +< + typename KeyCons,typename Value, + typename ValCons,typename CompareCons +> +struct compare_ckey_cval_normal +{ + static bool compare( + const KeyCons& c,const Value& v,const ValCons& vc, + const CompareCons& comp) + { + if(comp.get_head()(c.get_head()(v),vc.get_head()))return true; + if(comp.get_head()(vc.get_head(),c.get_head()(v)))return false; + return compare_ckey_cval< + BOOST_DEDUCED_TYPENAME KeyCons::tail_type,Value, + BOOST_DEDUCED_TYPENAME ValCons::tail_type, + BOOST_DEDUCED_TYPENAME CompareCons::tail_type + >::compare(c.get_tail(),v,vc.get_tail(),comp.get_tail()); + } + + static bool compare( + const ValCons& vc,const KeyCons& c,const Value& v, + const CompareCons& comp) + { + if(comp.get_head()(vc.get_head(),c.get_head()(v)))return true; + if(comp.get_head()(c.get_head()(v),vc.get_head()))return false; + return compare_ckey_cval< + BOOST_DEDUCED_TYPENAME KeyCons::tail_type,Value, + BOOST_DEDUCED_TYPENAME ValCons::tail_type, + BOOST_DEDUCED_TYPENAME CompareCons::tail_type + >::compare(vc.get_tail(),c.get_tail(),v,comp.get_tail()); + } +}; + +template +< + typename KeyCons,typename Value, + typename ValCons,typename CompareCons +> +struct compare_ckey_cval: + mpl::if_< + mpl::or_< + is_same, + is_same + >, + compare_ckey_cval_terminal, + compare_ckey_cval_normal + >::type +{ +}; + +template +struct hash_ckey; /* fwd decl. */ + +template +struct hash_ckey_terminal +{ + static std::size_t hash( + const KeyCons&,const Value&,const HashCons&,std::size_t carry) + { + return carry; + } +}; + +template +struct hash_ckey_normal +{ + static std::size_t hash( + const KeyCons& c,const Value& v,const HashCons& h,std::size_t carry=0) + { + /* same hashing formula as boost::hash_combine */ + + carry^=h.get_head()(c.get_head()(v))+0x9e3779b9+(carry<<6)+(carry>>2); + return hash_ckey< + BOOST_DEDUCED_TYPENAME KeyCons::tail_type,Value, + BOOST_DEDUCED_TYPENAME HashCons::tail_type + >::hash(c.get_tail(),v,h.get_tail(),carry); + } +}; + +template +struct hash_ckey: + mpl::if_< + is_same, + hash_ckey_terminal, + hash_ckey_normal + >::type +{ +}; + +template +struct hash_cval; /* fwd decl. */ + +template +struct hash_cval_terminal +{ + static std::size_t hash(const ValCons&,const HashCons&,std::size_t carry) + { + return carry; + } +}; + +template +struct hash_cval_normal +{ + static std::size_t hash( + const ValCons& vc,const HashCons& h,std::size_t carry=0) + { + carry^=h.get_head()(vc.get_head())+0x9e3779b9+(carry<<6)+(carry>>2); + return hash_cval< + BOOST_DEDUCED_TYPENAME ValCons::tail_type, + BOOST_DEDUCED_TYPENAME HashCons::tail_type + >::hash(vc.get_tail(),h.get_tail(),carry); + } +}; + +template +struct hash_cval: + mpl::if_< + is_same, + hash_cval_terminal, + hash_cval_normal + >::type +{ +}; + +} /* namespace multi_index::detail */ + +/* composite_key_result */ + +#if defined(BOOST_MSVC) +#pragma warning(push) +#pragma warning(disable:4512) +#endif + +template +struct composite_key_result +{ + typedef CompositeKey composite_key_type; + typedef typename composite_key_type::value_type value_type; + + composite_key_result( + const composite_key_type& composite_key_,const value_type& value_): + composite_key(composite_key_),value(value_) + {} + + const composite_key_type& composite_key; + const value_type& value; +}; + +#if defined(BOOST_MSVC) +#pragma warning(pop) +#endif + +/* composite_key */ + +template< + typename Value, + BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_TEMPLATE_PARM,KeyFromValue) +> +struct composite_key: + private tuple +{ +private: + typedef tuple super; + +public: + typedef super key_extractor_tuple; + typedef Value value_type; + typedef composite_key_result result_type; + + composite_key( + BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_CTOR_ARG,KeyFromValue)): + super(BOOST_MULTI_INDEX_CK_ENUM_PARAMS(k)) + {} + + composite_key(const key_extractor_tuple& x):super(x){} + + const key_extractor_tuple& key_extractors()const{return *this;} + key_extractor_tuple& key_extractors(){return *this;} + + template + +#if !defined(BOOST_NO_SFINAE) + typename disable_if< + is_convertible,result_type>::type +#else + result_type +#endif + + operator()(const ChainedPtr& x)const + { + return operator()(*x); + } + + result_type operator()(const value_type& x)const + { + return result_type(*this,x); + } + + result_type operator()(const reference_wrapper& x)const + { + return result_type(*this,x.get()); + } + + result_type operator()(const reference_wrapper& x)const + { + return result_type(*this,x.get()); + } +}; + +/* comparison operators */ + +/* == */ + +template +inline bool operator==( + const composite_key_result& x, + const composite_key_result& y) +{ + typedef typename CompositeKey1::key_extractor_tuple key_extractor_tuple1; + typedef typename CompositeKey1::value_type value_type1; + typedef typename CompositeKey2::key_extractor_tuple key_extractor_tuple2; + typedef typename CompositeKey2::value_type value_type2; + + BOOST_STATIC_ASSERT( + tuples::length::value== + tuples::length::value); + + return detail::equal_ckey_ckey< + key_extractor_tuple1,value_type1, + key_extractor_tuple2,value_type2, + detail::generic_operator_equal_tuple + >::compare( + x.composite_key.key_extractors(),x.value, + y.composite_key.key_extractors(),y.value, + detail::generic_operator_equal_tuple()); +} + +template< + typename CompositeKey, + BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value) +> +inline bool operator==( + const composite_key_result& x, + const tuple& y) +{ + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef tuple key_tuple; + + BOOST_STATIC_ASSERT( + tuples::length::value== + tuples::length::value); + + return detail::equal_ckey_cval< + key_extractor_tuple,value_type, + key_tuple,detail::generic_operator_equal_tuple + >::compare( + x.composite_key.key_extractors(),x.value, + y,detail::generic_operator_equal_tuple()); +} + +template +< + BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value), + typename CompositeKey +> +inline bool operator==( + const tuple& x, + const composite_key_result& y) +{ + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef tuple key_tuple; + + BOOST_STATIC_ASSERT( + tuples::length::value== + tuples::length::value); + + return detail::equal_ckey_cval< + key_extractor_tuple,value_type, + key_tuple,detail::generic_operator_equal_tuple + >::compare( + x,y.composite_key.key_extractors(), + y.value,detail::generic_operator_equal_tuple()); +} + +#if !defined(BOOST_NO_CXX11_HDR_TUPLE)&&\ + !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +template +inline bool operator==( + const composite_key_result& x, + const std::tuple& y) +{ + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef std::tuple key_tuple; + typedef typename detail::cons_stdtuple_ctor< + key_tuple>::result_type cons_key_tuple; + + BOOST_STATIC_ASSERT( + static_cast(tuples::length::value)== + std::tuple_size::value); + + return detail::equal_ckey_cval< + key_extractor_tuple,value_type, + cons_key_tuple,detail::generic_operator_equal_tuple + >::compare( + x.composite_key.key_extractors(),x.value, + detail::make_cons_stdtuple(y),detail::generic_operator_equal_tuple()); +} + +template +inline bool operator==( + const std::tuple& x, + const composite_key_result& y) +{ + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef std::tuple key_tuple; + typedef typename detail::cons_stdtuple_ctor< + key_tuple>::result_type cons_key_tuple; + + BOOST_STATIC_ASSERT( + static_cast(tuples::length::value)== + std::tuple_size::value); + + return detail::equal_ckey_cval< + key_extractor_tuple,value_type, + cons_key_tuple,detail::generic_operator_equal_tuple + >::compare( + detail::make_cons_stdtuple(x),y.composite_key.key_extractors(), + y.value,detail::generic_operator_equal_tuple()); +} +#endif + +/* < */ + +template +inline bool operator<( + const composite_key_result& x, + const composite_key_result& y) +{ + typedef typename CompositeKey1::key_extractor_tuple key_extractor_tuple1; + typedef typename CompositeKey1::value_type value_type1; + typedef typename CompositeKey2::key_extractor_tuple key_extractor_tuple2; + typedef typename CompositeKey2::value_type value_type2; + + return detail::compare_ckey_ckey< + key_extractor_tuple1,value_type1, + key_extractor_tuple2,value_type2, + detail::generic_operator_less_tuple + >::compare( + x.composite_key.key_extractors(),x.value, + y.composite_key.key_extractors(),y.value, + detail::generic_operator_less_tuple()); +} + +template +< + typename CompositeKey, + BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value) +> +inline bool operator<( + const composite_key_result& x, + const tuple& y) +{ + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef tuple key_tuple; + + return detail::compare_ckey_cval< + key_extractor_tuple,value_type, + key_tuple,detail::generic_operator_less_tuple + >::compare( + x.composite_key.key_extractors(),x.value, + y,detail::generic_operator_less_tuple()); +} + +template +< + BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value), + typename CompositeKey +> +inline bool operator<( + const tuple& x, + const composite_key_result& y) +{ + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef tuple key_tuple; + + return detail::compare_ckey_cval< + key_extractor_tuple,value_type, + key_tuple,detail::generic_operator_less_tuple + >::compare( + x,y.composite_key.key_extractors(), + y.value,detail::generic_operator_less_tuple()); +} + +#if !defined(BOOST_NO_CXX11_HDR_TUPLE)&&\ + !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +template +inline bool operator<( + const composite_key_result& x, + const std::tuple& y) +{ + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef std::tuple key_tuple; + typedef typename detail::cons_stdtuple_ctor< + key_tuple>::result_type cons_key_tuple; + + return detail::compare_ckey_cval< + key_extractor_tuple,value_type, + cons_key_tuple,detail::generic_operator_less_tuple + >::compare( + x.composite_key.key_extractors(),x.value, + detail::make_cons_stdtuple(y),detail::generic_operator_less_tuple()); +} + +template +inline bool operator<( + const std::tuple& x, + const composite_key_result& y) +{ + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef std::tuple key_tuple; + typedef typename detail::cons_stdtuple_ctor< + key_tuple>::result_type cons_key_tuple; + + return detail::compare_ckey_cval< + key_extractor_tuple,value_type, + cons_key_tuple,detail::generic_operator_less_tuple + >::compare( + detail::make_cons_stdtuple(x),y.composite_key.key_extractors(), + y.value,detail::generic_operator_less_tuple()); +} +#endif + +/* rest of comparison operators */ + +#define BOOST_MULTI_INDEX_CK_COMPLETE_COMP_OPS(t1,t2,a1,a2) \ +template inline bool operator!=(const a1& x,const a2& y) \ +{ \ + return !(x==y); \ +} \ + \ +template inline bool operator>(const a1& x,const a2& y) \ +{ \ + return y inline bool operator>=(const a1& x,const a2& y) \ +{ \ + return !(x inline bool operator<=(const a1& x,const a2& y) \ +{ \ + return !(y, + composite_key_result +) + +BOOST_MULTI_INDEX_CK_COMPLETE_COMP_OPS( + typename CompositeKey, + BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value), + composite_key_result, + tuple +) + +BOOST_MULTI_INDEX_CK_COMPLETE_COMP_OPS( + BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value), + typename CompositeKey, + tuple, + composite_key_result +) + +#if !defined(BOOST_NO_CXX11_HDR_TUPLE)&&\ + !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) +BOOST_MULTI_INDEX_CK_COMPLETE_COMP_OPS( + typename CompositeKey, + typename... Values, + composite_key_result, + std::tuple +) + +BOOST_MULTI_INDEX_CK_COMPLETE_COMP_OPS( + typename CompositeKey, + typename... Values, + std::tuple, + composite_key_result +) +#endif + +/* composite_key_equal_to */ + +template +< + BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_TEMPLATE_PARM,Pred) +> +struct composite_key_equal_to: + private tuple +{ +private: + typedef tuple super; + +public: + typedef super key_eq_tuple; + + composite_key_equal_to( + BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_CTOR_ARG,Pred)): + super(BOOST_MULTI_INDEX_CK_ENUM_PARAMS(k)) + {} + + composite_key_equal_to(const key_eq_tuple& x):super(x){} + + const key_eq_tuple& key_eqs()const{return *this;} + key_eq_tuple& key_eqs(){return *this;} + + template + bool operator()( + const composite_key_result & x, + const composite_key_result & y)const + { + typedef typename CompositeKey1::key_extractor_tuple key_extractor_tuple1; + typedef typename CompositeKey1::value_type value_type1; + typedef typename CompositeKey2::key_extractor_tuple key_extractor_tuple2; + typedef typename CompositeKey2::value_type value_type2; + + BOOST_STATIC_ASSERT( + tuples::length::value<= + tuples::length::value&& + tuples::length::value== + tuples::length::value); + + return detail::equal_ckey_ckey< + key_extractor_tuple1,value_type1, + key_extractor_tuple2,value_type2, + key_eq_tuple + >::compare( + x.composite_key.key_extractors(),x.value, + y.composite_key.key_extractors(),y.value, + key_eqs()); + } + + template + < + typename CompositeKey, + BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value) + > + bool operator()( + const composite_key_result& x, + const tuple& y)const + { + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef tuple key_tuple; + + BOOST_STATIC_ASSERT( + tuples::length::value<= + tuples::length::value&& + tuples::length::value== + tuples::length::value); + + return detail::equal_ckey_cval< + key_extractor_tuple,value_type, + key_tuple,key_eq_tuple + >::compare(x.composite_key.key_extractors(),x.value,y,key_eqs()); + } + + template + < + BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value), + typename CompositeKey + > + bool operator()( + const tuple& x, + const composite_key_result& y)const + { + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef tuple key_tuple; + + BOOST_STATIC_ASSERT( + tuples::length::value<= + tuples::length::value&& + tuples::length::value== + tuples::length::value); + + return detail::equal_ckey_cval< + key_extractor_tuple,value_type, + key_tuple,key_eq_tuple + >::compare(x,y.composite_key.key_extractors(),y.value,key_eqs()); + } + +#if !defined(BOOST_NO_CXX11_HDR_TUPLE)&&\ + !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) + template + bool operator()( + const composite_key_result& x, + const std::tuple& y)const + { + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef std::tuple key_tuple; + typedef typename detail::cons_stdtuple_ctor< + key_tuple>::result_type cons_key_tuple; + + BOOST_STATIC_ASSERT( + tuples::length::value<= + tuples::length::value&& + static_cast(tuples::length::value)== + std::tuple_size::value); + + return detail::equal_ckey_cval< + key_extractor_tuple,value_type, + cons_key_tuple,key_eq_tuple + >::compare( + x.composite_key.key_extractors(),x.value, + detail::make_cons_stdtuple(y),key_eqs()); + } + + template + bool operator()( + const std::tuple& x, + const composite_key_result& y)const + { + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef std::tuple key_tuple; + typedef typename detail::cons_stdtuple_ctor< + key_tuple>::result_type cons_key_tuple; + + BOOST_STATIC_ASSERT( + std::tuple_size::value<= + static_cast(tuples::length::value)&& + std::tuple_size::value== + static_cast(tuples::length::value)); + + return detail::equal_ckey_cval< + key_extractor_tuple,value_type, + cons_key_tuple,key_eq_tuple + >::compare( + detail::make_cons_stdtuple(x),y.composite_key.key_extractors(), + y.value,key_eqs()); + } +#endif +}; + +/* composite_key_compare */ + +template +< + BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_TEMPLATE_PARM,Compare) +> +struct composite_key_compare: + private tuple +{ +private: + typedef tuple super; + +public: + typedef super key_comp_tuple; + + composite_key_compare( + BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_CTOR_ARG,Compare)): + super(BOOST_MULTI_INDEX_CK_ENUM_PARAMS(k)) + {} + + composite_key_compare(const key_comp_tuple& x):super(x){} + + const key_comp_tuple& key_comps()const{return *this;} + key_comp_tuple& key_comps(){return *this;} + + template + bool operator()( + const composite_key_result & x, + const composite_key_result & y)const + { + typedef typename CompositeKey1::key_extractor_tuple key_extractor_tuple1; + typedef typename CompositeKey1::value_type value_type1; + typedef typename CompositeKey2::key_extractor_tuple key_extractor_tuple2; + typedef typename CompositeKey2::value_type value_type2; + + BOOST_STATIC_ASSERT( + tuples::length::value<= + tuples::length::value|| + tuples::length::value<= + tuples::length::value); + + return detail::compare_ckey_ckey< + key_extractor_tuple1,value_type1, + key_extractor_tuple2,value_type2, + key_comp_tuple + >::compare( + x.composite_key.key_extractors(),x.value, + y.composite_key.key_extractors(),y.value, + key_comps()); + } + +#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) + template + bool operator()( + const composite_key_result& x, + const Value& y)const + { + return operator()(x,boost::make_tuple(boost::cref(y))); + } +#endif + + template + < + typename CompositeKey, + BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value) + > + bool operator()( + const composite_key_result& x, + const tuple& y)const + { + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef tuple key_tuple; + + BOOST_STATIC_ASSERT( + tuples::length::value<= + tuples::length::value|| + tuples::length::value<= + tuples::length::value); + + return detail::compare_ckey_cval< + key_extractor_tuple,value_type, + key_tuple,key_comp_tuple + >::compare(x.composite_key.key_extractors(),x.value,y,key_comps()); + } + +#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) + template + bool operator()( + const Value& x, + const composite_key_result& y)const + { + return operator()(boost::make_tuple(boost::cref(x)),y); + } +#endif + + template + < + BOOST_MULTI_INDEX_CK_ENUM_PARAMS(typename Value), + typename CompositeKey + > + bool operator()( + const tuple& x, + const composite_key_result& y)const + { + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef tuple key_tuple; + + BOOST_STATIC_ASSERT( + tuples::length::value<= + tuples::length::value|| + tuples::length::value<= + tuples::length::value); + + return detail::compare_ckey_cval< + key_extractor_tuple,value_type, + key_tuple,key_comp_tuple + >::compare(x,y.composite_key.key_extractors(),y.value,key_comps()); + } + +#if !defined(BOOST_NO_CXX11_HDR_TUPLE)&&\ + !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) + template + bool operator()( + const composite_key_result& x, + const std::tuple& y)const + { + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef std::tuple key_tuple; + typedef typename detail::cons_stdtuple_ctor< + key_tuple>::result_type cons_key_tuple; + + BOOST_STATIC_ASSERT( + tuples::length::value<= + tuples::length::value|| + std::tuple_size::value<= + static_cast(tuples::length::value)); + + return detail::compare_ckey_cval< + key_extractor_tuple,value_type, + cons_key_tuple,key_comp_tuple + >::compare( + x.composite_key.key_extractors(),x.value, + detail::make_cons_stdtuple(y),key_comps()); + } + + template + bool operator()( + const std::tuple& x, + const composite_key_result& y)const + { + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + typedef std::tuple key_tuple; + typedef typename detail::cons_stdtuple_ctor< + key_tuple>::result_type cons_key_tuple; + + BOOST_STATIC_ASSERT( + std::tuple_size::value<= + static_cast(tuples::length::value)|| + tuples::length::value<= + tuples::length::value); + + return detail::compare_ckey_cval< + key_extractor_tuple,value_type, + cons_key_tuple,key_comp_tuple + >::compare( + detail::make_cons_stdtuple(x),y.composite_key.key_extractors(), + y.value,key_comps()); + } +#endif +}; + +/* composite_key_hash */ + +template +< + BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_TEMPLATE_PARM,Hash) +> +struct composite_key_hash: + private tuple +{ +private: + typedef tuple super; + +public: + typedef super key_hasher_tuple; + + composite_key_hash( + BOOST_MULTI_INDEX_CK_ENUM(BOOST_MULTI_INDEX_CK_CTOR_ARG,Hash)): + super(BOOST_MULTI_INDEX_CK_ENUM_PARAMS(k)) + {} + + composite_key_hash(const key_hasher_tuple& x):super(x){} + + const key_hasher_tuple& key_hash_functions()const{return *this;} + key_hasher_tuple& key_hash_functions(){return *this;} + + template + std::size_t operator()(const composite_key_result & x)const + { + typedef typename CompositeKey::key_extractor_tuple key_extractor_tuple; + typedef typename CompositeKey::value_type value_type; + + BOOST_STATIC_ASSERT( + tuples::length::value== + tuples::length::value); + + return detail::hash_ckey< + key_extractor_tuple,value_type, + key_hasher_tuple + >::hash(x.composite_key.key_extractors(),x.value,key_hash_functions()); + } + + template + std::size_t operator()( + const tuple& x)const + { + typedef tuple key_tuple; + + BOOST_STATIC_ASSERT( + tuples::length::value== + tuples::length::value); + + return detail::hash_cval< + key_tuple,key_hasher_tuple + >::hash(x,key_hash_functions()); + } + +#if !defined(BOOST_NO_CXX11_HDR_TUPLE)&&\ + !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) + template + std::size_t operator()(const std::tuple& x)const + { + typedef std::tuple key_tuple; + typedef typename detail::cons_stdtuple_ctor< + key_tuple>::result_type cons_key_tuple; + + BOOST_STATIC_ASSERT( + std::tuple_size::value== + static_cast(tuples::length::value)); + + return detail::hash_cval< + cons_key_tuple,key_hasher_tuple + >::hash(detail::make_cons_stdtuple(x),key_hash_functions()); + } +#endif +}; + +/* Instantiations of the former functors with "natural" basic components: + * composite_key_result_equal_to uses std::equal_to of the values. + * composite_key_result_less uses std::less. + * composite_key_result_greater uses std::greater. + * composite_key_result_hash uses boost::hash. + */ + +#define BOOST_MULTI_INDEX_CK_RESULT_EQUAL_TO_SUPER \ +composite_key_equal_to< \ + BOOST_MULTI_INDEX_CK_ENUM( \ + BOOST_MULTI_INDEX_CK_APPLY_METAFUNCTION_N, \ + /* the argument is a PP list */ \ + (detail::nth_composite_key_equal_to, \ + (BOOST_DEDUCED_TYPENAME CompositeKeyResult::composite_key_type, \ + BOOST_PP_NIL))) \ + > + +template +struct composite_key_result_equal_to: +BOOST_MULTI_INDEX_PRIVATE_IF_USING_DECL_FOR_TEMPL_FUNCTIONS +BOOST_MULTI_INDEX_CK_RESULT_EQUAL_TO_SUPER +{ +private: + typedef BOOST_MULTI_INDEX_CK_RESULT_EQUAL_TO_SUPER super; + +public: + typedef CompositeKeyResult first_argument_type; + typedef first_argument_type second_argument_type; + typedef bool result_type; + + using super::operator(); +}; + +#define BOOST_MULTI_INDEX_CK_RESULT_LESS_SUPER \ +composite_key_compare< \ + BOOST_MULTI_INDEX_CK_ENUM( \ + BOOST_MULTI_INDEX_CK_APPLY_METAFUNCTION_N, \ + /* the argument is a PP list */ \ + (detail::nth_composite_key_less, \ + (BOOST_DEDUCED_TYPENAME CompositeKeyResult::composite_key_type, \ + BOOST_PP_NIL))) \ + > + +template +struct composite_key_result_less: +BOOST_MULTI_INDEX_PRIVATE_IF_USING_DECL_FOR_TEMPL_FUNCTIONS +BOOST_MULTI_INDEX_CK_RESULT_LESS_SUPER +{ +private: + typedef BOOST_MULTI_INDEX_CK_RESULT_LESS_SUPER super; + +public: + typedef CompositeKeyResult first_argument_type; + typedef first_argument_type second_argument_type; + typedef bool result_type; + + using super::operator(); +}; + +#define BOOST_MULTI_INDEX_CK_RESULT_GREATER_SUPER \ +composite_key_compare< \ + BOOST_MULTI_INDEX_CK_ENUM( \ + BOOST_MULTI_INDEX_CK_APPLY_METAFUNCTION_N, \ + /* the argument is a PP list */ \ + (detail::nth_composite_key_greater, \ + (BOOST_DEDUCED_TYPENAME CompositeKeyResult::composite_key_type, \ + BOOST_PP_NIL))) \ + > + +template +struct composite_key_result_greater: +BOOST_MULTI_INDEX_PRIVATE_IF_USING_DECL_FOR_TEMPL_FUNCTIONS +BOOST_MULTI_INDEX_CK_RESULT_GREATER_SUPER +{ +private: + typedef BOOST_MULTI_INDEX_CK_RESULT_GREATER_SUPER super; + +public: + typedef CompositeKeyResult first_argument_type; + typedef first_argument_type second_argument_type; + typedef bool result_type; + + using super::operator(); +}; + +#define BOOST_MULTI_INDEX_CK_RESULT_HASH_SUPER \ +composite_key_hash< \ + BOOST_MULTI_INDEX_CK_ENUM( \ + BOOST_MULTI_INDEX_CK_APPLY_METAFUNCTION_N, \ + /* the argument is a PP list */ \ + (detail::nth_composite_key_hash, \ + (BOOST_DEDUCED_TYPENAME CompositeKeyResult::composite_key_type, \ + BOOST_PP_NIL))) \ + > + +template +struct composite_key_result_hash: +BOOST_MULTI_INDEX_PRIVATE_IF_USING_DECL_FOR_TEMPL_FUNCTIONS +BOOST_MULTI_INDEX_CK_RESULT_HASH_SUPER +{ +private: + typedef BOOST_MULTI_INDEX_CK_RESULT_HASH_SUPER super; + +public: + typedef CompositeKeyResult argument_type; + typedef std::size_t result_type; + + using super::operator(); +}; + +} /* namespace multi_index */ + +} /* namespace boost */ + +/* Specializations of std::equal_to, std::less, std::greater and boost::hash + * for composite_key_results enabling interoperation with tuples of values. + */ + +namespace std{ + +template +struct equal_to >: + boost::multi_index::composite_key_result_equal_to< + boost::multi_index::composite_key_result + > +{ +}; + +template +struct less >: + boost::multi_index::composite_key_result_less< + boost::multi_index::composite_key_result + > +{ +}; + +template +struct greater >: + boost::multi_index::composite_key_result_greater< + boost::multi_index::composite_key_result + > +{ +}; + +} /* namespace std */ + +namespace boost{ + +template +struct hash >: + boost::multi_index::composite_key_result_hash< + boost::multi_index::composite_key_result + > +{ +}; + +} /* namespace boost */ + +#undef BOOST_MULTI_INDEX_CK_RESULT_HASH_SUPER +#undef BOOST_MULTI_INDEX_CK_RESULT_GREATER_SUPER +#undef BOOST_MULTI_INDEX_CK_RESULT_LESS_SUPER +#undef BOOST_MULTI_INDEX_CK_RESULT_EQUAL_TO_SUPER +#undef BOOST_MULTI_INDEX_CK_COMPLETE_COMP_OPS +#undef BOOST_MULTI_INDEX_CK_IDENTITY_ENUM_MACRO +#undef BOOST_MULTI_INDEX_CK_NTH_COMPOSITE_KEY_FUNCTOR +#undef BOOST_MULTI_INDEX_CK_APPLY_METAFUNCTION_N +#undef BOOST_MULTI_INDEX_CK_CTOR_ARG +#undef BOOST_MULTI_INDEX_CK_TEMPLATE_PARM +#undef BOOST_MULTI_INDEX_CK_ENUM_PARAMS +#undef BOOST_MULTI_INDEX_CK_ENUM +#undef BOOST_MULTI_INDEX_COMPOSITE_KEY_SIZE + +#endif diff --git a/boost/multi_index/detail/cons_stdtuple.hpp b/boost/multi_index/detail/cons_stdtuple.hpp new file mode 100644 index 000000000..855c5e06a --- /dev/null +++ b/boost/multi_index/detail/cons_stdtuple.hpp @@ -0,0 +1,93 @@ +/* Copyright 2003-2014 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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_DETAIL_CONS_STDTUPLE_HPP +#define BOOST_MULTI_INDEX_DETAIL_CONS_STDTUPLE_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include /* keep it first to prevent nasty warns in MSVC */ +#include +#include +#include + +namespace boost{ + +namespace multi_index{ + +namespace detail{ + +/* std::tuple wrapper providing the cons-based interface of boost::tuple for + * composite_key interoperability. + */ + +template +struct cons_stdtuple; + +struct cons_stdtuple_ctor_terminal +{ + typedef boost::tuples::null_type result_type; + + template + static result_type create(const StdTuple&) + { + return boost::tuples::null_type(); + } +}; + +template +struct cons_stdtuple_ctor_normal +{ + typedef cons_stdtuple result_type; + + static result_type create(const StdTuple& t) + { + return result_type(t); + } +}; + +template +struct cons_stdtuple_ctor: + boost::mpl::if_c< + N::value, + cons_stdtuple_ctor_normal, + cons_stdtuple_ctor_terminal + >::type +{}; + +template +struct cons_stdtuple +{ + typedef typename std::tuple_element::type head_type; + typedef cons_stdtuple_ctor tail_ctor; + typedef typename tail_ctor::result_type tail_type; + + cons_stdtuple(const StdTuple& t_):t(t_){} + + const head_type& get_head()const{return std::get(t);} + tail_type get_tail()const{return tail_ctor::create(t);} + + const StdTuple& t; +}; + +template +typename cons_stdtuple_ctor::result_type +make_cons_stdtuple(const StdTuple& t) +{ + return cons_stdtuple_ctor::create(t); +} + +} /* namespace multi_index::detail */ + +} /* namespace multi_index */ + +} /* namespace boost */ + +#endif diff --git a/boost/multi_index/detail/rnd_index_loader.hpp b/boost/multi_index/detail/rnd_index_loader.hpp new file mode 100644 index 000000000..4b00345a6 --- /dev/null +++ b/boost/multi_index/detail/rnd_index_loader.hpp @@ -0,0 +1,173 @@ +/* Copyright 2003-2013 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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_DETAIL_RND_INDEX_LOADER_HPP +#define BOOST_MULTI_INDEX_DETAIL_RND_INDEX_LOADER_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include /* keep it first to prevent nasty warns in MSVC */ +#include +#include +#include +#include +#include +#include + +namespace boost{ + +namespace multi_index{ + +namespace detail{ + +/* This class implements a serialization rearranger for random access + * indices. In order to achieve O(n) performance, the following strategy + * is followed: the nodes of the index are handled as if in a bidirectional + * list, where the next pointers are stored in the original + * random_access_index_ptr_array and the prev pointers are stored in + * an auxiliary array. Rearranging of nodes in such a bidirectional list + * is constant time. Once all the arrangements are performed (on destruction + * time) the list is traversed in reverse order and + * pointers are swapped and set accordingly so that they recover its + * original semantics ( *(node->up())==node ) while retaining the + * new order. + */ + +template +class random_access_index_loader_base:private noncopyable +{ +protected: + typedef random_access_index_node_impl< + typename boost::detail::allocator::rebind_to< + Allocator, + char + >::type + > node_impl_type; + typedef typename node_impl_type::pointer node_impl_pointer; + typedef random_access_index_ptr_array ptr_array; + + random_access_index_loader_base(const Allocator& al_,ptr_array& ptrs_): + al(al_), + ptrs(ptrs_), + header(*ptrs.end()), + prev_spc(al,0), + preprocessed(false) + {} + + ~random_access_index_loader_base() + { + if(preprocessed) + { + node_impl_pointer n=header; + next(n)=n; + + for(std::size_t i=ptrs.size();i--;){ + n=prev(n); + std::size_t d=position(n); + if(d!=i){ + node_impl_pointer m=prev(next_at(i)); + std::swap(m->up(),n->up()); + next_at(d)=next_at(i); + std::swap(prev_at(d),prev_at(i)); + } + next(n)=n; + } + } + } + + void rearrange(node_impl_pointer position_,node_impl_pointer x) + { + preprocess(); /* only incur this penalty if rearrange() is ever called */ + if(position_==node_impl_pointer(0))position_=header; + next(prev(x))=next(x); + prev(next(x))=prev(x); + prev(x)=position_; + next(x)=next(position_); + next(prev(x))=prev(next(x))=x; + } + +private: + void preprocess() + { + if(!preprocessed){ + /* get space for the auxiliary prev array */ + auto_space tmp(al,ptrs.size()+1); + prev_spc.swap(tmp); + + /* prev_spc elements point to the prev nodes */ + std::rotate_copy( + &*ptrs.begin(),&*ptrs.end(),&*ptrs.end()+1,&*prev_spc.data()); + + /* ptrs elements point to the next nodes */ + std::rotate(&*ptrs.begin(),&*ptrs.begin()+1,&*ptrs.end()+1); + + preprocessed=true; + } + } + + std::size_t position(node_impl_pointer x)const + { + return (std::size_t)(x->up()-ptrs.begin()); + } + + node_impl_pointer& next_at(std::size_t n)const + { + return *ptrs.at(n); + } + + node_impl_pointer& prev_at(std::size_t n)const + { + return *(prev_spc.data()+n); + } + + node_impl_pointer& next(node_impl_pointer x)const + { + return *(x->up()); + } + + node_impl_pointer& prev(node_impl_pointer x)const + { + return prev_at(position(x)); + } + + Allocator al; + ptr_array& ptrs; + node_impl_pointer header; + auto_space prev_spc; + bool preprocessed; +}; + +template +class random_access_index_loader: + private random_access_index_loader_base +{ + typedef random_access_index_loader_base super; + typedef typename super::node_impl_pointer node_impl_pointer; + typedef typename super::ptr_array ptr_array; + +public: + random_access_index_loader(const Allocator& al_,ptr_array& ptrs_): + super(al_,ptrs_) + {} + + void rearrange(Node* position_,Node *x) + { + super::rearrange( + position_?position_->impl():node_impl_pointer(0),x->impl()); + } +}; + +} /* namespace multi_index::detail */ + +} /* namespace multi_index */ + +} /* namespace boost */ + +#endif diff --git a/boost/multi_index/detail/rnd_index_node.hpp b/boost/multi_index/detail/rnd_index_node.hpp new file mode 100644 index 000000000..ad61ea25d --- /dev/null +++ b/boost/multi_index/detail/rnd_index_node.hpp @@ -0,0 +1,273 @@ +/* Copyright 2003-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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_DETAIL_RND_INDEX_NODE_HPP +#define BOOST_MULTI_INDEX_DETAIL_RND_INDEX_NODE_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include /* keep it first to prevent nasty warns in MSVC */ +#include +#include +#include +#include +#include +#include + +namespace boost{ + +namespace multi_index{ + +namespace detail{ + +template +struct random_access_index_node_impl +{ + typedef typename + boost::detail::allocator::rebind_to< + Allocator,random_access_index_node_impl + >::type::pointer pointer; + typedef typename + boost::detail::allocator::rebind_to< + Allocator,random_access_index_node_impl + >::type::const_pointer const_pointer; + typedef typename + boost::detail::allocator::rebind_to< + Allocator,pointer + >::type::pointer ptr_pointer; + + ptr_pointer& up(){return up_;} + ptr_pointer up()const{return up_;} + + /* interoperability with rnd_node_iterator */ + + static void increment(pointer& x) + { + x=*(x->up()+1); + } + + static void decrement(pointer& x) + { + x=*(x->up()-1); + } + + static void advance(pointer& x,std::ptrdiff_t n) + { + x=*(x->up()+n); + } + + static std::ptrdiff_t distance(pointer x,pointer y) + { + return y->up()-x->up(); + } + + /* algorithmic stuff */ + + static void relocate(ptr_pointer pos,ptr_pointer x) + { + pointer n=*x; + if(xup()=pos-1; + } + else{ + while(x!=pos){ + *x=*(x-1); + (*x)->up()=x; + --x; + } + *pos=n; + n->up()=pos; + } + }; + + static void relocate(ptr_pointer pos,ptr_pointer first,ptr_pointer last) + { + ptr_pointer begin,middle,end; + if(posup()=begin+j; + break; + } + else{ + *(begin+j)=*(begin+k); + (*(begin+j))->up()=begin+j; + } + + if(kup()=begin+k; + break; + } + else{ + *(begin+k)=*(begin+j); + (*(begin+k))->up()=begin+k; + } + } + } + }; + + static void extract(ptr_pointer x,ptr_pointer pend) + { + --pend; + while(x!=pend){ + *x=*(x+1); + (*x)->up()=x; + ++x; + } + } + + static void transfer( + ptr_pointer pbegin0,ptr_pointer pend0,ptr_pointer pbegin1) + { + while(pbegin0!=pend0){ + *pbegin1=*pbegin0++; + (*pbegin1)->up()=pbegin1; + ++pbegin1; + } + } + + static void reverse(ptr_pointer pbegin,ptr_pointer pend) + { + std::ptrdiff_t d=(pend-pbegin)/2; + for(std::ptrdiff_t i=0;iup()=pbegin; + (*pend)->up()=pend; + ++pbegin; + } + } + +private: + ptr_pointer up_; +}; + +template +struct random_access_index_node_trampoline: + random_access_index_node_impl< + typename boost::detail::allocator::rebind_to< + typename Super::allocator_type, + char + >::type + > +{ + typedef random_access_index_node_impl< + typename boost::detail::allocator::rebind_to< + typename Super::allocator_type, + char + >::type + > impl_type; +}; + +template +struct random_access_index_node: + Super,random_access_index_node_trampoline +{ +private: + typedef random_access_index_node_trampoline trampoline; + +public: + typedef typename trampoline::impl_type impl_type; + typedef typename trampoline::pointer impl_pointer; + typedef typename trampoline::const_pointer const_impl_pointer; + typedef typename trampoline::ptr_pointer impl_ptr_pointer; + + impl_ptr_pointer& up(){return trampoline::up();} + impl_ptr_pointer up()const{return trampoline::up();} + + impl_pointer impl() + { + return static_cast( + static_cast(static_cast(this))); + } + + const_impl_pointer impl()const + { + return static_cast( + static_cast(static_cast(this))); + } + + static random_access_index_node* from_impl(impl_pointer x) + { + return + static_cast( + static_cast( + raw_ptr(x))); + } + + static const random_access_index_node* from_impl(const_impl_pointer x) + { + return + static_cast( + static_cast( + raw_ptr(x))); + } + + /* interoperability with rnd_node_iterator */ + + static void increment(random_access_index_node*& x) + { + impl_pointer xi=x->impl(); + trampoline::increment(xi); + x=from_impl(xi); + } + + static void decrement(random_access_index_node*& x) + { + impl_pointer xi=x->impl(); + trampoline::decrement(xi); + x=from_impl(xi); + } + + static void advance(random_access_index_node*& x,std::ptrdiff_t n) + { + impl_pointer xi=x->impl(); + trampoline::advance(xi,n); + x=from_impl(xi); + } + + static std::ptrdiff_t distance( + random_access_index_node* x,random_access_index_node* y) + { + return trampoline::distance(x->impl(),y->impl()); + } +}; + +} /* namespace multi_index::detail */ + +} /* namespace multi_index */ + +} /* namespace boost */ + +#endif diff --git a/boost/multi_index/detail/rnd_index_ops.hpp b/boost/multi_index/detail/rnd_index_ops.hpp new file mode 100644 index 000000000..f5e76e444 --- /dev/null +++ b/boost/multi_index/detail/rnd_index_ops.hpp @@ -0,0 +1,203 @@ +/* Copyright 2003-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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_DETAIL_RND_INDEX_OPS_HPP +#define BOOST_MULTI_INDEX_DETAIL_RND_INDEX_OPS_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include /* keep it first to prevent nasty warns in MSVC */ +#include +#include + +namespace boost{ + +namespace multi_index{ + +namespace detail{ + +/* Common code for random_access_index memfuns having templatized and + * non-templatized versions. + */ + +template +Node* random_access_index_remove( + random_access_index_ptr_array& ptrs,Predicate pred) +{ + typedef typename Node::value_type value_type; + typedef typename Node::impl_ptr_pointer impl_ptr_pointer; + + impl_ptr_pointer first=ptrs.begin(), + res=first, + last=ptrs.end(); + for(;first!=last;++first){ + if(!pred( + const_cast(Node::from_impl(*first)->value()))){ + if(first!=res){ + std::swap(*first,*res); + (*first)->up()=first; + (*res)->up()=res; + } + ++res; + } + } + return Node::from_impl(*res); +} + +template +Node* random_access_index_unique( + random_access_index_ptr_array& ptrs,BinaryPredicate binary_pred) +{ + typedef typename Node::value_type value_type; + typedef typename Node::impl_ptr_pointer impl_ptr_pointer; + + impl_ptr_pointer first=ptrs.begin(), + res=first, + last=ptrs.end(); + if(first!=last){ + for(;++first!=last;){ + if(!binary_pred( + const_cast(Node::from_impl(*res)->value()), + const_cast(Node::from_impl(*first)->value()))){ + ++res; + if(first!=res){ + std::swap(*first,*res); + (*first)->up()=first; + (*res)->up()=res; + } + } + } + ++res; + } + return Node::from_impl(*res); +} + +template +void random_access_index_inplace_merge( + const Allocator& al, + random_access_index_ptr_array& ptrs, + BOOST_DEDUCED_TYPENAME Node::impl_ptr_pointer first1,Compare comp) +{ + typedef typename Node::value_type value_type; + typedef typename Node::impl_pointer impl_pointer; + typedef typename Node::impl_ptr_pointer impl_ptr_pointer; + + auto_space spc(al,ptrs.size()); + + impl_ptr_pointer first0=ptrs.begin(), + last0=first1, + last1=ptrs.end(), + out=spc.data(); + while(first0!=last0&&first1!=last1){ + if(comp( + const_cast(Node::from_impl(*first1)->value()), + const_cast(Node::from_impl(*first0)->value()))){ + *out++=*first1++; + } + else{ + *out++=*first0++; + } + } + std::copy(&*first0,&*last0,&*out); + std::copy(&*first1,&*last1,&*out); + + first1=ptrs.begin(); + out=spc.data(); + while(first1!=last1){ + *first1=*out++; + (*first1)->up()=first1; + ++first1; + } +} + +/* sorting */ + +/* auxiliary stuff */ + +template +struct random_access_index_sort_compare +{ + typedef typename Node::impl_pointer first_argument_type; + typedef typename Node::impl_pointer second_argument_type; + typedef bool result_type; + + random_access_index_sort_compare(Compare comp_=Compare()):comp(comp_){} + + bool operator()( + typename Node::impl_pointer x,typename Node::impl_pointer y)const + { + typedef typename Node::value_type value_type; + + return comp( + const_cast(Node::from_impl(x)->value()), + const_cast(Node::from_impl(y)->value())); + } + +private: + Compare comp; +}; + +template +void random_access_index_sort( + const Allocator& al, + random_access_index_ptr_array& ptrs, + Compare comp) +{ + /* The implementation is extremely simple: an auxiliary + * array of pointers is sorted using stdlib facilities and + * then used to rearrange the index. This is suboptimal + * in space and time, but has some advantages over other + * possible approaches: + * - Use std::stable_sort() directly on ptrs using some + * special iterator in charge of maintaining pointers + * and up() pointers in sync: we cannot guarantee + * preservation of the container invariants in the face of + * exceptions, if, for instance, std::stable_sort throws + * when ptrs transitorily contains duplicate elements. + * - Rewrite the internal algorithms of std::stable_sort + * adapted for this case: besides being a fair amount of + * work, making a stable sort compatible with Boost.MultiIndex + * invariants (basically, no duplicates or missing elements + * even if an exception is thrown) is complicated, error-prone + * and possibly won't perform much better than the + * solution adopted. + */ + + if(ptrs.size()<=1)return; + + typedef typename Node::impl_pointer impl_pointer; + typedef typename Node::impl_ptr_pointer impl_ptr_pointer; + typedef random_access_index_sort_compare< + Node,Compare> ptr_compare; + + impl_ptr_pointer first=ptrs.begin(); + impl_ptr_pointer last=ptrs.end(); + auto_space< + impl_pointer, + Allocator> spc(al,ptrs.size()); + impl_ptr_pointer buf=spc.data(); + + std::copy(&*first,&*last,&*buf); + std::stable_sort(&*buf,&*buf+ptrs.size(),ptr_compare(comp)); + + while(first!=last){ + *first=*buf++; + (*first)->up()=first; + ++first; + } +} + +} /* namespace multi_index::detail */ + +} /* namespace multi_index */ + +} /* namespace boost */ + +#endif diff --git a/boost/multi_index/detail/rnd_index_ptr_array.hpp b/boost/multi_index/detail/rnd_index_ptr_array.hpp new file mode 100644 index 000000000..bae1c851b --- /dev/null +++ b/boost/multi_index/detail/rnd_index_ptr_array.hpp @@ -0,0 +1,144 @@ +/* Copyright 2003-2013 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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_DETAIL_RND_INDEX_PTR_ARRAY_HPP +#define BOOST_MULTI_INDEX_DETAIL_RND_INDEX_PTR_ARRAY_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include /* keep it first to prevent nasty warns in MSVC */ +#include +#include +#include +#include +#include +#include + +namespace boost{ + +namespace multi_index{ + +namespace detail{ + +/* pointer structure for use by random access indices */ + +template +class random_access_index_ptr_array:private noncopyable +{ + typedef random_access_index_node_impl< + typename boost::detail::allocator::rebind_to< + Allocator, + char + >::type + > node_impl_type; + +public: + typedef typename node_impl_type::pointer value_type; + typedef typename boost::detail::allocator::rebind_to< + Allocator,value_type + >::type::pointer pointer; + + random_access_index_ptr_array( + const Allocator& al,value_type end_,std::size_t sz): + size_(sz), + capacity_(sz), + spc(al,capacity_+1) + { + *end()=end_; + end_->up()=end(); + } + + std::size_t size()const{return size_;} + std::size_t capacity()const{return capacity_;} + + void room_for_one() + { + if(size_==capacity_){ + reserve(capacity_<=10?15:capacity_+capacity_/2); + } + } + + void reserve(std::size_t c) + { + if(c>capacity_)set_capacity(c); + } + + void shrink_to_fit() + { + if(capacity_>size_)set_capacity(size_); + } + + pointer begin()const{return ptrs();} + pointer end()const{return ptrs()+size_;} + pointer at(std::size_t n)const{return ptrs()+n;} + + void push_back(value_type x) + { + *(end()+1)=*end(); + (*(end()+1))->up()=end()+1; + *end()=x; + (*end())->up()=end(); + ++size_; + } + + void erase(value_type x) + { + node_impl_type::extract(x->up(),end()+1); + --size_; + } + + void clear() + { + *begin()=*end(); + (*begin())->up()=begin(); + size_=0; + } + + void swap(random_access_index_ptr_array& x) + { + std::swap(size_,x.size_); + std::swap(capacity_,x.capacity_); + spc.swap(x.spc); + } + +private: + std::size_t size_; + std::size_t capacity_; + auto_space spc; + + pointer ptrs()const + { + return spc.data(); + } + + void set_capacity(std::size_t c) + { + auto_space spc1(spc.get_allocator(),c+1); + node_impl_type::transfer(begin(),end()+1,spc1.data()); + spc.swap(spc1); + capacity_=c; + } +}; + +template +void swap( + random_access_index_ptr_array& x, + random_access_index_ptr_array& y) +{ + x.swap(y); +} + +} /* namespace multi_index::detail */ + +} /* namespace multi_index */ + +} /* namespace boost */ + +#endif diff --git a/boost/multi_index/detail/rnd_node_iterator.hpp b/boost/multi_index/detail/rnd_node_iterator.hpp new file mode 100644 index 000000000..48026132f --- /dev/null +++ b/boost/multi_index/detail/rnd_node_iterator.hpp @@ -0,0 +1,140 @@ +/* Copyright 2003-2014 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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_DETAIL_RND_NODE_ITERATOR_HPP +#define BOOST_MULTI_INDEX_DETAIL_RND_NODE_ITERATOR_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include /* keep it first to prevent nasty warns in MSVC */ +#include + +#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION) +#include +#include +#endif + +namespace boost{ + +namespace multi_index{ + +namespace detail{ + +/* Iterator class for node-based indices with random access iterators. */ + +template +class rnd_node_iterator: + public random_access_iterator_helper< + rnd_node_iterator, + typename Node::value_type, + std::ptrdiff_t, + const typename Node::value_type*, + const typename Node::value_type&> +{ +public: + /* coverity[uninit_ctor]: suppress warning */ + rnd_node_iterator(){} + explicit rnd_node_iterator(Node* node_):node(node_){} + + const typename Node::value_type& operator*()const + { + return node->value(); + } + + rnd_node_iterator& operator++() + { + Node::increment(node); + return *this; + } + + rnd_node_iterator& operator--() + { + Node::decrement(node); + return *this; + } + + rnd_node_iterator& operator+=(std::ptrdiff_t n) + { + Node::advance(node,n); + return *this; + } + + rnd_node_iterator& operator-=(std::ptrdiff_t n) + { + Node::advance(node,-n); + return *this; + } + +#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION) + /* Serialization. As for why the following is public, + * see explanation in safe_mode_iterator notes in safe_mode.hpp. + */ + + BOOST_SERIALIZATION_SPLIT_MEMBER() + + typedef typename Node::base_type node_base_type; + + template + void save(Archive& ar,const unsigned int)const + { + node_base_type* bnode=node; + ar< + void load(Archive& ar,const unsigned int) + { + node_base_type* bnode; + ar>>serialization::make_nvp("pointer",bnode); + node=static_cast(bnode); + } +#endif + + /* get_node is not to be used by the user */ + + typedef Node node_type; + + Node* get_node()const{return node;} + +private: + Node* node; +}; + +template +bool operator==( + const rnd_node_iterator& x, + const rnd_node_iterator& y) +{ + return x.get_node()==y.get_node(); +} + +template +bool operator<( + const rnd_node_iterator& x, + const rnd_node_iterator& y) +{ + return Node::distance(x.get_node(),y.get_node())>0; +} + +template +std::ptrdiff_t operator-( + const rnd_node_iterator& x, + const rnd_node_iterator& y) +{ + return Node::distance(y.get_node(),x.get_node()); +} + +} /* namespace multi_index::detail */ + +} /* namespace multi_index */ + +} /* namespace boost */ + +#endif diff --git a/boost/multi_index/detail/rnk_index_ops.hpp b/boost/multi_index/detail/rnk_index_ops.hpp new file mode 100644 index 000000000..275642236 --- /dev/null +++ b/boost/multi_index/detail/rnk_index_ops.hpp @@ -0,0 +1,300 @@ +/* Copyright 2003-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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_DETAIL_RNK_INDEX_OPS_HPP +#define BOOST_MULTI_INDEX_DETAIL_RNK_INDEX_OPS_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include /* keep it first to prevent nasty warns in MSVC */ +#include +#include +#include +#include + +namespace boost{ + +namespace multi_index{ + +namespace detail{ + +/* Common code for ranked_index memfuns having templatized and + * non-templatized versions. + */ + +template +inline std::size_t ranked_node_size(Pointer x) +{ + return x!=Pointer(0)?x->size:0; +} + +template +inline Pointer ranked_index_nth(std::size_t n,Pointer end_) +{ + Pointer top=end_->parent(); + if(top==Pointer(0)||n>=top->size)return end_; + + for(;;){ + std::size_t s=ranked_node_size(top->left()); + if(n==s)return top; + if(nleft(); + else{ + top=top->right(); + n-=s+1; + } + } +} + +template +inline std::size_t ranked_index_rank(Pointer x,Pointer end_) +{ + Pointer top=end_->parent(); + if(top==Pointer(0))return 0; + if(x==end_)return top->size; + + std::size_t s=ranked_node_size(x->left()); + while(x!=top){ + Pointer z=x->parent(); + if(x==z->right()){ + s+=ranked_node_size(z->left())+1; + } + x=z; + } + return s; +} + +template< + typename Node,typename KeyFromValue, + typename CompatibleKey,typename CompatibleCompare +> +inline std::size_t ranked_index_find_rank( + Node* top,Node* y,const KeyFromValue& key,const CompatibleKey& x, + const CompatibleCompare& comp) +{ + typedef typename KeyFromValue::result_type key_type; + + return ranked_index_find_rank( + top,y,key,x,comp, + mpl::and_< + promotes_1st_arg, + promotes_2nd_arg >()); +} + +template< + typename Node,typename KeyFromValue, + typename CompatibleCompare +> +inline std::size_t ranked_index_find_rank( + Node* top,Node* y,const KeyFromValue& key, + const BOOST_DEDUCED_TYPENAME KeyFromValue::result_type& x, + const CompatibleCompare& comp,mpl::true_) +{ + return ranked_index_find_rank(top,y,key,x,comp,mpl::false_()); +} + +template< + typename Node,typename KeyFromValue, + typename CompatibleKey,typename CompatibleCompare +> +inline std::size_t ranked_index_find_rank( + Node* top,Node* y,const KeyFromValue& key,const CompatibleKey& x, + const CompatibleCompare& comp,mpl::false_) +{ + if(!top)return 0; + + std::size_t s=top->size, + s0=s; + Node* y0=y; + + do{ + if(!comp(key(top->value()),x)){ + y=top; + s-=ranked_node_size(y->right())+1; + top=Node::from_impl(top->left()); + } + else top=Node::from_impl(top->right()); + }while(top); + + return (y==y0||comp(x,key(y->value())))?s0:s; +} + +template< + typename Node,typename KeyFromValue, + typename CompatibleKey,typename CompatibleCompare +> +inline std::size_t ranked_index_lower_bound_rank( + Node* top,Node* y,const KeyFromValue& key,const CompatibleKey& x, + const CompatibleCompare& comp) +{ + typedef typename KeyFromValue::result_type key_type; + + return ranked_index_lower_bound_rank( + top,y,key,x,comp, + promotes_2nd_arg()); +} + +template< + typename Node,typename KeyFromValue, + typename CompatibleCompare +> +inline std::size_t ranked_index_lower_bound_rank( + Node* top,Node* y,const KeyFromValue& key, + const BOOST_DEDUCED_TYPENAME KeyFromValue::result_type& x, + const CompatibleCompare& comp,mpl::true_) +{ + return ranked_index_lower_bound_rank(top,y,key,x,comp,mpl::false_()); +} + +template< + typename Node,typename KeyFromValue, + typename CompatibleKey,typename CompatibleCompare +> +inline std::size_t ranked_index_lower_bound_rank( + Node* top,Node* y,const KeyFromValue& key,const CompatibleKey& x, + const CompatibleCompare& comp,mpl::false_) +{ + if(!top)return 0; + + std::size_t s=top->size; + + do{ + if(!comp(key(top->value()),x)){ + y=top; + s-=ranked_node_size(y->right())+1; + top=Node::from_impl(top->left()); + } + else top=Node::from_impl(top->right()); + }while(top); + + return s; +} + +template< + typename Node,typename KeyFromValue, + typename CompatibleKey,typename CompatibleCompare +> +inline std::size_t ranked_index_upper_bound_rank( + Node* top,Node* y,const KeyFromValue& key,const CompatibleKey& x, + const CompatibleCompare& comp) +{ + typedef typename KeyFromValue::result_type key_type; + + return ranked_index_upper_bound_rank( + top,y,key,x,comp, + promotes_1st_arg()); +} + +template< + typename Node,typename KeyFromValue, + typename CompatibleCompare +> +inline std::size_t ranked_index_upper_bound_rank( + Node* top,Node* y,const KeyFromValue& key, + const BOOST_DEDUCED_TYPENAME KeyFromValue::result_type& x, + const CompatibleCompare& comp,mpl::true_) +{ + return ranked_index_upper_bound_rank(top,y,key,x,comp,mpl::false_()); +} + +template< + typename Node,typename KeyFromValue, + typename CompatibleKey,typename CompatibleCompare +> +inline std::size_t ranked_index_upper_bound_rank( + Node* top,Node* y,const KeyFromValue& key,const CompatibleKey& x, + const CompatibleCompare& comp,mpl::false_) +{ + if(!top)return 0; + + std::size_t s=top->size; + + do{ + if(comp(x,key(top->value()))){ + y=top; + s-=ranked_node_size(y->right())+1; + top=Node::from_impl(top->left()); + } + else top=Node::from_impl(top->right()); + }while(top); + + return s; +} + +template< + typename Node,typename KeyFromValue, + typename CompatibleKey,typename CompatibleCompare +> +inline std::pair ranked_index_equal_range_rank( + Node* top,Node* y,const KeyFromValue& key,const CompatibleKey& x, + const CompatibleCompare& comp) +{ + typedef typename KeyFromValue::result_type key_type; + + return ranked_index_equal_range_rank( + top,y,key,x,comp, + mpl::and_< + promotes_1st_arg, + promotes_2nd_arg >()); +} + +template< + typename Node,typename KeyFromValue, + typename CompatibleCompare +> +inline std::pair ranked_index_equal_range_rank( + Node* top,Node* y,const KeyFromValue& key, + const BOOST_DEDUCED_TYPENAME KeyFromValue::result_type& x, + const CompatibleCompare& comp,mpl::true_) +{ + return ranked_index_equal_range_rank(top,y,key,x,comp,mpl::false_()); +} + +template< + typename Node,typename KeyFromValue, + typename CompatibleKey,typename CompatibleCompare +> +inline std::pair ranked_index_equal_range_rank( + Node* top,Node* y,const KeyFromValue& key,const CompatibleKey& x, + const CompatibleCompare& comp,mpl::false_) +{ + if(!top)return std::pair(0,0); + + std::size_t s=top->size; + + do{ + if(comp(key(top->value()),x)){ + top=Node::from_impl(top->right()); + } + else if(comp(x,key(top->value()))){ + y=top; + s-=ranked_node_size(y->right())+1; + top=Node::from_impl(top->left()); + } + else{ + return std::pair( + s-top->size+ + ranked_index_lower_bound_rank( + Node::from_impl(top->left()),top,key,x,comp,mpl::false_()), + s-ranked_node_size(top->right())+ + ranked_index_upper_bound_rank( + Node::from_impl(top->right()),y,key,x,comp,mpl::false_())); + } + }while(top); + + return std::pair(s,s); +} + +} /* namespace multi_index::detail */ + +} /* namespace multi_index */ + +} /* namespace boost */ + +#endif diff --git a/boost/multi_index/global_fun.hpp b/boost/multi_index/global_fun.hpp new file mode 100644 index 000000000..2c1376910 --- /dev/null +++ b/boost/multi_index/global_fun.hpp @@ -0,0 +1,185 @@ +/* Copyright 2003-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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_GLOBAL_FUN_HPP +#define BOOST_MULTI_INDEX_GLOBAL_FUN_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include /* keep it first to prevent nasty warns in MSVC */ +#include +#include +#include +#include +#include +#include +#include + +#if !defined(BOOST_NO_SFINAE) +#include +#endif + +namespace boost{ + +template class reference_wrapper; /* fwd decl. */ + +namespace multi_index{ + +namespace detail{ + +/* global_fun is a read-only key extractor from Value based on a given global + * (or static member) function with signature: + * + * Type f([const] Value [&]); + * + * Additionally, global_fun and const_global_fun are overloaded to support + * referece_wrappers of Value and "chained pointers" to Value's. By chained + * pointer to T we mean a type P such that, given a p of Type P + * *...n...*x is convertible to T&, for some n>=1. + * Examples of chained pointers are raw and smart pointers, iterators and + * arbitrary combinations of these (vg. T** or unique_ptr.) + */ + +template +struct const_ref_global_fun_base +{ + typedef typename remove_reference::type result_type; + + template + +#if !defined(BOOST_NO_SFINAE) + typename disable_if< + is_convertible,Type>::type +#else + Type +#endif + + operator()(const ChainedPtr& x)const + { + return operator()(*x); + } + + Type operator()(Value x)const + { + return PtrToFunction(x); + } + + Type operator()( + const reference_wrapper< + typename remove_reference::type>& x)const + { + return operator()(x.get()); + } + + Type operator()( + const reference_wrapper< + typename remove_const< + typename remove_reference::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()); + } +}; + +template +struct non_const_ref_global_fun_base +{ + typedef typename remove_reference::type result_type; + + template + +#if !defined(BOOST_NO_SFINAE) + typename disable_if< + is_convertible,Type>::type +#else + Type +#endif + + operator()(const ChainedPtr& x)const + { + return operator()(*x); + } + + Type operator()(Value x)const + { + return PtrToFunction(x); + } + + Type operator()( + const reference_wrapper< + typename remove_reference::type>& x)const + { + return operator()(x.get()); + } +}; + +template +struct non_ref_global_fun_base +{ + typedef typename remove_reference::type result_type; + + template + +#if !defined(BOOST_NO_SFINAE) + typename disable_if< + is_convertible,Type>::type +#else + Type +#endif + + operator()(const ChainedPtr& x)const + { + return operator()(*x); + } + + Type operator()(const Value& x)const + { + return PtrToFunction(x); + } + + Type operator()(const reference_wrapper& x)const + { + return operator()(x.get()); + } + + Type operator()( + const reference_wrapper::type>& x)const + { + return operator()(x.get()); + } +}; + +} /* namespace multi_index::detail */ + +template +struct global_fun: + mpl::if_c< + is_reference::value, + typename mpl::if_c< + is_const::type>::value, + detail::const_ref_global_fun_base, + detail::non_const_ref_global_fun_base + >::type, + detail::non_ref_global_fun_base + >::type +{ +}; + +} /* namespace multi_index */ + +} /* namespace boost */ + +#endif diff --git a/boost/multi_index/key_extractors.hpp b/boost/multi_index/key_extractors.hpp new file mode 100644 index 000000000..60179ba23 --- /dev/null +++ b/boost/multi_index/key_extractors.hpp @@ -0,0 +1,22 @@ +/* Copyright 2003-2013 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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_KEY_EXTRACTORS_HPP +#define BOOST_MULTI_INDEX_KEY_EXTRACTORS_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include +#include +#include +#include +#include + +#endif diff --git a/boost/multi_index/mem_fun.hpp b/boost/multi_index/mem_fun.hpp new file mode 100644 index 000000000..111c386c5 --- /dev/null +++ b/boost/multi_index/mem_fun.hpp @@ -0,0 +1,205 @@ +/* Copyright 2003-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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_MEM_FUN_HPP +#define BOOST_MULTI_INDEX_MEM_FUN_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include /* keep it first to prevent nasty warns in MSVC */ +#include +#include +#include + +#if !defined(BOOST_NO_SFINAE) +#include +#endif + +namespace boost{ + +template class reference_wrapper; /* fwd decl. */ + +namespace multi_index{ + +/* mem_fun implements a read-only key extractor based on a given non-const + * member function of a class. + * const_mem_fun does the same for const member functions. + * Additionally, mem_fun and const_mem_fun are overloaded to support + * referece_wrappers of T and "chained pointers" to T's. By chained pointer + * to T we mean a type P such that, given a p of Type P + * *...n...*x is convertible to T&, for some n>=1. + * Examples of chained pointers are raw and smart pointers, iterators and + * arbitrary combinations of these (vg. T** or unique_ptr.) + */ + +template +struct const_mem_fun +{ + typedef typename remove_reference::type result_type; + + template + +#if !defined(BOOST_NO_SFINAE) + typename disable_if< + is_convertible,Type>::type +#else + Type +#endif + + operator()(const ChainedPtr& x)const + { + return operator()(*x); + } + + Type operator()(const Class& x)const + { + return (x.*PtrToMemberFunction)(); + } + + Type operator()(const reference_wrapper& x)const + { + return operator()(x.get()); + } + + Type operator()(const reference_wrapper& x)const + { + return operator()(x.get()); + } +}; + +template +struct mem_fun +{ + typedef typename remove_reference::type result_type; + + template + +#if !defined(BOOST_NO_SFINAE) + typename disable_if< + is_convertible,Type>::type +#else + Type +#endif + + operator()(const ChainedPtr& x)const + { + return operator()(*x); + } + + Type operator()(Class& x)const + { + return (x.*PtrToMemberFunction)(); + } + + Type operator()(const reference_wrapper& x)const + { + return operator()(x.get()); + } +}; + +/* MSVC++ 6.0 has problems with const member functions as non-type template + * parameters, somehow it takes them as non-const. const_mem_fun_explicit + * workarounds this deficiency by accepting an extra type parameter that + * specifies the signature of the member function. The workaround was found at: + * Daniel, C.:"Re: weird typedef problem in VC", + * news:microsoft.public.vc.language, 21st nov 2002, + * http://groups.google.com/groups? + * hl=en&lr=&ie=UTF-8&selm=ukwvg3O0BHA.1512%40tkmsftngp05 + * + * MSVC++ 6.0 support has been dropped and [const_]mem_fun_explicit is + * deprecated. + */ + +template< + class Class,typename Type, + typename PtrToMemberFunctionType,PtrToMemberFunctionType PtrToMemberFunction> +struct const_mem_fun_explicit +{ + typedef typename remove_reference::type result_type; + + template + +#if !defined(BOOST_NO_SFINAE) + typename disable_if< + is_convertible,Type>::type +#else + Type +#endif + + operator()(const ChainedPtr& x)const + { + return operator()(*x); + } + + Type operator()(const Class& x)const + { + return (x.*PtrToMemberFunction)(); + } + + Type operator()(const reference_wrapper& x)const + { + return operator()(x.get()); + } + + Type operator()(const reference_wrapper& x)const + { + return operator()(x.get()); + } +}; + +template< + class Class,typename Type, + typename PtrToMemberFunctionType,PtrToMemberFunctionType PtrToMemberFunction> +struct mem_fun_explicit +{ + typedef typename remove_reference::type result_type; + + template + +#if !defined(BOOST_NO_SFINAE) + typename disable_if< + is_convertible,Type>::type +#else + Type +#endif + + operator()(const ChainedPtr& x)const + { + return operator()(*x); + } + + Type operator()(Class& x)const + { + return (x.*PtrToMemberFunction)(); + } + + Type operator()(const reference_wrapper& x)const + { + return operator()(x.get()); + } +}; + +/* BOOST_MULTI_INDEX_CONST_MEM_FUN and BOOST_MULTI_INDEX_MEM_FUN used to + * resolve to [const_]mem_fun_explicit for MSVC++ 6.0 and to + * [const_]mem_fun otherwise. Support for this compiler having been dropped, + * they are now just wrappers over [const_]mem_fun kept for backwards- + * compatibility reasons. + */ + +#define BOOST_MULTI_INDEX_CONST_MEM_FUN(Class,Type,MemberFunName) \ +::boost::multi_index::const_mem_fun< Class,Type,&Class::MemberFunName > +#define BOOST_MULTI_INDEX_MEM_FUN(Class,Type,MemberFunName) \ +::boost::multi_index::mem_fun< Class,Type,&Class::MemberFunName > + +} /* namespace multi_index */ + +} /* namespace boost */ + +#endif diff --git a/boost/multi_index/random_access_index.hpp b/boost/multi_index/random_access_index.hpp new file mode 100644 index 000000000..fe1884ddd --- /dev/null +++ b/boost/multi_index/random_access_index.hpp @@ -0,0 +1,1167 @@ +/* Copyright 2003-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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_RANDOM_ACCESS_INDEX_HPP +#define BOOST_MULTI_INDEX_RANDOM_ACCESS_INDEX_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include /* keep it first to prevent nasty warns in MSVC */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) +#include +#endif + +#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION) +#include +#endif + +#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING) +#define BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT_OF(x) \ + detail::scope_guard BOOST_JOIN(check_invariant_,__LINE__)= \ + detail::make_obj_guard(x,&random_access_index::check_invariant_); \ + BOOST_JOIN(check_invariant_,__LINE__).touch(); +#define BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT \ + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT_OF(*this) +#else +#define BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT_OF(x) +#define BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT +#endif + +namespace boost{ + +namespace multi_index{ + +namespace detail{ + +/* random_access_index adds a layer of random access indexing + * to a given Super + */ + +template +class random_access_index: + BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS SuperMeta::type + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + ,public safe_mode::safe_container< + random_access_index > +#endif + +{ +#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\ + BOOST_WORKAROUND(__MWERKS__,<=0x3003) +/* The "ISO C++ Template Parser" option in CW8.3 has a problem with the + * lifetime of const references bound to temporaries --precisely what + * scopeguards are. + */ + +#pragma parse_mfunc_templ off +#endif + + typedef typename SuperMeta::type super; + +protected: + typedef random_access_index_node< + typename super::node_type> node_type; + +private: + typedef typename node_type::impl_type node_impl_type; + typedef random_access_index_ptr_array< + typename super::final_allocator_type> ptr_array; + typedef typename ptr_array::pointer node_impl_ptr_pointer; + +public: + /* types */ + + typedef typename node_type::value_type value_type; + typedef tuples::null_type ctor_args; + typedef typename super::final_allocator_type allocator_type; + typedef typename allocator_type::reference reference; + typedef typename allocator_type::const_reference const_reference; + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + typedef safe_mode::safe_iterator< + rnd_node_iterator, + random_access_index> iterator; +#else + typedef rnd_node_iterator iterator; +#endif + + typedef iterator const_iterator; + + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + typedef typename allocator_type::pointer pointer; + typedef typename allocator_type::const_pointer const_pointer; + typedef typename + boost::reverse_iterator reverse_iterator; + typedef typename + boost::reverse_iterator const_reverse_iterator; + typedef TagList tag_list; + +protected: + typedef typename super::final_node_type final_node_type; + typedef tuples::cons< + ctor_args, + typename super::ctor_args_list> ctor_args_list; + typedef typename mpl::push_front< + typename super::index_type_list, + random_access_index>::type index_type_list; + typedef typename mpl::push_front< + typename super::iterator_type_list, + iterator>::type iterator_type_list; + typedef typename mpl::push_front< + typename super::const_iterator_type_list, + const_iterator>::type const_iterator_type_list; + typedef typename super::copy_map_type copy_map_type; + +#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION) + typedef typename super::index_saver_type index_saver_type; + typedef typename super::index_loader_type index_loader_type; +#endif + +private: +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + typedef safe_mode::safe_container< + random_access_index> safe_super; +#endif + + typedef typename call_traits< + value_type>::param_type value_param_type; + + /* Needed to avoid commas in BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL + * expansion. + */ + + typedef std::pair emplace_return_type; + +public: + + /* construct/copy/destroy + * Default and copy ctors are in the protected section as indices are + * not supposed to be created on their own. No range ctor either. + */ + + random_access_index& operator=( + const random_access_index& x) + { + this->final()=x.final(); + return *this; + } + +#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) + random_access_index& operator=( + std::initializer_list list) + { + this->final()=list; + return *this; + } +#endif + + template + void assign(InputIterator first,InputIterator last) + { + assign_iter(first,last,mpl::not_ >()); + } + +#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) + void assign(std::initializer_list list) + { + assign(list.begin(),list.end()); + } +#endif + + void assign(size_type n,value_param_type value) + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + clear(); + for(size_type i=0;ifinal().get_allocator(); + } + + /* iterators */ + + iterator begin()BOOST_NOEXCEPT + {return make_iterator(node_type::from_impl(*ptrs.begin()));} + const_iterator begin()const BOOST_NOEXCEPT + {return make_iterator(node_type::from_impl(*ptrs.begin()));} + iterator + end()BOOST_NOEXCEPT{return make_iterator(header());} + const_iterator + end()const BOOST_NOEXCEPT{return make_iterator(header());} + reverse_iterator + rbegin()BOOST_NOEXCEPT{return boost::make_reverse_iterator(end());} + const_reverse_iterator + rbegin()const BOOST_NOEXCEPT{return boost::make_reverse_iterator(end());} + reverse_iterator + rend()BOOST_NOEXCEPT{return boost::make_reverse_iterator(begin());} + const_reverse_iterator + rend()const BOOST_NOEXCEPT{return boost::make_reverse_iterator(begin());} + const_iterator + cbegin()const BOOST_NOEXCEPT{return begin();} + const_iterator + cend()const BOOST_NOEXCEPT{return end();} + const_reverse_iterator + crbegin()const BOOST_NOEXCEPT{return rbegin();} + const_reverse_iterator + crend()const BOOST_NOEXCEPT{return rend();} + + iterator iterator_to(const value_type& x) + { + return make_iterator(node_from_value(&x)); + } + + const_iterator iterator_to(const value_type& x)const + { + return make_iterator(node_from_value(&x)); + } + + /* capacity */ + + bool empty()const BOOST_NOEXCEPT{return this->final_empty_();} + size_type size()const BOOST_NOEXCEPT{return this->final_size_();} + size_type max_size()const BOOST_NOEXCEPT{return this->final_max_size_();} + size_type capacity()const BOOST_NOEXCEPT{return ptrs.capacity();} + + void reserve(size_type n) + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + ptrs.reserve(n); + } + + void shrink_to_fit() + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + ptrs.shrink_to_fit(); + } + + void resize(size_type n) + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + if(n>size()) + for(size_type m=n-size();m--;) + this->final_emplace_(BOOST_MULTI_INDEX_NULL_PARAM_PACK); + else if(nsize())for(size_type m=n-size();m--;)this->final_insert_(x); + else if(nvalue(); + } + + const_reference at(size_type n)const + { + if(n>=size())throw_exception(std::out_of_range("random access index")); + return node_type::from_impl(*ptrs.at(n))->value(); + } + + const_reference front()const{return operator[](0);} + const_reference back()const{return operator[](size()-1);} + + /* modifiers */ + + BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL( + emplace_return_type,emplace_front,emplace_front_impl) + + std::pair push_front(const value_type& x) + {return insert(begin(),x);} + std::pair push_front(BOOST_RV_REF(value_type) x) + {return insert(begin(),boost::move(x));} + void pop_front(){erase(begin());} + + BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL( + emplace_return_type,emplace_back,emplace_back_impl) + + std::pair push_back(const value_type& x) + {return insert(end(),x);} + std::pair push_back(BOOST_RV_REF(value_type) x) + {return insert(end(),boost::move(x));} + void pop_back(){erase(--end());} + + BOOST_MULTI_INDEX_OVERLOADS_TO_VARTEMPL_EXTRA_ARG( + emplace_return_type,emplace,emplace_impl,iterator,position) + + std::pair insert(iterator position,const value_type& x) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + std::pair p=this->final_insert_(x); + if(p.second&&position.get_node()!=header()){ + relocate(position.get_node(),p.first); + } + return std::pair(make_iterator(p.first),p.second); + } + + std::pair insert(iterator position,BOOST_RV_REF(value_type) x) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + std::pair p=this->final_insert_rv_(x); + if(p.second&&position.get_node()!=header()){ + relocate(position.get_node(),p.first); + } + return std::pair(make_iterator(p.first),p.second); + } + + void insert(iterator position,size_type n,value_param_type x) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + size_type s=0; + BOOST_TRY{ + while(n--){ + if(push_back(x).second)++s; + } + } + BOOST_CATCH(...){ + relocate(position,end()-s,end()); + BOOST_RETHROW; + } + BOOST_CATCH_END + relocate(position,end()-s,end()); + } + + template + void insert(iterator position,InputIterator first,InputIterator last) + { + insert_iter(position,first,last,mpl::not_ >()); + } + +#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) + void insert(iterator position,std::initializer_list list) + { + insert(position,list.begin(),list.end()); + } +#endif + + iterator erase(iterator position) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + this->final_erase_(static_cast(position++.get_node())); + return position; + } + + iterator erase(iterator first,iterator last) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(first); + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(last); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(first,*this); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(last,*this); + BOOST_MULTI_INDEX_CHECK_VALID_RANGE(first,last); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + difference_type n=last-first; + relocate(end(),first,last); + while(n--)pop_back(); + return last; + } + + bool replace(iterator position,const value_type& x) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + return this->final_replace_( + x,static_cast(position.get_node())); + } + + bool replace(iterator position,BOOST_RV_REF(value_type) x) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + return this->final_replace_rv_( + x,static_cast(position.get_node())); + } + + template + bool modify(iterator position,Modifier mod) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + /* MSVC++ 6.0 optimizer on safe mode code chokes if this + * this is not added. Left it for all compilers as it does no + * harm. + */ + + position.detach(); +#endif + + return this->final_modify_( + mod,static_cast(position.get_node())); + } + + template + bool modify(iterator position,Modifier mod,Rollback back_) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + /* MSVC++ 6.0 optimizer on safe mode code chokes if this + * this is not added. Left it for all compilers as it does no + * harm. + */ + + position.detach(); +#endif + + return this->final_modify_( + mod,back_,static_cast(position.get_node())); + } + + void swap(random_access_index& x) + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT_OF(x); + this->final_swap_(x.final()); + } + + void clear()BOOST_NOEXCEPT + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + this->final_clear_(); + } + + /* list operations */ + + void splice(iterator position,random_access_index& x) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_CHECK_DIFFERENT_CONTAINER(*this,x); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + iterator first=x.begin(),last=x.end(); + size_type n=0; + BOOST_TRY{ + while(first!=last){ + if(push_back(*first).second){ + first=x.erase(first); + ++n; + } + else ++first; + } + } + BOOST_CATCH(...){ + relocate(position,end()-n,end()); + BOOST_RETHROW; + } + BOOST_CATCH_END + relocate(position,end()-n,end()); + } + + void splice( + iterator position,random_access_index& x,iterator i) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(i); + BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(i); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(i,x); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + if(&x==this)relocate(position,i); + else{ + if(insert(position,*i).second){ + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + /* MSVC++ 6.0 optimizer has a hard time with safe mode, and the following + * workaround is needed. Left it for all compilers as it does no + * harm. + */ + i.detach(); + x.erase(x.make_iterator(i.get_node())); +#else + x.erase(i); +#endif + + } + } + } + + void splice( + iterator position,random_access_index& x, + iterator first,iterator last) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(first); + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(last); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(first,x); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(last,x); + BOOST_MULTI_INDEX_CHECK_VALID_RANGE(first,last); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + if(&x==this)relocate(position,first,last); + else{ + size_type n=0; + BOOST_TRY{ + while(first!=last){ + if(push_back(*first).second){ + first=x.erase(first); + ++n; + } + else ++first; + } + } + BOOST_CATCH(...){ + relocate(position,end()-n,end()); + BOOST_RETHROW; + } + BOOST_CATCH_END + relocate(position,end()-n,end()); + } + } + + void remove(value_param_type value) + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + difference_type n= + end()-make_iterator( + random_access_index_remove( + ptrs, + ::boost::bind(std::equal_to(),::boost::arg<1>(),value))); + while(n--)pop_back(); + } + + template + void remove_if(Predicate pred) + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + difference_type n= + end()-make_iterator(random_access_index_remove(ptrs,pred)); + while(n--)pop_back(); + } + + void unique() + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + difference_type n= + end()-make_iterator( + random_access_index_unique( + ptrs,std::equal_to())); + while(n--)pop_back(); + } + + template + void unique(BinaryPredicate binary_pred) + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + difference_type n= + end()-make_iterator( + random_access_index_unique(ptrs,binary_pred)); + while(n--)pop_back(); + } + + void merge(random_access_index& x) + { + if(this!=&x){ + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + size_type s=size(); + splice(end(),x); + random_access_index_inplace_merge( + get_allocator(),ptrs,ptrs.at(s),std::less()); + } + } + + template + void merge(random_access_index& x,Compare comp) + { + if(this!=&x){ + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + size_type s=size(); + splice(end(),x); + random_access_index_inplace_merge( + get_allocator(),ptrs,ptrs.at(s),comp); + } + } + + void sort() + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + random_access_index_sort( + get_allocator(),ptrs,std::less()); + } + + template + void sort(Compare comp) + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + random_access_index_sort( + get_allocator(),ptrs,comp); + } + + void reverse()BOOST_NOEXCEPT + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + node_impl_type::reverse(ptrs.begin(),ptrs.end()); + } + + /* rearrange operations */ + + void relocate(iterator position,iterator i) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(i); + BOOST_MULTI_INDEX_CHECK_DEREFERENCEABLE_ITERATOR(i); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(i,*this); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + if(position!=i)relocate(position.get_node(),i.get_node()); + } + + void relocate(iterator position,iterator first,iterator last) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(first); + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(last); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(first,*this); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(last,*this); + BOOST_MULTI_INDEX_CHECK_VALID_RANGE(first,last); + BOOST_MULTI_INDEX_CHECK_OUTSIDE_RANGE(position,first,last); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + if(position!=last)relocate( + position.get_node(),first.get_node(),last.get_node()); + } + + template + void rearrange(InputIterator first) + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + for(node_impl_ptr_pointer p0=ptrs.begin(),p0_end=ptrs.end(); + p0!=p0_end;++first,++p0){ + const value_type& v1=*first; + node_impl_ptr_pointer p1=node_from_value(&v1)->up(); + + std::swap(*p0,*p1); + (*p0)->up()=p0; + (*p1)->up()=p1; + } + } + +BOOST_MULTI_INDEX_PROTECTED_IF_MEMBER_TEMPLATE_FRIENDS: + random_access_index( + const ctor_args_list& args_list,const allocator_type& al): + super(args_list.get_tail(),al), + ptrs(al,header()->impl(),0) + { + } + + random_access_index(const random_access_index& x): + super(x), + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + safe_super(), +#endif + + ptrs(x.get_allocator(),header()->impl(),x.size()) + { + /* The actual copying takes place in subsequent call to copy_(). + */ + } + + random_access_index( + const random_access_index& x,do_not_copy_elements_tag): + super(x,do_not_copy_elements_tag()), + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + safe_super(), +#endif + + ptrs(x.get_allocator(),header()->impl(),0) + { + } + + ~random_access_index() + { + /* the container is guaranteed to be empty by now */ + } + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + iterator make_iterator(node_type* node){return iterator(node,this);} + const_iterator make_iterator(node_type* node)const + {return const_iterator(node,const_cast(this));} +#else + iterator make_iterator(node_type* node){return iterator(node);} + const_iterator make_iterator(node_type* node)const + {return const_iterator(node);} +#endif + + void copy_( + const random_access_index& x,const copy_map_type& map) + { + for(node_impl_ptr_pointer begin_org=x.ptrs.begin(), + begin_cpy=ptrs.begin(), + end_org=x.ptrs.end(); + begin_org!=end_org;++begin_org,++begin_cpy){ + *begin_cpy= + static_cast( + map.find( + static_cast( + node_type::from_impl(*begin_org))))->impl(); + (*begin_cpy)->up()=begin_cpy; + } + + super::copy_(x,map); + } + + template + final_node_type* insert_( + value_param_type v,final_node_type*& x,Variant variant) + { + ptrs.room_for_one(); + final_node_type* res=super::insert_(v,x,variant); + if(res==x)ptrs.push_back(static_cast(x)->impl()); + return res; + } + + template + final_node_type* insert_( + value_param_type v,node_type* position,final_node_type*& x,Variant variant) + { + ptrs.room_for_one(); + final_node_type* res=super::insert_(v,position,x,variant); + if(res==x)ptrs.push_back(static_cast(x)->impl()); + return res; + } + + void erase_(node_type* x) + { + ptrs.erase(x->impl()); + super::erase_(x); + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + detach_iterators(x); +#endif + } + + void delete_all_nodes_() + { + for(node_impl_ptr_pointer x=ptrs.begin(),x_end=ptrs.end();x!=x_end;++x){ + this->final_delete_node_( + static_cast(node_type::from_impl(*x))); + } + } + + void clear_() + { + super::clear_(); + ptrs.clear(); + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + safe_super::detach_dereferenceable_iterators(); +#endif + } + + void swap_(random_access_index& x) + { + ptrs.swap(x.ptrs); + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + safe_super::swap(x); +#endif + + super::swap_(x); + } + + void swap_elements_(random_access_index& x) + { + ptrs.swap(x.ptrs); + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + safe_super::swap(x); +#endif + + super::swap_elements_(x); + } + + template + bool replace_(value_param_type v,node_type* x,Variant variant) + { + return super::replace_(v,x,variant); + } + + bool modify_(node_type* x) + { + BOOST_TRY{ + if(!super::modify_(x)){ + ptrs.erase(x->impl()); + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + detach_iterators(x); +#endif + + return false; + } + else return true; + } + BOOST_CATCH(...){ + ptrs.erase(x->impl()); + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + detach_iterators(x); +#endif + + BOOST_RETHROW; + } + BOOST_CATCH_END + } + + bool modify_rollback_(node_type* x) + { + return super::modify_rollback_(x); + } + +#if !defined(BOOST_MULTI_INDEX_DISABLE_SERIALIZATION) + /* serialization */ + + template + void save_( + Archive& ar,const unsigned int version,const index_saver_type& sm)const + { + sm.save(begin(),end(),ar,version); + super::save_(ar,version,sm); + } + + template + void load_( + Archive& ar,const unsigned int version,const index_loader_type& lm) + { + { + typedef random_access_index_loader loader; + + loader ld(get_allocator(),ptrs); + lm.load( + ::boost::bind( + &loader::rearrange,&ld,::boost::arg<1>(),::boost::arg<2>()), + ar,version); + } /* exit scope so that ld frees its resources */ + super::load_(ar,version,lm); + } +#endif + +#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING) + /* invariant stuff */ + + bool invariant_()const + { + if(size()>capacity())return false; + if(size()==0||begin()==end()){ + if(size()!=0||begin()!=end())return false; + } + else{ + size_type s=0; + for(const_iterator it=begin(),it_end=end();;++it,++s){ + if(*(it.get_node()->up())!=it.get_node()->impl())return false; + if(it==it_end)break; + } + if(s!=size())return false; + } + + return super::invariant_(); + } + + /* This forwarding function eases things for the boost::mem_fn construct + * in BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT. Actually, + * final_check_invariant is already an inherited member function of index. + */ + void check_invariant_()const{this->final_check_invariant_();} +#endif + +private: + node_type* header()const{return this->final_header();} + + static void relocate(node_type* position,node_type* x) + { + node_impl_type::relocate(position->up(),x->up()); + } + + static void relocate(node_type* position,node_type* first,node_type* last) + { + node_impl_type::relocate( + position->up(),first->up(),last->up()); + } + +#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE) + void detach_iterators(node_type* x) + { + iterator it=make_iterator(x); + safe_mode::detach_equivalent_iterators(it); + } +#endif + + template + void assign_iter(InputIterator first,InputIterator last,mpl::true_) + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + clear(); + for(;first!=last;++first)this->final_insert_ref_(*first); + } + + void assign_iter(size_type n,value_param_type value,mpl::false_) + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + clear(); + for(size_type i=0;i + void insert_iter( + iterator position,InputIterator first,InputIterator last,mpl::true_) + { + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + size_type s=0; + BOOST_TRY{ + for(;first!=last;++first){ + if(this->final_insert_ref_(*first).second)++s; + } + } + BOOST_CATCH(...){ + relocate(position,end()-s,end()); + BOOST_RETHROW; + } + BOOST_CATCH_END + relocate(position,end()-s,end()); + } + + void insert_iter( + iterator position,size_type n,value_param_type x,mpl::false_) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + size_type s=0; + BOOST_TRY{ + while(n--){ + if(push_back(x).second)++s; + } + } + BOOST_CATCH(...){ + relocate(position,end()-s,end()); + BOOST_RETHROW; + } + BOOST_CATCH_END + relocate(position,end()-s,end()); + } + + template + std::pair emplace_front_impl( + BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK) + { + return emplace_impl(begin(),BOOST_MULTI_INDEX_FORWARD_PARAM_PACK); + } + + template + std::pair emplace_back_impl( + BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK) + { + return emplace_impl(end(),BOOST_MULTI_INDEX_FORWARD_PARAM_PACK); + } + + template + std::pair emplace_impl( + iterator position,BOOST_MULTI_INDEX_FUNCTION_PARAM_PACK) + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT; + std::pair p= + this->final_emplace_(BOOST_MULTI_INDEX_FORWARD_PARAM_PACK); + if(p.second&&position.get_node()!=header()){ + relocate(position.get_node(),p.first); + } + return std::pair(make_iterator(p.first),p.second); + } + + ptr_array ptrs; + +#if defined(BOOST_MULTI_INDEX_ENABLE_INVARIANT_CHECKING)&&\ + BOOST_WORKAROUND(__MWERKS__,<=0x3003) +#pragma parse_mfunc_templ reset +#endif +}; + +/* comparison */ + +template< + typename SuperMeta1,typename TagList1, + typename SuperMeta2,typename TagList2 +> +bool operator==( + const random_access_index& x, + const random_access_index& y) +{ + return x.size()==y.size()&&std::equal(x.begin(),x.end(),y.begin()); +} + +template< + typename SuperMeta1,typename TagList1, + typename SuperMeta2,typename TagList2 +> +bool operator<( + const random_access_index& x, + const random_access_index& y) +{ + return std::lexicographical_compare(x.begin(),x.end(),y.begin(),y.end()); +} + +template< + typename SuperMeta1,typename TagList1, + typename SuperMeta2,typename TagList2 +> +bool operator!=( + const random_access_index& x, + const random_access_index& y) +{ + return !(x==y); +} + +template< + typename SuperMeta1,typename TagList1, + typename SuperMeta2,typename TagList2 +> +bool operator>( + const random_access_index& x, + const random_access_index& y) +{ + return y +bool operator>=( + const random_access_index& x, + const random_access_index& y) +{ + return !(x +bool operator<=( + const random_access_index& x, + const random_access_index& y) +{ + return !(x>y); +} + +/* specialized algorithms */ + +template +void swap( + random_access_index& x, + random_access_index& y) +{ + x.swap(y); +} + +} /* namespace multi_index::detail */ + +/* random access index specifier */ + +template +struct random_access +{ + BOOST_STATIC_ASSERT(detail::is_tag::value); + + template + struct node_class + { + typedef detail::random_access_index_node type; + }; + + template + struct index_class + { + typedef detail::random_access_index< + SuperMeta,typename TagList::type> type; + }; +}; + +} /* namespace multi_index */ + +} /* namespace boost */ + +/* Boost.Foreach compatibility */ + +template +inline boost::mpl::true_* boost_foreach_is_noncopyable( + boost::multi_index::detail::random_access_index*&, + boost_foreach_argument_dependent_lookup_hack) +{ + return 0; +} + +#undef BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT +#undef BOOST_MULTI_INDEX_RND_INDEX_CHECK_INVARIANT_OF + +#endif diff --git a/boost/multi_index/random_access_index_fwd.hpp b/boost/multi_index/random_access_index_fwd.hpp new file mode 100644 index 000000000..2ea192954 --- /dev/null +++ b/boost/multi_index/random_access_index_fwd.hpp @@ -0,0 +1,91 @@ +/* Copyright 2003-2013 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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_RANDOM_ACCESS_INDEX_FWD_HPP +#define BOOST_MULTI_INDEX_RANDOM_ACCESS_INDEX_FWD_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include + +namespace boost{ + +namespace multi_index{ + +namespace detail{ + +template +class random_access_index; + +template< + typename SuperMeta1,typename TagList1, + typename SuperMeta2,typename TagList2 +> +bool operator==( + const random_access_index& x, + const random_access_index& y); + +template< + typename SuperMeta1,typename TagList1, + typename SuperMeta2,typename TagList2 +> +bool operator<( + const random_access_index& x, + const random_access_index& y); + +template< + typename SuperMeta1,typename TagList1, + typename SuperMeta2,typename TagList2 +> +bool operator!=( + const random_access_index& x, + const random_access_index& y); + +template< + typename SuperMeta1,typename TagList1, + typename SuperMeta2,typename TagList2 +> +bool operator>( + const random_access_index& x, + const random_access_index& y); + +template< + typename SuperMeta1,typename TagList1, + typename SuperMeta2,typename TagList2 +> +bool operator>=( + const random_access_index& x, + const random_access_index& y); + +template< + typename SuperMeta1,typename TagList1, + typename SuperMeta2,typename TagList2 +> +bool operator<=( + const random_access_index& x, + const random_access_index& y); + +template +void swap( + random_access_index& x, + random_access_index& y); + +} /* namespace multi_index::detail */ + +/* index specifiers */ + +template > +struct random_access; + +} /* namespace multi_index */ + +} /* namespace boost */ + +#endif diff --git a/boost/multi_index/ranked_index.hpp b/boost/multi_index/ranked_index.hpp new file mode 100644 index 000000000..4fd4d32c7 --- /dev/null +++ b/boost/multi_index/ranked_index.hpp @@ -0,0 +1,382 @@ +/* Copyright 2003-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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_RANKED_INDEX_HPP +#define BOOST_MULTI_INDEX_RANKED_INDEX_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include /* keep it first to prevent nasty warns in MSVC */ +#include +#include +#include + +namespace boost{ + +namespace multi_index{ + +namespace detail{ + +/* ranked_index augments a given ordered index to provide rank operations */ + +template +struct ranked_node:OrderedIndexNodeImpl +{ + std::size_t size; +}; + +template +class ranked_index:public OrderedIndexImpl +{ + typedef OrderedIndexImpl super; + +protected: + typedef typename super::node_type node_type; + typedef typename super::node_impl_pointer node_impl_pointer; + +public: + typedef typename super::ctor_args_list ctor_args_list; + typedef typename super::allocator_type allocator_type; + typedef typename super::iterator iterator; + + /* rank operations */ + + iterator nth(std::size_t n)const + { + return this->make_iterator(node_type::from_impl( + ranked_index_nth(n,this->header()->impl()))); + } + + std::size_t rank(iterator position)const + { + BOOST_MULTI_INDEX_CHECK_VALID_ITERATOR(position); + BOOST_MULTI_INDEX_CHECK_IS_OWNER(position,*this); + + return ranked_index_rank( + position.get_node()->impl(),this->header()->impl()); + } + + template + std::size_t find_rank(const CompatibleKey& x)const + { + return ranked_index_find_rank( + this->root(),this->header(),this->key,x,this->comp_); + } + + template + std::size_t find_rank( + const CompatibleKey& x,const CompatibleCompare& comp)const + { + return ranked_index_find_rank( + this->root(),this->header(),this->key,x,comp); + } + + template + std::size_t lower_bound_rank(const CompatibleKey& x)const + { + return ranked_index_lower_bound_rank( + this->root(),this->header(),this->key,x,this->comp_); + } + + template + std::size_t lower_bound_rank( + const CompatibleKey& x,const CompatibleCompare& comp)const + { + return ranked_index_lower_bound_rank( + this->root(),this->header(),this->key,x,comp); + } + + template + std::size_t upper_bound_rank(const CompatibleKey& x)const + { + return ranked_index_upper_bound_rank( + this->root(),this->header(),this->key,x,this->comp_); + } + + template + std::size_t upper_bound_rank( + const CompatibleKey& x,const CompatibleCompare& comp)const + { + return ranked_index_upper_bound_rank( + this->root(),this->header(),this->key,x,comp); + } + + template + std::pair equal_range_rank( + const CompatibleKey& x)const + { + return ranked_index_equal_range_rank( + this->root(),this->header(),this->key,x,this->comp_); + } + + template + std::pair equal_range_rank( + const CompatibleKey& x,const CompatibleCompare& comp)const + { + return ranked_index_equal_range_rank( + this->root(),this->header(),this->key,x,comp); + } + + template + std::pair + range_rank(LowerBounder lower,UpperBounder upper)const + { + typedef typename mpl::if_< + is_same, + BOOST_DEDUCED_TYPENAME mpl::if_< + is_same, + both_unbounded_tag, + lower_unbounded_tag + >::type, + BOOST_DEDUCED_TYPENAME mpl::if_< + is_same, + upper_unbounded_tag, + none_unbounded_tag + >::type + >::type dispatch; + + return range_rank(lower,upper,dispatch()); + } + +protected: + ranked_index(const ranked_index& x):super(x){}; + + ranked_index(const ranked_index& x,do_not_copy_elements_tag): + super(x,do_not_copy_elements_tag()){}; + + ranked_index( + const ctor_args_list& args_list,const allocator_type& al): + super(args_list,al){} + +private: + template + std::pair + range_rank(LowerBounder lower,UpperBounder upper,none_unbounded_tag)const + { + node_type* y=this->header(); + node_type* z=this->root(); + + if(!z)return std::pair(0,0); + + std::size_t s=z->size; + + do{ + if(!lower(this->key(z->value()))){ + z=node_type::from_impl(z->right()); + } + else if(!upper(this->key(z->value()))){ + y=z; + s-=ranked_node_size(y->right())+1; + z=node_type::from_impl(z->left()); + } + else{ + return std::pair( + s-z->size+ + lower_range_rank(node_type::from_impl(z->left()),z,lower), + s-ranked_node_size(z->right())+ + upper_range_rank(node_type::from_impl(z->right()),y,upper)); + } + }while(z); + + return std::pair(s,s); + } + + template + std::pair + range_rank(LowerBounder,UpperBounder upper,lower_unbounded_tag)const + { + return std::pair( + 0, + upper_range_rank(this->root(),this->header(),upper)); + } + + template + std::pair + range_rank(LowerBounder lower,UpperBounder,upper_unbounded_tag)const + { + return std::pair( + lower_range_rank(this->root(),this->header(),lower), + this->size()); + } + + template + std::pair + range_rank(LowerBounder,UpperBounder,both_unbounded_tag)const + { + return std::pair(0,this->size()); + } + + template + std::size_t + lower_range_rank(node_type* top,node_type* y,LowerBounder lower)const + { + if(!top)return 0; + + std::size_t s=top->size; + + do{ + if(lower(this->key(top->value()))){ + y=top; + s-=ranked_node_size(y->right())+1; + top=node_type::from_impl(top->left()); + } + else top=node_type::from_impl(top->right()); + }while(top); + + return s; + } + + template + std::size_t + upper_range_rank(node_type* top,node_type* y,UpperBounder upper)const + { + if(!top)return 0; + + std::size_t s=top->size; + + do{ + if(!upper(this->key(top->value()))){ + y=top; + s-=ranked_node_size(y->right())+1; + top=node_type::from_impl(top->left()); + } + else top=node_type::from_impl(top->right()); + }while(top); + + return s; + } +}; + +/* augmenting policy for ordered_index */ + +struct rank_policy +{ + template + struct augmented_node + { + typedef ranked_node type; + }; + + template + struct augmented_interface + { + typedef ranked_index type; + }; + + /* algorithmic stuff */ + + template + static void add(Pointer x,Pointer root) + { + x->size=1; + while(x!=root){ + x=x->parent(); + ++(x->size); + } + } + + template + static void remove(Pointer x,Pointer root) + { + while(x!=root){ + x=x->parent(); + --(x->size); + } + } + + template + static void copy(Pointer x,Pointer y) + { + y->size=x->size; + } + + template + static void rotate_left(Pointer x,Pointer y) /* in: x==y->left() */ + { + y->size=x->size; + x->size=ranked_node_size(x->left())+ranked_node_size(x->right())+1; + } + + template + 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 */ + + template + static bool invariant(Pointer x) + { + return x->size==ranked_node_size(x->left())+ranked_node_size(x->right())+1; + } +#endif +}; + +} /* namespace multi_index::detail */ + +/* ranked_index specifiers */ + +template +struct ranked_unique +{ + typedef typename detail::ordered_index_args< + Arg1,Arg2,Arg3> index_args; + typedef typename index_args::tag_list_type::type tag_list_type; + typedef typename index_args::key_from_value_type key_from_value_type; + typedef typename index_args::compare_type compare_type; + + template + struct node_class + { + typedef detail::ordered_index_node type; + }; + + template + struct index_class + { + typedef detail::ordered_index< + key_from_value_type,compare_type, + SuperMeta,tag_list_type,detail::ordered_unique_tag, + detail::rank_policy> type; + }; +}; + +template +struct ranked_non_unique +{ + typedef detail::ordered_index_args< + Arg1,Arg2,Arg3> index_args; + typedef typename index_args::tag_list_type::type tag_list_type; + typedef typename index_args::key_from_value_type key_from_value_type; + typedef typename index_args::compare_type compare_type; + + template + struct node_class + { + typedef detail::ordered_index_node type; + }; + + template + struct index_class + { + typedef detail::ordered_index< + key_from_value_type,compare_type, + SuperMeta,tag_list_type,detail::ordered_non_unique_tag, + detail::rank_policy> type; + }; +}; + +} /* namespace multi_index */ + +} /* namespace boost */ + +#endif diff --git a/boost/multi_index/ranked_index_fwd.hpp b/boost/multi_index/ranked_index_fwd.hpp new file mode 100644 index 000000000..380d34807 --- /dev/null +++ b/boost/multi_index/ranked_index_fwd.hpp @@ -0,0 +1,35 @@ +/* Copyright 2003-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) + * + * See http://www.boost.org/libs/multi_index for library home page. + */ + +#ifndef BOOST_MULTI_INDEX_RANKED_INDEX_FWD_HPP +#define BOOST_MULTI_INDEX_RANKED_INDEX_FWD_HPP + +#if defined(_MSC_VER) +#pragma once +#endif + +#include +#include + +namespace boost{ + +namespace multi_index{ + +/* ranked_index specifiers */ + +template +struct ranked_unique; + +template +struct ranked_non_unique; + +} /* namespace multi_index */ + +} /* namespace boost */ + +#endif diff --git a/libs/circular_buffer/doc/autodoc.xml b/libs/circular_buffer/doc/autodoc.xml deleted file mode 100644 index 26f5b286b..000000000 --- a/libs/circular_buffer/doc/autodoc.xml +++ /dev/null @@ -1,1703 +0,0 @@ - -Boost.Circular_buffer C++ Reference

- - - - -
-
- -Circular buffer - a STL compliant container. -Type Requirements TThe T has to be SGIAssignable (SGI STL defined combination of Assignable and CopyConstructible). Moreover T has to be DefaultConstructible if supplied as a default parameter when invoking some of the circular_buffer's methods e.g. insert(iterator pos, const value_type& item = value_type()). And EqualityComparable and/or LessThanComparable if the circular_buffer will be compared with another container. - -Type Requirements AllocThe Alloc has to meet the allocator requirements imposed by STL. -Default Allocstd::allocator<T> -For detailed documentation of the circular_buffer visit: http://www.boost.org/libs/circular_buffer/doc/circular_buffer.html The type of this circular_buffer. circular_buffer< T, Alloc > -The type of elements stored in the circular_buffer. boost::container::allocator_traits< Alloc >::value_type -A pointer to an element. boost::container::allocator_traits< Alloc >::pointer -A const pointer to the element. boost::container::allocator_traits< Alloc >::const_pointer -A reference to an element. boost::container::allocator_traits< Alloc >::reference -A const reference to an element. boost::container::allocator_traits< Alloc >::const_reference -The distance type. (A signed integral type used to represent the distance between two iterators.) boost::container::allocator_traits< Alloc >::difference_type -The size type. (An unsigned integral type that can represent any non-negative value of the container's distance type.) boost::container::allocator_traits< Alloc >::size_type -The type of an allocator used in the circular_buffer. Alloc -A const (random access) iterator used to iterate through the circular_buffer. cb_details::iterator< circular_buffer< T, Alloc >, cb_details::const_traits< boost::container::allocator_traits< Alloc > > > -A (random access) iterator used to iterate through the circular_buffer. cb_details::iterator< circular_buffer< T, Alloc >, cb_details::nonconst_traits< boost::container::allocator_traits< Alloc > > > -A const iterator used to iterate backwards through a circular_buffer. boost::reverse_iterator< const_iterator > -An iterator used to iterate backwards through a circular_buffer. boost::reverse_iterator< iterator > -An array range. (A typedef for the std::pair where its first element is a pointer to a beginning of an array and its second element represents a size of the array.) std::pair< pointer, size_type > -A range of a const array. (A typedef for the std::pair where its first element is a pointer to a beginning of a const array and its second element represents a size of the const array.) std::pair< const_pointer, size_type > -The capacity type. (Same as size_type - defined for consistency with the __cbso class. size_type -A type representing the "best" way to pass the value_type to a method. const value_type & -A type representing rvalue from param type. On compilers without rvalue references support this type is the Boost.Moves type used for emulation. value_type && - -allocator_typeGet the allocator. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:get_allocator() for obtaining an allocator reference. -The allocator. Nothing. -allocator_type &Get the allocator reference. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -This method was added in order to optimize obtaining of the allocator with a state, although use of stateful allocators in STL is discouraged. -See Also:get_allocator() const -A reference to the allocator. Nothing. -iteratorGet the iterator pointing to the beginning of the circular_buffer. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:end(), rbegin(), rend() -A random access iterator pointing to the first element of the circular_buffer. If the circular_buffer is empty it returns an iterator equal to the one returned by end(). Nothing. -iteratorGet the iterator pointing to the end of the circular_buffer. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:begin(), rbegin(), rend() -A random access iterator pointing to the element "one behind" the last element of the circular_buffer. If the circular_buffer is empty it returns an iterator equal to the one returned by begin(). Nothing. -const_iteratorGet the const iterator pointing to the beginning of the circular_buffer. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:end() const, rbegin() const, rend() const -A const random access iterator pointing to the first element of the circular_buffer. If the circular_buffer is empty it returns an iterator equal to the one returned by end() const. Nothing. -const_iteratorGet the const iterator pointing to the end of the circular_buffer. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:begin() const, rbegin() const, rend() const -A const random access iterator pointing to the element "one behind" the last element of the circular_buffer. If the circular_buffer is empty it returns an iterator equal to the one returned by begin() const const. Nothing. -reverse_iteratorGet the iterator pointing to the beginning of the "reversed" circular_buffer. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:rend(), begin(), end() -A reverse random access iterator pointing to the last element of the circular_buffer. If the circular_buffer is empty it returns an iterator equal to the one returned by rend(). Nothing. -reverse_iteratorGet the iterator pointing to the end of the "reversed" circular_buffer. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:rbegin(), begin(), end() -A reverse random access iterator pointing to the element "one before" the first element of the circular_buffer. If the circular_buffer is empty it returns an iterator equal to the one returned by rbegin(). Nothing. -const_reverse_iteratorGet the const iterator pointing to the beginning of the "reversed" circular_buffer. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:rend() const, begin() const, end() const -A const reverse random access iterator pointing to the last element of the circular_buffer. If the circular_buffer is empty it returns an iterator equal to the one returned by rend() const. Nothing. -const_reverse_iteratorGet the const iterator pointing to the end of the "reversed" circular_buffer. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:rbegin() const, begin() const, end() const -A const reverse random access iterator pointing to the element "one before" the first element of the circular_buffer. If the circular_buffer is empty it returns an iterator equal to the one returned by rbegin() const. Nothing. -referencesize_typeThe position of the element. Get the element at the index position. - - - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:at() -0 <= index && index < size() A reference to the element at the index position. Nothing. -const_referencesize_typeThe position of the element. Get the element at the index position. - - - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:at() const -0 <= index && index < size() A const reference to the element at the index position. Nothing. -referencesize_typeThe position of the element. Get the element at the index position. - - -Exception SafetyStrong. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:operator[] -A reference to the element at the index position. <code>std::out_of_range</code> when the index is invalid (when index >= size()). -const_referencesize_typeThe position of the element. Get the element at the index position. - - -Exception SafetyStrong. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:operator[] const -A const reference to the element at the index position. <code>std::out_of_range</code> when the index is invalid (when index >= size()). -referenceGet the first element. - - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:back() -!empty() A reference to the first element of the circular_buffer. Nothing. -referenceGet the last element. - - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:front() -!empty() A reference to the last element of the circular_buffer. Nothing. -const_referenceGet the first element. - - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:back() const -!empty() A const reference to the first element of the circular_buffer. Nothing. -const_referenceGet the last element. - - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:front() const -!empty() A const reference to the last element of the circular_buffer. Nothing. -array_rangeGet the first continuous array of the internal buffer. This method in combination with array_two() can be useful when passing the stored data into a legacy C API as an array. Suppose there is a circular_buffer of capacity 10, containing 7 characters 'a', 'b', ..., 'g' where buff[0] == 'a', buff[1] == 'b', ... and buff[6] == 'g': - - circular_buffer<char> buff(10); - - The internal representation is often not linear and the state of the internal buffer may look like this: - - |e|f|g| | | |a|b|c|d| - end ___^ - begin _______^ - -where |a|b|c|d| represents the "array one", |e|f|g| represents the "array two" and | | | | is a free space. - Now consider a typical C style function for writing data into a file: - - int write(int file_desc, char* buff, int num_bytes); - - There are two ways how to write the content of the circular_buffer into a file. Either relying on array_one() and array_two() methods and calling the write function twice: - - array_range ar = buff.array_one(); - write(file_desc, ar.first, ar.second); - ar = buff.array_two(); - write(file_desc, ar.first, ar.second); - - Or relying on the linearize() method: - - write(file_desc, buff.linearize(), buff.size()); - - Since the complexity of array_one() and array_two() methods is constant the first option is suitable when calling the write method is "cheap". On the other hand the second option is more suitable when calling the write method is more "expensive" than calling the linearize() method whose complexity is linear. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -In general invoking any method which modifies the internal state of the circular_buffer may delinearize the internal buffer and invalidate the array ranges returned by array_one() and array_two() (and their const versions). -In the case the internal buffer is linear e.g. |a|b|c|d|e|f|g| | | | the "array one" is represented by |a|b|c|d|e|f|g| and the "array two" does not exist (the array_two() method returns an array with the size 0). -See Also:array_two(), linearize() -The array range of the first continuous array of the internal buffer. In the case the circular_buffer is empty the size of the returned array is 0. Nothing. -array_rangeGet the second continuous array of the internal buffer. This method in combination with array_one() can be useful when passing the stored data into a legacy C API as an array. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:array_one() -The array range of the second continuous array of the internal buffer. In the case the internal buffer is linear or the circular_buffer is empty the size of the returned array is 0. Nothing. -const_array_rangeGet the first continuous array of the internal buffer. This method in combination with array_two() const can be useful when passing the stored data into a legacy C API as an array. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:array_two() const; array_one() for more details how to pass data into a legacy C API. -The array range of the first continuous array of the internal buffer. In the case the circular_buffer is empty the size of the returned array is 0. Nothing. -const_array_rangeGet the second continuous array of the internal buffer. This method in combination with array_one() const can be useful when passing the stored data into a legacy C API as an array. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:array_one() const -The array range of the second continuous array of the internal buffer. In the case the internal buffer is linear or the circular_buffer is empty the size of the returned array is 0. Nothing. -pointerLinearize the internal buffer into a continuous array. This method can be useful when passing the stored data into a legacy C API as an array. - - -Exception SafetyBasic; no-throw if the operations in the Throws section do not throw anything. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer (except iterators equal to end()); does not invalidate any iterators if the postcondition (the Effect) is already met prior calling this method. -ComplexityLinear (in the size of the circular_buffer); constant if the postcondition (the Effect) is already met. -In general invoking any method which modifies the internal state of the circular_buffer may delinearize the internal buffer and invalidate the returned pointer. -See Also:array_one() and array_two() for the other option how to pass data into a legacy C API; is_linearized(), rotate(const_iterator) -&(*this)[0] < &(*this)[1] < ... < &(*this)[size() - 1] A pointer to the beginning of the array or 0 if empty. <a href="circular_buffer/implementation.html#circular_buffer.implementation.exceptions_of_move_if_noexcept_t">Exceptions of move_if_noexcept(T&). -boolIs the circular_buffer linearized? - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:linearize(), array_one(), array_two() -true if the internal buffer is linearized into a continuous array (i.e. the circular_buffer meets a condition &(*this)[0] < &(*this)[1] < ... < &(*this)[size() - 1]); false otherwise. Nothing. -voidconst_iteratorThe new beginning. Rotate elements in the circular_buffer. A more effective implementation of std::rotate. - - - -Exception SafetyBasic; no-throw if the circular_buffer is full or new_begin points to begin() or if the operations in the Throws section do not throw anything. -Iterator InvalidationIf m < n invalidates iterators pointing to the last m elements (including new_begin, but not iterators equal to end()) else invalidates iterators pointing to the first n elements; does not invalidate any iterators if the circular_buffer is full. -ComplexityLinear (in (std::min)(m, n)); constant if the circular_buffer is full. -See Also:std::rotate -new_begin is a valid iterator pointing to the circular_buffer except its end. Before calling the method suppose: - - m == std::distance(new_begin, end()) -n == std::distance(begin(), new_begin) -val_0 == *new_begin, val_1 == *(new_begin + 1), ... val_m == *(new_begin + m) - val_r1 == *(new_begin - 1), val_r2 == *(new_begin - 2), ... val_rn == *(new_begin - n) - -then after call to the method: - - val_0 == (*this)[0] && val_1 == (*this)[1] && ... && val_m == (*this)[m - 1] && val_r1 == (*this)[m + n - 1] && val_r2 == (*this)[m + n - 2] && ... && val_rn == (*this)[m] See Exceptions of move_if_noexcept(T&). -size_typeGet the number of elements currently stored in the circular_buffer. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:capacity(), max_size(), reserve(), resize(size_type, const_reference) -The number of elements stored in the circular_buffer. Nothing. -size_typeGet the largest possible size or capacity of the circular_buffer. (It depends on allocator's max_size()). - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:size(), capacity(), reserve() -The maximum size/capacity the circular_buffer can be set to. Nothing. -boolIs the circular_buffer empty? - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:full() -true if there are no elements stored in the circular_buffer; false otherwise. Nothing. -boolIs the circular_buffer full? - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:empty() -true if the number of elements stored in the circular_buffer equals the capacity of the circular_buffer; false otherwise. Nothing. -size_typeGet the maximum number of elements which can be inserted into the circular_buffer without overwriting any of already stored elements. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:capacity(), size(), max_size() -capacity() - size() Nothing. -capacity_typeGet the capacity of the circular_buffer. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer). -See Also:reserve(), size(), max_size(), set_capacity(capacity_type) -The maximum number of elements which can be stored in the circular_buffer. Nothing. -voidcapacity_typeThe new capacity. Change the capacity of the circular_buffer. - - - -Exception SafetyStrong. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer (except iterators equal to end()) if the new capacity is different from the original. -ComplexityLinear (in min[size(), new_capacity]). -See Also:rset_capacity(capacity_type), resize(size_type, const_reference) -If T is a move only type, then compiler shall support noexcept modifiers and move constructor of T must be marked with it (must not throw exceptions). capacity() == new_capacity && size() <= new_capacity - - If the current number of elements stored in the circular_buffer is greater than the desired new capacity then number of [size() - new_capacity] last elements will be removed and the new size will be equal to new_capacity. An allocation error if memory is exhausted, (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -voidsize_typeThe new size. param_value_typevalue_type()The element the circular_buffer will be filled with in order to gain the requested size. (See the Effect.) Change the size of the circular_buffer. - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer (except iterators equal to end()) if the new size is greater than the current capacity. Invalidates iterators pointing to the removed elements if the new size is lower that the original size. Otherwise it does not invalidate any iterator. -ComplexityLinear (in the new size of the circular_buffer). -See Also:rresize(size_type, const_reference), set_capacity(capacity_type) -size() == new_size && capacity() >= new_size - - If the new size is greater than the current size, copies of item will be inserted at the back of the of the circular_buffer in order to achieve the desired size. In the case the resulting size exceeds the current capacity the capacity will be set to new_size. - If the current number of elements stored in the circular_buffer is greater than the desired new size then number of [size() - new_size] last elements will be removed. (The capacity will remain unchanged.) An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -voidcapacity_typeThe new capacity. Change the capacity of the circular_buffer. - - - -Exception SafetyStrong. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer (except iterators equal to end()) if the new capacity is different from the original. -ComplexityLinear (in min[size(), new_capacity]). -See Also:set_capacity(capacity_type), rresize(size_type, const_reference) -If T is a move only type, then compiler shall support noexcept modifiers and move constructor of T must be marked with it (must not throw exceptions). capacity() == new_capacity && size() <= new_capacity - - If the current number of elements stored in the circular_buffer is greater than the desired new capacity then number of [size() - new_capacity] first elements will be removed and the new size will be equal to new_capacity. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -voidsize_typeThe new size. param_value_typevalue_type()The element the circular_buffer will be filled with in order to gain the requested size. (See the Effect.) Change the size of the circular_buffer. - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer (except iterators equal to end()) if the new size is greater than the current capacity. Invalidates iterators pointing to the removed elements if the new size is lower that the original size. Otherwise it does not invalidate any iterator. -ComplexityLinear (in the new size of the circular_buffer). -See Also:resize(size_type, const_reference), rset_capacity(capacity_type) -size() == new_size && capacity() >= new_size - - If the new size is greater than the current size, copies of item will be inserted at the front of the of the circular_buffer in order to achieve the desired size. In the case the resulting size exceeds the current capacity the capacity will be set to new_size. - If the current number of elements stored in the circular_buffer is greater than the desired new size then number of [size() - new_size] first elements will be removed. (The capacity will remain unchanged.) An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -voidsize_typeThe number of elements the circular_buffer will be filled with. param_value_typeThe element the circular_buffer will be filled with. Assign n items into the circular_buffer. The content of the circular_buffer will be removed and replaced with n copies of the item. - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer (except iterators equal to end()). -ComplexityLinear (in the n). -See Also:operator=, assign(capacity_type, size_type, const_reference), assign(InputIterator, InputIterator), assign(capacity_type, InputIterator, InputIterator) -capacity() == n && size() == n && (*this)[0] == item && (*this)[1] == item && ... && (*this) [n - 1] == item An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -voidcapacity_typeThe new capacity. size_typeThe number of elements the circular_buffer will be filled with. param_value_typeThe element the circular_buffer will be filled with. Assign n items into the circular_buffer specifying the capacity. The capacity of the circular_buffer will be set to the specified value and the content of the circular_buffer will be removed and replaced with n copies of the item. - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer (except iterators equal to end()). -ComplexityLinear (in the n). -See Also:operator=, assign(size_type, const_reference), assign(InputIterator, InputIterator), assign(capacity_type, InputIterator, InputIterator) -capacity >= n capacity() == buffer_capacity && size() == n && (*this)[0] == item && (*this)[1] == item && ... && (*this) [n - 1] == item An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -voidInputIteratorThe beginning of the range to be copied. InputIteratorThe end of the range to be copied. Assign a copy of the range into the circular_buffer. The content of the circular_buffer will be removed and replaced with copies of elements from the specified range. - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer (except iterators equal to end()). -ComplexityLinear (in the std::distance(first, last)). -See Also:operator=, assign(size_type, const_reference), assign(capacity_type, size_type, const_reference), assign(capacity_type, InputIterator, InputIterator) -Valid range [first, last). - first and last have to meet the requirements of InputIterator. capacity() == std::distance(first, last) && size() == std::distance(first, last) && (*this)[0]== *first && (*this)[1] == *(first + 1) && ... && (*this)[std::distance(first, last) - 1] == *(last - 1) An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -voidcapacity_typeThe new capacity. InputIteratorThe beginning of the range to be copied. InputIteratorThe end of the range to be copied. Assign a copy of the range into the circular_buffer specifying the capacity. The capacity of the circular_buffer will be set to the specified value and the content of the circular_buffer will be removed and replaced with copies of elements from the specified range. - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer (except iterators equal to end()). -ComplexityLinear (in std::distance(first, last); in min[capacity, std::distance(first, last)] if the InputIterator is a RandomAccessIterator). -See Also:operator=, assign(size_type, const_reference), assign(capacity_type, size_type, const_reference), assign(InputIterator, InputIterator) -Valid range [first, last). - first and last have to meet the requirements of InputIterator. capacity() == buffer_capacity && size() <= std::distance(first, last) && (*this)[0]== *(last - buffer_capacity) && (*this)[1] == *(last - buffer_capacity + 1) && ... && (*this)[buffer_capacity - 1] == *(last - 1) - - If the number of items to be copied from the range [first, last) is greater than the specified buffer_capacity then only elements from the range [last - buffer_capacity, last) will be copied. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -voidcircular_buffer< T, Alloc > &The circular_buffer whose content will be swapped. Swap the contents of two circular_buffers. - - -Exception SafetyNo-throw. -Iterator InvalidationInvalidates all iterators of both circular_buffers. (On the other hand the iterators still point to the same elements but within another container. If you want to rely on this feature you have to turn the Debug Support off otherwise an assertion will report an error if such invalidated iterator is used.) -ComplexityConstant (in the size of the circular_buffer). -See Also:swap(circular_buffer<T, Alloc>&, circular_buffer<T, Alloc>&) -this contains elements of cb and vice versa; the capacity of this equals to the capacity of cb and vice versa. Nothing. -voidparam_value_typeThe element to be inserted. Insert a new element at the end of the circular_buffer. - - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. -Iterator InvalidationDoes not invalidate any iterators with the exception of iterators pointing to the overwritten element. -ComplexityConstant (in the size of the circular_buffer). -See Also:push_front(const_reference), pop_back(), pop_front() -if capacity() > 0 then back() == item - If the circular_buffer is full, the first element will be removed. If the capacity is 0, nothing will be inserted. Whatever T::T(const T&) throws. Whatever T::operator = (const T&) throws. -voidrvalue_typeThe element to be inserted. Insert a new element at the end of the circular_buffer using rvalue references or rvalues references emulation. - - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. -Iterator InvalidationDoes not invalidate any iterators with the exception of iterators pointing to the overwritten element. -ComplexityConstant (in the size of the circular_buffer). -See Also:push_front(const_reference), pop_back(), pop_front() -if capacity() > 0 then back() == item - If the circular_buffer is full, the first element will be removed. If the capacity is 0, nothing will be inserted. Whatever T::T(T&&) throws. Whatever T::operator = (T&&) throws. -voidInsert a new default-constructed element at the end of the circular_buffer. - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. -Iterator InvalidationDoes not invalidate any iterators with the exception of iterators pointing to the overwritten element. -ComplexityConstant (in the size of the circular_buffer). -See Also:push_front(const_reference), pop_back(), pop_front() -if capacity() > 0 then back() == item - If the circular_buffer is full, the first element will be removed. If the capacity is 0, nothing will be inserted. Whatever T::T() throws. Whatever T::T(T&&) throws. Whatever T::operator = (T&&) throws. -voidparam_value_typeThe element to be inserted. Insert a new element at the beginning of the circular_buffer. - - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. -Iterator InvalidationDoes not invalidate any iterators with the exception of iterators pointing to the overwritten element. -ComplexityConstant (in the size of the circular_buffer). -See Also:push_back(const_reference), pop_back(), pop_front() -if capacity() > 0 then front() == item - If the circular_buffer is full, the last element will be removed. If the capacity is 0, nothing will be inserted. Whatever T::T(const T&) throws. Whatever T::operator = (const T&) throws. -voidrvalue_typeThe element to be inserted. Insert a new element at the beginning of the circular_buffer using rvalue references or rvalues references emulation. - - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. -Iterator InvalidationDoes not invalidate any iterators with the exception of iterators pointing to the overwritten element. -ComplexityConstant (in the size of the circular_buffer). -See Also:push_back(const_reference), pop_back(), pop_front() -if capacity() > 0 then front() == item - If the circular_buffer is full, the last element will be removed. If the capacity is 0, nothing will be inserted. Whatever T::T(T&&) throws. Whatever T::operator = (T&&) throws. -voidInsert a new default-constructed element at the beginning of the circular_buffer. - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. -Iterator InvalidationDoes not invalidate any iterators with the exception of iterators pointing to the overwritten element. -ComplexityConstant (in the size of the circular_buffer). -See Also:push_back(const_reference), pop_back(), pop_front() -if capacity() > 0 then front() == item - If the circular_buffer is full, the last element will be removed. If the capacity is 0, nothing will be inserted. Whatever T::T() throws. Whatever T::T(T&&) throws. Whatever T::operator = (T&&) throws. -voidRemove the last element from the circular_buffer. - - -Exception SafetyNo-throw. -Iterator InvalidationInvalidates only iterators pointing to the removed element. -ComplexityConstant (in the size of the circular_buffer). -See Also:pop_front(), push_back(const_reference), push_front(const_reference) -!empty() The last element is removed from the circular_buffer. Nothing. -voidRemove the first element from the circular_buffer. - - -Exception SafetyNo-throw. -Iterator InvalidationInvalidates only iterators pointing to the removed element. -ComplexityConstant (in the size of the circular_buffer). -See Also:pop_back(), push_back(const_reference), push_front(const_reference) -!empty() The first element is removed from the circular_buffer. Nothing. -iteratoriteratorAn iterator specifying the position where the item will be inserted. param_value_typeThe element to be inserted. Insert an element at the specified position. - - - - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. -Iterator InvalidationInvalidates iterators pointing to the elements at the insertion point (including pos) and iterators behind the insertion point (towards the end; except iterators equal to end()). It also invalidates iterators pointing to the overwritten element. -ComplexityLinear (in std::distance(pos, end())). -See Also:insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator), rinsert(iterator, value_type), rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer or its end. The item will be inserted at the position pos. - If the circular_buffer is full, the first element will be overwritten. If the circular_buffer is full and the pos points to begin(), then the item will not be inserted. If the capacity is 0, nothing will be inserted. Iterator to the inserted element or begin() if the item is not inserted. (See the Effect.) Whatever T::T(const T&) throws. Whatever T::operator = (const T&) throws. Exceptions of move_if_noexcept(T&). -iteratoriteratorAn iterator specifying the position where the item will be inserted. rvalue_typeThe element to be inserted. Insert an element at the specified position. - - - - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. -Iterator InvalidationInvalidates iterators pointing to the elements at the insertion point (including pos) and iterators behind the insertion point (towards the end; except iterators equal to end()). It also invalidates iterators pointing to the overwritten element. -ComplexityLinear (in std::distance(pos, end())). -See Also:insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator), rinsert(iterator, value_type), rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer or its end. The item will be inserted at the position pos. - If the circular_buffer is full, the first element will be overwritten. If the circular_buffer is full and the pos points to begin(), then the item will not be inserted. If the capacity is 0, nothing will be inserted. Iterator to the inserted element or begin() if the item is not inserted. (See the Effect.) Whatever T::T(T&&) throws. Whatever T::operator = (T&&) throws. Exceptions of move_if_noexcept(T&). -iteratoriteratorAn iterator specifying the position where the item will be inserted. Insert a default-constructed element at the specified position. - - - - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. -Iterator InvalidationInvalidates iterators pointing to the elements at the insertion point (including pos) and iterators behind the insertion point (towards the end; except iterators equal to end()). It also invalidates iterators pointing to the overwritten element. -ComplexityLinear (in std::distance(pos, end())). -See Also:insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator), rinsert(iterator, value_type), rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer or its end. The item will be inserted at the position pos. - If the circular_buffer is full, the first element will be overwritten. If the circular_buffer is full and the pos points to begin(), then the item will not be inserted. If the capacity is 0, nothing will be inserted. Iterator to the inserted element or begin() if the item is not inserted. (See the Effect.) Whatever T::T() throws. Whatever T::T(T&&) throws. Whatever T::operator = (T&&) throws. Exceptions of move_if_noexcept(T&). -voiditeratorAn iterator specifying the position where the items will be inserted. size_typeThe number of items the to be inserted. param_value_typeThe element whose copies will be inserted. Insert n copies of the item at the specified position. - - - -Exception SafetyBasic; no-throw if the operations in the Throws section do not throw anything. -Iterator InvalidationInvalidates iterators pointing to the elements at the insertion point (including pos) and iterators behind the insertion point (towards the end; except iterators equal to end()). It also invalidates iterators pointing to the overwritten elements. -ComplexityLinear (in min[capacity(), std::distance(pos, end()) + n]). -ExampleConsider a circular_buffer with the capacity of 6 and the size of 4. Its internal buffer may look like the one below. - - |1|2|3|4| | | - p ___^ - -After inserting 5 elements at the position p: - - insert(p, (size_t)5, 0); - -actually only 4 elements get inserted and elements 1 and 2 are overwritten. This is due to the fact the insert operation preserves the capacity. After insertion the internal buffer looks like this: - -|0|0|0|0|3|4| - -For comparison if the capacity would not be preserved the internal buffer would then result in |1|2|0|0|0|0|0|3|4|. -See Also:insert(iterator, value_type), insert(iterator, InputIterator, InputIterator), rinsert(iterator, value_type), rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer or its end. The number of min[n, (pos - begin()) + reserve()] elements will be inserted at the position pos. -The number of min[pos - begin(), max[0, n - reserve()]] elements will be overwritten at the beginning of the circular_buffer. -(See Example for the explanation.) Whatever T::T(const T&) throws. Whatever T::operator = (const T&) throws. Exceptions of move_if_noexcept(T&). -voiditeratorAn iterator specifying the position where the range will be inserted. InputIteratorThe beginning of the range to be inserted. InputIteratorThe end of the range to be inserted. Insert the range [first, last) at the specified position. - - - -Exception SafetyBasic; no-throw if the operations in the Throws section do not throw anything. -Iterator InvalidationInvalidates iterators pointing to the elements at the insertion point (including pos) and iterators behind the insertion point (towards the end; except iterators equal to end()). It also invalidates iterators pointing to the overwritten elements. -ComplexityLinear (in [std::distance(pos, end()) + std::distance(first, last)]; in min[capacity(), std::distance(pos, end()) + std::distance(first, last)] if the InputIterator is a RandomAccessIterator). -ExampleConsider a circular_buffer with the capacity of 6 and the size of 4. Its internal buffer may look like the one below. - - |1|2|3|4| | | - p ___^ - -After inserting a range of elements at the position p: - - int array[] = { 5, 6, 7, 8, 9 }; -insert(p, array, array + 5); - - actually only elements 6, 7, 8 and 9 from the specified range get inserted and elements 1 and 2 are overwritten. This is due to the fact the insert operation preserves the capacity. After insertion the internal buffer looks like this: - -|6|7|8|9|3|4| - -For comparison if the capacity would not be preserved the internal buffer would then result in |1|2|5|6|7|8|9|3|4|. -See Also:insert(iterator, value_type), insert(iterator, size_type, value_type), rinsert(iterator, value_type), rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer or its end. - Valid range [first, last) where first and last meet the requirements of an InputIterator. Elements from the range [first + max[0, distance(first, last) - (pos - begin()) - reserve()], last) will be inserted at the position pos. -The number of min[pos - begin(), max[0, distance(first, last) - reserve()]] elements will be overwritten at the beginning of the circular_buffer. -(See Example for the explanation.) Whatever T::T(const T&) throws if the InputIterator is not a move iterator. Whatever T::operator = (const T&) throws if the InputIterator is not a move iterator. Whatever T::T(T&&) throws if the InputIterator is a move iterator. Whatever T::operator = (T&&) throws if the InputIterator is a move iterator. -iteratoriteratorAn iterator specifying the position before which the item will be inserted. param_value_typeThe element to be inserted. Insert an element before the specified position. - - - - -Exception SafetyBasic; no-throw if the operations in the Throws section do not throw anything. -Iterator InvalidationInvalidates iterators pointing to the elements before the insertion point (towards the beginning and excluding pos). It also invalidates iterators pointing to the overwritten element. -ComplexityLinear (in std::distance(begin(), pos)). -See Also:rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator), insert(iterator, value_type), insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer or its end. The item will be inserted before the position pos. - If the circular_buffer is full, the last element will be overwritten. If the circular_buffer is full and the pos points to end(), then the item will not be inserted. If the capacity is 0, nothing will be inserted. Iterator to the inserted element or end() if the item is not inserted. (See the Effect.) Whatever T::T(const T&) throws. Whatever T::operator = (const T&) throws. Exceptions of move_if_noexcept(T&). -iteratoriteratorAn iterator specifying the position before which the item will be inserted. rvalue_typeThe element to be inserted. Insert an element before the specified position. - - - - -Exception SafetyBasic; no-throw if the operations in the Throws section do not throw anything. -Iterator InvalidationInvalidates iterators pointing to the elements before the insertion point (towards the beginning and excluding pos). It also invalidates iterators pointing to the overwritten element. -ComplexityLinear (in std::distance(begin(), pos)). -See Also:rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator), insert(iterator, value_type), insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer or its end. The item will be inserted before the position pos. - If the circular_buffer is full, the last element will be overwritten. If the circular_buffer is full and the pos points to end(), then the item will not be inserted. If the capacity is 0, nothing will be inserted. Iterator to the inserted element or end() if the item is not inserted. (See the Effect.) Whatever T::T(T&&) throws. Whatever T::operator = (T&&) throws. Exceptions of move_if_noexcept(T&). -iteratoriteratorAn iterator specifying the position before which the item will be inserted. Insert an element before the specified position. - - - - -Exception SafetyBasic; no-throw if the operations in the Throws section do not throw anything. -Iterator InvalidationInvalidates iterators pointing to the elements before the insertion point (towards the beginning and excluding pos). It also invalidates iterators pointing to the overwritten element. -ComplexityLinear (in std::distance(begin(), pos)). -See Also:rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator), insert(iterator, value_type), insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer or its end. The item will be inserted before the position pos. - If the circular_buffer is full, the last element will be overwritten. If the circular_buffer is full and the pos points to end(), then the item will not be inserted. If the capacity is 0, nothing will be inserted. Iterator to the inserted element or end() if the item is not inserted. (See the Effect.) Whatever T::T() throws. Whatever T::T(T&&) throws. Whatever T::operator = (T&&) throws. Exceptions of move_if_noexcept(T&). -voiditeratorAn iterator specifying the position where the items will be inserted. size_typeThe number of items the to be inserted. param_value_typeThe element whose copies will be inserted. Insert n copies of the item before the specified position. - - - -Exception SafetyBasic; no-throw if the operations in the Throws section do not throw anything. -Iterator InvalidationInvalidates iterators pointing to the elements before the insertion point (towards the beginning and excluding pos). It also invalidates iterators pointing to the overwritten elements. -ComplexityLinear (in min[capacity(), std::distance(begin(), pos) + n]). -ExampleConsider a circular_buffer with the capacity of 6 and the size of 4. Its internal buffer may look like the one below. - - |1|2|3|4| | | - p ___^ - -After inserting 5 elements before the position p: - - rinsert(p, (size_t)5, 0); - -actually only 4 elements get inserted and elements 3 and 4 are overwritten. This is due to the fact the rinsert operation preserves the capacity. After insertion the internal buffer looks like this: - -|1|2|0|0|0|0| - -For comparison if the capacity would not be preserved the internal buffer would then result in |1|2|0|0|0|0|0|3|4|. -See Also:rinsert(iterator, value_type), rinsert(iterator, InputIterator, InputIterator), insert(iterator, value_type), insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer or its end. The number of min[n, (end() - pos) + reserve()] elements will be inserted before the position pos. -The number of min[end() - pos, max[0, n - reserve()]] elements will be overwritten at the end of the circular_buffer. -(See Example for the explanation.) Whatever T::T(const T&) throws. Whatever T::operator = (const T&) throws. Exceptions of move_if_noexcept(T&). -voiditeratorAn iterator specifying the position where the range will be inserted. InputIteratorThe beginning of the range to be inserted. InputIteratorThe end of the range to be inserted. Insert the range [first, last) before the specified position. - - - -Exception SafetyBasic; no-throw if the operations in the Throws section do not throw anything. -Iterator InvalidationInvalidates iterators pointing to the elements before the insertion point (towards the beginning and excluding pos). It also invalidates iterators pointing to the overwritten elements. -ComplexityLinear (in [std::distance(begin(), pos) + std::distance(first, last)]; in min[capacity(), std::distance(begin(), pos) + std::distance(first, last)] if the InputIterator is a RandomAccessIterator). -ExampleConsider a circular_buffer with the capacity of 6 and the size of 4. Its internal buffer may look like the one below. - - |1|2|3|4| | | - p ___^ - -After inserting a range of elements before the position p: - - int array[] = { 5, 6, 7, 8, 9 }; -insert(p, array, array + 5); - - actually only elements 5, 6, 7 and 8 from the specified range get inserted and elements 3 and 4 are overwritten. This is due to the fact the rinsert operation preserves the capacity. After insertion the internal buffer looks like this: - -|1|2|5|6|7|8| - -For comparison if the capacity would not be preserved the internal buffer would then result in |1|2|5|6|7|8|9|3|4|. -See Also:rinsert(iterator, value_type), rinsert(iterator, size_type, value_type), insert(iterator, value_type), insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer or its end. - Valid range [first, last) where first and last meet the requirements of an InputIterator. Elements from the range [first, last - max[0, distance(first, last) - (end() - pos) - reserve()]) will be inserted before the position pos. -The number of min[end() - pos, max[0, distance(first, last) - reserve()]] elements will be overwritten at the end of the circular_buffer. -(See Example for the explanation.) Whatever T::T(const T&) throws if the InputIterator is not a move iterator. Whatever T::operator = (const T&) throws if the InputIterator is not a move iterator. Whatever T::T(T&&) throws if the InputIterator is a move iterator. Whatever T::operator = (T&&) throws if the InputIterator is a move iterator. -iteratoriteratorAn iterator pointing at the element to be removed. Remove an element at the specified position. - - - - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. -Iterator InvalidationInvalidates iterators pointing to the erased element and iterators pointing to the elements behind the erased element (towards the end; except iterators equal to end()). -ComplexityLinear (in std::distance(pos, end())). -See Also:erase(iterator, iterator), rerase(iterator), rerase(iterator, iterator), erase_begin(size_type), erase_end(size_type), clear() -pos is a valid iterator pointing to the circular_buffer (but not an end()). The element at the position pos is removed. Iterator to the first element remaining beyond the removed element or end() if no such element exists. <a href="circular_buffer/implementation.html#circular_buffer.implementation.exceptions_of_move_if_noexcept_t">Exceptions of move_if_noexcept(T&). -iteratoriteratorThe beginning of the range to be removed. iteratorThe end of the range to be removed. Erase the range [first, last). - - - - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. -Iterator InvalidationInvalidates iterators pointing to the erased elements and iterators pointing to the elements behind the erased range (towards the end; except iterators equal to end()). -ComplexityLinear (in std::distance(first, end())). -See Also:erase(iterator), rerase(iterator), rerase(iterator, iterator), erase_begin(size_type), erase_end(size_type), clear() -Valid range [first, last). The elements from the range [first, last) are removed. (If first == last nothing is removed.) Iterator to the first element remaining beyond the removed elements or end() if no such element exists. <a href="circular_buffer/implementation.html#circular_buffer.implementation.exceptions_of_move_if_noexcept_t">Exceptions of move_if_noexcept(T&). -iteratoriteratorAn iterator pointing at the element to be removed. Remove an element at the specified position. - - - - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. -Iterator InvalidationInvalidates iterators pointing to the erased element and iterators pointing to the elements in front of the erased element (towards the beginning). -ComplexityLinear (in std::distance(begin(), pos)). -This method is symetric to the erase(iterator) method and is more effective than erase(iterator) if the iterator pos is close to the beginning of the circular_buffer. (See the Complexity.) -See Also:erase(iterator), erase(iterator, iterator), rerase(iterator, iterator), erase_begin(size_type), erase_end(size_type), clear() -pos is a valid iterator pointing to the circular_buffer (but not an end()). The element at the position pos is removed. Iterator to the first element remaining in front of the removed element or begin() if no such element exists. <a href="circular_buffer/implementation.html#circular_buffer.implementation.exceptions_of_move_if_noexcept_t">Exceptions of move_if_noexcept(T&). -iteratoriteratorThe beginning of the range to be removed. iteratorThe end of the range to be removed. Erase the range [first, last). - - - - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. -Iterator InvalidationInvalidates iterators pointing to the erased elements and iterators pointing to the elements in front of the erased range (towards the beginning). -ComplexityLinear (in std::distance(begin(), last)). -This method is symetric to the erase(iterator, iterator) method and is more effective than erase(iterator, iterator) if std::distance(begin(), first) is lower that std::distance(last, end()). -See Also:erase(iterator), erase(iterator, iterator), rerase(iterator), erase_begin(size_type), erase_end(size_type), clear() -Valid range [first, last). The elements from the range [first, last) are removed. (If first == last nothing is removed.) Iterator to the first element remaining in front of the removed elements or begin() if no such element exists. <a href="circular_buffer/implementation.html#circular_buffer.implementation.exceptions_of_move_if_noexcept_t">Exceptions of move_if_noexcept(T&). -voidsize_typeThe number of elements to be removed. Remove first n elements (with constant complexity for scalar types). - - - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. (I.e. no throw in case of scalars.) -Iterator InvalidationInvalidates iterators pointing to the first n erased elements. -ComplexityConstant (in n) for scalar types; linear for other types. -This method has been specially designed for types which do not require an explicit destructruction (e.g. integer, float or a pointer). For these scalar types a call to a destructor is not required which makes it possible to implement the "erase from beginning" operation with a constant complexity. For non-sacalar types the complexity is linear (hence the explicit destruction is needed) and the implementation is actually equivalent to rerase(begin(), begin() + n). -See Also:erase(iterator), erase(iterator, iterator), rerase(iterator), rerase(iterator, iterator), erase_end(size_type), clear() -n <= size() The n elements at the beginning of the circular_buffer will be removed. <a href="circular_buffer/implementation.html#circular_buffer.implementation.exceptions_of_move_if_noexcept_t">Exceptions of move_if_noexcept(T&). -voidsize_typeThe number of elements to be removed. Remove last n elements (with constant complexity for scalar types). - - - -Exception SafetyBasic; no-throw if the operation in the Throws section does not throw anything. (I.e. no throw in case of scalars.) -Iterator InvalidationInvalidates iterators pointing to the last n erased elements. -ComplexityConstant (in n) for scalar types; linear for other types. -This method has been specially designed for types which do not require an explicit destructruction (e.g. integer, float or a pointer). For these scalar types a call to a destructor is not required which makes it possible to implement the "erase from end" operation with a constant complexity. For non-sacalar types the complexity is linear (hence the explicit destruction is needed) and the implementation is actually equivalent to erase(end() - n, end()). -See Also:erase(iterator), erase(iterator, iterator), rerase(iterator), rerase(iterator, iterator), erase_begin(size_type), clear() -n <= size() The n elements at the end of the circular_buffer will be removed. <a href="circular_buffer/implementation.html#circular_buffer.implementation.exceptions_of_move_if_noexcept_t">Exceptions of move_if_noexcept(T&). -voidRemove all stored elements from the circular_buffer. - -Exception SafetyNo-throw. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer (except iterators equal to end()). -ComplexityConstant (in the size of the circular_buffer) for scalar types; linear for other types. -See Also:~circular_buffer(), erase(iterator), erase(iterator, iterator), rerase(iterator), rerase(iterator, iterator), erase_begin(size_type), erase_end(size_type) -size() == 0 Nothing. - -const allocator_type &allocator_type()The allocator. Create an empty circular_buffer with zero capacity. - - -ComplexityConstant. -Since Boost version 1.36 the behaviour of this constructor has changed. Now the constructor does not allocate any memory and both capacity and size are set to zero. Also note when inserting an element into a circular_buffer with zero capacity (e.g. by push_back(const_reference) or insert(iterator, value_type)) nothing will be inserted and the size (as well as capacity) remains zero. -You can explicitly set the capacity by calling the set_capacity(capacity_type) method or you can use the other constructor with the capacity specified. -See Also:circular_buffer(capacity_type, const allocator_type& alloc), set_capacity(capacity_type) -capacity() == 0 && size() == 0 Nothing. -capacity_typeThe maximum number of elements which can be stored in the circular_buffer. const allocator_type &allocator_type()The allocator. Create an empty circular_buffer with the specified capacity. - - -ComplexityConstant. -capacity() == buffer_capacity && size() == 0 An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). -size_typeThe number of elements the created circular_buffer will be filled with. param_value_typeThe element the created circular_buffer will be filled with. const allocator_type &allocator_type()The allocator. Create a full circular_buffer with the specified capacity and filled with n copies of item. - - -ComplexityLinear (in the n). -capacity() == n && full() && (*this)[0] == item && (*this)[1] == item && ... && (*this)[n - 1] == item An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -capacity_typeThe capacity of the created circular_buffer. size_typeThe number of elements the created circular_buffer will be filled with. param_value_typeThe element the created circular_buffer will be filled with. const allocator_type &allocator_type()The allocator. Create a circular_buffer with the specified capacity and filled with n copies of item. - - - -ComplexityLinear (in the n). -buffer_capacity >= n capacity() == buffer_capacity && size() == n && (*this)[0] == item && (*this)[1] == item && ... && (*this)[n - 1] == item An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -const circular_buffer< T, Alloc > &The circular_buffer to be copied. The copy constructor. Creates a copy of the specified circular_buffer. - - -ComplexityLinear (in the size of cb). -*this == cb An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -circular_buffer< T, Alloc > &&circular_buffer to 'steal' value from. The move constructor. Move constructs a circular_buffer from cb, leaving cb empty. - - - -Constant. -C++ compiler with rvalue references support. cb.empty() Nothing. -InputIteratorThe beginning of the range to be copied. InputIteratorThe end of the range to be copied. const allocator_type &allocator_type()The allocator. Create a full circular_buffer filled with a copy of the range. - - - -ComplexityLinear (in the std::distance(first, last)). -Valid range [first, last). - first and last have to meet the requirements of InputIterator. capacity() == std::distance(first, last) && full() && (*this)[0]== *first && (*this)[1] == *(first + 1) && ... && (*this)[std::distance(first, last) - 1] == *(last - 1) An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -capacity_typeThe capacity of the created circular_buffer. InputIteratorThe beginning of the range to be copied. InputIteratorThe end of the range to be copied. const allocator_type &allocator_type()The allocator. Create a circular_buffer with the specified capacity and filled with a copy of the range. - - - -ComplexityLinear (in std::distance(first, last); in min[capacity, std::distance(first, last)] if the InputIterator is a RandomAccessIterator). -Valid range [first, last). - first and last have to meet the requirements of InputIterator. capacity() == buffer_capacity && size() <= std::distance(first, last) && (*this)[0]== *(last - buffer_capacity) && (*this)[1] == *(last - buffer_capacity + 1) && ... && (*this)[buffer_capacity - 1] == *(last - 1) - - If the number of items to be copied from the range [first, last) is greater than the specified buffer_capacity then only elements from the range [last - buffer_capacity, last) will be copied. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -The destructor. Destroys the circular_buffer. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer (including iterators equal to end()). -ComplexityConstant (in the size of the circular_buffer) for scalar types; linear for other types. -See Also:clear() -Nothing. -circular_buffer< T, Alloc > &const circular_buffer< T, Alloc > &The circular_buffer to be copied. The assign operator. Makes this circular_buffer to become a copy of the specified circular_buffer. - - -Exception SafetyStrong. -Iterator InvalidationInvalidates all iterators pointing to this circular_buffer (except iterators equal to end()). -ComplexityLinear (in the size of cb). -See Also:assign(size_type, const_reference), assign(capacity_type, size_type, const_reference), assign(InputIterator, InputIterator), assign(capacity_type, InputIterator, InputIterator) -*this == cb An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -circular_buffer< T, Alloc > &circular_buffer< T, Alloc > &&circular_buffer to 'steal' value from. Move assigns content of cb to *this, leaving cb empty. - - - -ComplexityConstant. -C++ compiler with rvalue references support. cb.empty() Nothing. - -voidValT -voidValT -iteratoriteratorValT -iteratoriteratorValT -voidsize_typeCheck if the index is valid. -voidPointer &Increment the pointer. -voidPointer &Decrement the pointer. -PointerPointerdifference_typeAdd n to the pointer. -PointerPointerdifference_typeSubtract n from the pointer. -pointerpointerMap the null pointer to virtual end of circular buffer. -pointersize_typeAllocate memory. -voidpointersize_typeDeallocate memory. -boolconst_pointerDoes the pointer point to the uninitialized memory? -voidpointerparam_value_typeReplace an element. -voidpointerrvalue_typeReplace an element. -voidboolpointerparam_value_typeConstruct or replace an element. construct has to be set to true if and only if pos points to an uninitialized memory. -voidboolpointerrvalue_typeConstruct or replace an element. construct has to be set to true if and only if pos points to an uninitialized memory. -voidpointerDestroy an item. -voidpointerDestroy an item only if it has been constructed. -voidDestroy the whole content of the circular buffer. -voidconst true_type &Specialized destroy_content method. -voidconst false_type &Specialized destroy_content method. -voidDestroy content and free allocated memory. -voidcapacity_typeInitialize the internal buffer. -voidcapacity_typeparam_value_typeInitialize the internal buffer. -voidIntegralTypeIntegralTypeconst true_type &Specialized initialize method. -voidIteratorIteratorconst false_type &Specialized initialize method. -voidInputIteratorInputIteratorconst std::input_iterator_tag &Specialized initialize method. -voidForwardIteratorForwardIteratorconst std::forward_iterator_tag &Specialized initialize method. -voidcapacity_typeIntegralTypeIntegralTypeconst true_type &Specialized initialize method. -voidcapacity_typeIteratorIteratorconst false_type &Specialized initialize method. -voidcapacity_typeInputIteratorInputIteratorconst std::input_iterator_tag &Specialized initialize method. -voidcapacity_typeForwardIteratorForwardIteratorconst std::forward_iterator_tag &Specialized initialize method. -voidcapacity_typeForwardIteratorForwardIteratorsize_typeInitialize the circular buffer. -voidpointerpointercapacity_typeReset the circular buffer. -voidcircular_buffer< T, Alloc > &const true_type &Specialized method for swapping the allocator. -voidcircular_buffer< T, Alloc > &const false_type &Specialized method for swapping the allocator. -voidIntegralTypeIntegralTypeconst true_type &Specialized assign method. -voidIteratorIteratorconst false_type &Specialized assign method. -voidInputIteratorInputIteratorconst std::input_iterator_tag &Specialized assign method. -voidForwardIteratorForwardIteratorconst std::forward_iterator_tag &Specialized assign method. -voidcapacity_typeIntegralTypeIntegralTypeconst true_type &Specialized assign method. -voidcapacity_typeIteratorIteratorconst false_type &Specialized assign method. -voidcapacity_typeInputIteratorInputIteratorconst std::input_iterator_tag &Specialized assign method. -voidcapacity_typeForwardIteratorForwardIteratorconst std::forward_iterator_tag &Specialized assign method. -voidcapacity_typesize_typeconst Functor &Helper assign method. -iteratorconst iterator &ValTHelper insert method. -voidconst iterator &IntegralTypeIntegralTypeconst true_type &Specialized insert method. -voidconst iterator &IteratorIteratorconst false_type &Specialized insert method. -voiditeratorInputIteratorInputIteratorconst std::input_iterator_tag &Specialized insert method. -voidconst iterator &ForwardIteratorForwardIteratorconst std::forward_iterator_tag &Specialized insert method. -voidconst iterator &size_typeconst Wrapper &Helper insert method. -voidconst iterator &IntegralTypeIntegralTypeconst true_type &Specialized rinsert method. -voidconst iterator &IteratorIteratorconst false_type &Specialized rinsert method. -voiditeratorInputIteratorInputIteratorconst std::input_iterator_tag &Specialized insert method. -voidconst iterator &ForwardIteratorForwardIteratorconst std::forward_iterator_tag &Specialized rinsert method. -voidconst iterator &size_typeconst Wrapper &Helper rinsert method. -voidsize_typeconst true_type &Specialized erase_begin method. -voidsize_typeconst false_type &Specialized erase_begin method. -voidsize_typeconst true_type &Specialized erase_end method. -voidsize_typeconst false_type &Specialized erase_end method. - -boolconst circular_buffer< T, Alloc > &The circular_buffer to compare. const circular_buffer< T, Alloc > &The circular_buffer to compare. Compare two circular_buffers element-by-element to determine if they are equal. - - -ComplexityLinear (in the size of the circular_buffers). -Iterator InvalidationDoes not invalidate any iterators. -lhs.size() == rhs.size() && std::equal(lhs.begin(), lhs.end(), rhs.begin()) Nothing. -boolconst circular_buffer< T, Alloc > &The circular_buffer to compare. const circular_buffer< T, Alloc > &The circular_buffer to compare. Compare two circular_buffers element-by-element to determine if the left one is lesser than the right one. - - -ComplexityLinear (in the size of the circular_buffers). -Iterator InvalidationDoes not invalidate any iterators. -std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end()) Nothing. -boolconst circular_buffer< T, Alloc > &The circular_buffer to compare. const circular_buffer< T, Alloc > &The circular_buffer to compare. Compare two circular_buffers element-by-element to determine if they are non-equal. - - -ComplexityLinear (in the size of the circular_buffers). -Iterator InvalidationDoes not invalidate any iterators. -See Also:operator==(const circular_buffer<T,Alloc>&, const circular_buffer<T,Alloc>&) -!(lhs == rhs) Nothing. -boolconst circular_buffer< T, Alloc > &The circular_buffer to compare. const circular_buffer< T, Alloc > &The circular_buffer to compare. Compare two circular_buffers element-by-element to determine if the left one is greater than the right one. - - -ComplexityLinear (in the size of the circular_buffers). -Iterator InvalidationDoes not invalidate any iterators. -See Also:operator<(const circular_buffer<T,Alloc>&, const circular_buffer<T,Alloc>&) -rhs < lhs Nothing. -boolconst circular_buffer< T, Alloc > &The circular_buffer to compare. const circular_buffer< T, Alloc > &The circular_buffer to compare. Compare two circular_buffers element-by-element to determine if the left one is lesser or equal to the right one. - - -ComplexityLinear (in the size of the circular_buffers). -Iterator InvalidationDoes not invalidate any iterators. -See Also:operator<(const circular_buffer<T,Alloc>&, const circular_buffer<T,Alloc>&) -!(rhs < lhs) Nothing. -boolconst circular_buffer< T, Alloc > &The circular_buffer to compare. const circular_buffer< T, Alloc > &The circular_buffer to compare. Compare two circular_buffers element-by-element to determine if the left one is greater or equal to the right one. - - -ComplexityLinear (in the size of the circular_buffers). -Iterator InvalidationDoes not invalidate any iterators. -See Also:operator<(const circular_buffer<T,Alloc>&, const circular_buffer<T,Alloc>&) -!(lhs < rhs) Nothing. -voidcircular_buffer< T, Alloc > &The circular_buffer whose content will be swapped with rhs. circular_buffer< T, Alloc > &The circular_buffer whose content will be swapped with lhs. Swap the contents of two circular_buffers. - - -ComplexityConstant (in the size of the circular_buffers). -Iterator InvalidationInvalidates all iterators of both circular_buffers. (On the other hand the iterators still point to the same elements but within another container. If you want to rely on this feature you have to turn the Debug Support off otherwise an assertion will report an error if such invalidated iterator is used.) -See Also:swap(circular_buffer<T, Alloc>&) -lhs contains elements of rhs and vice versa. Nothing. - - - - - - - - -
-
- - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - -
-
- -boost::circular_buffer< T, Alloc >Space optimized circular buffer container adaptor. T must be a copyable class or must have an noexcept move constructor and move assignment operator. circular_buffer< T, Alloc >::value_type -circular_buffer< T, Alloc >::pointer -circular_buffer< T, Alloc >::const_pointer -circular_buffer< T, Alloc >::reference -circular_buffer< T, Alloc >::const_reference -circular_buffer< T, Alloc >::size_type -circular_buffer< T, Alloc >::difference_type -circular_buffer< T, Alloc >::allocator_type -circular_buffer< T, Alloc >::const_iterator -circular_buffer< T, Alloc >::iterator -circular_buffer< T, Alloc >::const_reverse_iterator -circular_buffer< T, Alloc >::reverse_iterator -circular_buffer< T, Alloc >::array_range -circular_buffer< T, Alloc >::const_array_range -circular_buffer< T, Alloc >::param_value_type -circular_buffer< T, Alloc >::rvalue_type -Capacity controller of the space optimized circular buffer.See Also:capacity_control in details.hpp. - class capacity_control - { - size_type m_capacity; // Available capacity. - size_type m_min_capacity; // Minimum capacity. - public: - capacity_control(size_type capacity, size_type min_capacity = 0) - : m_capacity(capacity), m_min_capacity(min_capacity) - {}; - size_type capacity() const { return m_capacity; } - size_type min_capacity() const { return m_min_capacity; } - operator size_type() const { return m_capacity; } - }; - Always capacity >= min_capacity. The capacity() represents the capacity of the circular_buffer_space_optimized and the min_capacity() determines the minimal allocated size of its internal buffer. The converting constructor of the capacity_control allows implicit conversion from size_type-like types which ensures compatibility of creating an instance of the circular_buffer_space_optimized with other STL containers.On the other hand the operator size_type() provides implicit conversion to the size_type which allows to treat the capacity of the circular_buffer_space_optimized the same way as in the circular_buffer. cb_details::capacity_control< size_type > - -boolIs the circular_buffer_space_optimized full? - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer_space_optimized). -See Also:empty() -true if the number of elements stored in the circular_buffer_space_optimized equals the capacity of the circular_buffer_space_optimized; false otherwise. Nothing. -size_typeGet the maximum number of elements which can be inserted into the circular_buffer_space_optimized without overwriting any of already stored elements. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer_space_optimized). -See Also:capacity(), size(), max_size() -capacity().capacity() - size() Nothing. -const capacity_type &Get the capacity of the circular_buffer_space_optimized. - -Exception SafetyNo-throw. -Iterator InvalidationDoes not invalidate any iterators. -ComplexityConstant (in the size of the circular_buffer_space_optimized). -See Also:reserve(), size(), max_size(), set_capacity(const capacity_type&) -The capacity controller representing the maximum number of elements which can be stored in the circular_buffer_space_optimized and the minimal allocated size of the internal buffer. Nothing. -voidconst capacity_type &The new capacity controller. Change the capacity (and the minimal guaranteed amount of allocated memory) of the circular_buffer_space_optimized. - - -Exception SafetyStrong. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in min[size(), capacity_ctrl.capacity()]). -To explicitly clear the extra allocated memory use the shrink-to-fit technique: - - boost::circular_buffer_space_optimized<int> cb(1000); - ... - boost::circular_buffer_space_optimized<int>(cb).swap(cb); - - For more information about the shrink-to-fit technique in STL see http://www.gotw.ca/gotw/054.htm. -See Also:rset_capacity(const capacity_type&), resize(size_type, const_reference) -capacity() == capacity_ctrl && size() <= capacity_ctrl.capacity() - - If the current number of elements stored in the circular_buffer_space_optimized is greater than the desired new capacity then number of [size() - capacity_ctrl.capacity()] last elements will be removed and the new size will be equal to capacity_ctrl.capacity(). - - If the current number of elements stored in the circular_buffer_space_optimized is lower than the new capacity then the amount of allocated memory in the internal buffer may be accommodated as necessary but it will never drop below capacity_ctrl.min_capacity(). An allocation error if memory is exhausted, (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -voidsize_typeThe new size. param_value_typevalue_type()The element the circular_buffer_space_optimized will be filled with in order to gain the requested size. (See the Effect.) Change the size of the circular_buffer_space_optimized. - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the new size of the circular_buffer_space_optimized). -See Also:rresize(size_type, const_reference), set_capacity(const capacity_type&) -size() == new_size && capacity().capacity() >= new_size - - If the new size is greater than the current size, copies of item will be inserted at the back of the of the circular_buffer_space_optimized in order to achieve the desired size. In the case the resulting size exceeds the current capacity the capacity will be set to new_size. - - If the current number of elements stored in the circular_buffer_space_optimized is greater than the desired new size then number of [size() - new_size] last elements will be removed. (The capacity will remain unchanged.) - - The amount of allocated memory in the internal buffer may be accommodated as necessary. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -voidconst capacity_type &The new capacity controller. Change the capacity (and the minimal guaranteed amount of allocated memory) of the circular_buffer_space_optimized. - - -Exception SafetyStrong. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in min[size(), capacity_ctrl.capacity()]). -See Also:set_capacity(const capacity_type&), rresize(size_type, const_reference) -capacity() == capacity_ctrl && size() <= capacity_ctrl - - If the current number of elements stored in the circular_buffer_space_optimized is greater than the desired new capacity then number of [size() - capacity_ctrl.capacity()] first elements will be removed and the new size will be equal to capacity_ctrl.capacity(). - - If the current number of elements stored in the circular_buffer_space_optimized is lower than the new capacity then the amount of allocated memory in the internal buffer may be accommodated as necessary but it will never drop below capacity_ctrl.min_capacity(). An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -voidsize_typeThe new size. param_value_typevalue_type()The element the circular_buffer_space_optimized will be filled with in order to gain the requested size. (See the Effect.) Change the size of the circular_buffer_space_optimized. - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the new size of the circular_buffer_space_optimized). -See Also:resize(size_type, const_reference), rset_capacity(const capacity_type&) -size() == new_size && capacity().capacity() >= new_size - - If the new size is greater than the current size, copies of item will be inserted at the front of the of the circular_buffer_space_optimized in order to achieve the desired size. In the case the resulting size exceeds the current capacity the capacity will be set to new_size. - - If the current number of elements stored in the circular_buffer_space_optimized is greater than the desired new size then number of [size() - new_size] first elements will be removed. (The capacity will remain unchanged.) - - The amount of allocated memory in the internal buffer may be accommodated as necessary. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -voidsize_typeThe number of elements the circular_buffer_space_optimized will be filled with. param_value_typeThe element the circular_buffer_space_optimized will be filled with. Assign n items into the space optimized circular buffer. The content of the circular_buffer_space_optimized will be removed and replaced with n copies of the item. - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the n). -See Also:operator=, assign(capacity_type, size_type, const_reference), assign(InputIterator, InputIterator), assign(capacity_type, InputIterator, InputIterator) -capacity().capacity() == n && capacity().min_capacity() == 0 && size() == n && (*this)[0] == item && (*this)[1] == item && ... && (*this) [n - 1] == item - - The amount of allocated memory in the internal buffer is n. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -voidcapacity_typeThe new capacity controller. size_typeThe number of elements the circular_buffer_space_optimized will be filled with. param_value_typeThe element the circular_buffer_space_optimized will be filled with. Assign n items into the space optimized circular buffer specifying the capacity. The capacity of the circular_buffer_space_optimized will be set to the specified value and the content of the circular_buffer_space_optimized will be removed and replaced with n copies of the item. - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the n). -See Also:operator=, assign(size_type, const_reference), assign(InputIterator, InputIterator), assign(capacity_type, InputIterator, InputIterator) -capacity_ctrl.capacity() >= n capacity() == capacity_ctrl && size() == n && (*this)[0] == item && (*this)[1] == item && ... && (*this) [n - 1] == item - - The amount of allocated memory will be max[n, capacity_ctrl.min_capacity()]. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -voidInputIteratorThe beginning of the range to be copied. InputIteratorThe end of the range to be copied. Assign a copy of the range into the space optimized circular buffer. The content of the circular_buffer_space_optimized will be removed and replaced with copies of elements from the specified range. - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the std::distance(first, last)). -See Also:operator=, assign(size_type, const_reference), assign(capacity_type, size_type, const_reference), assign(capacity_type, InputIterator, InputIterator) -Valid range [first, last). - first and last have to meet the requirements of InputIterator. capacity().capacity() == std::distance(first, last) && capacity().min_capacity() == 0 && size() == std::distance(first, last) && (*this)[0]== *first && (*this)[1] == *(first + 1) && ... && (*this)[std::distance(first, last) - 1] == *(last - 1) - - The amount of allocated memory in the internal buffer is std::distance(first, last). An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept and InputIterator is a move iterator. -voidcapacity_typeThe new capacity controller. InputIteratorThe beginning of the range to be copied. InputIteratorThe end of the range to be copied. Assign a copy of the range into the space optimized circular buffer specifying the capacity. The capacity of the circular_buffer_space_optimized will be set to the specified value and the content of the circular_buffer_space_optimized will be removed and replaced with copies of elements from the specified range. - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in std::distance(first, last); in min[capacity_ctrl.capacity(), std::distance(first, last)] if the InputIterator is a RandomAccessIterator). -See Also:operator=, assign(size_type, const_reference), assign(capacity_type, size_type, const_reference), assign(InputIterator, InputIterator) -Valid range [first, last). - first and last have to meet the requirements of InputIterator. capacity() == capacity_ctrl && size() <= std::distance(first, last) && (*this)[0]== *(last - capacity) && (*this)[1] == *(last - capacity + 1) && ... && (*this)[capacity - 1] == *(last - 1) - - If the number of items to be copied from the range [first, last) is greater than the specified capacity then only elements from the range [last - capacity, last) will be copied. - - The amount of allocated memory in the internal buffer is max[std::distance(first, last), capacity_ctrl.min_capacity()]. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept and InputIterator is a move iterator. -voidcircular_buffer_space_optimized< T, Alloc > &The circular_buffer_space_optimized whose content will be swapped. Swap the contents of two space-optimized circular-buffers. - - -Exception SafetyNo-throw. -Iterator InvalidationInvalidates all iterators of both circular_buffer_space_optimized containers. (On the other hand the iterators still point to the same elements but within another container. If you want to rely on this feature you have to turn the __debug_support off, otherwise an assertion will report an error if such invalidated iterator is used.) -ComplexityConstant (in the size of the circular_buffer_space_optimized). -See Also:swap(circular_buffer<T, Alloc>&, circular_buffer<T, Alloc>&), swap(circular_buffer_space_optimized<T, Alloc>&, circular_buffer_space_optimized<T, Alloc>&) -this contains elements of cb and vice versa; the capacity and the amount of allocated memory in the internal buffer of this equal to the capacity and the amount of allocated memory of cb and vice versa. Nothing. -voidparam_value_typeThe element to be inserted. Insert a new element at the end of the space optimized circular buffer. - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:push_front(const_reference), pop_back(), pop_front() -if capacity().capacity() > 0 then back() == item - If the circular_buffer_space_optimized is full, the first element will be removed. If the capacity is 0, nothing will be inserted. - - The amount of allocated memory in the internal buffer may be predictively increased. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -voidrvalue_typeThe element to be inserted. Insert a new element at the end of the space optimized circular buffer. - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:push_front(const_reference), pop_back(), pop_front() -if capacity().capacity() > 0 then back() == item - If the circular_buffer_space_optimized is full, the first element will be removed. If the capacity is 0, nothing will be inserted. - - The amount of allocated memory in the internal buffer may be predictively increased. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). -voidInsert a new element at the end of the space optimized circular buffer. - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:push_front(const_reference), pop_back(), pop_front() -if capacity().capacity() > 0 then back() == item - If the circular_buffer_space_optimized is full, the first element will be removed. If the capacity is 0, nothing will be inserted. - - The amount of allocated memory in the internal buffer may be predictively increased. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T() throws. Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -voidparam_value_typeThe element to be inserted. Insert a new element at the beginning of the space optimized circular buffer. - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:push_back(const_reference), pop_back(), pop_front() -if capacity().capacity() > 0 then front() == item - If the circular_buffer_space_optimized is full, the last element will be removed. If the capacity is 0, nothing will be inserted. - - The amount of allocated memory in the internal buffer may be predictively increased. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -voidrvalue_typeThe element to be inserted. Insert a new element at the beginning of the space optimized circular buffer. - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:push_back(const_reference), pop_back(), pop_front() -if capacity().capacity() > 0 then front() == item - If the circular_buffer_space_optimized is full, the last element will be removed. If the capacity is 0, nothing will be inserted. - - The amount of allocated memory in the internal buffer may be predictively increased. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -voidInsert a new element at the beginning of the space optimized circular buffer. - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:push_back(const_reference), pop_back(), pop_front() -if capacity().capacity() > 0 then front() == item - If the circular_buffer_space_optimized is full, the last element will be removed. If the capacity is 0, nothing will be inserted. - - The amount of allocated memory in the internal buffer may be predictively increased. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T() throws. Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -voidRemove the last element from the space optimized circular buffer. - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:pop_front(), push_back(const_reference), push_front(const_reference) -!empty() The last element is removed from the circular_buffer_space_optimized. - - The amount of allocated memory in the internal buffer may be predictively decreased. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). -voidRemove the first element from the space optimized circular buffer. - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:pop_back(), push_back(const_reference), push_front(const_reference) -!empty() The first element is removed from the circular_buffer_space_optimized. - - The amount of allocated memory in the internal buffer may be predictively decreased. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). -iteratoriteratorAn iterator specifying the position where the item will be inserted. param_value_typeThe element to be inserted. Insert an element at the specified position. - - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator), rinsert(iterator, value_type), rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer_space_optimized or its end. The item will be inserted at the position pos. - If the circular_buffer_space_optimized is full, the first element will be overwritten. If the circular_buffer_space_optimized is full and the pos points to begin(), then the item will not be inserted. If the capacity is 0, nothing will be inserted. - - The amount of allocated memory in the internal buffer may be predictively increased. Iterator to the inserted element or begin() if the item is not inserted. (See the Effect.) An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. Whatever T::operator = (const T&) throws. -iteratoriteratorAn iterator specifying the position where the item will be inserted. rvalue_typeThe element to be inserted. Insert an element at the specified position. - - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator), rinsert(iterator, value_type), rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer_space_optimized or its end. The item will be inserted at the position pos. - If the circular_buffer_space_optimized is full, the first element will be overwritten. If the circular_buffer_space_optimized is full and the pos points to begin(), then the item will not be inserted. If the capacity is 0, nothing will be inserted. - - The amount of allocated memory in the internal buffer may be predictively increased. Iterator to the inserted element or begin() if the item is not inserted. (See the Effect.) An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -iteratoriteratorAn iterator specifying the position where the item will be inserted. Insert an element at the specified position. - - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator), rinsert(iterator, value_type), rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer_space_optimized or its end. The item will be inserted at the position pos. - If the circular_buffer_space_optimized is full, the first element will be overwritten. If the circular_buffer_space_optimized is full and the pos points to begin(), then the item will not be inserted. If the capacity is 0, nothing will be inserted. - - The amount of allocated memory in the internal buffer may be predictively increased. Iterator to the inserted element or begin() if the item is not inserted. (See the Effect.) An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T() throws. Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -voiditeratorAn iterator specifying the position where the items will be inserted. size_typeThe number of items the to be inserted. param_value_typeThe element whose copies will be inserted. Insert n copies of the item at the specified position. - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in min[capacity().capacity(), size() + n]). -ExampleConsider a circular_buffer_space_optimized with the capacity of 6 and the size of 4. Its internal buffer may look like the one below. - - |1|2|3|4| | | - p ___^ - -After inserting 5 elements at the position p: - - insert(p, (size_t)5, 0); - -actually only 4 elements get inserted and elements 1 and 2 are overwritten. This is due to the fact the insert operation preserves the capacity. After insertion the internal buffer looks like this: - -|0|0|0|0|3|4| - -For comparison if the capacity would not be preserved the internal buffer would then result in |1|2|0|0|0|0|0|3|4|. -See Also:insert(iterator, value_type), insert(iterator, InputIterator, InputIterator), rinsert(iterator, value_type), rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer_space_optimized or its end. The number of min[n, (pos - begin()) + reserve()] elements will be inserted at the position pos. -The number of min[pos - begin(), max[0, n - reserve()]] elements will be overwritten at the beginning of the circular_buffer_space_optimized. -(See Example for the explanation.) - - The amount of allocated memory in the internal buffer may be predictively increased. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. Whatever T::operator = (const T&) throws. -voiditeratorAn iterator specifying the position where the range will be inserted. InputIteratorThe beginning of the range to be inserted. InputIteratorThe end of the range to be inserted. Insert the range [first, last) at the specified position. - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in [size() + std::distance(first, last)]; in min[capacity().capacity(), size() + std::distance(first, last)] if the InputIterator is a RandomAccessIterator). -ExampleConsider a circular_buffer_space_optimized with the capacity of 6 and the size of 4. Its internal buffer may look like the one below. - - |1|2|3|4| | | - p ___^ - -After inserting a range of elements at the position p: - - int array[] = { 5, 6, 7, 8, 9 }; -insert(p, array, array + 5); - - actually only elements 6, 7, 8 and 9 from the specified range get inserted and elements 1 and 2 are overwritten. This is due to the fact the insert operation preserves the capacity. After insertion the internal buffer looks like this: - -|6|7|8|9|3|4| - -For comparison if the capacity would not be preserved the internal buffer would then result in |1|2|5|6|7|8|9|3|4|. -See Also:insert(iterator, value_type), insert(iterator, size_type, value_type), rinsert(iterator, value_type), rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer_space_optimized or its end. -Valid range [first, last) where first and last meet the requirements of an InputIterator. Elements from the range [first + max[0, distance(first, last) - (pos - begin()) - reserve()], last) will be inserted at the position pos. -The number of min[pos - begin(), max[0, distance(first, last) - reserve()]] elements will be overwritten at the beginning of the circular_buffer_space_optimized. -(See Example for the explanation.) - - The amount of allocated memory in the internal buffer may be predictively increased. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -iteratoriteratorAn iterator specifying the position before which the item will be inserted. param_value_typeThe element to be inserted. Insert an element before the specified position. - - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator), insert(iterator, value_type), insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer_space_optimized or its end. The item will be inserted before the position pos. - If the circular_buffer_space_optimized is full, the last element will be overwritten. If the circular_buffer_space_optimized is full and the pos points to end(), then the item will not be inserted. If the capacity is 0, nothing will be inserted. - - The amount of allocated memory in the internal buffer may be predictively increased. Iterator to the inserted element or end() if the item is not inserted. (See the Effect.) An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. Whatever T::operator = (const T&) throws. -iteratoriteratorAn iterator specifying the position before which the item will be inserted. rvalue_typeThe element to be inserted. Insert an element before the specified position. - - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator), insert(iterator, value_type), insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer_space_optimized or its end. The item will be inserted before the position pos. - If the circular_buffer_space_optimized is full, the last element will be overwritten. If the circular_buffer_space_optimized is full and the pos points to end(), then the item will not be inserted. If the capacity is 0, nothing will be inserted. - - The amount of allocated memory in the internal buffer may be predictively increased. Iterator to the inserted element or end() if the item is not inserted. (See the Effect.) An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -iteratoriteratorAn iterator specifying the position before which the item will be inserted. Insert an element before the specified position. - - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:rinsert(iterator, size_type, value_type), rinsert(iterator, InputIterator, InputIterator), insert(iterator, value_type), insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer_space_optimized or its end. The item will be inserted before the position pos. - If the circular_buffer_space_optimized is full, the last element will be overwritten. If the circular_buffer_space_optimized is full and the pos points to end(), then the item will not be inserted. If the capacity is 0, nothing will be inserted. - - The amount of allocated memory in the internal buffer may be predictively increased. Iterator to the inserted element or end() if the item is not inserted. (See the Effect.) An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T() throws. Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept. -voiditeratorAn iterator specifying the position where the items will be inserted. size_typeThe number of items the to be inserted. param_value_typeThe element whose copies will be inserted. Insert n copies of the item before the specified position. - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in min[capacity().capacity(), size() + n]). -ExampleConsider a circular_buffer_space_optimized with the capacity of 6 and the size of 4. Its internal buffer may look like the one below. - - |1|2|3|4| | | - p ___^ - -After inserting 5 elements before the position p: - - rinsert(p, (size_t)5, 0); - -actually only 4 elements get inserted and elements 3 and 4 are overwritten. This is due to the fact the rinsert operation preserves the capacity. After insertion the internal buffer looks like this: - -|1|2|0|0|0|0| - -For comparison if the capacity would not be preserved the internal buffer would then result in |1|2|0|0|0|0|0|3|4|. -See Also:rinsert(iterator, value_type), rinsert(iterator, InputIterator, InputIterator), insert(iterator, value_type), insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer_space_optimized or its end. The number of min[n, (end() - pos) + reserve()] elements will be inserted before the position pos. -The number of min[end() - pos, max[0, n - reserve()]] elements will be overwritten at the end of the circular_buffer_space_optimized. -(See Example for the explanation.) - - The amount of allocated memory in the internal buffer may be predictively increased. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. Whatever T::operator = (const T&) throws. -voiditeratorAn iterator specifying the position where the range will be inserted. InputIteratorThe beginning of the range to be inserted. InputIteratorThe end of the range to be inserted. Insert the range [first, last) before the specified position. - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in [size() + std::distance(first, last)]; in min[capacity().capacity(), size() + std::distance(first, last)] if the InputIterator is a RandomAccessIterator). -ExampleConsider a circular_buffer_space_optimized with the capacity of 6 and the size of 4. Its internal buffer may look like the one below. - - |1|2|3|4| | | - p ___^ - -After inserting a range of elements before the position p: - - int array[] = { 5, 6, 7, 8, 9 }; -insert(p, array, array + 5); - - actually only elements 5, 6, 7 and 8 from the specified range get inserted and elements 3 and 4 are overwritten. This is due to the fact the rinsert operation preserves the capacity. After insertion the internal buffer looks like this: - -|1|2|5|6|7|8| - -For comparison if the capacity would not be preserved the internal buffer would then result in |1|2|5|6|7|8|9|3|4|. -See Also:rinsert(iterator, value_type), rinsert(iterator, size_type, value_type), insert(iterator, value_type), insert(iterator, size_type, value_type), insert(iterator, InputIterator, InputIterator) -pos is a valid iterator pointing to the circular_buffer_space_optimized or its end. - Valid range [first, last) where first and last meet the requirements of an InputIterator. Elements from the range [first, last - max[0, distance(first, last) - (end() - pos) - reserve()]) will be inserted before the position pos. -The number of min[end() - pos, max[0, distance(first, last) - reserve()]] elements will be overwritten at the end of the circular_buffer. -(See Example for the explanation.) - - The amount of allocated memory in the internal buffer may be predictively increased. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. Whatever T::operator = (const T&) throws. -iteratoriteratorAn iterator pointing at the element to be removed. Remove an element at the specified position. - - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:erase(iterator, iterator), rerase(iterator), rerase(iterator, iterator), clear() -pos is a valid iterator pointing to the circular_buffer_space_optimized (but not an end()). The element at the position pos is removed. - - The amount of allocated memory in the internal buffer may be predictively decreased. Iterator to the first element remaining beyond the removed element or end() if no such element exists. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::operator = (const T&) throws or nothing if T::operator = (T&&) is noexcept. -iteratoriteratorThe beginning of the range to be removed. iteratorThe end of the range to be removed. Erase the range [first, last). - - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:erase(iterator), rerase(iterator), rerase(iterator, iterator), clear() -Valid range [first, last). The elements from the range [first, last) are removed. (If first == last nothing is removed.) - - The amount of allocated memory in the internal buffer may be predictively decreased. Iterator to the first element remaining beyond the removed elements or end() if no such element exists. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::operator = (const T&) throws or nothing if T::operator = (T&&) is noexcept. -iteratoriteratorAn iterator pointing at the element to be removed. Remove an element at the specified position. - - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -Basically there is no difference between erase(iterator) and this method. It is implemented only for consistency with the base circular_buffer. -See Also:erase(iterator), erase(iterator, iterator), rerase(iterator, iterator), clear() -pos is a valid iterator pointing to the circular_buffer_space_optimized (but not an end()). - - The amount of allocated memory in the internal buffer may be predictively decreased. The element at the position pos is removed. Iterator to the first element remaining in front of the removed element or begin() if no such element exists. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::operator = (const T&) throws or nothing if T::operator = (T&&) is noexcept. -iteratoriteratorThe beginning of the range to be removed. iteratorThe end of the range to be removed. Erase the range [first, last). - - - - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -Basically there is no difference between erase(iterator, iterator) and this method. It is implemented only for consistency with the base <circular_buffer. -See Also:erase(iterator), erase(iterator, iterator), rerase(iterator), clear() -Valid range [first, last). The elements from the range [first, last) are removed. (If first == last nothing is removed.) - - The amount of allocated memory in the internal buffer may be predictively decreased. Iterator to the first element remaining in front of the removed elements or begin() if no such element exists. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::operator = (const T&) throws or nothing if T::operator = (T&&) is noexcept. -voidRemove all stored elements from the space optimized circular buffer. - -Exception SafetyBasic. -Iterator InvalidationInvalidates all iterators pointing to the circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of the circular_buffer_space_optimized). -See Also:~circular_buffer_space_optimized(), erase(iterator), erase(iterator, iterator), rerase(iterator), rerase(iterator, iterator) -size() == 0 - - The amount of allocated memory in the internal buffer may be predictively decreased. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). - -const allocator_type &allocator_type()The allocator. Create an empty space optimized circular buffer with zero capacity. - - -ComplexityConstant. -Since Boost version 1.36 the behaviour of this constructor has changed. Now it creates a space optimized circular buffer with zero capacity. -capacity().capacity() == 0 && capacity().min_capacity() == 0 && size() == 0 Nothing. -capacity_typeThe capacity controller representing the maximum number of elements which can be stored in the circular_buffer_space_optimized and the minimal allocated size of the internal buffer. const allocator_type &allocator_type()The allocator. Create an empty space optimized circular buffer with the specified capacity. - - -ComplexityConstant. -capacity() == capacity_ctrl && size() == 0 - - The amount of allocated memory in the internal buffer is capacity_ctrl.min_capacity(). An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). -capacity_typeThe capacity controller representing the maximum number of elements which can be stored in the circular_buffer_space_optimized and the minimal allocated size of the internal buffer. param_value_typeThe element the created circular_buffer_space_optimized will be filled with. const allocator_type &allocator_type()The allocator. Create a full space optimized circular buffer with the specified capacity filled with capacity_ctrl.capacity() copies of item. - - -ComplexityLinear (in the capacity_ctrl.capacity()). -capacity() == capacity_ctrl && full() && (*this)[0] == item && (*this)[1] == item && ... && (*this) [capacity_ctrl.capacity() - 1] == item - - The amount of allocated memory in the internal buffer is capacity_ctrl.capacity(). An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). T::T(const T&) throws. -capacity_typeThe capacity controller representing the maximum number of elements which can be stored in the circular_buffer_space_optimized and the minimal allocated size of the internal buffer. size_typeThe number of elements the created circular_buffer_space_optimized will be filled with. param_value_typeThe element the created circular_buffer_space_optimized will be filled with. const allocator_type &allocator_type()The allocator. Create a space optimized circular buffer with the specified capacity filled with n copies of item. - - - -ComplexityLinear (in the n). -capacity_ctrl.capacity() >= n capacity() == capacity_ctrl && size() == n && (*this)[0] == item && (*this)[1] == item && ... && (*this)[n - 1] == item - - The amount of allocated memory in the internal buffer is max[n, capacity_ctrl.min_capacity()]. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -const circular_buffer_space_optimized< T, Alloc > &The circular_buffer_space_optimized to be copied. The copy constructor. Creates a copy of the specified circular_buffer_space_optimized. - - -ComplexityLinear (in the size of cb). -*this == cb - - The amount of allocated memory in the internal buffer is cb.size(). An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -circular_buffer_space_optimized< T, Alloc > &&circular_buffer to 'steal' value from. The move constructor. Move constructs a circular_buffer_space_optimized from cb, leaving cb empty. - - - -Constant. -C++ compiler with rvalue references support. cb.empty() Nothing. -InputIteratorThe beginning of the range to be copied. InputIteratorThe end of the range to be copied. const allocator_type &allocator_type()The allocator. Create a full space optimized circular buffer filled with a copy of the range. - - - -ComplexityLinear (in the std::distance(first, last)). -Valid range [first, last). - first and last have to meet the requirements of InputIterator. capacity().capacity() == std::distance(first, last) && capacity().min_capacity() == 0 && full() && (*this)[0]== *first && (*this)[1] == *(first + 1) && ... && (*this)[std::distance(first, last) - 1] == *(last - 1) - - The amount of allocated memory in the internal buffer is std::distance(first, last). An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws or nothing if T::T(T&&) is noexcept and InputIterator is a move iterator. -capacity_typeThe capacity controller representing the maximum number of elements which can be stored in the circular_buffer_space_optimized and the minimal allocated size of the internal buffer. InputIteratorThe beginning of the range to be copied. InputIteratorThe end of the range to be copied. const allocator_type &allocator_type()The allocator. Create a space optimized circular buffer with the specified capacity (and the minimal guaranteed amount of allocated memory) filled with a copy of the range. - - - -ComplexityLinear (in std::distance(first, last); in min[capacity_ctrl.capacity(), std::distance(first, last)] if the InputIterator is a RandomAccessIterator). -Valid range [first, last). - first and last have to meet the requirements of InputIterator. capacity() == capacity_ctrl && size() <= std::distance(first, last) && (*this)[0]== (last - capacity_ctrl.capacity()) && (*this)[1] == *(last - capacity_ctrl.capacity() + 1) && ... && (*this)[capacity_ctrl.capacity() - 1] == *(last - 1) - - If the number of items to be copied from the range [first, last) is greater than the specified capacity_ctrl.capacity() then only elements from the range [last - capacity_ctrl.capacity(), last) will be copied. - - The amount of allocated memory in the internal buffer is max[capacity_ctrl.min_capacity(), min[capacity_ctrl.capacity(), std::distance(first, last)]]. An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). Whatever T::T(const T&) throws. -circular_buffer_space_optimized< T, Alloc > &const circular_buffer_space_optimized< T, Alloc > &The circular_buffer_space_optimized to be copied. The assign operator. Makes this circular_buffer_space_optimized to become a copy of the specified circular_buffer_space_optimized. - - -Exception SafetyStrong. -Iterator InvalidationInvalidates all iterators pointing to this circular_buffer_space_optimized (except iterators equal to end()). -ComplexityLinear (in the size of cb). -See Also:assign(size_type, const_reference), assign(capacity_type, size_type, const_reference), assign(InputIterator, InputIterator), assign(capacity_type, InputIterator, InputIterator) -*this == cb - - The amount of allocated memory in the internal buffer is cb.size(). An allocation error if memory is exhausted (std::bad_alloc if the standard allocator is used). T::T(const T&) throws. -circular_buffer_space_optimized< T, Alloc > &circular_buffer_space_optimized< T, Alloc > &&circular_buffer to 'steal' value from. Move assigns content of cb to *this, leaving cb empty. - - - -ComplexityConstant. -C++ compiler with rvalue references support. cb.empty() Nothing. - -voidAdjust the amount of allocated memory. -size_typesize_typesize_typeEnsure the reserve for possible growth up. -voidsize_type1Check for low capacity. -voidCheck for high capacity. -voidconst true_type &Specialized method for reducing the capacity. -voidconst false_type &Specialized method for reducing the capacity. -voidconst iterator &IntegralTypeIntegralTypeconst true_type &Specialized insert method. -voidconst iterator &IteratorIteratorconst false_type &Specialized insert method. -voidconst iterator &IntegralTypeIntegralTypeconst true_type &Specialized rinsert method. -voidconst iterator &IteratorIteratorconst false_type &Specialized rinsert method. - - -size_typeconst capacity_type &size_typeDetermine the initial capacity. -size_typeconst capacity_type &IntegralTypeIntegralTypeconst true_type &Specialized method for determining the initial capacity. -size_typeconst capacity_type &IteratorIteratorconst false_type &Specialized method for determining the initial capacity. -size_typeconst capacity_type &InputIteratorInputIteratorconst std::input_iterator_tag &Specialized method for determining the initial capacity. -size_typeconst capacity_type &ForwardIteratorForwardIteratorconst std::forward_iterator_tag &Specialized method for determining the initial capacity. - - - - - - - - -boolconst circular_buffer_space_optimized< T, Alloc > &const circular_buffer_space_optimized< T, Alloc > &Test two space optimized circular buffers for equality. -boolconst circular_buffer_space_optimized< T, Alloc > &const circular_buffer_space_optimized< T, Alloc > &Lexicographical comparison. -boolconst circular_buffer_space_optimized< T, Alloc > &const circular_buffer_space_optimized< T, Alloc > &Test two space optimized circular buffers for non-equality. -boolconst circular_buffer_space_optimized< T, Alloc > &const circular_buffer_space_optimized< T, Alloc > &Lexicographical comparison. -boolconst circular_buffer_space_optimized< T, Alloc > &const circular_buffer_space_optimized< T, Alloc > &Lexicographical comparison. -boolconst circular_buffer_space_optimized< T, Alloc > &const circular_buffer_space_optimized< T, Alloc > &Lexicographical comparison. -voidcircular_buffer_space_optimized< T, Alloc > &circular_buffer_space_optimized< T, Alloc > &Swap the contents of two space optimized circular buffers. - -
- \ No newline at end of file diff --git a/libs/circular_buffer/doc/circular_buffer.idx b/libs/circular_buffer/doc/circular_buffer.idx deleted file mode 100644 index a6d059db6..000000000 --- a/libs/circular_buffer/doc/circular_buffer.idx +++ /dev/null @@ -1,22 +0,0 @@ -# circular_buffer.idx index script file -# for Boost.circular_buffer Quickbook Doxygen documentation Auto-indexing forcircular_buffer library. - -# Copyright (c) 2011 Paul A. Bristow -# Copyright (c) 2003 - 2008 Jan Gaspar - -# boost-no-inspect - -# 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) - -# All header files, recursing down to include sub-folders. -!scan-path "boost/circular_buffer" ".*\.hpp" true - -# All example source files, assuming no sub-folders. -!scan-path "libs/circular_buffer/example" ".*\.cpp" - - - - - diff --git a/libs/circular_buffer/doc/circular_buffer.qbk b/libs/circular_buffer/doc/circular_buffer.qbk deleted file mode 100644 index 24f1678c6..000000000 --- a/libs/circular_buffer/doc/circular_buffer.qbk +++ /dev/null @@ -1,626 +0,0 @@ -[article Boost.Circular Buffer - [quickbook 1.6] - [id circular_buffer] - [copyright 2003-2013 Jan Gaspar] - [license - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at - [@http://www.boost.org/LICENSE_1_0.txt]) - ] - [authors [Gaspar, Jan]] - [source-mode c++] -] - -[/ Links - by (most common) convention, prefixed with double underscore so not confused with other names.] -[def __alert [$./images/alert.png]] [/ Examples of your own images (in doc/html/images/ .] -[def __tip [$./images/tip.png]] -[/ If you provide a file type like .png, you will probably find that the file is missing in the pdf version.] -[/ This is because the default file type specified is .png in html, but .svg for pdf version.] - -[/ Some links to external sources.] -[/ You often want to link more than once, so using a def ensures you always refer to the same location.] -[def __boost [@http://www.boost.org/ Boost]] [/Boost.org] -[def __boostroot [@boost: Boost root]] [/ Your boost root] -[/Note the custom boost root url schema for linking to files within the Boost distribution.] -[/Note It can't be used for images, nor for pdf, so not so useful.] -[/def __boostlicense [@http://www.boost.org/LICENSE_1_0.txt Boost License]] -[/ Or refer to your most recent version of Boost.] -[def __boostlicense [@boost:/LICENSE_1_0.txt Boost License]] -[def __boostbook [@http://www.boost.org/doc/html/boostbook.html BoostBook]] -[def __boostbook_docs [@http://www.boost.org/doc/libs/1_53_0/doc/html/boostbook.html BoostBook documentation]] -[def __quickbook [@http://www.boost.org/doc/tools/quickbook/index.html Quickbook]] -[def __quickbook_syntax [@http://www.boost.org/doc/libs/1_53_0/doc/html/quickbook/ref.html Quickbook Syntax Compendium]] -[def __docbook [@http://www.docbook.org/ DocBook]] -[def __doxygen [@http://www.doxygen.org/ Doxygen]] -[def __autoindex [@boost:/tools/auto_index/doc/html/index.html AutoIndex]] -[def __pdf [@http://www.adobe.com/products/acrobat/adobepdf.html PDF]] -[def __textpad [@http://www.textpad.com Textpad]] -[def __emacs [@http://www.gnu.org/software/emacs/ GNU emacs]] -[def __css [@http://en.wikipedia.org/wiki/Cascading_Style_Sheets Cascading Style Sheet]] -[def __intro [link circular_buffer.intro Introduction]] [/Link to a Quickbook section (see below).] - -[def __docbook_params [@http://docbook.sourceforge.net/release/xsl/current/doc/ Docbook xsl:param format options]] - -[def __cb [classref boost::circular_buffer circular_buffer]] -[def __cbso [classref boost::circular_buffer_space_optimized circular_buffer_space_optimized]] -[def __min_capacity [memberref boost::circular_buffer_space_optimized::min_capacity() min_capacity]] -[def __capacity_control [memberref boost::circular_buffer_space_optimized::capacity_control () capacity_control ]] - -[def __debug_support [link circular_buffer.implmentation.debug_support debug support]] - -[include ../../../tools/auto_index/include/auto_index_helpers.qbk] -[/ Must be first included file!] - -[note A printer-friendly PDF version of this manual is also available.] - -[section:intro Introduction] - -A Circular Buffer. - -[h2 Description] - -The term [@http://en.wikipedia.org/wiki/Circular_buffer circular buffer] -(also called a ['ring] or ['cyclic buffer]) -refers to an area in memory which is used to store incoming data. -When the buffer is filled, -new data is written starting at the beginning of the buffer and overwriting the old. - -[classref boost::circular_buffer] is a STL compliant container. - -It is a kind of sequence similar to [@http://www.sgi.com/tech/stl/List.html std::list] -or [@http://www.sgi.com/tech/stl/Deque.html std::deque]. -It supports random access iterators, constant time insert and erase operations -at the beginning or the end of the buffer and interoperability with std algorithms. - -The __cb is especially designed to provide [*fixed capacity] storage. -When its capacity is exhausted, newly inserted elements will cause elements -to be overwritten, either at the beginning or end of the buffer -(depending on what insert operation is used). - -The __cb only allocates memory when created, -when the capacity is adjusted explicitly, -or as necessary to accommodate resizing or assign operations. - -[$../../libs/circular_buffer/doc/images/circular_buffer.png] - -There is also a __cbso version available. - -[$../../libs/circular_buffer/doc/images/space_optimized.png] - -__cbso is an adaptation of the __cb -which [*does not allocate memory all at once when created], -instead it allocates memory as needed. - -The predictive memory allocation is similar to typical `std::vector` implementation. -Memory is automatically freed as the size of the container decreases. - -The memory allocation process of the space-optimized circular buffer. -The __min_capacity of the capacity controller represents -the minimal guaranteed amount of allocated memory. -The allocated memory will never drop under this value. -The default value of the `min_capacity` is set to 0. -The `min_capacity` can be set using the constructor parameter __capacity_control -or the function `set_capacity`. - -The space-optimized version is, of course, a little slower. - -[endsect] [/section:intro Introduction] - -[section:example Circular_buffer example] - -Here is a simple example to introduce the class __cb. - -[import ../example/circular_buffer_example.cpp] - -[circular_buffer_example_1] - -This example shows contruction, inserting elements, overwriting and popping. - -[circular_buffer_example_2] - -[/circular_buffer_example_output - there is no output for this example] - -You can see the full example code at [@boost:libs/circular_buffer/example/circular_buffer_example.cpp circular_buffer_example.cpp]. - -The full annotated description is in the C++ Reference section. - -[endsect] [/section:example circular_buffer example] - -[section:rationale Rationale] - -The basic motivation behind the __cb was to create a container which would [*work seamlessly with STL]. - -Additionally, the design of the __cb was guided by the following principles: - -* Maximum ['efficiency] for envisaged applications. -* Suitable for ['general purpose use]. -* The behaviour of the buffer as ['intuitive] as possible. -* Suitable for ['specialization] by means of adaptors. (The __cbso is such an example of the adaptor.) -* Easy to ['debug]. (See Debug Support for details.) - -In order to achieve maximum efficiency, the __cb and __cbso store their elements in a -[*contiguous region of memory], which then enables: - -* Use of fixed memory and no implicit or unexpected memory allocation. -* Fast constant-time insertion and removal of elements from the front and back. -* Fast constant-time random access of elements. -* Suitability for real-time and performance critical applications. - -Possible applications of the circular buffer include: - -* Storage of the ['most recently received samples], overwriting the oldest as new samples arrive. -* As an underlying container for a ['bounded buffer] -(see the Bounded Buffer example, code at [@boost:libs/circular_buffer/example/circular_buffer_bound_example.cpp circular_buffer_bound_example.cpp]). -* A kind of ['cache] storing a specified number of last inserted elements. -* Efficient fixed capacity ['FIFO (First In, First Out)], -* Efficient fixed capacity ['LIFO (Last In, First Out)] queue which removes the oldest (inserted as first) elements when full. - -[endsect] [/section:rationale Rationale] - -[section:implementation Implementation ] - -The following paragraphs describe issues that had to be considered during the implementation of the circular_buffer: - -[h3 Thread-Safety] - -The thread-safety of the __cb is the same as the thread-safety of containers in most STL implementations. -This means the __cb is not fully thread-safe. -The thread-safety is guaranteed only in the sense that simultaneous accesses -to distinct instances of the __cb are safe, -and simultaneous read accesses to a shared __cb are safe. - -If multiple threads access a single __cb, -and at least one of the threads may potentially write, -then the user is responsible for ensuring mutual exclusion between the threads during the container accesses. -The mutual exclusion between the threads can be achieved by wrapping -operations of the underlying __cb with a lock acquisition and release. -(See the Bounded Buffer example code at [@boost:libs/circular_buffer/example/circular_buffer_bound_example.cpp circular_buffer_bound_example.cpp]) - -[h3 Overwrite Operation] - -Overwrite operation occurs when an element is inserted into a full __cb - -the old element is being overwritten by the new one. -There was a discussion what exactly "overwriting of an element" means during the formal review. -It may be either a destruction of the original element and -a consequent inplace construction of a new element -or it may be an assignment of a new element into an old one. -The __cb implements assignment because it is more effective. - -From the point of business logic of a stored element, -the destruction/construction operation and assignment usually mean the same. -However, in very rare cases (if in any) they may differ. -If there is a requirement for elements to be destructed/constructed instead of being assigned, -consider implementing a wrapper of the element which would implement the assign operator, -and store the wrappers instead. -It is necessary to note that storing such wrappers has a drawback. -The destruction/construction will be invoked on every assignment of the wrapper - -not only when a wrapper is being overwritten (when the buffer is full) -but also when the stored wrappers are being shifted -(e.g. as a result of insertion into the middle of container). - -[h3 Writing to a Full Buffer] - -There are several options how to cope if a data source produces more data than can fit in the fixed-sized buffer: - -* Inform the data source to wait until there is room in the buffer (e.g. by throwing an overflow exception). -* If the oldest data is the most important, ignore new data from the source until there is room in the buffer again. -* If the latest data is the most important, write over the oldest data. -* Let the producer to be responsible for checking the size of the buffer prior writing into it. - -It is apparent that the __cb implements the third option. -But it may be less apparent it does not implement any other option - -especially the first two. -One can get an impression that the __cb should implement first three options -and offer a mechanism of choosing among them. This impression is wrong. - -The __cb was designed and optimized to be circular -(which means overwriting the oldest data when full). -If such a controlling mechanism had been enabled, -it would just complicate the matters -and the usage of the __cb would be probably less straightforward. - -Moreover, the first two options (and the fourth option as well) -do not require the buffer to be circular at all. -If there is a need for the first or second option, consider implementing an adaptor of e.g. std::vector. -In this case the __cb is not suitable for adapting, because, -contrary to std::vector, it bears an overhead for its circular behaviour. - -[h3 Reading/Removing from an Empty Buffer] - -When reading or removing an element from an empty buffer, -the buffer should be able to notify the data consumer -(e.g. by throwing underflow exception) that there are no elements stored in it. -The __cb does not implement such a behaviour for two reasons: - -* It would introduce a performance overhead. -* No other std container implements it this way. - -It is considered to be a bug to read or remove an element -(e.g. by calling [memberref boost::circular_buffer::front() front()] -or [memberref boost::circular_buffer::pop_back() pop_back()]) -from an empty std container and from an empty __cb as well. -The data consumer has to test if the container is not empty before reading/removing from it by testing -[memberref boost::circular_buffer::empty empty()]. -However, when reading from the __cb, -there is an option to rely on the [memberref boost::circular_buffer::at() at()] -method which throws an exception when the index is out of range. - -[h3 Iterator Invalidation] - -An iterator is usually considered to be invalidated if an element, -the iterator pointed to, had been removed or overwritten by an another element. -This definition is enforced by the Debug Support and is documented for every method. -However, some applications utilizing __cb may require less strict definition: -an iterator is invalid only if it points to an uninitialized memory. - -Consider following example: - -[import ../example/circular_buffer_iter_example.cpp] - -[circular_buffer_iter_example_1] - -The iterator does not point to the original element any more -(and is considered to be invalid from the "strict" point of view) -but it still points to the same valid place in the memory. -This "soft" definition of iterator invalidation is supported by the __cb -but should be considered as an implementation detail rather than a full-fledged feature. -The rules when the iterator is still valid can be inferred from the code in -[@boost:libs/circular_buffer/test/soft_iterator_invalidation.cpp soft_iterator_invalidation.cpp]. - - -[h3 Move emulation and rvalues] - -Since Boost 1.54.0 support for move semantics was implemented using -the [@boost:libs/move/index.html Boost.Move] library. -If rvalue references are available __cb will use them, but if not it uses a close, -but imperfect emulation. On such compilers: - -* Non-copyable objects can be stored in the containers. - They can be constructed in place using `emplace`, or if they support - Boost.Move, moved into place. -* The containers themselves are not movable. -* Argument forwarding is not perfect. - -__cb will use rvalues and move emulations for value types only if move constructor and move assignment operator of the value type do not throw; -or if the value type has no copy constructor. - -Some methods won't use move constructor for the value type at all, if the constructor throws. This is -required for data consistency and avoidance of situations, when aftrer an exception __cb -contains moved away objects along with the good ones. - -See documentation for [@boost:libs/type_traits/doc/html/boost_typetraits/reference/is_copy_constructible.html `is_copy_constructible`], [@boost:libs/type_traits/doc/html/boost_typetraits/reference/is_nothrow_move_assignable.html `is_nothrow_move_assignable`] and [@boost:libs/type_traits/doc/html/boost_typetraits/reference/is_nothrow_move_constructible.html `is_nothrow_move_constructible`] type triats. -There you'll find information about how to make constructor of class noexcept and how to make a non-copyable -class in C++03 and C++98. - -Performance of __cb will *greatly improve* if value type has noexcept move constructor and noexcept move assignment. - -[h3 Exceptions of move_if_noexcept(T&)] - -Reference documentation of the __cb contains notes like "Throws: See Exceptions of `move_if_noexcept(T&)`". -That note means the following: `move_if_noexcept(T& value)` does not throws exceptions at all, but it returns -`value` as rvalue reference only if class `T` have noexcept move constructor and noexcept move assignment operator; -or if it has no copy constructor. Otherwise `move_if_noexcept(T& value)` returns `value` as const reference. - -This leads us to the following situation: - -* If `value` has a noexcept move constructor and noexcept move assignment operator, then no exceptions will be thrown at all. -* If `value` has a throwing move constructor and some copy constructor, then method may throw exceptions of copy constructor. -* If `value` has no copy constructor, then method may throw exceptions of move constructor. - -`move_if_noexcept(T&)` uses [@boost:libs/move/index.html Boost.Move], [@boost:libs/type_traits/doc/html/boost_typetraits/reference/is_copy_constructible.html `is_copy_constructible`], [@boost:libs/type_traits/doc/html/boost_typetraits/reference/is_nothrow_move_assignable.html `is_nothrow_move_assignable`] and [@boost:libs/type_traits/doc/html/boost_typetraits/reference/is_nothrow_move_constructible.html `is_nothrow_move_constructible`] type triats. - - -[h3 Caveats] - -The __cb should not be used for storing pointers to dynamically allocated objects. -When a circular buffer becomes full, further insertion will overwrite the stored pointers -- resulting in a [*memory leak]. One recommend alternative is the use of smart pointers, for example -[@http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/smart_ptr.htm Boost Smart pointers]. - -[@http://en.wikipedia.org/wiki/Std::auto_ptr std::auto_ptr] - -[caution Any container of `std::auto_ptr` is considered particularly hazardous.] - -[tip Never create a circular buffer of `std::auto_ptr`. -Refer to Scott Meyers' excellent book Effective STL for a detailed discussion. -(Meyers S., Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library. -Addison-Wesley, 2001.) -] - -While internals of a __cb are circular, [*iterators are not]. -Iterators of a __cb are only valid for the range `\[begin(), end()\]`, -so for example: iterators `(begin() - 1)` and `(end() + 1)` are both invalid. - -[h3 Debug Support] - -In order to help a programmer to avoid and find common bugs, -the __cb can be enabled to provide a kind of debug support. - -When the debugging functionality is enabled, the __cb maintains a list of valid iterators. -As soon as any element gets destroyed all iterators pointing to this element -are removed from this list and explicitly invalidated (an invalidation flag is set). -The debug support also consists of many assertions (`BOOST_ASSERT` macros) -which ensure the __cb and its iterators are used in the correct manner at runtime. -In case an invalid iterator is used, the assertion will report an error. -The connection of explicit iterator invalidation and assertions -makes a very robust debug technique which catches most of the errors. - -Moreover, the uninitialized memory allocated by __cb is filled with the value `0xcc` in the debug mode. -When debugging the code, this can help the programmer to recognize the initialized memory from the uninitialized. -For details refer the source code [@boost:boost/circular_buffer/debug.hpp circular_buffer/debug.hpp]. - -[caution Since the debugging code makes __cb and its iterators more interconnected, thread safety guarantees of __cb -are different when debug support is enabled. In addition to the container itself, all iterators tracked by the container -(including any copies thereof) must be protected from concurrent access. In particular, this includes copying, destroying or -obtaining iterators from the container, even if for read-only access.] - -The debug support is disabled by default. To enable it, one has to define `BOOST_CB_ENABLE_DEBUG` macro with the value of 1 -while compiling the code using __cb. - -[h3 Compatibility with Interprocess library] - -The __cb is compatible with the [@boost:libs/interprocess/index.html Boost.Interprocess] -[/ This should be in @boost:libs/interprocess/doc/index.html ] -library used for interprocess communication. -Considering that the circular_buffer's debug support relies on 'raw' pointers -(which is not permited by the Interprocess library) -the code has to compiled with debug support disabled (i.e. with `BOOST_CB_ENABLE_DEBUG` macro not defined or defined to 0). -Not doing that will cause the compilation to fail. - -[endsect] [/section:implementation Implementation ] - -[section:examples More Examples] - -[h3 Summing all the values in a circular buffer] - -[import ../example/circular_buffer_sum_example.cpp] - -[circular_buffer_sum_example_1] - -[/circular_buffer_example_output - there is no output for this example] - -The __cb has a capacity of three `int`. -Therefore, the size of the buffer will never exceed three. -The `std::accumulate` algorithm evaluates the sum of the stored elements. -The semantics of the __cb can be inferred from the assertions. - -You can see the full example code at [@boost:libs/circular_buffer/example/circular_buffer_sum_example.cpp circular_buffer_sum_example.cpp]. - -[h3 Bounded Buffer Example] - -The bounded buffer is normally used in a producer-consumer mode: -producer threads produce items and store them in the container -and consumer threads remove these items and process them. -The bounded buffer has to guarantee that - -* producers do not insert items into the container when the container is full, -* consumers do not try to remove items when the container is empty, -* each produced item is consumed by exactly one consumer. - -[import ../example/circular_buffer_bound_example.cpp] - -[circular_buffer_bound_example_1] - -[/ there is no output for this example] - -The bounded_buffer relies on [@boost:/doc/html/thread.html Boost.Thread] -and [@boost:libs/bind/index.html Boost.Bind] libraries -and [@boost:libs/utility/call_traits.htm Boost.call_traits utility]. - -The [memberref boost::circular_buffer::push_front() push_front()] -method is called by the producer thread in order to insert a new item into the buffer. -The method locks the mutex and waits until there is a space for the new item. -(The mutex is unlocked during the waiting stage and has to be regained when the condition is met.) -If there is a space in the buffer available, -the execution continues and the method inserts the item at the end of the __cb. -Then it increments the number of unread items and unlocks the mutex -(in case an exception is thrown before the mutex is unlocked, -the mutex is unlocked automatically by the destructor of the scoped_lock). -At last the method notifies one of the consumer threads -waiting for a new item to be inserted into the buffer. - -The [memberref boost::circular_buffer::pop_back() pop_back()] -method is called by the consumer thread in order to read the next item from the buffer. - The method locks the mutex and waits until there is an unread item in the buffer. -If there is at least one unread item, -the method decrements the number of unread items and reads the next item from the __cb. -Then it unlocks the mutex and notifies one of the producer threads -waiting for the buffer to free a space for the next item. - -The `bounded buffer::pop_back()` -method [*does not remove the item] but the item is left -in the circular_buffer which then [*replaces it with a new one] -(inserted by a producer) when the circular_buffer is full. -This technique is more effective than removing the item -explicitly by calling the [memberref boost::circular_buffer::pop_back() circular_buffer::pop_back()] -method of the __cb. - -This claim is based on the assumption that an assignment (replacement) -of a new item into an old one is more effective than a destruction -(removal) of an old item and a consequent inplace construction (insertion) of a new item. - -For comparison of bounded buffers based on different containers compile and -run [@boost:libs/circular_buffer/test/bounded_buffer_comparison.cpp bounded_buffer_comparison.cpp]. -The test should reveal the bounded buffer based on the __cb is most effective -closely followed by the `std::deque` based bounded buffer. -(In reality, the result may differ sometimes because the test -is always affected by external factors such as immediate CPU load.) - -[import ../test/bounded_buffer_comparison.cpp] - -You can see the full test code at [@boost:libs/circular_buffer/test/bounded_buffer_comparison.cpp bounded_buffer_comparison.cpp], -and an example of output is [bounded_buffer_comparison_output]. - -[endsect] [/section:examples More examples] - -[section:headers Header Files] - -The circular buffer library is defined in the file [@boost:boost/circular_buffer.hpp circular_buffer.hpp]. - - #include - -(There is also a forward declaration for the __cb -in the header file [@boost:boost/circular_buffer_fwd.hpp circular_buffer_fwd.hpp]). - -The __cb is defined in the file [@boost:boost/circular_buffer/base.hpp base.hpp]. - -The __cbso is defined in the file [@boost:boost/circular_buffer/space_optimized.hpp space_optimized.hpp]. - -[endsect] [/section:headers Header Files] - -[section:concepts Modelled Concepts] - -[@http://www.sgi.com/tech/stl/RandomAccessContainer.html Random Access Container], -[@http://www.sgi.com/tech/stl/FrontInsertionSequence.html Front Insertion Sequence], and -[@http://www.sgi.com/tech/stl/BackInsertionSequence.html Back Insertion sequence] - -[endsect] [/section:concepts Modelled Concepts] - -[section:template_params Template Parameters] - -[table:templ Template parameter requirements -[[parameter] [Requirements]] -[[T] [The type of the elements stored in the circular_buffer. -The T has to be [@boost:libs/utility/Assignable.html Assignable] -and [@boost:libs/utility/CopyConstructible.html CopyConstructible]. -Moreover T has to be [@http://www.sgi.com/tech/stl/DefaultConstructible.html DefaultConstructible] -if supplied as a default parameter when invoking some of the circular_buffer's methods, -e.g. `insert(iterator pos, const value_type& item = value_type())`. -And [@http://www.sgi.com/tech/stl/EqualityComparable.html EqualityComparable] -and/or [@boost:libs/utility/LessThanComparable.html LessThanComparable] -if the circular_buffer will be compared with another container.]] -[[Alloc] [The allocator type used for all internal memory management. -The Alloc has to meet the allocator requirements imposed by STL.]] -] - -[endsect] [/section:template_params Template Parameters] - -[section:tickets Trac Tickets] - -Report and view bugs and features by adding a ticket at [@https://svn.boost.org/trac/boost Boost.Trac]. - -Existing open tickets for this library alone can be viewed -[@https://svn.boost.org/trac/boost/query?status=assigned&status=new&status=reopened&component=circular_buffer&col=id&col=summary&col=status&col=owner&col=type&col=milestone&order=priority here]. -Existing tickets for this library - including closed ones - can be viewed -[@https://svn.boost.org/trac/boost/query?status=assigned&status=closed&status=new&status=reopened&component=circular_buffer&col=id&col=summary&col=status&col=owner&col=type&col=milestone&order=priority here]. - -Type: Bugs - -[@https://svn.boost.org/trac/boost/ticket/4100 #4100] Some boost classes have sizeof that depends on NDEBUG. - -[@https://svn.boost.org/trac/boost/ticket/5362 #5362] circular_buffer does not compile with BOOST_NO_EXCEPTIONS. - -[@https://svn.boost.org/trac/boost/ticket/6277 #6277] Checked iterators are not threadsafe. - -[@https://svn.boost.org/trac/boost/ticket/6747 #6747] Circular_Buffer / Bounded_Buffer inside Template class problem. - -[@https://svn.boost.org/trac/boost/ticket/7025 #7025] circular buffer reports warning: " type qualifiers ignored on function return type" while compile. - -[@https://svn.boost.org/trac/boost/ticket/7950 #7950] Eliminate W4-warnings under VS2005. - -[@https://svn.boost.org/trac/boost/ticket/8012 #8012] Inconsistency in `linearize()`. - -[@https://svn.boost.org/trac/boost/ticket/8438 #8438] `vector` & __cb storage misbehave when using compiler optimizations. - -Type: Feature Requests - -[@https://svn.boost.org/trac/boost/ticket/5511 #5511] Documentation needs some improvement. - -[@https://svn.boost.org/trac/boost/ticket/7888 #7888] circular_buffer should support move semantics. - -Type: Patches - -[@https://svn.boost.org/trac/boost/ticket/8032 #8032] Warning fixes in circular_buffer. - -[endsect] [/section:tickets Trac Tickets] - -[section:release Release Notes] - -[h4 Boost 1.56] - -* C++11 allocator model support implemented by Glen Fernandes using Boost allocator_traits. - -[h4 Boost 1.55] - -* Documentation refactored by Paul A. Bristow using Quickbook, Doxygen and Autoindexing. -* Rvalue references emulation added by Antony Polukhin using Boost.Move. - -[h4 Boost 1.42] - -* Added methods erase_begin(size_type) and erase_end(size_type) with constant complexity for such types of stored elements which do not need an explicit destruction e.g. int or double. -* Similarly changed implementation of the clear() method and the destructor so their complexity is now constant for such types of stored elements which do not require an explicit destruction (the complexity for other types remains linear). - -[h4 Boost 1.37] - - *Added new methods is_linearized() and rotate(const_iterator). -* Fixed bugs: -[@https://svn.boost.org/trac/boost/ticket/1987 #1987] Patch to make circular_buffer.hpp #includes absolute. -[@https://svn.boost.org/trac/boost/ticket/1852 #1852] Copy constructor does not copy capacity. - -[h4 Boost 1.36] - -* Changed behaviour of the circular_buffer(const allocator_type&) constructor. -Since this version the constructor does not allocate any memory and both capacity and size are set to zero. -* Fixed bug: - [@https://svn.boost.org/trac/boost/ticket/191 #1919] Default constructed circular buffer throws std::bad_alloc. - -[h4 Boost 1.35] -* Initial release. - -[endsect] [/section:release Release Notes] - -[section:acknowledgements Acknowledgements] - -Thomas Witt in 2002 produced a prototype called cyclic buffer. - -The circular_buffer has a short history. Its first version was a std::deque adaptor. -This container was not very effective because of many reallocations when inserting/removing an element. -Thomas Wenish did a review of this version and -motivated me to create a circular buffer which allocates memory at once when created. - -The second version adapted `std::vector` but it has been abandoned soon -because of limited control over iterator invalidation. -The current version is a full-fledged STL compliant container. - -Pavel Vozenilek did a thorough review of this version and came with many good ideas and improvements. - -The idea of the space optimized circular buffer has been introduced by Pavel Vozenilek. - -Also, I would like to thank Howard Hinnant, Nigel Stewart and everyone -who participated at the formal review for valuable comments and ideas. - -Paul A. Bristow refactored the documentation in 2013 to use the full power of Quickbook, Doxygen and Autoindexing. - -[endsect] [/section:acknowledgements Acknowledgements] - - -[section:version_id Documentation Version Info] - -Last edit to Quickbook file __FILENAME__ was at __TIME__ on __DATE__. - -[tip This should appear on the pdf version -(but may be redundant on a html version where the last edit date is on the first (home) page).] - -[warning Home page "Last revised" is GMT, not local time. Last edit date is local time.] -[/See also Adobe Reader pdf File Properties for creation date, and PDF producer, version and page count.] - -[endsect] [/section:version_id Version Info] - -[xinclude autodoc.xml] [/ Using Doxygen reference documentation.] -[/ The position of this in the Quickbook determines the location of the Doxygen references section.] -[/ Index(es) should be invoked in the main module, not within a section.] - -''' - -''' - -[/ circular_buffer.qbk - Copyright 2013 Paul A. Bristow. - Copyright 2003-2008 Jan Gaspar. - - Distributed under the 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/libs/circular_buffer/doc/images/circular_buffer.png b/libs/circular_buffer/doc/images/circular_buffer.png deleted file mode 100644 index 1370a4b51bbc378bb28a6b9c824ca922afb3160c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21147 zcmZ_0cR1Dm8$W)|v5u{f6^D|Hj8HZQ8I_f+NRBeIiDaH*7KxNCqb(x|8R4Ko_DDun z$=)OToZqeY=X-s>|NOeH_tkavKIeI!ujhR~@9}s%?$ZaM@4!FXQxoG}7{ zJO%&hp;7QJq`4#h@E4_{y1qIBVexfOXYAmg`ETeN>mv{WClCmHI0CUvhQB8f2ww>V zV%7$MP)tD}I6RyuK8Ya^#zN=Mshjv`Uf)uq)29Y57N_IDw>O#p`u2y$@nJ#JG(}FJ=Q6VT< zYFrv(Vq&ynkBndH{QmtjkysqK>0VNZW@Mz|4zp=*p|b)vbrSW21BDV>(EU}$b` zE~}o?6Cq$qd+9D`&&_TqlQ_t*H!%E}Z; zn=hjD%@Noy+iO#VZI;9`{_R=P{_b+XVO`Xk;JJ(3oW!z5G2@C$EOA&0LK2@t2*sQF z0zRF3;T-0J&1F2@+S`8r;e(u+$i!93R!gEKlSRC5Jwlm7VCtydSxcdFH*UDiX?)6? ztplUnr9vQO6GS}tIB_w@r&x6t8`3rLH}M;S&n0PE^OqfForI23Y0@JoI}xuwPE1Vj zD*5HmKDF1tQBydaow!Gd%RekZPl*+oI5PSFe)7>t!y_CV&uEWLvEtq`H$_coZh6vw zG(<1a{OW$tOx>5C`u;9aS$Xi}Q7Q^51j=bFmh3iEj-1o9JA?~COse4asWGLLDVV>CdYvGdHHjLE5|MHY5z7+FQTPq{%D^+njE6QhUT6tWUQyAQnBAb>l)|Meh zAP}&Lg4V=0%nDOP^QVU>i9eO9t~; zWJ{gnpS{;n1uof%hGW8k={mc+HD)bu;`DX>B)EsQPSa7-f@Rbn(-QcP9s4yu@Sb8J z2F`w(4xZf8z5$*IT#UI?3@%KL7<{rmiI#xtda6Z5MfJZ=(!eJ>?Hi^#vR}P=rRKkk z%i)!VhkkPK&{cY9%6N<#6B@k*E`wFF14j-(zy-UX#)5wH=1pIrm0V{LC)G1N-+`w& z3+=5<8D6-)CV?s?r0`cr7#jC5~rkaFBYC z{os>F;FCG+@Ps`*J%fXa|1BGJuxy~vN1rJJZS5~}Ki<;(w=CVkadbqG>vfW%A|e<{ z#hmCz;Nq;$^h|M%eU9bWTpX?m*!WiFVt!8tyYaze6gB%%+1U!u3V|A zu1?R$sF%^URUe4*RZ14WLa)yAV@dadF2z$*v9s27ez6QZ*=m86xDmPvf@f*KpO+(9 z&7Of}Wo0TVD)S2q$Bs3SN&EC(f(hyi2u`Z41JlHTX^0Kgxw*Eme{T7}zw_m8LrlDi zvUjA94d)Bzr=?lWI?Y8>>(qws&TaP?8e&5CNc(c>BhIj|y)DvGPjqOuS|T1lTNk_^ z-C_!-7yNgEwR1!=o0P(4o|o^O&Y3Yc%Sp7hFfqBcx3vP-^Qf|aLOD{FjtEwX(i5T# zd z3kf24K6usFt5^FiaObe_k`8{}7=FI0O0lWS5Th1CdG^JHix+7IwTwLBpdhwKL`Ier zOU2$hA9L@#r3(NK5mn25n6=v%1YY(`uwOU!8G`_7If{`KEH z&Rn#q7YR}4w6(L;0@rrU1MD>HC`%9ha^(;6r$n2*wak8EYIlQ?&QC?9CM%0?&)g*r z^$Q7Rf1$TE#VoAw>C-1-pya!E?UaP6nxqZB z{mrp5`sf8Y-QC8!e;0z+CflZy zIW8PH*bBW1+eYeEOvE$t2YZX4Ds6&a#Dv#C*I^Ku*nE0 zi;=ddZ;Dd5`132?8Y|7ukB*LJetkYM&1-MVD?s~`CkoC=R(kxsV@E?n!#OQ28c|kM ze(mPc=!@rq`T6pfy4hc4S|lrn5D&^JBIRt>&ZZfEWI zmGX*0WkNziX6F1`n>ujIaHfaSuK!(#Ey(2uS3MAat385f)(3amu_NomNwKLpRu)c{ zo%NMybIDq)U00N>j)_pjv$tc1o`jM~Y9U*H2a{;ri>?vz#wI4H^6vz3zd^0G|7}^| z=<^pZa_t+Imp!=$%6#XJ$jOKR!W7asXyyERS5iA|}I7J>y!ON32bNX_k~tlC;tW!BZ@WyDa7N$Ibi zSBAs~*-xLMI5<*XMzz0p%z2lrR+lI9Q^Q!OwN2z_CGGa(_wA_8< zRbe4L<;CPv)KO>8BoddAu&{}Y0Oe8DAkI|BpFe*JpSBw+ce{2i3+t1aIsAYZX|2Z1 z%O3h?^*h0hhACbTt)5e#QI{i<`8~h9e^AlM#YNJxbh;%)(&Pe_Cf`Beg?v%$w=hT~ zVprD}2j26PBnik12aRSu!#?z|AtTpDMuxw7`>c^KI}ZlSvTCq6rLXLg!RGE3b&cH( zUx?VyQUcwq81hL^8h7>gmJRAC3 zgvZFoE5$g~p#PugVuOMO!6-rn|xnuy5nv3gA+gMv}>dh@f*kdP2E zO{uBgWy-YHt@W8XLhvgFM*YWZNq&nzPj@!kA>fw8J=XKz{p)t+$`vN2qDGo{WTjdi ztHshPd5O$8_u;#V9Eo^V%WGq`=4AXxmttH<5c$=|0>7oK8^pu5L>Yz!mLTaHZExCs z{rY8Z|Kj+9&|#~q zzcGQ9y^O`O^qUyy=~6hXlF8VUZLJy ziWrUx?atCSKjKSi-oavFe@TqheXxRFK@(-Iijo<3wBVUo7-DvKnXIiH70V&XJ$>t( z57cjsGOSsu!Rhzzoi{l*KR+`!T1%qtbDoHEL&VK4E?z6fjfXyWMYQ@7)9F$j`3rS$ zNmL!tSZbD;IWCQJ{GuG=nOeDrrl|K<2O02=SRu=)zP~B7+0p^ z^e~gFP6{l?{5MurDp33sPZ7uNwo;!}@*1FTeNFu4`N=^8y|Y8hmaFsNX#72c#}6M? z25zo}r7Jl$hj!W$9y2X!rfbvE((Z0%VXrmEonb}I zN$BdM&tbiA5*lXrqT{0QW%fAiwBs^*A;zBPri%+HzDaM3YsMl@2$!K@P(L(8@BOLy zUziD!w$;}^BV~W`(<{UPk^8>o48j7b8nCP^FF&o;z0A<3hi3cKYoIMeX%?Qa9iKf) zwyE_$DfwZmtMNm4kc*^#SBfFDB_1}UO8G!}`Tn;S?}BoAxRVYtW%R%N<>uz5q7ojy zYZ&5BPMfX95z=xCUpOxQtR&l>ISk9sV^Gzhp4JI{LV0N{PTWD%hmDyX9Ua|91I9Kx z9%ev1>wg!zHn~5WWF@aq$;~|*)kDkuU%c4an5(S3bGBfJ_R1^6SXLYS=jD|fCw+Wk zMryWc(_}uS)3UO5=HU7~t-*rIt>+Lfzg#b#ZH(>H)9P zSz_};X}BSplB~6%ZMNg(q5-mc6J6|8Aea&p8+F1{#S2AL{MIg5hKjosLj;2FkM|VGc#*Vue|G?!B7{v zANr@e=F=zHou6&8Y=@+{_O{o^djl?{5P_H&I?a`7Zny~2Y0LHDG}6-D_AkoF&VH-P zr_uew8!Ic&&(H_QAacZsik(9(Q$5jj6j?uMWWrqQboF$9baiogJ7&UTKyx5@?PEe> zVnG4o4|Y&rizPf{f2$5hiYf2=OJ1Ml3fbQqZEOsbWj)MlL{@iUxLjIR_BxPHw(!7< z33^-8UB{6~LigcLMTge?vRm4twR@p^)6OO)d-)tT)9)X9a_0?;R3WC znEqQAmBG^LPiWzYe{^={6cvs9qVlnCZZj@58D=cN&M zmK&p)Dbhpk{jWQNM!TZ2vc5XRfQ*ry;zjyUNnNC*j!+KTN@Y5;<|HJ@u0Gq?bXT5= zsuHSpM$cnHC`emlZ4tMZModjjBMZiVP5v7Aurx-lzsyD2Rm%;Xecb$hT1tF$74L@I4KN;6w+UtaN|`ppWYdeGI9`}f!R-!em-lyYc@X2x7N zfBuY|9L2x~_u<5(q{s=)vu1x)s+kkKEE&W*$#rB7$*ZPTJ?q(DHrC!^$jpmsX^$Tp zxWq*H(v=lfN90Dk!3id=5q42!*5?Z+5$=`03AuC2+Txes5OY|Z z<~nr3O}`-4K1@l8?u&Mvuf83=6TLO3$<511r|_G_NnX(J*|Fbnr3^mD?WLk0(=um* z?d*=@yzWeo2~bmO)K&)YUxwnEd>=-g&KOX$cyXSEg#5d(3d(X6EOg`y>ic zgH`#zML-=l{_B?_6p0d4U@XWMgb7UviA6Zf{gc--qhfTzHCQH&p46Qukv2w0)yC?F z%}cAVgvhcQKj7c?93B)udh{r?sV}V(g$~1#fM!4?$8q>@gC)%|3S6~`x;iqESwX%6 z>bYHvRrm9muAF5(^trlFREFZ$lK1aPJ+A#nWTkw@OuW0Dgr2h@DLgm6ZS3u#pmBK? z93zB;MRS@Wc+R>a97Hh~%yl-Xv#s^?7|wdsN4t!K`RRlob8LY2^DOe_vpFYhEo zrrCe>J5?R%d|Ou7TWF6#!X`!HN?(7cLG_F0Wc431vaQ)4=E-$X;2qjoSs?$8_BbP3 zihmfmJf=SQ;%4GOyW%Nywfe{{gZnRDoXBh0b04lcAs~Qkj#gIwSnU_K6Wvs=U;RwI zOIqN05F;AxzqiaAck>N7N3UPrW3e07RoGeEB{$L-vavrN7#M)Q|6Htzz9`&zLTdyu zgkLIGNl`KJHf>)x4fEs2k8?Hz=;tQ&mB_4$*(sL)&Y@$h@B?(Z5ANUJGR(*t5B1cS zPp8cb!)8GF9=bCBBsrOhmGw7RC@Ux=r7{#U!540{ch2eKr1TVx-20 z9Qtu;%{WAM+R-(QrC(-mc~R$*?RNeCD<`kqDKcy|oZtF`JFip>Ks~P?XExKoTDUYR z6%}4iN@$aFJCEYXEUNJx_4SqZGSkGLk@Qa9u$bo`E>0FYt^lprUgw^d`kC@8YK&i` z$ng#uH;*^nwKP5^e5miokIU)lA_x77RGMc?vN*Ow?(A9P&!teeh>3|c4!syECk(!5 z5-{j_rY zb4yE0s|N2pwsaV&@}-9@HnzR@`AQ(K4|^cFvhLlxry8(z^n3Jqf{?lC*;7{K^Wx)-6qgONlnFng_4M?t&Ms{kjs~G!N0dW% znman;Xa9yR>RQ#-R_3vG-{oE|RmxGe(JCf!(S{saI4sU<- z3R&SZ^&m6zXpr?#d0|fEq4oP+m{HOP+1rxV8h=FTjoYZHs8lL81BiwLTn^~N<%)`f z&~&9pSU=S&5k$jcMQNT(BQ?Z%^&ZU`K9zvyuV15^qoMDyGMW;1io>^MfcMzjPf)z4 z^Yx)GCjMPx4Dt_!`;0-xw&$lTH8(Xu9mv=e=Yl|<`=R&x<;#~vMI;E4>4RY3dO*aJ)goH#ZjlVJShQ3euhBc{qyJlkw4o;TYi~ac zPfOjOmusa#g~B7A>IhMmzvt!UC4^La|Doe82&b616C@!~6gQ{-`^BxhT{dc@Y~?$O zD!irJcP*13ch%T9(_~jg)G;= zsQN>&)u#Cx??lOG$;!%_^zh-G)d&NQLL?=No6LCgqmzW0Yv<43Ymal4U0$EL%+Ai< zudKSZ<7-9gsZgan%S{LlHe_BhmmD>IfuxmPnB34&SBK;98FKDq!{5Doo15gBo=N@b>D5V7vg&eTHeO~&e$K$&*_zTrLEUB0*)jNEgEUPQS9($VUITX)` zKju{K?5%z&(`k$21!xR~3JVL<@ci`ktB1RT?aiB$zZd5I%*4@eZ|`JqW~{ER3e4F% zPTh^wue!6pQpm$hDBs&xN@u6#$5q28F^P%Y2JHs7bko3V^Yymoen>)^F*EDSRtxQJ zqLU^9&2r|<8G-GDhYy{9M-`HtuV7G&*{9w73=QSXtnjDz7i5GlB9O(AKffz<1rL{>nJ~r0g&W@5>O!94K&l%^x z1(E!hNd)fJQYArm-Q!J9W2*+WaXE!nA0G5IALhq9CDC>~QKDHVPBcGqwo@HIq%x1M zMT0ZAn1z42=**Tvocsf25{JQ^xuUcS?TP<%d_9b{DaYy`R0XW!wf%>=h%hW z`7D{h=8h$@08c*zkN0+6v!7$lXz63IB@rnpIu;iFuMD$+rP8?^Pfy5qkEPzR=)zuXjFMBjOHR7nC3Bbpvpu{4+=bznsr5=pVW4OI2pOBvD>}KE6+?@OLDMLYQ zZSd|{&P5+;vpQnA88}B`;?sx-c`4zmnZxmznq_b>n^NVWP+flApGnEd$Z-3+FK)Wg?e0JJ$6~$I{Yr+2^!bA!XUcJkD6PT7v79%Ik$6KBztaQwjYb z@~@1$C*ZoXvp3Dmj^tb>oca5}EvM%y!TQ<5C+uWEz#oN&^Y+_8*((#L!N-q(olU#3 zu|XIffU??n*v=9UhH3aw_O7JF*kuIeeR)1^Zu7gz8H+0esi~ZVnT)=`3Sk-m+kycC zwzTB7JM#5YKdjYxM*DcB?+%28D>58izfPg$fj$*=Y$&v%SsIqBKuCE^Pfru0oH@-4 z5Wd~QO(8j5WXQ*VHw=;)TNfDSnOCsBt6A~!fO3UO&}o`xqdhC>9?N)7i)vJb%ym5HBst;QT8uNhgRuX zu)P4&Se*bC_O+AHFfrf!ZNjW(l&N65)!yC;dA#u?{bV5v8w=&lA3Z%!WE|VEyZ4L{ zY0}7Y7gwC7QZO=9M=Fa z(Aha{y)-j>RK3MW$0P}T|JOZM2dS}&`eY4g$xT`!z>3t0UVrBYdZj(Fh+@jFo}Ta@ z(JjeEB*WLLlrsSvBmGSbC7+xV3|oy*64ySW3&sf}>#OU#JAc03wPa#CbvsKrL`YEZ z)X9??j!cN77AJw2P79d*Y=F(exCklE*-`{=-{4Im+#a!vFN+i!nd%XPCW@ZxgWFNDc&#JV~LMNE)#0~JU#bGjHOKO#P>A8 zEOsuD_wQ%c)TsD2vVto-q8%C^{Q0oH4k-jTLa)~b41%YPTFCU!jQQAUoq;lZ|qOGZ1Hxr$Bd?(Pp> zzt**86vlMB%RI*8`6sl^S1I#SX@L=OaCN2ALjZD|YsLxLnO)k}*!XZN{D#m;4KXl`deHqbD#J7Vt`gp;1jK8|*v7AtX+of59&rmb4 zOADx}sYzjs-P?1hhg z48qjd_!n-f|HJ0iTTJ6w3@LhesT%IWn+P5_SfI!^!hv!r-g_2vnOc17?*b1!eQaD@ z8^|K42gSpA5!IbHZ{AEyOe9Bp*l%tB2BwmXkg*L6R5C>|^5ccSMI7*tv|?I^Sy_F3 zeRXuM-=!q_<$e4ZWbHObwpH|4`NKL*ck=Y<&eEf%ML{%Z{upUnADL-V*jS1){g&!O)zPE489*;K=c##rYb4zP!1kCL>oq_nrtgwSA>VjU z%Oi{TMa0Eb=4nElX*3!&d`ma#f=H+L+!Imdx`b^hMbT?meD*3Hh2~$C$xTV&U}o+B zB2(n{Cw@u*Df)VQPn|k-)G3<5jfI`v+17o3`}gMf?OwUg+m#AAQQeTwMHo)}`_=Tc zv?~@CMo#-!RHn3&wWIg72no{9(lZ+eC+Q`u{0)P`F^;)PmR>!4VZ7$+CkC3$Zq z7Ob5^gUIEV2$}KXt2MrV=dTC|2vk|KC>$mhTzT(*XKV3it(L!<8j!hAJHqCskHpm%=lPcb%W4;K9lZt|(F@7nO*}pya7|M@cEqH5g ziKDft3ERw$hn6&*_7XlmzGHdhkTf2_S5TeGJ;3oO@-P$SlCh?(ou~U83ENhW_7U!!?bv5nBKI_hnF@FXS+yr-8oy zuG;;8C~O@kPg0xg8U2|cvJu;*-Vo}HBf8d=OOD<}8r^BIa~2u4`Bp}&8!c2U^!3}o_|NfxRg{}`TIM4=)J)WE z)DEaR))Tj}(3Cp~?WsYK1OZO2cm9kNLdkC)Aq15OA9MWW^}66~@}7uR8VfAl5&`t6 z)R{AXrd~DtjZ;VA^^F)Ah|dM&(h0&bgR+;w8O5TnT?E$#3=h?qx8dBz_+P6J>LSQ>lA(e z+}O;__~h*N`0$c#@eFBci5$(8Ir;0?wGR(6AJKqSO7)tWn-wzMQ5j0N-HnVo;bJ(@*O^-D8D-ff)%^VW^5EKAnK}>}uv!yVfI+ zuV~YxBqR(B3?7)!Q;SPUNpU_AIO>`6;>FAy&sM0#DO-y2{3};1@ZXj42vEfwmt`%w z@;)jyb`A)3iiL!SO!wpBRDK4N$h&0wX%BZ)-&AYszrAzkrm>W8On|NbeJo4)4(k5h z6R~Dw%ubTPz=7jvUl*eEa{=J`;)M$b;w8kbZUre;3CoIKWORE3TAJ38h@BiX#gN4qy z3I*-{Ei5XMC>GOtLlw?)-=RUBN?Qi(eh3Js7W=5LSDwLAMg-eOw4sm|2D&7V9b4U6 zxsj*=h$J|8Xx2(s4R*$;Wm+`6~FPoB7U8C#dB7Mk^(1#rNJskFa;{}vY) zkN%Tnta%74ZR@5lBXx+`U;8OwoRsFuyKG z+Bt&7{|PC_2p>MA6g?o3AEv{Vcamj&5JsRmuFMMD#(^%6f?3-iLfJq0B{koDfNWW? zpBx&XnI3;g3-D6Qr%#VlQsf}xQK6+8{`ZtOu3rxe4?oW|Tu%d(1-@RkD)PD!;ZW8= zOzGFFxU=SP_Uze`r6*jOaA+fDr=57X)Auky_x-c^{Pc7}QW9@X`t1ZnlSB;FS~BB? zOE*4kdFzsQxipfpQ@1tZ*)A;&JLlP5TJqjbooD?8>4Q58wgN2Z>C>m(ot@YKer83f z^nagHnj=J_B_*=~*exdL8y^VwrqvCf;qdjI-y$ZSoTm6ce)7*5{$<#5JRoX zap^7y2s$+SPUOOQX~>L|yD|c3XpAmj1{u|!+WOGbgLq6@XDv26c^r&?a8*S_Xj8i+ zZEE%2@P@ORn3=uF&sPil>k4aoBc*Ckm&K*FL$>87WCS{u9zOKKE*<3JUQcNE4oi=h zx%|NUJx)$ey!myE5=bi=Yr{&XF4*}**lhYuU}+??qZ+LTuuGIQk@>HMA01+XtD_-A ziGmdH>(_PZ0UEy)EZlwAIOXBlWjY=*%T zMJ@{jq3Un&+QYUt+-u0H)GmC~(FAAw5ve(b4_O zKArvj!lK9ij*aB!)?Q;vrzMlJRedG?MXILe2%xnOQcpe9u6uiXprAa?1fbS=UEMv* z5uf$ZTC5`)u0Ck`478p8+Y+2`eSJOPzX#t#cIrT#OV1$z1>XHrh}MW<>qpT$caAuv zdBPJ;M1t-DQV=!CDG3Qu@Z%(6W8<^RJc@>q5@++EtKQlHivuzogr682 za_F|~a#~D*o)ctDJ-^g{rA0&-coIDw9n-6U6m|4jw?RP>k!{lOD`;0uN1+V}-QTJ7 zT^s3rTre?lKbFINe`{rJ^KGt)7)mLEm{nMwoRyz1Hc$^>6C@ircsI8Nphyzj=Ef+Y z!W9t_`B$jz?d=~C#}1rhF4!UMZ!^yykdEye%5pwwY>Bpgc>8p0fxB#V9J=eJIw zQ7!V&b&NK!GqhX(pK+y1l}vavPan z>tREjGcYTVlz4N?%gf{DtpEP%P+eVUD2cO|{di{^6q3aGW#}tPG@%FsHzIygJOxTG z5V+k53=W+hldOS)Vf-B{aNh$p$O7Uilp_f+TE0Lbs@ z+7HAPqFM=2IBfauG&7#c>e8hysB0<+si~=eBRy0UL-%e?kFWW%6lS_m|GyOU{CB2kO6Xas2luzv9Iw(<5y#ZzVnJA2TS9Vj`}>m~rvt+&yFN&ETE46ExOu_b!QJ3e=#m}(=F|uBs4BCk%m%Pa z`fH9++8UvDZfOYvT@?+Ym5_M2Thiv^ z{>B>F(c49;sc(a$!=})>%y)8~s=WNc+>Zs2gRvWV=Da*2U;x~8ZV(IdU+aV&o1b@e zhzd?ZNbQP}3MAiD zgo#j3GOLsPIl9+W10Yp<946f8!EyB5xpVg?HNPRHS_$>3DOStbzZh9N5A}wU3A`=0 zJwpFXB|U#>rgwrytj;7}XA*8R$*kZ8=sUSG%d!|PU zg(%-pdK2_7>t;pV??Vh=z4&=9Q??1CDSC+H;`4sEqVNf9PSYFHe0+(gc)~}T(_E>S zR)(l(AZAeqBtRqvIo?EMhwy6<97cHt1TaaV^OR<2@*<0Dss{i*Z)x$ENi4&R5WZ;P zD<7*4Yu%;b7k>#O7?)r$1bHq*2(+QcJE@@8vaml5`qWAav1SQQgeb)%M(>c_Gkgj0 z{yHB+F?VWmGIc9~_>rddMuLPeR5cq7N$N%JpFB9Y5uyMiZLR#KIWHhXM+*OnVq=>S zZ*?PuuTpR1i{Q>~A!o%%fqy50eJ(rVuuYi*7q8V)o-wKmeR0Q(a%UO@Aw?2=pxu5P z%?|N2n>LiR*WA!>-QAt^r-eiBigFrDmS%$eiUnn>GV$f{;;Ke_enF-E=rzQKMi_&t<1z-NOhWS}Q9nT&K8oNmO5SUhqCc>pikfjlbzNvqxFUtlZqb z6P;IbUWA5p6<2S8q%WN20ZOHRWW?Z(Cjc!1x%~ zSgV?wze9KCpO6u)F*(K{E_ONjz`C`yDem6+{_5TSA8$uVdoS-%;1z;M%ANfa08k1u zp9V}%n00ZmjD8vj4kkSjID}MNyaKWza=lYZDA4?nJBFJ{5&&;c$&mKzyl4D0f-YFz z{QHH`iX6V_81%xSaEsjXRqg84pP>8!9r07;PjEw@>Y-hq-w6o#*3^`9PgC@$?#LE% z3p=rwd8QY6K8KBh6G8PZhMz)LlP%GFd{`sr0#21Cogt5!9R6O#j>y`5GJ>J?SO!D( zhfg;+%ny1{+cG>js(`xB!OmVrvw02a@*LSrXqp~9xId)Iz$q;Y zCp)0yWB#}h9_($Vbmv;;2!w>F`$zSiKj2=Sg(9vRJ7`x!={n7TYgFk#KFnm(MusgyIOx&<#L=Q z+7|~0Eqmz{!N#(zC_+L4%ahxD*hO!3KAT+TyRj6!y)>?TfYLu{H)HlL20>Uz2q`() zLCGpw?ycJ1-s!v2U+EYioWv5^R0aUw z@FMj@;`Bz#W~j5wsq?l;TMP6~$CX)5rPc|atd=?}G_&&Tc3sHcNz$@b&Imxlh??!4 z4VRl#{QrJV!~L&CZIHqrZAMzeJO(-!RL%UKKW7@IRtS-xj24-$oomY=`~({|-G!E^ zzUS53(0xI1%(a@JrRHb1*Yh|DMZvq1!=##%A8Yn+zTq+Ct3#|D3W*~sgDV8u+8*NK znt>+8Sd0_0AYjW-6oJ!1)dsO6_h+d95+v9OX=${2Zi|bH6TDT*4F3nfR$xK#*P|#0 z2Lqsl-O~A{7mUL?UA%m9So8}NFzSCDLFOZ_D)FK?r{H73u<-@+eM^${)3m@)%Lp4Mv}e((c{A3D_LvB$kT{G*WD>&Kaepvbw6h zJu(5Ld2ucpIhe7k`lFpQgqPR@c<|dF9+-5Q`!%l`Jo{0HS-oYn_G!_%$lh#P+MK}< z;KWTB4F4hg5v@t_#0=A932V5E==DHN%|>i>WC;K9;}p|>R#&~R(g9Q_ux+HTzqayw z>iOayeLdZ0j!9cwej{wfnB6~X)jp1&G8;_4}Ipj)o&Fnaqeu z#XEOC>+{@3ashE{@Stcp2yKUWSeqqqj`FE@S3?pNl|7c)=tS{kL@}X~BmW)tGghR4 zPD<=cXsG(DOuZ~wu~VnsROYQg7e^*(@Dy$M7Gg0^~Hjc!l-IU$?+b5c{GL^yJ1vzO7*6U+iQK7@B3o{SS0lUd##;$-XGF)}C5 z{7xY+_eERC2o&#x^+sSR*|L?Lg-R|cyXxKW5+O#`hLD(D!$|x4ugYG$uXugzm~xc% zWiN;@ZF=Y{9V*w~?(VMsX&J7*4an+1e?NczU4USupKoIKN&7tg#Cr!q37TmUIXSt4 zp}ysCfZ3eLMy9`4o^jN9by(rrBCzVpqR#0cx}T1{e6j<%f!gJjMNg9d{lXUJ<1inm z)$zUbcOZg`j*8MS9{EQuDNKZecnDd8C_oVI#V2wjvY5-tZb1$}7BJuIh#-;#igjqr zDV+7XWmq++wcfv1H&v8!$m6I&A5diN5kKDA&{UO`mnTd_}aO_WDizU0kEpYI;^JaP>%sJfmeW)dU2#_}<#1f2Lbr zkv*;jJ6^vIY5iq@6A`qlm(*BEG;h-oe;EkD0hXMqY{=p$WM53eAtrt}CwUl^gNZwu zLF=3+PA3gAbrUwLpM)iTqD8fJMxhLzfz*J<066 z48#aP24ED<)T7&5ThM+IxV)#@p8za?>eDEF595Z_FnII5t84tvAF9Eoh6ZV`U!MTe zr{L9`THpups`C#08U43lfDo-`)7?bhAa6vm5aubZhxLj`J0=>P^*~hXiUKp<)y~ zt{V`?TENl~whtt3vSm(e49HSwcP?Q%d&&rf0XzN}*mDNJ9ZP*? zCMFS?)Jib_Dq&=7jN*CK^)YmF1^YcZVdw`X6(zLxO%{a)e9-QI7>iu&RXjQApxA$g zE=mG_)d8LL)jZgfEV4h>2q~B1QUJG8npn}?7bhe*EMMBP+Wa0S?8DppVTYK$wX{G+ z)6&{se6ma2NytiLnZ}D-l_T6dTwR~PdJD-PL~Wo$z}6|q%QNJ*Q9i?A5g)DJyngMy zwAd4R%Q;2kK_H~v!j~_Zj{%s>OGty*S zplsFRnvDO=kj5QeY%IX?G!qCH*r5w#pKF&z1qCPO=k*)|b?S{Mmr1!LC4)6e@%Rma z?>_t!?LwxeXJCAkpqNF^kDq=5v&{fBauy_fH+_bahY3Woaj=-DukRVCCTIHEc6$q% z>w-|j^Hx`oZ@k4sMPJW(|C^P>!eM|IFXsbBB|w(HJRZeOI3V*Ye?bKQm9Scd+d=T40IbcmkmN+KhF%5J&eqYh@`ogdptaCK=F-0CIMjvsYd_Gm9&`K!HJBZ zP3MPnbP)ZbqiHNK*RT1=(NVKoRNWGJKAR!$bu2*zF9E8=h^4@);5AaH#*ewD%wP7% zq4U!s?(TdFmGz0Uum&F1xLS4VJQj;JHeQ7YNwJW82~UOKIrXE+8l=$mIQeIXP-9aS z-@bjbsq>3&@;S|4*m*qK(97Gqxupf7t$)rw@?aQY8Saie1{j6GfdR$?@&z?NQo|!X zrr_Ky*fiaeg90+K(~DbVz~u+l@doQ<8a_q;$B~ixrl$5r`tg9_gDjkEt5YChQyY}S ztD%NCbq^ldf901}Xeb%llqxrY&s3oFT?gD2cu@rf1>^vvew+6WZA3*{HGBs~v`K8F zA_PO;=^j-hVH9pfMQ4D#DxjG6A|nj&pI{~JZg#Y_F>>a_9uenu`p|h~55jeQ7!}kD zh9I+ykB8y#T{JaC$i2ZL>uR7rK&!Mf-WXl)XQUV~XsxNhrta-sQeCZ7{AQraS1f^EZ(UYpjYAAE zxeck4f(tAS(-WMoNfaxH5w*vUE>{Fl$rj+vFd_R4qQh0yLdfsy>+1}qf$t861sZOT)|ehFPxHOEPyq=88@FR(z`!K^!rML5z$ z2FJb$qDASf)xh4qEoT>Wr?f*; zJRv#x>{S_oAldPu4;~cWH(3urj3_KbcOFTq@+J78b?Wy-M5?WZrY1o!!p+GEEg-;g z+n1ou&55n@!xrV|&jI>3=9=?`JXVV_(pOg}Il76I=g12- z?6)}qxhxtMe3gEXRGX^D{4~-l zzqIC2ge+5w-Xb`@eR$$>mG@E0V+9*5B(@5bHt-`_68^hD9cC^5o3iR~uH&vDiFyhmY{q7N^QV#>Y{8t$==?ka{t~u9mU&4zC z1I+FXQY{hi#+bv04}%tu1h2<{zV|2`wdN^S4Ln?LsX{&IRSxb5VrB{HbLgYWHs(w= z!bil?FHBBIpwQ^9HZGFZwT!7n4_-4Na{TxjFaofd?SswO2?cG;eg~!sq$02M(xf}x za|I9%)CG-#P1}^IWn*n7xWD1=1&oQO=q}NwF@ORE=w`^C@Fo`O4!%39AdX;c)hWMUscCDb3tiS4N*7VA%Vt$etTd@!wbdM1B~D?NRH9;1vR$;C^LeFb|33c? z^SC-YdT+f`K zu~vgkUOs`-kj60Dtf#^T@0bOh8kqLqj*N`lHazqUIe}pmJSR}GE~kx}I9^Bq^62JP zT2wSm;TWBtw{RT}@7i=L|7C~$U#w!>c;3{Neo`JdrlP;JWR;DW_y-s%`Gi0ZE9%&Q{H#$&{IF3 zv>wVfRH!Z#UZ!m}=nra;2erwKu0pe|YBic0wsC4f6%}(DAk`1f``o&PqUDEy6 zxp0|j9r$(=Cr;EhO}4R_1Dm3j%2;Nic+Pm6DyWn?JF8yzEEztT;>$^(DRvB?AMfn! ztgWpD-k8R-x7*$~^Cigqc5ZmL*iayrNVpCAu^z{SC$ROEt|cj;5s6;oarO4?frk%0 zPR(5W1D~QZWaAb`?)z0MuqlFA`|Y%$4<^%7hKJ(h^1aC5-NK(K1#Q&Bt`)9TagGpx9tABc~Ev_vd;Y zwP6H&klnk0Cm;(aCMMFX0w}=AC*~bP5oL0E2>zy}@n$eZH~);FW76yG?Tsc{Zr#hJ z);L+_O%M^SGa=Asl$a^vS5|MFYJ9QCu7Zec@>Rc?ArxxT)44}SAVzrc;7Vw+G0iN# zvv$IF-e5vWr9T7l3Xkv7P`UZH-C@MW$qVdGiN#{jWce@Esx+=Qmh^;#@MHrhl)%5u z@7TT&p8bV`gM*up4G^0W^xy>I`>tKk79yLIwqQr*K)#3HV9HS3{D3JsPDWR7 z1lDUODNW1u;?No!8_A7xyL(Qee4B0c!!DHC^tB#hF`SnZnUWFm;vg*qv=<68u_gsi zdwYYL`9EzowqMt90R6|s*h>&K(v|+XUG>@SOO`Al#U8U}O**$v`OWG~A<=V*B>fEf zN;K%;CN#GPHUxWj4}wa8Z)_uu_F=UOb)qVjDl{}yA~{nSl(D)dAu7MatA+$}H*=Mq z8E2D}kN`O-;~J;crucX3Kd=HN_815po4}|Vs>n-%A3&zUl&N}x4R$TS#$ikaK7yb{ zvZ$*}3OqTA@}#=Dnwq1I#v8!aYt)j5Z(&;WY{2Xs{1VS{mqhBsA#`9QGGoJ;GiTnv ze~(EWgt&!3(ao!xpPE1xkkofi0^5MRL2=7!)-Rr#n*;O>t5CDE@31aqIXOAuB95*{ zbku&O*;ZNRn!FomM&$qfF+X2Xf5;8^upl<5$p(a-?FcQeUcK^@qGTcZ1UWptg}J5; zdz9W|K;oAS1;ibFGXPsqgo?Wina)TSU`sPf79;euw0xxq9YmRlL}4d>`}iT8295nL@SAfQ$C0TNOj&c6G{z`4KGY#|MS_r?i$*hWx zSInk}+9e=AKB1nyEFbB4{MgewL#sxNz(Sond&rU!EUo#qjdYO8 z9O)yowhTrqeplyr$mv9K*z3W;)Ovdm%R!QfGeyPu7W=KJ0++v77jgjH3#n8JZBw-O zD~uL@#2u6SZNpqTRsvqxtXMlKR$4y7o-tW76Iw83Ow2#S!)f}kfPm=6+_~_0mVTT3 zWG1WM(dl0qo<~0({MKFTZXL#%V)4>CrSd9YJvut-SGUFtxXgmp5jID$gzcP+JHy?5 zm*6)J4bFN#a{$FF>M`( zmdR!h>*$)V0S@IHI54rnTihznm`G zSujtwSW=Gi99E4tP8+j!FrifCNl)q*oS;|zUkRyxAEtBL;@H_ znex)H^*=0jYHF&E!<8dC(pO}U@4zd|_1ds(sx4u?aL^&lLw7(a3}c>}RJLmT3FXvA zvl}XFx7t5bpiN=3*`|DhCR)B%7;VPRl8E$O-}(#p9ebeTm&Ja3`L4DF3itt>?53D? zx=*hlP84=susp^+w8vaeR!%+l4{u^WalK->$wz9}cPlOUe6_LND>(7=1=fbo0&J%F zd}7NvPa%#UA{#{|H7Irmi|9p9_PJYKU2)=Xx?KQegkVt@PM}}hLT)qtw;V&`d%;-z z#~FB*ot<6xVYlJ6l?BmIRx|vG*|wLBz$8U3SM~C8@(T(?-AoHZ&BXFG04a%LT^pRn zBv~lBz?1t2hKU{*$J)>q$xs9!S5g!{XM5sx7EH0HxR}&`Z&=w{a!xZ7-(0S|heI?GK!EWzASj0{M<51Ymz9@o^yj(6C9@WdF`->B>*hEK_B=O~SXwwR%YNR|qbtf4|vArwYZ zq_Rt7E7^sRedfJJ-OtnWzQ^(Y{X2foANO+~bDL{9uk$+3&-pn&*IctWZir^ZutE@o zHa5~f2|@6e5CpSlfrC#bUfP0xLQLm%&2%Bi>g}fCFymwKe~eC=K~TsZ2qH#7&>9{5 z{}==XC_vDZ0|aTLLXd!u+vsaq2>M6WSYOvN=&sYM4y!@Ej39F!p7(m>2^<=C`w0JjONrG0b^;P78VI9*4+B1^ml0=$nA!+=j*M}) zKM-WrhY=x+7xup&yVW-x|i6F4^*U(9{VdD~_)uzzu0VdHsueCi%l&oxN-&ld}-%@Ooc;Hr+l+Bi6Y{f*IybSgfMeMb#qfwtd0oV9XNG- zY~slEZL3=_{d<@YGbC%N!Fh;lN82ug=LU$jlR-SN)TZr&zXJU^I$c)R59tA7?8MW& z`N^SlnpPs3*YFg1AIl`V6^@8uu~5|CQ@Xy>NyOreg@uy5JUX~S^pU;OT~s@>|NFJY z@e7}0x^dXKP1JM2wq3{v8_L~0OZ)UC^LN0{BDhIu>^o2~86@`X`(!dXNT1RdBlO!f z9l-^lcpwi!kxE>f0b(PC0k5PAlJ<+nPl~edP>>4}#D%oCt>8+ zBnzK;GQ?-;WI8r^pH(sCvPEK~z>4R?nd814$6fsBJ#|mWlj+|<-EdPh^WM#d4GfRLH!XHTEgz;l0^6A zpAQ2%@ml*Wq8l!X$IeK!;-uT+XfgPrs{7@<>`83n{x9^U+25_6{_*6n;A%Z3^11eh zXFDeNPXt^w+e+PgfA5RCPeesdp+~2SJurlJf_QTw z!R{vp{rXDlwgdG3*8yUL+;I04QL(}pjMLN>=QO&ZYE|}7u_QW;v7`f3NQ!jh3MXm! z=WxWs8(6N%PCDg2dy}lJvIy?I5rQ_qeWdKd|K5BfSiOzVfih@_2o-0Hn4sF+i=RF{ zuu5TaegPAm7H?UhHMn243%PbdRG;bT0;~>2=lMjy1qz<|y;C_Rr?Cj%Wljg)NmgX# zt|+-9e{GstD>MqRyu!87bsAge_v|%2q9!xdp7!Gb&Nh2jY;TE)-bmbVRJWx*+@oZz zNL-SeRKQ6~S;&)15cd)~_EE~%dskyOgT^a^?k!B zc;2U1cCx1*ZeG%n;cPniMU!h2<%lb|m$5p^&C7Z`V?OBlv&xcyFw*&u0>_3~iPE<(bZjO&C;=whgTq#rlUGKP8#La4-ANy zo4_ZGs+r!%WQ%3zJF-fVJhNGL!T6xtFh0p?W_UJBo0ZWc_`SOZU@7>6r1pYeT#W2} zMHo%pEu2jG@};dGMcp0LoU3Y{_0qtDe{=O0edDbE(%Ls27Wh-r6lo0V+!g$zzB3s* zAbyoLaqzVTQ2U-7#38P_GV*uGNi%T8$;qv%DehaMvxs}_CQMxcq00a0fMrN$v}lt zeHsZP*p95JSd17MY!JQUkyz-#m18C*BPG#OQ&WZJSshK)Cvc+K0S&z7c`%*zb)oaX zc!%+lNGtv7gD+ryEcuQaU;)fajJ1!T!P+gW2Qjp1cCDAaHzeif~0D<}`c@=(9iYshwNg&OTc!+s0M9|D8kI2DT z^bwGu(H#a28!L09B$Qi`MnfMfwPRkV*z8zi#VaBflL({WQ2f(PCDEyh4jr8^Ng;Nl zhFjI~$oIQ)7An2Z_%`uUx&Va^QfP&){M4kAf0-NVov&g%uZwOYA{V2K*M^ z+0ey{M5VmyS&nFz&ogfQ=vpj zJQpLOtb)ViK5JvMTUz>KQ&Z7npQVYBIQnqKRI0iE{*&#=V|W4<2Pu(ma2&SaX1_G6nv{^^{0XpkKV+h>gO%7eiZQKH9= z9W!tZ*|USak330K#|#t7u)CNm!TN;J@oMD~;HV}B2oPD3!X?1ZZ~c_8JbiYKv|Fc6 z&$bw+Mrp)*dLrdsO=KzPaIPC5c2Qqh1bu$$lDGHfFg&WtQDeAKtiFS*Hv~E(m}eHv z%>qt{sh!2g9l^x4g+VLYzw`|Z92*yS-zr-bvC=p+H1Wul_$Bm`{rvoVvCWgU*12{A z1Pt=jsEn#N@)+OA6jkS_5frO~Wl}_cdOYOp?Fy4a8wwXlvR+p!zh)>|@c_+*TOwc~ z1h?R=NO&X%$MHmE1^nkL;6|TJO1gksiV#0J-sXE-DywgR$iM`Qdo$j^=9I8FkuXSr)Xp8%*C*;$Ic`bgDRAz4 zZK#xQ)Q-Cu8K|^_zN&JBOl-6Tuq{z_52ZajI~(%EZEkH`%Fa|#!V^?YQCuU}ULo$0` z%+C#xjMMc>+aZ|wy~8l+Qvw31P`v zrt~f09CYUh3fSJ#P%?*MBCH$MbEtOU)lTd&girO(xEhM-yc#FpUA>SdjmVsXj_{9 zykYn8nOmOz#93xbU?KZA__OduG);U;pbyn;+17@Y-{h%uTzApOnnsI()96H@KNYCq zpcBv9=YeVW?llY#uXi!|w6(XU3NobX-^n=TjK?p1Uo@}I6#E%miN%Ny{}^~dB9Zp& z+2c?bE<$*2A;!K;o=lXb4YOd^*XQU7a}j%&%vY8$V}DGwWZ3YSVJb@xEM)um`0d|xX&>SeQS51}PgB91T>Twu|TU9y5XJ(!<81p5hap*8&wk1IjTMmQA`tECIV|SC@=+XAV`JO9x6rG<0$pYs!`$%HQNuG<$2kH9 zQ%YZ5BRl_@N!*Yg?a8>qO~CnkDfOK#p-1S~=Z0vTx$cK(wZ>3-+jJsE*c}iEvL-IH%DI z7Q)GXtw8MoA!s~Z;uFKEIxuJ|e^lJFw;5-}=$pBQ?{#lTAW|l&$(dbca35tH7e#dY4Lho_9C z;FXGEmy_C*MBXsAo%i!w^qjPGRGFj3Ce^~tJwp0&jJMQixum>7fJkwLw&0Zd z4%UV)-uWm`Zl(Ow6coI6Mqx<5xulpXEl*PzKA$dsiCUDXU7~oakuO7N@!h3Ei1=YEzd>sUI9vMBlB?qKHq7)DeU& z*WpptSBLw3z`!AApx)KQM0xDk~Z!2?=aQM)=4BoNZCUthsG*|29#h93u2(j15A zVJl0^rOma)#qm}IB8;l;Rcih0&EQ~oe}xyFww0Fz-!eIHYtqy^l-(J=Z|Y2i2%&jIh@$j0Uh8bw8-s=g*JVpJL&V|2_36*8oeaDjj9bI9uQ2=FlT9 z{MN|KD95pMtZb)*VHlSmO+o1d{HC-LX=kvkETxf3gb}@14%;9blsf=i>#YfWURnxr z=_OJLs`_)>7pLsjO@7q`Y{l!032;` zod+}UPD7B9Wr0J365~hzbDz1v8sKcUb>UhiUilGmFmFW>Ou=i(YE@H1*9DZDvi~Ks z@TK`RdcFFD#wtw7r@FEd>P(A{UJ-Z0CjNfjZ<(H+j@Vq)m6Sz3Y=mHC$MI4Uj4AO8C?93W zxan05J#Q9y5^@$nP##xZ`1VF(po?a@zJ1_XC>Ms+S;T(mcRGnY)k|$MXvi9(pDpcu z-Pm{(sMURtVZ$z3{L&RIryH!PHhgfZOElJs$#Qv{{J$ z>_m)KE8<#O+U1$?4k?V&T)14MUT!SHaO$x|ycgpZop@{1sSuysMOgj0!~eshCr_*c zPJfHQ+?tGf1~6pkuNmvQ@U5EA74Z#BdV0F3c9>Dlov0kf)=cnHW~9pn09oksMO50b zb1_}tayvDC=%5DsD?Lx-j@8YzXSZ+j^{o-39uCY$0O*In61H>S%m5GeSe_J!93#x0 z%1}QVWV>!37m@ezNS2AYxuK^nY?MjLKW}f$_CG)6)HUp;jDu!bb(0II6P-$X9 zIe#!9VUlml9{CQL2l2=z5P`dPnC9_{>XEzWbpddX1o!9TJ*|zU$%WfNFmTN}|Rylr4j?pmm-|I#IT z5g0goJ23BvC)2S;dHMVkS@kX&r*B9!=tsS5pa1qY!A(hg@7_;6JqGsS&sr1euUJ z&bx(GDfbTu5ShRpl!25P{~cfyVXV})&tC-S>2#-z5VOXp-~kbln*C3`T^gg1!Fi;M zN~^ZOGK|FkVpTG)5z?)Tphf%|)smF#e0N(GrGe&9vMM8R8_SLwX7n{c=-b<-?39?ZDXJ50 z`sQ9W0LF<1dPRS*Annw?_~cIn;?TQl@7cg)VAcfkg*-<>xu7^+P~9}zW5Li7Y>{{( zEAwEZUO_wc22ZQj_>5@AWBb63&A^O zj6<3alCO(nO5@2ny-q~pNS~5ON~73m8}`J+h>fvlPm-&vC>KhnDyKE_zppaJ>8Tr%yvRe#u`YgMu}h6%)H%@RhaCM-2C&>5gv`lP<~1N@K#oq6VFa5G#-1 z=XhivK$q4FhKyOZ*0v(Xmae{$egh)xt_dciz4M?T4-E~)yBB^bV%QL;2Y3Zgwh+J) zvjY(mf=|C^5KC+hfU}JyTjx0jl?jRyXP69{K_E#71D{$jj05SacR{s4I)#~;8Iid@ z!6YaDVDd8eSJ8zA4ZiNmII6FE8b`+01Osq+ ztS)cRN45lng*VJH9<;5Aj^f*MkG^>W7JTwqaiLU8;s9awa9@`+96h;R!jDt)UTODa0zQ7Ed1e1kS{FO*|CWPUKN>ZZU;|al*KPD18}izf>=>R5YO#jw)jYj8m?-V0^!xp?VilVE zv?FMquC4|zmOa4H>Ru)5GLE+B3vl8U?0Qzn^QRn91`YGTX{kz}3R?b};0+MoF!xzJ zdUQ^p%uDl-p#Xchg{5Ww!(;uK7a3zjk`1@V7y@GqVUIQ1T1SWEIZ6SGy5&k3=92CS}XB=DZG3hVe3b-I@JH?F=ugx%M`ed3xUD!HD7J5WPwl{75M`~o`S5Q~XuY0zUl6t_XIsHl^xs5}(azX8=(BnF_TWEHcT0kS? z3N;^+a&vb}N=ks^P}yW`1PplLUVgX z>oRFcEp=HHMFlmXiQ!wfZXLFy1kUz-G8zVO6pL0*rZ#y3qjLS>WU+M+Ab%yMb8SbC zuw$qUC*RnJSjbgv81tMw``G@%#fv|_RNege>xNqSE;DOJEIs$SI5vg_ryC5zGIb=@VaU)7Vc0T z^jy3yzldT7FvN!s=w7Mbm%%(go9gQ#=<}hlBFI{+&5)X+@9J6*8+(jEkWo73{iSkY z?1Qidlk@>WFJLPR&osC(*IqFak(Kyv*oN3gBJ=X!8my!VrjhAUww#EQ(i}nc(KE@y zpG3hO=B(PGkEL9iv*+Nr0eeXUOrzG3103?(hnD~judnb#nXNT_b3I~fDoUlWw7jg0 zeC0~?l`H(bymAgtHoG64W$H&skwA}O@Wmz0UIM|xqqDsomfVu681ZXHh_8goY+%dY zga?&939QB0#bv*&EQz_+FRXhTHh@qPVN=-7ncd+$ol;X#!BKep-t=5XUw>zRXXgv2#@Ish zNo>^o*oO>Zb#JV?`rFs9aWj?`SbKS zx{pId>z$fgSy^>8CEtDwXf7=YV4w;DmL^C3B#GC3tBK`ZmRpoPef+OH7A2Nf@0-mNx^Zs$jYGq4H(Q%d!Sn_I7#O^OEn z1+OrRU3?=}-LFVuFl(fOah+sV2GOSe51VW@g^Ymq#2O>pKh0QLhE0V50>M0KzsaIhHlz4hvpG zpW3e~g7m9L89Hch(SLovgvT|tVLY=N)mnUpYGMD-hwGyxBqY#iv~z|EU_q74IB3`P zN*M7RP}w6oRc^dp{>-Pd`q`JvKw&xY%$yVpb@=;UxL{oqqH2sWv}MnaUTG<} zH4jzEIdHhA?W`N}G~x}jRD?|;zfy_SuC>97V=V#}APi^|IE>Me5!jfEji9z$N51UYQb7>AY%k^;rRGWA3 zUcpy~$NYf1$SWla7nr0*VhVz*j#j>_&#{`9xJ{%VGkK`)`9-O%-V}mt*{OjDdDG)Y zMxYc`zq0l1EhlT?-r?WIeZx@VSYR=UDxb0zY6Z?w7l?q=0$4 z>sfr#;4Qk@E2;9#dnk?;^SWFUCv(k*;^RNCl%g@X#JhJv>%b)7ACgw%k00JmM~pBG zk{I+~ct9sh93ai;!V`N}vUF%AR<)ufi&`_VwrA9eBjMrNDAZd*9El%a=E&-n(jXok1Ok!zUIGM9Ki(A&n*FbY3p{#?!A-KRf|u=dr?x1*YhQUx_ZbK( ze)v$k_c#x{r#vhyO#j}9ffS^s57J0<)#unAsCQ{(82`ND>9>&)p%cF=qz1-i0S!-} zF(^YyzI2Q|JfSiCUEuUFYEe_=RQeQ&<1BAtT3Xu8n|jN}S5i{=@qSmTU3VgW{`^UF zb8R5k*Vf+#miyh_`>i^=0ylc$*!;CSA{@PTWWLp>ElKs`$B$jJJ*VJAmnUTM8^B*Z z@R&)GG*qyw#GO;Q2BUVps;_?%z7?`=s};m($1ws2P?^aB>S8)tHCZS5Ca7S zJ~eDSCWpKj=})CUwhv3XeH#!$?Ksqa-dm}uh4=5D80ZBF?`6nx?9`jDsKj>{nLZxF zM}pwDE!RQ{&h$QM=`+SnGhnuQ5a9Fxc{=ieS)7ZXKO8VXxECJ0*X`z4hK90-hXXt+k}oLE59>y` zlbr^t11x=N?P@{-evUSGRiBGA0?PrhHHv;rX+4U&pOMKxcd@3vJ_-exSs_q4={4Xq z-FdJ3&x3m-Ah4qTSbK9-?Ft(MsO^!?zkSvs_$1L1nyJ|%C1rW`lwa;BaC$EbMz^Obu?=T#s=jHkN$_rcVTv~es ztb8NZR|f_M-SDmJ?~#b9bmQ^N6p(0~ot)O^M-T&^yQ=Z|jB*<|Def%fscd@Z0CTwF z7Z#mczP#*5C|(Uqf|w zckkF?DLP(MRFvI+agt0%^6}knw+%FAmMr|&V#IcSaGExFqf{bprLe%+W!xh8G)#FI zl%7!mfy zo%0}8neacp;CHEz&dw}9CjINjfXQ=Bc~Ag(xw##p2%m{o5R~|L7yR41;9{N>5@H*F zyspV)LiKT=)dl^sK5`_PW_y#^ZQ$xE%_qy~bpWoqqlCY;sR^nOp7`g}JVG-6&qgqj z+Z(Bdtb)_-*lcbtTxz;a1pTGDOXK(R^Le)}?R5e4@z~hOb}E~Ig5{Yr;Tyl=V_m<( zsTzuMax`(Eij7)0#bCpV{gg8fDb~k8dz{bi(&Y{{7jOU<3r_a+KJ$oj+rRZ8* zR3x)+Urve}z{7VzTN8AAAGnBzTiDoWgxub96)*L#iGWT7n5Y5r{8HK8}|0WmQI zxTDCASG2`(b3ebu30S!$>_3CK|2DfTWaZZU?p;mD!uS5v97}jO{TF>~+3?-F{Yx*8 z`~oobRN?Xaxg>c!?kM6394}i~P~f^m^VlCbGVsUV-PCAKG1vEL%GR;NLrWDBAPz5?BI+OwHYXYeGag;wSD0~dD8t3@J&qss5RsWy=87U z)6xXnG;D0K7pe1%&JB=Ilbn4)pk`dLGT9jTt%J*2f)<~&^6)Zn{Qcd#cdyShqwseQ z41dQY0a@g^<5}8UlbwZ@*!j=T&ih-nC8nmP-nxYiVU-G~SNhM0To_DWceiR=sW@xm zco#^Qdj3F7><;>QSl>@Fg2y1MNEz8jUn+l1ynQYKm`Kx=bE#B|*tj^vnZ>RHTxrW= z@9*fzclyHcS-l+{Pb(@?didk9O4t8QR{Nk{xVXV*;7=qo^g#h|#9r#xeW4lo`}YfP z-|m4vBkW6)x(M0hr7fWGq=v;>v{S))!6nFwMLIEqGvCR>llKE^mRZ#){&!Gr$ZCP- z(CF~gR0wS|7>r5=e9^AVLctNJmq%4unZ7x>m!in9#FIv`%a_h+hi_KCc##o{`~eQ3 zfsD4qa>+u0F^!FllYYFfW8e*ye@=;434omqJT&Ksm^Kj?mbp=Ye8lhUvg)NfU9acL zM1-nd*_XTX0V&;Oa|`7&|44WvVp&*O3+~^C3E}2u$S|W*&~CUgYZIi#-DbzubBf)2Fs`CkX?yn;wdlU_)SFK(8em1EC~t1<{A440ycyHkZ3Pv`ezPzAsunYv&%Dab{J&{&wxmr6=4N8;@rR;l(8KgH`vgL1y51FlNZ()an-2HzkB zX3t%Cj{OjViSTiPy^#e~9#DR5$AbtuM_82ssAB4C&R)FubIA?6w6bz)p=ZZBv7H%> zWo{_{_fUvm#Brqr68qtJA9$`f?Fgmc&-iSp(OXmn{co)Z>)HNGqoP5 z(n-}y9+!&w9Zz5H?xk0PdNK(qoH)LZ@uC3|2m%Z+i({W)HpGBzP3Q#9J{{cf{W3B!(vblYQqG4OWdxh? zGHMv2)?vI3XK#O=-l{1G6aXjsQ(|JpIoXkYd<{bEjdptfA{izkP-R#)P#+3d?a`}{ zf?$cTQ8;r_ceb1E8FCA2_5pm!dk6_+`doU%?n8-e4?anN^^`!|cFaf|Qnb-3{%D|Z z{#VpP-9b54Pjm4EbD$DyfBi)U_PJiS1SiU@#|tp@u_H%*Ha=_Bo8Y(yLMf0I0tm+a zOVni;i%azP8;LW^+;|O;&N`ri;d()k8nB$(>Qc~-dOdHQ1GED>|+6v{Qe6U zE`-=Om>pVOnR5VH{%3N*30%N`j4t?+*we!KT#eO(LM`BU32@G2=1NGEe-^pHdsf!T7u&@w0M7^+h=HVnijgp-r&43yFcbK-T zh{P^9amFJ})q}s={B-2qp!hmw#38$j{%>E);E-#~YoJ|i_4#n+io20`_9+raK||*0 zM1zJl4G2BaC-JFGC>FBXfKLz88;aWh)!;K;@MM>k-bjrWuNU{WF5|e%%|Uj^gZ<}$5YTH*q$BO{Ej{vpm%QYy6SjmWloj363Dxp=a|DG#*$iD% zW&MADWnPw6#Oys(TauHr_Vx4IAstlh1AX@O#SQvxlNGFLxq%^ufF?VX!v6DGi72DQ z=pB)Af^3wu=FnomjNdVTuN&CP?ZIby^oa#S`S}nQ(aja&jpxDf&PtmY^zWLB@%V%b znT=r5Wn(%R z@0gj%{eWTiMuUbLO+^qMqQ6`g(qm(9`BN@#E6%ULDE2^`9=bIA!Qz2HT{sPNe9oRf z{~YwWIwX9Zot+s9NWp`kN2RV(UR3&^AYk~q^M76R_agPmROI*VI~slNDz#eo^yyjJ zK&svzU-1CFaC_sx<7y>{^HNccpMPT=MlGI4R04smz)13mX+XWXp!iNMdlj{M&hL5xdy@?u9@pSN}&ftmnx zwhlHY0b*YRxG4aN`&aoLw;sy%TE^{gW zsb98l;XDZll@M%6E+#!Rnpyc%POEW=v!MjLhuQSu0hrsQ+tQBv8PC0c{W7J|Q_sXB zZI}ewK7V&9&uhUDn2H9w3J~k&`iy1}Bj+(5-GvQh zIg@RK%7~TwPoKU6P5KG`GiY=?)`rda#r6Uu84D=kPWsy_zLDT$-ZeL$tNS^RI_>i% zCm@eO>wu%52C};|vHon2YHMkodmp!db>H2`{E6P~g2qBvclS;V_uqE~+S~imkjR31W>2=k%3o=z zsXqSJ2tHVRdS97={-1oX{k)O7gPond&o-2FT>|@VUFZwx`0-U5>Pr~tJo)4PcOZ@m?}2v>4Yrn6;k21$&?TeOHzJB= z4$|p!5$6qumW4k}3fZ+f9QN^=T;B*Ct}$na8|+a!0=myHE;d#dH3cauDux{Y&hCT9 z6D+Jj3)x6jOo!)BWwaeFAWb7vQ#pD0ftSI49v-$978AKgTkdIHMi;vQao5cK5%8wt z(IdpV!^5-ky+t5|+?%1EeS5t1Uf8C#%-erz!{BIn@C;+6C;shcYvyO8l&vrt|I5mPa+>i-oE2vXTFRysoUl#1|g17_q zcJ;Kiz4V)&OcZuqH9hwC<>zI{z!MV_K@rJQLRrJ&E>^?7V|@5ZKh13 zvpCh;d}t&Yxy1Q=1lCjHaQ4hewCN_oYUO5p3`2zkDxcp+4`=N9%ozjn8{mH601S^F z<>MzJMUl==q$tAZ;sYD&>!30>Sx%H-K~7nUHPMWlcE7zl17~Ii+FQTX-G;kG5HlWw zFBT)CGtL7tZHcowhl6M~J3O2yoB9LY=tyqO|HIL22Lv1ups0}GU~ZlF#2w*uT8;l? za!*gi8*)XkUrJl>lhG^(y1;vf_P)MjN63RLGl~X$BTxEd06&+q0+K&cp zjQwM!5{W$z#m8QciH}PVPHYqIzz?hkFt6R$^G_q?{|!D^EY6%!^BXgLC>XFf7XS0- z#n(>F5ldEbYjdr2Kc7xL`c!(dkbgu`ak#f_LQE}w16Gtg;5^NPEH0a|7;U+72lTk{(0mLgR1IYu&Z{poc`93(XH<6FCOMZhW^8K@l!1&mA^l+_icK4*v&{W+LBhq=OQXlzb^$+HZdEdMrt_sM_x3I;IS zqyrh1kx^6b(Kv!vJLu|y+q;vS+uq8e7C-ouPJd8kwUc0TG13>;cftEZ)oSykhVQzdwt})nzeC*2-kVC43g+t%(03 z%b9tg>aw=3I;&V~alo2b(bV49Xl81PRgp}XIeH`ij8scXv5TuK5HZYAkz;sd1bqw5 z!Er~`Z=@|VZPhg7ugkkl`kR}#!mLrg-^SvrtE)eL{L$A}{jBgYeM677TN|J8?NwEO zZEY>!sPpO!6YBxLm6@3d+OQ_}=iqKU+42{eDujVLfbM@dn1^sS@JtSwybb~aO6@R8 zK20^$HQauZPSS3P+o^Bx*TjT*kOnw86BzFovV{S;S?%1MJT{h6JGk$>xx*fxCsJ*9 zzvjkn!k0D#E_=^fr^p>(8g;H4h}$}i4mf4^`PPzj@vUg6#8?H^NAmSHb>{% zIgVc+0ly?fFegIBD!h#7G zu+~*PGP|H6uc7S0B8~I=wQH@Te?b-_CeXg$BM1p0X8C7^!I6C`b;vjzd<^8nsnZ#Q zFKJ6+m$X=K?cY~=%*a&ma4Oby+!;{%TW`-irbhDv3G#{4r_IKX-jK>s%%WZ1`swjz zDOmL0JwW$ihLuE^pt~33g!u9R{I@W^>4Q10XEox)Br^LhCyRqDAXNX>2 z`9NQJl#@3ce&(^Ym&Y{ZFL;p+>X2St`$kXi&Pcx5arMfT5AWYk)-@$bE%CkNxY+Za zSyWV1^5p>3d=Mz~vb1Td+AMEKGWzsphRo|v=ucuMpNWHU)Lzz;OF8T}^=>-V0SL64 zoSFd=Q?#S7PUO|Ayq^~fdv`OlW&pHv>9nBXyPpo}izj*J5HOzFvJKFJA&)9-;bozikghB;i+q z$nwOUqAUMs|sV^}5#hO+P3oP!swKmT%UBesSjAyPjTN(bjPzI+e=# zj~~;4ju`lJAjNO|I1pMn4AJRA>v6LqEEA7EKjRM#2`K@-oQ+7UfYPb~4kcU1!D2u| z8$82KO*Q}6?fsuJ{2&7V;H;gUoQzB*xca0(HZv+2E$r^@4k)gJ3_bX{fiGtse_2ZH zI~&3wx4tq?-+oYrFgbQiJ3`2xN6!*ATu||>ynMDWp#kX9t9nkJJGThPX=f(3e}9of zumb9(2VT4gG#jA{UmL-DFX>^hZEtUHU?U+y^e_S)j}ECu)`fGdUE6_Ontn?M?`KRW zvPLGqqdlw9{z|8KaOr)Un~{F5ifdaQMGCn3tHjw)KxA?AFVx+@1!-0SrA1OoifAc< zo$GhY706j|noMFrYhU+(Ug$%sO;DOWyzva8ym-|3(6RAOY08!1n z&hz~9%#hPzb3-Le`u6aNUu)mMBfn3Ymzw{=cq2%_1&+g!QGo?nHrd6+o<^pR-oAZn zXz+SV>}w&%w<8hZTM=uUe!9BGINUIZawrW-Gm1_lrT3jo?qKXOeONvrK+4oXH=*7ilW6Lfd3mD;hdQhc`6$TQQARM70J zmS_J4M&$j1cRnz)2--BT8Jd~J&lKm<8$u`}DnSnhKe$g&4Y--#@4GnhJU+K<3!q)1yWJmBz`*#yEj8&D@2BZ*OsRoH>q2mfk8q@Ct4m z{HOr=Gr#uX@~%3asM1N_Ia-W|0*>o6S%?U7F9wN3c4;B8^OPQ4Xg!t(5es!G@c@0&$wQRpU?s!62_U-PGd7uH22(2NCo zyJ~}Zy1F=61TTO!59_IV+lBJ->Rg`gHMW~j8?2DP|k7aGi_F|s@p4$+hxJPtpZjKJx@)nQ&OL|SP0yHZF%5`v< z39MfR29kijEkwZTSIy;(!0Z7N%)!8!UI2>S&ePuCQE6#uaXYUq0#STEG&fd-4{+d@ z4-I!W<8pi)aAqhx%i-XqUmcAv8XNa0eDpqW;3-hw1g`~K+)71x8spU-Kf#teZp&jq zFHmZ)iyY8me(qGKQ}YBRpOrwmxCHv@FLfpHwC(4Lzg-cC733!K^Yei-lFn?RUu9$( z!-1x4c5Y55^q1UhF_aPls%gDaiK{zeW8*AOcSmpiGI45Kd7OXyAL1y0s|2hr3>QO@azMX{Mmuo5>zrv8xHU1hz%l5fLp<{?t1IQ_RHem_h^EZ zIEx4lUfb@L>J{w(r|FAg2XY!iO0qWGNxGhK!wB31gePB5^;TLWDZ=6 zc`y%F9;Zj1ev;uVjwjgFgtd0wO#g4@0-FQBg}`{Xs#*`kMbf5exX!3Y(GzMWcKCd+ zIw?+=?M^B`B#L#~D-xrh=#?_vbLwBU31|RMFi7nYDhUCaN7!v;h*fpdxCR|z7o;>E*|h_|3WEvb>v7p;UKtEBm{~^gqg`dEh_`5 zIr{-0f(HHntFh z8l|G7!IYH4pp;bTbYz_~h)9WOEJw_Y4#}F+p}j#moh(^ul&Hz19K|szJ0X=wsbpu~ zXK3NQ-s`=t_mB6lpZ{Ff`1*W5%kz1j`?>FXroX&+b}VM@>X9$25f+<9+yVh08z(jV z;f1Z=9g^GNPrnV<(%ED+f5*)syw!%(3=nF%E5re@>2;bZ=y2|dZW8#N&W-My06T4$r#4$$ln><&=Q zZ#Z%dw1aSmLSB>|eZ;RZ--}M?@PS8;acXvolXxrKvO>p7K2E&o)cuBs_Ir|F&l^M! zkpS52AIo>39eUt@13JM|w%oCU01TnsB56Tn|I~q$L_IKf%OUdOFrh48N3K)Ftiug!? zN5`Jpu2@m}qqKo_rTbGNV4H((bz*p6V?ZZzAus>hH8fWxraw?{8BO1WoU<$TPU5Or z$?qJ3wgPy8+*$v0PCnl&DRwZc3(hGoa|gqx}^RMFaXjNomQr19> z{V_ahfmNXWvZ)_X0nDfzsP-XVjl6dQe+szBAc#F3O7+{0G}En1+Ep#ZsVxM^w8qU^ z{8ctz6+f+&rsrfxnzyP=Gd3V_GrL4YOztCdiU%P5As*E4MDZBWfByNr?6%Exvgi$@ zQ49D**_e5&5&hT9Y5>d0d*8l$0OGF2=oaRmXRgI$@KnSjwszZ*E2qRg-OT?$`Eu#}><5^T&bJVsqFwGuE%^!Tot z{$#z{Me*sSeh3$hFr_ZiJG3Ywrv#vpNeII955p5>mTg6F(HK5 z*`pa657q*x+V$Vc2WCFAHZcZf9^)ciSXk)7JrD-uqocZ&7}5$k;E7dXyu7?xTEbn{ z9hwrYgSF4#4V53MQ=O7siO5AmOQgUoX5LEHimynYl($eXrG zgpLpWou1wZ!#XfH(Rhe{j1827MxzA9p*M{}qw8We@u;sfRZ-kQDXEDpUQX+KJ_Mpt z3U2XF;n>`BK|w*RgucH0^c)ZRilv=&*ls2!CNO>KKC#kaPcOunO3s)|QsE)h_GS+j`K7 zy=!_UcJ9V^9y$3W>~^KdF=EW~MmssTZqJ~OAJ3|bGiHaxMz1CiHAUtiy-WPH*W9vM+LatN>$HdjT=eeNEy z1Gy(eTyWlSc5#6)4k`gV!NF%Zcx`qYquiYj7MPCE8Rlj0)oK-4jMlnY09}go~>rx0Vc0jEadp^J0L?`->b6q=5$HONcxdFJ6TABKo{Z zAR*FWkTs%E8O!1uC#Sy%ACO{sIR0~p%TY|yvN-3!Dy}e%p_zPwr zR@#nt7>NMLmzTec9pO~!VQ3mjOV}b|Caj|Nsyq*G?~k885hv%3##M~~;Fr9jVlaad z`K9kU^^Vsj4E<@14EFpw|0e04q@BM=djkbX_$Zmy)Uv*yfPCG>j52pi0sDan3Obsr ztMt3hd|;`;gh+DefM~)_4|=0J_HpXNb%C2wwCqu#VPVGtdNPBT^N&4t%e|a#7sGND9J5u}dc zSzT~J@@jLyV=adhQ<|@`XaV@p`-1;i$;P2RGCy9i76S009%BDOe3! z&)>>K>K;)71XmGWISi_C2y%;kN)phi_W>V4W1^wyAco< zduIf=eqXtpU&rE;)de{vV7;Jo*vqpaJ zn-IIxP?4FENmp}oCjrF6s7>q^xpmFZ`QhfPS_^(P)2`_c+=S<;c17HVUL9Q27&ny-ODV@PLR@MAIKF zY?{I`*etg$VV0D})nlEH7fMQ1v)M880)liL7=qlEQ&%@Bjc{+m&{wE5DTy(TZ&|p( zF5~u~?7^`L^1QtOdU2}19{7bF0v{^LUKCGCBh5m2Ls_U;pH6Z|$YxrQdl!2di*=vx zJ%)DpPO_QJ4$HUa6r1*}8JN@E$Z6 zef3VI6NF`$Z$7#35SOejxLzRPgM#_^i4$nB#$B=0YJDgqTlLvCmKGNAl8>Q1BIdMw zY~ZoaQxp!>x=YBDQp$HN1z=1;Sy^AoZQR}#-y zitZ$7#CGpC?tdH3|0`_#@Ykb1M@2lL0tn z?hDoqtP)w};Hm`lepFR;b6J^5NQe==e%sD!M=rJ{ zd{nk0$2hq0C*+)I%Bw^Wxo^Iqbm~vd<~Qwk1n)2+yT-5QgvkJK*;j_5+~E)q60&CX z>Z2gW@NschtV2_mmsMA9Yj5M^#a6I)(cPq+N65j>veYe+u{V{NI~LP1;=S@-UVjR> zXuUZrfAu*yu;FOYsLQSR_hYv)J7P+dtlpjP*X9_4T_E^gvW~1S2$6Z0#dnbf_|Y;# zC~1LdO=aFfb!J{e8qpy$`5Ne){N4ZpEh* zV#CM?SAoQ)I&sblxE0zeR3z6=)6*@b!4e!>tit^xX%Yp5kG=Q%@gp?UD&Jckp*C#O z0Sqa0sFP4f;5k&JZuVo!U^e{Q+`Plwd{KvkN{uOY&Za{e`hj?6TkIIV_@mIH|^=fT-acvTj%oDQPqeFZ^*^3S)rrkuC*d;zuBsTA98N--=1nc8 zR>20mLm%&&Mp6oXg$PsN7;rrHmfvcD88{}$-K06E!spfZ@ndCA1L{XE^$1i<&_;Z% zsSTD?XN7=cChJ*v^A>e#WmWi=Ry+mwZB}Qjy2-srL;%`M#jSAbzVGY#&A;?N$3uID z`vkB3|KT=XhrkU9=*Lv2(H~dVrRH5QNu;iZ-ltW=aUFvh+w||Q=ifYXi0+ zMf@rm?5?$7O!VUUb0t6z6`1}!MNPhHmT1{$3{^#$XN(xfHw)!sa3NOxIMzod%LRVX zDT`y;%zB5T;YBKTsu(U?Cj_2R^tkW76e{8Hgv+woS4#m+Li%( zYD=Op;L(_XxlZ!@4aN@LFSf;Qw*UTea?JEtRBf!&y=866goSS`vEAf}*Gci2qb9M) zyEEpJ2uU3KqFZQoh9vEwOp9-KS)L!PYDpl}tDz6=T%+8Vq-_}Q5;<&FOyI69-{~FU zCqMS!0*52tR;yv$ZF4fW-tk;iA9pl$!OyiFwlr#6y-t0EpuN0q)qh%-@TDp8;e z=6Y&7egp6`P$~V!x$RE$e-|~q!Zqyk@gtIP`ZW)7&lNhG7YL|jiKktQ)CdoTJ_I(~ z(6U&kzj|of{MbV+TQRQcyM8kdAEp{mD2k@TNx#VDoN?Sjtjis>-IT=&Rnxz%m_(tM zDyNsH{10~Aa~@S@0edytcEEC29`vTZa$YGKc)4{B=DFS$X&U4}C!CGA`M6i4X4D(|u>$7ARNl{5VD zs#ZznT4g)QFiov1BnLxHKMbpyG@)7O%*qv6gn>IiMn*;o;SZ`Yp>Q+s$2(pHG5#%%Ne3T}+(nKongRCziT zhZ#5znf^=+r(hx2J69*84NxNX9ba5JIFbl-5+9LiZq3Rp<`S~=r=;00R;Uss(xT6< zWd8V?2CQgjWKU{yh$`Q|aA8nn(hVP+{j(Vg@PG2xFZ`dc4mxs0y8m"PREDEFINED= \\ - \"BOOST_PREVENT_MACRO_SUBSTITUTION\" \\ - \"BOOST_STATIC_CONSTANT(T,V)=static x const y\" \\ - \"BOOST_UNITS_AUTO_STATIC_CONSTANT(a,b)=static const auto a = b\" \\ - \"BOOST_DEDUCED_TYPENAME=typename\" \\ - \"BOOST_CONSTEXPR=constexpr\" \\ - \"BOOST_CONTAINER_NOEXCEPT=noexcept\" \\ - \"BOOST_CONTAINER_NOEXCEPT_IF(T)=noexcept(T)\" \\ - \"BOOST_UNITS_TYPEOF(a)=typeof(a)\" \\ - \"BOOST_UNITS_HAS_TYPEOF=1\" \\ - \"BOOST_MPL_ASSERT(expr)=\" \\ - \"BOOST_ASSERT(expr)=\" \\ - \"BOOST_RV_REF(T)=T &&\" \\ - \"ASSERT(x)=assert(x)\" \\ - \"__cplusplus \"" - # BOOST_PREVENT_MACRO_SUBSTITUTION, will not be replaced by , - # BOOST_STATIC_CONSTANT will be replaced by "static x const y", - # BOOST_DEDUCED_TYPENAME will be replaced by "typename", - # BOOST_CONSTEXPR will be replaced by "constexpr". - EXCLUDE_SYMBOLS=*_throws - # IMAGE_PATH="../images" # for circular_buffer.png - # See autodoxywarnings.log to check this is correct. - - # The syntax hoops to jump through are 'interesting' for more than one PREDEFINED, - # and to permit spaces within definitions (use double quotes). - # Don't forget that every double quote " needs a preceeding \trip character! - # and that each trailing continuation \ needs a preceeding \trip character too! - # And finally that if more than one item is included (as here) the whole is - # enclosed in "PREDEFINED=... ", but without a leading \. Go figure... - - # A grep for PREDEFINED= in jamfiles will reveal even more complex examples. - # Boost Libraries with useful examples are: Accumulators, Interprocess, MPI, Random, Units, Expressive. - - # Optionally, you can provide a Reference section name specific for your library, for example: - "boost.doxygen.reftitle=Boost.Circular_buffer C++ Reference" - ; - -xml circular_buffer : circular_buffer.qbk ; - -using boostbook ; - -boostbook standalone - : - circular_buffer - : - - # General settings - # ================= - html:boost.root=../../../.. - html:img.src.path=../../../../doc/html/ - docbook:boost.root=boost: - - # Options for html and pdf - # ======================== - # No indent on body text: - body.start.indent=0pt - # Margin size: - page.margin.inner=0.5in - # Margin size: - page.margin.outer=0.5in - # Yes, we want graphics for admonishments: - admon.graphics=1 - - # HTML options: - # ============= - # Use graphics icons not text for navigation: - navig.graphics=1 - # How far down we chunk nested sections, basically all of them: - chunk.section.depth=2 - # Don't put the first section on the same page as the TOC itself: - chunk.first.sections=1 - # How far down sections get TOC's - toc.section.depth=4 - # Max depth in each TOC: - toc.max.depth=2 - # How far down we go with TOC's - generate.section.toc.level=10 - # Horizontal ? spacing in table cells. - html:html.cellspacing=3 # pixels - # Vertical spacing in table cells. - html:html.cellpadding=5 # pixels - # Not sure if these are right way round? - - on # Turns on index (or off). - # Turns on (or off) index-verbose for diagnostic info (using /bin auto-index-verbose folders). - on - - pdf:off # on (or off) to use internally generated indexes. - - html:index.on.type=1 # = 1 For the native stylesheets to generate multiple different indexes. - - circular_buffer.idx # Specifies the name of the script to load for circular_buffer. - ../../.. # Will get you back up to /circular_buffer, so !scan-path "boost/circular_buffer/" is where *.hpp will be, - # and /libs/circular_buffer for other files. - # Without this would need !scan-path "../../../boost/circular_buffer" - - # Used by Quickbook to invoke indexing. - # Required by boost-trunk/doc/ see jamfile.v2 to use auto-index. - # Choose indexing method for html: - html:on - docbook:on - - # PDF Options: - # ============ - # TOC Generation: this is needed for FOP-0.9 and later: - pdf:fop1.extensions=0 - # Or enable this if you're using XEP: - pdf:xep.extensions=1 - # TOC generation: this is needed for FOP 0.2, but must not be set to zero for FOP-0.9! - pdf:fop.extensions=0 - # No indent on body text: - body.start.indent=0pt - # Margin size: - page.margin.inner=0.5in - # Margin size: - page.margin.outer=0.5in - - # Yes, we want graphics for admonishments: - admon.graphics=1 - - # Set these one for PDF generation *only*: - # default png graphics are awful in PDF form, - # better use SVG instead: - pdf:admon.graphics.extension=".svg" - #pdf:admon.graphics.extension=".png" # Only png images are available. - # Don't need this, default path works OK: - #pdf:admon.graphics.path=$(nav_images)/ # next, prev, note, tip ... for pdf. - pdf:use.role.for.mediaobject=1 - pdf:preferred.mediaobject.role=print - pdf:img.src.path=$(pdf_images_location)/ # graphics (diagrams) for pdf. - pdf:draft.mode="no" - pdf:boost.url.prefix=../../../.. - - autodoc # - png_install - ; - -# Install (copy) the 'master' copies of all icon images (both PNG and SVG) -# and the Boost logo from your current Boost-root -# to the local /doc/html/images folder so that html is complete and standalone. -install png_install : [ glob $(here)/*.png ] : $(here)/../../../doc/html/images ; - -# install pdf-install : standalone : PDF . ; -# Effectively copies the file from \bin folder to the \doc folder, -# but will not work as expected if doxygen and/or autoindex is used -# because a modified pdf file is created, so this command -# will rename the file to the expected filename, here circular_buffer.pdf. - -install pdfinstall : standalone : PDF . circular_buffer.pdf ; - -############################################################################### -alias boostdoc - : standalone/docbook - : - : - : ; -explicit boostdoc ; -alias boostrelease ; -explicit boostrelease ; diff --git a/libs/circular_buffer/example/bounded_buffer_comparison.cpp b/libs/circular_buffer/example/bounded_buffer_comparison.cpp deleted file mode 100644 index 4205c3a46..000000000 --- a/libs/circular_buffer/example/bounded_buffer_comparison.cpp +++ /dev/null @@ -1,316 +0,0 @@ -// Comparison of bounded buffers based on different containers. - -// Copyright (c) 2003-2008 Jan Gaspar -// Copyright 2013 Paul A. Bristow. Added some Quickbook snippet markers. - -// 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) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const unsigned long QUEUE_SIZE = 1000L; -const unsigned long TOTAL_ELEMENTS = QUEUE_SIZE * 1000L; - -template -class bounded_buffer { -public: - - typedef boost::circular_buffer container_type; - typedef typename container_type::size_type size_type; - typedef typename container_type::value_type value_type; - typedef typename boost::call_traits::param_type param_type; - - explicit bounded_buffer(size_type capacity) : m_unread(0), m_container(capacity) {} - - void push_front(param_type item) { - boost::mutex::scoped_lock lock(m_mutex); - m_not_full.wait(lock, boost::bind(&bounded_buffer::is_not_full, this)); - m_container.push_front(item); - ++m_unread; - lock.unlock(); - m_not_empty.notify_one(); - } - - void pop_back(value_type* pItem) { - boost::mutex::scoped_lock lock(m_mutex); - m_not_empty.wait(lock, boost::bind(&bounded_buffer::is_not_empty, this)); - *pItem = m_container[--m_unread]; - lock.unlock(); - m_not_full.notify_one(); - } - -private: - bounded_buffer(const bounded_buffer&); // Disabled copy constructor - bounded_buffer& operator = (const bounded_buffer&); // Disabled assign operator - - bool is_not_empty() const { return m_unread > 0; } - bool is_not_full() const { return m_unread < m_container.capacity(); } - - size_type m_unread; - container_type m_container; - boost::mutex m_mutex; - boost::condition m_not_empty; - boost::condition m_not_full; -}; - -template -class bounded_buffer_space_optimized { -public: - - typedef boost::circular_buffer_space_optimized container_type; - typedef typename container_type::size_type size_type; - typedef typename container_type::value_type value_type; - typedef typename boost::call_traits::param_type param_type; - - explicit bounded_buffer_space_optimized(size_type capacity) : m_container(capacity) {} - - void push_front(param_type item) { - boost::mutex::scoped_lock lock(m_mutex); - m_not_full.wait(lock, boost::bind(&bounded_buffer_space_optimized::is_not_full, this)); - m_container.push_front(item); - lock.unlock(); - m_not_empty.notify_one(); - } - - void pop_back(value_type* pItem) { - boost::mutex::scoped_lock lock(m_mutex); - m_not_empty.wait(lock, boost::bind(&bounded_buffer_space_optimized::is_not_empty, this)); - *pItem = m_container.back(); - m_container.pop_back(); - lock.unlock(); - m_not_full.notify_one(); - } - -private: - - bounded_buffer_space_optimized(const bounded_buffer_space_optimized&); // Disabled copy constructor - bounded_buffer_space_optimized& operator = (const bounded_buffer_space_optimized&); // Disabled assign operator - - bool is_not_empty() const { return m_container.size() > 0; } - bool is_not_full() const { return m_container.size() < m_container.capacity(); } - - container_type m_container; - boost::mutex m_mutex; - boost::condition m_not_empty; - boost::condition m_not_full; -}; - -template -class bounded_buffer_deque_based { -public: - - typedef std::deque container_type; - typedef typename container_type::size_type size_type; - typedef typename container_type::value_type value_type; - typedef typename boost::call_traits::param_type param_type; - - explicit bounded_buffer_deque_based(size_type capacity) : m_capacity(capacity) {} - - void push_front(param_type item) { - boost::mutex::scoped_lock lock(m_mutex); - m_not_full.wait(lock, boost::bind(&bounded_buffer_deque_based::is_not_full, this)); - m_container.push_front(item); - lock.unlock(); - m_not_empty.notify_one(); - } - - void pop_back(value_type* pItem) { - boost::mutex::scoped_lock lock(m_mutex); - m_not_empty.wait(lock, boost::bind(&bounded_buffer_deque_based::is_not_empty, this)); - *pItem = m_container.back(); - m_container.pop_back(); - lock.unlock(); - m_not_full.notify_one(); - } - -private: - - bounded_buffer_deque_based(const bounded_buffer_deque_based&); // Disabled copy constructor - bounded_buffer_deque_based& operator = (const bounded_buffer_deque_based&); // Disabled assign operator - - bool is_not_empty() const { return m_container.size() > 0; } - bool is_not_full() const { return m_container.size() < m_capacity; } - - const size_type m_capacity; - container_type m_container; - boost::mutex m_mutex; - boost::condition m_not_empty; - boost::condition m_not_full; -}; - -template -class bounded_buffer_list_based { -public: - - typedef std::list container_type; - typedef typename container_type::size_type size_type; - typedef typename container_type::value_type value_type; - typedef typename boost::call_traits::param_type param_type; - - explicit bounded_buffer_list_based(size_type capacity) : m_capacity(capacity) {} - - void push_front(param_type item) { - boost::mutex::scoped_lock lock(m_mutex); - m_not_full.wait(lock, boost::bind(&bounded_buffer_list_based::is_not_full, this)); - m_container.push_front(item); - lock.unlock(); - m_not_empty.notify_one(); - } - - void pop_back(value_type* pItem) { - boost::mutex::scoped_lock lock(m_mutex); - m_not_empty.wait(lock, boost::bind(&bounded_buffer_list_based::is_not_empty, this)); - *pItem = m_container.back(); - m_container.pop_back(); - lock.unlock(); - m_not_full.notify_one(); - } - -private: - - bounded_buffer_list_based(const bounded_buffer_list_based&); // Disabled copy constructor - bounded_buffer_list_based& operator = (const bounded_buffer_list_based&); // Disabled assign operator - - bool is_not_empty() const { return m_container.size() > 0; } - bool is_not_full() const { return m_container.size() < m_capacity; } - - const size_type m_capacity; - container_type m_container; - boost::mutex m_mutex; - boost::condition m_not_empty; - boost::condition m_not_full; -}; - -template -class Consumer { - - typedef typename Buffer::value_type value_type; - Buffer* m_container; - value_type m_item; - -public: - Consumer(Buffer* buffer) : m_container(buffer) {} - - void operator()() { - for (unsigned long i = 0L; i < TOTAL_ELEMENTS; ++i) { - m_container->pop_back(&m_item); - } - } -}; - -template -class Producer { - - typedef typename Buffer::value_type value_type; - Buffer* m_container; - -public: - Producer(Buffer* buffer) : m_container(buffer) {} - - void operator()() { - for (unsigned long i = 0L; i < TOTAL_ELEMENTS; ++i) { - m_container->push_front(value_type()); - } - } -}; - -template -void fifo_test(Buffer* buffer) { - - // Start of measurement - boost::progress_timer progress; - - // Initialize the buffer with some values before launching producer and consumer threads. - for (unsigned long i = QUEUE_SIZE / 2L; i > 0; --i) { -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x581)) - buffer->push_front(Buffer::value_type()); -#else - buffer->push_front(BOOST_DEDUCED_TYPENAME Buffer::value_type()); -#endif - } - - Consumer consumer(buffer); - Producer producer(buffer); - - // Start the threads. - boost::thread consume(consumer); - boost::thread produce(producer); - - // Wait for completion. - consume.join(); - produce.join(); - - // End of measurement -} - -int main(int /*argc*/, char* /*argv*/[]) { - - bounded_buffer bb_int(QUEUE_SIZE); - std::cout << "bounded_buffer "; - fifo_test(&bb_int); - - bounded_buffer_space_optimized bb_space_optimized_int(QUEUE_SIZE); - std::cout << "bounded_buffer_space_optimized "; - fifo_test(&bb_space_optimized_int); - - bounded_buffer_deque_based bb_deque_based_int(QUEUE_SIZE); - std::cout << "bounded_buffer_deque_based "; - fifo_test(&bb_deque_based_int); - - bounded_buffer_list_based bb_list_based_int(QUEUE_SIZE); - std::cout << "bounded_buffer_list_based "; - fifo_test(&bb_list_based_int); - - bounded_buffer bb_string(QUEUE_SIZE); - std::cout << "bounded_buffer "; - fifo_test(&bb_string); - - bounded_buffer_space_optimized bb_space_optimized_string(QUEUE_SIZE); - std::cout << "bounded_buffer_space_optimized "; - fifo_test(&bb_space_optimized_string); - - bounded_buffer_deque_based bb_deque_based_string(QUEUE_SIZE); - std::cout << "bounded_buffer_deque_based "; - fifo_test(&bb_deque_based_string); - - bounded_buffer_list_based bb_list_based_string(QUEUE_SIZE); - std::cout << "bounded_buffer_list_based "; - fifo_test(&bb_list_based_string); - - return 0; -} -/* - -//[bounded_buffer_comparison_output - - Description: Autorun "J:\Cpp\Misc\Debug\bounded_buffer_comparison.exe" - bounded_buffer 5.15 s - - bounded_buffer_space_optimized 5.71 s - - bounded_buffer_deque_based 15.57 s - - bounded_buffer_list_based 17.33 s - - bounded_buffer 24.49 s - - bounded_buffer_space_optimized 28.33 s - - bounded_buffer_deque_based 29.45 s - - bounded_buffer_list_based 31.29 s - - //] //[bounded_buffer_comparison_output] - -*/ diff --git a/libs/circular_buffer/example/circular_buffer_bound_example.cpp b/libs/circular_buffer/example/circular_buffer_bound_example.cpp deleted file mode 100644 index f55daa3da..000000000 --- a/libs/circular_buffer/example/circular_buffer_bound_example.cpp +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright 2003-2008 Jan Gaspar. -// Copyright 2013 Paul A. Bristow. Added some Quickbook snippet markers. - -// Distributed under the Boost Software License, Version 1.0. -// (See the accompanying file LICENSE_1_0.txt -// or a copy at .) - -//[circular_buffer_bound_example_1 -/*` -This example shows how the `circular_buffer` can be utilized -as an underlying container of the bounded buffer. -*/ - -#include -#include -#include -#include -#include -#include - -#include // for auto_cpu_timer - -template -class bounded_buffer -{ -public: - - typedef boost::circular_buffer container_type; - typedef typename container_type::size_type size_type; - typedef typename container_type::value_type value_type; - typedef typename boost::call_traits::param_type param_type; - - explicit bounded_buffer(size_type capacity) : m_unread(0), m_container(capacity) {} - - void push_front(typename boost::call_traits::param_type item) - { // `param_type` represents the "best" way to pass a parameter of type `value_type` to a method. - - boost::mutex::scoped_lock lock(m_mutex); - m_not_full.wait(lock, boost::bind(&bounded_buffer::is_not_full, this)); - m_container.push_front(item); - ++m_unread; - lock.unlock(); - m_not_empty.notify_one(); - } - - void pop_back(value_type* pItem) { - boost::mutex::scoped_lock lock(m_mutex); - m_not_empty.wait(lock, boost::bind(&bounded_buffer::is_not_empty, this)); - *pItem = m_container[--m_unread]; - lock.unlock(); - m_not_full.notify_one(); - } - -private: - bounded_buffer(const bounded_buffer&); // Disabled copy constructor. - bounded_buffer& operator = (const bounded_buffer&); // Disabled assign operator. - - bool is_not_empty() const { return m_unread > 0; } - bool is_not_full() const { return m_unread < m_container.capacity(); } - - size_type m_unread; - container_type m_container; - boost::mutex m_mutex; - boost::condition m_not_empty; - boost::condition m_not_full; -}; // - -//] [/circular_buffer_bound_example_1] - -const unsigned long queue_size = 1000L; -const unsigned long total_elements = queue_size * 1000L; - -//[circular_buffer_bound_example_2] -/*`To demonstrate, create two classes to exercise the buffer. - -The producer class fills the buffer with elements. - -The consumer class consumes the buffer contents. - -*/ - -template -class Producer -{ - - typedef typename Buffer::value_type value_type; - Buffer* m_container; - -public: - Producer(Buffer* buffer) : m_container(buffer) - {} - - void operator()() - { - for (unsigned long i = 0L; i < total_elements; ++i) - { - m_container->push_front(value_type()); - } - } -}; - -template -class Consumer -{ - - typedef typename Buffer::value_type value_type; - Buffer* m_container; - value_type m_item; - -public: - Consumer(Buffer* buffer) : m_container(buffer) - {} - - void operator()() - { - for (unsigned long i = 0L; i < total_elements; ++i) - { - m_container->pop_back(&m_item); - } - } -}; - -/*`Create a first-int first-out test of the bound_buffer. -Include a call to boost::progress_timer - -[@http://www.boost.org/doc/libs/1_53_0/libs/timer/doc/cpu_timers.html CPU timer] - -*/ -template -void fifo_test(Buffer* buffer) -{ - // Start of timing. - boost::timer::auto_cpu_timer progress; - - // Initialize the buffer with some values before launching producer and consumer threads. - for (unsigned long i = queue_size / 2L; i > 0; --i) - { -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x581)) - buffer->push_front(Buffer::value_type()); -#else - buffer->push_front(BOOST_DEDUCED_TYPENAME Buffer::value_type()); -#endif - } - - // Construct the threads. - Consumer consumer(buffer); - Producer producer(buffer); - - // Start the threads. - boost::thread consume(consumer); - boost::thread produce(producer); - - // Wait for completion. - consume.join(); - produce.join(); - - // End of timing. - // destructor of boost::timer::auto_cpu_timer will output the time to std::cout. - -} -//] [/circular_buffer_bound_example_2] - - -int main() -{ -//[circular_buffer_bound_example_3] - //`Construct a bounded_buffer to hold the chosen type, here int. - bounded_buffer bb_int(queue_size); - std::cout << "Testing bounded_buffer "; - - //`Start the fifo test. - fifo_test(&bb_int); - //` destructor of boost::timer::auto_cpu_timer will output the time to std::cout - -//] [/circular_buffer_bound_example_3] - -return 0; -} // int main() - -/* - -//[circular_buffer_bound_output - - Description: Autorun "J:\Cpp\Misc\Debug\circular_buffer_bound_example.exe" - - Testing bounded_buffer 15.010692s wall, 9.188459s user + 7.207246s system = 16.395705s CPU (109.2%) - -//] [/circular_buffer_bound_output] -*/ - - diff --git a/libs/circular_buffer/example/circular_buffer_example.cpp b/libs/circular_buffer/example/circular_buffer_example.cpp deleted file mode 100644 index 2520fdbb7..000000000 --- a/libs/circular_buffer/example/circular_buffer_example.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2003-2008 Jan Gaspar. -// Copyright 2013 Paul A. Bristow. Added some Quickbook snippet markers. - -// Distributed under the Boost Software License, Version 1.0. -// (See the accompanying file LICENSE_1_0.txt -// or a copy at .) - -//[circular_buffer_example_1 -/*`For all examples, we need this include: -*/ - -#include - -//] [/circular_buffer_example_1] - - int main() - { - -//[circular_buffer_example_2 - // Create a circular buffer with a capacity for 3 integers. - boost::circular_buffer cb(3); - - // Insert threee elements into the buffer. - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - - int a = cb[0]; // a == 1 - int b = cb[1]; // b == 2 - int c = cb[2]; // c == 3 - - // The buffer is full now, so pushing subsequent - // elements will overwrite the front-most elements. - - cb.push_back(4); // Overwrite 1 with 4. - cb.push_back(5); // Overwrite 2 with 5. - - // The buffer now contains 3, 4 and 5. - a = cb[0]; // a == 3 - b = cb[1]; // b == 4 - c = cb[2]; // c == 5 - - // Elements can be popped from either the front or the back. - cb.pop_back(); // 5 is removed. - cb.pop_front(); // 3 is removed. - - // Leaving only one element with value = 4. - int d = cb[0]; // d == 4 - -//] [/circular_buffer_example_2] - return 0; - } - - /* - - //[circular_buffer_example_output - -There is no output from this example. - -//] [/circular_buffer_example_output] - - */ - diff --git a/libs/circular_buffer/example/circular_buffer_examples.bat b/libs/circular_buffer/example/circular_buffer_examples.bat deleted file mode 100644 index 1d005d939..000000000 --- a/libs/circular_buffer/example/circular_buffer_examples.bat +++ /dev/null @@ -1,14 +0,0 @@ -echo off -rem quickbook doxgen auto-index docs template circular_buffer_html_index.bat -rem echo circular_buffer_html_index_%date%_%time:~0,2%_%time:~3,2%.log -rem The DOS time format is assumed 12:34 and the : separator is not used. -set t=%time% /T -set tim=%t:~0,2%%t:~3,2% -rem pick just hours and minutes. -rem time may include leading space, like " 915", so remove space. -set tim=%tim: =% -rem boost-no-inspect -rem cd \boost-trunk/circular_buffer\libs\circular_buffer\example -bjam -a > circular_buffer_examples_%date%_%tim%.log -if not ERRORLEVEL 0 (echo Errorlevel is %ERRORLEVEL%) else (echo OK) -pause diff --git a/libs/circular_buffer/example/circular_buffer_iter_example.cpp b/libs/circular_buffer/example/circular_buffer_iter_example.cpp deleted file mode 100644 index 339d284fe..000000000 --- a/libs/circular_buffer/example/circular_buffer_iter_example.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2003-2008 Jan Gaspar. -// Copyright 2013 Paul A. Bristow. Added some Quickbook snippet markers. - -// Distributed under the Boost Software License, Version 1.0. -// (See the accompanying file LICENSE_1_0.txt -// or a copy at .) - -#undef BOOST_CB_ENABLE_DEBUG - -//[circular_buffer_iter_example_1 -/*` -*/ - -#define BOOST_CB_ENABLE_DEBUG 0 // The Debug Support has to be disabled, otherwise the code produces a runtime error. - -#include -#include -#include - -int main(int /*argc*/, char* /*argv*/[]) -{ - - boost::circular_buffer cb(3); - - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - - boost::circular_buffer::iterator it = cb.begin(); - - assert(*it == 1); - - cb.push_back(4); - - assert(*it == 4); // The iterator still points to the initialized memory. - - return 0; -} - -//] [/circular_buffer_iter_example_1] diff --git a/libs/circular_buffer/example/circular_buffer_sum_example.cpp b/libs/circular_buffer/example/circular_buffer_sum_example.cpp deleted file mode 100644 index 16f00174f..000000000 --- a/libs/circular_buffer/example/circular_buffer_sum_example.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2003-2008 Jan Gaspar. -// Copyright 2013 Paul A. Bristow. Added some Quickbook snippet markers. - -// Distributed under the Boost Software License, Version 1.0. -// (See the accompanying file LICENSE_1_0.txt -// or a copy at .) - -//[circular_buffer_sum_example_1 - -/*`This example shows several functions, including summing all valid values. -*/ - - #include - #include - #include - - int main(int /*argc*/, char* /*argv*/[]) - { - // Create a circular buffer of capacity 3. - boost::circular_buffer cb(3); - assert(cb.capacity() == 3); - // Check is empty. - assert(cb.size() == 0); - assert(cb.empty()); - - // Insert some elements into the circular buffer. - cb.push_back(1); - cb.push_back(2); - - // Assertions to check push_backs have expected effect. - assert(cb[0] == 1); - assert(cb[1] == 2); - assert(!cb.full()); - assert(cb.size() == 2); - assert(cb.capacity() == 3); - - // Insert some other elements. - cb.push_back(3); - cb.push_back(4); - - // Evaluate the sum of all elements. - int sum = std::accumulate(cb.begin(), cb.end(), 0); - - // Assertions to check state. - assert(sum == 9); - assert(cb[0] == 2); - assert(cb[1] == 3); - assert(cb[2] == 4); - assert(*cb.begin() == 2); - assert(cb.front() == 2); - assert(cb.back() == 4); - assert(cb.full()); - assert(cb.size() == 3); - assert(cb.capacity() == 3); - - return 0; - } - - //] [/circular_buffer_sum_example_1] - - - /* - There is no output from this example. - */ diff --git a/libs/circular_buffer/example/jamfile.v2 b/libs/circular_buffer/example/jamfile.v2 deleted file mode 100644 index 36db161bf..000000000 --- a/libs/circular_buffer/example/jamfile.v2 +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright Paul A. Bristow 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) - -# jamfile.v2 to run all circular_buffer examples. - -# bring in the rules for testing. -import testing ; - -project - : requirements - /boost/system//boost_system - /boost/thread//boost_thread - #BOOST_ALL_NO_LIB=1 - multi - - gcc:-Wno-missing-braces - darwin:-Wno-missing-braces - acc:+W2068,2461,2236,4070 - intel:-Qwd264,239 - msvc:all - msvc:on - msvc:_CRT_SECURE_NO_DEPRECATE - msvc:_SCL_SECURE_NO_DEPRECATE - msvc:_SCL_SECURE_NO_WARNINGS - msvc:_CRT_SECURE_NO_WARNINGS - msvc:/wd4996 - msvc:/wd4512 - msvc:/wd4610 - msvc:/wd4510 - msvc:/wd4127 - msvc:/wd4701 - msvc:/wd4127 - msvc:/wd4305 - ; - -run bounded_buffer_comparison.cpp ; -run circular_buffer_iter_example.cpp ; -run circular_buffer_sum_example.cpp ; -run circular_buffer_bound_example.cpp ../../thread/build//boost_thread ../../timer/build//boost_timer ; - diff --git a/libs/circular_buffer/index.html b/libs/circular_buffer/index.html deleted file mode 100644 index 59018614f..000000000 --- a/libs/circular_buffer/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - Redirection - - - - Automatic redirection failed, please go to - ../../doc/html/circular_buffer.html. -

- Copyright © 2003-2008 Jan Gaspar, 2013 Paul A. Bristow -

-

- 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/libs/circular_buffer/meta/libraries.json b/libs/circular_buffer/meta/libraries.json deleted file mode 100644 index b9f78c391..000000000 --- a/libs/circular_buffer/meta/libraries.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "key": "circular_buffer", - "name": "Circular Buffer", - "authors": [ - "Jan Gaspar" - ], - "description": "A STL compliant container also known as ring or cyclic buffer.", - "category": [ - "Containers" - ], - "maintainers": [ - "Jan Gaspar " - ] -} diff --git a/libs/circular_buffer/test/Jamfile.v2 b/libs/circular_buffer/test/Jamfile.v2 deleted file mode 100644 index 7e1ae584e..000000000 --- a/libs/circular_buffer/test/Jamfile.v2 +++ /dev/null @@ -1,32 +0,0 @@ -# Boost circular_buffer test Jamfile. -# -# Copyright (c) 2003-2008 Jan Gaspar -# -# Distributed under the Boost Software License, Version 1.0. (See -# accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - -# Added warning suppression Paul A. Bristow 25 Nov 2008 - -# Bring in rules for testing. -import testing ; - -project - : requirements - msvc:all - msvc:on - msvc:_SCL_SECURE_NO_WARNINGS - msvc:/wd4996 # 'function': was declared deprecated - msvc:/wd4244 # conversion from 'int' to 'unsigned short', possible loss of data - # in date-time - ; - -test-suite "circular_buffer" - : [ run base_test.cpp : : : single : ] - [ run space_optimized_test.cpp : : : single : ] - [ run base_test.cpp : : : single "BOOST_CB_ENABLE_DEBUG=1" : base_test_dbg ] - [ run space_optimized_test.cpp : : : single "BOOST_CB_ENABLE_DEBUG=1" : space_optimized_test_dbg ] - [ run soft_iterator_invalidation.cpp : : : single : ] - [ run constant_erase_test.cpp : : : single : ] - [ compile bounded_buffer_comparison.cpp : multi : ] - ; diff --git a/libs/circular_buffer/test/base_test.cpp b/libs/circular_buffer/test/base_test.cpp deleted file mode 100644 index 0a318ed66..000000000 --- a/libs/circular_buffer/test/base_test.cpp +++ /dev/null @@ -1,865 +0,0 @@ -// Test of the base circular buffer container. - -// Copyright (c) 2003-2008 Jan Gaspar -// Copyright (c) 2013 Antony Polukhin - -// 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) - -#include "test.hpp" - -#define CB_CONTAINER circular_buffer - -#include "common.ipp" - -void iterator_constructor_and_assign_test() { - - circular_buffer cb(4, 3); - circular_buffer::iterator it = cb.begin(); - circular_buffer::iterator itCopy; - itCopy = it; - it = it; - circular_buffer::const_iterator cit; - cit = it; - circular_buffer::const_iterator end1 = cb.end(); - circular_buffer::const_iterator end2 = end1; - - BOOST_CHECK(itCopy == it); - BOOST_CHECK(cit == it); - BOOST_CHECK(end1 == end2); - BOOST_CHECK(it != end1); - BOOST_CHECK(cit != end2); -} - -void iterator_reference_test() { - - circular_buffer cb(3, Dummy()); - circular_buffer::iterator it = cb.begin(); - circular_buffer::const_iterator cit = cb.begin() + 1; - - BOOST_CHECK((*it).m_n == Dummy::eVar); - BOOST_CHECK((*it).fnc() == Dummy::eFnc); - BOOST_CHECK((*cit).const_fnc() == Dummy::eConst); - BOOST_CHECK((*it).virtual_fnc() == Dummy::eVirtual); - BOOST_CHECK(it->m_n == Dummy::eVar); - BOOST_CHECK(it->fnc() == Dummy::eFnc); - BOOST_CHECK(cit->const_fnc() == Dummy::eConst); - BOOST_CHECK(it->virtual_fnc() == Dummy::eVirtual); -} - -void iterator_difference_test() { - - circular_buffer cb(5, 1); - cb.push_back(2); - circular_buffer::iterator it1 = cb.begin() + 2; - circular_buffer::iterator it2 = cb.begin() + 3; - circular_buffer::const_iterator begin = cb.begin(); - circular_buffer::iterator end = cb.end(); - - BOOST_CHECK(begin - begin == 0); - BOOST_CHECK(end - cb.begin() == 5); - BOOST_CHECK(end - end == 0); - BOOST_CHECK(begin - cb.end() == -5); - BOOST_CHECK(it1 - cb.begin() == 2); - BOOST_CHECK(it1 - begin == 2); - BOOST_CHECK(end - it1 == 3); - BOOST_CHECK(it2 - it1 == 1); - BOOST_CHECK(it1 - it2 == -1); - BOOST_CHECK(it2 - it2 == 0); -} - -void iterator_increment_test() { - - circular_buffer cb(10, 1); - cb.push_back(2); - circular_buffer::iterator it1 = cb.begin(); - circular_buffer::iterator it2 = cb.begin() + 5; - circular_buffer::iterator it3 = cb.begin() + 9; - it1++; - it2++; - ++it3; - - BOOST_CHECK(it1 == cb.begin() + 1); - BOOST_CHECK(it2 == cb.begin() + 6); - BOOST_CHECK(it3 == cb.end()); -} - -void iterator_decrement_test() { - - circular_buffer cb(10, 1); - cb.push_back(2); - circular_buffer::iterator it1= cb.end(); - circular_buffer::iterator it2= cb.end() - 5; - circular_buffer::iterator it3= cb.end() - 9; - --it1; - it2--; - --it3; - - BOOST_CHECK(it1 == cb.end() - 1); - BOOST_CHECK(it2 == cb.end() - 6); - BOOST_CHECK(it3 == cb.begin()); -} - -void iterator_addition_test() { - - circular_buffer cb(10, 1); - cb.push_back(2); - cb.push_back(2); - circular_buffer::iterator it1 = cb.begin() + 2; - circular_buffer::iterator it2 = cb.end(); - circular_buffer::iterator it3 = cb.begin() + 5; - circular_buffer::iterator it4 = cb.begin() + 9; - it1 += 3; - it2 += 0; - it3 += 5; - it4 += -2; - - BOOST_CHECK(it1 == 5 + cb.begin()); - BOOST_CHECK(it2 == cb.end()); - BOOST_CHECK(it3 == cb.end()); - BOOST_CHECK(it4 + 3 == cb.end()); - BOOST_CHECK((-3) + it4 == cb.begin() + 4); - BOOST_CHECK(cb.begin() + 0 == cb.begin()); -} - -void iterator_subtraction_test() { - - circular_buffer cb(10, 1); - cb.push_back(2); - cb.push_back(2); - cb.push_back(2); - circular_buffer::iterator it1 = cb.begin(); - circular_buffer::iterator it2 = cb.end(); - circular_buffer::iterator it3 = cb.end() - 5; - circular_buffer::iterator it4 = cb.begin() + 7; - it1 -= -2; - it2 -= 0; - it3 -= 5; - - BOOST_CHECK(it1 == cb.begin() + 2); - BOOST_CHECK(it2 == cb.end()); - BOOST_CHECK(it3 == cb.begin()); - BOOST_CHECK(it4 - 7 == cb.begin()); - BOOST_CHECK(it4 - (-3) == cb.end()); - BOOST_CHECK(cb.begin() - 0 == cb.begin()); -} - -void iterator_element_access_test() { - - circular_buffer cb(10); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - cb.push_back(4); - cb.push_back(5); - cb.push_back(6); - circular_buffer::iterator it = cb.begin() + 1; - - BOOST_CHECK(it[0] == 2); - BOOST_CHECK(it[-1] == 1); - BOOST_CHECK(it[2] == 4); -} - -void iterator_comparison_test() { - - circular_buffer cb(5, 1); - cb.push_back(2); - circular_buffer::iterator it = cb.begin() + 2; - circular_buffer::const_iterator begin = cb.begin(); - circular_buffer::iterator end = cb.end(); - - BOOST_CHECK(begin == begin); - BOOST_CHECK(end > cb.begin()); - BOOST_CHECK(begin < end); - BOOST_CHECK(end > begin); - BOOST_CHECK(end == end); - BOOST_CHECK(begin < cb.end()); - BOOST_CHECK(!(begin + 1 > cb.end())); - BOOST_CHECK(it > cb.begin()); - BOOST_CHECK(end > it); - BOOST_CHECK(begin >= begin); - BOOST_CHECK(end >= cb.begin()); - BOOST_CHECK(end <= end); - BOOST_CHECK(begin <= cb.end()); - BOOST_CHECK(it >= cb.begin()); - BOOST_CHECK(end >= it); - BOOST_CHECK(!(begin + 4 < begin + 4)); - BOOST_CHECK(begin + 4 < begin + 5); - BOOST_CHECK(!(begin + 5 < begin + 4)); - BOOST_CHECK(it < end - 1); - BOOST_CHECK(!(end - 1 < it)); -} - -void iterator_invalidation_test() { - -#if BOOST_CB_ENABLE_DEBUG - - circular_buffer::iterator it1; - circular_buffer::const_iterator it2; - circular_buffer::iterator it3; - circular_buffer::const_iterator it4; - circular_buffer::const_iterator it5; - circular_buffer::const_iterator it6; - - BOOST_CHECK(it1.is_valid(0)); - BOOST_CHECK(it2.is_valid(0)); - BOOST_CHECK(it3.is_valid(0)); - BOOST_CHECK(it4.is_valid(0)); - BOOST_CHECK(it5.is_valid(0)); - BOOST_CHECK(it6.is_valid(0)); - - { - circular_buffer cb(5, 0); - const circular_buffer ccb(5, 0); - - it1 = cb.begin(); - it2 = ccb.begin(); - it3 = cb.end(); - it4 = it1; - it5 = it2; - it6 = it1; - - BOOST_CHECK(it1.is_valid(&cb)); - BOOST_CHECK(it2.is_valid(&ccb)); - BOOST_CHECK(it3.is_valid(&cb)); - BOOST_CHECK(it4.is_valid(&cb)); - BOOST_CHECK(it5.is_valid(&ccb)); - BOOST_CHECK(it6.is_valid(&cb)); - } - - BOOST_CHECK(it1.is_valid(0)); - BOOST_CHECK(it2.is_valid(0)); - BOOST_CHECK(it3.is_valid(0)); - BOOST_CHECK(it4.is_valid(0)); - BOOST_CHECK(it5.is_valid(0)); - BOOST_CHECK(it6.is_valid(0)); - - circular_buffer cb(10, 0); - it1 = cb.end(); - cb.clear(); - BOOST_CHECK(it1.is_valid(&cb)); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - int i = 0; - for (it2 = cb.begin(); it2 != it1; it2++, i++); - BOOST_CHECK(i == 3); - - circular_buffer cb1(10, 0); - circular_buffer cb2(20, 0); - it1 = cb1.end(); - it2 = cb2.begin(); - BOOST_CHECK(it1.is_valid(&cb1)); - BOOST_CHECK(it2.is_valid(&cb2)); - - cb1.swap(cb2); - BOOST_CHECK(!it1.is_valid(&cb1)); - BOOST_CHECK(!it2.is_valid(&cb2)); - - it1 = cb1.begin() + 3; - it2 = cb1.begin(); - cb1.push_back(1); - BOOST_CHECK(it1.is_valid(&cb1)); - BOOST_CHECK(!it2.is_valid(&cb1)); - BOOST_CHECK(*it2.m_it == 1); - - circular_buffer cb3(5); - cb3.push_back(1); - cb3.push_back(2); - cb3.push_back(3); - cb3.push_back(4); - cb3.push_back(5); - it1 = cb3.begin() + 2; - it2 = cb3.begin(); - cb3.insert(cb3.begin() + 3, 6); - BOOST_CHECK(it1.is_valid(&cb3)); - BOOST_CHECK(!it2.is_valid(&cb3)); - BOOST_CHECK(*it2.m_it == 5); - - it1 = cb3.begin() + 3; - it2 = cb3.end() - 1; - cb3.push_front(7); - BOOST_CHECK(it1.is_valid(&cb3)); - BOOST_CHECK(!it2.is_valid(&cb3)); - BOOST_CHECK(*it2.m_it == 7); - - circular_buffer cb4(5); - cb4.push_back(1); - cb4.push_back(2); - cb4.push_back(3); - cb4.push_back(4); - cb4.push_back(5); - it1 = cb4.begin() + 3; - it2 = cb4.begin(); - cb4.rinsert(cb4.begin() + 2, 6); - BOOST_CHECK(it1.is_valid(&cb4)); - BOOST_CHECK(!it2.is_valid(&cb4)); - BOOST_CHECK(*it2.m_it == 2); - - it1 = cb1.begin() + 5; - it2 = cb1.end() - 1; - cb1.pop_back(); - BOOST_CHECK(it1.is_valid(&cb1)); - BOOST_CHECK(!it2.is_valid(&cb1)); - - it1 = cb1.begin() + 5; - it2 = cb1.begin(); - cb1.pop_front(); - BOOST_CHECK(it1.is_valid(&cb1)); - BOOST_CHECK(!it2.is_valid(&cb1)); - - circular_buffer cb5(20, 0); - it1 = cb5.begin() + 5; - it2 = it3 = cb5.begin() + 15; - cb5.erase(cb5.begin() + 10); - BOOST_CHECK(it1.is_valid(&cb5)); - BOOST_CHECK(!it2.is_valid(&cb5)); - BOOST_CHECK(!it3.is_valid(&cb5)); - - it1 = cb5.begin() + 1; - it2 = it3 = cb5.begin() + 8; - cb5.erase(cb5.begin() + 3, cb5.begin() + 7); - BOOST_CHECK(it1.is_valid(&cb5)); - BOOST_CHECK(!it2.is_valid(&cb5)); - BOOST_CHECK(!it3.is_valid(&cb5)); - - circular_buffer cb6(20, 0); - it4 = it1 = cb6.begin() + 5; - it2 = cb6.begin() + 15; - cb6.rerase(cb6.begin() + 10); - BOOST_CHECK(!it1.is_valid(&cb6)); - BOOST_CHECK(!it4.is_valid(&cb6)); - BOOST_CHECK(it2.is_valid(&cb6)); - - it4 = it1 = cb6.begin() + 1; - it2 = cb6.begin() + 8; - cb6.rerase(cb6.begin() + 3, cb6.begin() + 7); - BOOST_CHECK(!it1.is_valid(&cb6)); - BOOST_CHECK(!it4.is_valid(&cb6)); - BOOST_CHECK(it2.is_valid(&cb6)); - - circular_buffer cb7(10, 1); - cb7.push_back(2); - cb7.push_back(3); - cb7.push_back(4); - it1 = cb7.end(); - it2 = cb7.begin(); - it3 = cb7.begin() + 6; - cb7.linearize(); - BOOST_CHECK(it1.is_valid(&cb7)); - BOOST_CHECK(!it2.is_valid(&cb7)); - BOOST_CHECK(!it3.is_valid(&cb7)); - it1 = cb7.end(); - it2 = cb7.begin(); - it3 = cb7.begin() + 6; - cb7.linearize(); - BOOST_CHECK(it1.is_valid(&cb7)); - BOOST_CHECK(it2.is_valid(&cb7)); - BOOST_CHECK(it3.is_valid(&cb7)); - - cb7.push_back(5); - cb7.push_back(6); - it1 = cb7.end(); - it2 = cb7.begin(); - it3 = cb7.begin() + 6; - cb7.set_capacity(10); - BOOST_CHECK(it1.is_valid(&cb7)); - BOOST_CHECK(it2.is_valid(&cb7)); - BOOST_CHECK(it3.is_valid(&cb7)); - cb7.set_capacity(20); - BOOST_CHECK(it1.is_valid(&cb7)); - BOOST_CHECK(!it2.is_valid(&cb7)); - BOOST_CHECK(!it3.is_valid(&cb7)); - cb7.push_back(7); - it1 = cb7.end(); - it2 = cb7.begin(); - it3 = cb7.begin() + 6; - cb7.set_capacity(10); - BOOST_CHECK(it1.is_valid(&cb7)); - BOOST_CHECK(!it2.is_valid(&cb7)); - BOOST_CHECK(!it3.is_valid(&cb7)); - - cb7.push_back(8); - cb7.push_back(9); - it1 = cb7.end(); - it2 = cb7.begin(); - it3 = cb7.begin() + 6; - cb7.rset_capacity(10); - BOOST_CHECK(it1.is_valid(&cb7)); - BOOST_CHECK(it2.is_valid(&cb7)); - BOOST_CHECK(it3.is_valid(&cb7)); - cb7.rset_capacity(20); - BOOST_CHECK(it1.is_valid(&cb7)); - BOOST_CHECK(!it2.is_valid(&cb7)); - BOOST_CHECK(!it3.is_valid(&cb7)); - cb7.push_back(10); - it1 = cb7.end(); - it2 = cb7.begin(); - it3 = cb7.begin() + 6; - cb7.rset_capacity(10); - BOOST_CHECK(it1.is_valid(&cb7)); - BOOST_CHECK(!it2.is_valid(&cb7)); - BOOST_CHECK(!it3.is_valid(&cb7)); - - circular_buffer cb8(10, 1); - cb8.push_back(2); - cb8.push_back(3); - it1 = cb8.end(); - it2 = cb8.begin(); - it3 = cb8.begin() + 6; - cb8.resize(10); - BOOST_CHECK(it1.is_valid(&cb8)); - BOOST_CHECK(it2.is_valid(&cb8)); - BOOST_CHECK(it3.is_valid(&cb8)); - cb8.resize(20); - BOOST_CHECK(it1.is_valid(&cb8)); - BOOST_CHECK(!it2.is_valid(&cb8)); - BOOST_CHECK(!it3.is_valid(&cb8)); - cb8.push_back(4); - it1 = cb8.end(); - it2 = cb8.begin(); - it3 = cb8.begin() + 6; - it4 = cb8.begin() + 12; - cb8.resize(10); - BOOST_CHECK(it1.is_valid(&cb8)); - BOOST_CHECK(it2.is_valid(&cb8)); - BOOST_CHECK(it3.is_valid(&cb8)); - BOOST_CHECK(!it4.is_valid(&cb8)); - - cb8.set_capacity(10); - cb8.push_back(5); - cb8.push_back(6); - it1 = cb8.end(); - it2 = cb8.begin(); - it3 = cb8.begin() + 6; - cb8.rresize(10); - BOOST_CHECK(it1.is_valid(&cb8)); - BOOST_CHECK(it2.is_valid(&cb8)); - BOOST_CHECK(it3.is_valid(&cb8)); - cb8.rresize(20); - BOOST_CHECK(it1.is_valid(&cb8)); - BOOST_CHECK(!it2.is_valid(&cb8)); - BOOST_CHECK(!it3.is_valid(&cb8)); - cb8.push_back(7); - it1 = cb8.end(); - it2 = cb8.begin(); - it3 = cb8.begin() + 6; - it4 = cb8.begin() + 12; - cb8.rresize(10); - BOOST_CHECK(it1.is_valid(&cb8)); - BOOST_CHECK(!it2.is_valid(&cb8)); - BOOST_CHECK(!it3.is_valid(&cb8)); - BOOST_CHECK(it4.is_valid(&cb8)); - - circular_buffer cb9(15, 1); - it1 = cb9.end(); - it2 = cb9.begin(); - it3 = cb9.begin() + 6; - it4 = cb9.begin() + 12; - cb9 = cb8; - BOOST_CHECK(it1.is_valid(&cb9)); - BOOST_CHECK(!it2.is_valid(&cb9)); - BOOST_CHECK(!it3.is_valid(&cb9)); - BOOST_CHECK(!it4.is_valid(&cb9)); - - circular_buffer cb10(10, 1); - it1 = cb10.end(); - it2 = cb10.begin(); - it3 = cb10.begin() + 3; - it4 = cb10.begin() + 7; - cb10.assign(5, 2); - BOOST_CHECK(it1.is_valid(&cb10)); - BOOST_CHECK(!it2.is_valid(&cb10)); - BOOST_CHECK(!it3.is_valid(&cb10)); - BOOST_CHECK(!it4.is_valid(&cb10)); - - circular_buffer cb11(10, 1); - it1 = cb11.end(); - it2 = cb11.begin(); - it3 = cb11.begin() + 3; - it4 = cb11.begin() + 7; - cb11.assign(15, 5, 2); - BOOST_CHECK(it1.is_valid(&cb11)); - BOOST_CHECK(!it2.is_valid(&cb11)); - BOOST_CHECK(!it3.is_valid(&cb11)); - BOOST_CHECK(!it4.is_valid(&cb11)); - - circular_buffer cb12(10, 1); - it1 = cb12.end(); - it2 = cb12.begin(); - it3 = cb12.begin() + 3; - it4 = cb12.begin() + 7; - cb12.assign(cb11.begin(), cb11.end()); - BOOST_CHECK(it1.is_valid(&cb12)); - BOOST_CHECK(!it2.is_valid(&cb12)); - BOOST_CHECK(!it3.is_valid(&cb12)); - BOOST_CHECK(!it4.is_valid(&cb12)); - - circular_buffer cb13(10, 1); - it1 = cb13.end(); - it2 = cb13.begin(); - it3 = cb13.begin() + 3; - it4 = cb13.begin() + 7; - cb13.assign(15, cb11.begin(), cb11.end()); - BOOST_CHECK(it1.is_valid(&cb13)); - BOOST_CHECK(!it2.is_valid(&cb13)); - BOOST_CHECK(!it3.is_valid(&cb13)); - BOOST_CHECK(!it4.is_valid(&cb13)); - - circular_buffer cb14(10); - cb14.push_back(1); - cb14.push_back(2); - cb14.push_back(3); - cb14.push_back(4); - cb14.push_back(5); - cb14.push_back(6); - cb14.push_back(7); - it1 = cb14.end(); - it2 = cb14.begin() + 2; - it3 = cb14.begin() + 1; - it4 = cb14.begin() + 5; - cb14.rotate(it2); - BOOST_CHECK(it1.is_valid(&cb14)); - BOOST_CHECK(it2.is_valid(&cb14)); - BOOST_CHECK(!it3.is_valid(&cb14)); - BOOST_CHECK(it4.is_valid(&cb14)); - - circular_buffer cb15(7); - cb15.push_back(1); - cb15.push_back(2); - cb15.push_back(3); - cb15.push_back(4); - cb15.push_back(5); - cb15.push_back(6); - cb15.push_back(7); - cb15.push_back(8); - cb15.push_back(9); - it1 = cb15.end(); - it2 = cb15.begin() + 2; - it3 = cb15.begin() + 1; - it4 = cb15.begin() + 5; - cb15.rotate(it3); - BOOST_CHECK(it1.is_valid(&cb15)); - BOOST_CHECK(it2.is_valid(&cb15)); - BOOST_CHECK(it3.is_valid(&cb15)); - BOOST_CHECK(it4.is_valid(&cb15)); - - circular_buffer cb16(10); - cb16.push_back(1); - cb16.push_back(2); - cb16.push_back(3); - cb16.push_back(4); - cb16.push_back(5); - cb16.push_back(6); - cb16.push_back(7); - it1 = cb16.end(); - it2 = cb16.begin() + 6; - it3 = cb16.begin(); - it4 = cb16.begin() + 5; - cb16.rotate(it4); - BOOST_CHECK(it1.is_valid(&cb16)); - BOOST_CHECK(!it2.is_valid(&cb16)); - BOOST_CHECK(it3.is_valid(&cb16)); - BOOST_CHECK(!it4.is_valid(&cb16)); - -#endif // #if BOOST_CB_ENABLE_DEBUG -} - -// basic exception safety test (it is useful to use any memory-leak detection tool) -void exception_safety_test() { - -#if !defined(BOOST_NO_EXCEPTIONS) - - circular_buffer cb1(3, 5); - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(cb1.set_capacity(5), std::exception); - BOOST_CHECK(cb1.capacity() == 3); - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(cb1.rset_capacity(5), std::exception); - BOOST_CHECK(cb1.capacity() == 3); - generic_test(cb1); - - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(circular_buffer cb2(5, 10), std::exception); - - circular_buffer cb3(5, 10); - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(circular_buffer cb4(cb3), std::exception); - - vector v(5, MyInteger(10)); - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(circular_buffer cb5(8, v.begin(), v.end()), std::exception); - - circular_buffer cb6(5, 10); - circular_buffer cb7(8, 3); - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(cb7 = cb6, std::exception); - BOOST_CHECK(cb7.size() == 8); - BOOST_CHECK(cb7.capacity() == 8); - BOOST_CHECK(cb7[0] == 3); - BOOST_CHECK(cb7[7] == 3); - generic_test(cb7); - - circular_buffer cb8(5, 10); - MyInteger::set_exception_trigger(2); - BOOST_CHECK_THROW(cb8.push_front(1), std::exception); - - circular_buffer cb9(5); - cb9.push_back(1); - cb9.push_back(2); - cb9.push_back(3); - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(cb9.insert(cb9.begin() + 1, 4), std::exception); - - circular_buffer cb10(5); - cb10.push_back(1); - cb10.push_back(2); - cb10.push_back(3); - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(cb10.rinsert(cb10.begin() + 1, 4), std::exception); - - circular_buffer cb11(5); - cb11.push_back(1); - cb11.push_back(2); - MyInteger::set_exception_trigger(2); - BOOST_CHECK_THROW(cb11.rinsert(cb11.begin(), 1), std::exception); - - circular_buffer cb12(5, 1); - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(cb12.assign(4, 2), std::exception); - - circular_buffer cb13(5, 1); - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(cb13.assign(6, 2), std::exception); - - circular_buffer cb14(5); - cb14.push_back(1); - cb14.push_back(2); - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(cb14.insert(cb14.begin(), 10, 3), std::exception); - - circular_buffer cb15(5); - cb15.push_back(1); - cb15.push_back(2); - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(cb15.insert(cb15.end(), 10, 3), std::exception); - - circular_buffer cb16(5); - cb16.push_back(1); - cb16.push_back(2); - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(cb16.rinsert(cb16.begin(), 10, 3), std::exception); - - circular_buffer cb17(5); - cb17.push_back(1); - cb17.push_back(2); - MyInteger::set_exception_trigger(3); - BOOST_CHECK_THROW(cb17.rinsert(cb17.end(), 10, 3), std::exception); - - circular_buffer cb18(5, 0); - cb18.push_back(1); - cb18.push_back(2); - cb18.pop_front(); - MyInteger::set_exception_trigger(4); - BOOST_CHECK_THROW(cb18.linearize(), std::exception); - - circular_buffer cb19(5, 0); - cb19.push_back(1); - cb19.push_back(2); - MyInteger::set_exception_trigger(5); - BOOST_CHECK_THROW(cb19.linearize(), std::exception); - - circular_buffer cb20(5, 0); - cb20.push_back(1); - cb20.push_back(2); - MyInteger::set_exception_trigger(6); - BOOST_CHECK_THROW(cb20.linearize(), std::exception); - - circular_buffer cb21(5); - cb21.push_back(1); - cb21.push_back(2); - cb21.push_back(3); - MyInteger::set_exception_trigger(2); - BOOST_CHECK_THROW(cb21.insert(cb21.begin() + 1, 4), std::exception); - - circular_buffer cb22(5); - cb22.push_back(1); - cb22.push_back(2); - cb22.push_back(3); - MyInteger::set_exception_trigger(2); - BOOST_CHECK_THROW(cb22.insert(cb22.end(), 4), std::exception); - - circular_buffer cb23(5, 0); - MyInteger::set_exception_trigger(2); - BOOST_CHECK_THROW(cb23.insert(cb23.begin() + 1, 4), std::exception); - - circular_buffer cb24(5); - cb24.push_back(1); - cb24.push_back(2); - cb24.push_back(3); - MyInteger::set_exception_trigger(2); - BOOST_CHECK_THROW(cb24.rinsert(cb24.begin() + 1, 4), std::exception); - - circular_buffer cb25(5, 0); - MyInteger::set_exception_trigger(2); - BOOST_CHECK_THROW(cb25.rinsert(cb25.begin() + 3, 4), std::exception); - - circular_buffer cb26(5); - cb26.push_back(1); - cb26.push_back(2); - MyInteger::set_exception_trigger(5); - BOOST_CHECK_THROW(cb26.insert(cb26.begin(), 10, 3), std::exception); - - circular_buffer cb27(5); - cb27.push_back(1); - cb27.push_back(2); - MyInteger::set_exception_trigger(5); - BOOST_CHECK_THROW(cb27.insert(cb27.end(), 10, 3), std::exception); - - circular_buffer cb28(5); - cb28.push_back(1); - cb28.push_back(2); - MyInteger::set_exception_trigger(5); - BOOST_CHECK_THROW(cb28.rinsert(cb28.begin(), 10, 3), std::exception); - - circular_buffer cb29(5); - cb29.push_back(1); - cb29.push_back(2); - MyInteger::set_exception_trigger(5); - BOOST_CHECK_THROW(cb29.rinsert(cb29.end(), 10, 3), std::exception); - - circular_buffer cb30(10); - cb30.push_back(1); - cb30.push_back(2); - cb30.push_back(3); - MyInteger::set_exception_trigger(2); - BOOST_CHECK_THROW(cb30.rinsert(cb30.begin(), 10, 3), std::exception); - -#endif // #if !defined(BOOST_NO_EXCEPTIONS) -} - - -void move_container_values_except() { - move_container_values_impl(); -} - -template -void move_container_values_resetting_impl() { - typedef T noncopyable_movable_test_t; - CB_CONTAINER cb1(1); - noncopyable_movable_test_t var; - cb1.push_back(); - - cb1.push_back(boost::move(var)); - BOOST_CHECK(!cb1.back().is_moved()); - BOOST_CHECK(var.is_moved()); - BOOST_CHECK(cb1.size() == 1); - var = boost::move(cb1.back()); - BOOST_CHECK(cb1.back().is_moved()); - - cb1.push_front(boost::move(var)); - BOOST_CHECK(!cb1.front().is_moved()); - BOOST_CHECK(var.is_moved()); - BOOST_CHECK(cb1.size() == 1); - var = boost::move(cb1.back()); - BOOST_CHECK(cb1.back().is_moved()); - - cb1.push_back(); - BOOST_CHECK(!cb1.back().is_moved()); - BOOST_CHECK(cb1.size() == 1); - var = boost::move(cb1.back()); - BOOST_CHECK(cb1.back().is_moved()); - - cb1.push_front(); - BOOST_CHECK(!cb1.front().is_moved()); - BOOST_CHECK(cb1.size() == 1); - var = boost::move(cb1.back()); - BOOST_CHECK(cb1.back().is_moved()); - - - cb1.insert(cb1.begin()); - // If the circular_buffer is full and the pos points to begin(), - // then the item will not be inserted. - BOOST_CHECK(cb1.front().is_moved()); - BOOST_CHECK(cb1.size() == 1); - var = boost::move(cb1.back()); - BOOST_CHECK(cb1.back().is_moved()); - - cb1.insert(cb1.begin(), boost::move(var)); - // If the circular_buffer is full and the pos points to begin(), - // then the item will not be inserted. - BOOST_CHECK(cb1.front().is_moved()); - BOOST_CHECK(cb1.size() == 1); - var = boost::move(cb1.back()); - BOOST_CHECK(cb1.back().is_moved()); - - cb1.rinsert(cb1.begin()); - BOOST_CHECK(!cb1.back().is_moved()); - BOOST_CHECK(cb1.size() == 1); - var = boost::move(cb1.back()); - BOOST_CHECK(cb1.back().is_moved()); - - var.reinit(); - cb1.rinsert(cb1.begin(), boost::move(var)); - BOOST_CHECK(!cb1.back().is_moved()); - BOOST_CHECK(cb1.size() == 1); - var = boost::move(cb1.back()); - BOOST_CHECK(cb1.back().is_moved()); - - cb1.rinsert(cb1.end()); - BOOST_CHECK(cb1.back().is_moved()); - BOOST_CHECK(cb1.size() == 1); - var = boost::move(cb1.back()); - BOOST_CHECK(cb1.back().is_moved()); - - var.reinit(); - cb1.rinsert(cb1.end(), boost::move(var)); - BOOST_CHECK(cb1.back().is_moved()); - BOOST_CHECK(cb1.size() == 1); - var = boost::move(cb1.back()); - BOOST_CHECK(cb1.back().is_moved()); - cb1.push_back(); - BOOST_CHECK(!cb1[0].is_moved()); - - const int val = cb1[0].value(); - cb1.linearize(); - BOOST_CHECK(!cb1[0].is_moved()); - BOOST_CHECK(cb1[0].value() == val); - - cb1.rotate(cb1.begin()); - BOOST_CHECK(!cb1[0].is_moved()); - BOOST_CHECK(cb1[0].value() == val); -} - -void move_container_values_resetting_except() { - move_container_values_resetting_impl(); -} - -void move_container_values_resetting_noexcept() { - move_container_values_resetting_impl(); -} - -// test main -test_suite* init_unit_test_suite(int /*argc*/, char* /*argv*/[]) { - - test_suite* tests = BOOST_TEST_SUITE("Unit tests for the circular_buffer."); - add_common_tests(tests); - - tests->add(BOOST_TEST_CASE(&iterator_constructor_and_assign_test)); - tests->add(BOOST_TEST_CASE(&iterator_reference_test)); - tests->add(BOOST_TEST_CASE(&iterator_difference_test)); - tests->add(BOOST_TEST_CASE(&iterator_increment_test)); - tests->add(BOOST_TEST_CASE(&iterator_decrement_test)); - tests->add(BOOST_TEST_CASE(&iterator_addition_test)); - tests->add(BOOST_TEST_CASE(&iterator_subtraction_test)); - tests->add(BOOST_TEST_CASE(&iterator_element_access_test)); - tests->add(BOOST_TEST_CASE(&iterator_comparison_test)); - tests->add(BOOST_TEST_CASE(&iterator_invalidation_test)); - tests->add(BOOST_TEST_CASE(&exception_safety_test)); - tests->add(BOOST_TEST_CASE(&move_container_values_except)); - tests->add(BOOST_TEST_CASE(&move_container_values_resetting_except)); - tests->add(BOOST_TEST_CASE(&move_container_values_resetting_noexcept)); - - return tests; -} diff --git a/libs/circular_buffer/test/bounded_buffer_comparison.cpp b/libs/circular_buffer/test/bounded_buffer_comparison.cpp deleted file mode 100644 index b31c8f817..000000000 --- a/libs/circular_buffer/test/bounded_buffer_comparison.cpp +++ /dev/null @@ -1,316 +0,0 @@ -// Comparison of bounded buffers based on different containers. - -// Copyright (c) 2003-2008 Jan Gaspar -// Copyright 2013 Paul A. Bristow. Added some Quickbook snippet markers. - -// 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) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const unsigned long QUEUE_SIZE = 1000L; -const unsigned long TOTAL_ELEMENTS = QUEUE_SIZE * 1000L; - -template -class bounded_buffer { -public: - - typedef boost::circular_buffer container_type; - typedef typename container_type::size_type size_type; - typedef typename container_type::value_type value_type; - typedef typename boost::call_traits::param_type param_type; - - explicit bounded_buffer(size_type capacity) : m_unread(0), m_container(capacity) {} - - void push_front(param_type item) { - boost::unique_lock lock(m_mutex); - m_not_full.wait(lock, boost::bind(&bounded_buffer::is_not_full, this)); - m_container.push_front(item); - ++m_unread; - lock.unlock(); - m_not_empty.notify_one(); - } - - void pop_back(value_type* pItem) { - boost::unique_lock lock(m_mutex); - m_not_empty.wait(lock, boost::bind(&bounded_buffer::is_not_empty, this)); - *pItem = m_container[--m_unread]; - lock.unlock(); - m_not_full.notify_one(); - } - -private: - bounded_buffer(const bounded_buffer&); // Disabled copy constructor - bounded_buffer& operator = (const bounded_buffer&); // Disabled assign operator - - bool is_not_empty() const { return m_unread > 0; } - bool is_not_full() const { return m_unread < m_container.capacity(); } - - size_type m_unread; - container_type m_container; - boost::mutex m_mutex; - boost::condition_variable m_not_empty; - boost::condition_variable m_not_full; -}; - -template -class bounded_buffer_space_optimized { -public: - - typedef boost::circular_buffer_space_optimized container_type; - typedef typename container_type::size_type size_type; - typedef typename container_type::value_type value_type; - typedef typename boost::call_traits::param_type param_type; - - explicit bounded_buffer_space_optimized(size_type capacity) : m_container(capacity) {} - - void push_front(param_type item) { - boost::unique_lock lock(m_mutex); - m_not_full.wait(lock, boost::bind(&bounded_buffer_space_optimized::is_not_full, this)); - m_container.push_front(item); - lock.unlock(); - m_not_empty.notify_one(); - } - - void pop_back(value_type* pItem) { - boost::unique_lock lock(m_mutex); - m_not_empty.wait(lock, boost::bind(&bounded_buffer_space_optimized::is_not_empty, this)); - *pItem = m_container.back(); - m_container.pop_back(); - lock.unlock(); - m_not_full.notify_one(); - } - -private: - - bounded_buffer_space_optimized(const bounded_buffer_space_optimized&); // Disabled copy constructor - bounded_buffer_space_optimized& operator = (const bounded_buffer_space_optimized&); // Disabled assign operator - - bool is_not_empty() const { return m_container.size() > 0; } - bool is_not_full() const { return m_container.size() < m_container.capacity(); } - - container_type m_container; - boost::mutex m_mutex; - boost::condition_variable m_not_empty; - boost::condition_variable m_not_full; -}; - -template -class bounded_buffer_deque_based { -public: - - typedef std::deque container_type; - typedef typename container_type::size_type size_type; - typedef typename container_type::value_type value_type; - typedef typename boost::call_traits::param_type param_type; - - explicit bounded_buffer_deque_based(size_type capacity) : m_capacity(capacity) {} - - void push_front(param_type item) { - boost::unique_lock lock(m_mutex); - m_not_full.wait(lock, boost::bind(&bounded_buffer_deque_based::is_not_full, this)); - m_container.push_front(item); - lock.unlock(); - m_not_empty.notify_one(); - } - - void pop_back(value_type* pItem) { - boost::unique_lock lock(m_mutex); - m_not_empty.wait(lock, boost::bind(&bounded_buffer_deque_based::is_not_empty, this)); - *pItem = m_container.back(); - m_container.pop_back(); - lock.unlock(); - m_not_full.notify_one(); - } - -private: - - bounded_buffer_deque_based(const bounded_buffer_deque_based&); // Disabled copy constructor - bounded_buffer_deque_based& operator = (const bounded_buffer_deque_based&); // Disabled assign operator - - bool is_not_empty() const { return m_container.size() > 0; } - bool is_not_full() const { return m_container.size() < m_capacity; } - - const size_type m_capacity; - container_type m_container; - boost::mutex m_mutex; - boost::condition_variable m_not_empty; - boost::condition_variable m_not_full; -}; - -template -class bounded_buffer_list_based { -public: - - typedef std::list container_type; - typedef typename container_type::size_type size_type; - typedef typename container_type::value_type value_type; - typedef typename boost::call_traits::param_type param_type; - - explicit bounded_buffer_list_based(size_type capacity) : m_capacity(capacity) {} - - void push_front(param_type item) { - boost::unique_lock lock(m_mutex); - m_not_full.wait(lock, boost::bind(&bounded_buffer_list_based::is_not_full, this)); - m_container.push_front(item); - lock.unlock(); - m_not_empty.notify_one(); - } - - void pop_back(value_type* pItem) { - boost::unique_lock lock(m_mutex); - m_not_empty.wait(lock, boost::bind(&bounded_buffer_list_based::is_not_empty, this)); - *pItem = m_container.back(); - m_container.pop_back(); - lock.unlock(); - m_not_full.notify_one(); - } - -private: - - bounded_buffer_list_based(const bounded_buffer_list_based&); // Disabled copy constructor - bounded_buffer_list_based& operator = (const bounded_buffer_list_based&); // Disabled assign operator - - bool is_not_empty() const { return m_container.size() > 0; } - bool is_not_full() const { return m_container.size() < m_capacity; } - - const size_type m_capacity; - container_type m_container; - boost::mutex m_mutex; - boost::condition_variable m_not_empty; - boost::condition_variable m_not_full; -}; - -template -class Consumer { - - typedef typename Buffer::value_type value_type; - Buffer* m_container; - value_type m_item; - -public: - Consumer(Buffer* buffer) : m_container(buffer) {} - - void operator()() { - for (unsigned long i = 0L; i < TOTAL_ELEMENTS; ++i) { - m_container->pop_back(&m_item); - } - } -}; - -template -class Producer { - - typedef typename Buffer::value_type value_type; - Buffer* m_container; - -public: - Producer(Buffer* buffer) : m_container(buffer) {} - - void operator()() { - for (unsigned long i = 0L; i < TOTAL_ELEMENTS; ++i) { - m_container->push_front(value_type()); - } - } -}; - -template -void fifo_test(Buffer* buffer) { - - // Start of measurement - boost::progress_timer progress; - - // Initialize the buffer with some values before launching producer and consumer threads. - for (unsigned long i = QUEUE_SIZE / 2L; i > 0; --i) { -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x581)) - buffer->push_front(Buffer::value_type()); -#else - buffer->push_front(BOOST_DEDUCED_TYPENAME Buffer::value_type()); -#endif - } - - Consumer consumer(buffer); - Producer producer(buffer); - - // Start the threads. - boost::thread consume(consumer); - boost::thread produce(producer); - - // Wait for completion. - consume.join(); - produce.join(); - - // End of measurement -} - -int main(int /*argc*/, char* /*argv*/[]) { - - bounded_buffer bb_int(QUEUE_SIZE); - std::cout << "bounded_buffer "; - fifo_test(&bb_int); - - bounded_buffer_space_optimized bb_space_optimized_int(QUEUE_SIZE); - std::cout << "bounded_buffer_space_optimized "; - fifo_test(&bb_space_optimized_int); - - bounded_buffer_deque_based bb_deque_based_int(QUEUE_SIZE); - std::cout << "bounded_buffer_deque_based "; - fifo_test(&bb_deque_based_int); - - bounded_buffer_list_based bb_list_based_int(QUEUE_SIZE); - std::cout << "bounded_buffer_list_based "; - fifo_test(&bb_list_based_int); - - bounded_buffer bb_string(QUEUE_SIZE); - std::cout << "bounded_buffer "; - fifo_test(&bb_string); - - bounded_buffer_space_optimized bb_space_optimized_string(QUEUE_SIZE); - std::cout << "bounded_buffer_space_optimized "; - fifo_test(&bb_space_optimized_string); - - bounded_buffer_deque_based bb_deque_based_string(QUEUE_SIZE); - std::cout << "bounded_buffer_deque_based "; - fifo_test(&bb_deque_based_string); - - bounded_buffer_list_based bb_list_based_string(QUEUE_SIZE); - std::cout << "bounded_buffer_list_based "; - fifo_test(&bb_list_based_string); - - return 0; -} -/* - -//[bounded_buffer_comparison_output - - Description: Autorun "J:\Cpp\Misc\Debug\bounded_buffer_comparison.exe" - bounded_buffer 5.15 s - - bounded_buffer_space_optimized 5.71 s - - bounded_buffer_deque_based 15.57 s - - bounded_buffer_list_based 17.33 s - - bounded_buffer 24.49 s - - bounded_buffer_space_optimized 28.33 s - - bounded_buffer_deque_based 29.45 s - - bounded_buffer_list_based 31.29 s - - //] //[bounded_buffer_comparison_output] - -*/ diff --git a/libs/circular_buffer/test/common.ipp b/libs/circular_buffer/test/common.ipp deleted file mode 100644 index 6b97b2eb3..000000000 --- a/libs/circular_buffer/test/common.ipp +++ /dev/null @@ -1,2483 +0,0 @@ -// Common tests for the circular buffer and its adaptor. - -// Copyright (c) 2003-2008 Jan Gaspar -// Copyright (c) 2013 Antony Polukhin -// Copyright (c) 2014 Glen Fernandes // C++11 allocator model support. - -// 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) - -#include -#include -#include - -template -void generic_test(CB_CONTAINER& cb) { - - vector v; - v.push_back(11); - v.push_back(12); - v.push_back(13); - v.push_back(14); - v.push_back(15); - v.push_back(16); - v.push_back(17); - - if (cb.capacity() == 0) { - - cb.insert(cb.begin(), 1); - cb.insert(cb.begin(), v.begin(), v.end()); - cb.rinsert(cb.end(), 2); - cb.rinsert(cb.end(), v.begin(), v.end()); - cb.push_back(3); - cb.push_front(4); - cb.linearize(); - - BOOST_CHECK(cb.empty()); - BOOST_CHECK(cb.full()); - - } else { - - cb.insert(cb.end(), 1); - BOOST_CHECK(!cb.empty()); - BOOST_CHECK(cb[cb.size() - 1] == 1); - - size_t size = cb.size(); - cb.rerase(cb.end() - 1, cb.end()); - BOOST_CHECK(size == cb.size() + 1); - - cb.insert(cb.end(), v.begin(), v.end()); - BOOST_CHECK(!cb.empty()); - BOOST_CHECK(cb[cb.size() - 1] == 17); - - size = cb.size(); - cb.erase(cb.end() - 1, cb.end()); - BOOST_CHECK(size == cb.size() + 1); - - size = cb.size(); - cb.rinsert(cb.begin(), 2); - BOOST_CHECK(size + 1 == cb.size()); - BOOST_CHECK(cb[0] == 2); - - size = cb.size(); - cb.erase(cb.begin()); - BOOST_CHECK(size == cb.size() + 1); - - cb.rinsert(cb.begin(), v.begin(), v.end()); - BOOST_CHECK(!cb.empty()); - BOOST_CHECK(cb[0] == 11); - - size = cb.size(); - cb.pop_front(); - BOOST_CHECK(size == cb.size() + 1); - - cb.push_back(3); - BOOST_CHECK(!cb.empty()); - BOOST_CHECK(cb[cb.size() - 1] == 3); - - size = cb.size(); - cb.pop_back(); - BOOST_CHECK(size == cb.size() + 1); - - cb.push_front(4); - BOOST_CHECK(!cb.empty()); - BOOST_CHECK(cb[0] == 4); - - cb.linearize(); - BOOST_CHECK(!cb.empty()); - BOOST_CHECK(cb[0] == 4); - - size = cb.size(); - cb.rerase(cb.begin()); - BOOST_CHECK(size == cb.size() + 1); - } -} - -void basic_test() { - - vector v; - v.push_back(1); - v.push_back(2); - v.push_back(3); - v.push_back(4); - v.push_back(5); - v.push_back(6); - v.push_back(7); - CB_CONTAINER cb1(3, v.begin(), v.end()); - CB_CONTAINER cb2(10, v.begin(), v.end()); - CB_CONTAINER cb3(7, v.begin(), v.end()); - - BOOST_CHECK(cb1.full()); - BOOST_CHECK(cb1.capacity() == 3); - BOOST_CHECK(cb1.size() == 3); - BOOST_CHECK(cb1[0] == 5); - BOOST_CHECK(cb1[2] == 7); - BOOST_CHECK(!cb2.full()); - BOOST_CHECK(cb2[2] == 3); - BOOST_CHECK(cb3.full()); - BOOST_CHECK(cb3[0] == 1); - BOOST_CHECK(cb3[6] == 7); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); -} - -void constructor_and_element_access_test() { - - CB_CONTAINER cb(5, 3); - cb[1] = 10; - - BOOST_CHECK(cb.full()); - BOOST_CHECK(cb[1] == 10); - BOOST_CHECK(cb[4] == 3); -} - -void size_test() { - - CB_CONTAINER cb1(3); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - CB_CONTAINER cb2(5); - - BOOST_CHECK(cb1.size() == 3); - BOOST_CHECK(cb2.size() == 0); - BOOST_CHECK(cb1.max_size() == cb2.max_size()); - - generic_test(cb1); - generic_test(cb2); -} - -template -class my_allocator { - typedef std::allocator base_t; - base_t base_; -public: - typedef T value_type; - - - typedef value_type& reference; - typedef const value_type& const_reference; - typedef typename base_t::size_type size_type; - typedef typename base_t::difference_type difference_type; - -private: - template - struct const_pointer_; - - template - struct pointer_ { - pointer_(){} - pointer_(void* p) : hidden_ptr_((U*)p) {} - difference_type operator-(const const_pointer_& rhs) const { return hidden_ptr_ - rhs.hidden_ptr_; } - difference_type operator-(pointer_ rhs) const { return hidden_ptr_ - rhs.hidden_ptr_; } - pointer_ operator-(size_type rhs) const { return hidden_ptr_ - rhs; } - bool operator == (pointer_ rhs) const { return hidden_ptr_ == rhs.hidden_ptr_; } - bool operator != (pointer_ rhs) const { return hidden_ptr_ != rhs.hidden_ptr_; } - bool operator < (pointer_ rhs) const { return hidden_ptr_ < rhs.hidden_ptr_; } - bool operator >= (pointer_ rhs) const { return hidden_ptr_ >= rhs.hidden_ptr_; } - pointer_& operator++() { ++hidden_ptr_; return *this; } - pointer_& operator--() { --hidden_ptr_; return *this; } - pointer_& operator+=(size_type s) { hidden_ptr_ += s; return *this; } - pointer_ operator+(size_type s) const { return hidden_ptr_ + s; } - pointer_ operator++(int) { pointer_ p = *this; ++hidden_ptr_; return p; } - pointer_ operator--(int) { pointer_ p = *this; --hidden_ptr_; return p; } - U& operator*() const { return *hidden_ptr_; } - - U* hidden_ptr_; - }; - - template - struct const_pointer_ { - const_pointer_(){} - const_pointer_(pointer_ p) : hidden_ptr_(p.hidden_ptr_) {} - const_pointer_(const void* p) : hidden_ptr_((const U*)p) {} - difference_type operator-(pointer_ rhs) const { return hidden_ptr_ - rhs.hidden_ptr_; } - difference_type operator-(const_pointer_ rhs) const { return hidden_ptr_ - rhs.hidden_ptr_; } - const_pointer_ operator-(size_type rhs) const { return hidden_ptr_ - rhs; } - bool operator == (const_pointer_ rhs) const { return hidden_ptr_ == rhs.hidden_ptr_; } - bool operator != (const_pointer_ rhs) const { return hidden_ptr_ != rhs.hidden_ptr_; } - bool operator < (const_pointer_ rhs) const { return hidden_ptr_ < rhs.hidden_ptr_; } - bool operator >= (const_pointer_ rhs) const { return hidden_ptr_ >= rhs.hidden_ptr_; } - const_pointer_& operator++() { ++hidden_ptr_; return *this; } - const_pointer_& operator--() { --hidden_ptr_; return *this; } - const_pointer_& operator+=(size_type s) { hidden_ptr_ += s; return hidden_ptr_; } - const_pointer_ operator+(size_type s) const { return hidden_ptr_ + s; } - const_pointer_ operator++(int) { const_pointer_ p = *this; ++hidden_ptr_; return p; } - const_pointer_ operator--(int) { const_pointer_ p = *this; --hidden_ptr_; return p; } - const U& operator*() const { return *hidden_ptr_; } - - const U* hidden_ptr_; - }; - -public: - typedef pointer_ pointer; - typedef const_pointer_ const_pointer; - - template - struct rebind - { - typedef my_allocator other; - }; - - size_type max_size() const - { return base_.max_size(); } - - pointer allocate(size_type count, const void* hint = 0) { - return pointer(base_.allocate(count, hint)); - } - - void deallocate(const pointer &ptr, size_type s) - { base_.deallocate(ptr.hidden_ptr_, s); } - - template - void construct(const pointer &ptr, BOOST_FWD_REF(P) p) - { ::new(ptr.hidden_ptr_) value_type(::boost::forward

(p)); } - - void destroy(const pointer &ptr) - { (*ptr.hidden_ptr_).~value_type(); } - -}; - -void allocator_test() { - - CB_CONTAINER cb1(10, 0); - const CB_CONTAINER cb2(10, 0); - CB_CONTAINER::allocator_type& alloc_ref = cb1.get_allocator(); - CB_CONTAINER::allocator_type alloc = cb2.get_allocator(); - alloc_ref.max_size(); - alloc.max_size(); - - generic_test(cb1); - - - CB_CONTAINER > cb_a(10, 0); - generic_test(cb_a); -} - -#if !defined(BOOST_NO_CXX11_ALLOCATOR) -template -class cxx11_allocator { -public: - typedef T value_type; - - cxx11_allocator() { - } - - template - cxx11_allocator(const cxx11_allocator &) { - } - - T* allocate(std::size_t n) { - return static_cast(::operator new(n * sizeof(T))); - } - - void deallocate(T * p, std::size_t n) { - ::operator delete( p ); - } -}; - -void cxx11_allocator_test() { - CB_CONTAINER > cb(10, 0); - generic_test(cb); -} -#endif - -void begin_and_end_test() { - - vector v; - v.push_back(11); - v.push_back(12); - v.push_back(13); - - CB_CONTAINER cb1(10, v.begin(), v.end()); - const CB_CONTAINER cb2(10, v.begin(), v.end()); - - CB_CONTAINER cb3(10); - cb3.push_back(1); - cb3.push_back(2); - cb3.insert(cb3.begin(), 3); - int i = 0; - CB_CONTAINER::const_iterator it = cb3.begin(); - for (; it != cb3.end(); it++) { - i += *it; - } - CB_CONTAINER cb4(20); - const CB_CONTAINER cb5(20); - - BOOST_CHECK(*cb1.begin() == 11); - BOOST_CHECK(*cb2.begin() == 11); - BOOST_CHECK(i == 6); - BOOST_CHECK(cb4.begin() == cb4.end()); - BOOST_CHECK(cb5.begin() == cb5.end()); - - generic_test(cb1); - generic_test(cb3); - generic_test(cb4); -} - -void rbegin_and_rend_test() { - - vector v; - v.push_back(11); - v.push_back(12); - v.push_back(13); - - CB_CONTAINER cb1(10, v.begin(), v.end()); - const CB_CONTAINER cb2(10, v.begin(), v.end()); - - CB_CONTAINER cb3(3); - cb3.push_back(1); - cb3.push_back(2); - cb3.insert(cb3.begin(), 3); - cb3.push_back(1); - int i = 0; - CB_CONTAINER::reverse_iterator it = cb3.rbegin(); - for (; it != cb3.rend(); it++) { - i += *it; - } - CB_CONTAINER cb4(20); - const CB_CONTAINER cb5(20); - - BOOST_CHECK(*cb1.rbegin() == 13); - BOOST_CHECK(*cb2.rbegin() == 13); - BOOST_CHECK(i == 4); - BOOST_CHECK(cb4.rbegin() == cb4.rend()); - BOOST_CHECK(cb5.rbegin() == cb5.rend()); - - generic_test(cb1); - generic_test(cb3); - generic_test(cb4); -} - -void element_access_and_insert_test() { - - CB_CONTAINER cb(3); - cb.push_back(1); - cb.push_back(2); - cb.insert(cb.begin(), 3); - cb.push_back(4); - const CB_CONTAINER ccb = cb; - - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb[1] == 2); - BOOST_CHECK(cb[2] == 4); - BOOST_CHECK(ccb[2] == 4); - - generic_test(cb); -} - -void at_test() { - -#if !defined(BOOST_NO_EXCEPTIONS) - - CB_CONTAINER cb(3); - cb.push_back(1); - - try { - BOOST_CHECK(cb.at(0) == 1); - } - catch (out_of_range&) { - BOOST_ERROR("An unexpected exception has been thrown!"); - } - - BOOST_CHECK_THROW(cb.at(2), out_of_range); - - generic_test(cb); - -#endif // #if !defined(BOOST_NO_EXCEPTIONS) -} - -void front_and_back_test() { - - CB_CONTAINER cb(1); - cb.push_back(2); - cb.push_back(3); - - BOOST_CHECK(cb.front() == cb.back()); - BOOST_CHECK(cb.back() == 3); - - generic_test(cb); -} - -void linearize_test() { - - vector v; - v.push_back(1); - v.push_back(2); - v.push_back(3); - v.push_back(4); - v.push_back(5); - v.push_back(6); - v.push_back(7); - v.push_back(8); - v.push_back(9); - v.push_back(10); - v.push_back(11); - v.push_back(12); - CB_CONTAINER cb1(10, v.begin(), v.begin() + 10); - cb1.push_back(11); - cb1.push_back(12); - cb1.push_back(13); - CB_CONTAINER cb2(10, v.begin(), v.begin() + 10); - cb2.push_back(11); - cb2.push_back(12); - cb2.push_back(13); - cb2.push_back(14); - cb2.push_back(15); - cb2.push_back(16); - cb2.push_back(17); - CB_CONTAINER cb3(10, v.begin(), v.begin() + 10); - cb3.push_back(11); - cb3.push_back(12); - cb3.push_back(13); - cb3.pop_front(); - cb3.pop_front(); - CB_CONTAINER cb4(5); - CB_CONTAINER cb5(12, v.begin(), v.end()); - cb5.push_back(13); - cb5.push_back(14); - cb5.push_back(15); - cb5.pop_front(); - cb5.pop_front(); - cb5.pop_front(); - cb5.pop_front(); - cb5.pop_front(); - cb5.pop_front(); - CB_CONTAINER cb6(6); - cb6.push_back(-2); - cb6.push_back(-1); - cb6.push_back(0); - cb6.push_back(1); - cb6.push_back(2); - cb6.push_back(3); - cb6.push_back(4); - cb6.push_back(5); - cb6.push_back(6); - cb6.pop_back(); - CB_CONTAINER cb7(6); - cb7.push_back(0); - cb7.push_back(1); - cb7.push_back(2); - cb7.push_back(3); - cb7.push_back(4); - - BOOST_CHECK(!cb1.is_linearized()); - BOOST_CHECK(*cb1.linearize() == 4); - BOOST_CHECK(cb1.is_linearized()); - BOOST_CHECK(cb1.linearize() == cb1.array_one().first); - BOOST_CHECK(&cb1[0] < &cb1[1] - && &cb1[1] < &cb1[2] - && &cb1[2] < &cb1[3] - && &cb1[3] < &cb1[4] - && &cb1[4] < &cb1[5] - && &cb1[5] < &cb1[6] - && &cb1[6] < &cb1[7] - && &cb1[7] < &cb1[8] - && &cb1[8] < &cb1[9]); - BOOST_CHECK(*(cb1.linearize() + 1) == 5); - BOOST_CHECK(*(cb1.linearize() + 2) == 6); - BOOST_CHECK(*(cb1.linearize() + 3) == 7); - BOOST_CHECK(*(cb1.linearize() + 4) == 8); - BOOST_CHECK(*(cb1.linearize() + 5) == 9); - BOOST_CHECK(*(cb1.linearize() + 6) == 10); - BOOST_CHECK(*(cb1.linearize() + 7) == 11); - BOOST_CHECK(*(cb1.linearize() + 8) == 12); - BOOST_CHECK(*(cb1.linearize() + 9) == 13); - BOOST_CHECK(!cb2.is_linearized()); - BOOST_CHECK(*cb2.linearize() == 8); - BOOST_CHECK(cb2.is_linearized()); - BOOST_CHECK(&cb2[0] < &cb2[1] - && &cb2[1] < &cb2[2] - && &cb2[2] < &cb2[3] - && &cb2[3] < &cb2[4] - && &cb2[4] < &cb2[5] - && &cb2[5] < &cb2[6] - && &cb2[6] < &cb2[7] - && &cb2[7] < &cb2[8] - && &cb2[8] < &cb2[9]); - BOOST_CHECK(*(cb2.linearize() + 1) == 9); - BOOST_CHECK(*(cb2.linearize() + 2) == 10); - BOOST_CHECK(*(cb2.linearize() + 3) == 11); - BOOST_CHECK(*(cb2.linearize() + 4) == 12); - BOOST_CHECK(*(cb2.linearize() + 5) == 13); - BOOST_CHECK(*(cb2.linearize() + 6) == 14); - BOOST_CHECK(*(cb2.linearize() + 7) == 15); - BOOST_CHECK(*(cb2.linearize() + 8) == 16); - BOOST_CHECK(*(cb2.linearize() + 9) == 17); - BOOST_CHECK(cb2.is_linearized()); - BOOST_CHECK(*cb3.linearize() == 6); - BOOST_CHECK(cb3.is_linearized()); - BOOST_CHECK(&cb3[0] < &cb3[1] - && &cb3[1] < &cb3[2] - && &cb3[2] < &cb3[3] - && &cb3[3] < &cb3[4] - && &cb3[4] < &cb3[5] - && &cb3[5] < &cb3[6] - && &cb3[6] < &cb3[7]); - BOOST_CHECK(*(cb3.linearize() + 1) == 7); - BOOST_CHECK(*(cb3.linearize() + 2) == 8); - BOOST_CHECK(*(cb3.linearize() + 3) == 9); - BOOST_CHECK(*(cb3.linearize() + 4) == 10); - BOOST_CHECK(*(cb3.linearize() + 5) == 11); - BOOST_CHECK(*(cb3.linearize() + 6) == 12); - BOOST_CHECK(*(cb3.linearize() + 7) == 13); - BOOST_CHECK(cb4.linearize() == 0); - BOOST_CHECK(cb4.is_linearized()); - BOOST_CHECK(*cb5.linearize() == 10); - BOOST_CHECK(cb5.is_linearized()); - BOOST_CHECK(&cb5[0] < &cb5[1] - && &cb5[1] < &cb5[2] - && &cb5[2] < &cb5[3] - && &cb5[3] < &cb5[4] - && &cb5[4] < &cb5[5]); - BOOST_CHECK(*(cb5.linearize() + 1) == 11); - BOOST_CHECK(*(cb5.linearize() + 2) == 12); - BOOST_CHECK(*(cb5.linearize() + 3) == 13); - BOOST_CHECK(*(cb5.linearize() + 4) == 14); - BOOST_CHECK(*(cb5.linearize() + 5) == 15); - BOOST_CHECK(*cb6.linearize() == 1); - BOOST_CHECK(cb6.is_linearized()); - BOOST_CHECK(&cb6[0] < &cb6[1] - && &cb6[1] < &cb6[2] - && &cb6[2] < &cb6[3] - && &cb6[3] < &cb6[4]); - BOOST_CHECK(*(cb6.linearize() + 1) == 2); - BOOST_CHECK(*(cb6.linearize() + 2) == 3); - BOOST_CHECK(*(cb6.linearize() + 3) == 4); - BOOST_CHECK(*(cb6.linearize() + 4) == 5); - BOOST_CHECK(cb7.is_linearized()); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); - generic_test(cb5); - generic_test(cb6); - generic_test(cb7); -} - -void array_range_test() { - - CB_CONTAINER cb(7); - CB_CONTAINER::array_range a1 = cb.array_one(); - CB_CONTAINER::array_range a2 = cb.array_two(); - CB_CONTAINER::const_array_range ca1 = cb.array_one(); - CB_CONTAINER::const_array_range ca2 = cb.array_two(); - - BOOST_CHECK(a1.second == 0); - BOOST_CHECK(a2.second == 0); - BOOST_CHECK(ca1.second == 0); - BOOST_CHECK(ca2.second == 0); - - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - a1 = cb.array_one(); - a2 = cb.array_two(); - ca1 = cb.array_one(); - ca2 = cb.array_two(); - - BOOST_CHECK(a1.first[0] == 1); - BOOST_CHECK(a1.first[2] == 3); - BOOST_CHECK(ca1.first[0] == 1); - BOOST_CHECK(ca1.first[2] == 3); - BOOST_CHECK(a1.second == 3); - BOOST_CHECK(a2.second == 0); - BOOST_CHECK(ca1.second == 3); - BOOST_CHECK(ca2.second == 0); - - cb.push_back(4); - cb.push_back(5); - cb.push_back(6); - cb.push_back(7); - cb.push_back(8); - cb.push_back(9); - cb.push_back(10); - a1 = cb.array_one(); - a2 = cb.array_two(); - ca1 = cb.array_one(); - ca2 = cb.array_two(); - - BOOST_CHECK(a1.first[0] == 4); - BOOST_CHECK(a1.first[3] == 7); - BOOST_CHECK(a2.first[0] == 8); - BOOST_CHECK(a2.first[2] == 10); - BOOST_CHECK(ca1.first[0] == 4); - BOOST_CHECK(ca1.first[3] == 7); - BOOST_CHECK(ca2.first[0] == 8); - BOOST_CHECK(ca2.first[2] == 10); - BOOST_CHECK(a1.second == 4); - BOOST_CHECK(a2.second == 3); - BOOST_CHECK(ca1.second == 4); - BOOST_CHECK(ca2.second == 3); - - cb.pop_front(); - cb.pop_back(); - a1 = cb.array_one(); - a2 = cb.array_two(); - ca1 = cb.array_one(); - ca2 = cb.array_two(); - - BOOST_CHECK(a1.first[0] == 5); - BOOST_CHECK(a1.first[2] == 7); - BOOST_CHECK(a2.first[0] == 8); - BOOST_CHECK(a2.first[1] == 9); - BOOST_CHECK(ca1.first[0] == 5); - BOOST_CHECK(ca1.first[2] == 7); - BOOST_CHECK(ca2.first[0] == 8); - BOOST_CHECK(ca2.first[1] == 9); - BOOST_CHECK(a1.second == 3); - BOOST_CHECK(a2.second == 2); - BOOST_CHECK(ca1.second == 3); - BOOST_CHECK(ca2.second == 2); - - cb.pop_back(); - cb.pop_back(); - cb.pop_back(); - a1 = cb.array_one(); - a2 = cb.array_two(); - ca1 = cb.array_one(); - ca2 = cb.array_two(); - - BOOST_CHECK(a1.first[0] == 5); - BOOST_CHECK(a1.first[1] == 6); - BOOST_CHECK(ca1.first[0] == 5); - BOOST_CHECK(ca1.first[1] == 6); - BOOST_CHECK(a1.second == 2); - BOOST_CHECK(a2.second == 0); - BOOST_CHECK(ca1.second == 2); - BOOST_CHECK(ca2.second == 0); - - CB_CONTAINER cb0(0); - a1 = cb0.array_one(); - a2 = cb0.array_two(); - - BOOST_CHECK(a1.second == 0); - BOOST_CHECK(a2.second == 0); - - const CB_CONTAINER ccb(10, 1); - ca1 = ccb.array_one(); - ca2 = ccb.array_two(); - - BOOST_CHECK(ca1.second == 10); - BOOST_CHECK(*(ca1.first) == 1); - BOOST_CHECK(ca2.second == 0); - - generic_test(cb); - generic_test(cb0); -} - -void capacity_and_reserve_test() { - - CB_CONTAINER cb1(0); - CB_CONTAINER cb2(10); - - BOOST_CHECK(cb1.capacity() == 0); - BOOST_CHECK(cb1.size() == 0); - BOOST_CHECK(cb1.reserve() == 0); - BOOST_CHECK(cb1.full()); - BOOST_CHECK(cb1.empty()); - BOOST_CHECK(cb1.reserve() == cb1.capacity() - cb1.size()); - BOOST_CHECK(cb2.capacity() == 10); - BOOST_CHECK(cb2.size() == 0); - BOOST_CHECK(cb2.reserve() == 10); - BOOST_CHECK(cb2.reserve() == cb2.capacity() - cb2.size()); - - cb1.push_back(1); - cb2.push_back(2); - cb2.push_back(2); - cb2.push_back(2); - - BOOST_CHECK(cb1.capacity() == 0); - BOOST_CHECK(cb1.size() == 0); - BOOST_CHECK(cb1.reserve() == 0); - BOOST_CHECK(cb1.full()); - BOOST_CHECK(cb1.empty()); - BOOST_CHECK(cb1.reserve() == cb1.capacity() - cb1.size()); - BOOST_CHECK(cb2.capacity() == 10); - BOOST_CHECK(cb2.size() == 3); - BOOST_CHECK(cb2.reserve() == 7); - BOOST_CHECK(cb2.reserve() == cb2.capacity() - cb2.size()); - - generic_test(cb1); - generic_test(cb2); -} - -void full_and_empty_test() { - - CB_CONTAINER cb1(10); - CB_CONTAINER cb2(3); - CB_CONTAINER cb3(2); - CB_CONTAINER cb4(2); - cb2.push_back(1); - cb2.push_back(3); - cb2.push_back(1); - cb2.push_back(1); - cb2.push_back(1); - cb3.push_back(3); - cb3.push_back(1); - cb4.push_back(1); - - BOOST_CHECK(cb1.empty()); - BOOST_CHECK(cb2.full()); - BOOST_CHECK(cb3.full()); - BOOST_CHECK(!cb4.empty()); - BOOST_CHECK(!cb4.full()); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); -} - -void set_capacity_test() { - - CB_CONTAINER cb1(10); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(1); - cb1.set_capacity(5); - CB_CONTAINER cb2(3); - cb2.push_back(2); - cb2.push_back(3); - cb2.push_back(1); - cb2.set_capacity(10); - CB_CONTAINER cb3(5); - cb3.push_back(2); - cb3.push_back(3); - cb3.push_back(1); - cb3.set_capacity(2); - - BOOST_CHECK(cb1.size() == 3); - BOOST_CHECK(cb1[0] == 2); - BOOST_CHECK(cb1[2] == 1); - BOOST_CHECK(cb1.capacity() == 5); - BOOST_CHECK(cb2.size() == 3); - BOOST_CHECK(cb2[0] == 2); - BOOST_CHECK(cb2[2] == 1); - BOOST_CHECK(cb2.capacity() == 10); - BOOST_CHECK(cb3.size() == 2); - BOOST_CHECK(cb3[0] == 2); - BOOST_CHECK(cb3[1] == 3); - BOOST_CHECK(cb3.capacity() == 2); - - cb3.set_capacity(2); - - BOOST_CHECK(cb3.size() == 2); - BOOST_CHECK(cb3[0] == 2); - BOOST_CHECK(cb3[1] == 3); - BOOST_CHECK(cb3.capacity() == 2); - - cb3.set_capacity(0); - - BOOST_CHECK(cb3.size() == 0); - BOOST_CHECK(cb3.capacity() == 0); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); -} - -void rset_capacity_test() { - - CB_CONTAINER cb1(10); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(1); - cb1.rset_capacity(5); - CB_CONTAINER cb2(3); - cb2.push_back(2); - cb2.push_back(3); - cb2.push_back(1); - cb2.rset_capacity(10); - CB_CONTAINER cb3(5); - cb3.push_back(2); - cb3.push_back(3); - cb3.push_back(1); - cb3.rset_capacity(2); - - BOOST_CHECK(cb1.size() == 3); - BOOST_CHECK(cb1[0] == 2); - BOOST_CHECK(cb1[2] == 1); - BOOST_CHECK(cb1.capacity() == 5); - BOOST_CHECK(cb2.size() == 3); - BOOST_CHECK(cb2[0] == 2); - BOOST_CHECK(cb2[2] == 1); - BOOST_CHECK(cb2.capacity() == 10); - BOOST_CHECK(cb3.size() == 2); - BOOST_CHECK(cb3[0] == 3); - BOOST_CHECK(cb3[1] == 1); - BOOST_CHECK(cb3.capacity() == 2); - - cb3.rset_capacity(2); - - BOOST_CHECK(cb3.size() == 2); - BOOST_CHECK(cb3[0] == 3); - BOOST_CHECK(cb3[1] == 1); - BOOST_CHECK(cb3.capacity() == 2); - - cb3.rset_capacity(0); - - BOOST_CHECK(cb3.size() == 0); - BOOST_CHECK(cb3.capacity() == 0); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); -} - -void resize_test() { - - CB_CONTAINER cb1(10); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - cb1.resize(20, 5); - CB_CONTAINER cb2(10); - cb2.push_back(1); - cb2.push_back(2); - cb2.push_back(3); - cb2.push_back(4); - cb2.resize(2); - CB_CONTAINER cb3(10, 1); - cb3.resize(0); - CB_CONTAINER cb4(10, 1); - cb4.resize(10); - - BOOST_CHECK(cb1.size() == 20); - BOOST_CHECK(cb1.capacity() == 20); - BOOST_CHECK(cb1[0] == 1); - BOOST_CHECK(cb1[3] == 4); - BOOST_CHECK(cb1[4] == 5); - BOOST_CHECK(cb1[19] == 5); - BOOST_CHECK(cb2.size() == 2); - BOOST_CHECK(cb2.capacity() == 10); - BOOST_CHECK(cb2[0] == 1); - BOOST_CHECK(cb2[1] == 2); - BOOST_CHECK(cb3.size() == 0); - BOOST_CHECK(cb3.capacity() == 10); - BOOST_CHECK(cb4.size() == 10); - BOOST_CHECK(cb4.capacity() == 10); - BOOST_CHECK(cb4[0] == 1); - BOOST_CHECK(cb4[9] == 1); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); -} - -void rresize_test() { - - CB_CONTAINER cb1(10); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - cb1.rresize(20, 5); - CB_CONTAINER cb2(10); - cb2.push_back(1); - cb2.push_back(2); - cb2.push_back(3); - cb2.push_back(4); - cb2.rresize(2); - CB_CONTAINER cb3(10, 1); - cb3.rresize(0); - CB_CONTAINER cb4(10, 1); - cb4.rresize(10); - - BOOST_CHECK(cb1.size() == 20); - BOOST_CHECK(cb1.capacity() == 20); - BOOST_CHECK(cb1[0] == 5); - BOOST_CHECK(cb1[15] == 5); - BOOST_CHECK(cb1[16] == 1); - BOOST_CHECK(cb1[19] == 4); - BOOST_CHECK(cb2.size() == 2); - BOOST_CHECK(cb2.capacity() == 10); - BOOST_CHECK(cb2[0] == 3); - BOOST_CHECK(cb2[1] == 4); - BOOST_CHECK(cb3.size() == 0); - BOOST_CHECK(cb3.capacity() == 10); - BOOST_CHECK(cb4.size() == 10); - BOOST_CHECK(cb4.capacity() == 10); - BOOST_CHECK(cb4[0] == 1); - BOOST_CHECK(cb4[9] == 1); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); -} - -void constructor_test() { - - CB_CONTAINER cb0; - BOOST_CHECK(cb0.capacity() == 0); - BOOST_CHECK(cb0.size() == 0); - - cb0.push_back(1); - cb0.push_back(2); - cb0.push_back(3); - - BOOST_CHECK(cb0.size() == 0); - BOOST_CHECK(cb0.capacity() == 0); - - CB_CONTAINER cb1(3); - CB_CONTAINER cb2(3, 2); - vector v; - v.push_back(1); - v.push_back(2); - v.push_back(3); - v.push_back(4); - v.push_back(5); - CB_CONTAINER cb3(v.begin(), v.end()); - CB_CONTAINER cb4(3, v.begin(), v.end()); - CB_CONTAINER cb5(10, v.begin(), v.end()); - CB_CONTAINER cb6(10, 3, MyInteger(2)); - - BOOST_CHECK(cb1.size() == 0); - BOOST_CHECK(cb1.capacity() == 3); - BOOST_CHECK(cb2[0] == 2); - BOOST_CHECK(cb2.full()); - BOOST_CHECK(cb2[0] == 2); - BOOST_CHECK(cb2[1] == 2); - BOOST_CHECK(cb2[2] == 2); - BOOST_CHECK(cb3.size() == 5); - BOOST_CHECK(cb3.capacity() == 5); - BOOST_CHECK(cb3.full()); - BOOST_CHECK(cb3[0] == 1); - BOOST_CHECK(cb3[4] == 5); - BOOST_CHECK(cb4.size() == 3); - BOOST_CHECK(cb4.capacity() == 3); - BOOST_CHECK(cb4.full()); - BOOST_CHECK(cb4[0] == 3); - BOOST_CHECK(cb4[2] == 5); - BOOST_CHECK(cb5.size() == 5); - BOOST_CHECK(cb5.capacity() == 10); - BOOST_CHECK(!cb5.full()); - BOOST_CHECK(cb5[0] == 1); - BOOST_CHECK(cb5[4] == 5); - BOOST_CHECK(cb6.size() == 3); - BOOST_CHECK(cb6.capacity() == 10); - BOOST_CHECK(!cb6.full()); - BOOST_CHECK(cb6[0] == 2); - BOOST_CHECK(cb6[2] == 2); - - cb5.push_back(6); - cb6.push_back(6); - - BOOST_CHECK(cb5[5] == 6); - BOOST_CHECK(cb5[0] == 1); - BOOST_CHECK(cb5.size() == 6); - BOOST_CHECK(cb6[3] == 6); - BOOST_CHECK(cb6.size() == 4); - BOOST_CHECK(cb6[0] == 2); - -#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS) - - CB_CONTAINER cb7(MyInputIterator(v.begin()), MyInputIterator(v.end())); - CB_CONTAINER cb8(3, MyInputIterator(v.begin()), MyInputIterator(v.end())); - - BOOST_CHECK(cb7.capacity() == 5); - BOOST_CHECK(cb8.capacity() == 3); - -#endif // #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS) - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); - generic_test(cb5); - generic_test(cb6); -} - -void assign_test() { - - CB_CONTAINER cb1(4); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - cb1.push_back(5); - cb1.assign(3, 8); - BOOST_CHECK(cb1.size() == 3); - BOOST_CHECK(cb1.capacity() == 3); - BOOST_CHECK(cb1[0] == 8); - BOOST_CHECK(cb1[2] == 8); - - cb1.assign(6, 7); - BOOST_CHECK(cb1.size() == 6); - BOOST_CHECK(cb1.capacity() == 6); - BOOST_CHECK(cb1[0] == 7); - BOOST_CHECK(cb1[5] == 7); - - CB_CONTAINER cb2(4); - cb2.assign(3, 1.1f); - BOOST_CHECK(cb2[0] == 1.1f); - - CB_CONTAINER cb3(5); - cb3.push_back(1); - cb3.push_back(2); - cb3.push_back(3); - cb3.assign((size_t)10, 1); // The size_t cast is not needed. It is present here just because of testing purposes. - BOOST_CHECK(cb3[0] == 1); - BOOST_CHECK(cb3[9] == 1); - BOOST_CHECK(cb3.size() == 10); - BOOST_CHECK(cb3.capacity() == 10); - -#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS) - - vector v; - v.push_back(1); - v.push_back(2); - v.push_back(3); - v.push_back(4); - v.push_back(5); - - CB_CONTAINER cb4(3); - cb4.assign(MyInputIterator(v.begin()), MyInputIterator(v.end())); - CB_CONTAINER cb5(3); - cb5.assign(4, MyInputIterator(v.begin()), MyInputIterator(v.end())); - - BOOST_CHECK(cb4.capacity() == 5); - BOOST_CHECK(cb5.capacity() == 4); - -#endif // #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS) - - generic_test(cb1); - generic_test(cb3); -} - -void copy_constructor_and_assign_test() { - - CB_CONTAINER cb1(4); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - cb1.push_back(5); - CB_CONTAINER cb2 = cb1; - - BOOST_CHECK(cb1 == cb2); - BOOST_CHECK(cb2.capacity() == 4); - BOOST_CHECK(cb2[0] == 2); - BOOST_CHECK(cb2[3] == 5); - - CB_CONTAINER cb3(20); - cb1.pop_back(); - CB_CONTAINER cb4(3); - cb3 = cb2; - cb3 = cb3; - cb4 = cb1; - CB_CONTAINER cb5 = cb1; - - BOOST_CHECK(cb3 == cb2); - BOOST_CHECK(cb4 == cb1); - BOOST_CHECK(cb2.full()); - BOOST_CHECK(cb2[0] == 2); - BOOST_CHECK(cb3.full()); - BOOST_CHECK(cb3.capacity() == 4); - BOOST_CHECK(cb4.capacity() == 4); - BOOST_CHECK(!cb4.full()); - BOOST_CHECK(*(cb4.end() - 1) == 4); - BOOST_CHECK(cb1 == cb5); - BOOST_CHECK(cb5.capacity() == 4); - BOOST_CHECK(cb2[0] == 2); - BOOST_CHECK(cb2[2] == 4); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); - generic_test(cb5); -} - -void swap_test() { - - CB_CONTAINER cb1(2); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - CB_CONTAINER cb2(5); - cb2.push_back(8); - cb2.swap(cb1); - cb2.swap(cb2); - - BOOST_CHECK(cb2.capacity() == 2); - BOOST_CHECK(cb2[0] == 2); - BOOST_CHECK(cb2.full()); - BOOST_CHECK(cb1.capacity() == 5); - BOOST_CHECK(cb1[0] == 8); - BOOST_CHECK(cb1.size() == 1); - - generic_test(cb1); - generic_test(cb2); -} - -void push_back_test() { - - CB_CONTAINER cb1(5); - cb1.push_back(); - cb1.push_back(MyDefaultConstructible(2)); - BOOST_CHECK(cb1[0].m_n == 1); - BOOST_CHECK(cb1[1].m_n == 2); - - CB_CONTAINER cb2(5); - cb2.push_back(); - BOOST_CHECK(cb2.back() == CB_CONTAINER::value_type()); - - cb2.push_back(1); - BOOST_CHECK(cb2.back() == 1); - - generic_test(cb2); -} - -void pop_back_test() { - - CB_CONTAINER cb(4); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - cb.push_back(4); - cb.push_back(5); - cb.pop_back(); - - BOOST_CHECK(cb.size() == 3); - BOOST_CHECK(!cb.full()); - BOOST_CHECK(cb[0] == 2); - - generic_test(cb); -} - -void insert_test() { - - CB_CONTAINER cb1(4); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - CB_CONTAINER::iterator it1 = cb1.begin() + 1; - it1 = cb1.insert(it1, 10); - CB_CONTAINER cb2(4); - cb2.push_back(1); - cb2.insert(cb2.begin()); - cb2.insert(cb2.begin(), -1); - CB_CONTAINER::iterator it2 = cb2.begin() + 1; - it2 = cb2.insert(it2, 5); - CB_CONTAINER cb3(2); - cb3.insert(cb3.end(), 10); - cb3.insert(cb3.end(), 20); - cb3.insert(cb3.begin(), 30); - cb3.insert(cb3.end(), 40); - - BOOST_CHECK(cb1[1] == 10); - BOOST_CHECK(*it1 == 10); - BOOST_CHECK(cb1.full()); - BOOST_CHECK(cb2[1] == 5); - BOOST_CHECK(*it2 == 5); - BOOST_CHECK(cb2.full()); - BOOST_CHECK(cb3[0] == 20); - BOOST_CHECK(cb3[1] == 40); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); -} - -void insert_n_test() { - - CB_CONTAINER cb1(4); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.insert(cb1.begin() + 1, 2, 10); - CB_CONTAINER cb2(2, 3); - cb2.insert(cb2.begin(), 10, 5); - CB_CONTAINER cb3(4); - cb3.insert(cb3.end(), 1, 6); - CB_CONTAINER cb4(6); - cb4.push_back(1); - cb4.push_back(2); - cb4.push_back(3); - cb4.push_back(4); - cb4.insert(cb4.begin() + 2, 5, 6); - cb4.insert(cb4.begin() + 2, 0, 7); - - BOOST_CHECK(cb1.full()); - BOOST_CHECK(cb1[0] == 10); - BOOST_CHECK(cb1[1] == 10); - BOOST_CHECK(cb1[2] == 2); - BOOST_CHECK(cb1[3] == 3); - BOOST_CHECK(cb2[0] == 3); - BOOST_CHECK(cb2[1] == 3); - BOOST_CHECK(cb3[0] == 6); - BOOST_CHECK(cb3.size() == 1); - BOOST_CHECK(cb4.size() == 6); - BOOST_CHECK(cb4[0] == 6); - BOOST_CHECK(cb4[1] == 6); - BOOST_CHECK(cb4[2] == 6); - BOOST_CHECK(cb4[3] == 6); - BOOST_CHECK(cb4[4] == 3); - BOOST_CHECK(cb4[5] == 4); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); -} - -void insert_range_test() { - - vector v; - v.push_back(11); - v.push_back(12); - v.push_back(13); - CB_CONTAINER cb1(4); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.insert(cb1.begin() + 1, v.begin(), v.end()); - CB_CONTAINER cb2(2, 2); - cb2.insert(cb2.end(), v.begin(), v.end()); - CB_CONTAINER cb3(5); - cb3.insert(cb3.end(), v.end(), v.end()); - CB_CONTAINER cb4(5); - cb4.insert(cb4.end(), v.begin(), v.begin() + 1); - MyInteger array[] = { 5, 6, 7, 8, 9 }; - CB_CONTAINER cb5(6); - cb5.push_back(1); - cb5.push_back(2); - cb5.push_back(3); - cb5.push_back(4); - cb5.insert(cb5.begin() + 2, array, array + 5); - cb5.insert(cb5.begin(), array, array + 5); - - BOOST_CHECK(cb1.full()); - BOOST_CHECK(cb1[0] == 12); - BOOST_CHECK(cb1[1] == 13); - BOOST_CHECK(cb1[2] == 2); - BOOST_CHECK(cb1[3] == 3); - BOOST_CHECK(cb2[0] == 12); - BOOST_CHECK(cb2[1] == 13); - BOOST_CHECK(cb3.empty()); - BOOST_CHECK(cb4[0] == 11); - BOOST_CHECK(cb4.size() == 1); - BOOST_CHECK(cb5.size() == 6); - BOOST_CHECK(cb5[0] == 6); - BOOST_CHECK(cb5[1] == 7); - BOOST_CHECK(cb5[2] == 8); - BOOST_CHECK(cb5[3] == 9); - BOOST_CHECK(cb5[4] == 3); - BOOST_CHECK(cb5[5] == 4); - -#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS) - - v.clear(); - v.push_back(1); - v.push_back(2); - v.push_back(3); - v.push_back(4); - v.push_back(5); - - CB_CONTAINER cb6(4); - cb6.push_back(0); - cb6.push_back(-1); - cb6.push_back(-2); - cb6.insert(cb6.begin() + 1, MyInputIterator(v.begin()), MyInputIterator(v.end())); - v.clear(); - v.push_back(11); - v.push_back(12); - v.push_back(13); - CB_CONTAINER cb7(4); - cb7.push_back(1); - cb7.push_back(2); - cb7.push_back(3); - cb7.insert(cb7.begin() + 1, MyInputIterator(v.begin()), MyInputIterator(v.end())); - CB_CONTAINER cb8(2, 2); - cb8.insert(cb8.end(), MyInputIterator(v.begin()), MyInputIterator(v.end())); - CB_CONTAINER cb9(5); - cb9.insert(cb9.end(), MyInputIterator(v.end()), MyInputIterator(v.end())); - CB_CONTAINER cb10(5); - cb10.insert(cb10.end(), MyInputIterator(v.begin()), MyInputIterator(v.begin() + 1)); - v.clear(); - v.push_back(5); - v.push_back(6); - v.push_back(7); - v.push_back(8); - v.push_back(9); - CB_CONTAINER cb11(6); - cb11.push_back(1); - cb11.push_back(2); - cb11.push_back(3); - cb11.push_back(4); - cb11.insert(cb11.begin() + 2, MyInputIterator(v.begin()), MyInputIterator(v.begin() + 5)); - cb11.insert(cb11.begin(), MyInputIterator(v.begin()), MyInputIterator(v.begin() + 5)); - - BOOST_CHECK(cb6.capacity() == 4); - BOOST_CHECK(cb6[0] == 4); - BOOST_CHECK(cb6[3] == -2); - BOOST_CHECK(cb7.full()); - BOOST_CHECK(cb7[0] == 12); - BOOST_CHECK(cb7[1] == 13); - BOOST_CHECK(cb7[2] == 2); - BOOST_CHECK(cb7[3] == 3); - BOOST_CHECK(cb8[0] == 12); - BOOST_CHECK(cb8[1] == 13); - BOOST_CHECK(cb9.empty()); - BOOST_CHECK(cb10[0] == 11); - BOOST_CHECK(cb10.size() == 1); - BOOST_CHECK(cb11.size() == 6); - BOOST_CHECK(cb11[0] == 6); - BOOST_CHECK(cb11[1] == 7); - BOOST_CHECK(cb11[2] == 8); - BOOST_CHECK(cb11[3] == 9); - BOOST_CHECK(cb11[4] == 3); - BOOST_CHECK(cb11[5] == 4); - -#endif // #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS) - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); - generic_test(cb5); -} - -void push_front_test() { - - CB_CONTAINER cb1(5); - cb1.push_front(); - cb1.push_front(MyDefaultConstructible(2)); - BOOST_CHECK(cb1[0].m_n == 2); - BOOST_CHECK(cb1[1].m_n == 1); - - CB_CONTAINER cb2(5); - cb2.push_front(); - BOOST_CHECK(cb2.front() == CB_CONTAINER::value_type()); - - cb2.push_front(1); - BOOST_CHECK(cb2.front() == 1); - - CB_CONTAINER cb3(0); - cb3.push_front(10); - BOOST_CHECK(cb3.empty()); - - generic_test(cb2); - generic_test(cb3); -} - -void pop_front_test() { - - CB_CONTAINER cb(4); - cb.push_front(1); - cb.push_front(2); - cb.push_front(3); - cb.push_front(4); - cb.push_front(5); - cb.pop_front(); - - BOOST_CHECK(cb.size() == 3); - BOOST_CHECK(!cb.full()); - BOOST_CHECK(cb[0] == 4); - - generic_test(cb); -} - -void rinsert_test() { - - CB_CONTAINER cb1(4); - cb1.push_front(1); - cb1.push_front(2); - cb1.push_front(3); - CB_CONTAINER::iterator it1 = cb1.begin() + 1; - it1 = cb1.rinsert(it1, 10); - CB_CONTAINER cb2(4); - cb2.push_front(1); - cb2.rinsert(cb2.begin()); - cb2.rinsert(cb2.begin(), -1); - CB_CONTAINER::iterator it2 = cb2.end() - 2; - it2 = cb2.rinsert(it2, 5); - CB_CONTAINER cb3(2); - cb3.rinsert(cb3.begin(), 10); - cb3.rinsert(cb3.begin(), 20); - cb3.rinsert(cb3.end(), 30); - cb3.rinsert(cb3.begin(), 40); - CB_CONTAINER cb4(4); - cb4.push_back(1); - cb4.push_back(2); - cb4.push_back(3); - CB_CONTAINER::iterator it3 = cb4.begin() + 1; - it3 = cb4.rinsert(it3, 10); - CB_CONTAINER cb5(4); - cb5.push_back(1); - cb5.rinsert(cb5.begin(), 0); - cb5.rinsert(cb5.begin(), -1); - CB_CONTAINER::iterator it4 = cb5.begin() + 1; - it4 = cb5.rinsert(it4, 5); - CB_CONTAINER cb6(2); - cb6.rinsert(cb6.end(), 10); - cb6.rinsert(cb6.end(), 20); - cb6.rinsert(cb6.begin(), 30); - cb6.rinsert(cb6.end(), 40); - CB_CONTAINER cb7(6); - cb7.push_back(1); - cb7.push_back(2); - cb7.push_back(3); - cb7.push_back(4); - cb7.rinsert(cb7.begin() + 2, 5, 6); - - BOOST_CHECK(cb1[1] == 10); - BOOST_CHECK(*it1 == 10); - BOOST_CHECK(cb1.full()); - BOOST_CHECK(cb2[1] == 5); - BOOST_CHECK(*it2 == 5); - BOOST_CHECK(cb2.full()); - BOOST_CHECK(cb2[3] == 1); - BOOST_CHECK(cb3[0] == 40); - BOOST_CHECK(cb3[1] == 20); - BOOST_CHECK(cb4[1] == 10); - BOOST_CHECK(*it3 == 10); - BOOST_CHECK(cb4.full()); - BOOST_CHECK(cb5[1] == 5); - BOOST_CHECK(*it4 == 5); - BOOST_CHECK(cb5.full()); - BOOST_CHECK(cb6[0] == 30); - BOOST_CHECK(cb6[1] == 10); - BOOST_CHECK(cb7.size() == 6); - BOOST_CHECK(cb7[0] == 1); - BOOST_CHECK(cb7[1] == 2); - BOOST_CHECK(cb7[2] == 6); - BOOST_CHECK(cb7[3] == 6); - BOOST_CHECK(cb7[4] == 6); - BOOST_CHECK(cb7[5] == 6); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); - generic_test(cb5); - generic_test(cb6); - generic_test(cb7); -} - -void rinsert_n_test() { - - CB_CONTAINER cb1(4); - cb1.push_front(1); - cb1.push_front(2); - cb1.push_front(3); - cb1.rinsert(cb1.begin() + 1, 2, 10); - CB_CONTAINER cb2(2, 3); - cb2.rinsert(cb2.begin(), 10, 5); - CB_CONTAINER cb3(4); - cb3.rinsert(cb3.end(), 1, 6); - CB_CONTAINER cb4(4); - cb4.push_back(1); - cb4.push_back(2); - cb4.push_back(3); - cb4.rinsert(cb4.begin() + 1, 2, 10); - MyInteger array[] = { 5, 6, 7, 8, 9 }; - CB_CONTAINER cb5(6); - cb5.push_back(1); - cb5.push_back(2); - cb5.push_back(3); - cb5.push_back(4); - cb5.rinsert(cb5.begin() + 2, array, array + 5); - cb5.rinsert(cb5.end(), array, array + 5); - - BOOST_CHECK(cb1.full()); - BOOST_CHECK(cb1[0] == 3); - BOOST_CHECK(cb1[1] == 10); - BOOST_CHECK(cb1[2] == 10); - BOOST_CHECK(cb1[3] == 2); - BOOST_CHECK(cb2[0] == 5); - BOOST_CHECK(cb2[1] == 5); - BOOST_CHECK(cb3[0] == 6); - BOOST_CHECK(cb3.size() == 1); - BOOST_CHECK(cb4.full()); - BOOST_CHECK(cb4[0] == 1); - BOOST_CHECK(cb4[1] == 10); - BOOST_CHECK(cb4[2] == 10); - BOOST_CHECK(cb4[3] == 2); - BOOST_CHECK(cb5.size() == 6); - BOOST_CHECK(cb5[0] == 1); - BOOST_CHECK(cb5[1] == 2); - BOOST_CHECK(cb5[2] == 5); - BOOST_CHECK(cb5[3] == 6); - BOOST_CHECK(cb5[4] == 7); - BOOST_CHECK(cb5[5] == 8); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); - generic_test(cb5); -} - -void rinsert_range_test() { - - vector v; - v.push_back(11); - v.push_back(12); - v.push_back(13); - v.push_back(14); - CB_CONTAINER cb1(4); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.rinsert(cb1.begin() + 1, v.begin(), v.end()); - CB_CONTAINER cb2(2, 2); - cb2.rinsert(cb2.begin(), v.begin(), v.end()); - CB_CONTAINER cb3(5); - cb3.rinsert(cb3.begin(), v.end(), v.end()); - CB_CONTAINER cb4(5); - cb4.rinsert(cb4.begin(), v.begin(), v.begin() + 1); - - BOOST_CHECK(cb1.full()); - BOOST_CHECK(cb1[0] == 1); - BOOST_CHECK(cb1[1] == 11); - BOOST_CHECK(cb1[2] == 12); - BOOST_CHECK(cb1[3] == 13); - BOOST_CHECK(cb2[0] == 11); - BOOST_CHECK(cb2[1] == 12); - BOOST_CHECK(cb3.empty()); - BOOST_CHECK(cb4[0] == 11); - BOOST_CHECK(cb4.size() == 1); - -#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS) - - v.clear(); - v.push_back(1); - v.push_back(2); - v.push_back(3); - v.push_back(4); - v.push_back(5); - - CB_CONTAINER cb10(4); - cb10.push_back(0); - cb10.push_back(-1); - cb10.push_back(-2); - cb10.rinsert(cb10.begin() + 1, MyInputIterator(v.begin()), MyInputIterator(v.end())); - v.clear(); - v.push_back(11); - v.push_back(12); - v.push_back(13); - v.push_back(14); - CB_CONTAINER cb11(4); - cb11.push_back(1); - cb11.push_back(2); - cb11.push_back(3); - cb11.rinsert(cb11.begin() + 1, MyInputIterator(v.begin()), MyInputIterator(v.end())); - CB_CONTAINER cb12(2, 2); - cb12.rinsert(cb12.begin(), MyInputIterator(v.begin()), MyInputIterator(v.end())); - CB_CONTAINER cb13(5); - cb13.rinsert(cb13.begin(), MyInputIterator(v.end()), MyInputIterator(v.end())); - CB_CONTAINER cb14(5); - cb14.rinsert(cb14.begin(), MyInputIterator(v.begin()), MyInputIterator(v.begin() + 1)); - - BOOST_CHECK(cb10.capacity() == 4); - BOOST_CHECK(cb10[0] == 0); - BOOST_CHECK(cb10[3] == 3); - BOOST_CHECK(cb11.full()); - BOOST_CHECK(cb11[0] == 1); - BOOST_CHECK(cb11[1] == 11); - BOOST_CHECK(cb11[2] == 12); - BOOST_CHECK(cb11[3] == 13); - BOOST_CHECK(cb12[0] == 11); - BOOST_CHECK(cb12[1] == 12); - BOOST_CHECK(cb13.empty()); - BOOST_CHECK(cb14[0] == 11); - BOOST_CHECK(cb14.size() == 1); - -#endif // #if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS) - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); -} - -void erase_test() { - - CB_CONTAINER cb1(4); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - CB_CONTAINER::iterator it1 = cb1.erase(cb1.begin() + 1); - - CB_CONTAINER cb2(1, 1); - CB_CONTAINER::iterator it2 = cb2.erase(cb2.begin()); - - CB_CONTAINER cb3(4); - cb3.push_back(1); - cb3.push_back(2); - cb3.push_back(3); - CB_CONTAINER::iterator it3 = cb3.erase(cb3.begin() + 2); - - BOOST_CHECK(cb1.size() == 2); - BOOST_CHECK(cb1.capacity() == 4); - BOOST_CHECK(*it1 == 3); - BOOST_CHECK(cb1[0] == 1); - BOOST_CHECK(cb1[1] == 3); - BOOST_CHECK(cb2.size() == 0); - BOOST_CHECK(cb2.capacity() == 1); - BOOST_CHECK(it2 == cb2.end()); - BOOST_CHECK(cb3.size() == 2); - BOOST_CHECK(cb3.capacity() == 4); - BOOST_CHECK(it3 == cb3.end()); - BOOST_CHECK(cb3[0] == 1); - BOOST_CHECK(cb3[1] == 2); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); -} - -void erase_range_test() { - - CB_CONTAINER cb1(4); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - CB_CONTAINER::iterator it1 = cb1.erase(cb1.begin() + 1, cb1.begin() + 3); - - CB_CONTAINER cb2(4); - cb2.push_back(1); - cb2.push_back(2); - cb2.push_back(3); - cb2.push_back(4); - CB_CONTAINER::iterator it2 = cb2.erase(cb2.begin(), cb2.begin()); - - CB_CONTAINER cb3(4); - cb3.push_back(1); - cb3.push_back(2); - cb3.push_back(3); - cb3.push_back(4); - CB_CONTAINER::iterator it3 = cb3.erase(cb3.begin() + 2, cb3.end()); - - CB_CONTAINER cb4(10, 1); - CB_CONTAINER::iterator it4 = cb4.erase(cb4.begin(), cb4.end()); - - BOOST_CHECK(cb1.size() == 2); - BOOST_CHECK(cb1.capacity() == 4); - BOOST_CHECK(cb1[0] == 1); - BOOST_CHECK(cb1[1] == 4); - BOOST_CHECK(*it1 == 4); - BOOST_CHECK(cb2.size() == 4); - BOOST_CHECK(cb2[0] == 1); - BOOST_CHECK(cb2[3] == 4); - BOOST_CHECK(*it2 == 1); - BOOST_CHECK(cb3.size() == 2); - BOOST_CHECK(cb3.capacity() == 4); - BOOST_CHECK(cb3[0] == 1); - BOOST_CHECK(cb3[1] == 2); - BOOST_CHECK(it3 == cb3.end()); - BOOST_CHECK(cb4.size() == 0); - BOOST_CHECK(cb4.capacity() == 10); - BOOST_CHECK(it4 == cb4.end()); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); -} - -void rerase_test() { - - CB_CONTAINER cb1(4); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - CB_CONTAINER::iterator it1 = cb1.rerase(cb1.begin() + 1); - - CB_CONTAINER cb2(1, 1); - CB_CONTAINER::iterator it2 = cb2.rerase(cb2.begin()); - - CB_CONTAINER cb3(4); - cb3.push_back(1); - cb3.push_back(2); - cb3.push_back(3); - CB_CONTAINER::iterator it3 = cb3.rerase(cb3.begin()); - - BOOST_CHECK(cb1.size() == 2); - BOOST_CHECK(cb1.capacity() == 4); - BOOST_CHECK(*it1 == 1); - BOOST_CHECK(cb1[0] == 1); - BOOST_CHECK(cb1[1] == 3); - BOOST_CHECK(cb2.size() == 0); - BOOST_CHECK(cb2.capacity() == 1); - BOOST_CHECK(it2 == cb2.begin()); - BOOST_CHECK(cb3.size() == 2); - BOOST_CHECK(cb3.capacity() == 4); - BOOST_CHECK(it3 == cb3.begin()); - BOOST_CHECK(*it3 == 2); - BOOST_CHECK(cb3[0] == 2); - BOOST_CHECK(cb3[1] == 3); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); -} - -void rerase_range_test() { - - CB_CONTAINER cb1(4); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - CB_CONTAINER::iterator it1 = cb1.rerase(cb1.begin() + 1, cb1.begin() + 3); - - CB_CONTAINER cb2(4); - cb2.push_back(1); - cb2.push_back(2); - cb2.push_back(3); - cb2.push_back(4); - CB_CONTAINER::iterator it2 = cb2.rerase(cb2.begin(), cb2.begin()); - - CB_CONTAINER cb3(4); - cb3.push_back(1); - cb3.push_back(2); - cb3.push_back(3); - cb3.push_back(4); - CB_CONTAINER::iterator it3 = cb3.rerase(cb3.begin(), cb3.begin() + 2); - - CB_CONTAINER cb4(10, 1); - CB_CONTAINER::iterator it4 = cb4.rerase(cb4.begin(), cb4.end()); - - BOOST_CHECK(cb1.size() == 2); - BOOST_CHECK(cb1.capacity() == 4); - BOOST_CHECK(cb1[0] == 1); - BOOST_CHECK(cb1[1] == 4); - BOOST_CHECK(*it1 == 1); - BOOST_CHECK(cb2.size() == 4); - BOOST_CHECK(cb2[0] == 1); - BOOST_CHECK(cb2[3] == 4); - BOOST_CHECK(*it2 == 1); - BOOST_CHECK(cb3.size() == 2); - BOOST_CHECK(cb3.capacity() == 4); - BOOST_CHECK(cb3[0] == 3); - BOOST_CHECK(cb3[1] == 4); - BOOST_CHECK(it3 == cb3.begin()); - BOOST_CHECK(cb4.size() == 0); - BOOST_CHECK(cb4.capacity() == 10); - BOOST_CHECK(it4 == cb4.begin()); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); -} - -void clear_test() { - - CB_CONTAINER cb(4); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - cb.push_back(4); - cb.clear(); - - BOOST_CHECK(cb.empty()); - - generic_test(cb); -} - -void equality_test() { - - CB_CONTAINER cb1(4); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - CB_CONTAINER cb2(10); - cb2.push_back(1); - cb2.push_back(2); - cb2.push_back(3); - cb2.push_back(4); - - BOOST_CHECK(cb1 == cb2); - BOOST_CHECK(!(cb2 != cb1)); - - generic_test(cb1); - generic_test(cb2); -} - -void lexicographical_comparison_test() { - - CB_CONTAINER cb1(10); - cb1.push_back('a'); - cb1.push_back('d'); - cb1.push_back('a'); - cb1.push_back('m'); - CB_CONTAINER cb2(5); - cb2.push_back('j'); - cb2.push_back('o'); - cb2.push_back('h'); - cb2.push_back('n'); - - BOOST_CHECK(cb2 > cb1); - BOOST_CHECK(cb1 < cb2); -} - -void assign_range_test() { - - vector v; - v.push_back(11); - v.push_back(12); - v.push_back(13); - CB_CONTAINER cb1(4); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.assign(v.begin() + 1, v.end()); - CB_CONTAINER cb2(2); - cb2.push_back(1); - cb2.push_back(2); - cb2.assign(v.begin(), v.end()); - - BOOST_CHECK(cb1.capacity() == 2); - BOOST_CHECK(cb1[0] == 12); - BOOST_CHECK(cb1[1] == 13); - BOOST_CHECK(cb2.full()); - BOOST_CHECK(cb2.capacity() == 3); - BOOST_CHECK(cb2[0] == 11); - BOOST_CHECK(cb2[1] == 12); - BOOST_CHECK(cb2[2] == 13); - BOOST_CHECK(cb2.size() == (size_t)distance(v.begin(), v.end())); - - generic_test(cb1); - generic_test(cb2); -} - -// test of the example (introduced in the documentation) -void example_test() { - - CB_CONTAINER cb1(3); - cb1.push_back(1); - cb1.push_back(2); - - BOOST_CHECK(cb1[0] == 1); - BOOST_CHECK(cb1[1] == 2); - BOOST_CHECK(!cb1.full()); - BOOST_CHECK(cb1.size() == 2); - BOOST_CHECK(cb1.capacity() == 3); - - cb1.push_back(3); - cb1.push_back(4); - int sum = accumulate(cb1.begin(), cb1.end(), 0); - - BOOST_CHECK(cb1[0] == 2); - BOOST_CHECK(cb1[1] == 3); - BOOST_CHECK(cb1[2] == 4); - BOOST_CHECK(*cb1.begin() == 2); - BOOST_CHECK(cb1.front() == 2); - BOOST_CHECK(cb1.back() == 4); - BOOST_CHECK(sum == 9); - BOOST_CHECK(cb1.full()); - BOOST_CHECK(cb1.size() == 3); - BOOST_CHECK(cb1.capacity() == 3); - - CB_CONTAINER cb2(5, 1); - cb2.insert(cb2.begin(), 2); - - BOOST_CHECK(cb2[0] == 1); - BOOST_CHECK(cb2[1] == 1); - BOOST_CHECK(cb2[2] == 1); - BOOST_CHECK(cb2[3] == 1); - BOOST_CHECK(cb2[4] == 1); - - vector v; - v.push_back(100); - v.push_back(200); - v.push_back(300); - cb2.insert(cb2.begin() + 1, v.begin(), v.end()); - - BOOST_CHECK(cb2[0] == 300); - BOOST_CHECK(cb2[1] == 1); - BOOST_CHECK(cb2[2] == 1); - BOOST_CHECK(cb2[3] == 1); - BOOST_CHECK(cb2[4] == 1); - - CB_CONTAINER cb3(3); - cb3.push_back(1); - cb3.push_back(2); - cb3.push_back(3); - - BOOST_CHECK(cb3[0] == 1); - BOOST_CHECK(cb3[1] == 2); - BOOST_CHECK(cb3[2] == 3); - - cb3.push_back(4); - cb3.push_back(5); - - BOOST_CHECK(cb3[0] == 3); - BOOST_CHECK(cb3[1] == 4); - BOOST_CHECK(cb3[2] == 5); - - cb3.pop_back(); - cb3.pop_front(); - - BOOST_CHECK(cb3[0] == 4); -} - -void element_destruction_test() { - - CB_CONTAINER cb(5); - cb.push_back(InstanceCounter()); - cb.push_back(InstanceCounter()); - cb.push_back(InstanceCounter()); - int prevCount = InstanceCounter::count(); - cb.clear(); - - BOOST_CHECK(cb.empty()); - BOOST_CHECK(prevCount == 3); - BOOST_CHECK(InstanceCounter::count() == 0); -} - -void const_methods_test() { - - vector v; - v.push_back(1); - v.push_back(2); - v.push_back(3); - v.push_back(4); - v.push_back(5); - const CB_CONTAINER cb(5, v.begin(), v.end()); - - BOOST_CHECK(*cb.begin() == 1); - BOOST_CHECK(*(cb.end() - 1) == 5); - BOOST_CHECK(*cb.rbegin() == 5); - BOOST_CHECK(*(cb.rend() - 1) == 1); - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb.at(1) == 2); - BOOST_CHECK(cb.front() == 1); - BOOST_CHECK(cb.back() == 5); -} - -void rotate_test() { - - CB_CONTAINER cb1(10); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - cb1.push_back(5); - cb1.push_back(6); - cb1.push_back(7); - CB_CONTAINER cb2 = cb1; - CB_CONTAINER::iterator it1 = cb1.begin() + 2; - int v1_0 = *it1; - int v1_1 = *(it1 + 1); - int v1_2 = *(it1 + 2); - int v1_3 = *(it1 + 3); - int v1_4 = *(it1 + 4); - int v1_r1 = *(it1 - 1); - int v1_r2 = *(it1 - 2); - cb1.rotate(it1); - rotate(cb2.begin(), cb2.begin() + 2, cb2.end()); - - CB_CONTAINER cb3(7); - cb3.push_back(1); - cb3.push_back(2); - cb3.push_back(3); - cb3.push_back(4); - cb3.push_back(5); - cb3.push_back(6); - cb3.push_back(7); - cb3.push_back(8); - cb3.push_back(9); - CB_CONTAINER cb4 = cb3; - CB_CONTAINER::iterator it2 = cb3.begin() + 1; - int v2_0 = *it2; - int v2_1 = *(it2 + 1); - int v2_2 = *(it2 + 2); - int v2_3 = *(it2 + 3); - int v2_4 = *(it2 + 4); - int v2_5 = *(it2 + 5); - int v2_r1 = *(it2 - 1); - cb3.rotate(it2); - rotate(cb4.begin(), cb4.begin() + 1, cb4.end()); - - CB_CONTAINER cb5(10); - cb5.push_back(1); - cb5.push_back(2); - cb5.push_back(3); - cb5.push_back(4); - cb5.push_back(5); - cb5.push_back(6); - cb5.push_back(7); - CB_CONTAINER cb6 = cb5; - CB_CONTAINER::iterator it3 = cb5.begin() + 5; - int v3_0 = *it3; - int v3_1 = *(it3 + 1); - int v3_r1 = *(it3 - 1); - int v3_r2 = *(it3 - 2); - int v3_r3 = *(it3 - 3); - int v3_r4 = *(it3 - 4); - int v3_r5 = *(it3 - 5); - cb5.rotate(it3); - rotate(cb6.begin(), cb6.begin() + 5, cb6.end()); - - BOOST_CHECK(!cb1.full()); - BOOST_CHECK(cb1 == cb2); - BOOST_CHECK(v1_0 == *it1); - BOOST_CHECK(v1_1 == *(it1 + 1)); - BOOST_CHECK(v1_2 == *(it1 + 2)); - BOOST_CHECK(v1_3 == *(it1 + 3)); - BOOST_CHECK(v1_4 == *(it1 + 4)); - BOOST_CHECK(v1_r1 == *(it1 + 6)); - BOOST_CHECK(v1_r2 == *(it1 + 5)); - BOOST_CHECK(cb1.begin() == it1); - BOOST_CHECK(v1_0 == cb1[0]); - BOOST_CHECK(v1_1 == cb1[1]); - BOOST_CHECK(v1_2 == cb1[2]); - BOOST_CHECK(v1_3 == cb1[3]); - BOOST_CHECK(v1_4 == cb1[4]); - BOOST_CHECK(v1_r1 == cb1[6]); - BOOST_CHECK(v1_r2 == cb1[5]); - BOOST_CHECK(cb3.full()); - BOOST_CHECK(cb3 == cb4); - BOOST_CHECK(v2_0 == *it2); - BOOST_CHECK(v2_1 == *(it2 + 1)); - BOOST_CHECK(v2_2 == *(it2 + 2)); - BOOST_CHECK(v2_3 == *(it2 + 3)); - BOOST_CHECK(v2_4 == *(it2 + 4)); - BOOST_CHECK(v2_5 == *(it2 + 5)); - BOOST_CHECK(v2_r1 == *(it2 + 6)); - BOOST_CHECK(cb3.begin() == it2); - BOOST_CHECK(v2_0 == cb3[0]); - BOOST_CHECK(v2_1 == cb3[1]); - BOOST_CHECK(v2_2 == cb3[2]); - BOOST_CHECK(v2_3 == cb3[3]); - BOOST_CHECK(v2_4 == cb3[4]); - BOOST_CHECK(v2_5 == cb3[5]); - BOOST_CHECK(v2_r1 == cb3[6]); - BOOST_CHECK(!cb5.full()); - BOOST_CHECK(cb5 == cb6); - BOOST_CHECK(v3_0 == cb5[0]); - BOOST_CHECK(v3_1 == cb5[1]); - BOOST_CHECK(v3_r1 == cb5[6]); - BOOST_CHECK(v3_r2 == cb5[5]); - BOOST_CHECK(v3_r3 == cb5[4]); - BOOST_CHECK(v3_r4 == cb5[3]); - BOOST_CHECK(v3_r5 == cb5[2]); - - generic_test(cb1); - generic_test(cb2); - generic_test(cb3); - generic_test(cb4); - generic_test(cb5); - generic_test(cb6); -} - -int MyInteger::ms_exception_trigger = 0; -int InstanceCounter::ms_count = 0; - -void move_container_on_cpp11() { -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - CB_CONTAINER cb1(10); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - cb1.push_back(5); - cb1.push_back(6); - - // Checking move constructor - CB_CONTAINER cb2(static_cast&& >(cb1)); - CB_CONTAINER::iterator it2 = cb2.begin() + 1; - - BOOST_CHECK(cb1.empty()); - BOOST_CHECK(!cb2.empty()); - BOOST_CHECK(it2[0] == 2); - BOOST_CHECK(it2[-1] == 1); - BOOST_CHECK(it2[2] == 4); - - // Checking move assignment - cb1 = static_cast&& >(cb2); - CB_CONTAINER::iterator it1 = cb1.begin() + 1; - - BOOST_CHECK(!cb1.empty()); - BOOST_CHECK(cb2.empty()); - BOOST_CHECK(it1[0] == 2); - BOOST_CHECK(it1[-1] == 1); - BOOST_CHECK(it1[2] == 4); -#endif -} - - -struct noncopyable_movable_except_t -{ -private: - BOOST_MOVABLE_BUT_NOT_COPYABLE(noncopyable_movable_except_t) - bool is_moved_; - int value_; -public: - static int next_value; - - explicit noncopyable_movable_except_t() - : is_moved_(false) - , value_(next_value ++) - {} - - noncopyable_movable_except_t(BOOST_RV_REF(noncopyable_movable_except_t) x) { - is_moved_ = x.is_moved_; - value_ = x.value_; - x.is_moved_ = true; - } - - noncopyable_movable_except_t& operator=(BOOST_RV_REF(noncopyable_movable_except_t) x) { - is_moved_ = x.is_moved_; - value_ = x.value_; - x.is_moved_ = true; - return *this; - } - - bool is_moved() const { - return is_moved_; - } - - int value() const { - return value_; - } - - void reinit() { is_moved_ = false; value_ = next_value ++; } -}; - -struct noncopyable_movable_noexcept_t -{ -private: - BOOST_MOVABLE_BUT_NOT_COPYABLE(noncopyable_movable_noexcept_t) - bool is_moved_; - int value_; -public: - static int next_value; - - explicit noncopyable_movable_noexcept_t() - : is_moved_(false) - , value_(next_value ++) - {} - - noncopyable_movable_noexcept_t(BOOST_RV_REF(noncopyable_movable_noexcept_t) x) BOOST_NOEXCEPT { - is_moved_ = x.is_moved_; - value_ = x.value_; - x.is_moved_ = true; - } - - noncopyable_movable_noexcept_t& operator=(BOOST_RV_REF(noncopyable_movable_noexcept_t) x) BOOST_NOEXCEPT { - is_moved_ = x.is_moved_; - value_ = x.value_; - x.is_moved_ = true; - return *this; - } - - bool is_moved() const { - return is_moved_; - } - - int value() const { - return value_; - } - - void reinit() { is_moved_ = false; value_ = next_value ++; } -}; - -#ifdef BOOST_NO_CXX11_NOEXCEPT -namespace boost { - template <> - struct is_nothrow_move_constructible - : boost::true_type - {}; -} -#endif - -int noncopyable_movable_noexcept_t::next_value = 1; -int noncopyable_movable_except_t::next_value = 1; - -template -void move_container_values_impl() { - typedef T noncopyable_movable_test_t; - noncopyable_movable_test_t::next_value = 1; - - CB_CONTAINER cb1(40); - noncopyable_movable_test_t var; - cb1.push_back(boost::move(var)); - BOOST_CHECK(!cb1.back().is_moved()); - BOOST_CHECK(cb1.back().value() == 1); - BOOST_CHECK(var.is_moved()); - BOOST_CHECK(cb1.size() == 1); - - var.reinit(); - cb1.push_front(boost::move(var)); - BOOST_CHECK(!cb1.front().is_moved()); - BOOST_CHECK(cb1.front().value() == 2); - BOOST_CHECK(var.is_moved()); - BOOST_CHECK(cb1.size() == 2); - - cb1.push_back(); - BOOST_CHECK(!cb1.back().is_moved()); - BOOST_CHECK(cb1.back().value() == 3); - BOOST_CHECK(cb1.size() == 3); - - cb1.push_front(); - BOOST_CHECK(!cb1.front().is_moved()); - BOOST_CHECK(cb1.front().value() == 4); - BOOST_CHECK(cb1.size() == 4); - - cb1.insert(cb1.begin()); - BOOST_CHECK(!cb1.front().is_moved()); - BOOST_CHECK(cb1.front().value() == 5); - BOOST_CHECK(cb1.size() == 5); - - var.reinit(); - cb1.insert(cb1.begin(), boost::move(var)); - BOOST_CHECK(!cb1.front().is_moved()); - BOOST_CHECK(cb1.front().value() == 6); - BOOST_CHECK(cb1.size() == 6); - - cb1.rinsert(cb1.begin()); - BOOST_CHECK(!cb1.front().is_moved()); - BOOST_CHECK(cb1.front().value() == 7); - BOOST_CHECK(cb1.size() == 7); - - var.reinit(); - cb1.rinsert(cb1.begin(), boost::move(var)); - BOOST_CHECK(!cb1.front().is_moved()); - BOOST_CHECK(cb1.front().value() == 8); - BOOST_CHECK(cb1.size() == 8); - - - BOOST_CHECK(cb1[0].value() == 8); - BOOST_CHECK(cb1[1].value() == 7); - BOOST_CHECK(cb1[2].value() == 6); - BOOST_CHECK(cb1[3].value() == 5); - BOOST_CHECK(cb1[4].value() == 4); - BOOST_CHECK(cb1[5].value() == 2); - BOOST_CHECK(cb1[6].value() == 1); - BOOST_CHECK(cb1[7].value() == 3); - cb1.rotate(cb1.begin() + 2); - BOOST_CHECK(cb1[0].value() == 6); - BOOST_CHECK(cb1[1].value() == 5); - BOOST_CHECK(cb1[2].value() == 4); - BOOST_CHECK(cb1[3].value() == 2); - BOOST_CHECK(cb1[4].value() == 1); - BOOST_CHECK(cb1[5].value() == 3); - BOOST_CHECK(cb1[6].value() == 8); - BOOST_CHECK(cb1[7].value() == 7); - - BOOST_CHECK(!cb1[0].is_moved()); - BOOST_CHECK(!cb1[1].is_moved()); - BOOST_CHECK(!cb1[2].is_moved()); - BOOST_CHECK(!cb1[3].is_moved()); - BOOST_CHECK(!cb1[4].is_moved()); - BOOST_CHECK(!cb1[5].is_moved()); - BOOST_CHECK(!cb1[6].is_moved()); - BOOST_CHECK(!cb1[7].is_moved()); - - cb1.linearize(); - BOOST_CHECK(!cb1[0].is_moved()); - BOOST_CHECK(!cb1[1].is_moved()); - BOOST_CHECK(!cb1[2].is_moved()); - BOOST_CHECK(!cb1[3].is_moved()); - BOOST_CHECK(!cb1[4].is_moved()); - BOOST_CHECK(!cb1[5].is_moved()); - BOOST_CHECK(!cb1[6].is_moved()); - BOOST_CHECK(!cb1[7].is_moved()); - BOOST_CHECK(cb1[0].value() == 6); - BOOST_CHECK(cb1[1].value() == 5); - BOOST_CHECK(cb1[2].value() == 4); - BOOST_CHECK(cb1[3].value() == 2); - BOOST_CHECK(cb1[4].value() == 1); - BOOST_CHECK(cb1[5].value() == 3); - BOOST_CHECK(cb1[6].value() == 8); - BOOST_CHECK(cb1[7].value() == 7); - - cb1.erase(cb1.begin()); - BOOST_CHECK(!cb1[0].is_moved()); - BOOST_CHECK(!cb1[1].is_moved()); - BOOST_CHECK(!cb1[2].is_moved()); - BOOST_CHECK(!cb1[3].is_moved()); - BOOST_CHECK(!cb1[4].is_moved()); - BOOST_CHECK(!cb1[5].is_moved()); - BOOST_CHECK(!cb1[6].is_moved()); - BOOST_CHECK(cb1[0].value() == 5); - BOOST_CHECK(cb1[1].value() == 4); - BOOST_CHECK(cb1[2].value() == 2); - BOOST_CHECK(cb1[3].value() == 1); - BOOST_CHECK(cb1[4].value() == 3); - BOOST_CHECK(cb1[5].value() == 8); - BOOST_CHECK(cb1[6].value() == 7); - - cb1.rerase(cb1.begin()); - BOOST_CHECK(!cb1[0].is_moved()); - BOOST_CHECK(!cb1[1].is_moved()); - BOOST_CHECK(!cb1[2].is_moved()); - BOOST_CHECK(!cb1[3].is_moved()); - BOOST_CHECK(!cb1[4].is_moved()); - BOOST_CHECK(!cb1[5].is_moved()); - BOOST_CHECK(cb1[0].value() == 4); - BOOST_CHECK(cb1[1].value() == 2); - BOOST_CHECK(cb1[2].value() == 1); - BOOST_CHECK(cb1[3].value() == 3); - BOOST_CHECK(cb1[4].value() == 8); - BOOST_CHECK(cb1[5].value() == 7); - - cb1.erase(cb1.begin(), cb1.begin() + 1); - BOOST_CHECK(!cb1[0].is_moved()); - BOOST_CHECK(!cb1[1].is_moved()); - BOOST_CHECK(!cb1[2].is_moved()); - BOOST_CHECK(!cb1[3].is_moved()); - BOOST_CHECK(!cb1[4].is_moved()); - BOOST_CHECK(cb1[0].value() == 2); - BOOST_CHECK(cb1[1].value() == 1); - BOOST_CHECK(cb1[2].value() == 3); - BOOST_CHECK(cb1[3].value() == 8); - BOOST_CHECK(cb1[4].value() == 7); - - cb1.rerase(cb1.begin(), cb1.begin() + 1); - BOOST_CHECK(!cb1[0].is_moved()); - BOOST_CHECK(!cb1[1].is_moved()); - BOOST_CHECK(!cb1[2].is_moved()); - BOOST_CHECK(!cb1[3].is_moved()); - BOOST_CHECK(cb1[0].value() == 1); - BOOST_CHECK(cb1[1].value() == 3); - BOOST_CHECK(cb1[2].value() == 8); - BOOST_CHECK(cb1[3].value() == 7); -} - -void move_container_values_noexcept() { - move_container_values_impl(); - - typedef noncopyable_movable_noexcept_t noncopyable_movable_test_t; - noncopyable_movable_test_t::next_value = 1; - CB_CONTAINER cb1(40); - cb1.push_back(); - cb1.push_back(); - cb1.push_back(); - cb1.push_back(); - cb1.push_back(); - cb1.push_back(); - cb1.push_back(); - cb1.push_back(); - - cb1.set_capacity(100); - BOOST_CHECK(!cb1[0].is_moved()); - BOOST_CHECK(!cb1[1].is_moved()); - BOOST_CHECK(!cb1[2].is_moved()); - BOOST_CHECK(!cb1[3].is_moved()); - BOOST_CHECK(!cb1[4].is_moved()); - BOOST_CHECK(!cb1[5].is_moved()); - BOOST_CHECK(!cb1[6].is_moved()); - BOOST_CHECK(!cb1[7].is_moved()); - BOOST_CHECK(cb1[0].value() == 1); - BOOST_CHECK(cb1[1].value() == 2); - BOOST_CHECK(cb1[2].value() == 3); - BOOST_CHECK(cb1[3].value() == 4); - BOOST_CHECK(cb1[4].value() == 5); - BOOST_CHECK(cb1[5].value() == 6); - BOOST_CHECK(cb1[6].value() == 7); - BOOST_CHECK(cb1[7].value() == 8); - - cb1.rset_capacity(101); - BOOST_CHECK(!cb1[0].is_moved()); - BOOST_CHECK(!cb1[1].is_moved()); - BOOST_CHECK(!cb1[2].is_moved()); - BOOST_CHECK(!cb1[3].is_moved()); - BOOST_CHECK(!cb1[4].is_moved()); - BOOST_CHECK(!cb1[5].is_moved()); - BOOST_CHECK(!cb1[6].is_moved()); - BOOST_CHECK(!cb1[7].is_moved()); - BOOST_CHECK(cb1[0].value() == 1); - BOOST_CHECK(cb1[1].value() == 2); - BOOST_CHECK(cb1[2].value() == 3); - BOOST_CHECK(cb1[3].value() == 4); - BOOST_CHECK(cb1[4].value() == 5); - BOOST_CHECK(cb1[5].value() == 6); - BOOST_CHECK(cb1[6].value() == 7); - BOOST_CHECK(cb1[7].value() == 8); - - cb1.set_capacity(2); - BOOST_CHECK(!cb1[0].is_moved()); - BOOST_CHECK(!cb1[1].is_moved()); - BOOST_CHECK(cb1[0].value() == 1); - BOOST_CHECK(cb1[1].value() == 2); - - cb1.rset_capacity(1); - BOOST_CHECK(!cb1[0].is_moved()); - BOOST_CHECK(cb1[0].value() == 2); -} - -void check_containers_exception_specifications() { -#ifndef BOOST_NO_CXX11_NOEXCEPT -#ifndef BOOST_CLANG - // Clang has an error in __has_nothrow_constructor implementation: - // http://llvm.org/bugs/show_bug.cgi?id=16627 - BOOST_CHECK(boost::has_nothrow_constructor >::value); -#endif - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_CHECK(boost::is_nothrow_move_assignable >::value); - BOOST_CHECK(boost::is_nothrow_move_constructible >::value); -#endif -#endif // BOOST_NO_CXX11_NOEXCEPT -} - -// add common tests into a test suite -void add_common_tests(test_suite* tests) { - tests->add(BOOST_TEST_CASE(&basic_test)); - tests->add(BOOST_TEST_CASE(&constructor_and_element_access_test)); - tests->add(BOOST_TEST_CASE(&size_test)); - tests->add(BOOST_TEST_CASE(&allocator_test)); - tests->add(BOOST_TEST_CASE(&begin_and_end_test)); - tests->add(BOOST_TEST_CASE(&rbegin_and_rend_test)); - tests->add(BOOST_TEST_CASE(&element_access_and_insert_test)); - tests->add(BOOST_TEST_CASE(&at_test)); - tests->add(BOOST_TEST_CASE(&front_and_back_test)); - tests->add(BOOST_TEST_CASE(&linearize_test)); - tests->add(BOOST_TEST_CASE(&array_range_test)); - tests->add(BOOST_TEST_CASE(&capacity_and_reserve_test)); - tests->add(BOOST_TEST_CASE(&full_and_empty_test)); - tests->add(BOOST_TEST_CASE(&set_capacity_test)); - tests->add(BOOST_TEST_CASE(&rset_capacity_test)); - tests->add(BOOST_TEST_CASE(&resize_test)); - tests->add(BOOST_TEST_CASE(&rresize_test)); - tests->add(BOOST_TEST_CASE(&constructor_test)); - tests->add(BOOST_TEST_CASE(&assign_test)); - tests->add(BOOST_TEST_CASE(©_constructor_and_assign_test)); - tests->add(BOOST_TEST_CASE(&swap_test)); - tests->add(BOOST_TEST_CASE(&push_back_test)); - tests->add(BOOST_TEST_CASE(&pop_back_test)); - tests->add(BOOST_TEST_CASE(&insert_test)); - tests->add(BOOST_TEST_CASE(&insert_n_test)); - tests->add(BOOST_TEST_CASE(&insert_range_test)); - tests->add(BOOST_TEST_CASE(&push_front_test)); - tests->add(BOOST_TEST_CASE(&pop_front_test)); - tests->add(BOOST_TEST_CASE(&rinsert_test)); - tests->add(BOOST_TEST_CASE(&rinsert_n_test)); - tests->add(BOOST_TEST_CASE(&rinsert_range_test)); - tests->add(BOOST_TEST_CASE(&erase_test)); - tests->add(BOOST_TEST_CASE(&erase_range_test)); - tests->add(BOOST_TEST_CASE(&rerase_test)); - tests->add(BOOST_TEST_CASE(&rerase_range_test)); - tests->add(BOOST_TEST_CASE(&clear_test)); - tests->add(BOOST_TEST_CASE(&equality_test)); - tests->add(BOOST_TEST_CASE(&lexicographical_comparison_test)); - tests->add(BOOST_TEST_CASE(&assign_range_test)); - tests->add(BOOST_TEST_CASE(&example_test)); - tests->add(BOOST_TEST_CASE(&element_destruction_test)); - tests->add(BOOST_TEST_CASE(&const_methods_test)); - tests->add(BOOST_TEST_CASE(&rotate_test)); - tests->add(BOOST_TEST_CASE(&move_container_on_cpp11)); - tests->add(BOOST_TEST_CASE(&move_container_values_noexcept)); - tests->add(BOOST_TEST_CASE(&check_containers_exception_specifications)); -#if !defined(BOOST_NO_CXX11_ALLOCATOR) - tests->add(BOOST_TEST_CASE(&cxx11_allocator_test)); -#endif -} - diff --git a/libs/circular_buffer/test/constant_erase_test.cpp b/libs/circular_buffer/test/constant_erase_test.cpp deleted file mode 100644 index ba41f6cc4..000000000 --- a/libs/circular_buffer/test/constant_erase_test.cpp +++ /dev/null @@ -1,185 +0,0 @@ -// Special tests for erase_begin, erase_end and clear methods. - -// Copyright (c) 2009 Jan Gaspar - -// 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) - -#include "test.hpp" - -int MyInteger::ms_exception_trigger = 0; -int InstanceCounter::ms_count = 0; - -void erase_begin_test() { - - circular_buffer cb1(5); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - cb1.push_back(5); - cb1.push_back(6); - - circular_buffer::pointer p = &cb1[0]; - - cb1.erase_begin(2); - - BOOST_CHECK(cb1.size() == 3); - BOOST_CHECK(cb1[0] == 4); - BOOST_CHECK(cb1[1] == 5); - BOOST_CHECK(cb1[2] == 6); - - cb1.erase_begin(3); - BOOST_CHECK(cb1.empty()); - BOOST_CHECK(*p == 2); - BOOST_CHECK(*(p + 1) == 3); - BOOST_CHECK(*(p + 2) == 4); - - cb1.push_back(10); - cb1.push_back(11); - cb1.push_back(12); - - BOOST_CHECK(cb1.size() == 3); - BOOST_CHECK(cb1[0] == 10); - BOOST_CHECK(cb1[1] == 11); - BOOST_CHECK(cb1[2] == 12); - - circular_buffer cb2(5, InstanceCounter()); - - BOOST_CHECK(cb2.size() == 5); - BOOST_CHECK(InstanceCounter::count() == 5); - - cb2.erase_begin(2); - - BOOST_CHECK(cb2.size() == 3); - BOOST_CHECK(InstanceCounter::count() == 3); - - circular_buffer cb3(5); - cb3.push_back(1); - cb3.push_back(2); - cb3.push_back(3); - cb3.push_back(4); - cb3.push_back(5); - cb3.push_back(6); - cb3.erase_begin(2); - - BOOST_CHECK(cb3.size() == 3); - BOOST_CHECK(cb3[0] == 4); - BOOST_CHECK(cb3[1] == 5); - BOOST_CHECK(cb3[2] == 6); -} - -void erase_end_test() { - - circular_buffer cb1(5); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - cb1.push_back(5); - cb1.push_back(6); - - circular_buffer::pointer p = &cb1[3]; - - cb1.erase_end(2); - - BOOST_CHECK(cb1.size() == 3); - BOOST_CHECK(cb1[0] == 2); - BOOST_CHECK(cb1[1] == 3); - BOOST_CHECK(cb1[2] ==4); - - cb1.erase_end(3); - BOOST_CHECK(cb1.empty()); - BOOST_CHECK(*p == 5); - BOOST_CHECK(*(p - 1) == 4); - BOOST_CHECK(*(p - 2) == 3); - - cb1.push_back(10); - cb1.push_back(11); - cb1.push_back(12); - - BOOST_CHECK(cb1.size() == 3); - BOOST_CHECK(cb1[0] == 10); - BOOST_CHECK(cb1[1] == 11); - BOOST_CHECK(cb1[2] == 12); - - circular_buffer cb2(5, InstanceCounter()); - - BOOST_CHECK(cb2.size() == 5); - BOOST_CHECK(InstanceCounter::count() == 5); - - cb2.erase_end(2); - - BOOST_CHECK(cb2.size() == 3); - BOOST_CHECK(InstanceCounter::count() == 3); - - circular_buffer cb3(5); - cb3.push_back(1); - cb3.push_back(2); - cb3.push_back(3); - cb3.push_back(4); - cb3.push_back(5); - cb3.push_back(6); - cb3.erase_end(2); - - BOOST_CHECK(cb3.size() == 3); - BOOST_CHECK(cb3[0] == 2); - BOOST_CHECK(cb3[1] == 3); - BOOST_CHECK(cb3[2] == 4); -} - -void clear_test() { - - circular_buffer cb1(5); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - cb1.push_back(5); - cb1.push_back(6); - - circular_buffer::pointer p = &cb1[0]; - - cb1.clear(); - - BOOST_CHECK(cb1.empty()); - BOOST_CHECK(*p == 2); - BOOST_CHECK(*(p + 1) == 3); - BOOST_CHECK(*(p + 2) == 4); - BOOST_CHECK(*(p + 3) == 5); - BOOST_CHECK(*(p - 1) == 6); - - circular_buffer cb2(5, InstanceCounter()); - - BOOST_CHECK(cb2.size() == 5); - BOOST_CHECK(InstanceCounter::count() == 5); - - cb2.clear(); - - BOOST_CHECK(cb2.empty()); - BOOST_CHECK(InstanceCounter::count() == 0); - - circular_buffer cb3(5); - cb3.push_back(1); - cb3.push_back(2); - cb3.push_back(3); - cb3.push_back(4); - cb3.push_back(5); - cb3.push_back(6); - cb3.clear(); - - BOOST_CHECK(cb3.empty()); -} - -// test main -test_suite* init_unit_test_suite(int /*argc*/, char* /*argv*/[]) { - - test_suite* tests = BOOST_TEST_SUITE("Unit tests for erase_begin/end and clear methods of the circular_buffer."); - - tests->add(BOOST_TEST_CASE(&erase_begin_test)); - tests->add(BOOST_TEST_CASE(&erase_end_test)); - tests->add(BOOST_TEST_CASE(&clear_test)); - - return tests; -} diff --git a/libs/circular_buffer/test/soft_iterator_invalidation.cpp b/libs/circular_buffer/test/soft_iterator_invalidation.cpp deleted file mode 100644 index 770179d6f..000000000 --- a/libs/circular_buffer/test/soft_iterator_invalidation.cpp +++ /dev/null @@ -1,745 +0,0 @@ -// Demonstration of rules when an iterator is considered to be valid if the soft -// iterator invalidation definition is applied. -// Note: The soft iterator invalidation definition CAN NOT be applied -// to the space optimized circular buffer. - -// Copyright (c) 2003-2008 Jan Gaspar - -// 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) - -#include "test.hpp" - -// test of the example (introduced in the documentation) -void validity_example_test() { - - circular_buffer cb(3); - - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - - circular_buffer::iterator it = cb.begin(); - - BOOST_CHECK(*it == 1); - - cb.push_back(4); - - BOOST_CHECK(*it == 4); -} - -void validity_insert_test() { - - int array[] = { 1, 2, 3 }; - - // memory placement: { 1, 2, 3 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb(4, array, array + 3); - - // it1 -> 1, it2 -> 2, it3 -> 3 - circular_buffer::iterator it1 = cb.begin(); - circular_buffer::iterator it2 = cb.begin() + 1; - circular_buffer::iterator it3 = cb.begin() + 2; - - cb.insert(cb.begin() + 1, 4); - - // memory placement: { 1, 4, 2, 3 } - // circular buffer: { 1, 4, 2, 3 } - BOOST_CHECK(*it1 == 1); - BOOST_CHECK(*it2 == 4); - BOOST_CHECK(*it3 == 2); - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb[1] == 4); - BOOST_CHECK(cb[2] == 2); - BOOST_CHECK(cb[3] == 3); - - // it4 -> 3 - circular_buffer::iterator it4 = it1 + 3; - - cb.insert(cb.begin() + 1, 5); - - // memory placement: { 3, 5, 4, 2 } - // circular buffer: { 5, 4, 2, 3 } - BOOST_CHECK(*it1 == 3); - BOOST_CHECK(*it2 == 5); - BOOST_CHECK(*it3 == 4); - BOOST_CHECK(*it4 == 2); - BOOST_CHECK(cb[0] == 5); - BOOST_CHECK(cb[1] == 4); - BOOST_CHECK(cb[2] == 2); - BOOST_CHECK(cb[3] == 3); -} - -void validity_insert_n_test() { - - // memory placement: { 1, 2, 3 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb(5); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - - // it1 -> 1, it2 -> 2, it3 -> 3 - circular_buffer::iterator it1 = cb.begin(); - circular_buffer::iterator it2 = cb.begin() + 1; - circular_buffer::iterator it3 = cb.begin() + 2; - - cb.insert(cb.begin() + 1, 2, 4); - - // memory placement: { 1, 4, 4, 2, 3 } - // circular buffer: { 1, 4, 4, 2, 3 } - BOOST_CHECK(*it1 == 1); - BOOST_CHECK(*it2 == 4); - BOOST_CHECK(*it3 == 4); - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb[1] == 4); - BOOST_CHECK(cb[2] == 4); - BOOST_CHECK(cb[3] == 2); - BOOST_CHECK(cb[4] == 3); - - // it4 -> 2, it5 -> 3 - circular_buffer::iterator it4 = it1 + 3; - circular_buffer::iterator it5 = it1 + 4; - - cb.insert(cb.begin() + 1, 2, 5); - - // memory placement: { 3, 5, 4, 4, 2 } - 5 inserted only once - // circular buffer: { 5, 4, 4, 2, 3 } - BOOST_CHECK(*it1 == 3); - BOOST_CHECK(*it2 == 5); - BOOST_CHECK(*it3 == 4); - BOOST_CHECK(*it4 == 4); - BOOST_CHECK(*it5 == 2); - BOOST_CHECK(cb[0] == 5); - BOOST_CHECK(cb[1] == 4); - BOOST_CHECK(cb[2] == 4); - BOOST_CHECK(cb[3] == 2); - BOOST_CHECK(cb[4] == 3); -} - -void validity_insert_range_test() { - - vector v1; - v1.push_back(4); - v1.push_back(5); - - vector v2; - v2.push_back(6); - v2.push_back(7); - - - // memory placement: { 1, 2, 3 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb1(5); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - - // it11 -> 1, it12 -> 2, it13 -> 3 - circular_buffer::iterator it11 = cb1.begin(); - circular_buffer::iterator it12 = cb1.begin() + 1; - circular_buffer::iterator it13 = cb1.begin() + 2; - - cb1.insert(cb1.begin() + 1, v1.begin(), v1.end()); - - // memory placement: { 1, 4, 5, 2, 3 } - // circular buffer: { 1, 4, 5, 2, 3 } - BOOST_CHECK(*it11 == 1); - BOOST_CHECK(*it12 == 4); - BOOST_CHECK(*it13 == 5); - BOOST_CHECK(cb1[0] == 1); - BOOST_CHECK(cb1[1] == 4); - BOOST_CHECK(cb1[2] == 5); - BOOST_CHECK(cb1[3] == 2); - BOOST_CHECK(cb1[4] == 3); - - // it14 -> 2, it15 -> 3 - circular_buffer::iterator it14 = it11 + 3; - circular_buffer::iterator it15 = it11 + 4; - - cb1.insert(cb1.begin() + 1, v2.begin(), v2.end()); - - // memory placement: { 3, 7, 4, 5, 2 } - 7 inserted only - // circular buffer: { 7, 4, 5, 2, 3 } - BOOST_CHECK(*it11 == 3); - BOOST_CHECK(*it12 == 7); - BOOST_CHECK(*it13 == 4); - BOOST_CHECK(*it14 == 5); - BOOST_CHECK(*it15 == 2); - BOOST_CHECK(cb1[0] == 7); - BOOST_CHECK(cb1[1] == 4); - BOOST_CHECK(cb1[2] == 5); - BOOST_CHECK(cb1[3] == 2); - BOOST_CHECK(cb1[4] == 3); - - // memory placement: { 1, 2, 3 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb2(5); - cb2.push_back(1); - cb2.push_back(2); - cb2.push_back(3); - - // it21 -> 1, it22 -> 2, it23 -> 3 - circular_buffer::iterator it21 = cb2.begin(); - circular_buffer::iterator it22 = cb2.begin() + 1; - circular_buffer::iterator it23 = cb2.begin() + 2; - - cb2.insert(cb2.begin() + 1, MyInputIterator(v1.begin()), MyInputIterator(v1.end())); - - // memory placement: { 1, 4, 5, 2, 3 } - // circular buffer: { 1, 4, 5, 2, 3 } - BOOST_CHECK(*it21 == 1); - BOOST_CHECK(*it22 == 4); - BOOST_CHECK(*it23 == 5); - BOOST_CHECK(cb2[0] == 1); - BOOST_CHECK(cb2[1] == 4); - BOOST_CHECK(cb2[2] == 5); - BOOST_CHECK(cb2[3] == 2); - BOOST_CHECK(cb2[4] == 3); - - // it24 -> 2, it25 -> 3 - circular_buffer::iterator it24 = it21 + 3; - circular_buffer::iterator it25 = it21 + 4; - - cb2.insert(cb2.begin() + 1, MyInputIterator(v2.begin()), MyInputIterator(v2.end())); - - // memory placement: { 2, 3, 7, 4, 5 } - using input iterator inserts all items even if they are later replaced - // circular buffer: { 7, 4, 5, 2, 3 } - BOOST_CHECK(*it21 == 2); - BOOST_CHECK(*it22 == 3); - BOOST_CHECK(*it23 == 7); - BOOST_CHECK(*it24 == 4); - BOOST_CHECK(*it25 == 5); - BOOST_CHECK(cb2[0] == 7); - BOOST_CHECK(cb2[1] == 4); - BOOST_CHECK(cb2[2] == 5); - BOOST_CHECK(cb2[3] == 2); - BOOST_CHECK(cb2[4] == 3); -} - -void validity_rinsert_test() { - - int array[] = { 1, 2, 3 }; - - // memory placement: { 1, 2, 3 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb(4, array, array + 3); - - // it1 -> 1, it2 -> 2, it3 -> 3 - circular_buffer::iterator it1 = cb.begin(); - circular_buffer::iterator it2 = cb.begin() + 1; - circular_buffer::iterator it3 = cb.begin() + 2; - - cb.rinsert(cb.begin() + 2, 4); - - // memory placement: { 2, 4, 3, 1 } - // circular buffer: { 1, 2, 4, 3 } - BOOST_CHECK(*it1 == 2); - BOOST_CHECK(*it2 == 4); - BOOST_CHECK(*it3 == 3); - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb[1] == 2); - BOOST_CHECK(cb[2] == 4); - BOOST_CHECK(cb[3] == 3); - - // it4 -> 1 - circular_buffer::iterator it4 = it1 - 1; - - cb.rinsert(cb.begin() + 2, 5); - - // memory placement: { 5, 4, 1, 2 } - // circular buffer: { 1, 2, 5, 4 } - BOOST_CHECK(*it1 == 5); - BOOST_CHECK(*it2 == 4); - BOOST_CHECK(*it3 == 1); - BOOST_CHECK(*it4 == 2); - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb[1] == 2); - BOOST_CHECK(cb[2] == 5); - BOOST_CHECK(cb[3] == 4); -} - -void validity_rinsert_n_test() { - - // memory placement: { 1, 2, 3 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb(5); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - - // it1 -> 1, it2 -> 2, it3 -> 3 - circular_buffer::iterator it1 = cb.begin(); - circular_buffer::iterator it2 = cb.begin() + 1; - circular_buffer::iterator it3 = cb.begin() + 2; - - cb.rinsert(cb.begin() + 2, 2, 4); - - // memory placement: { 4, 4, 3, 1, 2 } - // circular buffer: { 1, 2, 4, 4, 3 } - BOOST_CHECK(*it1 == 4); - BOOST_CHECK(*it2 == 4); - BOOST_CHECK(*it3 == 3); - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb[1] == 2); - BOOST_CHECK(cb[2] == 4); - BOOST_CHECK(cb[3] == 4); - BOOST_CHECK(cb[4] == 3); - - // it4 -> 1, it5 -> 2 - circular_buffer::iterator it4 = it1 - 2; - circular_buffer::iterator it5 = it1 - 1; - - cb.rinsert(cb.begin() + 4, 2, 5); - - // memory placement: { 4, 5, 1, 2, 4 } - 5 inserted only once - // circular buffer: { 1, 2, 4, 4, 5 } - BOOST_CHECK(*it1 == 4); - BOOST_CHECK(*it2 == 5); - BOOST_CHECK(*it3 == 1); - BOOST_CHECK(*it4 == 2); - BOOST_CHECK(*it5 == 4); - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb[1] == 2); - BOOST_CHECK(cb[2] == 4); - BOOST_CHECK(cb[3] == 4); - BOOST_CHECK(cb[4] == 5); -} - -void validity_rinsert_range_test() { - - vector v1; - v1.push_back(4); - v1.push_back(5); - - vector v2; - v2.push_back(6); - v2.push_back(7); - - - // memory placement: { 1, 2, 3 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb1(5); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - - // it1 -> 1, it2 -> 2, it3 -> 3 - circular_buffer::iterator it11 = cb1.begin(); - circular_buffer::iterator it12 = cb1.begin() + 1; - circular_buffer::iterator it13 = cb1.begin() + 2; - - cb1.rinsert(cb1.begin() + 2, v1.begin(), v1.end()); - - // memory placement: { 4, 5, 3, 1, 2 } - // circular buffer: { 1, 2, 4, 5, 3 } - BOOST_CHECK(*it11 == 4); - BOOST_CHECK(*it12 == 5); - BOOST_CHECK(*it13 == 3); - BOOST_CHECK(cb1[0] == 1); - BOOST_CHECK(cb1[1] == 2); - BOOST_CHECK(cb1[2] == 4); - BOOST_CHECK(cb1[3] == 5); - BOOST_CHECK(cb1[4] == 3); - - // it14 -> 1, it15 -> 2 - circular_buffer::iterator it14 = it11 - 2; - circular_buffer::iterator it15 = it11 - 1; - - cb1.rinsert(cb1.begin() + 4, v2.begin(), v2.end()); - - // memory placement: { 5, 6, 1, 2, 4 } - 6 inserted only - // circular buffer: { 1, 2, 4, 5, 6 } - BOOST_CHECK(*it11 == 5); - BOOST_CHECK(*it12 == 6); - BOOST_CHECK(*it13 == 1); - BOOST_CHECK(*it14 == 2); - BOOST_CHECK(*it15 == 4); - BOOST_CHECK(cb1[0] == 1); - BOOST_CHECK(cb1[1] == 2); - BOOST_CHECK(cb1[2] == 4); - BOOST_CHECK(cb1[3] == 5); - BOOST_CHECK(cb1[4] == 6); - - // memory placement: { 1, 2, 3 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb2(5); - cb2.push_back(1); - cb2.push_back(2); - cb2.push_back(3); - - // it1 -> 1, it2 -> 2, it3 -> 3 - circular_buffer::iterator it21 = cb2.begin(); - circular_buffer::iterator it22 = cb2.begin() + 1; - circular_buffer::iterator it23 = cb2.begin() + 2; - - cb2.rinsert(cb2.begin() + 2, MyInputIterator(v1.begin()), MyInputIterator(v1.end())); - - // memory placement: { 4, 5, 3, 1, 2 } - // circular buffer: { 1, 2, 4, 5, 3 } - BOOST_CHECK(*it21 == 4); - BOOST_CHECK(*it22 == 5); - BOOST_CHECK(*it23 == 3); - BOOST_CHECK(cb2[0] == 1); - BOOST_CHECK(cb2[1] == 2); - BOOST_CHECK(cb2[2] == 4); - BOOST_CHECK(cb2[3] == 5); - BOOST_CHECK(cb2[4] == 3); - - // it24 -> 1, it25 -> 2 - circular_buffer::iterator it24 = it21 - 2; - circular_buffer::iterator it25 = it21 - 1; - - cb2.rinsert(cb2.begin() + 4, MyInputIterator(v2.begin()), MyInputIterator(v2.end())); - - // memory placement: { 5, 6, 1, 2, 4 } - // circular buffer: { 1, 2, 4, 5, 6 } - BOOST_CHECK(*it21 == 5); - BOOST_CHECK(*it22 == 6); - BOOST_CHECK(*it23 == 1); - BOOST_CHECK(*it24 == 2); - BOOST_CHECK(*it25 == 4); - BOOST_CHECK(cb2[0] == 1); - BOOST_CHECK(cb2[1] == 2); - BOOST_CHECK(cb2[2] == 4); - BOOST_CHECK(cb2[3] == 5); - BOOST_CHECK(cb2[4] == 6); -} - -void validity_erase_test() { - - // memory placement: { 4, 5, 1, 2, 3 } - // circular buffer: { 1, 2, 3, 4, 5 } - circular_buffer cb(5); - cb.push_back(-1); - cb.push_back(0); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - cb.push_back(4); - cb.push_back(5); - - // it1 -> 1, it2 -> 2, it3 -> 3, it4 -> 4 - circular_buffer::iterator it1 = cb.begin(); - circular_buffer::iterator it2 = cb.begin() + 1; - circular_buffer::iterator it3 = cb.begin() + 2; - circular_buffer::iterator it4 = cb.begin() + 3; - - cb.erase(cb.begin() + 1); - - // memory placement: { 5, X, 1, 3, 4 } - // circular buffer: { 1, 3, 4, 5 } - BOOST_CHECK(*it1 == 1); - BOOST_CHECK(*it2 == 3); - BOOST_CHECK(*it3 == 4); - BOOST_CHECK(*it4 == 5); - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb[1] == 3); - BOOST_CHECK(cb[2] == 4); - BOOST_CHECK(cb[3] == 5); -} - -void validity_erase_range_test() { - - // memory placement: { 4, 5, 6, 1, 2, 3 } - // circular buffer: { 1, 2, 3, 4, 5, 6 } - circular_buffer cb(6); - cb.push_back(-2); - cb.push_back(-1); - cb.push_back(0); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - cb.push_back(4); - cb.push_back(5); - cb.push_back(6); - - // it1 -> 1, it2 -> 2, it3 -> 3, it4 -> 4 - circular_buffer::iterator it1 = cb.begin(); - circular_buffer::iterator it2 = cb.begin() + 1; - circular_buffer::iterator it3 = cb.begin() + 2; - circular_buffer::iterator it4 = cb.begin() + 3; - - cb.erase(cb.begin() + 2, cb.begin() + 4); - - // memory placement: { 6, X, X, 1, 2, 5 } - // circular buffer: { 1, 2, 5, 6 } - BOOST_CHECK(*it1 == 1); - BOOST_CHECK(*it2 == 2); - BOOST_CHECK(*it3 == 5); - BOOST_CHECK(*it4 == 6); - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb[1] == 2); - BOOST_CHECK(cb[2] == 5); - BOOST_CHECK(cb[3] == 6); -} - -void validity_rerase_test() { - - // memory placement: { 4, 5, 1, 2, 3 } - // circular buffer: { 1, 2, 3, 4, 5 } - circular_buffer cb(5); - cb.push_back(-1); - cb.push_back(0); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - cb.push_back(4); - cb.push_back(5); - - // it1 -> 2, it2 -> 3, it3 -> 4, it4 -> 5 - circular_buffer::iterator it1 = cb.begin() + 1; - circular_buffer::iterator it2 = cb.begin() + 2; - circular_buffer::iterator it3 = cb.begin() + 3; - circular_buffer::iterator it4 = cb.begin() + 4; - - cb.rerase(cb.begin() + 1); - - // memory placement: { 4, 5, X, 1, 3 } - // circular buffer: { 1, 3, 4, 5 } - BOOST_CHECK(*it1 == 1); - BOOST_CHECK(*it2 == 3); - BOOST_CHECK(*it3 == 4); - BOOST_CHECK(*it4 == 5); - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb[1] == 3); - BOOST_CHECK(cb[2] == 4); - BOOST_CHECK(cb[3] == 5); -} - -void validity_rerase_range_test() { - - // memory placement: { 4, 5, 6, 1, 2, 3 } - // circular buffer: { 1, 2, 3, 4, 5, 6 } - circular_buffer cb(6); - cb.push_back(-2); - cb.push_back(-1); - cb.push_back(0); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - cb.push_back(4); - cb.push_back(5); - cb.push_back(6); - - // it1 -> 3, it2 -> 4, it3 -> 5, it4 -> 6 - circular_buffer::iterator it1 = cb.begin() + 2; - circular_buffer::iterator it2 = cb.begin() + 3; - circular_buffer::iterator it3 = cb.begin() + 4; - circular_buffer::iterator it4 = cb.begin() + 5; - - cb.rerase(cb.begin() + 2, cb.begin() + 4); - - // memory placement: { 2, 5, 6, X, X, 1 } - // circular buffer: { 1, 2, 5, 6 } - BOOST_CHECK(*it1 == 1); - BOOST_CHECK(*it2 == 2); - BOOST_CHECK(*it3 == 5); - BOOST_CHECK(*it4 == 6); - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb[1] == 2); - BOOST_CHECK(cb[2] == 5); - BOOST_CHECK(cb[3] == 6); -} - -void validity_linearize_test() { - - // memory placement: { 3, 1, 2 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb(3); - cb.push_back(0); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - - // it1 -> 1, it2 -> 2, it3 -> 3 - circular_buffer::iterator it1 = cb.begin(); - circular_buffer::iterator it2 = cb.begin() + 1; - circular_buffer::iterator it3 = cb.begin() + 2; - - cb.linearize(); - - // memory placement: { 1, 2, 3 } - // circular buffer: { 1, 2, 3 } - BOOST_CHECK(*it1 == 2); - BOOST_CHECK(*it2 == 3); - BOOST_CHECK(*it3 == 1); - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb[1] == 2); - BOOST_CHECK(cb[2] == 3); -} - -void validity_swap_test() { - - // memory placement: { 3, 1, 2 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb1(3); - cb1.push_back(0); - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - - // it11 -> 1, it12 -> 2, it13 -> 3 - circular_buffer::iterator it11 = cb1.begin(); - circular_buffer::iterator it12 = cb1.begin() + 1; - circular_buffer::iterator it13 = cb1.begin() + 2; - - // memory placement: { 4, 5, 6 } - // circular buffer: { 4, 5, 6 } - circular_buffer cb2(5); - cb2.push_back(4); - cb2.push_back(5); - cb2.push_back(6); - - // it21 -> 4, it22 -> 5, it23 -> 6 - circular_buffer::iterator it21 = cb2.begin(); - circular_buffer::iterator it22 = cb2.begin() + 1; - circular_buffer::iterator it23 = cb2.begin() + 2; - - cb1.swap(cb2); - - // Although iterators refer to the original elements, - // their interal state is inconsistent and no other operation - // (except dereferencing) can be invoked on them any more. - BOOST_CHECK(*it11 == 1); - BOOST_CHECK(*it12 == 2); - BOOST_CHECK(*it13 == 3); - BOOST_CHECK(*it21 == 4); - BOOST_CHECK(*it22 == 5); - BOOST_CHECK(*it23 == 6); - BOOST_CHECK(cb1[0] == 4); - BOOST_CHECK(cb1[1] == 5); - BOOST_CHECK(cb1[2] == 6); - BOOST_CHECK(cb2[0] == 1); - BOOST_CHECK(cb2[1] == 2); - BOOST_CHECK(cb2[2] == 3); -} - -void validity_push_back_test() { - - // memory placement: { 3, 1, 2 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb(3); - cb.push_back(0); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - - // it1 -> 1, it2 -> 2, it3 -> 3 - circular_buffer::iterator it1 = cb.begin(); - circular_buffer::iterator it2 = cb.begin() + 1; - circular_buffer::iterator it3 = cb.begin() + 2; - - cb.push_back(4); - - // memory placement: { 3, 4, 2 } - // circular buffer: { 2, 3, 4 } - BOOST_CHECK(*it1 == 4); - BOOST_CHECK(*it2 == 2); - BOOST_CHECK(*it3 == 3); - BOOST_CHECK(cb[0] == 2); - BOOST_CHECK(cb[1] == 3); - BOOST_CHECK(cb[2] == 4); -} - -void validity_push_front_test() { - - // memory placement: { 3, 1, 2 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb(3); - cb.push_back(0); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - - // it1 -> 1, it2 -> 2, it3 -> 3 - circular_buffer::iterator it1 = cb.begin(); - circular_buffer::iterator it2 = cb.begin() + 1; - circular_buffer::iterator it3 = cb.begin() + 2; - - cb.push_front(4); - - // memory placement: { 4, 1, 2 } - // circular buffer: { 4, 1, 2 } - BOOST_CHECK(*it1 == 1); - BOOST_CHECK(*it2 == 2); - BOOST_CHECK(*it3 == 4); - BOOST_CHECK(cb[0] == 4); - BOOST_CHECK(cb[1] == 1); - BOOST_CHECK(cb[2] == 2); -} - -void validity_pop_back_test() { - - // memory placement: { 3, 1, 2 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb(3); - cb.push_back(0); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - - // it1 -> 1, it2 -> 2 - circular_buffer::iterator it1 = cb.begin(); - circular_buffer::iterator it2 = cb.begin() + 1; - - cb.pop_back(); - - // memory placement: { X, 1, 2 } - // circular buffer: { 1, 2 } - BOOST_CHECK(*it1 == 1); - BOOST_CHECK(*it2 == 2); - BOOST_CHECK(cb[0] == 1); - BOOST_CHECK(cb[1] == 2); -} - -void validity_pop_front_test() { - - // memory placement: { 3, 1, 2 } - // circular buffer: { 1, 2, 3 } - circular_buffer cb(3); - cb.push_back(0); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - - // it1 -> 2, it2 -> 3 - circular_buffer::iterator it1 = cb.begin() + 1; - circular_buffer::iterator it2 = cb.begin() + 2; - - cb.pop_front(); - - // memory placement: { 3, X, 2 } - // circular buffer: { 2, 3 } - BOOST_CHECK(*it1 == 2); - BOOST_CHECK(*it2 == 3); - BOOST_CHECK(cb[0] == 2); - BOOST_CHECK(cb[1] == 3); -} - -// test main -test_suite* init_unit_test_suite(int /*argc*/, char* /*argv*/[]) { - - test_suite* tests = BOOST_TEST_SUITE("Unit tests for the iterator of the circular_buffer."); - - tests->add(BOOST_TEST_CASE(&validity_example_test)); - tests->add(BOOST_TEST_CASE(&validity_insert_test)); - tests->add(BOOST_TEST_CASE(&validity_insert_n_test)); - tests->add(BOOST_TEST_CASE(&validity_insert_range_test)); - tests->add(BOOST_TEST_CASE(&validity_rinsert_test)); - tests->add(BOOST_TEST_CASE(&validity_rinsert_n_test)); - tests->add(BOOST_TEST_CASE(&validity_rinsert_range_test)); - tests->add(BOOST_TEST_CASE(&validity_erase_test)); - tests->add(BOOST_TEST_CASE(&validity_erase_range_test)); - tests->add(BOOST_TEST_CASE(&validity_rerase_test)); - tests->add(BOOST_TEST_CASE(&validity_rerase_range_test)); - tests->add(BOOST_TEST_CASE(&validity_linearize_test)); - tests->add(BOOST_TEST_CASE(&validity_swap_test)); - tests->add(BOOST_TEST_CASE(&validity_push_back_test)); - tests->add(BOOST_TEST_CASE(&validity_push_front_test)); - tests->add(BOOST_TEST_CASE(&validity_pop_back_test)); - tests->add(BOOST_TEST_CASE(&validity_pop_front_test)); - - return tests; -} diff --git a/libs/circular_buffer/test/space_optimized_test.cpp b/libs/circular_buffer/test/space_optimized_test.cpp deleted file mode 100644 index 3c708c9ff..000000000 --- a/libs/circular_buffer/test/space_optimized_test.cpp +++ /dev/null @@ -1,196 +0,0 @@ -// Test of the space optimized adaptor of the circular buffer. - -// Copyright (c) 2003-2008 Jan Gaspar - -// 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) - -#include "test.hpp" - -#define CB_CONTAINER circular_buffer_space_optimized - -#include "common.ipp" - -typedef circular_buffer_space_optimized cb_space_optimized; -typedef cb_space_optimized::capacity_type capacity_ctrl; - -// min_capacity test (it is useful to use a debug tool) -void min_capacity_test() { - - vector v; - v.push_back(1); - v.push_back(2); - v.push_back(3); - v.push_back(4); - v.push_back(5); - - cb_space_optimized cb1(capacity_ctrl(10, 10)); - cb_space_optimized cb2(capacity_ctrl(10, 5), 1); - cb_space_optimized cb3(capacity_ctrl(20, 10), v.begin(), v.end()); - - BOOST_CHECK(cb1.size() == 0); - BOOST_CHECK(cb1.capacity().capacity() == 10); - BOOST_CHECK(cb1.capacity().min_capacity() == 10); - BOOST_CHECK(cb2[0] == 1); - BOOST_CHECK(cb2.size() == 10); - BOOST_CHECK(cb2.capacity() == 10); - BOOST_CHECK(cb2.capacity().min_capacity() == 5); - BOOST_CHECK(cb3[0] == 1); - BOOST_CHECK(cb3.size() == 5); - BOOST_CHECK(cb3.capacity() == 20); - BOOST_CHECK(cb3.capacity().min_capacity() == 10); - BOOST_CHECK(cb1.capacity().min_capacity() <= cb1.internal_capacity()); - BOOST_CHECK(cb2.capacity().min_capacity() <= cb2.internal_capacity()); - BOOST_CHECK(cb3.capacity().min_capacity() <= cb3.internal_capacity()); - - cb2.erase(cb2.begin() + 2, cb2.end()); - - BOOST_CHECK(cb2.size() == 2); - BOOST_CHECK(cb2.capacity().min_capacity() <= cb2.internal_capacity()); - - cb2.clear(); - cb3.clear(); - - BOOST_CHECK(cb2.empty()); - BOOST_CHECK(cb3.empty()); - BOOST_CHECK(cb2.capacity().min_capacity() <= cb2.internal_capacity()); - BOOST_CHECK(cb3.capacity().min_capacity() <= cb3.internal_capacity()); -} - -void capacity_control_test() { - - circular_buffer_space_optimized::capacity_type c1 = 10; - circular_buffer_space_optimized::capacity_type c2 = - circular_buffer_space_optimized::capacity_type(20, 5); - circular_buffer_space_optimized::capacity_type c3 = c2; - - BOOST_CHECK(c1.capacity() == 10); - BOOST_CHECK(c1.min_capacity() == 0); - BOOST_CHECK(c2.capacity() == 20); - BOOST_CHECK(c2.min_capacity() == 5); - BOOST_CHECK(c3.capacity() == 20); - BOOST_CHECK(c3.min_capacity() == 5); - - c1 = c2; - - BOOST_CHECK(c1.capacity() == 20); - BOOST_CHECK(c1.min_capacity() == 5); -} - -void specific_constructors_test() { - - cb_space_optimized cb1; - BOOST_CHECK(cb1.capacity() == 0); - BOOST_CHECK(cb1.capacity().min_capacity() == 0); - BOOST_CHECK(cb1.internal_capacity() == 0); - BOOST_CHECK(cb1.size() == 0); - - cb1.push_back(1); - cb1.push_back(2); - cb1.push_back(3); - - BOOST_CHECK(cb1.size() == 0); - BOOST_CHECK(cb1.capacity() == 0); - - vector v; - v.push_back(1); - v.push_back(2); - v.push_back(3); - - cb_space_optimized cb2(v.begin(), v.end()); - - BOOST_CHECK(cb2.capacity() == 3); - BOOST_CHECK(cb2.capacity().min_capacity() == 0); - BOOST_CHECK(cb2.size() == 3); -} - -void shrink_to_fit_test() { - - cb_space_optimized cb(1000); - cb.push_back(1); - cb.push_back(2); - cb.push_back(3); - - BOOST_CHECK(cb.size() == 3); - BOOST_CHECK(cb.capacity() == 1000); - - size_t internal_capacity = cb.internal_capacity(); - cb_space_optimized(cb).swap(cb); - - BOOST_CHECK(cb.size() == 3); - BOOST_CHECK(cb.capacity() == 1000); - BOOST_CHECK(internal_capacity >= cb.internal_capacity()); -} - -void iterator_invalidation_test() { - -#if BOOST_CB_ENABLE_DEBUG - - cb_space_optimized cb1(10, 1); - cb1.push_back(2); - cb1.push_back(3); - cb1.push_back(4); - cb_space_optimized::iterator it1 = cb1.end(); - cb_space_optimized::const_iterator it2 = cb1.begin(); - cb_space_optimized::iterator it3 = cb1.begin() + 6; - - cb1.set_capacity(10); - BOOST_CHECK(it1.is_valid(&cb1)); - BOOST_CHECK(!it2.is_valid(&cb1)); - BOOST_CHECK(!it3.is_valid(&cb1)); - - it1 = cb1.end(); - it2 = cb1.begin(); - it3 = cb1.begin() + 6; - cb1.rset_capacity(10); - BOOST_CHECK(it1.is_valid(&cb1)); - BOOST_CHECK(!it2.is_valid(&cb1)); - BOOST_CHECK(!it3.is_valid(&cb1)); - - it1 = cb1.end(); - it2 = cb1.begin(); - it3 = cb1.begin() + 6; - cb1.resize(10); - BOOST_CHECK(it1.is_valid(&cb1)); - BOOST_CHECK(!it2.is_valid(&cb1)); - BOOST_CHECK(!it3.is_valid(&cb1)); - - it1 = cb1.end(); - it2 = cb1.begin(); - it3 = cb1.begin() + 6; - cb1.rresize(10); - BOOST_CHECK(it1.is_valid(&cb1)); - BOOST_CHECK(!it2.is_valid(&cb1)); - BOOST_CHECK(!it3.is_valid(&cb1)); - - { - cb_space_optimized cb2(10, 1); - cb2.push_back(2); - cb2.push_back(3); - cb2.push_back(4); - it1 = cb2.end(); - it2 = cb2.begin(); - it3 = cb2.begin() + 6; - } - BOOST_CHECK(!it1.is_valid(&cb1)); - BOOST_CHECK(!it2.is_valid(&cb1)); - BOOST_CHECK(!it3.is_valid(&cb1)); - -#endif // #if BOOST_CB_ENABLE_DEBUG -} - -// test main -test_suite* init_unit_test_suite(int /*argc*/, char* /*argv*/[]) { - - test_suite* tests = BOOST_TEST_SUITE("Unit tests for the circular_buffer_space_optimized."); - add_common_tests(tests); - - tests->add(BOOST_TEST_CASE(&min_capacity_test)); - tests->add(BOOST_TEST_CASE(&capacity_control_test)); - tests->add(BOOST_TEST_CASE(&specific_constructors_test)); - tests->add(BOOST_TEST_CASE(&shrink_to_fit_test)); - tests->add(BOOST_TEST_CASE(&iterator_invalidation_test)); - - return tests; -} diff --git a/libs/circular_buffer/test/test.hpp b/libs/circular_buffer/test/test.hpp deleted file mode 100644 index 96b532b5b..000000000 --- a/libs/circular_buffer/test/test.hpp +++ /dev/null @@ -1,146 +0,0 @@ -// Header file for the test of the circular buffer library. - -// Copyright (c) 2003-2008 Jan Gaspar - -// 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) - -#if !defined(BOOST_CIRCULAR_BUFFER_TEST_HPP) -#define BOOST_CIRCULAR_BUFFER_TEST_HPP - -#if defined(_MSC_VER) && _MSC_VER >= 1200 - #pragma once -#endif - -#define BOOST_CB_TEST - -#include -#include -#include -#include -#include -#include -#if !defined(BOOST_NO_EXCEPTIONS) - #include -#endif - -// Integer (substitute for int) - more appropriate for testing -class MyInteger { -private: - int* m_pValue; - static int ms_exception_trigger; - void check_exception() { - if (ms_exception_trigger > 0) { - if (--ms_exception_trigger == 0) { - delete m_pValue; - m_pValue = 0; -#if !defined(BOOST_NO_EXCEPTIONS) - throw std::exception(); -#endif - } - } - } -public: - MyInteger() : m_pValue(new int(0)) { check_exception(); } - MyInteger(int i) : m_pValue(new int(i)) { check_exception(); } - MyInteger(const MyInteger& src) : m_pValue(new int(src)) { check_exception(); } - ~MyInteger() { delete m_pValue; } - MyInteger& operator = (const MyInteger& src) { - if (this == &src) - return *this; - check_exception(); - delete m_pValue; - m_pValue = new int(src); - return *this; - } - operator int () const { return *m_pValue; } - static void set_exception_trigger(int n) { ms_exception_trigger = n; } -}; - -// default constructible class -class MyDefaultConstructible -{ -public: - MyDefaultConstructible() : m_n(1) {} - MyDefaultConstructible(int n) : m_n(n) {} - int m_n; -}; - -// class counting instances of self -class InstanceCounter { -public: - InstanceCounter() { increment(); } - InstanceCounter(const InstanceCounter& y) { y.increment(); } - ~InstanceCounter() { decrement(); } - static int count() { return ms_count; } -private: - void increment() const { ++ms_count; } - void decrement() const { --ms_count; } - static int ms_count; -}; - -// dummy class suitable for iterator referencing test -class Dummy { -public: - enum DummyEnum { - eVar, - eFnc, - eConst, - eVirtual - }; - Dummy() : m_n(eVar) {} - DummyEnum fnc() { return eFnc; } - DummyEnum const_fnc() const { return eConst; } - virtual DummyEnum virtual_fnc() { return eVirtual; } - DummyEnum m_n; -}; - -// simulator of an input iterator -struct MyInputIterator -: boost::iterator { - typedef std::vector::iterator vector_iterator; - typedef int value_type; - typedef int* pointer; - typedef int& reference; - typedef size_t size_type; - typedef ptrdiff_t difference_type; - explicit MyInputIterator(const vector_iterator& it) : m_it(it) {} - MyInputIterator& operator = (const MyInputIterator& it) { - if (this == &it) - return *this; - m_it = it.m_it; - return *this; - } - reference operator * () const { return *m_it; } - pointer operator -> () const { return &(operator*()); } - MyInputIterator& operator ++ () { - ++m_it; - return *this; - } - MyInputIterator operator ++ (int) { - MyInputIterator tmp = *this; - ++*this; - return tmp; - } - bool operator == (const MyInputIterator& it) const { return m_it == it.m_it; } - bool operator != (const MyInputIterator& it) const { return m_it != it.m_it; } -private: - vector_iterator m_it; -}; - -#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) - -inline std::input_iterator_tag iterator_category(const MyInputIterator&) { - return std::input_iterator_tag(); -} -inline int* value_type(const MyInputIterator&) { return 0; } -inline ptrdiff_t* distance_type(const MyInputIterator&) { return 0; } - -#endif // #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) - -using boost::unit_test::test_suite; -using namespace boost; -using namespace std; - -#endif // #if !defined(BOOST_CIRCULAR_BUFFER_TEST_HPP) diff --git a/libs/config/checks/Jamfile.v2 b/libs/config/checks/Jamfile.v2 deleted file mode 100644 index 4c57cde8a..000000000 --- a/libs/config/checks/Jamfile.v2 +++ /dev/null @@ -1,220 +0,0 @@ -# -# *** DO NOT EDIT THIS FILE BY HAND *** -# This file was automatically generated on Mon Dec 12 19:37:08 2016 -# by libs/config/tools/generate.cpp -# Copyright John Maddock. -# 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) - -import modules ; -import path ; -import testing ; - -rule run-simple ( requirements * : target-name ) -{ - obj $(target-name)_obj : test_case.cpp : $(requirements) ; - explicit $(target-name)_obj ; - unit-test $(target-name) : $(target-name)_obj : $(requirements) ; - explicit $(target-name) ; -} - -run-simple TEST_BOOST_HAS_TWO_ARG_USE_FACET : two_arg_use_facet ; -run-simple TEST_BOOST_HAS_BETHREADS : bethreads ; -run-simple TEST_BOOST_HAS_CLOCK_GETTIME : clock_gettime ; -run-simple TEST_BOOST_HAS_DIRENT_H : dirent_h ; -run-simple TEST_BOOST_HAS_EXPM1 : expm1 ; -run-simple TEST_BOOST_HAS_FLOAT128 : float128 ; -run-simple TEST_BOOST_HAS_FTIME : ftime ; -run-simple TEST_BOOST_HAS_GETSYSTEMTIMEASFILETIME : getsystemtimeasfiletime ; -run-simple TEST_BOOST_HAS_GETTIMEOFDAY : gettimeofday ; -run-simple TEST_BOOST_HAS_HASH : hash ; -run-simple TEST_BOOST_HAS_INT128 : int128 ; -run-simple TEST_BOOST_HAS_LOG1P : log1p ; -run-simple TEST_BOOST_HAS_LONG_LONG : long_long ; -run-simple TEST_BOOST_HAS_MACRO_USE_FACET : macro_use_facet ; -run-simple TEST_BOOST_HAS_MS_INT64 : ms_int64 ; -run-simple TEST_BOOST_HAS_NANOSLEEP : nanosleep ; -run-simple TEST_BOOST_HAS_NL_TYPES_H : nl_types_h ; -run-simple TEST_BOOST_HAS_NRVO : nrvo ; -run-simple TEST_BOOST_HAS_PARTIAL_STD_ALLOCATOR : partial_std_allocator ; -run-simple TEST_BOOST_HAS_PTHREAD_DELAY_NP : pthread_delay_np ; -run-simple TEST_BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE : pthread_mutexattr_settype ; -run-simple TEST_BOOST_HAS_PTHREAD_YIELD : pthread_yield ; -run-simple TEST_BOOST_HAS_PTHREADS : pthreads ; -run-simple TEST_BOOST_HAS_RVALUE_REFS : rvalue_refs ; -run-simple TEST_BOOST_HAS_SCHED_YIELD : sched_yield ; -run-simple TEST_BOOST_HAS_SGI_TYPE_TRAITS : sgi_type_traits ; -run-simple TEST_BOOST_HAS_SIGACTION : sigaction ; -run-simple TEST_BOOST_HAS_SLIST : slist ; -run-simple TEST_BOOST_HAS_STATIC_ASSERT : static_assert ; -run-simple TEST_BOOST_HAS_STDINT_H : stdint_h ; -run-simple TEST_BOOST_HAS_STLP_USE_FACET : stlp_use_facet ; -run-simple TEST_BOOST_HAS_TR1_ARRAY : tr1_array ; -run-simple TEST_BOOST_HAS_TR1_BIND : tr1_bind ; -run-simple TEST_BOOST_HAS_TR1_COMPLEX_OVERLOADS : tr1_complex_overloads ; -run-simple TEST_BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG : tr1_complex_inverse_trig ; -run-simple TEST_BOOST_HAS_TR1_FUNCTION : tr1_function ; -run-simple TEST_BOOST_HAS_TR1_HASH : tr1_hash ; -run-simple TEST_BOOST_HAS_TR1_MEM_FN : tr1_mem_fn ; -run-simple TEST_BOOST_HAS_TR1_RANDOM : tr1_random ; -run-simple TEST_BOOST_HAS_TR1_REFERENCE_WRAPPER : tr1_reference_wrapper ; -run-simple TEST_BOOST_HAS_TR1_REGEX : tr1_regex ; -run-simple TEST_BOOST_HAS_TR1_RESULT_OF : tr1_result_of ; -run-simple TEST_BOOST_HAS_TR1_SHARED_PTR : tr1_shared_ptr ; -run-simple TEST_BOOST_HAS_TR1_TUPLE : tr1_tuple ; -run-simple TEST_BOOST_HAS_TR1_TYPE_TRAITS : tr1_type_traits ; -run-simple TEST_BOOST_HAS_TR1_UNORDERED_MAP : tr1_unordered_map ; -run-simple TEST_BOOST_HAS_TR1_UNORDERED_SET : tr1_unordered_set ; -run-simple TEST_BOOST_HAS_TR1_UTILITY : tr1_utility ; -run-simple TEST_BOOST_HAS_UNISTD_H : unistd_h ; -run-simple TEST_BOOST_HAS_VARIADIC_TMPL : variadic_tmpl ; -run-simple TEST_BOOST_MSVC6_MEMBER_TEMPLATES : boost_msvc6_member_templates ; -run-simple TEST_BOOST_MSVC_STD_ITERATOR : boost_msvc_std_iterator ; -run-simple TEST_BOOST_HAS_WINTHREADS : winthreads ; -run-simple TEST_BOOST_NO_ADL_BARRIER : adl_barrier ; -run-simple TEST_BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP : argument_dependent_lookup ; -run-simple TEST_BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS : array_type_specializations ; -run-simple TEST_BOOST_NO_CXX11_AUTO_DECLARATIONS : cxx11_auto_declarations ; -run-simple TEST_BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS : cxx11_auto_multideclarations ; -run-simple TEST_BOOST_NO_AUTO_PTR : auto_ptr ; -run-simple TEST_BOOST_BCB_PARTIAL_SPECIALIZATION_BUG : boost_bcb_partial_specialization_bug ; -run-simple TEST_BOOST_NO_CXX11_CHAR16_T : cxx11_char16_t ; -run-simple TEST_BOOST_NO_CXX11_CHAR32_T : cxx11_char32_t ; -run-simple TEST_BOOST_NO_COMPLETE_VALUE_INITIALIZATION : complete_value_initialization ; -run-simple TEST_BOOST_NO_CXX11_CONSTEXPR : cxx11_constexpr ; -run-simple TEST_BOOST_NO_CTYPE_FUNCTIONS : ctype_functions ; -run-simple TEST_BOOST_NO_CV_SPECIALIZATIONS : cv_specializations ; -run-simple TEST_BOOST_NO_CV_VOID_SPECIALIZATIONS : cv_void_specializations ; -run-simple TEST_BOOST_NO_CWCHAR : cwchar ; -run-simple TEST_BOOST_NO_CWCTYPE : cwctype ; -run-simple TEST_BOOST_NO_CXX11_ADDRESSOF : cxx11_addressof ; -run-simple TEST_BOOST_NO_CXX11_ALIGNAS : cxx11_alignas ; -run-simple TEST_BOOST_NO_CXX11_ALLOCATOR : cxx11_allocator ; -run-simple TEST_BOOST_NO_CXX11_ATOMIC_SMART_PTR : cxx11_atomic_smart_ptr ; -run-simple TEST_BOOST_NO_CXX11_FINAL : cxx11_final ; -run-simple TEST_BOOST_NO_CXX11_HDR_ARRAY : cxx11_hdr_array ; -run-simple TEST_BOOST_NO_CXX11_HDR_ATOMIC : cxx11_hdr_atomic ; -run-simple TEST_BOOST_NO_CXX11_HDR_CHRONO : cxx11_hdr_chrono ; -run-simple TEST_BOOST_NO_CXX11_HDR_CODECVT : cxx11_hdr_codecvt ; -run-simple TEST_BOOST_NO_CXX11_HDR_CONDITION_VARIABLE : cxx11_hdr_condition_variable ; -run-simple TEST_BOOST_NO_CXX11_HDR_FORWARD_LIST : cxx11_hdr_forward_list ; -run-simple TEST_BOOST_NO_CXX11_HDR_FUTURE : cxx11_hdr_future ; -run-simple TEST_BOOST_NO_CXX11_HDR_INITIALIZER_LIST : cxx11_hdr_initializer_list ; -run-simple TEST_BOOST_NO_CXX11_HDR_MUTEX : cxx11_hdr_mutex ; -run-simple TEST_BOOST_NO_CXX11_HDR_RANDOM : cxx11_hdr_random ; -run-simple TEST_BOOST_NO_CXX11_HDR_RATIO : cxx11_hdr_ratio ; -run-simple TEST_BOOST_NO_CXX11_HDR_REGEX : cxx11_hdr_regex ; -run-simple TEST_BOOST_NO_CXX11_HDR_SYSTEM_ERROR : cxx11_hdr_system_error ; -run-simple TEST_BOOST_NO_CXX11_HDR_THREAD : cxx11_hdr_thread ; -run-simple TEST_BOOST_NO_CXX11_HDR_TUPLE : cxx11_hdr_tuple ; -run-simple TEST_BOOST_NO_CXX11_HDR_TYPE_TRAITS : cxx11_hdr_type_traits ; -run-simple TEST_BOOST_NO_CXX11_HDR_TYPEINDEX : cxx11_hdr_typeindex ; -run-simple TEST_BOOST_NO_CXX11_HDR_UNORDERED_MAP : cxx11_hdr_unordered_map ; -run-simple TEST_BOOST_NO_CXX11_HDR_UNORDERED_SET : cxx11_hdr_unordered_set ; -run-simple TEST_BOOST_NO_CXX11_INLINE_NAMESPACES : cxx11_inline_namespaces ; -run-simple TEST_BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS : cxx11_non_public_defaulted_functions ; -run-simple TEST_BOOST_NO_CXX11_NUMERIC_LIMITS : cxx11_numeric_limits ; -run-simple TEST_BOOST_NO_CXX11_REF_QUALIFIERS : cxx11_ref_qualifiers ; -run-simple TEST_BOOST_NO_CXX11_SMART_PTR : cxx11_smart_ptr ; -run-simple TEST_BOOST_NO_CXX11_STD_ALIGN : cxx11_std_align ; -run-simple TEST_BOOST_NO_CXX11_THREAD_LOCAL : cxx11_thread_local ; -run-simple TEST_BOOST_NO_CXX11_TRAILING_RESULT_TYPES : cxx11_trailing_result_types ; -run-simple TEST_BOOST_NO_CXX11_USER_DEFINED_LITERALS : cxx11_user_defined_literals ; -run-simple TEST_BOOST_NO_CXX14_BINARY_LITERALS : cxx14_binary_literals ; -run-simple TEST_BOOST_NO_CXX14_CONSTEXPR : cxx14_constexpr ; -run-simple TEST_BOOST_NO_CXX14_DECLTYPE_AUTO : cxx14_decltype_auto ; -run-simple TEST_BOOST_NO_CXX14_DIGIT_SEPARATORS : cxx14_digit_separators ; -run-simple TEST_BOOST_NO_CXX14_GENERIC_LAMBDAS : cxx14_generic_lambdas ; -run-simple TEST_BOOST_NO_CXX14_HDR_SHARED_MUTEX : cxx14_hdr_shared_mutex ; -run-simple TEST_BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES : cxx14_initialized_lambda_captures ; -run-simple TEST_BOOST_NO_CXX14_AGGREGATE_NSDMI : cxx14_aggregate_nsdmi ; -run-simple TEST_BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION : cxx14_return_type_deduction ; -run-simple TEST_BOOST_NO_CXX14_STD_EXCHANGE : cxx14_std_exchange ; -run-simple TEST_BOOST_NO_CXX14_VARIABLE_TEMPLATES : cxx14_variable_templates ; -run-simple TEST_BOOST_NO_CXX17_STD_APPLY : cxx17_std_apply ; -run-simple TEST_BOOST_NO_CXX17_STD_INVOKE : cxx17_std_invoke ; -run-simple TEST_BOOST_NO_CXX11_HDR_FUNCTIONAL : cxx11_hdr_functional ; -run-simple TEST_BOOST_NO_CXX11_DECLTYPE : cxx11_decltype ; -run-simple TEST_BOOST_NO_CXX11_DECLTYPE_N3276 : cxx11_decltype_n3276 ; -run-simple TEST_BOOST_DEDUCED_TYPENAME : boost_deduced_typename ; -run-simple TEST_BOOST_NO_CXX11_DEFAULTED_FUNCTIONS : cxx11_defaulted_functions ; -run-simple TEST_BOOST_NO_CXX11_DELETED_FUNCTIONS : cxx11_deleted_functions ; -run-simple TEST_BOOST_NO_DEPENDENT_NESTED_DERIVATIONS : dependent_nested_derivations ; -run-simple TEST_BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS : dependent_types_in_template_value_parameters ; -run-simple TEST_BOOST_NO_EXCEPTION_STD_NAMESPACE : exception_std_namespace ; -run-simple TEST_BOOST_NO_EXCEPTIONS : exceptions ; -run-simple TEST_BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS : explicit_function_template_arguments ; -run-simple TEST_BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS : cxx11_explicit_conversion_operators ; -run-simple TEST_BOOST_NO_CXX11_EXTERN_TEMPLATE : cxx11_extern_template ; -run-simple TEST_BOOST_NO_FENV_H : fenv_h ; -run-simple TEST_BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS : cxx11_fixed_length_variadic_template_expansion_packs ; -run-simple TEST_BOOST_NO_FUNCTION_TEMPLATE_ORDERING : function_template_ordering ; -run-simple TEST_BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS : cxx11_function_template_default_args ; -run-simple TEST_BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS : function_type_specializations ; -run-simple TEST_BOOST_NO_MS_INT64_NUMERIC_LIMITS : ms_int64_numeric_limits ; -run-simple TEST_BOOST_NO_INCLASS_MEMBER_INITIALIZATION : inclass_member_initialization ; -run-simple TEST_BOOST_NO_INTEGRAL_INT64_T : integral_int64_t ; -run-simple TEST_BOOST_NO_IOSFWD : iosfwd ; -run-simple TEST_BOOST_NO_IOSTREAM : iostream ; -run-simple TEST_BOOST_NO_IS_ABSTRACT : is_abstract ; -run-simple TEST_BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS : templated_iterator_constructors ; -run-simple TEST_BOOST_NO_CXX11_LAMBDAS : cxx11_lambdas ; -run-simple TEST_BOOST_NO_LIMITS : limits ; -run-simple TEST_BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS : limits_compile_time_constants ; -run-simple TEST_BOOST_NO_LONG_LONG_NUMERIC_LIMITS : long_long_numeric_limits ; -run-simple TEST_BOOST_NO_LONG_LONG : long_long ; -run-simple TEST_BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS : member_function_specializations ; -run-simple TEST_BOOST_NO_MEMBER_TEMPLATE_KEYWORD : member_template_keyword ; -run-simple TEST_BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS : pointer_to_member_template_parameters ; -run-simple TEST_BOOST_NO_MEMBER_TEMPLATE_FRIENDS : member_template_friends ; -run-simple TEST_BOOST_NO_MEMBER_TEMPLATES : member_templates ; -run-simple TEST_BOOST_NO_NESTED_FRIENDSHIP : nested_friendship ; -run-simple TEST_BOOST_NO_CXX11_NOEXCEPT : cxx11_noexcept ; -run-simple TEST_BOOST_NO_CXX11_NULLPTR : cxx11_nullptr ; -run-simple TEST_BOOST_NO_OPERATORS_IN_NAMESPACE : operators_in_namespace ; -run-simple TEST_BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS : partial_specialization_implicit_default_args ; -run-simple TEST_BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION : template_partial_specialization ; -run-simple TEST_BOOST_NO_PRIVATE_IN_AGGREGATE : private_in_aggregate ; -run-simple TEST_BOOST_NO_POINTER_TO_MEMBER_CONST : pointer_to_member_const ; -run-simple TEST_BOOST_NO_CXX11_RANGE_BASED_FOR : cxx11_range_based_for ; -run-simple TEST_BOOST_NO_CXX11_RAW_LITERALS : cxx11_raw_literals ; -run-simple TEST_BOOST_NO_UNREACHABLE_RETURN_DETECTION : unreachable_return_detection ; -run-simple TEST_BOOST_NO_RTTI : rtti ; -run-simple TEST_BOOST_NO_CXX11_RVALUE_REFERENCES : cxx11_rvalue_references ; -run-simple TEST_BOOST_NO_CXX11_SCOPED_ENUMS : cxx11_scoped_enums ; -run-simple TEST_BOOST_NO_SFINAE : sfinae ; -run-simple TEST_BOOST_NO_SFINAE_EXPR : sfinae_expr ; -run-simple TEST_BOOST_NO_STRINGSTREAM : stringstream ; -run-simple TEST_BOOST_NO_CXX11_STATIC_ASSERT : cxx11_static_assert ; -run-simple TEST_BOOST_NO_STD_ALLOCATOR : std_allocator ; -run-simple TEST_BOOST_NO_STD_DISTANCE : std_distance ; -run-simple TEST_BOOST_NO_STD_ITERATOR_TRAITS : std_iterator_traits ; -run-simple TEST_BOOST_NO_STD_ITERATOR : std_iterator ; -run-simple TEST_BOOST_NO_STD_LOCALE : std_locale ; -run-simple TEST_BOOST_NO_STD_MESSAGES : std_messages ; -run-simple TEST_BOOST_NO_STD_MIN_MAX : std_min_max ; -run-simple TEST_BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN : std_output_iterator_assign ; -run-simple TEST_BOOST_NO_STD_TYPEINFO : std_typeinfo ; -run-simple TEST_BOOST_NO_STD_USE_FACET : std_use_facet ; -run-simple TEST_BOOST_NO_STD_WSTREAMBUF : std_wstreambuf ; -run-simple TEST_BOOST_NO_STD_WSTRING : std_wstring ; -run-simple TEST_BOOST_NO_STDC_NAMESPACE : stdc_namespace ; -run-simple TEST_BOOST_NO_SWPRINTF : swprintf ; -run-simple TEST_BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS : cxx11_local_class_template_parameters ; -run-simple TEST_BOOST_NO_CXX11_TEMPLATE_ALIASES : cxx11_template_aliases ; -run-simple TEST_BOOST_NO_TEMPLATED_IOSTREAMS : templated_iostreams ; -run-simple TEST_BOOST_NO_TEMPLATE_TEMPLATES : template_templates ; -run-simple TEST_BOOST_NO_TWO_PHASE_NAME_LOOKUP : two_phase_name_lookup ; -run-simple TEST_BOOST_NO_TYPEID : typeid ; -run-simple TEST_BOOST_NO_TYPENAME_WITH_CTOR : typename_with_ctor ; -run-simple TEST_BOOST_NO_CXX11_UNICODE_LITERALS : cxx11_unicode_literals ; -run-simple TEST_BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX : cxx11_unified_initialization_syntax ; -run-simple TEST_BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL : boost_function_scope_using_declaration_breaks_adl ; -run-simple TEST_BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE : using_declaration_overloads_from_typename_base ; -run-simple TEST_BOOST_NO_USING_TEMPLATE : using_template ; -run-simple TEST_BOOST_NO_CXX11_VARIADIC_MACROS : cxx11_variadic_macros ; -run-simple TEST_BOOST_NO_CXX11_VARIADIC_TEMPLATES : cxx11_variadic_templates ; -run-simple TEST_BOOST_NO_VOID_RETURNS : void_returns ; -run-simple TEST_BOOST_NO_INTRINSIC_WCHAR_T : intrinsic_wchar_t ; - diff --git a/libs/config/checks/architecture/32.cpp b/libs/config/checks/architecture/32.cpp deleted file mode 100644 index d3d2dba29..000000000 --- a/libs/config/checks/architecture/32.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// 32.cpp -// -// Copyright (c) 2012 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) - -int test[sizeof(void*) == 4? 1 : -1]; diff --git a/libs/config/checks/architecture/64.cpp b/libs/config/checks/architecture/64.cpp deleted file mode 100644 index 5a33bc645..000000000 --- a/libs/config/checks/architecture/64.cpp +++ /dev/null @@ -1,9 +0,0 @@ -// 64.cpp -// -// Copyright (c) 2012 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) - -int test[sizeof(void*) == 8? 1 : -1]; diff --git a/libs/config/checks/architecture/Jamroot.jam b/libs/config/checks/architecture/Jamroot.jam deleted file mode 100644 index ca653b751..000000000 --- a/libs/config/checks/architecture/Jamroot.jam +++ /dev/null @@ -1,23 +0,0 @@ -# Jamfile.jam -# -# Copyright 2012 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) - -project /boost/architecture - : requirements - -@boostcpp.deduce-address-model - -@boostcpp.deduce-architecture - ; - -obj 32 : 32.cpp ; -obj 64 : 64.cpp ; - -obj arm : arm.cpp ; -obj combined : combined.cpp ; -obj mips1 : mips1.cpp ; -obj power : power.cpp ; -obj sparc : sparc.cpp ; -obj x86 : x86.cpp ; diff --git a/libs/config/checks/architecture/arm.cpp b/libs/config/checks/architecture/arm.cpp deleted file mode 100644 index 794aba8b3..000000000 --- a/libs/config/checks/architecture/arm.cpp +++ /dev/null @@ -1,15 +0,0 @@ -// arm.cpp -// -// Copyright (c) 2012 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) - -#if !defined(__arm__) && !defined(__thumb__) && \ - !defined(__TARGET_ARCH_ARM) && !defined(__TARGET_ARCH_THUMB) && \ - !defined(_ARM) && !defined(_M_ARM) && \ - !defined(__aarch64__) -#error "Not ARM" -#endif - diff --git a/libs/config/checks/architecture/combined.cpp b/libs/config/checks/architecture/combined.cpp deleted file mode 100644 index 4e5a387b9..000000000 --- a/libs/config/checks/architecture/combined.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// combined.cpp -// -// Copyright (c) 2012 Steven Watanabe -// 2014 Oliver Kowalke -// -// Distributed under the 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(i386) && !defined(__i386__) && !defined(__i386) \ - && !defined(__i486__) && !defined(__i586__) && !defined(__i686__) \ - && !defined(_M_IX86) && !defined(__X86__) && !defined(_X86_) \ - && !defined(__THW_INTEL__) && !defined(__I86__) && !defined(__INTEL__) \ - && !defined(__amd64__) && !defined(__x86_64__) && !defined(__amd64) \ - && !defined(__x86_64) && !defined(_M_X64) \ - && !defined(__powerpc) && !defined(__powerpc__) && !defined(__ppc) \ - && !defined(__ppc__) && !defined(_M_PPC) && !defined(_ARCH_PPC) \ - && !defined(__POWERPC__) && !defined(__PPCGECKO__) \ - && !defined(__PPCBROADWAY) && !defined(_XENON) -#error "Not combined" -#endif diff --git a/libs/config/checks/architecture/mips1.cpp b/libs/config/checks/architecture/mips1.cpp deleted file mode 100644 index adc4a61d0..000000000 --- a/libs/config/checks/architecture/mips1.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// mips1.cpp -// -// Copyright (c) 2012 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) - -#if !((defined(__mips) && __mips == 1) || defined(_MIPS_ISA_MIPS1) || defined(_R3000)) -#error "Not MIPS1" -#endif diff --git a/libs/config/checks/architecture/power.cpp b/libs/config/checks/architecture/power.cpp deleted file mode 100644 index 0551194a9..000000000 --- a/libs/config/checks/architecture/power.cpp +++ /dev/null @@ -1,14 +0,0 @@ -// power.cpp -// -// Copyright (c) 2012 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) - -#if !defined(__powerpc) && !defined(__powerpc__) && !defined(__ppc) \ - && !defined(__ppc__) && !defined(_M_PPC) && !defined(_ARCH_PPC) \ - && !defined(__POWERPC__) && !defined(__PPCGECKO__) \ - && !defined(__PPCBROADWAY) && !defined(_XENON) -#error "Not PPC" -#endif diff --git a/libs/config/checks/architecture/sparc.cpp b/libs/config/checks/architecture/sparc.cpp deleted file mode 100644 index 3df2df84e..000000000 --- a/libs/config/checks/architecture/sparc.cpp +++ /dev/null @@ -1,11 +0,0 @@ -// power.cpp -// -// Copyright (c) 2012 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) - -#if !defined(__sparc__) && !defined(__sparc) -#error "Not SPARC" -#endif diff --git a/libs/config/checks/architecture/x86.cpp b/libs/config/checks/architecture/x86.cpp deleted file mode 100644 index 0d2f9c2e9..000000000 --- a/libs/config/checks/architecture/x86.cpp +++ /dev/null @@ -1,16 +0,0 @@ -// x86.cpp -// -// Copyright (c) 2012 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) - -#if !defined(i386) && !defined(__i386__) && !defined(__i386) \ - && !defined(__i486__) && !defined(__i586__) && !defined(__i686__) \ - && !defined(_M_IX86) && !defined(__X86__) && !defined(_X86_) \ - && !defined(__THW_INTEL__) && !defined(__I86__) && !defined(__INTEL__) \ - && !defined(__amd64__) && !defined(__x86_64__) && !defined(__amd64) \ - && !defined(__x86_64) && !defined(_M_X64) -#error "Not x86" -#endif diff --git a/libs/config/checks/config.jam b/libs/config/checks/config.jam deleted file mode 100644 index c5adfe7b7..000000000 --- a/libs/config/checks/config.jam +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright John Maddock. -# 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) - -import modules ; - -rule requires ( names + ) -{ - local config-binding = [ modules.binding $(__name__) ] ; - - local result ; - for name in $(names) - { - local msg = "Boost.Config Feature Check: " ; - msg += $(name) ; - result += [ check-target-builds $(config-binding:D)//$(name) $(msg:J=) : : no ] ; - } - return $(result) ; -} - diff --git a/libs/config/checks/test_case.cpp b/libs/config/checks/test_case.cpp deleted file mode 100644 index dbfaa653f..000000000 --- a/libs/config/checks/test_case.cpp +++ /dev/null @@ -1,809 +0,0 @@ -// This file was automatically generated on Mon Dec 12 19:37:08 2016 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - -#ifdef TEST_BOOST_HAS_TWO_ARG_USE_FACET -# include "../test/boost_has_2arg_use_facet.ipp" -namespace test = boost_has_two_arg_use_facet; -#endif -#ifdef TEST_BOOST_HAS_BETHREADS -# include "../test/boost_has_bethreads.ipp" -namespace test = boost_has_bethreads; -#endif -#ifdef TEST_BOOST_HAS_CLOCK_GETTIME -# include "../test/boost_has_clock_gettime.ipp" -namespace test = boost_has_clock_gettime; -#endif -#ifdef TEST_BOOST_HAS_DIRENT_H -# include "../test/boost_has_dirent_h.ipp" -namespace test = boost_has_dirent_h; -#endif -#ifdef TEST_BOOST_HAS_EXPM1 -# include "../test/boost_has_expm1.ipp" -namespace test = boost_has_expm1; -#endif -#ifdef TEST_BOOST_HAS_FLOAT128 -# include "../test/boost_has_float128.ipp" -namespace test = boost_has_float128; -#endif -#ifdef TEST_BOOST_HAS_FTIME -# include "../test/boost_has_ftime.ipp" -namespace test = boost_has_ftime; -#endif -#ifdef TEST_BOOST_HAS_GETSYSTEMTIMEASFILETIME -# include "../test/boost_has_getsystemtimeasfiletime.ipp" -namespace test = boost_has_getsystemtimeasfiletime; -#endif -#ifdef TEST_BOOST_HAS_GETTIMEOFDAY -# include "../test/boost_has_gettimeofday.ipp" -namespace test = boost_has_gettimeofday; -#endif -#ifdef TEST_BOOST_HAS_HASH -# include "../test/boost_has_hash.ipp" -namespace test = boost_has_hash; -#endif -#ifdef TEST_BOOST_HAS_INT128 -# include "../test/boost_has_int128.ipp" -namespace test = boost_has_int128; -#endif -#ifdef TEST_BOOST_HAS_LOG1P -# include "../test/boost_has_log1p.ipp" -namespace test = boost_has_log1p; -#endif -#ifdef TEST_BOOST_HAS_LONG_LONG -# include "../test/boost_has_long_long.ipp" -namespace test = boost_has_long_long; -#endif -#ifdef TEST_BOOST_HAS_MACRO_USE_FACET -# include "../test/boost_has_macro_use_facet.ipp" -namespace test = boost_has_macro_use_facet; -#endif -#ifdef TEST_BOOST_HAS_MS_INT64 -# include "../test/boost_has_ms_int64.ipp" -namespace test = boost_has_ms_int64; -#endif -#ifdef TEST_BOOST_HAS_NANOSLEEP -# include "../test/boost_has_nanosleep.ipp" -namespace test = boost_has_nanosleep; -#endif -#ifdef TEST_BOOST_HAS_NL_TYPES_H -# include "../test/boost_has_nl_types_h.ipp" -namespace test = boost_has_nl_types_h; -#endif -#ifdef TEST_BOOST_HAS_NRVO -# include "../test/boost_has_nrvo.ipp" -namespace test = boost_has_nrvo; -#endif -#ifdef TEST_BOOST_HAS_PARTIAL_STD_ALLOCATOR -# include "../test/boost_has_part_alloc.ipp" -namespace test = boost_has_partial_std_allocator; -#endif -#ifdef TEST_BOOST_HAS_PTHREAD_DELAY_NP -# include "../test/boost_has_pthread_delay_np.ipp" -namespace test = boost_has_pthread_delay_np; -#endif -#ifdef TEST_BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -# include "../test/boost_has_pthread_ma_st.ipp" -namespace test = boost_has_pthread_mutexattr_settype; -#endif -#ifdef TEST_BOOST_HAS_PTHREAD_YIELD -# include "../test/boost_has_pthread_yield.ipp" -namespace test = boost_has_pthread_yield; -#endif -#ifdef TEST_BOOST_HAS_PTHREADS -# include "../test/boost_has_pthreads.ipp" -namespace test = boost_has_pthreads; -#endif -#ifdef TEST_BOOST_HAS_RVALUE_REFS -# include "../test/boost_has_rvalue_refs.ipp" -namespace test = boost_has_rvalue_refs; -#endif -#ifdef TEST_BOOST_HAS_SCHED_YIELD -# include "../test/boost_has_sched_yield.ipp" -namespace test = boost_has_sched_yield; -#endif -#ifdef TEST_BOOST_HAS_SGI_TYPE_TRAITS -# include "../test/boost_has_sgi_type_traits.ipp" -namespace test = boost_has_sgi_type_traits; -#endif -#ifdef TEST_BOOST_HAS_SIGACTION -# include "../test/boost_has_sigaction.ipp" -namespace test = boost_has_sigaction; -#endif -#ifdef TEST_BOOST_HAS_SLIST -# include "../test/boost_has_slist.ipp" -namespace test = boost_has_slist; -#endif -#ifdef TEST_BOOST_HAS_STATIC_ASSERT -# include "../test/boost_has_static_assert.ipp" -namespace test = boost_has_static_assert; -#endif -#ifdef TEST_BOOST_HAS_STDINT_H -# include "../test/boost_has_stdint_h.ipp" -namespace test = boost_has_stdint_h; -#endif -#ifdef TEST_BOOST_HAS_STLP_USE_FACET -# include "../test/boost_has_stlp_use_facet.ipp" -namespace test = boost_has_stlp_use_facet; -#endif -#ifdef TEST_BOOST_HAS_TR1_ARRAY -# include "../test/boost_has_tr1_array.ipp" -namespace test = boost_has_tr1_array; -#endif -#ifdef TEST_BOOST_HAS_TR1_BIND -# include "../test/boost_has_tr1_bind.ipp" -namespace test = boost_has_tr1_bind; -#endif -#ifdef TEST_BOOST_HAS_TR1_COMPLEX_OVERLOADS -# include "../test/boost_has_tr1_complex_over.ipp" -namespace test = boost_has_tr1_complex_overloads; -#endif -#ifdef TEST_BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG -# include "../test/boost_has_tr1_complex_trig.ipp" -namespace test = boost_has_tr1_complex_inverse_trig; -#endif -#ifdef TEST_BOOST_HAS_TR1_FUNCTION -# include "../test/boost_has_tr1_function.ipp" -namespace test = boost_has_tr1_function; -#endif -#ifdef TEST_BOOST_HAS_TR1_HASH -# include "../test/boost_has_tr1_hash.ipp" -namespace test = boost_has_tr1_hash; -#endif -#ifdef TEST_BOOST_HAS_TR1_MEM_FN -# include "../test/boost_has_tr1_mem_fn.ipp" -namespace test = boost_has_tr1_mem_fn; -#endif -#ifdef TEST_BOOST_HAS_TR1_RANDOM -# include "../test/boost_has_tr1_random.ipp" -namespace test = boost_has_tr1_random; -#endif -#ifdef TEST_BOOST_HAS_TR1_REFERENCE_WRAPPER -# include "../test/boost_has_tr1_ref_wrap.ipp" -namespace test = boost_has_tr1_reference_wrapper; -#endif -#ifdef TEST_BOOST_HAS_TR1_REGEX -# include "../test/boost_has_tr1_regex.ipp" -namespace test = boost_has_tr1_regex; -#endif -#ifdef TEST_BOOST_HAS_TR1_RESULT_OF -# include "../test/boost_has_tr1_result_of.ipp" -namespace test = boost_has_tr1_result_of; -#endif -#ifdef TEST_BOOST_HAS_TR1_SHARED_PTR -# include "../test/boost_has_tr1_shared_ptr.ipp" -namespace test = boost_has_tr1_shared_ptr; -#endif -#ifdef TEST_BOOST_HAS_TR1_TUPLE -# include "../test/boost_has_tr1_tuple.ipp" -namespace test = boost_has_tr1_tuple; -#endif -#ifdef TEST_BOOST_HAS_TR1_TYPE_TRAITS -# include "../test/boost_has_tr1_type_traits.ipp" -namespace test = boost_has_tr1_type_traits; -#endif -#ifdef TEST_BOOST_HAS_TR1_UNORDERED_MAP -# include "../test/boost_has_tr1_unordered_map.ipp" -namespace test = boost_has_tr1_unordered_map; -#endif -#ifdef TEST_BOOST_HAS_TR1_UNORDERED_SET -# include "../test/boost_has_tr1_unordered_set.ipp" -namespace test = boost_has_tr1_unordered_set; -#endif -#ifdef TEST_BOOST_HAS_TR1_UTILITY -# include "../test/boost_has_tr1_utility.ipp" -namespace test = boost_has_tr1_utility; -#endif -#ifdef TEST_BOOST_HAS_UNISTD_H -# include "../test/boost_has_unistd_h.ipp" -namespace test = boost_has_unistd_h; -#endif -#ifdef TEST_BOOST_HAS_VARIADIC_TMPL -# include "../test/boost_has_variadic_tmpl.ipp" -namespace test = boost_has_variadic_tmpl; -#endif -#ifdef TEST_BOOST_MSVC6_MEMBER_TEMPLATES -# include "../test/boost_has_vc6_mem_templ.ipp" -namespace test = boost_msvc6_member_templates; -#endif -#ifdef TEST_BOOST_MSVC_STD_ITERATOR -# include "../test/boost_has_vc_iterator.ipp" -namespace test = boost_msvc_std_iterator; -#endif -#ifdef TEST_BOOST_HAS_WINTHREADS -# include "../test/boost_has_winthreads.ipp" -namespace test = boost_has_winthreads; -#endif -#ifdef TEST_BOOST_NO_ADL_BARRIER -# include "../test/boost_no_adl_barrier.ipp" -namespace test = boost_no_adl_barrier; -#endif -#ifdef TEST_BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -# include "../test/boost_no_arg_dep_lookup.ipp" -namespace test = boost_no_argument_dependent_lookup; -#endif -#ifdef TEST_BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS -# include "../test/boost_no_array_type_spec.ipp" -namespace test = boost_no_array_type_specializations; -#endif -#ifdef TEST_BOOST_NO_CXX11_AUTO_DECLARATIONS -# include "../test/boost_no_auto_declarations.ipp" -namespace test = boost_no_cxx11_auto_declarations; -#endif -#ifdef TEST_BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS -# include "../test/boost_no_auto_multidecl.ipp" -namespace test = boost_no_cxx11_auto_multideclarations; -#endif -#ifdef TEST_BOOST_NO_AUTO_PTR -# include "../test/boost_no_auto_ptr.ipp" -namespace test = boost_no_auto_ptr; -#endif -#ifdef TEST_BOOST_BCB_PARTIAL_SPECIALIZATION_BUG -# include "../test/boost_no_bcb_partial_spec.ipp" -namespace test = boost_bcb_partial_specialization_bug; -#endif -#ifdef TEST_BOOST_NO_CXX11_CHAR16_T -# include "../test/boost_no_char16_t.ipp" -namespace test = boost_no_cxx11_char16_t; -#endif -#ifdef TEST_BOOST_NO_CXX11_CHAR32_T -# include "../test/boost_no_char32_t.ipp" -namespace test = boost_no_cxx11_char32_t; -#endif -#ifdef TEST_BOOST_NO_COMPLETE_VALUE_INITIALIZATION -# include "../test/boost_no_com_value_init.ipp" -namespace test = boost_no_complete_value_initialization; -#endif -#ifdef TEST_BOOST_NO_CXX11_CONSTEXPR -# include "../test/boost_no_constexpr.ipp" -namespace test = boost_no_cxx11_constexpr; -#endif -#ifdef TEST_BOOST_NO_CTYPE_FUNCTIONS -# include "../test/boost_no_ctype_functions.ipp" -namespace test = boost_no_ctype_functions; -#endif -#ifdef TEST_BOOST_NO_CV_SPECIALIZATIONS -# include "../test/boost_no_cv_spec.ipp" -namespace test = boost_no_cv_specializations; -#endif -#ifdef TEST_BOOST_NO_CV_VOID_SPECIALIZATIONS -# include "../test/boost_no_cv_void_spec.ipp" -namespace test = boost_no_cv_void_specializations; -#endif -#ifdef TEST_BOOST_NO_CWCHAR -# include "../test/boost_no_cwchar.ipp" -namespace test = boost_no_cwchar; -#endif -#ifdef TEST_BOOST_NO_CWCTYPE -# include "../test/boost_no_cwctype.ipp" -namespace test = boost_no_cwctype; -#endif -#ifdef TEST_BOOST_NO_CXX11_ADDRESSOF -# include "../test/boost_no_cxx11_addressof.ipp" -namespace test = boost_no_cxx11_addressof; -#endif -#ifdef TEST_BOOST_NO_CXX11_ALIGNAS -# include "../test/boost_no_cxx11_alignas.ipp" -namespace test = boost_no_cxx11_alignas; -#endif -#ifdef TEST_BOOST_NO_CXX11_ALLOCATOR -# include "../test/boost_no_cxx11_allocator.ipp" -namespace test = boost_no_cxx11_allocator; -#endif -#ifdef TEST_BOOST_NO_CXX11_ATOMIC_SMART_PTR -# include "../test/boost_no_cxx11_atomic_sp.ipp" -namespace test = boost_no_cxx11_atomic_smart_ptr; -#endif -#ifdef TEST_BOOST_NO_CXX11_FINAL -# include "../test/boost_no_cxx11_final.ipp" -namespace test = boost_no_cxx11_final; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_ARRAY -# include "../test/boost_no_cxx11_hdr_array.ipp" -namespace test = boost_no_cxx11_hdr_array; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_ATOMIC -# include "../test/boost_no_cxx11_hdr_atomic.ipp" -namespace test = boost_no_cxx11_hdr_atomic; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_CHRONO -# include "../test/boost_no_cxx11_hdr_chrono.ipp" -namespace test = boost_no_cxx11_hdr_chrono; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_CODECVT -# include "../test/boost_no_cxx11_hdr_codecvt.ipp" -namespace test = boost_no_cxx11_hdr_codecvt; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_CONDITION_VARIABLE -# include "../test/boost_no_cxx11_hdr_condition_variable.ipp" -namespace test = boost_no_cxx11_hdr_condition_variable; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_FORWARD_LIST -# include "../test/boost_no_cxx11_hdr_forward_list.ipp" -namespace test = boost_no_cxx11_hdr_forward_list; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_FUTURE -# include "../test/boost_no_cxx11_hdr_future.ipp" -namespace test = boost_no_cxx11_hdr_future; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_INITIALIZER_LIST -# include "../test/boost_no_cxx11_hdr_initializer_list.ipp" -namespace test = boost_no_cxx11_hdr_initializer_list; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_MUTEX -# include "../test/boost_no_cxx11_hdr_mutex.ipp" -namespace test = boost_no_cxx11_hdr_mutex; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_RANDOM -# include "../test/boost_no_cxx11_hdr_random.ipp" -namespace test = boost_no_cxx11_hdr_random; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_RATIO -# include "../test/boost_no_cxx11_hdr_ratio.ipp" -namespace test = boost_no_cxx11_hdr_ratio; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_REGEX -# include "../test/boost_no_cxx11_hdr_regex.ipp" -namespace test = boost_no_cxx11_hdr_regex; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_SYSTEM_ERROR -# include "../test/boost_no_cxx11_hdr_system_error.ipp" -namespace test = boost_no_cxx11_hdr_system_error; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_THREAD -# include "../test/boost_no_cxx11_hdr_thread.ipp" -namespace test = boost_no_cxx11_hdr_thread; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_TUPLE -# include "../test/boost_no_cxx11_hdr_tuple.ipp" -namespace test = boost_no_cxx11_hdr_tuple; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_TYPE_TRAITS -# include "../test/boost_no_cxx11_hdr_type_traits.ipp" -namespace test = boost_no_cxx11_hdr_type_traits; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_TYPEINDEX -# include "../test/boost_no_cxx11_hdr_typeindex.ipp" -namespace test = boost_no_cxx11_hdr_typeindex; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_UNORDERED_MAP -# include "../test/boost_no_cxx11_hdr_unordered_map.ipp" -namespace test = boost_no_cxx11_hdr_unordered_map; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_UNORDERED_SET -# include "../test/boost_no_cxx11_hdr_unordered_set.ipp" -namespace test = boost_no_cxx11_hdr_unordered_set; -#endif -#ifdef TEST_BOOST_NO_CXX11_INLINE_NAMESPACES -# include "../test/boost_no_cxx11_inline_namespaces.ipp" -namespace test = boost_no_cxx11_inline_namespaces; -#endif -#ifdef TEST_BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS -# include "../test/boost_no_cxx11_non_pub_def_fun.ipp" -namespace test = boost_no_cxx11_non_public_defaulted_functions; -#endif -#ifdef TEST_BOOST_NO_CXX11_NUMERIC_LIMITS -# include "../test/boost_no_cxx11_numeric_limits.ipp" -namespace test = boost_no_cxx11_numeric_limits; -#endif -#ifdef TEST_BOOST_NO_CXX11_REF_QUALIFIERS -# include "../test/boost_no_cxx11_ref_qualifiers.ipp" -namespace test = boost_no_cxx11_ref_qualifiers; -#endif -#ifdef TEST_BOOST_NO_CXX11_SMART_PTR -# include "../test/boost_no_cxx11_smart_ptr.ipp" -namespace test = boost_no_cxx11_smart_ptr; -#endif -#ifdef TEST_BOOST_NO_CXX11_STD_ALIGN -# include "../test/boost_no_cxx11_std_align.ipp" -namespace test = boost_no_cxx11_std_align; -#endif -#ifdef TEST_BOOST_NO_CXX11_THREAD_LOCAL -# include "../test/boost_no_cxx11_thread_local.ipp" -namespace test = boost_no_cxx11_thread_local; -#endif -#ifdef TEST_BOOST_NO_CXX11_TRAILING_RESULT_TYPES -# include "../test/boost_no_cxx11_trailing_result_types.ipp" -namespace test = boost_no_cxx11_trailing_result_types; -#endif -#ifdef TEST_BOOST_NO_CXX11_USER_DEFINED_LITERALS -# include "../test/boost_no_cxx11_user_lit.ipp" -namespace test = boost_no_cxx11_user_defined_literals; -#endif -#ifdef TEST_BOOST_NO_CXX14_BINARY_LITERALS -# include "../test/boost_no_cxx14_binary_literals.ipp" -namespace test = boost_no_cxx14_binary_literals; -#endif -#ifdef TEST_BOOST_NO_CXX14_CONSTEXPR -# include "../test/boost_no_cxx14_constexpr.ipp" -namespace test = boost_no_cxx14_constexpr; -#endif -#ifdef TEST_BOOST_NO_CXX14_DECLTYPE_AUTO -# include "../test/boost_no_cxx14_decltype_auto.ipp" -namespace test = boost_no_cxx14_decltype_auto; -#endif -#ifdef TEST_BOOST_NO_CXX14_DIGIT_SEPARATORS -# include "../test/boost_no_cxx14_digit_separator.ipp" -namespace test = boost_no_cxx14_digit_separators; -#endif -#ifdef TEST_BOOST_NO_CXX14_GENERIC_LAMBDAS -# include "../test/boost_no_cxx14_generic_lambda.ipp" -namespace test = boost_no_cxx14_generic_lambdas; -#endif -#ifdef TEST_BOOST_NO_CXX14_HDR_SHARED_MUTEX -# include "../test/boost_no_cxx14_hdr_shared_mutex.ipp" -namespace test = boost_no_cxx14_hdr_shared_mutex; -#endif -#ifdef TEST_BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES -# include "../test/boost_no_cxx14_lambda_capture.ipp" -namespace test = boost_no_cxx14_initialized_lambda_captures; -#endif -#ifdef TEST_BOOST_NO_CXX14_AGGREGATE_NSDMI -# include "../test/boost_no_cxx14_member_init.ipp" -namespace test = boost_no_cxx14_aggregate_nsdmi; -#endif -#ifdef TEST_BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION -# include "../test/boost_no_cxx14_return_type_ded.ipp" -namespace test = boost_no_cxx14_return_type_deduction; -#endif -#ifdef TEST_BOOST_NO_CXX14_STD_EXCHANGE -# include "../test/boost_no_cxx14_std_exchange.ipp" -namespace test = boost_no_cxx14_std_exchange; -#endif -#ifdef TEST_BOOST_NO_CXX14_VARIABLE_TEMPLATES -# include "../test/boost_no_cxx14_var_templ.ipp" -namespace test = boost_no_cxx14_variable_templates; -#endif -#ifdef TEST_BOOST_NO_CXX17_STD_APPLY -# include "../test/boost_no_cxx17_std_apply.ipp" -namespace test = boost_no_cxx17_std_apply; -#endif -#ifdef TEST_BOOST_NO_CXX17_STD_INVOKE -# include "../test/boost_no_cxx17_std_invoke.ipp" -namespace test = boost_no_cxx17_std_invoke; -#endif -#ifdef TEST_BOOST_NO_CXX11_HDR_FUNCTIONAL -# include "../test/boost_no_cxx_hdr_functional.ipp" -namespace test = boost_no_cxx11_hdr_functional; -#endif -#ifdef TEST_BOOST_NO_CXX11_DECLTYPE -# include "../test/boost_no_decltype.ipp" -namespace test = boost_no_cxx11_decltype; -#endif -#ifdef TEST_BOOST_NO_CXX11_DECLTYPE_N3276 -# include "../test/boost_no_decltype_n3276.ipp" -namespace test = boost_no_cxx11_decltype_n3276; -#endif -#ifdef TEST_BOOST_DEDUCED_TYPENAME -# include "../test/boost_no_ded_typename.ipp" -namespace test = boost_deduced_typename; -#endif -#ifdef TEST_BOOST_NO_CXX11_DEFAULTED_FUNCTIONS -# include "../test/boost_no_defaulted_functions.ipp" -namespace test = boost_no_cxx11_defaulted_functions; -#endif -#ifdef TEST_BOOST_NO_CXX11_DELETED_FUNCTIONS -# include "../test/boost_no_deleted_functions.ipp" -namespace test = boost_no_cxx11_deleted_functions; -#endif -#ifdef TEST_BOOST_NO_DEPENDENT_NESTED_DERIVATIONS -# include "../test/boost_no_dep_nested_class.ipp" -namespace test = boost_no_dependent_nested_derivations; -#endif -#ifdef TEST_BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS -# include "../test/boost_no_dep_val_param.ipp" -namespace test = boost_no_dependent_types_in_template_value_parameters; -#endif -#ifdef TEST_BOOST_NO_EXCEPTION_STD_NAMESPACE -# include "../test/boost_no_excep_std.ipp" -namespace test = boost_no_exception_std_namespace; -#endif -#ifdef TEST_BOOST_NO_EXCEPTIONS -# include "../test/boost_no_exceptions.ipp" -namespace test = boost_no_exceptions; -#endif -#ifdef TEST_BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -# include "../test/boost_no_exp_func_tem_arg.ipp" -namespace test = boost_no_explicit_function_template_arguments; -#endif -#ifdef TEST_BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS -# include "../test/boost_no_explicit_cvt_ops.ipp" -namespace test = boost_no_cxx11_explicit_conversion_operators; -#endif -#ifdef TEST_BOOST_NO_CXX11_EXTERN_TEMPLATE -# include "../test/boost_no_extern_template.ipp" -namespace test = boost_no_cxx11_extern_template; -#endif -#ifdef TEST_BOOST_NO_FENV_H -# include "../test/boost_no_fenv_h.ipp" -namespace test = boost_no_fenv_h; -#endif -#ifdef TEST_BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS -# include "../test/boost_no_fixed_len_variadic_templates.ipp" -namespace test = boost_no_cxx11_fixed_length_variadic_template_expansion_packs; -#endif -#ifdef TEST_BOOST_NO_FUNCTION_TEMPLATE_ORDERING -# include "../test/boost_no_func_tmp_order.ipp" -namespace test = boost_no_function_template_ordering; -#endif -#ifdef TEST_BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS -# include "../test/boost_no_function_template_default_args.ipp" -namespace test = boost_no_cxx11_function_template_default_args; -#endif -#ifdef TEST_BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS -# include "../test/boost_no_function_type_spec.ipp" -namespace test = boost_no_function_type_specializations; -#endif -#ifdef TEST_BOOST_NO_MS_INT64_NUMERIC_LIMITS -# include "../test/boost_no_i64_limits.ipp" -namespace test = boost_no_ms_int64_numeric_limits; -#endif -#ifdef TEST_BOOST_NO_INCLASS_MEMBER_INITIALIZATION -# include "../test/boost_no_inline_memb_init.ipp" -namespace test = boost_no_inclass_member_initialization; -#endif -#ifdef TEST_BOOST_NO_INTEGRAL_INT64_T -# include "../test/boost_no_integral_int64_t.ipp" -namespace test = boost_no_integral_int64_t; -#endif -#ifdef TEST_BOOST_NO_IOSFWD -# include "../test/boost_no_iosfwd.ipp" -namespace test = boost_no_iosfwd; -#endif -#ifdef TEST_BOOST_NO_IOSTREAM -# include "../test/boost_no_iostream.ipp" -namespace test = boost_no_iostream; -#endif -#ifdef TEST_BOOST_NO_IS_ABSTRACT -# include "../test/boost_no_is_abstract.ipp" -namespace test = boost_no_is_abstract; -#endif -#ifdef TEST_BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS -# include "../test/boost_no_iter_construct.ipp" -namespace test = boost_no_templated_iterator_constructors; -#endif -#ifdef TEST_BOOST_NO_CXX11_LAMBDAS -# include "../test/boost_no_lambdas.ipp" -namespace test = boost_no_cxx11_lambdas; -#endif -#ifdef TEST_BOOST_NO_LIMITS -# include "../test/boost_no_limits.ipp" -namespace test = boost_no_limits; -#endif -#ifdef TEST_BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -# include "../test/boost_no_limits_const_exp.ipp" -namespace test = boost_no_limits_compile_time_constants; -#endif -#ifdef TEST_BOOST_NO_LONG_LONG_NUMERIC_LIMITS -# include "../test/boost_no_ll_limits.ipp" -namespace test = boost_no_long_long_numeric_limits; -#endif -#ifdef TEST_BOOST_NO_LONG_LONG -# include "../test/boost_no_long_long.ipp" -namespace test = boost_no_long_long; -#endif -#ifdef TEST_BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS -# include "../test/boost_no_mem_func_spec.ipp" -namespace test = boost_no_member_function_specializations; -#endif -#ifdef TEST_BOOST_NO_MEMBER_TEMPLATE_KEYWORD -# include "../test/boost_no_mem_tem_keyword.ipp" -namespace test = boost_no_member_template_keyword; -#endif -#ifdef TEST_BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS -# include "../test/boost_no_mem_tem_pnts.ipp" -namespace test = boost_no_pointer_to_member_template_parameters; -#endif -#ifdef TEST_BOOST_NO_MEMBER_TEMPLATE_FRIENDS -# include "../test/boost_no_mem_templ_frnds.ipp" -namespace test = boost_no_member_template_friends; -#endif -#ifdef TEST_BOOST_NO_MEMBER_TEMPLATES -# include "../test/boost_no_mem_templates.ipp" -namespace test = boost_no_member_templates; -#endif -#ifdef TEST_BOOST_NO_NESTED_FRIENDSHIP -# include "../test/boost_no_nested_friendship.ipp" -namespace test = boost_no_nested_friendship; -#endif -#ifdef TEST_BOOST_NO_CXX11_NOEXCEPT -# include "../test/boost_no_noexcept.ipp" -namespace test = boost_no_cxx11_noexcept; -#endif -#ifdef TEST_BOOST_NO_CXX11_NULLPTR -# include "../test/boost_no_nullptr.ipp" -namespace test = boost_no_cxx11_nullptr; -#endif -#ifdef TEST_BOOST_NO_OPERATORS_IN_NAMESPACE -# include "../test/boost_no_ops_in_namespace.ipp" -namespace test = boost_no_operators_in_namespace; -#endif -#ifdef TEST_BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS -# include "../test/boost_no_part_spec_def_args.ipp" -namespace test = boost_no_partial_specialization_implicit_default_args; -#endif -#ifdef TEST_BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -# include "../test/boost_no_partial_spec.ipp" -namespace test = boost_no_template_partial_specialization; -#endif -#ifdef TEST_BOOST_NO_PRIVATE_IN_AGGREGATE -# include "../test/boost_no_priv_aggregate.ipp" -namespace test = boost_no_private_in_aggregate; -#endif -#ifdef TEST_BOOST_NO_POINTER_TO_MEMBER_CONST -# include "../test/boost_no_ptr_mem_const.ipp" -namespace test = boost_no_pointer_to_member_const; -#endif -#ifdef TEST_BOOST_NO_CXX11_RANGE_BASED_FOR -# include "../test/boost_no_range_based_for.ipp" -namespace test = boost_no_cxx11_range_based_for; -#endif -#ifdef TEST_BOOST_NO_CXX11_RAW_LITERALS -# include "../test/boost_no_raw_literals.ipp" -namespace test = boost_no_cxx11_raw_literals; -#endif -#ifdef TEST_BOOST_NO_UNREACHABLE_RETURN_DETECTION -# include "../test/boost_no_ret_det.ipp" -namespace test = boost_no_unreachable_return_detection; -#endif -#ifdef TEST_BOOST_NO_RTTI -# include "../test/boost_no_rtti.ipp" -namespace test = boost_no_rtti; -#endif -#ifdef TEST_BOOST_NO_CXX11_RVALUE_REFERENCES -# include "../test/boost_no_rvalue_references.ipp" -namespace test = boost_no_cxx11_rvalue_references; -#endif -#ifdef TEST_BOOST_NO_CXX11_SCOPED_ENUMS -# include "../test/boost_no_scoped_enums.ipp" -namespace test = boost_no_cxx11_scoped_enums; -#endif -#ifdef TEST_BOOST_NO_SFINAE -# include "../test/boost_no_sfinae.ipp" -namespace test = boost_no_sfinae; -#endif -#ifdef TEST_BOOST_NO_SFINAE_EXPR -# include "../test/boost_no_sfinae_expr.ipp" -namespace test = boost_no_sfinae_expr; -#endif -#ifdef TEST_BOOST_NO_STRINGSTREAM -# include "../test/boost_no_sstream.ipp" -namespace test = boost_no_stringstream; -#endif -#ifdef TEST_BOOST_NO_CXX11_STATIC_ASSERT -# include "../test/boost_no_static_assert.ipp" -namespace test = boost_no_cxx11_static_assert; -#endif -#ifdef TEST_BOOST_NO_STD_ALLOCATOR -# include "../test/boost_no_std_allocator.ipp" -namespace test = boost_no_std_allocator; -#endif -#ifdef TEST_BOOST_NO_STD_DISTANCE -# include "../test/boost_no_std_distance.ipp" -namespace test = boost_no_std_distance; -#endif -#ifdef TEST_BOOST_NO_STD_ITERATOR_TRAITS -# include "../test/boost_no_std_iter_traits.ipp" -namespace test = boost_no_std_iterator_traits; -#endif -#ifdef TEST_BOOST_NO_STD_ITERATOR -# include "../test/boost_no_std_iterator.ipp" -namespace test = boost_no_std_iterator; -#endif -#ifdef TEST_BOOST_NO_STD_LOCALE -# include "../test/boost_no_std_locale.ipp" -namespace test = boost_no_std_locale; -#endif -#ifdef TEST_BOOST_NO_STD_MESSAGES -# include "../test/boost_no_std_messages.ipp" -namespace test = boost_no_std_messages; -#endif -#ifdef TEST_BOOST_NO_STD_MIN_MAX -# include "../test/boost_no_std_min_max.ipp" -namespace test = boost_no_std_min_max; -#endif -#ifdef TEST_BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN -# include "../test/boost_no_std_oi_assign.ipp" -namespace test = boost_no_std_output_iterator_assign; -#endif -#ifdef TEST_BOOST_NO_STD_TYPEINFO -# include "../test/boost_no_std_typeinfo.ipp" -namespace test = boost_no_std_typeinfo; -#endif -#ifdef TEST_BOOST_NO_STD_USE_FACET -# include "../test/boost_no_std_use_facet.ipp" -namespace test = boost_no_std_use_facet; -#endif -#ifdef TEST_BOOST_NO_STD_WSTREAMBUF -# include "../test/boost_no_std_wstreambuf.ipp" -namespace test = boost_no_std_wstreambuf; -#endif -#ifdef TEST_BOOST_NO_STD_WSTRING -# include "../test/boost_no_std_wstring.ipp" -namespace test = boost_no_std_wstring; -#endif -#ifdef TEST_BOOST_NO_STDC_NAMESPACE -# include "../test/boost_no_stdc_namespace.ipp" -namespace test = boost_no_stdc_namespace; -#endif -#ifdef TEST_BOOST_NO_SWPRINTF -# include "../test/boost_no_swprintf.ipp" -namespace test = boost_no_swprintf; -#endif -#ifdef TEST_BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS -# include "../test/boost_no_tem_local_classes.ipp" -namespace test = boost_no_cxx11_local_class_template_parameters; -#endif -#ifdef TEST_BOOST_NO_CXX11_TEMPLATE_ALIASES -# include "../test/boost_no_template_aliases.ipp" -namespace test = boost_no_cxx11_template_aliases; -#endif -#ifdef TEST_BOOST_NO_TEMPLATED_IOSTREAMS -# include "../test/boost_no_template_streams.ipp" -namespace test = boost_no_templated_iostreams; -#endif -#ifdef TEST_BOOST_NO_TEMPLATE_TEMPLATES -# include "../test/boost_no_template_template.ipp" -namespace test = boost_no_template_templates; -#endif -#ifdef TEST_BOOST_NO_TWO_PHASE_NAME_LOOKUP -# include "../test/boost_no_two_phase_lookup.ipp" -namespace test = boost_no_two_phase_name_lookup; -#endif -#ifdef TEST_BOOST_NO_TYPEID -# include "../test/boost_no_typeid.ipp" -namespace test = boost_no_typeid; -#endif -#ifdef TEST_BOOST_NO_TYPENAME_WITH_CTOR -# include "../test/boost_no_typename_with_ctor.ipp" -namespace test = boost_no_typename_with_ctor; -#endif -#ifdef TEST_BOOST_NO_CXX11_UNICODE_LITERALS -# include "../test/boost_no_unicode_literals.ipp" -namespace test = boost_no_cxx11_unicode_literals; -#endif -#ifdef TEST_BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX -# include "../test/boost_no_unified_init.ipp" -namespace test = boost_no_cxx11_unified_initialization_syntax; -#endif -#ifdef TEST_BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -# include "../test/boost_no_using_breaks_adl.ipp" -namespace test = boost_function_scope_using_declaration_breaks_adl; -#endif -#ifdef TEST_BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE -# include "../test/boost_no_using_decl_overld.ipp" -namespace test = boost_no_using_declaration_overloads_from_typename_base; -#endif -#ifdef TEST_BOOST_NO_USING_TEMPLATE -# include "../test/boost_no_using_template.ipp" -namespace test = boost_no_using_template; -#endif -#ifdef TEST_BOOST_NO_CXX11_VARIADIC_MACROS -# include "../test/boost_no_variadic_macros.ipp" -namespace test = boost_no_cxx11_variadic_macros; -#endif -#ifdef TEST_BOOST_NO_CXX11_VARIADIC_TEMPLATES -# include "../test/boost_no_variadic_templates.ipp" -namespace test = boost_no_cxx11_variadic_templates; -#endif -#ifdef TEST_BOOST_NO_VOID_RETURNS -# include "../test/boost_no_void_returns.ipp" -namespace test = boost_no_void_returns; -#endif -#ifdef TEST_BOOST_NO_INTRINSIC_WCHAR_T -# include "../test/boost_no_wchar_t.ipp" -namespace test = boost_no_intrinsic_wchar_t; -#endif - -int main( int, char *[] ) -{ - return test::test(); -} - diff --git a/libs/config/test/Jamfile.v2 b/libs/config/test/Jamfile.v2 deleted file mode 100644 index 2f6a122a1..000000000 --- a/libs/config/test/Jamfile.v2 +++ /dev/null @@ -1,106 +0,0 @@ -# -# Copyright John Maddock 2008. -# 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 you need to alter build preferences then set them in -# the template defined in options_v2.jam. -# - -project - : requirements - gcc:-Wno-deprecated-declarations -; - - -import modules ; -import ../checks/config : requires ; - -local is_unix = [ modules.peek : UNIX ] ; - -lib atomic ; -lib pthread ; -lib rt ; - -exe has_atomic_lib : config_info.cpp atomic ; -explicit has_atomic_lib ; -exe has_pthread_lib : config_info.cpp pthread ; -explicit has_pthread_lib ; -exe has_rt_lib : config_info.cpp rt ; -explicit has_rt_lib ; - -test-suite config - : - [ compile config_test_c.c ] - [ run config_test.cpp - : #args - : #input-files - : #requirements - multi - [ check-target-builds has_atomic_lib : atomic ] - [ check-target-builds has_pthread_lib : pthread ] - [ check-target-builds has_rt_lib : rt ] - : config_test_threaded - ] - [ run config_test.cpp - : #args - : #input-files - : #requirements - single msvc:static msvc:static - [ check-target-builds has_atomic_lib : atomic ] - [ check-target-builds has_pthread_lib : pthread ] - [ check-target-builds has_rt_lib : rt ] - ] - [ run config_test.cpp - : #args - : #input-files - : #requirements - off - [ check-target-builds has_atomic_lib : atomic ] - [ check-target-builds has_pthread_lib : pthread ] - [ check-target-builds has_rt_lib : rt ] - : config_test_no_rtti - ] - [ run config_test.cpp - : #args - : #input-files - : #requirements - off - [ check-target-builds has_atomic_lib : atomic ] - [ check-target-builds has_pthread_lib : pthread ] - [ check-target-builds has_rt_lib : rt ] - : config_test_no_except - ] - [ run config_info.cpp : : : always_show_run_output single msvc:static msvc:static ] - [ run config_info.cpp : : : always_show_run_output multi : config_info_threaded ] - [ run config_info.cpp : : : always_show_run_output off : config_info_no_rtti ] - [ run config_info.cpp : : : always_show_run_output off : config_info_no_except ] - [ run math_info.cpp : : : always_show_run_output borland:static borland:static ] - [ run abi/abi_test.cpp abi/main.cpp ] - [ run limits_test.cpp ] - [ run link/main.cpp link//link_test - : #args - : #input-files - : #requirements - shared - BOOST_DYN_LINK=1 - BOOST_CONFIG_NO_LIB=1 - : - config_link_test - ] - [ compile-fail threads/test_thread_fail1.cpp ] - [ compile-fail threads/test_thread_fail2.cpp ] - [ compile boost_fallthrough_test.cpp : [ check-target-builds has_clang_implicit_fallthrough "Clang implicit fallthrough" : clang:"-std=c++11 -Wimplicit-fallthrough" on all ] ] - [ compile helper_macro_test.cpp ] - [ run cstdint_test.cpp : : : all gcc:"-Wno-long-long -Wextra" darwin:-Wno-long-long ] - [ run cstdint_test2.cpp : : : all gcc:"-Wno-long-long -Wextra" darwin:-Wno-long-long ] - [ compile cstdint_include_test.cpp : all gcc:-Wextra ] - [ run config_build_check.cpp : : : [ requires int128 cxx11_constexpr cxx11_user_defined_literals ] ] - ; - -obj has_clang_implicit_fallthrough : cmd_line_check.cpp : - clang:"-std=c++11 -Wimplicit-fallthrough" on all ; - -explicit has_clang_implicit_fallthrough ; - diff --git a/libs/config/test/abi/abi_test.cpp b/libs/config/test/abi/abi_test.cpp deleted file mode 100644 index 98be1b196..000000000 --- a/libs/config/test/abi/abi_test.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// (C) Copyright John Maddock 2003. -// 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/config for the most recent version. - - -#include "abi_test.hpp" - - -char abi_test::virtual_one()const -{ - return c; -} - -boost::int32_t abi_test::virtual_two()const -{ - return i; -} - -abi_test::abi_test() -{ - c = 0x12; - i = 0x5678; -} - diff --git a/libs/config/test/abi/abi_test.hpp b/libs/config/test/abi/abi_test.hpp deleted file mode 100644 index a2bec783b..000000000 --- a/libs/config/test/abi/abi_test.hpp +++ /dev/null @@ -1,54 +0,0 @@ -// (C) Copyright John Maddock 2003. -// 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/config for the most recent version. - - -#ifndef BOOST_ABI_TEST_HPP -#define BOOST_ABI_TEST_HPP - -#include -#include - -#ifdef BOOST_HAS_ABI_HEADERS -#include BOOST_ABI_PREFIX -#endif - -// -// the following class is designed to break if the ABI -// it's compiled with does not match that of the client -// calling it.... -// - -struct empty{}; - -class abi_test : protected empty -{ -private: - empty e; - char c; - boost::int32_t i; -public: - inline char inline_one()const - { return c; } - inline boost::int32_t inline_two()const - { return i; } - - virtual char virtual_one()const; - virtual boost::int32_t virtual_two()const; - - abi_test(); -}; - - - -#ifdef BOOST_HAS_ABI_HEADERS -#include BOOST_ABI_SUFFIX -#endif - -#endif // BOOST_ABI_TEST_HPP - - - diff --git a/libs/config/test/abi/main.cpp b/libs/config/test/abi/main.cpp deleted file mode 100644 index e8f9d1393..000000000 --- a/libs/config/test/abi/main.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// (C) Copyright John Maddock 2003. -// 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/config for the most recent version. - -// -// before we do anything else, we need to mess with the compilers ABI: -// -#include -#ifdef BOOST_MSVC -#pragma pack(1) -#elif defined(__BORLANDC__) -#pragma option -Ve- -Vx- -a1 -b- -#endif -#include -#include "abi_test.hpp" - - -int main() -{ - abi_test t; - if((t.inline_one() != t.virtual_one()) || (t.inline_two() != t.virtual_two())) - { - fwrite("Failed ABI test", 1, 15, stdout); - return -1; - } - return 0; -} - diff --git a/libs/config/test/all/Jamfile.v2 b/libs/config/test/all/Jamfile.v2 deleted file mode 100644 index 576057148..000000000 --- a/libs/config/test/all/Jamfile.v2 +++ /dev/null @@ -1,619 +0,0 @@ -# -# Regression test Jamfile for boost configuration setup. -# *** DO NOT EDIT THIS FILE BY HAND *** -# This file was automatically generated on Mon Dec 12 19:37:08 2016 -# by libs/config/tools/generate.cpp -# Copyright John Maddock. -# 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 you need to alter build preferences then set them in -# the template defined in options_v2.jam. -# -path-constant DOT : . ; -include $(DOT)/options_v2.jam ; - -run ../config_info.cpp : : : single msvc:static msvc:static ; -run ../config_info.cpp : : : multi : config_info_threaded ; -run ../math_info.cpp : : : borland:static borland:static ; -run ../config_test.cpp : : : single msvc:static msvc:static ; -run ../config_test.cpp : : : multi : config_test_threaded ; -run ../limits_test.cpp ../../../test/build//boost_test_exec_monitor ; -run ../abi/abi_test.cpp ../abi/main.cpp ; - -test-suite "BOOST_HAS_TWO_ARG_USE_FACET" : -[ run ../has_2arg_use_facet_pass.cpp ] -[ compile-fail ../has_2arg_use_facet_fail.cpp ] ; -test-suite "BOOST_HAS_BETHREADS" : -[ run ../has_bethreads_pass.cpp ] -[ compile-fail ../has_bethreads_fail.cpp ] ; -test-suite "BOOST_HAS_CLOCK_GETTIME" : -[ run ../has_clock_gettime_pass.cpp ] -[ compile-fail ../has_clock_gettime_fail.cpp ] ; -test-suite "BOOST_HAS_DIRENT_H" : -[ run ../has_dirent_h_pass.cpp ] -[ compile-fail ../has_dirent_h_fail.cpp ] ; -test-suite "BOOST_HAS_EXPM1" : -[ run ../has_expm1_pass.cpp ] -[ compile-fail ../has_expm1_fail.cpp ] ; -test-suite "BOOST_HAS_FLOAT128" : -[ run ../has_float128_pass.cpp ] -[ compile-fail ../has_float128_fail.cpp ] ; -test-suite "BOOST_HAS_FTIME" : -[ run ../has_ftime_pass.cpp ] -[ compile-fail ../has_ftime_fail.cpp ] ; -test-suite "BOOST_HAS_GETSYSTEMTIMEASFILETIME" : -[ run ../has_getsystemtimeasfiletime_pass.cpp ] -[ compile-fail ../has_getsystemtimeasfiletime_fail.cpp ] ; -test-suite "BOOST_HAS_GETTIMEOFDAY" : -[ run ../has_gettimeofday_pass.cpp ] -[ compile-fail ../has_gettimeofday_fail.cpp ] ; -test-suite "BOOST_HAS_HASH" : -[ run ../has_hash_pass.cpp ] -[ compile-fail ../has_hash_fail.cpp ] ; -test-suite "BOOST_HAS_INT128" : -[ run ../has_int128_pass.cpp ] -[ compile-fail ../has_int128_fail.cpp ] ; -test-suite "BOOST_HAS_LOG1P" : -[ run ../has_log1p_pass.cpp ] -[ compile-fail ../has_log1p_fail.cpp ] ; -test-suite "BOOST_HAS_LONG_LONG" : -[ run ../has_long_long_pass.cpp ] -[ compile-fail ../has_long_long_fail.cpp ] ; -test-suite "BOOST_HAS_MACRO_USE_FACET" : -[ run ../has_macro_use_facet_pass.cpp ] -[ compile-fail ../has_macro_use_facet_fail.cpp ] ; -test-suite "BOOST_HAS_MS_INT64" : -[ run ../has_ms_int64_pass.cpp ] -[ compile-fail ../has_ms_int64_fail.cpp ] ; -test-suite "BOOST_HAS_NANOSLEEP" : -[ run ../has_nanosleep_pass.cpp ] -[ compile-fail ../has_nanosleep_fail.cpp ] ; -test-suite "BOOST_HAS_NL_TYPES_H" : -[ run ../has_nl_types_h_pass.cpp ] -[ compile-fail ../has_nl_types_h_fail.cpp ] ; -test-suite "BOOST_HAS_NRVO" : -[ run ../has_nrvo_pass.cpp ] -[ compile-fail ../has_nrvo_fail.cpp ] ; -test-suite "BOOST_HAS_PARTIAL_STD_ALLOCATOR" : -[ run ../has_part_alloc_pass.cpp ] -[ compile-fail ../has_part_alloc_fail.cpp ] ; -test-suite "BOOST_HAS_PTHREAD_DELAY_NP" : -[ run ../has_pthread_delay_np_pass.cpp ] -[ compile-fail ../has_pthread_delay_np_fail.cpp ] ; -test-suite "BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE" : -[ run ../has_pthread_ma_st_pass.cpp ] -[ compile-fail ../has_pthread_ma_st_fail.cpp ] ; -test-suite "BOOST_HAS_PTHREAD_YIELD" : -[ run ../has_pthread_yield_pass.cpp ] -[ compile-fail ../has_pthread_yield_fail.cpp ] ; -test-suite "BOOST_HAS_PTHREADS" : -[ run ../has_pthreads_pass.cpp ] -[ compile-fail ../has_pthreads_fail.cpp ] ; -test-suite "BOOST_HAS_RVALUE_REFS" : -[ run ../has_rvalue_refs_pass.cpp ] -[ compile-fail ../has_rvalue_refs_fail.cpp ] ; -test-suite "BOOST_HAS_SCHED_YIELD" : -[ run ../has_sched_yield_pass.cpp ] -[ compile-fail ../has_sched_yield_fail.cpp ] ; -test-suite "BOOST_HAS_SGI_TYPE_TRAITS" : -[ run ../has_sgi_type_traits_pass.cpp ] -[ compile-fail ../has_sgi_type_traits_fail.cpp ] ; -test-suite "BOOST_HAS_SIGACTION" : -[ run ../has_sigaction_pass.cpp ] -[ compile-fail ../has_sigaction_fail.cpp ] ; -test-suite "BOOST_HAS_SLIST" : -[ run ../has_slist_pass.cpp ] -[ compile-fail ../has_slist_fail.cpp ] ; -test-suite "BOOST_HAS_STATIC_ASSERT" : -[ run ../has_static_assert_pass.cpp ] -[ compile-fail ../has_static_assert_fail.cpp ] ; -test-suite "BOOST_HAS_STDINT_H" : -[ run ../has_stdint_h_pass.cpp ] -[ compile-fail ../has_stdint_h_fail.cpp ] ; -test-suite "BOOST_HAS_STLP_USE_FACET" : -[ run ../has_stlp_use_facet_pass.cpp ] -[ compile-fail ../has_stlp_use_facet_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_ARRAY" : -[ run ../has_tr1_array_pass.cpp ] -[ compile-fail ../has_tr1_array_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_BIND" : -[ run ../has_tr1_bind_pass.cpp ] -[ compile-fail ../has_tr1_bind_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_COMPLEX_OVERLOADS" : -[ run ../has_tr1_complex_over_pass.cpp ] -[ compile-fail ../has_tr1_complex_over_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG" : -[ run ../has_tr1_complex_trig_pass.cpp ] -[ compile-fail ../has_tr1_complex_trig_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_FUNCTION" : -[ run ../has_tr1_function_pass.cpp ] -[ compile-fail ../has_tr1_function_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_HASH" : -[ run ../has_tr1_hash_pass.cpp ] -[ compile-fail ../has_tr1_hash_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_MEM_FN" : -[ run ../has_tr1_mem_fn_pass.cpp ] -[ compile-fail ../has_tr1_mem_fn_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_RANDOM" : -[ run ../has_tr1_random_pass.cpp ] -[ compile-fail ../has_tr1_random_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_REFERENCE_WRAPPER" : -[ run ../has_tr1_ref_wrap_pass.cpp ] -[ compile-fail ../has_tr1_ref_wrap_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_REGEX" : -[ run ../has_tr1_regex_pass.cpp ] -[ compile-fail ../has_tr1_regex_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_RESULT_OF" : -[ run ../has_tr1_result_of_pass.cpp ] -[ compile-fail ../has_tr1_result_of_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_SHARED_PTR" : -[ run ../has_tr1_shared_ptr_pass.cpp ] -[ compile-fail ../has_tr1_shared_ptr_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_TUPLE" : -[ run ../has_tr1_tuple_pass.cpp ] -[ compile-fail ../has_tr1_tuple_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_TYPE_TRAITS" : -[ run ../has_tr1_type_traits_pass.cpp ] -[ compile-fail ../has_tr1_type_traits_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_UNORDERED_MAP" : -[ run ../has_tr1_unordered_map_pass.cpp ] -[ compile-fail ../has_tr1_unordered_map_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_UNORDERED_SET" : -[ run ../has_tr1_unordered_set_pass.cpp ] -[ compile-fail ../has_tr1_unordered_set_fail.cpp ] ; -test-suite "BOOST_HAS_TR1_UTILITY" : -[ run ../has_tr1_utility_pass.cpp ] -[ compile-fail ../has_tr1_utility_fail.cpp ] ; -test-suite "BOOST_HAS_UNISTD_H" : -[ run ../has_unistd_h_pass.cpp ] -[ compile-fail ../has_unistd_h_fail.cpp ] ; -test-suite "BOOST_HAS_VARIADIC_TMPL" : -[ run ../has_variadic_tmpl_pass.cpp ] -[ compile-fail ../has_variadic_tmpl_fail.cpp ] ; -test-suite "BOOST_MSVC6_MEMBER_TEMPLATES" : -[ run ../has_vc6_mem_templ_pass.cpp ] -[ compile-fail ../has_vc6_mem_templ_fail.cpp ] ; -test-suite "BOOST_MSVC_STD_ITERATOR" : -[ run ../has_vc_iterator_pass.cpp ] -[ compile-fail ../has_vc_iterator_fail.cpp ] ; -test-suite "BOOST_HAS_WINTHREADS" : -[ run ../has_winthreads_pass.cpp ] -[ compile-fail ../has_winthreads_fail.cpp ] ; -test-suite "BOOST_NO_ADL_BARRIER" : -[ run ../no_adl_barrier_pass.cpp ] -[ compile-fail ../no_adl_barrier_fail.cpp ] ; -test-suite "BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP" : -[ run ../no_arg_dep_lookup_pass.cpp ] -[ compile-fail ../no_arg_dep_lookup_fail.cpp ] ; -test-suite "BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS" : -[ run ../no_array_type_spec_pass.cpp ] -[ compile-fail ../no_array_type_spec_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_AUTO_DECLARATIONS" : -[ run ../no_auto_declarations_pass.cpp ] -[ compile-fail ../no_auto_declarations_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS" : -[ run ../no_auto_multidecl_pass.cpp ] -[ compile-fail ../no_auto_multidecl_fail.cpp ] ; -test-suite "BOOST_NO_AUTO_PTR" : -[ run ../no_auto_ptr_pass.cpp ] -[ compile-fail ../no_auto_ptr_fail.cpp ] ; -test-suite "BOOST_BCB_PARTIAL_SPECIALIZATION_BUG" : -[ run ../no_bcb_partial_spec_pass.cpp ] -[ compile-fail ../no_bcb_partial_spec_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_CHAR16_T" : -[ run ../no_char16_t_pass.cpp ] -[ compile-fail ../no_char16_t_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_CHAR32_T" : -[ run ../no_char32_t_pass.cpp ] -[ compile-fail ../no_char32_t_fail.cpp ] ; -test-suite "BOOST_NO_COMPLETE_VALUE_INITIALIZATION" : -[ run ../no_com_value_init_pass.cpp ] -[ compile-fail ../no_com_value_init_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_CONSTEXPR" : -[ run ../no_constexpr_pass.cpp ] -[ compile-fail ../no_constexpr_fail.cpp ] ; -test-suite "BOOST_NO_CTYPE_FUNCTIONS" : -[ run ../no_ctype_functions_pass.cpp ] -[ compile-fail ../no_ctype_functions_fail.cpp ] ; -test-suite "BOOST_NO_CV_SPECIALIZATIONS" : -[ run ../no_cv_spec_pass.cpp ] -[ compile-fail ../no_cv_spec_fail.cpp ] ; -test-suite "BOOST_NO_CV_VOID_SPECIALIZATIONS" : -[ run ../no_cv_void_spec_pass.cpp ] -[ compile-fail ../no_cv_void_spec_fail.cpp ] ; -test-suite "BOOST_NO_CWCHAR" : -[ run ../no_cwchar_pass.cpp ] -[ compile-fail ../no_cwchar_fail.cpp ] ; -test-suite "BOOST_NO_CWCTYPE" : -[ run ../no_cwctype_pass.cpp ] -[ compile-fail ../no_cwctype_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_ADDRESSOF" : -[ run ../no_cxx11_addressof_pass.cpp ] -[ compile-fail ../no_cxx11_addressof_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_ALIGNAS" : -[ run ../no_cxx11_alignas_pass.cpp ] -[ compile-fail ../no_cxx11_alignas_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_ALLOCATOR" : -[ run ../no_cxx11_allocator_pass.cpp ] -[ compile-fail ../no_cxx11_allocator_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_ATOMIC_SMART_PTR" : -[ run ../no_cxx11_atomic_sp_pass.cpp ] -[ compile-fail ../no_cxx11_atomic_sp_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_FINAL" : -[ run ../no_cxx11_final_pass.cpp ] -[ compile-fail ../no_cxx11_final_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_ARRAY" : -[ run ../no_cxx11_hdr_array_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_array_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_ATOMIC" : -[ run ../no_cxx11_hdr_atomic_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_atomic_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_CHRONO" : -[ run ../no_cxx11_hdr_chrono_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_chrono_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_CODECVT" : -[ run ../no_cxx11_hdr_codecvt_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_codecvt_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_CONDITION_VARIABLE" : -[ run ../no_cxx11_hdr_condition_variable_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_condition_variable_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_FORWARD_LIST" : -[ run ../no_cxx11_hdr_forward_list_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_forward_list_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_FUTURE" : -[ run ../no_cxx11_hdr_future_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_future_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_INITIALIZER_LIST" : -[ run ../no_cxx11_hdr_initializer_list_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_initializer_list_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_MUTEX" : -[ run ../no_cxx11_hdr_mutex_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_mutex_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_RANDOM" : -[ run ../no_cxx11_hdr_random_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_random_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_RATIO" : -[ run ../no_cxx11_hdr_ratio_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_ratio_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_REGEX" : -[ run ../no_cxx11_hdr_regex_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_regex_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_SYSTEM_ERROR" : -[ run ../no_cxx11_hdr_system_error_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_system_error_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_THREAD" : -[ run ../no_cxx11_hdr_thread_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_thread_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_TUPLE" : -[ run ../no_cxx11_hdr_tuple_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_tuple_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_TYPE_TRAITS" : -[ run ../no_cxx11_hdr_type_traits_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_type_traits_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_TYPEINDEX" : -[ run ../no_cxx11_hdr_typeindex_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_typeindex_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_UNORDERED_MAP" : -[ run ../no_cxx11_hdr_unordered_map_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_unordered_map_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_UNORDERED_SET" : -[ run ../no_cxx11_hdr_unordered_set_pass.cpp ] -[ compile-fail ../no_cxx11_hdr_unordered_set_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_INLINE_NAMESPACES" : -[ run ../no_cxx11_inline_namespaces_pass.cpp ] -[ compile-fail ../no_cxx11_inline_namespaces_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS" : -[ run ../no_cxx11_non_pub_def_fun_pass.cpp ] -[ compile-fail ../no_cxx11_non_pub_def_fun_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_NUMERIC_LIMITS" : -[ run ../no_cxx11_numeric_limits_pass.cpp ] -[ compile-fail ../no_cxx11_numeric_limits_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_REF_QUALIFIERS" : -[ run ../no_cxx11_ref_qualifiers_pass.cpp ] -[ compile-fail ../no_cxx11_ref_qualifiers_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_SMART_PTR" : -[ run ../no_cxx11_smart_ptr_pass.cpp ] -[ compile-fail ../no_cxx11_smart_ptr_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_STD_ALIGN" : -[ run ../no_cxx11_std_align_pass.cpp ] -[ compile-fail ../no_cxx11_std_align_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_THREAD_LOCAL" : -[ run ../no_cxx11_thread_local_pass.cpp ] -[ compile-fail ../no_cxx11_thread_local_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_TRAILING_RESULT_TYPES" : -[ run ../no_cxx11_trailing_result_types_pass.cpp ] -[ compile-fail ../no_cxx11_trailing_result_types_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_USER_DEFINED_LITERALS" : -[ run ../no_cxx11_user_lit_pass.cpp ] -[ compile-fail ../no_cxx11_user_lit_fail.cpp ] ; -test-suite "BOOST_NO_CXX14_BINARY_LITERALS" : -[ run ../no_cxx14_binary_literals_pass.cpp ] -[ compile-fail ../no_cxx14_binary_literals_fail.cpp ] ; -test-suite "BOOST_NO_CXX14_CONSTEXPR" : -[ run ../no_cxx14_constexpr_pass.cpp ] -[ compile-fail ../no_cxx14_constexpr_fail.cpp ] ; -test-suite "BOOST_NO_CXX14_DECLTYPE_AUTO" : -[ run ../no_cxx14_decltype_auto_pass.cpp ] -[ compile-fail ../no_cxx14_decltype_auto_fail.cpp ] ; -test-suite "BOOST_NO_CXX14_DIGIT_SEPARATORS" : -[ run ../no_cxx14_digit_separator_pass.cpp ] -[ compile-fail ../no_cxx14_digit_separator_fail.cpp ] ; -test-suite "BOOST_NO_CXX14_GENERIC_LAMBDAS" : -[ run ../no_cxx14_generic_lambda_pass.cpp ] -[ compile-fail ../no_cxx14_generic_lambda_fail.cpp ] ; -test-suite "BOOST_NO_CXX14_HDR_SHARED_MUTEX" : -[ run ../no_cxx14_hdr_shared_mutex_pass.cpp ] -[ compile-fail ../no_cxx14_hdr_shared_mutex_fail.cpp ] ; -test-suite "BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES" : -[ run ../no_cxx14_lambda_capture_pass.cpp ] -[ compile-fail ../no_cxx14_lambda_capture_fail.cpp ] ; -test-suite "BOOST_NO_CXX14_AGGREGATE_NSDMI" : -[ run ../no_cxx14_member_init_pass.cpp ] -[ compile-fail ../no_cxx14_member_init_fail.cpp ] ; -test-suite "BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION" : -[ run ../no_cxx14_return_type_ded_pass.cpp ] -[ compile-fail ../no_cxx14_return_type_ded_fail.cpp ] ; -test-suite "BOOST_NO_CXX14_STD_EXCHANGE" : -[ run ../no_cxx14_std_exchange_pass.cpp ] -[ compile-fail ../no_cxx14_std_exchange_fail.cpp ] ; -test-suite "BOOST_NO_CXX14_VARIABLE_TEMPLATES" : -[ run ../no_cxx14_var_templ_pass.cpp ] -[ compile-fail ../no_cxx14_var_templ_fail.cpp ] ; -test-suite "BOOST_NO_CXX17_STD_APPLY" : -[ run ../no_cxx17_std_apply_pass.cpp ] -[ compile-fail ../no_cxx17_std_apply_fail.cpp ] ; -test-suite "BOOST_NO_CXX17_STD_INVOKE" : -[ run ../no_cxx17_std_invoke_pass.cpp ] -[ compile-fail ../no_cxx17_std_invoke_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_HDR_FUNCTIONAL" : -[ run ../no_cxx_hdr_functional_pass.cpp ] -[ compile-fail ../no_cxx_hdr_functional_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_DECLTYPE" : -[ run ../no_decltype_pass.cpp ] -[ compile-fail ../no_decltype_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_DECLTYPE_N3276" : -[ run ../no_decltype_n3276_pass.cpp ] -[ compile-fail ../no_decltype_n3276_fail.cpp ] ; -test-suite "BOOST_DEDUCED_TYPENAME" : -[ run ../no_ded_typename_pass.cpp ] -[ compile-fail ../no_ded_typename_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_DEFAULTED_FUNCTIONS" : -[ run ../no_defaulted_functions_pass.cpp ] -[ compile-fail ../no_defaulted_functions_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_DELETED_FUNCTIONS" : -[ run ../no_deleted_functions_pass.cpp ] -[ compile-fail ../no_deleted_functions_fail.cpp ] ; -test-suite "BOOST_NO_DEPENDENT_NESTED_DERIVATIONS" : -[ run ../no_dep_nested_class_pass.cpp ] -[ compile-fail ../no_dep_nested_class_fail.cpp ] ; -test-suite "BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS" : -[ run ../no_dep_val_param_pass.cpp ] -[ compile-fail ../no_dep_val_param_fail.cpp ] ; -test-suite "BOOST_NO_EXCEPTION_STD_NAMESPACE" : -[ run ../no_excep_std_pass.cpp ] -[ compile-fail ../no_excep_std_fail.cpp ] ; -test-suite "BOOST_NO_EXCEPTIONS" : -[ run ../no_exceptions_pass.cpp ] -[ compile-fail ../no_exceptions_fail.cpp ] ; -test-suite "BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS" : -[ run ../no_exp_func_tem_arg_pass.cpp ] -[ compile-fail ../no_exp_func_tem_arg_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS" : -[ run ../no_explicit_cvt_ops_pass.cpp ] -[ compile-fail ../no_explicit_cvt_ops_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_EXTERN_TEMPLATE" : -[ run ../no_extern_template_pass.cpp ] -[ compile-fail ../no_extern_template_fail.cpp ] ; -test-suite "BOOST_NO_FENV_H" : -[ run ../no_fenv_h_pass.cpp ] -[ compile-fail ../no_fenv_h_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS" : -[ run ../no_fixed_len_variadic_templates_pass.cpp ] -[ compile-fail ../no_fixed_len_variadic_templates_fail.cpp ] ; -test-suite "BOOST_NO_FUNCTION_TEMPLATE_ORDERING" : -[ run ../no_func_tmp_order_pass.cpp ] -[ compile-fail ../no_func_tmp_order_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS" : -[ run ../no_function_template_default_args_pass.cpp ] -[ compile-fail ../no_function_template_default_args_fail.cpp ] ; -test-suite "BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS" : -[ run ../no_function_type_spec_pass.cpp ] -[ compile-fail ../no_function_type_spec_fail.cpp ] ; -test-suite "BOOST_NO_MS_INT64_NUMERIC_LIMITS" : -[ run ../no_i64_limits_pass.cpp ] -[ compile-fail ../no_i64_limits_fail.cpp ] ; -test-suite "BOOST_NO_INCLASS_MEMBER_INITIALIZATION" : -[ run ../no_inline_memb_init_pass.cpp ] -[ compile-fail ../no_inline_memb_init_fail.cpp ] ; -test-suite "BOOST_NO_INTEGRAL_INT64_T" : -[ run ../no_integral_int64_t_pass.cpp ] -[ compile-fail ../no_integral_int64_t_fail.cpp ] ; -test-suite "BOOST_NO_IOSFWD" : -[ run ../no_iosfwd_pass.cpp ] -[ compile-fail ../no_iosfwd_fail.cpp ] ; -test-suite "BOOST_NO_IOSTREAM" : -[ run ../no_iostream_pass.cpp ] -[ compile-fail ../no_iostream_fail.cpp ] ; -test-suite "BOOST_NO_IS_ABSTRACT" : -[ run ../no_is_abstract_pass.cpp ] -[ compile-fail ../no_is_abstract_fail.cpp ] ; -test-suite "BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS" : -[ run ../no_iter_construct_pass.cpp ] -[ compile-fail ../no_iter_construct_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_LAMBDAS" : -[ run ../no_lambdas_pass.cpp ] -[ compile-fail ../no_lambdas_fail.cpp ] ; -test-suite "BOOST_NO_LIMITS" : -[ run ../no_limits_pass.cpp ] -[ compile-fail ../no_limits_fail.cpp ] ; -test-suite "BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS" : -[ run ../no_limits_const_exp_pass.cpp ] -[ compile-fail ../no_limits_const_exp_fail.cpp ] ; -test-suite "BOOST_NO_LONG_LONG_NUMERIC_LIMITS" : -[ run ../no_ll_limits_pass.cpp ] -[ compile-fail ../no_ll_limits_fail.cpp ] ; -test-suite "BOOST_NO_LONG_LONG" : -[ run ../no_long_long_pass.cpp ] -[ compile-fail ../no_long_long_fail.cpp ] ; -test-suite "BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS" : -[ run ../no_mem_func_spec_pass.cpp ] -[ compile-fail ../no_mem_func_spec_fail.cpp ] ; -test-suite "BOOST_NO_MEMBER_TEMPLATE_KEYWORD" : -[ run ../no_mem_tem_keyword_pass.cpp ] -[ compile-fail ../no_mem_tem_keyword_fail.cpp ] ; -test-suite "BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS" : -[ run ../no_mem_tem_pnts_pass.cpp ] -[ compile-fail ../no_mem_tem_pnts_fail.cpp ] ; -test-suite "BOOST_NO_MEMBER_TEMPLATE_FRIENDS" : -[ run ../no_mem_templ_frnds_pass.cpp ] -[ compile-fail ../no_mem_templ_frnds_fail.cpp ] ; -test-suite "BOOST_NO_MEMBER_TEMPLATES" : -[ run ../no_mem_templates_pass.cpp ] -[ compile-fail ../no_mem_templates_fail.cpp ] ; -test-suite "BOOST_NO_NESTED_FRIENDSHIP" : -[ run ../no_nested_friendship_pass.cpp ] -[ compile-fail ../no_nested_friendship_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_NOEXCEPT" : -[ run ../no_noexcept_pass.cpp ] -[ compile-fail ../no_noexcept_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_NULLPTR" : -[ run ../no_nullptr_pass.cpp ] -[ compile-fail ../no_nullptr_fail.cpp ] ; -test-suite "BOOST_NO_OPERATORS_IN_NAMESPACE" : -[ run ../no_ops_in_namespace_pass.cpp ] -[ compile-fail ../no_ops_in_namespace_fail.cpp ] ; -test-suite "BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS" : -[ run ../no_part_spec_def_args_pass.cpp ] -[ compile-fail ../no_part_spec_def_args_fail.cpp ] ; -test-suite "BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION" : -[ run ../no_partial_spec_pass.cpp ] -[ compile-fail ../no_partial_spec_fail.cpp ] ; -test-suite "BOOST_NO_PRIVATE_IN_AGGREGATE" : -[ run ../no_priv_aggregate_pass.cpp ] -[ compile-fail ../no_priv_aggregate_fail.cpp ] ; -test-suite "BOOST_NO_POINTER_TO_MEMBER_CONST" : -[ run ../no_ptr_mem_const_pass.cpp ] -[ compile-fail ../no_ptr_mem_const_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_RANGE_BASED_FOR" : -[ run ../no_range_based_for_pass.cpp ] -[ compile-fail ../no_range_based_for_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_RAW_LITERALS" : -[ run ../no_raw_literals_pass.cpp ] -[ compile-fail ../no_raw_literals_fail.cpp ] ; -test-suite "BOOST_NO_UNREACHABLE_RETURN_DETECTION" : -[ run ../no_ret_det_pass.cpp ] -[ compile-fail ../no_ret_det_fail.cpp ] ; -test-suite "BOOST_NO_RTTI" : -[ run ../no_rtti_pass.cpp ] -[ compile-fail ../no_rtti_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_RVALUE_REFERENCES" : -[ run ../no_rvalue_references_pass.cpp ] -[ compile-fail ../no_rvalue_references_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_SCOPED_ENUMS" : -[ run ../no_scoped_enums_pass.cpp ] -[ compile-fail ../no_scoped_enums_fail.cpp ] ; -test-suite "BOOST_NO_SFINAE" : -[ run ../no_sfinae_pass.cpp ] -[ compile-fail ../no_sfinae_fail.cpp ] ; -test-suite "BOOST_NO_SFINAE_EXPR" : -[ run ../no_sfinae_expr_pass.cpp ] -[ compile-fail ../no_sfinae_expr_fail.cpp ] ; -test-suite "BOOST_NO_STRINGSTREAM" : -[ run ../no_sstream_pass.cpp ] -[ compile-fail ../no_sstream_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_STATIC_ASSERT" : -[ run ../no_static_assert_pass.cpp ] -[ compile-fail ../no_static_assert_fail.cpp ] ; -test-suite "BOOST_NO_STD_ALLOCATOR" : -[ run ../no_std_allocator_pass.cpp ] -[ compile-fail ../no_std_allocator_fail.cpp ] ; -test-suite "BOOST_NO_STD_DISTANCE" : -[ run ../no_std_distance_pass.cpp ] -[ compile-fail ../no_std_distance_fail.cpp ] ; -test-suite "BOOST_NO_STD_ITERATOR_TRAITS" : -[ run ../no_std_iter_traits_pass.cpp ] -[ compile-fail ../no_std_iter_traits_fail.cpp ] ; -test-suite "BOOST_NO_STD_ITERATOR" : -[ run ../no_std_iterator_pass.cpp ] -[ compile-fail ../no_std_iterator_fail.cpp ] ; -test-suite "BOOST_NO_STD_LOCALE" : -[ run ../no_std_locale_pass.cpp ] -[ compile-fail ../no_std_locale_fail.cpp ] ; -test-suite "BOOST_NO_STD_MESSAGES" : -[ run ../no_std_messages_pass.cpp ] -[ compile-fail ../no_std_messages_fail.cpp ] ; -test-suite "BOOST_NO_STD_MIN_MAX" : -[ run ../no_std_min_max_pass.cpp ] -[ compile-fail ../no_std_min_max_fail.cpp ] ; -test-suite "BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN" : -[ run ../no_std_oi_assign_pass.cpp ] -[ compile-fail ../no_std_oi_assign_fail.cpp ] ; -test-suite "BOOST_NO_STD_TYPEINFO" : -[ run ../no_std_typeinfo_pass.cpp ] -[ compile-fail ../no_std_typeinfo_fail.cpp ] ; -test-suite "BOOST_NO_STD_USE_FACET" : -[ run ../no_std_use_facet_pass.cpp ] -[ compile-fail ../no_std_use_facet_fail.cpp ] ; -test-suite "BOOST_NO_STD_WSTREAMBUF" : -[ run ../no_std_wstreambuf_pass.cpp ] -[ compile-fail ../no_std_wstreambuf_fail.cpp ] ; -test-suite "BOOST_NO_STD_WSTRING" : -[ run ../no_std_wstring_pass.cpp ] -[ compile-fail ../no_std_wstring_fail.cpp ] ; -test-suite "BOOST_NO_STDC_NAMESPACE" : -[ run ../no_stdc_namespace_pass.cpp ] -[ compile-fail ../no_stdc_namespace_fail.cpp ] ; -test-suite "BOOST_NO_SWPRINTF" : -[ run ../no_swprintf_pass.cpp ] -[ compile-fail ../no_swprintf_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS" : -[ run ../no_tem_local_classes_pass.cpp ] -[ compile-fail ../no_tem_local_classes_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_TEMPLATE_ALIASES" : -[ run ../no_template_aliases_pass.cpp ] -[ compile-fail ../no_template_aliases_fail.cpp ] ; -test-suite "BOOST_NO_TEMPLATED_IOSTREAMS" : -[ run ../no_template_streams_pass.cpp ] -[ compile-fail ../no_template_streams_fail.cpp ] ; -test-suite "BOOST_NO_TEMPLATE_TEMPLATES" : -[ run ../no_template_template_pass.cpp ] -[ compile-fail ../no_template_template_fail.cpp ] ; -test-suite "BOOST_NO_TWO_PHASE_NAME_LOOKUP" : -[ run ../no_two_phase_lookup_pass.cpp ] -[ compile-fail ../no_two_phase_lookup_fail.cpp ] ; -test-suite "BOOST_NO_TYPEID" : -[ run ../no_typeid_pass.cpp ] -[ compile-fail ../no_typeid_fail.cpp ] ; -test-suite "BOOST_NO_TYPENAME_WITH_CTOR" : -[ run ../no_typename_with_ctor_pass.cpp ] -[ compile-fail ../no_typename_with_ctor_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_UNICODE_LITERALS" : -[ run ../no_unicode_literals_pass.cpp ] -[ compile-fail ../no_unicode_literals_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX" : -[ run ../no_unified_init_pass.cpp ] -[ compile-fail ../no_unified_init_fail.cpp ] ; -test-suite "BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL" : -[ run ../no_using_breaks_adl_pass.cpp ] -[ compile-fail ../no_using_breaks_adl_fail.cpp ] ; -test-suite "BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE" : -[ run ../no_using_decl_overld_pass.cpp ] -[ compile-fail ../no_using_decl_overld_fail.cpp ] ; -test-suite "BOOST_NO_USING_TEMPLATE" : -[ run ../no_using_template_pass.cpp ] -[ compile-fail ../no_using_template_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_VARIADIC_MACROS" : -[ run ../no_variadic_macros_pass.cpp ] -[ compile-fail ../no_variadic_macros_fail.cpp ] ; -test-suite "BOOST_NO_CXX11_VARIADIC_TEMPLATES" : -[ run ../no_variadic_templates_pass.cpp ] -[ compile-fail ../no_variadic_templates_fail.cpp ] ; -test-suite "BOOST_NO_VOID_RETURNS" : -[ run ../no_void_returns_pass.cpp ] -[ compile-fail ../no_void_returns_fail.cpp ] ; -test-suite "BOOST_NO_INTRINSIC_WCHAR_T" : -[ run ../no_wchar_t_pass.cpp ] -[ compile-fail ../no_wchar_t_fail.cpp ] ; - diff --git a/libs/config/test/all/options_v2.jam b/libs/config/test/all/options_v2.jam deleted file mode 100644 index ac748ef0d..000000000 --- a/libs/config/test/all/options_v2.jam +++ /dev/null @@ -1,12 +0,0 @@ -# copyright John Maddock 2003 -# 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) - -project - : requirements - # threading tests require thread support turned on: - multi - ; - -local test-requirements = ../../test/build//boost_test_exec_monitor ; diff --git a/libs/config/test/boost_fallthrough_test.cpp b/libs/config/test/boost_fallthrough_test.cpp deleted file mode 100644 index 3fabe3516..000000000 --- a/libs/config/test/boost_fallthrough_test.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// 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) - -#include - -int test(int n) -{ - switch (n) - { - case 0: - n++; - BOOST_FALLTHROUGH; - case 1: - n++; - break; - } - return n; -} - diff --git a/libs/config/test/boost_has_2arg_use_facet.ipp b/libs/config/test/boost_has_2arg_use_facet.ipp deleted file mode 100644 index 7ed2b7c16..000000000 --- a/libs/config/test/boost_has_2arg_use_facet.ipp +++ /dev/null @@ -1,32 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_TWO_ARG_USE_FACET -// TITLE: two argument version of use_facet -// DESCRIPTION: The standard library lacks a conforming std::use_facet, -// but has a two argument version that does the job. -// This is primarily for the Rogue Wave std lib. - -#include - - -namespace boost_has_two_arg_use_facet{ - -int test() -{ - std::locale l; - const std::ctype& ct = std::use_facet(l, (std::ctype*)0); - return 0; -} - -} - - - - - - diff --git a/libs/config/test/boost_has_bethreads.ipp b/libs/config/test/boost_has_bethreads.ipp deleted file mode 100644 index 0e01699de..000000000 --- a/libs/config/test/boost_has_bethreads.ipp +++ /dev/null @@ -1,34 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_BETHREADS -// TITLE: BeOS Threads -// DESCRIPTION: The platform supports BeOS style threads. - -#include - - -namespace boost_has_bethreads{ - -int test() -{ - sem_id mut = create_sem(1, "test"); - if(mut > 0) - { - acquire_sem(mut); - release_sem(mut); - delete_sem(mut); - } - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_clock_gettime.ipp b/libs/config/test/boost_has_clock_gettime.ipp deleted file mode 100644 index 59eee5859..000000000 --- a/libs/config/test/boost_has_clock_gettime.ipp +++ /dev/null @@ -1,35 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_CLOCK_GETTIME -// TITLE: clock_gettime -// DESCRIPTION: The platform supports POSIX standard API clock_gettime. - -#include - - -namespace boost_has_clock_gettime{ - -void f() -{ - // this is never called, it just has to compile: - timespec tp; - int res = clock_gettime(CLOCK_REALTIME, &tp); - (void) &res; -} - -int test() -{ - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_dirent_h.ipp b/libs/config/test/boost_has_dirent_h.ipp deleted file mode 100644 index 5d6020202..000000000 --- a/libs/config/test/boost_has_dirent_h.ipp +++ /dev/null @@ -1,30 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_DIRENT_H -// TITLE: -// DESCRIPTION: The platform has an . - -#include - - -namespace boost_has_dirent_h{ - -int test() -{ - DIR* pd = opendir("foobar"); - if(pd) closedir(pd); - return 0; -} - -} - - - - - - diff --git a/libs/config/test/boost_has_expm1.ipp b/libs/config/test/boost_has_expm1.ipp deleted file mode 100644 index b219d50f1..000000000 --- a/libs/config/test/boost_has_expm1.ipp +++ /dev/null @@ -1,25 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_EXPM1 -// TITLE: expm1 -// DESCRIPTION: The std lib has a C99-conforming expm1 function. - -#include - -namespace boost_has_expm1{ - -int test() -{ - double x = 0.5; - x = ::expm1(x); - (void)x; - return 0; -} - -} - diff --git a/libs/config/test/boost_has_float128.ipp b/libs/config/test/boost_has_float128.ipp deleted file mode 100644 index 80b211c14..000000000 --- a/libs/config/test/boost_has_float128.ipp +++ /dev/null @@ -1,29 +0,0 @@ -// (C) Copyright John Maddock 2012. -// 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/config for most recent version. - -// MACRO: BOOST_HAS_FLOAT128 -// TITLE: __float128 -// DESCRIPTION: The platform supports __float128. - -#include - - -namespace boost_has_float128{ - -int test() -{ -#ifdef __GNUC__ - __extension__ __float128 big_float = 0.0Q; -#else - __float128 big_float = 0.0Q; -#endif - (void)&big_float; - return 0; -} - -} - diff --git a/libs/config/test/boost_has_ftime.ipp b/libs/config/test/boost_has_ftime.ipp deleted file mode 100644 index ff04baf9e..000000000 --- a/libs/config/test/boost_has_ftime.ipp +++ /dev/null @@ -1,32 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_FTIME -// TITLE: The platform has FTIME. -// DESCRIPTION: The platform supports the Win32 API type FTIME. - -#include - - -namespace boost_has_ftime{ - -void f(FILETIME) -{ - // this is never called, it just has to compile: -} - -int test() -{ - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_getsystemtimeasfiletime.ipp b/libs/config/test/boost_has_getsystemtimeasfiletime.ipp deleted file mode 100644 index d9b7e1c95..000000000 --- a/libs/config/test/boost_has_getsystemtimeasfiletime.ipp +++ /dev/null @@ -1,30 +0,0 @@ -// (C) Copyright John Maddock 2011. -// 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/config for most recent version. - -// MACRO: BOOST_HAS_GETSYSTEMTIMEASFILETIME -// TITLE: GetSystemTimeAsFileTime -// DESCRIPTION: The platform supports Win32 API GetSystemTimeAsFileTime. - -#include - - -namespace boost_has_getsystemtimeasfiletime{ - -void f() -{ - // this is never called, it just has to compile: - FILETIME ft; - GetSystemTimeAsFileTime(&ft); -} - -int test() -{ - return 0; -} - -} - diff --git a/libs/config/test/boost_has_gettimeofday.ipp b/libs/config/test/boost_has_gettimeofday.ipp deleted file mode 100644 index d79186a9b..000000000 --- a/libs/config/test/boost_has_gettimeofday.ipp +++ /dev/null @@ -1,35 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_GETTIMEOFDAY -// TITLE: gettimeofday -// DESCRIPTION: The platform supports POSIX standard API gettimeofday. - -#include - - -namespace boost_has_gettimeofday{ - -void f() -{ - // this is never called, it just has to compile: - timeval tp; - int res = gettimeofday(&tp, 0); - (void) &res; -} - -int test() -{ - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_hash.ipp b/libs/config/test/boost_has_hash.ipp deleted file mode 100644 index 0363940d2..000000000 --- a/libs/config/test/boost_has_hash.ipp +++ /dev/null @@ -1,68 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_HASH -// TITLE: and -// DESCRIPTION: The C++ implementation provides the (SGI) hash_set -// or hash_map classes. - -#if defined(__GLIBCXX__) || (defined(__GLIBCPP__) && __GLIBCPP__>=20020514) // GCC >= 3.1.0 -# ifdef BOOST_NO_CXX11_STD_UNORDERED -# define BOOST_STD_EXTENSION_NAMESPACE __gnu_cxx -# define _BACKWARD_BACKWARD_WARNING_H 1 /* turn off warnings from the headers below */ -# include -# include -# else - // If we have BOOST_NO_CXX11_STD_UNORDERED *not* defined, then we must - // not include the headers as they clash with the C++0x - // headers. ie in any given translation unit we can include one - // or the other, but not both. -# define DISABLE_BOOST_HAS_HASH_TEST -# endif -#else -#include -#include -#endif - -#ifndef BOOST_STD_EXTENSION_NAMESPACE -#define BOOST_STD_EXTENSION_NAMESPACE std -#endif - -namespace boost_has_hash{ - -#ifndef DISABLE_BOOST_HAS_HASH_TEST - -template -void foo(const BOOST_STD_EXTENSION_NAMESPACE::hash_set& ) -{ -} - -template -void foo(const BOOST_STD_EXTENSION_NAMESPACE::hash_map& ) -{ -} - -#endif - -int test() -{ -#ifndef DISABLE_BOOST_HAS_HASH_TEST - BOOST_STD_EXTENSION_NAMESPACE::hash_set hs; - foo(hs); - BOOST_STD_EXTENSION_NAMESPACE::hash_map hm; - foo(hm); -#endif - return 0; -} - -} - - - - - - diff --git a/libs/config/test/boost_has_int128.ipp b/libs/config/test/boost_has_int128.ipp deleted file mode 100644 index 0feb6a3e2..000000000 --- a/libs/config/test/boost_has_int128.ipp +++ /dev/null @@ -1,36 +0,0 @@ -// (C) Copyright John Maddock 2012. -// 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/config for most recent version. - -// MACRO: BOOST_HAS_INT128 -// TITLE: __int128 -// DESCRIPTION: The platform supports __int128. - -#include - - -namespace boost_has_int128{ - -int test() -{ -#ifdef __GNUC__ - __extension__ __int128 lli = 0; - __extension__ unsigned __int128 ulli = 0u; -#else - __int128 lli = 0; - unsigned __int128 ulli = 0u; -#endif - (void)&lli; - (void)&ulli; - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_log1p.ipp b/libs/config/test/boost_has_log1p.ipp deleted file mode 100644 index 9454d00be..000000000 --- a/libs/config/test/boost_has_log1p.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_LOG1P -// TITLE: log1p -// DESCRIPTION: The std lib has a C99-conforming log1p function. - -#include - -namespace boost_has_log1p{ - -int test() -{ - double x = 0.5; - x = ::log1p(x); - (void)x; - return 0; -} - -} diff --git a/libs/config/test/boost_has_long_long.ipp b/libs/config/test/boost_has_long_long.ipp deleted file mode 100644 index 651021b49..000000000 --- a/libs/config/test/boost_has_long_long.ipp +++ /dev/null @@ -1,36 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_LONG_LONG -// TITLE: long long -// DESCRIPTION: The platform supports long long. - -#include - - -namespace boost_has_long_long{ - -int test() -{ -#ifdef __GNUC__ - __extension__ long long lli = 0LL; - __extension__ unsigned long long ulli = 0uLL; -#else - long long lli = 0LL; - unsigned long long ulli = 0uLL; -#endif - (void)&lli; - (void)&ulli; - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_macro_use_facet.ipp b/libs/config/test/boost_has_macro_use_facet.ipp deleted file mode 100644 index 0e0726df4..000000000 --- a/libs/config/test/boost_has_macro_use_facet.ipp +++ /dev/null @@ -1,35 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_MACRO_USE_FACET -// TITLE: macro version of use_facet: _USE -// DESCRIPTION: The standard library lacks a conforming std::use_facet, -// but has a macro _USE(loc, Type) that does the job. -// This is primarily for the Dinkumware std lib. - -#include - -#ifndef _USE -#error "macro _USE not defined" -#endif - -namespace boost_has_macro_use_facet{ - -int test() -{ - std::locale l; - const std::ctype& ct = std::_USE(l, std::ctype); - return 0; -} - -} - - - - - - diff --git a/libs/config/test/boost_has_ms_int64.ipp b/libs/config/test/boost_has_ms_int64.ipp deleted file mode 100644 index c8b47826b..000000000 --- a/libs/config/test/boost_has_ms_int64.ipp +++ /dev/null @@ -1,32 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_MS_INT64 -// TITLE: __int64 -// DESCRIPTION: The platform supports Microsoft style __int64. - -#include - - -namespace boost_has_ms_int64{ - -int test() -{ - __int64 lli = 0i64; - unsigned __int64 ulli = 0ui64; - (void)lli; - (void)ulli; - return 0; -} - -} - - - - - - diff --git a/libs/config/test/boost_has_nanosleep.ipp b/libs/config/test/boost_has_nanosleep.ipp deleted file mode 100644 index 9262c8cf5..000000000 --- a/libs/config/test/boost_has_nanosleep.ipp +++ /dev/null @@ -1,36 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_NANOSLEEP -// TITLE: nanosleep -// DESCRIPTION: The platform supports POSIX API nanosleep. - -#include - - -namespace boost_has_nanosleep{ - -void f() -{ - // this is never called, it just has to compile: - timespec ts = {0, 0}; - timespec rm; - int res = nanosleep(&ts, &rm); - (void) &res; -} - -int test() -{ - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_nl_types_h.ipp b/libs/config/test/boost_has_nl_types_h.ipp deleted file mode 100644 index 9126adbf8..000000000 --- a/libs/config/test/boost_has_nl_types_h.ipp +++ /dev/null @@ -1,29 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_NL_TYPES_H -// TITLE: -// DESCRIPTION: The platform has an . - -#include - - -namespace boost_has_nl_types_h{ - -int test() -{ - nl_catd cat = catopen("foo", 0); - if(cat >= 0) catclose(cat); - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_nrvo.ipp b/libs/config/test/boost_has_nrvo.ipp deleted file mode 100644 index ad6f17f6f..000000000 --- a/libs/config/test/boost_has_nrvo.ipp +++ /dev/null @@ -1,57 +0,0 @@ -// (C) Copyright Terje Slettebo 2001. -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_NRVO -// TITLE: Named return value optimisation. -// DESCRIPTION: Named return value optimisation. - - -namespace boost_has_nrvo -{ - -class test_class -{ -public: - test_class() {} - test_class(const test_class&) - { - ++copy_count; - } - - static int copy_count; -}; - -int test_class::copy_count; - -test_class f() -{ - test_class nrv; - - return nrv; -} - -int test() -{ - test_class::copy_count=0; - - f(); - - return test_class::copy_count; -} - -} // namespace boost_has_nrvo - - - - - - - - - - diff --git a/libs/config/test/boost_has_part_alloc.ipp b/libs/config/test/boost_has_part_alloc.ipp deleted file mode 100644 index fb4bf5162..000000000 --- a/libs/config/test/boost_has_part_alloc.ipp +++ /dev/null @@ -1,65 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_PARTIAL_STD_ALLOCATOR -// TITLE: limited std::allocator support -// DESCRIPTION: The std lib has at least some kind of stanfard allocator -// with allocate/deallocate members and probably not much more. - -#include - -#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7))) -# define BOOST_UNUSED_ATTRIBUTE __attribute__((unused)) -#else -# define BOOST_UNUSED_ATTRIBUTE -#endif - -namespace boost_has_partial_std_allocator{ - -// -// test everything except rebind template members: -// - -template -int test_allocator(const T& i) -{ - typedef std::allocator alloc1_t; - typedef typename alloc1_t::size_type size_type; - typedef typename alloc1_t::difference_type difference_type BOOST_UNUSED_ATTRIBUTE; - typedef typename alloc1_t::pointer pointer; - typedef typename alloc1_t::const_pointer const_pointer; - typedef typename alloc1_t::reference reference; - typedef typename alloc1_t::const_reference const_reference; - typedef typename alloc1_t::value_type value_type BOOST_UNUSED_ATTRIBUTE; - - alloc1_t a1; - - pointer p = a1.allocate(1); - const_pointer cp = p; - a1.construct(p,i); - size_type s = a1.max_size(); - (void)s; - reference r = *p; - const_reference cr = *cp; - if(p != a1.address(r)) return -1; - if(cp != a1.address(cr)) return -1; - a1.destroy(p); - a1.deallocate(p,1); - - return 0; -} - - -int test() -{ - return test_allocator(0); -} - -} - -#undef BOOST_UNUSED_ATTRIBUTE - diff --git a/libs/config/test/boost_has_pthread_delay_np.ipp b/libs/config/test/boost_has_pthread_delay_np.ipp deleted file mode 100644 index 294d3db5b..000000000 --- a/libs/config/test/boost_has_pthread_delay_np.ipp +++ /dev/null @@ -1,35 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_PTHREAD_DELAY_NP -// TITLE: pthread_delay_np -// DESCRIPTION: The platform supports non-standard pthread_delay_np API. - -#include -#include - - -namespace boost_has_pthread_delay_np{ - -void f() -{ - // this is never called, it just has to compile: - timespec ts; - int res = pthread_delay_np(&ts); -} - -int test() -{ - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_pthread_ma_st.ipp b/libs/config/test/boost_has_pthread_ma_st.ipp deleted file mode 100644 index 0e985f2d8..000000000 --- a/libs/config/test/boost_has_pthread_ma_st.ipp +++ /dev/null @@ -1,37 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -// TITLE: pthread_mutexattr_settype -// DESCRIPTION: The platform supports POSIX API pthread_mutexattr_settype. - -#include - - -namespace boost_has_pthread_mutexattr_settype{ - -void f() -{ - // this is never called, it just has to compile: - pthread_mutexattr_t attr; - pthread_mutexattr_init(&attr); - int type = 0; - pthread_mutexattr_settype(&attr, type); -} - -int test() -{ - return 0; -} - -} - - - - - - diff --git a/libs/config/test/boost_has_pthread_yield.ipp b/libs/config/test/boost_has_pthread_yield.ipp deleted file mode 100644 index 37046d325..000000000 --- a/libs/config/test/boost_has_pthread_yield.ipp +++ /dev/null @@ -1,34 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_PTHREAD_YIELD -// TITLE: pthread_yield -// DESCRIPTION: The platform supports non standard API pthread_yield. - -#include - - -namespace boost_has_pthread_yield{ - -void f() -{ - // this is never called, it just has to compile: - int res = pthread_yield(); - (void)res; -} - -int test() -{ - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_pthreads.ipp b/libs/config/test/boost_has_pthreads.ipp deleted file mode 100644 index eeeff65fe..000000000 --- a/libs/config/test/boost_has_pthreads.ipp +++ /dev/null @@ -1,64 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_PTHREADS -// TITLE: POSIX Threads -// DESCRIPTION: The platform supports POSIX style threads. - -#include - - -namespace boost_has_pthreads{ - -extern "C" void* thread_proc(void* arg) -{ - return arg; -} - -int test() -{ - pthread_mutex_t mut; - int result = pthread_mutex_init(&mut, 0); - if(0 == result) - { - // - // Failure to be able to create and use a mutex - // is always a failure, even if the pthread - // library is just a non-functioning stub. - // - result |= pthread_mutex_lock(&mut); - result |= pthread_mutex_unlock(&mut); - result |= pthread_mutex_trylock(&mut); - result |= pthread_mutex_unlock(&mut); - result |= pthread_mutex_destroy(&mut); - // - // Try and create a thread, this is allowed - // to fail, in case we are linking to a pthread - // "stub" library. - // - pthread_t t; - int r = pthread_create(&t, 0, &thread_proc, 0); - // result |= r; - if(r == 0) - { - // - // If we can create a thread, then we must be able to join to it: - // - void* arg; - r = pthread_join(t, &arg); - result |= r; - } - } - return result; -} - -} - - - - - diff --git a/libs/config/test/boost_has_rvalue_refs.ipp b/libs/config/test/boost_has_rvalue_refs.ipp deleted file mode 100644 index f0ce174d7..000000000 --- a/libs/config/test/boost_has_rvalue_refs.ipp +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2007 Douglas Gregor -// 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/config for most recent version. - -// MACRO: BOOST_HAS_RVALUE_REFS -// TITLE: rvalue references -// DESCRIPTION: The compiler supports C++0x rvalue references - -namespace boost_has_rvalue_refs { - -void g(int&) {} - -template -void forward(F f, T&& t) { f(static_cast(t)); } - -int test() -{ - int x; - forward(g, x); - return 0; -} - -} diff --git a/libs/config/test/boost_has_sched_yield.ipp b/libs/config/test/boost_has_sched_yield.ipp deleted file mode 100644 index 1302fbff2..000000000 --- a/libs/config/test/boost_has_sched_yield.ipp +++ /dev/null @@ -1,34 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_SCHED_YIELD -// TITLE: sched_yield -// DESCRIPTION: The platform supports POSIX standard API sched_yield. - -#include - - -namespace boost_has_sched_yield{ - -void f() -{ - // this is never called, it just has to compile: - int res = sched_yield(); - (void) &res; -} - -int test() -{ - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_sgi_type_traits.ipp b/libs/config/test/boost_has_sgi_type_traits.ipp deleted file mode 100644 index 5848b68f5..000000000 --- a/libs/config/test/boost_has_sgi_type_traits.ipp +++ /dev/null @@ -1,40 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_SGI_TYPE_TRAITS -// TITLE: SGI style -// DESCRIPTION: The standard library has it's own type_traits implementation. - -#include - - -namespace boost_has_sgi_type_traits{ - -struct foo_type{}; - -int test() -{ - ::__true_type t; - ::__false_type f; - typedef ::__type_traits::has_trivial_destructor td; - typedef ::__type_traits::has_trivial_assignment_operator ta; - typedef ::__type_traits::has_trivial_copy_constructor tc; - typedef ::__type_traits::has_trivial_default_constructor tdc; - typedef ::__type_traits::is_POD_type isp; - - (void) &t; // avoid "unused variable" warnings - (void) &f; - - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_sigaction.ipp b/libs/config/test/boost_has_sigaction.ipp deleted file mode 100644 index 12170c1da..000000000 --- a/libs/config/test/boost_has_sigaction.ipp +++ /dev/null @@ -1,36 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_SIGACTION -// TITLE: sigaction -// DESCRIPTION: The platform supports POSIX standard API sigaction. - -#include - - -namespace boost_has_sigaction{ - -void f() -{ - // this is never called, it just has to compile: - struct sigaction* sa1 = 0 ; - struct sigaction* sa2 = 0 ; - int res = sigaction(0, sa1, sa2); - (void) &res; -} - -int test() -{ - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_slist.ipp b/libs/config/test/boost_has_slist.ipp deleted file mode 100644 index f3c37d4c2..000000000 --- a/libs/config/test/boost_has_slist.ipp +++ /dev/null @@ -1,44 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_SLIST -// TITLE: -// DESCRIPTION: The C++ implementation provides the (SGI) slist class. - -#if defined(__GLIBCXX__) || (defined(__GLIBCPP__) && __GLIBCPP__>=20020514) // GCC >= 3.1.0 -# define BOOST_STD_EXTENSION_NAMESPACE __gnu_cxx -#include -#else -#include -#endif - -#ifndef BOOST_STD_EXTENSION_NAMESPACE -#define BOOST_STD_EXTENSION_NAMESPACE std -#endif - -namespace boost_has_slist{ - -template -void foo(const BOOST_STD_EXTENSION_NAMESPACE::slist& ) -{ -} - - -int test() -{ - BOOST_STD_EXTENSION_NAMESPACE::slist l; - foo(l); - return 0; -} - -} - - - - - - diff --git a/libs/config/test/boost_has_static_assert.ipp b/libs/config/test/boost_has_static_assert.ipp deleted file mode 100644 index 545938a0e..000000000 --- a/libs/config/test/boost_has_static_assert.ipp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2007 Douglas Gregor -// 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/config for most recent version. - -// MACRO: BOOST_HAS_STATIC_ASSERT -// TITLE: static assertions -// DESCRIPTION: The compiler supports C++0x static assertions - -namespace boost_has_static_assert { - -int test() -{ - static_assert(true, "OK"); - return 0; -} - -} diff --git a/libs/config/test/boost_has_stdint_h.ipp b/libs/config/test/boost_has_stdint_h.ipp deleted file mode 100644 index c731f503f..000000000 --- a/libs/config/test/boost_has_stdint_h.ipp +++ /dev/null @@ -1,48 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_STDINT_H -// TITLE: stdint.h -// DESCRIPTION: There are no 1998 C++ Standard headers -// or , although the 1999 C Standard does -// include . -// If is present, can make -// good use of it, so a flag is supplied (signalling -// presence; thus the default is not present, conforming -// to the current C++ standard). - -# if defined(__hpux) || defined(__FreeBSD__) || defined(__IBMCPP__) -# include -# else -# include -# endif - -namespace boost_has_stdint_h{ - -int test() -{ - int8_t i = 0; -#ifndef __QNX__ - // QNX has these under non-standard names, our cstdint.hpp will find them however: - int_fast8_t j = 0; - int_least8_t k = 0; - (void)j; - (void)k; -#endif - (void)i; - - return 0; -} - -} - - - - - - - diff --git a/libs/config/test/boost_has_stlp_use_facet.ipp b/libs/config/test/boost_has_stlp_use_facet.ipp deleted file mode 100644 index 5b61b7412..000000000 --- a/libs/config/test/boost_has_stlp_use_facet.ipp +++ /dev/null @@ -1,31 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_STLP_USE_FACET -// TITLE: STLport version of use_facet -// DESCRIPTION: The standard library lacks a conforming std::use_facet, -// but has a workaound class-version that does the job. -// This is primarily for the STLport std lib. - -#include - - -namespace boost_has_stlp_use_facet{ - -int test() -{ - std::locale l; - const std::ctype& ct = *std::_Use_facet >(l); - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_tr1_array.ipp b/libs/config/test/boost_has_tr1_array.ipp deleted file mode 100644 index 5293dd8fe..000000000 --- a/libs/config/test/boost_has_tr1_array.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_ARRAY -// TITLE: std::tr1::array -// DESCRIPTION: The std lib has a tr1-conforming array library. - -#include - -namespace boost_has_tr1_array{ - -using std::tr1::array; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_bind.ipp b/libs/config/test/boost_has_tr1_bind.ipp deleted file mode 100644 index b3a6d181c..000000000 --- a/libs/config/test/boost_has_tr1_bind.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_BIND -// TITLE: std::tr1::bind -// DESCRIPTION: The std lib has a tr1-conforming bind template function. - -#include - -namespace boost_has_tr1_bind{ - -using std::tr1::bind; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_complex_over.ipp b/libs/config/test/boost_has_tr1_complex_over.ipp deleted file mode 100644 index d7b880d7c..000000000 --- a/libs/config/test/boost_has_tr1_complex_over.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_COMPLEX_OVERLOADS -// TITLE: std::complex overloads -// DESCRIPTION: The std lib has a tr1-conforming set of std::complex overloads. - -#include - -namespace boost_has_tr1_complex_overloads{ - - -int test() -{ - std::arg(0); - std::conj(0.0); - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_complex_trig.ipp b/libs/config/test/boost_has_tr1_complex_trig.ipp deleted file mode 100644 index bbd9f8cf5..000000000 --- a/libs/config/test/boost_has_tr1_complex_trig.ipp +++ /dev/null @@ -1,30 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG -// TITLE: std::complex inverse trig functions -// DESCRIPTION: The std lib has a tr1-conforming set of std::complex inverse trig functions. - -#include - -namespace boost_has_tr1_complex_inverse_trig{ - - -int test() -{ - std::complex cd; - std::asin(cd); - std::acos(cd); - std::atan(cd); - std::asinh(cd); - std::acosh(cd); - std::atanh(cd); - std::fabs(cd); - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_function.ipp b/libs/config/test/boost_has_tr1_function.ipp deleted file mode 100644 index ae4af295c..000000000 --- a/libs/config/test/boost_has_tr1_function.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_FUNCTION -// TITLE: std::tr1::function -// DESCRIPTION: The std lib has a tr1-conforming function template class. - -#include - -namespace boost_has_tr1_function{ - -using std::tr1::function; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_hash.ipp b/libs/config/test/boost_has_tr1_hash.ipp deleted file mode 100644 index 3adc2ab18..000000000 --- a/libs/config/test/boost_has_tr1_hash.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_HASH -// TITLE: std::tr1::hash -// DESCRIPTION: The std lib has a tr1-conforming hash function library. - -#include - -namespace boost_has_tr1_hash{ - -using std::tr1::hash; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_mem_fn.ipp b/libs/config/test/boost_has_tr1_mem_fn.ipp deleted file mode 100644 index d5da8937f..000000000 --- a/libs/config/test/boost_has_tr1_mem_fn.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_MEM_FN -// TITLE: std::tr1::mem_fn -// DESCRIPTION: The std lib has a tr1-conforming mem_fn template function. - -#include - -namespace boost_has_tr1_mem_fn{ - -using std::tr1::mem_fn; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_random.ipp b/libs/config/test/boost_has_tr1_random.ipp deleted file mode 100644 index ddd88e7dc..000000000 --- a/libs/config/test/boost_has_tr1_random.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_RANDOM -// TITLE: std::tr1::random -// DESCRIPTION: The std lib has a tr1-conforming random numer library. - -#include - -namespace boost_has_tr1_random{ - -using std::tr1::variate_generator; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_ref_wrap.ipp b/libs/config/test/boost_has_tr1_ref_wrap.ipp deleted file mode 100644 index 76c002ccd..000000000 --- a/libs/config/test/boost_has_tr1_ref_wrap.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_REFERENCE_WRAPPER -// TITLE: std::tr1::reference_wrapper -// DESCRIPTION: The std lib has a tr1-conforming reference_wrapper. - -#include - -namespace boost_has_tr1_reference_wrapper{ - -int test() -{ - int i; - std::tr1::reference_wrapper r = std::tr1::ref(i); - (void)r; - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_regex.ipp b/libs/config/test/boost_has_tr1_regex.ipp deleted file mode 100644 index 4f11c1e97..000000000 --- a/libs/config/test/boost_has_tr1_regex.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_REGEX -// TITLE: std::tr1::regex -// DESCRIPTION: The std lib has a tr1-conforming regex library. - -#include - -namespace boost_has_tr1_regex{ - -using std::tr1::regex; - -int test() -{ - return 0; -} - -} - diff --git a/libs/config/test/boost_has_tr1_result_of.ipp b/libs/config/test/boost_has_tr1_result_of.ipp deleted file mode 100644 index d578e9f94..000000000 --- a/libs/config/test/boost_has_tr1_result_of.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_RESULT_OF -// TITLE: std::tr1::result_of -// DESCRIPTION: The std lib has a tr1-conforming result_of template. - -#include - -namespace boost_has_tr1_result_of{ - -typedef std::tr1::result_of r; -typedef r::type rr; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_shared_ptr.ipp b/libs/config/test/boost_has_tr1_shared_ptr.ipp deleted file mode 100644 index aea65dc14..000000000 --- a/libs/config/test/boost_has_tr1_shared_ptr.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_SHARED_PTR -// TITLE: std::tr1::shared_ptr -// DESCRIPTION: The std lib has a tr1-conforming shrared_ptr. - -#include - -namespace boost_has_tr1_shared_ptr{ - -int test() -{ - int i; - std::tr1::shared_ptr r(new int()); - (void)r; - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_tuple.ipp b/libs/config/test/boost_has_tr1_tuple.ipp deleted file mode 100644 index 20c72dbdb..000000000 --- a/libs/config/test/boost_has_tr1_tuple.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_TUPLE -// TITLE: std::tr1::tuple -// DESCRIPTION: The std lib has a tr1-conforming tuple library. - -#include - -namespace boost_has_tr1_tuple{ - -using std::tr1::tuple; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_type_traits.ipp b/libs/config/test/boost_has_tr1_type_traits.ipp deleted file mode 100644 index 6bbcd5e40..000000000 --- a/libs/config/test/boost_has_tr1_type_traits.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_TYPE_TRAITS -// TITLE: std::tr1::type_traits -// DESCRIPTION: The std lib has a tr1-conforming type traits library. - -#include - -namespace boost_has_tr1_type_traits{ - -using std::tr1::is_void; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_unordered_map.ipp b/libs/config/test/boost_has_tr1_unordered_map.ipp deleted file mode 100644 index 8336cc716..000000000 --- a/libs/config/test/boost_has_tr1_unordered_map.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_UNORDERED_MAP -// TITLE: std::tr1::unordered_map -// DESCRIPTION: The std lib has a tr1-conforming unordered map library. - -#include - -namespace boost_has_tr1_unordered_map{ - -using std::tr1::unordered_map; -using std::tr1::unordered_multimap; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_unordered_set.ipp b/libs/config/test/boost_has_tr1_unordered_set.ipp deleted file mode 100644 index dcc33e5ec..000000000 --- a/libs/config/test/boost_has_tr1_unordered_set.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_UNORDERED_SET -// TITLE: std::tr1::unordered_set -// DESCRIPTION: The std lib has a tr1-conforming unordered set library. - -#include - -namespace boost_has_tr1_unordered_set{ - -using std::tr1::unordered_set; -using std::tr1::unordered_multiset; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_has_tr1_utility.ipp b/libs/config/test/boost_has_tr1_utility.ipp deleted file mode 100644 index bf97dece5..000000000 --- a/libs/config/test/boost_has_tr1_utility.ipp +++ /dev/null @@ -1,25 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_HAS_TR1_UTILITY -// TITLE: std::tr1::utility -// DESCRIPTION: The std lib has a tr1-conforming utility header. - -#include - -namespace boost_has_tr1_utility{ - -using std::tr1::get; -using std::tr1::tuple_size; -using std::tr1::tuple_element; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_has_unistd_h.ipp b/libs/config/test/boost_has_unistd_h.ipp deleted file mode 100644 index b082c4fee..000000000 --- a/libs/config/test/boost_has_unistd_h.ipp +++ /dev/null @@ -1,26 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_UNISTD_H -// TITLE: -// DESCRIPTION: The Platform provides . - -#include - -namespace boost_has_unistd_h{ - -int test() -{ - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_has_variadic_tmpl.ipp b/libs/config/test/boost_has_variadic_tmpl.ipp deleted file mode 100644 index 539c512a9..000000000 --- a/libs/config/test/boost_has_variadic_tmpl.ipp +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (C) 2007 Douglas Gregor -// 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/config for most recent version. - -// MACRO: BOOST_HAS_VARIADIC_TMPL -// TITLE: variadic templates -// DESCRIPTION: The compiler supports C++0x variadic templates - -namespace boost_has_variadic_tmpl { - -template struct tuple {}; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_has_vc6_mem_templ.ipp b/libs/config/test/boost_has_vc6_mem_templ.ipp deleted file mode 100644 index fbce17094..000000000 --- a/libs/config/test/boost_has_vc6_mem_templ.ipp +++ /dev/null @@ -1,58 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_MSVC6_MEMBER_TEMPLATES -// TITLE: microsoft member templates -// DESCRIPTION: Microsoft Visual C++ 6.0 has enough member -// template idiosyncrasies (being polite) that -// BOOST_NO_MEMBER_TEMPLATES is defined for this compiler. -// BOOST_MSVC6_MEMBER_TEMPLATES is defined to allow -// compiler specific workarounds. -#ifndef BOOST_NESTED_TEMPLATE -#define BOOST_NESTED_TEMPLATE template -#endif - -namespace boost_msvc6_member_templates{ - -template -struct foo -{ - template - struct nested - { - typedef foo other; - }; - template - void mfoo(const U&) - { - } -}; - -template -void vc6_mem_test(T i) -{ - foo f1; - typedef foo ifoo; - f1.mfoo(i); - typedef typename ifoo::BOOST_NESTED_TEMPLATE nested bound_t; - typedef typename bound_t::other other; - other o; - (void)o; -} - -int test() -{ - int i = 0; - vc6_mem_test(i); - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_has_vc_iterator.ipp b/libs/config/test/boost_has_vc_iterator.ipp deleted file mode 100644 index e2fd5a6b4..000000000 --- a/libs/config/test/boost_has_vc_iterator.ipp +++ /dev/null @@ -1,40 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_MSVC_STD_ITERATOR -// TITLE: microsoft's version of std::iterator -// DESCRIPTION: Microsoft's broken version of std::iterator -// is being used. - -#include - -namespace boost_msvc_std_iterator{ - -int test() -{ - typedef std::iterator< - std::random_access_iterator_tag, - int - > iterator_type_2; - typedef std::reverse_iterator r_it; - - iterator_type_2::value_type v2 = 0; - iterator_type_2::iterator_category cat2; - // - // suppress some warnings: - // - (void)v2; - (void)cat2; - - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_has_winthreads.ipp b/libs/config/test/boost_has_winthreads.ipp deleted file mode 100644 index 28ebff0c0..000000000 --- a/libs/config/test/boost_has_winthreads.ipp +++ /dev/null @@ -1,34 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_HAS_WINTHREADS -// TITLE: MS Windows threads -// DESCRIPTION: The platform supports MS Windows style threads. - -#include - - -namespace boost_has_winthreads{ - -int test() -{ - HANDLE h = CreateMutex(0, 0, 0); - if(h != NULL) - { - WaitForSingleObject(h, INFINITE); - ReleaseMutex(h); - CloseHandle(h); - } - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_no_adl_barrier.ipp b/libs/config/test/boost_no_adl_barrier.ipp deleted file mode 100644 index 4065df096..000000000 --- a/libs/config/test/boost_no_adl_barrier.ipp +++ /dev/null @@ -1,38 +0,0 @@ -// (C) Copyright John Maddock 2008. -// 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/config for most recent version. - -// MACRO: BOOST_NO_ADL_BARRIER -// TITLE: Working ADL barriers. -// DESCRIPTION: If the compiler correctly handles ADL. - -namespace boost_no_adl_barrier{ - -namespace xxx { - namespace nested { - struct aaa {}; - } - void begin(nested::aaa) {} -} - -namespace nnn { - void begin(xxx::nested::aaa) {} -} - -int test() -{ - using namespace nnn; - xxx::nested::aaa a; - begin(a); // ambiguous error in msvc-9.0 - - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_arg_dep_lookup.ipp b/libs/config/test/boost_no_arg_dep_lookup.ipp deleted file mode 100644 index d934d44aa..000000000 --- a/libs/config/test/boost_no_arg_dep_lookup.ipp +++ /dev/null @@ -1,37 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -// TITLE: Koenig lookup -// DESCRIPTION: Compiler does not implement -// argument-dependent lookup (also named Koenig lookup); -// see std::3.4.2 [basic.koenig.lookup] - - -namespace boost_no_argument_dependent_lookup{ - -namespace foobar{ - -struct test{}; - -void call_test(const test&) -{} - -} - -int test() -{ - foobar::test t; - call_test(t); - return 0; -} - - -} - - - diff --git a/libs/config/test/boost_no_array_type_spec.ipp b/libs/config/test/boost_no_array_type_spec.ipp deleted file mode 100644 index 3048669a5..000000000 --- a/libs/config/test/boost_no_array_type_spec.ipp +++ /dev/null @@ -1,30 +0,0 @@ -// (C) Copyright John Maddock 2001. -// (C) Copyright Aleksey Gurtovoy 2003. -// 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/config for most recent version. - -// MACRO: BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS -// TITLE: template specialisations of array types -// DESCRIPTION: If the compiler cannot handle template specialisations -// for array types - - -namespace boost_no_array_type_specializations{ - -template< typename T > struct is_array -{ -}; - -template< typename T, int N > struct is_array< T[N] > -{ -}; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_no_auto_declarations.ipp b/libs/config/test/boost_no_auto_declarations.ipp deleted file mode 100644 index 9201b1601..000000000 --- a/libs/config/test/boost_no_auto_declarations.ipp +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (C) 2009 Andrey Semashev -// 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/config for most recent version. - -// MACRO: BOOST_NO_CXX11_AUTO_DECLARATIONS -// TITLE: C++0x auto declarators unavailable -// DESCRIPTION: The compiler does not support C++0x declarations of variables with automatically deduced type - -namespace boost_no_cxx11_auto_declarations { - -void check_f(int&) -{ -} - -int test() -{ - auto x = 10; - check_f(x); - return 0; -} - -} diff --git a/libs/config/test/boost_no_auto_multidecl.ipp b/libs/config/test/boost_no_auto_multidecl.ipp deleted file mode 100644 index 8fb7d5e49..000000000 --- a/libs/config/test/boost_no_auto_multidecl.ipp +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (C) 2009 Andrey Semashev -// 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/config for most recent version. - -// MACRO: BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS -// TITLE: C++0x auto multideclarators unavailable -// DESCRIPTION: The compiler does not support C++0x declarations of series of variables with automatically deduced type - -namespace boost_no_cxx11_auto_multideclarations { - -void check_f(int&, int*&) -{ -} - -int test() -{ - auto x = 10, *y = &x; - check_f(x, y); - return 0; -} - -} diff --git a/libs/config/test/boost_no_auto_ptr.ipp b/libs/config/test/boost_no_auto_ptr.ipp deleted file mode 100644 index c86669cd6..000000000 --- a/libs/config/test/boost_no_auto_ptr.ipp +++ /dev/null @@ -1,53 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_AUTO_PTR -// TITLE: std::auto_ptr -// DESCRIPTION: If the compiler / library supplies non-standard or broken -// std::auto_ptr. - -#include - -namespace boost_no_auto_ptr{ - -template -class my_ptr -{ - T* p; -public: - my_ptr(std::auto_ptr& r) - { - p = r.release(); - } - my_ptr& operator=(std::auto_ptr& r) - { - delete p; - p = r.release(); - return *this; - } - ~my_ptr() - { - delete p; - } -}; - - -int test() -{ - std::auto_ptr ap1(new int); - my_ptr mp(ap1); - std::auto_ptr ap2(new int); - mp = ap2; - - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_bcb_partial_spec.ipp b/libs/config/test/boost_no_bcb_partial_spec.ipp deleted file mode 100644 index e78877c8e..000000000 --- a/libs/config/test/boost_no_bcb_partial_spec.ipp +++ /dev/null @@ -1,53 +0,0 @@ -// (C) Copyright Terje Slettebo 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) - - -// MACRO: BOOST_BCB_PARTIAL_SPECIALIZATION_BUG -// TITLE: Full partial specialization support. -// DESCRIPTION: Borland C++ Builder has some rather specific partial -// specialisation bugs which this code tests for. - - -#include - -namespace boost_bcb_partial_specialization_bug{ - - -template -class Test -{ -}; - -template -class Test,T2> -{ -}; - -template -class Test,T> -{ -}; - -template -struct is_const{}; -template -struct is_const{}; - -int test() -{ - Test,double> v; - is_const ci; - (void)v; // warning suppression - (void)ci; - return 0; -} - - -} - - - - - diff --git a/libs/config/test/boost_no_char16_t.ipp b/libs/config/test/boost_no_char16_t.ipp deleted file mode 100644 index 4efff95e6..000000000 --- a/libs/config/test/boost_no_char16_t.ipp +++ /dev/null @@ -1,32 +0,0 @@ - -// (C) Copyright Beman Dawes 2008 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_CHAR16_T -// TITLE: C++0x char16_t unavailable -// DESCRIPTION: The compiler does not support C++0x char16_t - -namespace boost_no_cxx11_char16_t { - -// Microsoft VC++ 2010, and possibly other compilers, provides -// a typedef for char16_t rather than a new type. We want that -// to be an error, so provide an overloaded function that will -// be ambiguous if char16_t is just a typedef. -void f(const char16_t*){} -void f(const unsigned short*){} -void f(const unsigned int*){} -void f(const unsigned long*){} - -int test() -{ - const char16_t p(0); - f(&p); - return 0; -} - -} diff --git a/libs/config/test/boost_no_char32_t.ipp b/libs/config/test/boost_no_char32_t.ipp deleted file mode 100644 index 9778bff03..000000000 --- a/libs/config/test/boost_no_char32_t.ipp +++ /dev/null @@ -1,31 +0,0 @@ -// (C) Copyright Beman Dawes 2008 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_CHAR32_T -// TITLE: C++0x char32_t unavailable -// DESCRIPTION: The compiler does not support C++0x char32_t - -namespace boost_no_cxx11_char32_t { - -// Microsoft VC++ 2010, and possibly other compilers, provides -// a typedef for char32_t rather than a new type. We want that -// to be an error, so provide an overloaded function that will -// be ambiguous if char16_t is just a typedef. -void f(const char32_t*){} -void f(const unsigned short*){} -void f(const unsigned int*){} -void f(const unsigned long*){} - -int test() -{ - const char32_t p(0); - f(&p); - return 0; -} - -} diff --git a/libs/config/test/boost_no_com_value_init.ipp b/libs/config/test/boost_no_com_value_init.ipp deleted file mode 100644 index 47e9ff52a..000000000 --- a/libs/config/test/boost_no_com_value_init.ipp +++ /dev/null @@ -1,1016 +0,0 @@ -// (C) Copyright Niels Dekker 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 http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_NO_COMPLETE_VALUE_INITIALIZATION -// TITLE: No complete value-initialization -// DESCRIPTION: The C++ compiler does not to have implemented value-initialization completely. -// See also boost/libs/utility/value_init.htm#compiler_issues - -#include - -// This test checks various forms of value-initialization: -// - doing subobject initialization inside a constructor -// - creating a temporary object by T() -// - creating a heap object by doing new T() -// It checks various DefaultConstructible types, including fundamental types, -// enum, union, pointer types, array types, POD and non-POD class types. For -// each type of object, a helper function is_value_initialized(const T&) tells -// whether the object is value-initialized. -// -// Note: It appeared insufficient to just check a single POD and a single -// non-POD class type, because some compilers correctly value-initialize some -// POD and some non-POD objects, while failing to value-initialize others. -// -// The test returns the number of encountered value-initialization failures. - -namespace boost_no_complete_value_initialization -{ - enum enum_type { negative_number = -1, magic_number = 42 }; - - class incomplete_class; - - typedef int (*function_ptr_type)(int); - typedef int (incomplete_class::*member_function_ptr_type)(int); - - // A POD struct. - struct pod_struct - { - enum_type e; - bool b; - char c; - unsigned char uc; - short s; - int i; - unsigned u; - long l; - float f; - double d; - long double ld; - void* p; - }; - - bool is_value_initialized(const pod_struct& arg) - { - return - arg.b == 0 && - arg.e == 0 && - arg.c == 0 && - arg.uc == 0 && - arg.s == 0 && - arg.i == 0 && - arg.u == 0 && - arg.l == 0 && - arg.f == 0 && - arg.d == 0 && - arg.p == 0; - } - - // A POD struct derived from another POD struct. - struct derived_pod_struct: pod_struct - { - int derived_data; - }; - - bool is_value_initialized(const derived_pod_struct& arg) - { - const pod_struct& base_subobject = arg; - return arg.derived_data == 0 && is_value_initialized(base_subobject); - } - - - struct empty_struct - { - }; - - - // A POD aggregate struct derived from an empty struct. - // Similar to struct Foo1 from Microsoft Visual C++ bug report 484295, - // "VC++ does not value-initialize members of derived classes without - // user-declared constructor", reported in 2009 by Sylvester Hesp: - // https://connect.microsoft.com/VisualStudio/feedback/details/484295 - struct derived_struct: empty_struct - { - int data; - }; - - bool is_value_initialized(const derived_struct& arg) - { - return arg.data == 0; - } - - - // A struct, having a bit-field. - struct bit_field_struct - { - bool b : 1; - char c : 7; - unsigned u: 8 * sizeof(unsigned) - 1; - }; - - bool is_value_initialized(const bit_field_struct& arg) - { - return arg.b == false && arg.c == '\0'&& arg.u == 0U; - } - - // A struct, having a function pointer. - struct function_ptr_struct - { - function_ptr_type data; - }; - - bool is_value_initialized(const function_ptr_struct& arg) - { - return arg.data == 0; - } - - // A struct, having a member function pointer. - struct member_function_ptr_struct - { - member_function_ptr_type data; - }; - - bool is_value_initialized(const member_function_ptr_struct& arg) - { - return arg.data == 0; - } - - struct int_pair_struct - { - int first; - int second; - }; - - typedef int int_pair_struct::*ptr_to_member_type; - - struct ptr_to_member_struct - { - ptr_to_member_type data; - }; - - bool is_value_initialized(const ptr_to_member_struct& arg) - { - return arg.data == 0; - } - - // A struct, having an int. Equivalent to the struct TData, from CodeGear bug - // report 51854, "Value-initialization: POD struct should be zero-initialized", - // reported by me (Niels Dekker, LKEB) in 2007: - // http://qc.embarcadero.com/wc/qcmain.aspx?d=51854 - struct int_struct - { - int data; - }; - - bool is_value_initialized(const int_struct& arg) - { - return arg.data == 0; - } - - - // A struct, having an int_struct. - struct int_struct_holder - { - int_struct data; - }; - - bool is_value_initialized(const int_struct_holder& arg) - { - return is_value_initialized(arg.data); - } - - - // A struct derived from int_struct. - struct derived_int_struct: int_struct - { - }; - - bool is_value_initialized(const derived_int_struct& arg) - { - return arg.data == 0; - } - - - struct char_array_struct - { - char data[42]; - }; - - bool is_value_initialized(const char_array_struct& arg) - { - for ( unsigned i = 0; i < sizeof(arg.data); ++i) - { - if ( arg.data[i] != 0 ) - { - return false; - } - } - return true; - } - - - class private_int_holder - { - private: - int m_data; - - friend bool is_value_initialized(const private_int_holder& arg) - { - return arg.m_data == 0; - } - }; - - - // Equivalent to the Stats class from GCC Bug 33916, - // "Default constructor fails to initialize array members", reported in 2007 by - // Michael Elizabeth Chastain: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33916 - class private_int_array_pair - { - friend bool is_value_initialized(const private_int_array_pair& arg); - private: - int first[12]; - int second[12]; - }; - - bool is_value_initialized(const private_int_array_pair& arg) - { - for ( unsigned i = 0; i < 12; ++i) - { - if ( (arg.first[i] != 0) || (arg.second[i] != 0) ) - { - return false; - } - } - return true; - } - - - union pod_struct_and_int_union - { - pod_struct first; - int second; - }; - - bool is_value_initialized(const pod_struct_and_int_union& arg) - { - // When a union is zero-initialized, its first non-static - // named data member is zero-initialized ([dcl.init]). - return is_value_initialized(arg.first); - } - - - union int_and_pod_struct_union - { - int first; - pod_struct second; - }; - - bool is_value_initialized(const int_and_pod_struct_union& arg) - { - return arg.first == 0; - } - - - // A class that holds a "magic" enum value. - // Note: This is not a POD class, because it has a user-defined - // default constructor. - class enum_holder - { - enum_type m_enum; - public: - - enum_holder() - : - m_enum(magic_number) - { - } - - bool is_value_initialized() const - { - return m_enum == magic_number; - } - }; - - bool is_value_initialized(const enum_holder& arg) - { - return arg.is_value_initialized(); - } - - - // An aggregate struct of a non-POD class and an int. - // Similar to struct A from Microsoft Visual C++ bug report 100744, - // "Value-initialization in new-expression", reported in 2005 by - // Pavel Kuznetsov (MetaCommunications Engineering): - // https://connect.microsoft.com/VisualStudio/feedback/details/100744 - struct enum_holder_and_int - { - enum_holder e; - int i; - }; - - bool is_value_initialized(const enum_holder_and_int& arg) - { - return arg.e.is_value_initialized() && arg.i == 0; - } - - class user_defined_copy_constructor_holder - { - public: - int data; - - user_defined_copy_constructor_holder() - : - data(0) - { - } - - user_defined_copy_constructor_holder(const user_defined_copy_constructor_holder& arg) - : - data(arg.data) - { - } - }; - - // An aggregate struct that has a data member which has a user-defined - // copy constructor and a data member of a scalar type. - // Similar to struct B from Microsoft Visual C++ bug report 499606, - // "Presence of copy constructor breaks member class initialization", - // reported in 2009 by Alex Vakulenko: - // https://connect.microsoft.com/VisualStudio/feedback/details/499606 - struct user_defined_copy_constructor_holder_and_int - { - user_defined_copy_constructor_holder first; - int second; - }; - - bool is_value_initialized(const user_defined_copy_constructor_holder_and_int& arg) - { - return arg.first.data == 0 && arg.second == 0; - } - - - // An class that has a private and a protected int data member. - class private_and_protected_int - { - private: - int private_int; - protected: - int protected_int; - public: - friend bool is_value_initialized(const private_and_protected_int& arg) - { - return arg.private_int == 0 && arg.protected_int == 0; - } - }; - - - class user_defined_destructor_holder - { - public: - int i; - ~user_defined_destructor_holder() - { - } - }; - - bool is_value_initialized(const user_defined_destructor_holder& arg) - { - return arg.i == 0; - } - - - class virtual_destructor_holder - { - public: - int i; - virtual ~virtual_destructor_holder() - { - } - }; - - bool is_value_initialized(const virtual_destructor_holder& arg) - { - return arg.i == 0; - } - - - // A class that is not a POD type. - class non_pod_class - { - private: - enum_holder m_enum_holder; - - public: - int i; - - virtual bool is_value_initialized() const - { - return m_enum_holder.is_value_initialized() && i == 0; - } - - virtual ~non_pod_class() {} - }; - - bool is_value_initialized(const non_pod_class& arg) - { - return arg.is_value_initialized(); - } - - - typedef char _2d_char_array_type[3][4]; - - bool is_value_initialized(const _2d_char_array_type& arg) - { - for(unsigned i = 0; i < sizeof(_2d_char_array_type); ++i) - { - if ((*arg)[i] != 0) - { - return false; - } - } - return true; - } - - typedef char _3d_char_array_type[5][6][7]; - - bool is_value_initialized(const _3d_char_array_type& arg) - { - for(unsigned i = 0; i < sizeof(_3d_char_array_type); ++i) - { - if ((**arg)[i] != 0) - { - return false; - } - } - return true; - } - - - - // Tells whether an object of a scalar type T is value-initialized. - template - bool is_value_initialized(const T& arg) - { - return arg == 0; - } - - - // Wraps a heap object that it has allocated by doing new T(). - template - class heap_object_wrapper - { - private: - T* const m_ptr; - - // The following function is intentionally left unimplemented - // (as if deleted, "= delete", in C++0x): - void operator=(heap_object_wrapper); - - public: - heap_object_wrapper() - : - m_ptr(new T()) - { - } - - ~heap_object_wrapper() - { - delete m_ptr; - } - - // The copy-constructor is intentionally left unimplemented. - heap_object_wrapper(const heap_object_wrapper&); - - bool is_wrapped_object_value_initialized() const - { - return (m_ptr != 0) && is_value_initialized(*m_ptr); - } - }; - - template - bool is_value_initialized(const heap_object_wrapper& arg) - { - return arg.is_wrapped_object_value_initialized(); - } - - - // Returns zero when the specified object is value-initializated, and one otherwise. - // Prints a message to standard output if the value-initialization has failed. - template - unsigned failed_to_value_initialized(const T& object, const char *const object_name) - { - if ( is_value_initialized(object) ) - { - return 0u; - } - else - { - std::cout << "Note: Failed to value-initialize " << object_name << '.' << std::endl; - return 1u; - } - } - -// A macro that passed both the name and the value of the specified object to -// the function above here. -#define FAILED_TO_VALUE_INITIALIZE(value) failed_to_value_initialized(value, #value) - - - // value_initializer initializes each of its data members by means - // of an empty set of parentheses, and allows checking whether - // each of them is indeed value-initialized, as specified by - // the C++ Standard ([dcl.init]). - // - // Note: its base class, int_struct, is there to try to reproduce GCC Bug 30111, - // "Value-initialization of POD base class doesn't initialize members", reported - // by Jonathan Wakely in 2006: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30111 - class value_initializer: private int_struct - { - private: - enum_holder m_enum_holder; - enum_holder m_enum_holder_array[2]; - enum_type m_enum; - enum_type m_enum_array[2]; - bool m_bool; - bool m_bool_array[2]; - char m_char; - char m_char_array[2]; - _2d_char_array_type m_2d_char_array; - _3d_char_array_type m_3d_char_array; - unsigned char m_unsigned_char; - unsigned char m_unsigned_char_array[2]; - short m_short; - short m_short_array[2]; - int m_int; - int m_int_array[2]; - unsigned m_unsigned; - unsigned m_unsigned_array[2]; - long m_long; - long m_long_array[2]; - float m_float; - float m_float_array[2]; - double m_double; - double m_double_array[2]; - long double m_long_double; - long double m_long_double_array[2]; - void* m_void_ptr; - void* m_void_ptr_array[2]; - function_ptr_type m_function_ptr; - function_ptr_type m_function_ptr_array[2]; - function_ptr_struct m_function_ptr_struct; - function_ptr_struct m_function_ptr_struct_array[2]; - member_function_ptr_type m_member_function_ptr; - member_function_ptr_type m_member_function_ptr_array[2]; - member_function_ptr_struct m_member_function_ptr_struct; - member_function_ptr_struct m_member_function_ptr_struct_array[2]; - ptr_to_member_type m_ptr_to_member; - ptr_to_member_type m_ptr_to_member_array[2]; - ptr_to_member_struct m_ptr_to_member_struct; - ptr_to_member_struct m_ptr_to_member_struct_array[2]; - bit_field_struct m_bit_field_struct; - bit_field_struct m_bit_field_struct_array[2]; - int_struct m_int_struct; - int_struct m_int_struct_array[2]; - int_struct m_int_struct_holder; - int_struct m_int_struct_holder_array[2]; - pod_struct m_pod_struct; - pod_struct m_pod_struct_array[2]; - derived_pod_struct m_derived_pod_struct; - derived_pod_struct m_derived_pod_struct_array[2]; - derived_struct m_derived_struct; - derived_struct m_derived_struct_array[2]; - derived_int_struct m_derived_int_struct; - derived_int_struct m_derived_int_struct_array[2]; - private_int_holder m_private_int_holder; - private_int_holder m_private_int_holder_array[2]; - char_array_struct m_char_array_struct; - char_array_struct m_char_array_struct_array[2]; - private_int_array_pair m_private_int_array_pair; - private_int_array_pair m_private_int_array_pair_array[2]; - enum_holder_and_int m_enum_holder_and_int; - enum_holder_and_int m_enum_holder_and_int_array[2]; - private_and_protected_int m_private_and_protected_int; - private_and_protected_int m_private_and_protected_int_array[2]; - user_defined_copy_constructor_holder_and_int m_user_defined_copy_constructor_holder_and_int; - user_defined_copy_constructor_holder_and_int m_user_defined_copy_constructor_holder_and_int_array[2]; - user_defined_destructor_holder m_user_defined_destructor_holder; - user_defined_destructor_holder m_user_defined_destructor_holder_array[2]; - virtual_destructor_holder m_virtual_destructor_holder; - virtual_destructor_holder m_virtual_destructor_holder_array[2]; - non_pod_class m_non_pod; - non_pod_class m_non_pod_array[2]; - pod_struct_and_int_union m_pod_struct_and_int_union; - pod_struct_and_int_union m_pod_struct_and_int_union_array[2]; - int_and_pod_struct_union m_int_and_pod_struct_union; - int_and_pod_struct_union m_int_and_pod_struct_union_array[2]; - - public: - // Default constructor. Tries to value-initialize its base subobject and all - // of its data.members. - value_initializer() - : - // Note: CodeGear/Borland may produce a warning, W8039, for each data member - // whose type is an array type, saying "Constructor initializer list ignored". - // If it does, it probably won't value-initialize those arrays, as reported - // by me (Niels Dekker, LKEB) in 2010, report 83751, "Value-initialization: - // arrays should have each element value-initialized", - // http://qc.embarcadero.com/wc/qcmain.aspx?d=83751 - // On the other hand, Microsoft Visual C++ may produce warnings of type C4351, - // saying "new behavior: elements of array '...' will be default initialized", - // which is actually the right behavior! - int_struct(), - m_enum_holder(), - m_enum_holder_array(), - m_enum(), - m_enum_array(), - m_bool(), - m_bool_array(), - m_char(), - m_char_array(), - m_2d_char_array(), - m_3d_char_array(), - m_unsigned_char(), - m_unsigned_char_array(), - m_short(), - m_short_array(), - m_int(), - m_int_array(), - m_unsigned(), - m_unsigned_array(), - m_long(), - m_long_array(), - m_float(), - m_float_array(), - m_double(), - m_double_array(), - m_long_double(), - m_long_double_array(), - m_void_ptr(), - m_void_ptr_array(), - m_function_ptr(), - m_function_ptr_array(), - m_function_ptr_struct(), - m_function_ptr_struct_array(), - m_member_function_ptr(), - m_member_function_ptr_array(), - m_member_function_ptr_struct(), - m_member_function_ptr_struct_array(), - m_ptr_to_member(), - m_ptr_to_member_array(), - m_ptr_to_member_struct(), - m_ptr_to_member_struct_array(), - m_bit_field_struct(), - m_bit_field_struct_array(), - m_int_struct(), - m_int_struct_array(), - m_int_struct_holder(), - m_int_struct_holder_array(), - m_pod_struct(), - m_pod_struct_array(), - m_derived_pod_struct(), - m_derived_pod_struct_array(), - m_derived_struct(), - m_derived_struct_array(), - m_derived_int_struct(), - m_derived_int_struct_array(), - m_private_int_holder(), - m_private_int_holder_array(), - m_char_array_struct(), - m_char_array_struct_array(), - m_private_int_array_pair(), - m_private_int_array_pair_array(), - m_enum_holder_and_int(), - m_enum_holder_and_int_array(), - m_private_and_protected_int(), - m_private_and_protected_int_array(), - m_user_defined_copy_constructor_holder_and_int(), - m_user_defined_copy_constructor_holder_and_int_array(), - m_user_defined_destructor_holder(), - m_user_defined_destructor_holder_array(), - m_virtual_destructor_holder(), - m_virtual_destructor_holder_array(), - m_non_pod(), - m_non_pod_array(), - m_pod_struct_and_int_union(), - m_pod_struct_and_int_union_array(), - m_int_and_pod_struct_union(), - m_int_and_pod_struct_union_array() - { - } - - // Returns the number of failures. - unsigned check_value_initialization_of_subobjects() const - { - const unsigned num_failures = - FAILED_TO_VALUE_INITIALIZE(int_struct::data) + - FAILED_TO_VALUE_INITIALIZE(m_enum_holder) + - FAILED_TO_VALUE_INITIALIZE(m_enum_holder_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_enum_holder_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_enum) + - FAILED_TO_VALUE_INITIALIZE(m_enum_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_enum_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_bool) + - FAILED_TO_VALUE_INITIALIZE(m_bool_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_bool_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_char) + - FAILED_TO_VALUE_INITIALIZE(m_char_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_char_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_2d_char_array) + - FAILED_TO_VALUE_INITIALIZE(m_3d_char_array) + - FAILED_TO_VALUE_INITIALIZE(m_unsigned_char) + - FAILED_TO_VALUE_INITIALIZE(m_unsigned_char_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_unsigned_char_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_short) + - FAILED_TO_VALUE_INITIALIZE(m_short_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_short_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_int) + - FAILED_TO_VALUE_INITIALIZE(m_int_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_int_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_unsigned) + - FAILED_TO_VALUE_INITIALIZE(m_unsigned_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_unsigned_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_long) + - FAILED_TO_VALUE_INITIALIZE(m_long_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_long_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_float) + - FAILED_TO_VALUE_INITIALIZE(m_float_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_float_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_double) + - FAILED_TO_VALUE_INITIALIZE(m_double_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_double_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_long_double) + - FAILED_TO_VALUE_INITIALIZE(m_long_double_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_long_double_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_void_ptr) + - FAILED_TO_VALUE_INITIALIZE(m_void_ptr_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_void_ptr_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_function_ptr) + - FAILED_TO_VALUE_INITIALIZE(m_function_ptr_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_function_ptr_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_function_ptr_struct) + - FAILED_TO_VALUE_INITIALIZE(m_function_ptr_struct_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_function_ptr_struct_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_member_function_ptr) + - FAILED_TO_VALUE_INITIALIZE(m_member_function_ptr_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_member_function_ptr_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_member_function_ptr_struct) + - FAILED_TO_VALUE_INITIALIZE(m_member_function_ptr_struct_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_member_function_ptr_struct_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_ptr_to_member) + - FAILED_TO_VALUE_INITIALIZE(m_ptr_to_member_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_ptr_to_member_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_ptr_to_member_struct) + - FAILED_TO_VALUE_INITIALIZE(m_ptr_to_member_struct_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_ptr_to_member_struct_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_bit_field_struct) + - FAILED_TO_VALUE_INITIALIZE(m_bit_field_struct_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_bit_field_struct_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_int_struct) + - FAILED_TO_VALUE_INITIALIZE(m_int_struct_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_int_struct_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_int_struct_holder) + - FAILED_TO_VALUE_INITIALIZE(m_int_struct_holder_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_int_struct_holder_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_pod_struct) + - FAILED_TO_VALUE_INITIALIZE(m_pod_struct_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_pod_struct_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_derived_pod_struct) + - FAILED_TO_VALUE_INITIALIZE(m_derived_pod_struct_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_derived_pod_struct_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_derived_struct) + - FAILED_TO_VALUE_INITIALIZE(m_derived_struct_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_derived_struct_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_derived_int_struct) + - FAILED_TO_VALUE_INITIALIZE(m_derived_int_struct_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_derived_int_struct_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_private_int_holder) + - FAILED_TO_VALUE_INITIALIZE(m_private_int_holder_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_private_int_holder_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_char_array_struct) + - FAILED_TO_VALUE_INITIALIZE(m_char_array_struct_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_char_array_struct_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_private_int_array_pair) + - FAILED_TO_VALUE_INITIALIZE(m_private_int_array_pair_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_private_int_array_pair_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_enum_holder_and_int) + - FAILED_TO_VALUE_INITIALIZE(m_enum_holder_and_int_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_enum_holder_and_int_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_private_and_protected_int) + - FAILED_TO_VALUE_INITIALIZE(m_private_and_protected_int_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_private_and_protected_int_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_user_defined_copy_constructor_holder_and_int) + - FAILED_TO_VALUE_INITIALIZE(m_user_defined_copy_constructor_holder_and_int_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_user_defined_copy_constructor_holder_and_int_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_user_defined_destructor_holder) + - FAILED_TO_VALUE_INITIALIZE(m_user_defined_destructor_holder_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_user_defined_destructor_holder_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_virtual_destructor_holder) + - FAILED_TO_VALUE_INITIALIZE(m_virtual_destructor_holder_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_virtual_destructor_holder_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_non_pod) + - FAILED_TO_VALUE_INITIALIZE(m_non_pod_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_non_pod_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_pod_struct_and_int_union) + - FAILED_TO_VALUE_INITIALIZE(m_pod_struct_and_int_union_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_pod_struct_and_int_union_array[1]) + - FAILED_TO_VALUE_INITIALIZE(m_int_and_pod_struct_union) + - FAILED_TO_VALUE_INITIALIZE(m_int_and_pod_struct_union_array[0]) + - FAILED_TO_VALUE_INITIALIZE(m_int_and_pod_struct_union_array[1]); - return num_failures; - } - }; - - // Checks value-initialization of a number of small temporary objects. - // Returns the number of failures. - unsigned check_value_initialization_of_temporaries() - { - typedef long double long_double_type; - typedef unsigned char unsigned_char_type; - typedef void* void_ptr_type; - - const unsigned num_failures = - FAILED_TO_VALUE_INITIALIZE(enum_holder()) + - FAILED_TO_VALUE_INITIALIZE(enum_type()) + - FAILED_TO_VALUE_INITIALIZE(bool()) + - FAILED_TO_VALUE_INITIALIZE(char()) + - FAILED_TO_VALUE_INITIALIZE(unsigned_char_type()) + - FAILED_TO_VALUE_INITIALIZE(short()) + - FAILED_TO_VALUE_INITIALIZE(int()) + - FAILED_TO_VALUE_INITIALIZE(unsigned()) + - FAILED_TO_VALUE_INITIALIZE(long()) + - FAILED_TO_VALUE_INITIALIZE(float()) + - FAILED_TO_VALUE_INITIALIZE(double()) + - FAILED_TO_VALUE_INITIALIZE(long_double_type()) + - FAILED_TO_VALUE_INITIALIZE(void_ptr_type()) + - FAILED_TO_VALUE_INITIALIZE(bit_field_struct()) + - FAILED_TO_VALUE_INITIALIZE(function_ptr_type()) + - FAILED_TO_VALUE_INITIALIZE(function_ptr_struct()) + - FAILED_TO_VALUE_INITIALIZE(member_function_ptr_type()) + - FAILED_TO_VALUE_INITIALIZE(member_function_ptr_struct()) + - FAILED_TO_VALUE_INITIALIZE(ptr_to_member_type()) + - FAILED_TO_VALUE_INITIALIZE(ptr_to_member_struct()) + - FAILED_TO_VALUE_INITIALIZE(int_struct()) + - FAILED_TO_VALUE_INITIALIZE(int_struct_holder()) + - FAILED_TO_VALUE_INITIALIZE(pod_struct()) + - FAILED_TO_VALUE_INITIALIZE(derived_pod_struct()) + - FAILED_TO_VALUE_INITIALIZE(derived_struct()) + - FAILED_TO_VALUE_INITIALIZE(derived_int_struct()) + - FAILED_TO_VALUE_INITIALIZE(private_int_holder()) + - FAILED_TO_VALUE_INITIALIZE(char_array_struct()) + - FAILED_TO_VALUE_INITIALIZE(private_int_array_pair()) + - // IBM's XL V10.1.0.0 may fail to value-initialize a temporary of a non-POD - // type like enum_holder_and_int, virtual_destructor_holder, or non_pod_class, - // as appeared at the Boost Config/trunk regression page in April 2010. - // Michael Wong (IBM Canada Ltd) confirmed the issue to me (Niels Dekker, LKEB), - // and gave it high priority. - FAILED_TO_VALUE_INITIALIZE(enum_holder_and_int()) + - FAILED_TO_VALUE_INITIALIZE(private_and_protected_int()) + - FAILED_TO_VALUE_INITIALIZE(user_defined_copy_constructor_holder_and_int()) + - // The following line, doing user_defined_destructor_holder(), causes - // a compilation error on Embarcadero 2010 (Borland/CodeGear 6.21), - // as reported by me (Niels Dekker, LKEB) in 2010, bug report 83851, - // "Value-initialized temporary triggers internal backend error C1798", - // http://qc.embarcadero.com/wc/qcmain.aspx?d=83851 - FAILED_TO_VALUE_INITIALIZE(user_defined_destructor_holder()) + - FAILED_TO_VALUE_INITIALIZE(virtual_destructor_holder()) + - FAILED_TO_VALUE_INITIALIZE(non_pod_class()) + - FAILED_TO_VALUE_INITIALIZE(pod_struct_and_int_union()) + - FAILED_TO_VALUE_INITIALIZE(int_and_pod_struct_union()); - return num_failures; - } - - // Checks value-initialization of small heap objects. - // Returns the number of failures. - unsigned check_value_initialization_of_heap_objects() - { - const unsigned num_failures = - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ) + - FAILED_TO_VALUE_INITIALIZE( heap_object_wrapper() ); - return num_failures; - } - - // Equivalent to the dirty_stack() function from GCC Bug 33916, - // "Default constructor fails to initialize array members", reported in 2007 by - // Michael Elizabeth Chastain: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33916 - void dirty_stack() - { - unsigned char array_on_stack[sizeof(value_initializer) + 256]; - for (unsigned i = 0; i < sizeof(array_on_stack); ++i) - { - array_on_stack[i] = 0x11; - } - } - - - // Checks value-initialization of the subobjects of a temporary object, - // an object on the stack, an object on the heap; furthermore it checks - // value-initialization of a number of smaller temporary objects and - // heap objects. - int test() - { - unsigned total_num_failures = 0; - - dirty_stack(); - const unsigned num_failures_of_subobjects_of_a_temporary = - value_initializer().check_value_initialization_of_subobjects(); - - total_num_failures += num_failures_of_subobjects_of_a_temporary; - if ( total_num_failures > 0 ) - { - std::cout << "- Number of subobject initialization failures of a temporary: " - << num_failures_of_subobjects_of_a_temporary << std::endl; - } - dirty_stack(); - value_initializer object_on_stack; - const unsigned num_failures_of_subobjects_on_stack = - object_on_stack.check_value_initialization_of_subobjects(); - - total_num_failures += num_failures_of_subobjects_on_stack; - if ( total_num_failures > 0 ) - { - std::cout << "- Number of subobject initialization failures on the stack: " - << num_failures_of_subobjects_on_stack << std::endl; - } - const value_initializer* const ptr = new value_initializer(); - const unsigned num_failures_of_subobjects_on_heap = ptr->check_value_initialization_of_subobjects(); - delete ptr; - - total_num_failures += num_failures_of_subobjects_on_heap; - if ( total_num_failures > 0 ) - { - std::cout << "- Number of subobject initialization failures on the heap: " - << num_failures_of_subobjects_on_heap << std::endl; - } - - dirty_stack(); - const unsigned num_failures_of_temporaries = check_value_initialization_of_temporaries(); - - total_num_failures += num_failures_of_temporaries; - if ( total_num_failures > 0 ) - { - std::cout << "- Number of initialization failures of temporary objects: " - << num_failures_of_temporaries << std::endl; - } - - const unsigned num_failures_of_heap_objects = check_value_initialization_of_heap_objects(); - - total_num_failures += num_failures_of_heap_objects; - if ( total_num_failures > 0 ) - { - std::cout << "- Number of failures of heap objects: " - << num_failures_of_heap_objects << std::endl; - } - - if ( total_num_failures > 0 ) - { - std::cout << "-- Total number of initialization failures (" - << num_failures_of_subobjects_of_a_temporary << '+' - << num_failures_of_subobjects_on_stack << '+' - << num_failures_of_subobjects_on_heap << '+' - << num_failures_of_temporaries << '+' - << num_failures_of_heap_objects << "): " - << total_num_failures - << "\nDetected by boost_no_complete_value_initialization::test() revision 32." - << std::endl; - } - return static_cast(total_num_failures); - } - -} // End of namespace. diff --git a/libs/config/test/boost_no_constexpr.ipp b/libs/config/test/boost_no_constexpr.ipp deleted file mode 100644 index 35ac48916..000000000 --- a/libs/config/test/boost_no_constexpr.ipp +++ /dev/null @@ -1,85 +0,0 @@ -// (C) Copyright Beman Dawes 2008 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_CONSTEXPR -// TITLE: C++0x constexpr unavailable -// DESCRIPTION: The compiler does not support C++0x constexpr - -namespace boost_no_cxx11_constexpr { - -void quiet_warning(int){} - -constexpr int square(int x) { return x * x; } // from N2235 - -// from 5.19: -constexpr const int* addr(const int& ir) { return &ir; } -static const int x = 5; -constexpr const int* xp = addr(x); - -struct A -{ - constexpr A(int i) : val(i) { } - constexpr operator int()const { return val; } - constexpr operator long()const { return 43; } -private: - int val; -}; - -template struct X { }; - - -#if __cplusplus < 201400L -// Some C++14 compilers reject this (clang), some C++11 compilers reject "constexpr const" (GCC-4.6) -constexpr A a = 42; -#else -constexpr const A a = 42; -#endif - -X xx; // OK: unique conversion to int - -// virtual function -struct B -{ - virtual void vf() {} -}; -struct C : B -{ - constexpr C() {} -}; - -// aggregate initialization -struct D -{ - int val[2]; - constexpr D() : val() {} -}; - -// virtual base -struct E -{ -}; -struct F : virtual E -{ -}; -constexpr F& f(F& out) { return out; } - -int test() -{ - int i = square(5); - quiet_warning(i); - - switch (i) - { - case a: - break; - } - - return 0; -} - -} diff --git a/libs/config/test/boost_no_ctype_functions.ipp b/libs/config/test/boost_no_ctype_functions.ipp deleted file mode 100644 index ec23d594a..000000000 --- a/libs/config/test/boost_no_ctype_functions.ipp +++ /dev/null @@ -1,44 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_CTYPE_FUNCTIONS -// TITLE: functions in -// DESCRIPTION: The Platform does not provide functions for the character- -// classifying operations in . Some platforms provide -// macros and don't provide functions. Under C++ it's an error -// to provide the macros at all, but that's a separate issue. - -#include - -namespace boost_no_ctype_functions { - -extern "C" { - typedef int (* character_classify_function)(int); -} - -void pass_function(character_classify_function) -{ -} - -int test() -{ - pass_function(isalpha); - pass_function(isalnum); - pass_function(iscntrl); - pass_function(isdigit); - pass_function(isgraph); - pass_function(islower); - pass_function(isprint); - pass_function(ispunct); - pass_function(isspace); - pass_function(isupper); - pass_function(isxdigit); - return 0; -} - -} - diff --git a/libs/config/test/boost_no_cv_spec.ipp b/libs/config/test/boost_no_cv_spec.ipp deleted file mode 100644 index d2fc6311b..000000000 --- a/libs/config/test/boost_no_cv_spec.ipp +++ /dev/null @@ -1,47 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_CV_SPECIALIZATIONS -// TITLE: template specialisations of cv-qualified types -// DESCRIPTION: If template specialisations for cv-qualified types -// conflict with a specialisation for a cv-unqualififed type. - - -namespace boost_no_cv_specializations{ - -template -struct is_int -{ -}; - -template <> -struct is_int -{}; - -template <> -struct is_int -{}; - -template <> -struct is_int -{}; - -template <> -struct is_int -{}; - -int test() -{ - return 0; -} - - -} - - - - diff --git a/libs/config/test/boost_no_cv_void_spec.ipp b/libs/config/test/boost_no_cv_void_spec.ipp deleted file mode 100644 index c3bc25481..000000000 --- a/libs/config/test/boost_no_cv_void_spec.ipp +++ /dev/null @@ -1,45 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_CV_VOID_SPECIALIZATIONS -// TITLE: template specialisations of cv-qualified void -// DESCRIPTION: If template specialisations for cv-void types -// conflict with a specialisation for void. - - -namespace boost_no_cv_void_specializations{ - -template -struct is_void -{ -}; - -template <> -struct is_void -{}; - -template <> -struct is_void -{}; - -template <> -struct is_void -{}; - -template <> -struct is_void -{}; - -int test() -{ - return 0; -} - -} - - - diff --git a/libs/config/test/boost_no_cwchar.ipp b/libs/config/test/boost_no_cwchar.ipp deleted file mode 100644 index d1117018d..000000000 --- a/libs/config/test/boost_no_cwchar.ipp +++ /dev/null @@ -1,33 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_CWCHAR -// TITLE: and -// DESCRIPTION: The Platform does not provide and . - -#include -#include - -namespace boost_no_cwchar{ - -int test() -{ - wchar_t c1[2] = { 0 }; - wchar_t c2[2] = { 0 }; - if(wcscmp(c1,c2) || wcslen(c1)) return -1; - wcscpy(c1,c2); - wcsxfrm(c1,c2,0); - return 0; -} - -} - - - - - - diff --git a/libs/config/test/boost_no_cwctype.ipp b/libs/config/test/boost_no_cwctype.ipp deleted file mode 100644 index d6a7355a2..000000000 --- a/libs/config/test/boost_no_cwctype.ipp +++ /dev/null @@ -1,47 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_CWCTYPE -// TITLE: and -// DESCRIPTION: The Platform does not provide and . - -// -// Note that some platforms put these prototypes in the wrong headers, -// we have to include pretty well all the string headers on the chance that -// one of them will contain what we want! -// -#include -#include -#include -#include -#include -#include - -namespace boost_no_cwctype{ - -int test() -{ - if(!(iswalpha(L'a') && - iswcntrl(L'\r') && - iswdigit(L'2') && - iswlower(L'a') && - iswpunct(L',') && - iswspace(L' ') && - iswupper(L'A') && - iswxdigit(L'A') - )) return -1; - if(L'a' != towlower(L'A')) return -1; - return 0; -} - -} - - - - - - diff --git a/libs/config/test/boost_no_cxx11_addressof.ipp b/libs/config/test/boost_no_cxx11_addressof.ipp deleted file mode 100644 index 4f0a5e3cd..000000000 --- a/libs/config/test/boost_no_cxx11_addressof.ipp +++ /dev/null @@ -1,28 +0,0 @@ -// (C) Copyright John Maddock 2012 -// (C) Copyright Peter Dimov 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/config for more information. - -// MACRO: BOOST_NO_CXX11_ADDRESSOF -// TITLE: C++11 doesn't have a working std::addressof -// DESCRIPTION: The compiler does not support the function std::addressof added to - -#include - -namespace boost_no_cxx11_addressof { - -void x3() -{ -} - -int test() -{ - int x1, x2[3]; - return std::addressof(x1) != &x1 || std::addressof(x2) != &x2 || std::addressof(x3) != &x3; -} - -} diff --git a/libs/config/test/boost_no_cxx11_alignas.ipp b/libs/config/test/boost_no_cxx11_alignas.ipp deleted file mode 100644 index afd428f63..000000000 --- a/libs/config/test/boost_no_cxx11_alignas.ipp +++ /dev/null @@ -1,36 +0,0 @@ -// (C) Copyright Andrey Semashev 2013 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_ALIGNAS -// TITLE: C++11 alignas keyword. -// DESCRIPTION: The compiler does not support the C++11 alignment specification with alignas keyword. - -namespace boost_no_cxx11_alignas { - -struct alignas(16) my_data1 -{ - char data[10]; -}; - -struct alignas(double) my_data2 -{ - char data[16]; -}; - -my_data1 dummy1[2]; -my_data2 dummy2; -alignas(16) char dummy3[10]; -alignas(double) char dummy4[32]; - -int test() -{ - // TODO: Test that the data is actually aligned on platforms with uintptr_t - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_allocator.ipp b/libs/config/test/boost_no_cxx11_allocator.ipp deleted file mode 100644 index 84ec78eec..000000000 --- a/libs/config/test/boost_no_cxx11_allocator.ipp +++ /dev/null @@ -1,44 +0,0 @@ -// (C) Copyright John Maddock 2012 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_ALLOCATOR -// TITLE: C++11 doesn't have C++0x allocator support -// DESCRIPTION: The compiler does not support the C++11 allocator features added to - -#include - -namespace boost_no_cxx11_allocator { - -int test() -{ - std::pointer_traits* p = 0; - (void) p; - //std::pointer_safety s = std::relaxed; - - //char* (*l_undeclare_reachable)(char *p) = std::undeclare_reachable; - //void (*l_declare_no_pointers)(char *p, size_t n) = std::declare_no_pointers; - //void (*l_undeclare_no_pointers)(char *p, size_t n) = std::undeclare_no_pointers; - //std::pointer_safety (*l_get_pointer_safety)() = std::get_pointer_safety; - //void* (*l_align)(std::size_t alignment, std::size_t size, void *&ptr, std::size_t& space) = std::align; - std::allocator_arg_t aat; - std::uses_allocator > ua; - std::allocator_traits > at; - std::allocator ia; - std::allocator_traits >::rebind_alloc ra(ia); - std::allocator* pva = &ra; - std::allocator_traits >::rebind_traits::pointer pt; - - (void)aat; - (void)ua; - (void)at; - (void)pva; - (void)pt; - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_atomic_sp.ipp b/libs/config/test/boost_no_cxx11_atomic_sp.ipp deleted file mode 100644 index 42c9cb7f4..000000000 --- a/libs/config/test/boost_no_cxx11_atomic_sp.ipp +++ /dev/null @@ -1,36 +0,0 @@ -// (C) Copyright John Maddock 2012 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_ATOMIC_SMART_PTR -// TITLE: C++11 does not support atomic smart pointer operations -// DESCRIPTION: The compiler does not support the C++11 atomic smart pointer features added to - -#include - -namespace boost_no_cxx11_atomic_smart_ptr { - -int test() -{ - std::shared_ptr spi(new int), spi2(new int); - spi = std::static_pointer_cast(spi); - - atomic_is_lock_free(&spi); - atomic_load(&spi); - atomic_load_explicit(&spi, std::memory_order_relaxed); - atomic_store(&spi, spi2); - atomic_store_explicit(&spi, spi2, std::memory_order_relaxed); - atomic_exchange(&spi, spi2); - atomic_compare_exchange_weak(&spi, &spi2, spi); - atomic_compare_exchange_strong(&spi, &spi2, spi); - atomic_compare_exchange_weak_explicit(&spi, &spi2, spi, std::memory_order_relaxed, std::memory_order_relaxed); - atomic_compare_exchange_strong_explicit(&spi, &spi2, spi, std::memory_order_relaxed, std::memory_order_relaxed); - - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_final.ipp b/libs/config/test/boost_no_cxx11_final.ipp deleted file mode 100644 index 0a0073391..000000000 --- a/libs/config/test/boost_no_cxx11_final.ipp +++ /dev/null @@ -1,41 +0,0 @@ -// (C) Copyright Agustin Berge 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/config for more information. - -// MACRO: BOOST_NO_CXX11_FINAL -// TITLE: C++11 final class-virt-specifier -// DESCRIPTION: The compiler does not support the C++ class-virt-specifier final - -namespace boost_no_cxx11_final { - -struct X final {}; - -struct abstract -{ - virtual int f() = 0; -}; - -struct derived : public abstract -{ - virtual int f() final - { - return 0; - } -}; - -int check(abstract* pa) -{ - return pa->f(); -} - -int test() -{ - derived d; - return check(&d); -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_array.ipp b/libs/config/test/boost_no_cxx11_hdr_array.ipp deleted file mode 100644 index 7bbead1c1..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_array.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_ARRAY -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_array { - -int test() -{ - std::array a = {{ 1, 2, 3 }}; - return a.size() == 3 ? 0 : 1; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_atomic.ipp b/libs/config/test/boost_no_cxx11_hdr_atomic.ipp deleted file mode 100644 index edede3fcd..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_atomic.ipp +++ /dev/null @@ -1,90 +0,0 @@ -// (C) Copyright John Maddock 2013 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_ATOMIC -// TITLE: C++11 header is either not present or too broken to be used -// DESCRIPTION: The compiler does not support the C++11 header - -#include - -#if !defined(ATOMIC_BOOL_LOCK_FREE) || !defined(ATOMIC_CHAR_LOCK_FREE) || !defined(ATOMIC_CHAR16_T_LOCK_FREE) \ - || !defined(ATOMIC_CHAR32_T_LOCK_FREE) || !defined(ATOMIC_WCHAR_T_LOCK_FREE) || !defined(ATOMIC_SHORT_LOCK_FREE)\ - || !defined(ATOMIC_INT_LOCK_FREE) || !defined(ATOMIC_LONG_LOCK_FREE) || !defined(ATOMIC_LLONG_LOCK_FREE)\ - || !defined(ATOMIC_POINTER_LOCK_FREE) -# error "required macros not defined" -#endif - -namespace boost_no_cxx11_hdr_atomic { - -int test() -{ - std::memory_order m = static_cast(std::memory_order_relaxed | std::memory_order_consume | std::memory_order_acquire | std::memory_order_release - | std::memory_order_acq_rel | std::memory_order_seq_cst); - (void)m; - - std::atomic a1; - std::atomic a2; - std::atomic a3; - a1.is_lock_free(); - a1.store(1); - a1.load(); - a1.exchange(2); - int v; - a1.compare_exchange_weak(v, 2, std::memory_order_relaxed, std::memory_order_relaxed); - a1.compare_exchange_strong(v, 2, std::memory_order_relaxed, std::memory_order_relaxed); - a1.fetch_add(2); - a1.fetch_sub(3); - a1.fetch_and(3); - a1.fetch_or(1); - a1.fetch_xor(1); - a1++; - ++a1; - a1--; - --a1; - a1 += 2; - a1 -= 2; - a1 &= 1; - a1 |= 2; - a1 ^= 3; - - a3.store(&v); - a3.fetch_add(1); - a3.fetch_sub(1); - ++a3; - --a3; - a3++; - a3--; - a3 += 1; - a3 -= 1; - - std::atomic_is_lock_free(&a1); - // This produces linker errors on Mingw32 for some reason, probably not required anyway for most uses?? - //std::atomic_init(&a1, 2); - std::atomic_store(&a1, 3); - std::atomic_store_explicit(&a1, 3, std::memory_order_relaxed); - std::atomic_load(&a1); - std::atomic_load_explicit(&a1, std::memory_order_relaxed); - std::atomic_exchange(&a1, 3); - std::atomic_compare_exchange_weak(&a1, &v, 2); - std::atomic_compare_exchange_strong(&a1, &v, 2); - std::atomic_compare_exchange_weak_explicit(&a1, &v, 2, std::memory_order_relaxed, std::memory_order_relaxed); - std::atomic_compare_exchange_strong_explicit(&a1, &v, 2, std::memory_order_relaxed, std::memory_order_relaxed); - - std::atomic_flag f = ATOMIC_FLAG_INIT; - f.test_and_set(std::memory_order_relaxed); - f.test_and_set(); - f.clear(std::memory_order_relaxed); - f.clear(); - - std::atomic_thread_fence(std::memory_order_relaxed); - std::atomic_signal_fence(std::memory_order_relaxed); - - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_chrono.ipp b/libs/config/test/boost_no_cxx11_hdr_chrono.ipp deleted file mode 100644 index 701b024e7..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_chrono.ipp +++ /dev/null @@ -1,31 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_CHRONO -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_chrono { - -int test() -{ - using std::chrono::nanoseconds; - using std::chrono::microseconds; - using std::chrono::milliseconds; - using std::chrono::seconds; - using std::chrono::minutes; - using std::chrono::hours; - using std::chrono::system_clock; - using std::chrono::steady_clock; - using std::chrono::high_resolution_clock; - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_codecvt.ipp b/libs/config/test/boost_no_cxx11_hdr_codecvt.ipp deleted file mode 100644 index 428fbb4e1..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_codecvt.ipp +++ /dev/null @@ -1,29 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_CODECVT -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include -#include // for wstring_convert - -namespace boost_no_cxx11_hdr_codecvt { - -int test() -{ - using std::codecvt_utf8; - using std::codecvt_utf16; - using std::codecvt_utf8_utf16; -#ifndef BOOST_NO_CXX11_CHAR16_T - std::wstring_convert, char16_t> test; -#endif - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_condition_variable.ipp b/libs/config/test/boost_no_cxx11_hdr_condition_variable.ipp deleted file mode 100644 index d266e8de5..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_condition_variable.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_CONDITION_VARIABLE -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_condition_variable { - -int test() -{ - using std::condition_variable; - using std::condition_variable_any; - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_forward_list.ipp b/libs/config/test/boost_no_cxx11_hdr_forward_list.ipp deleted file mode 100644 index 0ef465d86..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_forward_list.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_FORWARD_LIST -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_forward_list { - -int test() -{ - std::forward_list l(2u, 2); - return *l.begin() == 2 ? 0 : 1; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_future.ipp b/libs/config/test/boost_no_cxx11_hdr_future.ipp deleted file mode 100644 index b19302d0e..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_future.ipp +++ /dev/null @@ -1,34 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_FUTURE -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_future { - -int test() -{ - using std::is_error_code_enum; - using std::make_error_code; - using std::make_error_condition; - using std::future_category; - using std::future_error; - using std::promise; - using std::promise; - using std::promise; - using std::future; - using std::shared_future; - using std::packaged_task; // undefined - using std::async; - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_initializer_list.ipp b/libs/config/test/boost_no_cxx11_hdr_initializer_list.ipp deleted file mode 100644 index e7ee83894..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_initializer_list.ipp +++ /dev/null @@ -1,27 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_INITIALIZER_LIST -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_initializer_list { - -void foo(const std::initializer_list&) -{ -} - -int test() -{ - foo( { "a", "b", "c" } ); - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_mutex.ipp b/libs/config/test/boost_no_cxx11_hdr_mutex.ipp deleted file mode 100644 index acc1b1e92..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_mutex.ipp +++ /dev/null @@ -1,26 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_MUTEX -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_mutex { - -int test() -{ - using std::mutex; - using std::recursive_mutex; - using std::timed_mutex; - using std::recursive_timed_mutex; - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_random.ipp b/libs/config/test/boost_no_cxx11_hdr_random.ipp deleted file mode 100644 index acc139576..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_random.ipp +++ /dev/null @@ -1,31 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_RANDOM -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_random { - -int test() -{ - using std::minstd_rand0; - using std::mt19937; - using std::mt19937_64; - using std::ranlux24_base; - using std::ranlux48_base; - using std::ranlux24; - using std::ranlux48; - using std::knuth_b; - using std::default_random_engine; - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_ratio.ipp b/libs/config/test/boost_no_cxx11_hdr_ratio.ipp deleted file mode 100644 index f17dd5dea..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_ratio.ipp +++ /dev/null @@ -1,37 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_RATIO -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_ratio { - -int test() -{ - using std::atto; - using std::femto; - using std::pico; - using std::nano; - using std::micro; - using std::milli; - using std::centi; - using std::deci; - using std::deca; - using std::hecto; - using std::kilo; - using std::mega; - using std::tera; - using std::peta; - using std::exa; - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_regex.ipp b/libs/config/test/boost_no_cxx11_hdr_regex.ipp deleted file mode 100644 index 1901482cd..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_regex.ipp +++ /dev/null @@ -1,29 +0,0 @@ -// (C) Copyright Beman Dawes 2009 -// Copyright (c) Microsoft 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) - -// See http://www.boost.org/libs/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_REGEX -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_regex { - -int test() -{ - using std::regex; - using std::wregex; - - regex e("\\d+"); - wregex we(L"\\d+"); - std::string s("123456"); - std::wstring ws(L"123456"); - return regex_match(s, e) && regex_match(ws, we) ? 0 : 1; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_system_error.ipp b/libs/config/test/boost_no_cxx11_hdr_system_error.ipp deleted file mode 100644 index 50ced6c1e..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_system_error.ipp +++ /dev/null @@ -1,26 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_SYSTEM_ERROR -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_system_error { - -int test() -{ - using std::error_category; - using std::error_code; - using std::error_condition; - using std::system_error; - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_thread.ipp b/libs/config/test/boost_no_cxx11_hdr_thread.ipp deleted file mode 100644 index 612ddc33a..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_thread.ipp +++ /dev/null @@ -1,27 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_THREAD -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_thread { - -int test() -{ - using std::thread; - using std::this_thread::get_id; - using std::this_thread::yield; - using std::this_thread::sleep_until; - using std::this_thread::sleep_for; - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_tuple.ipp b/libs/config/test/boost_no_cxx11_hdr_tuple.ipp deleted file mode 100644 index 34bdc4df0..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_tuple.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_TUPLE -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_tuple { - -int test() -{ - std::tuple t(0, 1, 2); - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_type_traits.ipp b/libs/config/test/boost_no_cxx11_hdr_type_traits.ipp deleted file mode 100644 index cf6cdd70e..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_type_traits.ipp +++ /dev/null @@ -1,106 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_TYPE_TRAITS -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_type_traits { - -int test() -{ - using std::integral_constant; - using std::true_type; - using std::false_type; - using std::is_void; - using std::is_integral; - using std::is_floating_point; - using std::is_array; - using std::is_pointer; - using std::is_lvalue_reference; - using std::is_rvalue_reference; - using std::is_member_object_pointer; - using std::is_member_function_pointer; - using std::is_enum; - using std::is_union; - using std::is_class; - using std::is_function; - using std::is_reference; - using std::is_arithmetic; - using std::is_fundamental; - using std::is_object; - using std::is_scalar; - using std::is_compound; - using std::is_member_pointer; - using std::is_const; - using std::is_volatile; - using std::is_trivial; - using std::is_trivially_copyable; - using std::is_standard_layout; - using std::is_pod; - using std::is_literal_type; - using std::is_empty; - using std::is_polymorphic; - using std::is_abstract; - using std::is_constructible; - using std::is_nothrow_constructible; - using std::is_default_constructible; - using std::is_copy_constructible; - using std::is_copy_assignable; - using std::is_move_constructible; - using std::is_move_assignable; - using std::is_destructible; - using std::is_trivially_default_constructible; - using std::is_trivially_copy_constructible; - using std::is_trivially_move_constructible; - using std::is_trivially_copy_assignable; - using std::is_trivially_move_assignable; - using std::is_trivially_destructible; - using std::is_nothrow_default_constructible; - using std::is_nothrow_copy_constructible; - using std::is_nothrow_move_constructible; - using std::is_nothrow_copy_assignable; - using std::is_nothrow_move_assignable; - using std::has_virtual_destructor; - using std::is_signed; - using std::is_unsigned; - using std::alignment_of; - using std::rank; - using std::extent; - using std::is_same; - using std::is_base_of; - using std::is_convertible; - using std::remove_const; - using std::remove_volatile; - using std::remove_cv; - using std::add_const; - using std::add_volatile; - using std::add_cv; - using std::remove_reference; - using std::add_lvalue_reference; - using std::add_rvalue_reference; - using std::make_signed; - using std::make_unsigned; - using std::remove_extent; - using std::remove_all_extents; - using std::remove_pointer; - using std::add_pointer; - using std::aligned_storage; - using std::aligned_union; - using std::decay; - using std::enable_if; - using std::conditional; - using std::common_type; - using std::underlying_type; - using std::result_of; - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_typeindex.ipp b/libs/config/test/boost_no_cxx11_hdr_typeindex.ipp deleted file mode 100644 index 5ebe7bc29..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_typeindex.ipp +++ /dev/null @@ -1,33 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_TYPEINDEX -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_typeindex { - -int test() -{ -#if defined( BOOST_NO_TYPEID ) - std::type_index * p1; - std::hash h; - (void)p1; - (void)h; - return 0; -#else - std::type_index t1 = typeid(int); - std::type_index t2 = typeid(double); - std::hash h; - return (t1 != t2) && (h(t1) != h(t2)) ? 0 : 1; -#endif -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_unordered_map.ipp b/libs/config/test/boost_no_cxx11_hdr_unordered_map.ipp deleted file mode 100644 index 08e94ec05..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_unordered_map.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_UNORDERED_MAP -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_unordered_map { - -int test() -{ - std::unordered_map s1; - std::unordered_multimap s2; - return s1.empty() && s2.empty() ? 0 : 1; -} - -} diff --git a/libs/config/test/boost_no_cxx11_hdr_unordered_set.ipp b/libs/config/test/boost_no_cxx11_hdr_unordered_set.ipp deleted file mode 100644 index f36f15f0e..000000000 --- a/libs/config/test/boost_no_cxx11_hdr_unordered_set.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_UNORDERED_SET -// TITLE: C++0x header unavailable -// DESCRIPTION: The standard library does not supply C++0x header - -#include - -namespace boost_no_cxx11_hdr_unordered_set { - -int test() -{ - std::unordered_set s1; - std::unordered_multiset s2; - return s1.empty() && s2.empty() ? 0 : 1; -} - -} diff --git a/libs/config/test/boost_no_cxx11_inline_namespaces.ipp b/libs/config/test/boost_no_cxx11_inline_namespaces.ipp deleted file mode 100644 index 5b76da865..000000000 --- a/libs/config/test/boost_no_cxx11_inline_namespaces.ipp +++ /dev/null @@ -1,30 +0,0 @@ -// (C) Copyright Andrey Semashev 2013 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_INLINE_NAMESPACES -// TITLE: C++11 inline namespaces. -// DESCRIPTION: The compiler does not support C++11 inline namespaces. - -namespace boost_no_cxx11_inline_namespaces { - -inline namespace my_ns { - -int data = 0; - -} // namespace my_ns - -int test() -{ - data = 1; - if (&data == &my_ns::data) - return 0; - else - return 1; -} - -} diff --git a/libs/config/test/boost_no_cxx11_non_pub_def_fun.ipp b/libs/config/test/boost_no_cxx11_non_pub_def_fun.ipp deleted file mode 100644 index 8089c751f..000000000 --- a/libs/config/test/boost_no_cxx11_non_pub_def_fun.ipp +++ /dev/null @@ -1,38 +0,0 @@ -// (C) Copyright Andrey Semashev 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/config for more information. - -// MACRO: BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS -// TITLE: C++11 non-public defaulted functions unavailable -// DESCRIPTION: The compiler does not support C++11 defaulted functions in access control sections other than public - -#if defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__) && !defined(BOOST_INTEL_STDCXX0X) -# error Non-public defaulted functions are not supported in non-C++11 mode -#endif - -namespace boost_no_cxx11_non_public_defaulted_functions { - -struct foo -{ -protected: - foo() = default; - foo& operator= (foo const&) = default; -}; - -struct bar -{ -private: - bar() = default; - bar& operator= (bar const&) = default; -}; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_numeric_limits.ipp b/libs/config/test/boost_no_cxx11_numeric_limits.ipp deleted file mode 100644 index 29b1fc847..000000000 --- a/libs/config/test/boost_no_cxx11_numeric_limits.ipp +++ /dev/null @@ -1,31 +0,0 @@ -// (C) Copyright Vicente J. Botet Escriba 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 http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_NO_CXX11_NUMERIC_LIMITS -// TITLE: static function lowest() in numeric_limits class -// DESCRIPTION: static function numeric_limits::lowest() are not available for use. - -#include - -namespace boost_no_cxx11_numeric_limits{ - -int f() -{ - // this is never called, it just has to compile: - return std::numeric_limits::lowest(); -} - -int test() -{ - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_cxx11_ref_qualifiers.ipp b/libs/config/test/boost_no_cxx11_ref_qualifiers.ipp deleted file mode 100644 index 77d1234a8..000000000 --- a/libs/config/test/boost_no_cxx11_ref_qualifiers.ipp +++ /dev/null @@ -1,33 +0,0 @@ -// (C) Copyright Andrzej Krzemienski 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/config for more information. - -// MACRO: BOOST_NO_CXX11_REF_QUALIFIERS -// TITLE: C++11 ref-qualifiers on member functions. -// DESCRIPTION: The compiler does not support the C++11 ref-qualifiers on member functions as described in N2439. - -namespace boost_no_cxx11_ref_qualifiers { - -struct G -{ - char get() & { return 'l'; } - char get() && { return 'r'; } - char get() const& { return 'c'; } -}; - -int test() -{ - G m; - const G c = G(); - - if (m.get() != 'l') return 1; - if (c.get() != 'c') return 1; - if (G().get() != 'r') return 1; - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_smart_ptr.ipp b/libs/config/test/boost_no_cxx11_smart_ptr.ipp deleted file mode 100644 index 5b563df7f..000000000 --- a/libs/config/test/boost_no_cxx11_smart_ptr.ipp +++ /dev/null @@ -1,35 +0,0 @@ -// (C) Copyright John Maddock 2012 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_SMART_PTR -// TITLE: C++11 has no shared_ptr and unique_ptr -// DESCRIPTION: The compiler does not support the C++11 smart pointer features added to - -#include -// Hash functions for shared pointers should be in -// but with some std lib's we have to include as well... -#include - -namespace boost_no_cxx11_smart_ptr { - -int test() -{ - std::unique_ptr upi(new int); - std::shared_ptr spi(new int), spi2(new int); - spi = std::static_pointer_cast(spi); - - std::hash > h1; - std::hash > h2; - - (void)h1; - (void)h2; - - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_std_align.ipp b/libs/config/test/boost_no_cxx11_std_align.ipp deleted file mode 100644 index 145e24c6d..000000000 --- a/libs/config/test/boost_no_cxx11_std_align.ipp +++ /dev/null @@ -1,34 +0,0 @@ -// (C) Copyright John Maddock 2012 -// (C) Copyright Peter Dimov 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/config for more information. - -// MACRO: BOOST_NO_CXX11_STD_ALIGN -// TITLE: C++11 doesn't have a working std::align -// DESCRIPTION: The compiler does not support the function std::align added to - -#include - -namespace boost_no_cxx11_std_align { - -int test() -{ - char buffer[ 32 ]; - - void * ptr = buffer + 1; - std::size_t space = sizeof( buffer ) - 1; - - void * p2 = std::align( 4, 2, ptr, space ); - - if( p2 == 0 ) return 1; - if( p2 != ptr ) return 1; - if( (size_t)p2 % 4 ) return 1; - - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx11_thread_local.ipp b/libs/config/test/boost_no_cxx11_thread_local.ipp deleted file mode 100644 index 795ee7461..000000000 --- a/libs/config/test/boost_no_cxx11_thread_local.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright John Maddock 2012. -// 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/config for most recent version. - -// MACRO: BOOST_NO_CXX11_THREAD_LOCAL -// TITLE: thread_local -// DESCRIPTION: The compiler supports the thread_local storage specifier. - -#include - - -namespace boost_no_cxx11_thread_local{ - -int test() -{ - static thread_local std::string local("hello"); - return 0; -} - -} - diff --git a/libs/config/test/boost_no_cxx11_trailing_result_types.ipp b/libs/config/test/boost_no_cxx11_trailing_result_types.ipp deleted file mode 100644 index 17012048e..000000000 --- a/libs/config/test/boost_no_cxx11_trailing_result_types.ipp +++ /dev/null @@ -1,26 +0,0 @@ -// (C) Copyright Andrey Semashev 2013 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_TRAILING_RESULT_TYPES -// TITLE: C++11 trailing function result types syntax. -// DESCRIPTION: The compiler does not support the new C++11 function result types specification syntax. - -namespace boost_no_cxx11_trailing_result_types { - -template< typename T > -auto foo(T const& t) -> T -{ - return t; -} - -int test() -{ - return foo(0); -} - -} diff --git a/libs/config/test/boost_no_cxx11_user_lit.ipp b/libs/config/test/boost_no_cxx11_user_lit.ipp deleted file mode 100644 index 090e0c036..000000000 --- a/libs/config/test/boost_no_cxx11_user_lit.ipp +++ /dev/null @@ -1,67 +0,0 @@ -// (C) Copyright John Maddock 2013 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_USER_DEFINED_LITERALS -// TITLE: C++11 user defined literals. -// DESCRIPTION: The compiler does not support the C++11 literals including user-defined suffixes. - -#include - -namespace boost_no_cxx11_user_defined_literals { - -struct my_literal -{ - my_literal() : val(0) {} - my_literal(int i) : val(i) {} - my_literal(const my_literal& a) : val(a.val) {} - bool operator==(const my_literal& a) const { return val == a.val; } - int val; -}; - -template -struct parse_int -{ - // The default specialization is also the termination condition: - // it gets invoked only when sizeof...Digits == 0. - static_assert(base<=16u,"only support up to hexadecimal"); - static constexpr unsigned long long value{ val }; -}; - -template -struct parse_int -{ - static constexpr unsigned long long char_value = (c >= '0' && c <= '9') - ? c - '0' - : (c >= 'a' && c <= 'f') - ? c - 'a' - : (c >= 'A' && c <= 'F') - ? c - 'A' - : 400u; - static_assert(char_value < base, "Encountered a digit out of range"); - static constexpr unsigned long long value{ parse_int::value }; -}; - -my_literal operator "" _suf1(unsigned long long v) -{ - return my_literal(v); -} -template -my_literal operator "" _bin() -{ - return parse_int<2, 0, PACK...>::value; -} - -int test() -{ - my_literal a = 0x23_suf1; - my_literal b = 1001_bin; - return ((a == my_literal(0x23)) && (b == my_literal(9))) ? 0 : 1; -} - -} diff --git a/libs/config/test/boost_no_cxx14_binary_literals.ipp b/libs/config/test/boost_no_cxx14_binary_literals.ipp deleted file mode 100644 index 326d5b03e..000000000 --- a/libs/config/test/boost_no_cxx14_binary_literals.ipp +++ /dev/null @@ -1,23 +0,0 @@ - -// (C) Copyright Kohei Takahashi 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/config for more information. - -// MACRO: BOOST_NO_CXX14_BINARY_LITERALS -// TITLE: C++14 binary literals unavailable -// DESCRIPTION: The compiler does not support C++14 binary literals - -namespace boost_no_cxx14_binary_literals -{ - -int test() -{ - return ((int)0b01000010 == (int)0x42) ? 0 : 1; -} - -} - diff --git a/libs/config/test/boost_no_cxx14_constexpr.ipp b/libs/config/test/boost_no_cxx14_constexpr.ipp deleted file mode 100644 index cc6552700..000000000 --- a/libs/config/test/boost_no_cxx14_constexpr.ipp +++ /dev/null @@ -1,72 +0,0 @@ - -// (C) Copyright Kohei Takahashi 2014,2016 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX14_CONSTEXPR -// TITLE: C++14 relaxed constexpr unavailable -// DESCRIPTION: The compiler does not support C++14 relaxed constexpr - -namespace boost_no_cxx14_constexpr -{ - -namespace detail -{ - template struct void_ { typedef void type; }; - - struct non_tmpl - { - constexpr int foo() const { return 1; } - constexpr int foo() { return 0; } - }; - - template - struct tmpl : non_tmpl { }; -} - -// Test relaxed constexpr with dependent type; for more details, see comment of -// BOOST_CXX14_CONSTEXPR definition in boost/config/compiler/clang.hpp . -template -constexpr typename detail::void_::type decrement(T &value) -{ - --value; -} - -constexpr int non_cv_member(detail::non_tmpl x) -{ - return x.foo(); -} - -template -constexpr int non_cv_member(detail::tmpl x) -{ - return x.foo(); -} - -constexpr int zero() -{ - int ret = 1; - decrement(ret); - return ret; -} - -template struct compile_time_value -{ - static constexpr int value = v; -}; - -int test() -{ - return compile_time_value< - zero() - + non_cv_member(detail::non_tmpl()) - + non_cv_member(detail::tmpl()) - >::value; -} - -} - diff --git a/libs/config/test/boost_no_cxx14_decltype_auto.ipp b/libs/config/test/boost_no_cxx14_decltype_auto.ipp deleted file mode 100644 index 4f538dcc0..000000000 --- a/libs/config/test/boost_no_cxx14_decltype_auto.ipp +++ /dev/null @@ -1,33 +0,0 @@ - -// (C) Copyright Kohei Takahashi 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/config for more information. - -// MACRO: BOOST_NO_CXX14_DECLTYPE_AUTO -// TITLE: C++14 decltype(auto) unavailable -// DESCRIPTION: The compiler does not support C++14 decltype(auto) - -namespace boost_no_cxx14_decltype_auto -{ - -void quiet_warning(int){} - -const int &foo(const int &x) -{ - return x; -} - -int test() -{ - int j; - decltype(auto) x = foo(j); - quiet_warning(x); - return 0; -} - -} - diff --git a/libs/config/test/boost_no_cxx14_digit_separator.ipp b/libs/config/test/boost_no_cxx14_digit_separator.ipp deleted file mode 100644 index ed4bcf236..000000000 --- a/libs/config/test/boost_no_cxx14_digit_separator.ipp +++ /dev/null @@ -1,23 +0,0 @@ - -// (C) Copyright Kohei Takahashi 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/config for more information. - -// MACRO: BOOST_NO_CXX14_DIGIT_SEPARATORS -// TITLE: C++14 digit separator unavailable -// DESCRIPTION: The compiler does not support C++14 digit separator - -namespace boost_no_cxx14_digit_separators -{ - -int test() -{ - return 0'0; -} - -} - diff --git a/libs/config/test/boost_no_cxx14_generic_lambda.ipp b/libs/config/test/boost_no_cxx14_generic_lambda.ipp deleted file mode 100644 index e271ef5b4..000000000 --- a/libs/config/test/boost_no_cxx14_generic_lambda.ipp +++ /dev/null @@ -1,23 +0,0 @@ - -// (C) Copyright Kohei Takahashi 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/config for more information. - -// MACRO: BOOST_NO_CXX14_GENERIC_LAMBDAS -// TITLE: C++14 generic lambda unavailable -// DESCRIPTION: The compiler does not support C++14 generic lambda - -namespace boost_no_cxx14_generic_lambdas -{ - -int test() -{ - return [](auto ret) { return ret; } (0); -} - -} - diff --git a/libs/config/test/boost_no_cxx14_hdr_shared_mutex.ipp b/libs/config/test/boost_no_cxx14_hdr_shared_mutex.ipp deleted file mode 100644 index ceae56590..000000000 --- a/libs/config/test/boost_no_cxx14_hdr_shared_mutex.ipp +++ /dev/null @@ -1,27 +0,0 @@ -// (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) - -// See http://www.boost.org/libs/config for more information. - -// MACRO: BOOST_NO_CXX14_HDR_SHARED_MUTEX -// TITLE: C++0y header unavailable -// DESCRIPTION: The standard library does not supply C++0y header - -#include - -namespace boost_no_cxx14_hdr_shared_mutex { - -int test() -{ - // - // We should probably test __cpp_lib_shared_timed_mutex here, but since neither - // MSVC/Dinkumware, nor clang/libc++ bother to set it (as of July 2015), there's - // not much point.... - using std::shared_timed_mutex; - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx14_lambda_capture.ipp b/libs/config/test/boost_no_cxx14_lambda_capture.ipp deleted file mode 100644 index a78873662..000000000 --- a/libs/config/test/boost_no_cxx14_lambda_capture.ipp +++ /dev/null @@ -1,23 +0,0 @@ - -// (C) Copyright Kohei Takahashi 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/config for more information. - -// MACRO: BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES -// TITLE: C++14 initialized lambda capture unavailable -// DESCRIPTION: The compiler does not support C++14 initialized lambda capture - -namespace boost_no_cxx14_initialized_lambda_captures -{ - -int test() -{ - return [ret = 0] { return ret; } (); -} - -} - diff --git a/libs/config/test/boost_no_cxx14_member_init.ipp b/libs/config/test/boost_no_cxx14_member_init.ipp deleted file mode 100644 index 2b6c77b4c..000000000 --- a/libs/config/test/boost_no_cxx14_member_init.ipp +++ /dev/null @@ -1,30 +0,0 @@ - -// (C) Copyright Kohei Takahashi 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/config for more information. - -// MACRO: BOOST_NO_CXX14_AGGREGATE_NSDMI -// TITLE: C++14 member initializers unavailable -// DESCRIPTION: The compiler does not support C++14 member initializers - -namespace boost_no_cxx14_aggregate_nsdmi -{ - -struct S -{ - int x; - int y = 0; -}; - -int test() -{ - S s[] = { { 0x72 }, { 0x42 } }; - return s[1].x - 0x42; -} - -} - diff --git a/libs/config/test/boost_no_cxx14_return_type_ded.ipp b/libs/config/test/boost_no_cxx14_return_type_ded.ipp deleted file mode 100644 index 376567311..000000000 --- a/libs/config/test/boost_no_cxx14_return_type_ded.ipp +++ /dev/null @@ -1,29 +0,0 @@ - -// (C) Copyright Kohei Takahashi 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/config for more information. - -// MACRO: BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION -// TITLE: C++14 return type deduction unavailable -// DESCRIPTION: The compiler does not support C++14 return type deduction - -namespace boost_no_cxx14_return_type_deduction -{ - -template -auto deduced_abs(T x) -{ - return x > 0 ? x : -x; -} - -int test() -{ - return deduced_abs(2) - deduced_abs(-2); -} - -} - diff --git a/libs/config/test/boost_no_cxx14_std_exchange.ipp b/libs/config/test/boost_no_cxx14_std_exchange.ipp deleted file mode 100644 index 111abd9cc..000000000 --- a/libs/config/test/boost_no_cxx14_std_exchange.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// (C) Copyright Oliver Kowalke 2016. -// 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/config for most recent version. - -// MACRO: BOOST_NO_CXX14_STD_EXCHANGE -// TITLE: apply -// DESCRIPTION: The compiler supports the std::exchange() function. - -#include - -namespace boost_no_cxx14_std_exchange { - -int test() { - int * i = new int( 1); - int * j = std::exchange( i, nullptr); - delete j; - return 0; -} - -} diff --git a/libs/config/test/boost_no_cxx14_var_templ.ipp b/libs/config/test/boost_no_cxx14_var_templ.ipp deleted file mode 100644 index 7162dac75..000000000 --- a/libs/config/test/boost_no_cxx14_var_templ.ipp +++ /dev/null @@ -1,26 +0,0 @@ - -// (C) Copyright Kohei Takahashi 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/config for more information. - -// MACRO: BOOST_NO_CXX14_VARIABLE_TEMPLATES -// TITLE: C++14 variable templates unavailable -// DESCRIPTION: The compiler does not support C++14 variable templates - -namespace boost_no_cxx14_variable_templates -{ - -template -T zero = static_cast(0); - -int test() -{ - return zero; -} - -} - diff --git a/libs/config/test/boost_no_cxx17_std_apply.ipp b/libs/config/test/boost_no_cxx17_std_apply.ipp deleted file mode 100644 index c657c0391..000000000 --- a/libs/config/test/boost_no_cxx17_std_apply.ipp +++ /dev/null @@ -1,28 +0,0 @@ -// (C) Copyright Oliver Kowalke 2016. -// 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/config for most recent version. - -// MACRO: BOOST_NO_CXX17_STD_APPLY -// TITLE: apply -// DESCRIPTION: The compiler supports the std::apply() function. - -#include -#include - -namespace boost_no_cxx17_std_apply { - -int foo( int i, int j) { - return i + j; -} - -int test() { - int i = 1, j = 2; - std::apply( foo, std::make_tuple( i, j) ); - return 0; -} - -} - diff --git a/libs/config/test/boost_no_cxx17_std_invoke.ipp b/libs/config/test/boost_no_cxx17_std_invoke.ipp deleted file mode 100644 index 77f20e6c2..000000000 --- a/libs/config/test/boost_no_cxx17_std_invoke.ipp +++ /dev/null @@ -1,27 +0,0 @@ -// (C) Copyright Oliver Kowalke 2016. -// 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/config for most recent version. - -// MACRO: BOOST_NO_CXX17_STD_INVOKE -// TITLE: invoke -// DESCRIPTION: The compiler supports the std::invoke() function. - -#include - -namespace boost_no_cxx17_std_invoke { - -int foo( int i, int j) { - return i + j; -} - -int test() { - int i = 1, j = 2; - std::invoke( foo, i, j); - return 0; -} - -} - diff --git a/libs/config/test/boost_no_cxx_hdr_functional.ipp b/libs/config/test/boost_no_cxx_hdr_functional.ipp deleted file mode 100644 index fbcc46b01..000000000 --- a/libs/config/test/boost_no_cxx_hdr_functional.ipp +++ /dev/null @@ -1,43 +0,0 @@ -// (C) Copyright John Maddock 2012 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_HDR_FUNCTIONAL -// TITLE: C++11 unavailable -// DESCRIPTION: The compiler does not support the C++11 features added to - -#include - -void f(int, float){} - -namespace boost_no_cxx11_hdr_functional { - -int test() -{ - int i = 0; - std::ref(i); - std::cref(i); - - std::bit_and b1; - std::bit_or b2; - std::bit_xor b3; - - std::hash hs; - - (void)b1; - (void)b2; - (void)b3; - (void)hs; - - std::bind(f, std::placeholders::_1, 0.0f); - - std::function fun(f); - - return 0; -} - -} diff --git a/libs/config/test/boost_no_decltype.ipp b/libs/config/test/boost_no_decltype.ipp deleted file mode 100644 index 0b0592439..000000000 --- a/libs/config/test/boost_no_decltype.ipp +++ /dev/null @@ -1,54 +0,0 @@ - -// (C) Copyright Beman Dawes 2008 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_DECLTYPE -// TITLE: C++0x decltype unavailable -// DESCRIPTION: The compiler does not support C++0x decltype - -namespace boost_no_cxx11_decltype { - -void quiet_warning(int){} - -struct test_class -{ - test_class() {} -}; - -test_class get_test_class() -{ - return test_class(); -} - -template -void baz(F f) -{ - // - // Strangely VC-10 deduces the return type of F - // to be "test_class&". Remove the constructor - // from test_class and then decltype does work OK!! - // - typedef decltype(f()) res; - res r; -} - -int test() -{ - int i; - decltype(i) j(0); - quiet_warning(j); - decltype(get_test_class()) k; - #ifndef _MSC_VER - // Although the VC++ decltype is buggy, we none the less enable support, - // so don't test the bugs for now! - baz(get_test_class); - #endif - return 0; -} - -} diff --git a/libs/config/test/boost_no_decltype_n3276.ipp b/libs/config/test/boost_no_decltype_n3276.ipp deleted file mode 100644 index 9173bb381..000000000 --- a/libs/config/test/boost_no_decltype_n3276.ipp +++ /dev/null @@ -1,137 +0,0 @@ - -// (C) Copyright Eric Niebler 2011 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_DECLTYPE_N3276 -// TITLE: C++0x decltype v1.1 unavailable -// DESCRIPTION: The compiler does not support extensions to C++0x -// decltype as described in N3276 and accepted in Madrid, -// March 2011: -// - -namespace boost_no_cxx11_decltype_n3276 { - -// A simplified result_of implementation. -// that uses decltype. -template -struct result_of; - -template -T& declvar(); - -// use decltype -template -struct result_of -{ - typedef decltype(declvar()(declvar())) type; -}; - -template -struct result_of -{ - typedef decltype(declvar()(declvar(), declvar())) type; -}; - -// simple tuple type -template -struct tuple; - -template -struct tuple -{ - A0 a0_; - - tuple(A0 const &a0) - : a0_(a0) - {} -}; - -template -struct tuple -{ - A0 a0_; - A1 a1_; - - tuple(A0 const &a0, A1 const & a1) - : a0_(a0) - , a1_(a1) - {} -}; - -// A node in an expression tree -template // Args is a tuple. -struct Expr; - -// A function object that builds expression nodes -template -struct MakeExpr -{ - template - Expr > operator()(T const & t) const - { - return Expr >(tuple(t)); - } - - template - Expr > operator()(T const & t, U const & u) const - { - return Expr >(tuple(t, u)); - } -}; - -// Here are tag types that encode in an expression node -// what operation created the node. -struct Terminal; -struct BinaryPlus; -struct FunctionCall; - -typedef MakeExpr MakeTerminal; -typedef MakeExpr MakeBinaryPlus; -typedef MakeExpr MakeFunctionCall; - -template -struct Expr -{ - Args args_; - - explicit Expr(Args const & t) : args_(t) {} - - // An overloaded operator+ that creates a binary plus node - template - typename result_of)>::type - operator+(Expr const &right) const - { - return MakeBinaryPlus()(*this, right); - } - - // An overloaded function call operator that creates a unary - // function call node - typename result_of::type - operator()() const - { - return MakeFunctionCall()(*this); - } -}; - -int test() -{ - // This is a terminal in an expression tree - Expr > i = MakeTerminal()(42); - - i + i; // OK, this creates a binary plus node. - - i(); // OK, this creates a unary function-call node. - // NOTE: If N3276 has not been implemented, this - // line will set off an infinite cascade of template - // instantiations that will run the compiler out of - // memory. - - return 0; -} - -} diff --git a/libs/config/test/boost_no_ded_typename.ipp b/libs/config/test/boost_no_ded_typename.ipp deleted file mode 100644 index ef58d272a..000000000 --- a/libs/config/test/boost_no_ded_typename.ipp +++ /dev/null @@ -1,40 +0,0 @@ -// (C) Copyright John Maddock and Dave 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/config for most recent version. - -// MACRO: BOOST_DEDUCED_TYPENAME -// TITLE: deduced typenames -// DESCRIPTION: Some compilers can't use the typename keyword in deduced contexts. - -#ifndef BOOST_DEDUCED_TYPENAME -#define BOOST_DEDUCED_TYPENAME typename -#endif - - -namespace boost_deduced_typename{ - -template -int f(T const volatile*, BOOST_DEDUCED_TYPENAME T::type* = 0) -{ - return 0; -} - -struct X { typedef int type; }; - -int test() -{ - return f((X*)0); -} - -} - - - - - - - - diff --git a/libs/config/test/boost_no_defaulted_functions.ipp b/libs/config/test/boost_no_defaulted_functions.ipp deleted file mode 100644 index 5c4c7d021..000000000 --- a/libs/config/test/boost_no_defaulted_functions.ipp +++ /dev/null @@ -1,28 +0,0 @@ -// (C) Copyright Beman Dawes 2008 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_DEFAULTED_FUNCTIONS -// TITLE: C++0x defaulted functions unavailable -// DESCRIPTION: The compiler does not support C++0x defaulted functions - -#if defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__) && !defined(BOOST_INTEL_STDCXX0X) -# error Defaulted functions are not supported in non-C++0x mode -#endif - -namespace boost_no_cxx11_defaulted_functions { - - struct foo { - foo() = default; - }; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_no_deleted_functions.ipp b/libs/config/test/boost_no_deleted_functions.ipp deleted file mode 100644 index 4d3f0a907..000000000 --- a/libs/config/test/boost_no_deleted_functions.ipp +++ /dev/null @@ -1,28 +0,0 @@ -// (C) Copyright Beman Dawes 2008 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_DELETED_FUNCTIONS -// TITLE: C++0x =delete functions unavailable -// DESCRIPTION: The compiler does not support C++0x =delete functions - -#if defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__) && !defined(BOOST_INTEL_STDCXX0X) -# error Deleted functions are not supported in non-C++0x mode -#endif - -namespace boost_no_cxx11_deleted_functions { - - struct foo { - foo() = delete; - }; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_no_dep_nested_class.ipp b/libs/config/test/boost_no_dep_nested_class.ipp deleted file mode 100644 index 42c575030..000000000 --- a/libs/config/test/boost_no_dep_nested_class.ipp +++ /dev/null @@ -1,58 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_DEPENDENT_NESTED_DERIVATIONS -// TITLE: dependent nested template classes -// DESCRIPTION: The compiler fails to compile -// a nested class that has a dependent base class: -// template -// struct foo : { -// template -// struct bar : public U {}; -// }; -#ifndef BOOST_NESTED_TEMPLATE -#define BOOST_NESTED_TEMPLATE template -#endif - - -namespace boost_no_dependent_nested_derivations{ - -struct UDT1{}; -struct UDT2{}; - -template -struct foo -{ - template - struct bar : public foo - {}; -}; - -template -void foo_test(T) -{ - typedef foo foo_type; - typedef typename foo_type::BOOST_NESTED_TEMPLATE bar bar_type; - foo ft; - bar_type bt; - (void) &bt; - (void) &ft; -} - -int test() -{ - foo_test(UDT1()); - return 0; -} - -} - - - - - - diff --git a/libs/config/test/boost_no_dep_val_param.ipp b/libs/config/test/boost_no_dep_val_param.ipp deleted file mode 100644 index 759bef058..000000000 --- a/libs/config/test/boost_no_dep_val_param.ipp +++ /dev/null @@ -1,37 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS -// TITLE: dependent non-type template parameters -// DESCRIPTION: Template value parameters cannot have a dependent -// type, for example: -// template -// class X { ... }; - - -namespace boost_no_dependent_types_in_template_value_parameters{ - -template -class X -{}; - -template -struct typifier -{ - typedef T type; -}; - -int test() -{ - X > x; - (void) &x; // avoid "unused variable" warning - return 0; -} - -} - - diff --git a/libs/config/test/boost_no_excep_std.ipp b/libs/config/test/boost_no_excep_std.ipp deleted file mode 100644 index 10d48f470..000000000 --- a/libs/config/test/boost_no_excep_std.ipp +++ /dev/null @@ -1,35 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_EXCEPTION_STD_NAMESPACE -// TITLE: is in namespace std -// DESCRIPTION: Some std libs don't put the contents of -// in namespace std. - -#include - -namespace boost_no_exception_std_namespace{ - -int t(int i) -{ - if(i) - std::terminate(); - return 0; -} - -int test() -{ - return t(0); -} - -} - - - - - - diff --git a/libs/config/test/boost_no_exceptions.ipp b/libs/config/test/boost_no_exceptions.ipp deleted file mode 100644 index 862088f5e..000000000 --- a/libs/config/test/boost_no_exceptions.ipp +++ /dev/null @@ -1,43 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_EXCEPTIONS -// TITLE: exception handling support -// DESCRIPTION: The compiler in its current translation mode supports -// exception handling. - - -namespace boost_no_exceptions{ - -void throw_it(int i) -{ - throw i; -} - -int test() -{ - try - { - throw_it(2); - } - catch(int i) - { - return (i == 2) ? 0 : -1; - } - catch(...) - { - return -1; - } - return -1; -} - -} - - - - - diff --git a/libs/config/test/boost_no_exp_func_tem_arg.ipp b/libs/config/test/boost_no_exp_func_tem_arg.ipp deleted file mode 100644 index 3333b22b6..000000000 --- a/libs/config/test/boost_no_exp_func_tem_arg.ipp +++ /dev/null @@ -1,55 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -// TITLE: non-deduced function template parameters -// DESCRIPTION: Can only use deduced template arguments when -// calling function template instantiations. - -#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1200) -#error "This is known to be buggy under VC6" -#endif - - -namespace boost_no_explicit_function_template_arguments{ - -struct foo -{ - template int bar(){return 0;} - template int bar(){return 1;} -}; - -int test_0() -{ - return 0; -} - - -template -bool foo_17041(int j) -{ - return (i == j); -} - -int test() -{ - foo f; - int a = f.bar(); - int b = f.bar<2>(); - if((a !=0) || (b != 1))return -1; - - if(0 == foo_17041<8>(8)) return -1; - if(0 == foo_17041<4>(4)) return -1; - if(0 == foo_17041<5>(5)) return -1; - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_explicit_cvt_ops.ipp b/libs/config/test/boost_no_explicit_cvt_ops.ipp deleted file mode 100644 index 8b187c0f0..000000000 --- a/libs/config/test/boost_no_explicit_cvt_ops.ipp +++ /dev/null @@ -1,33 +0,0 @@ -// (C) Copyright Beman Dawes 2008 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS -// TITLE: C++0x explicit conversion operators unavailable -// DESCRIPTION: The compiler does not support C++0x explicit conversion operators - -#if defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__) && !defined(BOOST_INTEL_STDCXX0X) -# error This feature is not available in non-C++0x mode -#endif - -namespace boost_no_cxx11_explicit_conversion_operators { - -void quiet_warning(int){} - - struct foo { - explicit operator int() { return 1; } - }; - -int test() -{ - foo f; - int i = int(f); - quiet_warning(i); - return 0; -} - -} diff --git a/libs/config/test/boost_no_extern_template.ipp b/libs/config/test/boost_no_extern_template.ipp deleted file mode 100644 index c5e2ca099..000000000 --- a/libs/config/test/boost_no_extern_template.ipp +++ /dev/null @@ -1,41 +0,0 @@ -// (C) Copyright Beman Dawes 2008 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_EXTERN_TEMPLATE -// TITLE: C++0x extern template unavailable -// DESCRIPTION: The compiler does not support C++0x extern template - -namespace boost_no_cxx11_extern_template { - -template void f(T const* p, U const* q) -{ - p = q; -} - -template -class must_not_compile -{ -public: - void f(T const* p, int const* q); -}; - -template -void must_not_compile::f(T const* p, int const* q) -{ - p = q; -} - -extern template void f<>(int const*, float const*); -extern template class must_not_compile; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_no_fenv_h.ipp b/libs/config/test/boost_no_fenv_h.ipp deleted file mode 100644 index b1e014ccc..000000000 --- a/libs/config/test/boost_no_fenv_h.ipp +++ /dev/null @@ -1,58 +0,0 @@ -// (C) Copyright John Maddock 2001. -// (C) Copyright Bryce Lelbach 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 http://www.boost.org/LICENSE_1_0.txt) - -// See http://www.boost.org/libs/config for most recent version. - -// MACRO: BOOST_NO_FENV_H -// TITLE: fenv.h -// DESCRIPTION: There is no standard available. If is -// available, should be included -// instead of directly including . - -#include - -namespace boost_no_fenv_h { - -int test() -{ - /// C++0x required typedefs - typedef ::fenv_t has_fenv_t; - typedef ::fexcept_t has_fexcept_t; - - /// C++0x required macros - #if !defined(FE_DIVBYZERO) - #error platform does not define FE_DIVBYZERO - #endif - - #if !defined(FE_INEXACT) - #error platform does not define FE_INEXACT - #endif - - #if !defined(FE_ALL_EXCEPT) - #error platform does not define FE_ALL_EXCEPT - #endif - - int i; - has_fexcept_t fe; - has_fenv_t env; - - i = feclearexcept(FE_ALL_EXCEPT); - i += fetestexcept(FE_ALL_EXCEPT); // All flags should be zero - i += fegetexceptflag(&fe, FE_ALL_EXCEPT); - i += fesetexceptflag(&fe, FE_ALL_EXCEPT); - i += feraiseexcept(0); - i += fesetround(fegetround()); - i += fegetenv(&env); - i += fesetenv(&env); - i += feholdexcept(&env); - if(i) - i += feupdateenv(&env); - - return i; -} - -} - diff --git a/libs/config/test/boost_no_fixed_len_variadic_templates.ipp b/libs/config/test/boost_no_fixed_len_variadic_templates.ipp deleted file mode 100644 index 9baf6319b..000000000 --- a/libs/config/test/boost_no_fixed_len_variadic_templates.ipp +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2007 Douglas Gregor -// 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/config for most recent version. - -// MACRO: BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS -// TITLE: C++0x variadic templates unavailable -// DESCRIPTION: The compiler does not support C++0x variadic templates - -namespace boost_no_cxx11_fixed_length_variadic_template_expansion_packs { - -template struct char_tuple {}; - -template struct super_class : public char_tuple {}; - -int test() -{ - super_class<'a', 'b', 'c', 'd'> sc; - (void)sc; - return 0; -} - -} - diff --git a/libs/config/test/boost_no_func_tmp_order.ipp b/libs/config/test/boost_no_func_tmp_order.ipp deleted file mode 100644 index ab6986514..000000000 --- a/libs/config/test/boost_no_func_tmp_order.ipp +++ /dev/null @@ -1,49 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_FUNCTION_TEMPLATE_ORDERING -// TITLE: no function template ordering -// DESCRIPTION: The compiler does not perform -// function template ordering or its function -// template ordering is incorrect. -// -// template void f(T); // #1 -// template void f(T (*)(U)); // #2 -// void bar(int); -// f(&bar); // should choose #2. - - -namespace boost_no_function_template_ordering{ - -template -bool f(T) -{ - return false; -} - -template -bool f(T (*)(U)) -{ - return true; -} - -void bar(int) -{ -} - -int test() -{ - int i = 0; - return f(i) || !f(&bar); -} - -} - - - - - diff --git a/libs/config/test/boost_no_function_template_default_args.ipp b/libs/config/test/boost_no_function_template_default_args.ipp deleted file mode 100644 index cb0c7500c..000000000 --- a/libs/config/test/boost_no_function_template_default_args.ipp +++ /dev/null @@ -1,38 +0,0 @@ -// (C) Copyright Mathias Gaunard 2009. -// 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/config for the most recent version. - -// MACRO: BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS -// TITLE: Default template arguments for function templates -// DESCRIPTION: Default template arguments for function templates are not supported. - -namespace boost_no_cxx11_function_template_default_args -{ - -template -T foo() -{ - return 0; -} - -template -bool is_same(T, U) -{ - return false; -} - -template -bool is_same(T, T) -{ - return true; -} - -int test() -{ - return !is_same(foo<>(), 0) || is_same(foo<>(), 0L); -} - -} // namespace boost_no_function_template_default_args diff --git a/libs/config/test/boost_no_function_type_spec.ipp b/libs/config/test/boost_no_function_type_spec.ipp deleted file mode 100644 index d91d0fb4e..000000000 --- a/libs/config/test/boost_no_function_type_spec.ipp +++ /dev/null @@ -1,44 +0,0 @@ -// (C) Copyright John Maddock 2001. -// (C) Copyright Aleksey Gurtovoy 2003. -// (C) Copyright Alisdair Meredith 2006. -// 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/config for most recent version. - -// MACRO: BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS -// TITLE: template specialisations of function types -// DESCRIPTION: If the compiler cannot handle template specialisations -// for function types - - -namespace boost_no_function_type_specializations{ - -template< typename T > struct is_function -{ -}; - -struct X {}; -enum Y { value }; - -// Tesst can declare specializations -typedef is_function< int( int ) > scalar_types; -typedef is_function< X( X ) > user_defined_type; -typedef is_function< int( Y ) > check_enum; -typedef is_function< X( X, int ) > multiple_arguments; - -// Partial specialization test -// confirm const, volatile, pointers and references in args -template< typename X, typename Y, typename Z > -struct is_function< X( Y const &, volatile Z * ) > -{ -}; - - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_no_i64_limits.ipp b/libs/config/test/boost_no_i64_limits.ipp deleted file mode 100644 index b82bf2f58..000000000 --- a/libs/config/test/boost_no_i64_limits.ipp +++ /dev/null @@ -1,29 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_MS_INT64_NUMERIC_LIMITS -// TITLE: std::numeric_limits<__int64> -// DESCRIPTION: The C++ implementation does not provide the a specialisation -// for std::numeric_limits<__int64>. - -#include - -namespace boost_no_ms_int64_numeric_limits{ - -int test() -{ - if(0 == std::numeric_limits<__int64>::is_specialized) return -1; - if(0 == std::numeric_limits::is_specialized) return -1; - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_no_inline_memb_init.ipp b/libs/config/test/boost_no_inline_memb_init.ipp deleted file mode 100644 index 4ccacbe37..000000000 --- a/libs/config/test/boost_no_inline_memb_init.ipp +++ /dev/null @@ -1,62 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_INCLASS_MEMBER_INITIALIZATION -// TITLE: inline member constant initialisation -// DESCRIPTION: Compiler violates std::9.4.2/4. - - -namespace boost_no_inclass_member_initialization{ - -struct UDT{}; - - -template -struct ice_or_helper -{ - static const bool value = true; -}; -template <> -struct ice_or_helper -{ - static const bool value = false; -}; - -template -struct ice_or -{ - static const bool value = ice_or_helper::value; -}; - -template -struct is_int -{ - static const bool value = false; -}; - -template <> -struct is_int -{ - static const bool value = true; -}; - -#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7))) -# define BOOST_UNUSED_ATTRIBUTE __attribute__((unused)) -#else -# define BOOST_UNUSED_ATTRIBUTE -#endif - - -int test() -{ - typedef int a1[ice_or< is_int::value, is_int::value>::value ? 1 : -1] BOOST_UNUSED_ATTRIBUTE; - return 0; -} - -} - -#undef BOOST_UNUSED_ATTRIBUTE diff --git a/libs/config/test/boost_no_integral_int64_t.ipp b/libs/config/test/boost_no_integral_int64_t.ipp deleted file mode 100644 index eb11640a8..000000000 --- a/libs/config/test/boost_no_integral_int64_t.ipp +++ /dev/null @@ -1,54 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_INTEGRAL_INT64_T -// TITLE: long long and integral constant expressions -// DESCRIPTION: The platform supports long long in integral constant expressions. - -#include - - -namespace boost_no_integral_int64_t{ - -#ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION -enum{ mask = 1uLL << 50 }; - -template -struct llt -{ - enum{ value = m }; -}; -#else -#ifdef __GNUC__ -__extension__ -#endif -static const unsigned long long mask = 1uLL << 50; - -#ifdef __GNUC__ -__extension__ -#endif -template -struct llt -{ -#ifdef __GNUC__ -__extension__ -#endif - static const unsigned long long value = m; -}; -#endif - -int test() -{ - return llt::value != (1uLL << 50); -} - -} - - - - - diff --git a/libs/config/test/boost_no_iosfwd.ipp b/libs/config/test/boost_no_iosfwd.ipp deleted file mode 100644 index 86ac42e62..000000000 --- a/libs/config/test/boost_no_iosfwd.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// (C) Copyright Peter Dimov 2007. -// 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/config for most recent version. - -// MACRO: BOOST_NO_IOSFWD -// TITLE: -// DESCRIPTION: The header is missing - -#include - -namespace boost_no_iosfwd -{ - -int test() -{ - return 0; -} - -} - diff --git a/libs/config/test/boost_no_iostream.ipp b/libs/config/test/boost_no_iostream.ipp deleted file mode 100644 index abaceac33..000000000 --- a/libs/config/test/boost_no_iostream.ipp +++ /dev/null @@ -1,25 +0,0 @@ -// (C) Copyright Peter Dimov 2007. -// 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/config for most recent version. - -// MACRO: BOOST_NO_IOSTREAM -// TITLE: No iostream support -// DESCRIPTION: The , , headers are missing - -#include -#include -#include - -namespace boost_no_iostream -{ - -int test() -{ - return 0; -} - -} - diff --git a/libs/config/test/boost_no_is_abstract.ipp b/libs/config/test/boost_no_is_abstract.ipp deleted file mode 100644 index 257318eef..000000000 --- a/libs/config/test/boost_no_is_abstract.ipp +++ /dev/null @@ -1,53 +0,0 @@ -// (C) Copyright John Maddock and Dave 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/config for most recent version. - -// MACRO: BOOST_NO_IS_ABSTRACT -// TITLE: is_abstract implementation technique -// DESCRIPTION: Some compilers can't handle the code used for is_abstract even if they support SFINAE. - - -namespace boost_no_is_abstract{ - -#if defined(__CODEGEARC__) -template -struct is_abstract_test -{ - enum{ value = __is_abstract(T) }; -}; -#else -template -struct is_abstract_test -{ - // Deduction fails if T is void, function type, - // reference type (14.8.2/2)or an abstract class type - // according to review status issue #337 - // - template - static double check_sig(U (*)[1]); - template - static char check_sig(...); - -#ifdef __GNUC__ - enum{ s1 = sizeof(is_abstract_test::template check_sig(0)) }; -#else - enum{ s1 = sizeof(check_sig(0)) }; -#endif - - enum{ value = (s1 == sizeof(char)) }; -}; -#endif - -struct non_abstract{}; -struct abstract{ virtual void foo() = 0; }; - -int test() -{ - return static_cast(is_abstract_test::value) == static_cast(is_abstract_test::value); -} - -} - diff --git a/libs/config/test/boost_no_iter_construct.ipp b/libs/config/test/boost_no_iter_construct.ipp deleted file mode 100644 index e87a76fc4..000000000 --- a/libs/config/test/boost_no_iter_construct.ipp +++ /dev/null @@ -1,38 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS -// TITLE: template iterator-constructors -// DESCRIPTION: The standard library does not provide -// templated iterator constructors for its containers. - -#include -#include -#include - -namespace boost_no_templated_iterator_constructors{ - -int test() -{ - std::vector v1; - std::deque d1; - std::list l1; - - // - // now try constructors: - std::vector v2(d1.begin(), d1.end()); - std::deque d2(v1.begin(), v1.end()); - std::list l2(d1.begin(), d1.end()); - - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_lambdas.ipp b/libs/config/test/boost_no_lambdas.ipp deleted file mode 100644 index edd3341a8..000000000 --- a/libs/config/test/boost_no_lambdas.ipp +++ /dev/null @@ -1,30 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_LAMBDAS -// TITLE: C++0x lambda feature unavailable -// DESCRIPTION: The compiler does not support the C++0x lambda feature - -#if defined(__GNUC__) && !defined(__GXX_EXPERIMENTAL_CXX0X__) && !defined(BOOST_INTEL_STDCXX0X) -# error This feature is not available in non-C++0x mode -#endif - -namespace boost_no_cxx11_lambdas { - -template -int f(Func f) -{ - return f(); -} - -int test() -{ - return f([](){ return 0; }); -} - -} diff --git a/libs/config/test/boost_no_limits.ipp b/libs/config/test/boost_no_limits.ipp deleted file mode 100644 index e7a011b88..000000000 --- a/libs/config/test/boost_no_limits.ipp +++ /dev/null @@ -1,34 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_LIMITS -// TITLE: -// DESCRIPTION: The C++ implementation does not provide the header. - -#include - -namespace boost_no_limits{ - -int test() -{ - if(0 == std::numeric_limits::is_specialized) return -1; - if(0 == std::numeric_limits::is_specialized) return -1; - if(0 == std::numeric_limits::is_specialized) return -1; - if(0 == std::numeric_limits::is_specialized) return -1; - if(0 == std::numeric_limits::is_specialized) return -1; - if(0 == std::numeric_limits::is_specialized) return -1; - if(0 == std::numeric_limits::is_specialized) return -1; - if(0 == std::numeric_limits::is_specialized) return -1; - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_no_limits_const_exp.ipp b/libs/config/test/boost_no_limits_const_exp.ipp deleted file mode 100644 index 8438f7eae..000000000 --- a/libs/config/test/boost_no_limits_const_exp.ipp +++ /dev/null @@ -1,42 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -// TITLE: compile time constants in -// DESCRIPTION: constants such as numeric_limits::is_signed -// are not available for use at compile-time. - -#include - -namespace boost_no_limits_compile_time_constants{ - -struct UDT{}; - -template -struct assert_ice -{ - enum { value = i }; -}; - -int test() -{ - assert_ice< ::std::numeric_limits::is_signed > one; - assert_ice< ::std::numeric_limits::is_specialized > two; - assert_ice< ::std::numeric_limits::is_specialized > three; - assert_ice< ::std::numeric_limits::is_signed > four; - (void)one; - (void)two; - (void)three; - (void)four; - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_ll_limits.ipp b/libs/config/test/boost_no_ll_limits.ipp deleted file mode 100644 index 8f7db7dca..000000000 --- a/libs/config/test/boost_no_ll_limits.ipp +++ /dev/null @@ -1,37 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_LONG_LONG_NUMERIC_LIMITS -// TITLE: std::numeric_limits -// DESCRIPTION: The C++ implementation does not provide the a specialisation -// for std::numeric_limits. - -#include - -namespace boost_no_long_long_numeric_limits{ - -int test() -{ -#ifdef __GNUC__ -__extension__ -#endif - typedef long long llt; -#ifdef __GNUC__ -__extension__ -#endif - typedef unsigned long long ullt; - if(0 == std::numeric_limits::is_specialized) return -1; - if(0 == std::numeric_limits::is_specialized) return -1; - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_no_long_long.ipp b/libs/config/test/boost_no_long_long.ipp deleted file mode 100644 index 52ee3edcf..000000000 --- a/libs/config/test/boost_no_long_long.ipp +++ /dev/null @@ -1,36 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_LONG_LONG -// TITLE: C++0x long long unavailable -// DESCRIPTION: The platform does not support C++0x long long. - -#include - - -namespace boost_no_long_long{ - -int test() -{ -#ifdef __GNUC__ - __extension__ long long lli = 0LL; - __extension__ unsigned long long ulli = 0uLL; -#else - long long lli = 0LL; - unsigned long long ulli = 0uLL; -#endif - (void)&lli; - (void)&ulli; - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_no_mem_func_spec.ipp b/libs/config/test/boost_no_mem_func_spec.ipp deleted file mode 100644 index 96cf92a27..000000000 --- a/libs/config/test/boost_no_mem_func_spec.ipp +++ /dev/null @@ -1,62 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS -// TITLE: Specialisation of individual member functions. -// DESCRIPTION: Verify that specializations of individual members -// of template classes work OK. - - -namespace boost_no_member_function_specializations{ - - -template -class foo -{ -public: - foo(); - foo(const T&); - ~foo(); - int bar(); -}; - -// declare specialisations: -template<> foo::foo(); -template<> foo::foo(const int&); -template<> foo::~foo(); -template<> int foo::bar(); - -// provide defaults: -template foo::foo(){} -template foo::foo(const T&){} -template foo::~foo(){} -template int foo::bar(){ return 0; } - -// provide defs: -template<> foo::foo(){} -template<> foo::foo(const int&){} -template<> foo::~foo(){} -template<> int foo::bar(){ return 1; } - - -int test() -{ - foo f1; - foo f2; - f1.bar(); - f2.bar(); - return 0; -} - - -} - - - - - - diff --git a/libs/config/test/boost_no_mem_tem_keyword.ipp b/libs/config/test/boost_no_mem_tem_keyword.ipp deleted file mode 100644 index 4f0901fc5..000000000 --- a/libs/config/test/boost_no_mem_tem_keyword.ipp +++ /dev/null @@ -1,69 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_MEMBER_TEMPLATE_KEYWORD -// TITLE: member templates keyword -// DESCRIPTION: Member template keyword not supported. - -namespace boost_no_member_template_keyword{ - -#ifndef BOOST_NO_MEMBER_TEMPLATES - -template -struct foo -{ - template - struct nested - { - typedef foo other; - }; - template - void mfoo(const U&); -}; - -template -template -void foo::mfoo(const U&) -{ -} - -template -void test_proc(T i) -{ - foo f1; - typedef foo ifoo; - f1.mfoo(i); - f1.template mfoo(i); - typedef typename ifoo::template nested bound_t; - typedef typename bound_t::other other; - other o; - (void) &o; // avoid "unused variable" warning -} - -#else -template -void test_proc(T) -{ -} -#endif - -int test() -{ - test_proc(0); - return 0; -} - - -} - - - - - - - - diff --git a/libs/config/test/boost_no_mem_tem_pnts.ipp b/libs/config/test/boost_no_mem_tem_pnts.ipp deleted file mode 100644 index ad9662027..000000000 --- a/libs/config/test/boost_no_mem_tem_pnts.ipp +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (C) Joaquin M Lopez Munoz 2004. -// 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/config for most recent version. - -// MACRO: BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS -// TITLE: pointers to members as template arguments -// DESCRIPTION: Non-type template parameters which take pointers -// to members, fail to work correctly. - - -namespace boost_no_pointer_to_member_template_parameters{ - -struct pair -{ - int x, y; - - pair(int x_,int y_) - : x(x_), y(y_) - {} -}; - -template -struct foo -{ - int bar(pair& p) - { - return p.*PtrToPairMember; - } -}; - -int test() -{ - pair p(0,1); - foo<&pair::x> fx; - foo<&pair::y> fy; - - if((fx.bar(p) != 0) || (fy.bar(p) != 1)) - return 1; - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_no_mem_templ_frnds.ipp b/libs/config/test/boost_no_mem_templ_frnds.ipp deleted file mode 100644 index c1c1b6308..000000000 --- a/libs/config/test/boost_no_mem_templ_frnds.ipp +++ /dev/null @@ -1,72 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_MEMBER_TEMPLATE_FRIENDS -// TITLE: member template friends -// DESCRIPTION: Member template friend syntax -// ("template friend class frd;") -// described in the C++ Standard, -// 14.5.3, not supported. - - -namespace boost_no_member_template_friends{ - -template -class foobar; - -template -class foo; - -template -bool must_be_friend_proc(const foo& f); - -template -class foo -{ -private: - template friend class foobar; - template friend class foo; - template friend bool must_be_friend_proc(const foo& f); - int i; -public: - foo(){ i = 0; } - template - foo(const foo& f){ i = f.i; } -}; - -template -bool must_be_friend_proc(const foo& f) -{ return f.i != 0; } - -template -class foobar -{ - int i; -public: - template - foobar(const foo& f) - { i = f.i; } -}; - - -int test() -{ - foo fi; - foo fd(fi); - must_be_friend_proc(fd); - foobar fb(fi); - (void) &fb; // avoid "unused variable" warning - return 0; -} - -} - - - - - - diff --git a/libs/config/test/boost_no_mem_templates.ipp b/libs/config/test/boost_no_mem_templates.ipp deleted file mode 100644 index 873580f3c..000000000 --- a/libs/config/test/boost_no_mem_templates.ipp +++ /dev/null @@ -1,64 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_MEMBER_TEMPLATES -// TITLE: member templates -// DESCRIPTION: Member template functions not fully supported. - -#ifndef BOOST_NESTED_TEMPLATE -#define BOOST_NESTED_TEMPLATE template -#endif - - -namespace boost_no_member_templates{ - -template -struct foo -{ - template - struct nested - { - typedef foo other; - }; - template - void mfoo(const U&); -}; - -template -template -void foo::mfoo(const U&) -{ -} - -template -void test_proc(T i) -{ - foo f1; - typedef foo ifoo; - f1.mfoo(i); - //f1.template mfoo(i); - typedef typename ifoo::BOOST_NESTED_TEMPLATE nested bound_t; - typedef typename bound_t::other other; - other o; - (void) &o; -} - -int test() -{ - test_proc(0); - return 0; -} - - -} - - - - - - - diff --git a/libs/config/test/boost_no_nested_friendship.ipp b/libs/config/test/boost_no_nested_friendship.ipp deleted file mode 100644 index 7ff9cc42f..000000000 --- a/libs/config/test/boost_no_nested_friendship.ipp +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (C) 2008 N. Musatti -// 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/config for most recent version. - -// MACRO: BOOST_NO_NESTED_FRIENDSHIP -// TITLE: Access to private members from nested classes -// DESCRIPTION: If the compiler fails to support access to private members -// from nested classes - -namespace boost_no_nested_friendship { - -class A { -public: - A() {} - struct B { - int f(A& a) - { - a.f1(); - a.f2(a); - return a.b; - } - }; - -private: - static int b; - static void f1(){} - template - static void f2(const T&){} -}; - -int A::b = 0; - -int test() -{ - A a; - A::B b; - return b.f(a); -} - -} - diff --git a/libs/config/test/boost_no_noexcept.ipp b/libs/config/test/boost_no_noexcept.ipp deleted file mode 100644 index 878658f11..000000000 --- a/libs/config/test/boost_no_noexcept.ipp +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2011 Takaya Saito -// 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/config for most recent version. - -// MACRO: BOOST_NO_CXX11_NOEXCEPT -// TITLE: C++0x noexcept unavailable -// DESCRIPTION: The compiler does not support C++0x noexcept - -namespace boost_no_cxx11_noexcept { - -void quiet_warning(bool){} - -int f() noexcept ; -int g() noexcept( noexcept( f() ) ) ; - -int test() -{ - bool b = noexcept( g() ); - quiet_warning(b); - return 0; -} - -} diff --git a/libs/config/test/boost_no_nullptr.ipp b/libs/config/test/boost_no_nullptr.ipp deleted file mode 100644 index 5fc12fb62..000000000 --- a/libs/config/test/boost_no_nullptr.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_NULLPTR -// TITLE: C++0x nullptr feature unavailable -// DESCRIPTION: The compiler does not support the C++0x nullptr feature - -namespace boost_no_cxx11_nullptr { - -void quiet_warning(const int*){} - -int test() -{ - int * p = nullptr; - quiet_warning(p); - return 0; -} - -} diff --git a/libs/config/test/boost_no_ops_in_namespace.ipp b/libs/config/test/boost_no_ops_in_namespace.ipp deleted file mode 100644 index 895d9bae0..000000000 --- a/libs/config/test/boost_no_ops_in_namespace.ipp +++ /dev/null @@ -1,73 +0,0 @@ -// (C) Copyright Jeremy Siek 1999. -// (C) Copyright David Abrahams 1999. -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_OPERATORS_IN_NAMESPACE -// TITLE: friend operators in namespace -// DESCRIPTION: Compiler requires inherited operator -// friend functions to be defined at namespace scope, -// then using'ed to boost. -// Probably GCC specific. See boost/operators.hpp for example. - -namespace boost{ - -// -// the following is taken right out of -// -template -struct addable1 -{ - friend T operator+(T x, const T& y) { return x += y; } - friend bool operator != (const T& a, const T& b) { return !(a == b); } -}; - -struct spoiler1 -{}; - -spoiler1 operator+(const spoiler1&,const spoiler1&); -bool operator !=(const spoiler1&, const spoiler1&); - - -} // namespace boost - -namespace boost_no_operators_in_namespace{ - -struct spoiler2 -{}; - -spoiler2 operator+(const spoiler2&,const spoiler2&); -bool operator !=(const spoiler2&, const spoiler2&); - - -class add : public boost::addable1 -{ - int val; -public: - add(int i) { val = i; } - add(const add& a){ val = a.val; } - add& operator+=(const add& a) { val += a.val; return *this; } - bool operator==(const add& a)const { return val == a.val; } -}; - -int test() -{ - add a1(2); - add a2(3); - add a3(0); - a3 = a1 + a2; - bool b1 = (a1 == a2); - b1 = (a1 != a2); - (void)b1; - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_part_spec_def_args.ipp b/libs/config/test/boost_no_part_spec_def_args.ipp deleted file mode 100644 index 91ef53768..000000000 --- a/libs/config/test/boost_no_part_spec_def_args.ipp +++ /dev/null @@ -1,46 +0,0 @@ -// (C) Copyright John Maddock 2008. -// 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/config for most recent version. - -// MACRO: BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS -// TITLE: Default arguments in partial specialization -// DESCRIPTION: The compiler chokes if a partial specialization relies on default arguments in the primary template. - -namespace boost_no_partial_specialization_implicit_default_args{ - -template -struct one -{ -}; - -template -struct tag -{ -}; - -template -struct tag > -{ -}; - -template -void consume_variable(T const&){} - -int test() -{ - tag t1; - consume_variable(t1); - tag > t2; - consume_variable(t2); - tag t3; - consume_variable(t3); - tag, double> t4; - consume_variable(t4); - return 0; -} - -} - diff --git a/libs/config/test/boost_no_partial_spec.ipp b/libs/config/test/boost_no_partial_spec.ipp deleted file mode 100644 index 036744eb5..000000000 --- a/libs/config/test/boost_no_partial_spec.ipp +++ /dev/null @@ -1,56 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -// TITLE: partial specialisation -// DESCRIPTION: Class template partial specialization -// (14.5.4 [temp.class.spec]) not supported. - - -namespace boost_no_template_partial_specialization{ - -template -struct partial1 -{ - typedef T& type; -}; - -template -struct partial1 -{ - typedef T& type; -}; - -template -struct partial2 -{ - typedef T& type; -}; - -template -struct partial2 -{ - typedef T type; -}; - - -int test() -{ - int i = 0; - partial1::type p1 = i; - partial2::type p2 = i; - (void)p1; - (void)p2; - (void)i; - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_priv_aggregate.ipp b/libs/config/test/boost_no_priv_aggregate.ipp deleted file mode 100644 index ca1aee785..000000000 --- a/libs/config/test/boost_no_priv_aggregate.ipp +++ /dev/null @@ -1,39 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_PRIVATE_IN_AGGREGATE -// TITLE: private in aggregate types -// DESCRIPTION: The compiler misreads 8.5.1, treating classes -// as non-aggregate if they contain private or -// protected member functions. - - -namespace boost_no_private_in_aggregate{ - -struct t -{ -private: - void foo(){ i = j; } -public: - void uncallable(); // silences warning from GCC - int i; - int j; -}; - - -int test() -{ - t inst = { 0, 0, }; - (void) &inst; // avoid "unused variable" warning - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_ptr_mem_const.ipp b/libs/config/test/boost_no_ptr_mem_const.ipp deleted file mode 100644 index ef6dda5cb..000000000 --- a/libs/config/test/boost_no_ptr_mem_const.ipp +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 2000 -// Cadenza New Zealand Ltd -// -// (C) Copyright John Maddock 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/config for the most recent version. - -// MACRO: BOOST_NO_POINTER_TO_MEMBER_CONST -// TITLE: pointers to const member functions -// DESCRIPTION: The compiler does not correctly handle -// pointers to const member functions, preventing use -// of these in overloaded function templates. -// See boost/functional.hpp for example. - -#include - -namespace boost_no_pointer_to_member_const{ - -template -class const_mem_fun_t : public std::unary_function -{ -public: - explicit const_mem_fun_t(S (T::*p)() const) - : - ptr(p) - {} - S operator()(const T* p) const - { - return (p->*ptr)(); - } -private: - S (T::*ptr)() const; -}; - -template -class const_mem_fun1_t : public std::binary_function -{ -public: - explicit const_mem_fun1_t(S (T::*p)(A) const) - : - ptr(p) - {} - S operator()(const T* p, const A& x) const - { - return (p->*ptr)(x); - } -private: - S (T::*ptr)(A) const; -}; - -template -inline const_mem_fun_t mem_fun(S (T::*f)() const) -{ - return const_mem_fun_t(f); -} - -template -inline const_mem_fun1_t mem_fun(S (T::*f)(A) const) -{ - return const_mem_fun1_t(f); -} - -class tester -{ -public: - void foo1()const{} - int foo2(int i)const{ return i*2; } -}; - - -int test() -{ - boost_no_pointer_to_member_const::mem_fun(&tester::foo1); - boost_no_pointer_to_member_const::mem_fun(&tester::foo2); - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_range_based_for.ipp b/libs/config/test/boost_no_range_based_for.ipp deleted file mode 100644 index 15468ec46..000000000 --- a/libs/config/test/boost_no_range_based_for.ipp +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright Beman Dawes 2012 - -// Distributed under the Boost Software License, Version 1.0. -// See http://www.boost.org/LICENSE_1_0.txt - -// See http://www.boost.org/libs/config for more information. - -// MACRO: BOOST_NO_CXX11_RANGE_BASED_FOR -// TITLE: C++11 ranged-based for statement unavailable -// DESCRIPTION: The compiler does not support the C++11 range-based for statement - -namespace boost_no_cxx11_range_based_for { - -int test() -{ - // example from 6.5.4 The range-based for statement [stmt.ranged] - int array[5] = { 1, 2, 3, 4, 5 }; - for (int& x : array) - x *= 2; - return 0; -} - -} diff --git a/libs/config/test/boost_no_raw_literals.ipp b/libs/config/test/boost_no_raw_literals.ipp deleted file mode 100644 index c3ead77bc..000000000 --- a/libs/config/test/boost_no_raw_literals.ipp +++ /dev/null @@ -1,27 +0,0 @@ -// (C) Copyright Beman Dawes 2008 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_RAW_LITERALS -// TITLE: C++0x raw string literals unavailable -// DESCRIPTION: The compiler does not support C++0x raw string literals - -namespace boost_no_cxx11_raw_literals { - -void quiet_warning(const char*){} -void quiet_warning(const wchar_t*){} - -int test() -{ - const char* s = R"(abc)"; - quiet_warning(s); - const wchar_t* ws = LR"(abc)"; - quiet_warning(ws); - return 0; -} - -} diff --git a/libs/config/test/boost_no_ret_det.ipp b/libs/config/test/boost_no_ret_det.ipp deleted file mode 100644 index e57c9ed73..000000000 --- a/libs/config/test/boost_no_ret_det.ipp +++ /dev/null @@ -1,43 +0,0 @@ -// (C) Copyright John Maddock 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/config for the most recent version. - -// MACRO: BOOST_NO_UNREACHABLE_RETURN_DETECTION -// TITLE: detection of unreachable returns -// DESCRIPTION: If a return is unreachable, then no return -// statement should be required, however some -// compilers insist on it, while other issue a -// bunch of warnings if it is in fact present. - -#if defined( BOOST_NO_EXCEPTIONS ) -# include -#endif - -namespace boost_no_unreachable_return_detection{ - -int checker() -{ -#if defined( BOOST_NO_EXCEPTIONS ) && (!defined( _MSC_VER ) || defined(__clang__)) - abort(); -#else - throw 0; -#endif - // no return statement: we don't ever get here... -} - -int check = 0; - -int test() -{ - if(check) - return checker(); - return 0; -} - -} - - - diff --git a/libs/config/test/boost_no_rtti.ipp b/libs/config/test/boost_no_rtti.ipp deleted file mode 100644 index 4295d70cc..000000000 --- a/libs/config/test/boost_no_rtti.ipp +++ /dev/null @@ -1,64 +0,0 @@ -// (C) Copyright John Maddock 2008. -// 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/config for most recent version. - -// MACRO: BOOST_NO_RTTI -// TITLE: RTTI unavailable -// DESCRIPTION: The compiler does not support RTTI in this mode - -#include - -class A -{ -public: - A(){} - virtual void t(); -}; - -void A::t() -{ -} - -class B : public A -{ -public: - B(){} - virtual void t(); -}; - -void B::t() -{ -} - -namespace boost_no_rtti -{ - -int check_f(const A& a) -{ - return typeid(a) == typeid(B) ? 0 : 1; -} - -int test() -{ -#if defined( BOOST_NO_EXCEPTIONS ) - { - B b; - return check_f(b); - } -#else - try{ - B b; - return check_f(b); - } - catch(...) - { - return 1; - } -#endif -} - -} - diff --git a/libs/config/test/boost_no_rvalue_references.ipp b/libs/config/test/boost_no_rvalue_references.ipp deleted file mode 100644 index 219a7173a..000000000 --- a/libs/config/test/boost_no_rvalue_references.ipp +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (C) 2007 Douglas Gregor -// 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/config for most recent version. - -// MACRO: BOOST_NO_CXX11_RVALUE_REFERENCES -// TITLE: C++0x rvalue references unavailable -// DESCRIPTION: The compiler does not support C++0x rvalue references - -namespace boost_no_cxx11_rvalue_references { - -void g(int&) {} - -template -void forward(F f, T&& t) { f(static_cast(t)); } - -int test() -{ - int x; - forward(g, x); - return 0; -} - -} diff --git a/libs/config/test/boost_no_scoped_enums.ipp b/libs/config/test/boost_no_scoped_enums.ipp deleted file mode 100644 index f1d9dc56a..000000000 --- a/libs/config/test/boost_no_scoped_enums.ipp +++ /dev/null @@ -1,28 +0,0 @@ -// (C) Copyright Beman Dawes 2008 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_SCOPED_ENUMS -// TITLE: C++0x scoped enum unavailable -// DESCRIPTION: The compiler does not support C++0x scoped enum - -namespace boost_no_cxx11_scoped_enums { - -int test() -{ - enum class scoped_enum { yes, no, maybe }; - // This tests bug http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38064 - bool b = (scoped_enum::yes == scoped_enum::yes) - && (scoped_enum::yes != scoped_enum::no) - && (scoped_enum::yes < scoped_enum::no) - && (scoped_enum::yes <= scoped_enum::no) - && (scoped_enum::no > scoped_enum::yes) - && (scoped_enum::no >= scoped_enum::yes); - return b ? 0 : 1; -} - -} diff --git a/libs/config/test/boost_no_sfinae.ipp b/libs/config/test/boost_no_sfinae.ipp deleted file mode 100644 index 57dad2825..000000000 --- a/libs/config/test/boost_no_sfinae.ipp +++ /dev/null @@ -1,68 +0,0 @@ -// (C) Copyright Eric Friedman 2003. -// Some modifications by Jeremiah Willcock and Jaakko Jarvi. -// 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) - -// MACRO: BOOST_NO_SFINAE -// TITLE: SFINAE (substitution failure is not an error) -// DESCRIPTION: SFINAE not supported. - - -namespace boost_no_sfinae { - -namespace f1_a { -template -int f1(T*, float) -{ - return 0; -} -} using f1_a::f1; - -namespace f1_b { -template -int f1(T*, int, typename T::int_* = 0) -{ - return 1; -} -} using f1_b::f1; - -namespace f2_a { -template -int f2(T*, float) -{ - return 2; -} -} using f2_a::f2; - -namespace f2_b { -template -typename T::int_ f2(T*, int) -{ - return 3; -} -} using f2_b::f2; - -struct test_t -{ - typedef int int_; -}; - -struct test2_t {}; - -int test() -{ - test_t* t = 0; - test2_t* t2 = 0; - bool correct = - (f1(t, 0) == 1) && - (f1(t2, 0) == 0) && - (f2(t, 0) == 3) && - (f2(t2, 0) == 2); - return !correct; -} - -} - - - diff --git a/libs/config/test/boost_no_sfinae_expr.ipp b/libs/config/test/boost_no_sfinae_expr.ipp deleted file mode 100644 index c3ce89e81..000000000 --- a/libs/config/test/boost_no_sfinae_expr.ipp +++ /dev/null @@ -1,37 +0,0 @@ -// (C) Copyright Mathias Gaunard 2009. -// 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/config for the most recent version. - -// MACRO: BOOST_NO_SFINAE_EXPR -// TITLE: SFINAE for expressions -// DESCRIPTION: SFINAE for expressions not supported. - -namespace boost_no_sfinae_expr -{ - -template -struct has_foo -{ - typedef char NotFound; - struct Found { char x[2]; }; - - template struct dummy {}; - - template static Found test(dummy< sizeof((*(X*)0).foo(), 0) >*); - template static NotFound test( ... ); - - static const bool value = (sizeof(Found) == sizeof(test(0))); -}; - -struct test1 {}; -struct test2 { void foo(); }; - -int test() -{ - return has_foo::value || !has_foo::value; -} - -} // namespace boost_no_sfinae_expr diff --git a/libs/config/test/boost_no_sstream.ipp b/libs/config/test/boost_no_sstream.ipp deleted file mode 100644 index 6d06b11a6..000000000 --- a/libs/config/test/boost_no_sstream.ipp +++ /dev/null @@ -1,29 +0,0 @@ -// (C) Copyright John Maddock 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/config for the most recent version. - -// MACRO: BOOST_NO_STRINGSTREAM -// TITLE: -// DESCRIPTION: The C++ implementation does not provide the header. - -#include -#include - -namespace boost_no_stringstream{ - -int test() -{ - std::stringstream ss; - ss << "abc"; - std::string s = ss.str(); - return (s != "abc"); -} - -} - - - - diff --git a/libs/config/test/boost_no_static_assert.ipp b/libs/config/test/boost_no_static_assert.ipp deleted file mode 100644 index 38ca2967f..000000000 --- a/libs/config/test/boost_no_static_assert.ipp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2007 Douglas Gregor -// 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/config for most recent version. - -// MACRO: BOOST_NO_CXX11_STATIC_ASSERT -// TITLE: C++0x static_assert unavailable -// DESCRIPTION: The compiler does not support C++0x static assertions - -namespace boost_no_cxx11_static_assert { - -int test() -{ - static_assert(true, "OK"); - return 0; -} - -} diff --git a/libs/config/test/boost_no_std_allocator.ipp b/libs/config/test/boost_no_std_allocator.ipp deleted file mode 100644 index d3badbd5d..000000000 --- a/libs/config/test/boost_no_std_allocator.ipp +++ /dev/null @@ -1,78 +0,0 @@ -// (C) Copyright John Maddock 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/config for the most recent version. - -// MACRO: BOOST_NO_STD_ALLOCATOR -// TITLE: std::allocator -// DESCRIPTION: The C++ standard library does not provide -// a standards conforming std::allocator. - -#ifndef BOOST_NESTED_TEMPLATE -#define BOOST_NESTED_TEMPLATE template -#endif - -#include - -namespace boost_no_std_allocator{ - -#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7))) -# define BOOST_UNUSED_ATTRIBUTE __attribute__((unused)) -#else -# define BOOST_UNUSED_ATTRIBUTE -#endif - -template -int test_allocator(const T& i) -{ - typedef std::allocator alloc1_t; - typedef typename alloc1_t::size_type size_type; - typedef typename alloc1_t::difference_type difference_type BOOST_UNUSED_ATTRIBUTE; - typedef typename alloc1_t::pointer pointer; - typedef typename alloc1_t::const_pointer const_pointer; - typedef typename alloc1_t::reference reference; - typedef typename alloc1_t::const_reference const_reference; - typedef typename alloc1_t::value_type value_type BOOST_UNUSED_ATTRIBUTE; - - typedef typename alloc1_t::BOOST_NESTED_TEMPLATE rebind binder_t; - typedef typename binder_t::other alloc2_t; - - alloc1_t a1; - alloc1_t a2(a1); - - pointer p = a1.allocate(1); - const_pointer cp = p; - a1.construct(p,i); - size_type s = a1.max_size(); - (void)s; - reference r = *p; - const_reference cr = *cp; - if(p != a1.address(r)) return -1; - if(cp != a1.address(cr)) return -1; - a1.destroy(p); - a1.deallocate(p,1); - - alloc2_t a3(a1); - // this chokes early versions of the MSL library - // and isn't currently required by anything in boost - // so don't test for now... - // a3 = a2; - - (void)a2; - return 0; -} - - -int test() -{ - return test_allocator(0); -} - -} - -#undef BOOST_UNUSED_ATTRIBUTE - - - diff --git a/libs/config/test/boost_no_std_distance.ipp b/libs/config/test/boost_no_std_distance.ipp deleted file mode 100644 index 93affff7a..000000000 --- a/libs/config/test/boost_no_std_distance.ipp +++ /dev/null @@ -1,31 +0,0 @@ -// (C) Copyright John Maddock 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/config for the most recent version. - -// MACRO: BOOST_NO_STD_DISTANCE -// TITLE: std::distance -// DESCRIPTION: The platform does not have a conforming version of std::distance. - -#include -#include - - -namespace boost_no_std_distance{ - -int test() -{ - const char* begin = 0; - const char* end = 0; - if(std::distance(begin, end)) return -1; - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_no_std_iter_traits.ipp b/libs/config/test/boost_no_std_iter_traits.ipp deleted file mode 100644 index 31a9394d5..000000000 --- a/libs/config/test/boost_no_std_iter_traits.ipp +++ /dev/null @@ -1,80 +0,0 @@ -// (C) Copyright John Maddock 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/config for the most recent version. - -// MACRO: BOOST_NO_STD_ITERATOR_TRAITS -// TITLE: std::iterator_traits -// DESCRIPTION: The compiler does not provide a standard -// compliant implementation of std::iterator_traits. -// Note that the compiler may still have a non-standard -// implementation. - -#include -#include - -namespace boost_no_std_iterator_traits{ - -struct UDT_iterator -{ - typedef int value_type; - typedef ptrdiff_t difference_type; - typedef int* pointer; - typedef int& reference; - typedef std::input_iterator_tag iterator_category; -}; - -struct UDT{}; - - -int test() -{ - std::iterator_traits::value_type v = 0; - std::iterator_traits::difference_type d = 0; - std::iterator_traits::pointer p = &v; - std::iterator_traits::reference r = v; - std::iterator_traits::iterator_category cat; - - std::iterator_traits::value_type v2; - std::iterator_traits::difference_type d2 = 0; - std::iterator_traits::pointer p2 = &v2; - std::iterator_traits::reference r2 = v2; - std::iterator_traits::iterator_category cat2; - - std::iterator_traits::value_type v3; - std::iterator_traits::difference_type d3 = 0; - std::iterator_traits::pointer p3 = &v3; - std::iterator_traits::reference r3 = v3; - std::iterator_traits::iterator_category cat3; - - // - // suppress some warnings: - // - (void) &v; - (void) &d; - (void) &p; - (void) &r; - (void) &cat; - - (void) &v2; - (void) &d2; - (void) &p2; - (void) &r2; - (void) &cat2; - - (void) &v3; - (void) &d3; - (void) &p3; - (void) &r3; - (void) &cat3; - - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_std_iterator.ipp b/libs/config/test/boost_no_std_iterator.ipp deleted file mode 100644 index e5332ef35..000000000 --- a/libs/config/test/boost_no_std_iterator.ipp +++ /dev/null @@ -1,67 +0,0 @@ -// (C) Copyright John Maddock 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/config for the most recent version. - -// MACRO: BOOST_NO_STD_ITERATOR -// TITLE: std::iterator -// DESCRIPTION: The C++ implementation fails to provide the -// std::iterator class. - -#include -#include - -namespace boost_no_std_iterator{ - - -int test() -{ - typedef std::iterator< - std::random_access_iterator_tag, - int, - ptrdiff_t, - int*, - int& - > iterator_type; - - iterator_type::value_type v = 0; - iterator_type::difference_type d = 0; - iterator_type::pointer p = &v; - iterator_type::reference r = v; - iterator_type::iterator_category cat; - - typedef std::iterator< - std::random_access_iterator_tag, - int - > iterator_type_2; - - iterator_type_2::value_type v2 = 0; - iterator_type_2::difference_type d2 = 0; - iterator_type_2::pointer p2 = &v2; - iterator_type_2::reference r2 = v2; - iterator_type_2::iterator_category cat2; - // - // suppress some warnings: - // - (void) &v; - (void) &d; - (void) &p; - (void) &r; - (void) &cat; - - (void) &v2; - (void) &d2; - (void) &p2; - (void) &r2; - (void) &cat2; - - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_std_locale.ipp b/libs/config/test/boost_no_std_locale.ipp deleted file mode 100644 index 29d8e3232..000000000 --- a/libs/config/test/boost_no_std_locale.ipp +++ /dev/null @@ -1,36 +0,0 @@ -// (C) Copyright John Maddock 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/config for the most recent version. - -// MACRO: BOOST_NO_STD_LOCALE -// TITLE: std::locale -// DESCRIPTION: The standard library lacks std::locale. - -#include - -namespace boost_no_std_locale{ - -int test() -{ - std::locale l1; - // - // ideally we would construct a locale from a facet, - // but that requires template member functions which - // may not be available, instead just check that we can - // construct a pointer to a facet: - // - const std::ctype* pct = 0; - (void) &l1; - (void) &pct; - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_no_std_messages.ipp b/libs/config/test/boost_no_std_messages.ipp deleted file mode 100644 index 3fbd6f07e..000000000 --- a/libs/config/test/boost_no_std_messages.ipp +++ /dev/null @@ -1,39 +0,0 @@ -// (C) Copyright John Maddock 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/config for the most recent version. - -// MACRO: BOOST_NO_STD_MESSAGES -// TITLE: std::messages -// DESCRIPTION: The standard library lacks a conforming std::messages facet. - -#include - - -namespace boost_no_std_messages{ - -// -// this just has to complile, not run: -// -void test_messages(const std::messages& m) -{ - static const std::locale l; - static const std::string name("foobar"); - m.close(m.open(name, l)); -} - -int test() -{ - const std::messages* pmf = 0; - (void) &pmf; - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_no_std_min_max.ipp b/libs/config/test/boost_no_std_min_max.ipp deleted file mode 100644 index a8260062b..000000000 --- a/libs/config/test/boost_no_std_min_max.ipp +++ /dev/null @@ -1,33 +0,0 @@ -// (C) Copyright John Maddock 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/config for the most recent version. - -// MACRO: BOOST_NO_STD_MIN_MAX -// TITLE: std::min and std::max -// DESCRIPTION: The C++ standard library does not provide -// the (min)() and (max)() template functions that -// should be in . - -#include - -namespace boost_no_std_min_max{ - - -int test() -{ - int i = 0; - int j = 2; - if((std::min)(i,j) != 0) return -1; - if((std::max)(i,j) != 2) return -1; - - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_std_oi_assign.ipp b/libs/config/test/boost_no_std_oi_assign.ipp deleted file mode 100644 index 9d5061442..000000000 --- a/libs/config/test/boost_no_std_oi_assign.ipp +++ /dev/null @@ -1,42 +0,0 @@ -// (C) Copyright John Maddock 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/config for the most recent version. - -// MACRO: BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN -// TITLE: That the std output iterators are assignable -// DESCRIPTION: Some std lib output iterators are not assignable -// even this is required by the standard. - -#include -#include -#include - - -namespace boost_no_std_output_iterator_assign { - -int test() -{ - std::list l; - std::back_insert_iterator > bi1(l); - std::back_insert_iterator > bi2(l); - bi1 = bi2; - - std::front_insert_iterator > fi1(l); - std::front_insert_iterator > fi2(l); - fi1 = fi2; - - std::ostream_iterator osi1(std::cout); - std::ostream_iterator osi2(std::cout); - osi1 = osi2; - - return 0; -} - -} - - - - diff --git a/libs/config/test/boost_no_std_typeinfo.ipp b/libs/config/test/boost_no_std_typeinfo.ipp deleted file mode 100644 index a55a94d81..000000000 --- a/libs/config/test/boost_no_std_typeinfo.ipp +++ /dev/null @@ -1,26 +0,0 @@ -// (C) Copyright Peter Dimov 2007. -// 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/config for most recent version. - -// MACRO: BOOST_NO_STD_TYPEINFO -// TITLE: type_info not in namespace std -// DESCRIPTION: The header declares type_info in the global namespace instead of std - -#include - -namespace boost_no_std_typeinfo -{ -void quiet_warning(const std::type_info*){} - -int test() -{ - std::type_info * p = 0; - quiet_warning(p); - return 0; -} - -} - diff --git a/libs/config/test/boost_no_std_use_facet.ipp b/libs/config/test/boost_no_std_use_facet.ipp deleted file mode 100644 index c207af7d3..000000000 --- a/libs/config/test/boost_no_std_use_facet.ipp +++ /dev/null @@ -1,29 +0,0 @@ -// (C) Copyright John Maddock 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/config for the most recent version. - -// MACRO: BOOST_NO_STD_USE_FACET -// TITLE: std::use_facet -// DESCRIPTION: The standard library lacks a conforming std::use_facet. - -#include - -namespace boost_no_std_use_facet{ - -int test() -{ - std::locale l; - const std::ctype& ct = std::use_facet >(l); - (void)ct; - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_no_std_wstreambuf.ipp b/libs/config/test/boost_no_std_wstreambuf.ipp deleted file mode 100644 index 45de2426f..000000000 --- a/libs/config/test/boost_no_std_wstreambuf.ipp +++ /dev/null @@ -1,108 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_STD_WSTREAMBUF -// TITLE: std::basic_streambuf -// DESCRIPTION: The standard library lacks std::basic_streambuf. - -#include -#include -#include - -namespace boost_no_std_wstreambuf{ - -template > -class parser_buf : public ::std::basic_streambuf -{ - typedef ::std::basic_streambuf base_type; - typedef typename base_type::int_type int_type; - typedef typename base_type::char_type char_type; - typedef typename base_type::pos_type pos_type; - typedef ::std::streamsize streamsize; - typedef typename base_type::off_type off_type; -public: - parser_buf() : base_type() { setbuf(0, 0); } - const charT* getnext() { return this->gptr(); } -protected: - std::basic_streambuf* setbuf(char_type* s, streamsize n); - typename parser_buf::pos_type seekpos(pos_type sp, ::std::ios_base::openmode which); - typename parser_buf::pos_type seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which); -private: - parser_buf& operator=(const parser_buf&) - { return *this; }; - parser_buf(const parser_buf&); -}; - -template -std::basic_streambuf* -parser_buf::setbuf(char_type* s, streamsize n) -{ - this->setg(s, s, s + n); - return this; -} - -template -typename parser_buf::pos_type -parser_buf::seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which) -{ - typedef typename parser_buf::pos_type pos_type; - if(which & ::std::ios_base::out) - return pos_type(off_type(-1)); - int size = this->egptr() - this->eback(); - int pos = this->gptr() - this->eback(); - charT* g = this->eback(); - switch((int)way) - { - case ::std::ios_base::beg: - if((off < 0) || (off > size)) - return pos_type(off_type(-1)); - else - this->setg(g, g + off, g + size); - case ::std::ios_base::end: - if((off < 0) || (off > size)) - return pos_type(off_type(-1)); - else - this->setg(g, g + size - off, g + size); - case ::std::ios_base::cur: - { - int newpos = pos + off; - if((newpos < 0) || (newpos > size)) - return pos_type(off_type(-1)); - else - this->setg(g, g + newpos, g + size); - } - } - return static_cast(this->gptr() - this->eback()); -} - -template -typename parser_buf::pos_type -parser_buf::seekpos(pos_type sp, ::std::ios_base::openmode which) -{ - if(which & ::std::ios_base::out) - return pos_type(off_type(-1)); - int size = this->egptr() - this->eback(); - charT* g = this->eback(); - if(off_type(sp) <= size) - { - this->setg(g, g + off_type(sp), g + size); - } - return pos_type(off_type(-1)); -} - - -int test() -{ - return 0; -} - -template class parser_buf; -template class parser_buf; - -} - diff --git a/libs/config/test/boost_no_std_wstring.ipp b/libs/config/test/boost_no_std_wstring.ipp deleted file mode 100644 index d79fd95fa..000000000 --- a/libs/config/test/boost_no_std_wstring.ipp +++ /dev/null @@ -1,28 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_STD_WSTRING -// TITLE: std::wstring -// DESCRIPTION: The standard library lacks std::wstring. - -#include - -namespace boost_no_std_wstring{ - -int test() -{ - std::wstring s; - if(*s.c_str() || (s.begin() != s.end()) || s.size() || (sizeof(std::wstring::value_type) != sizeof(wchar_t))) return -1; - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_no_stdc_namespace.ipp b/libs/config/test/boost_no_stdc_namespace.ipp deleted file mode 100644 index 3ff3f4948..000000000 --- a/libs/config/test/boost_no_stdc_namespace.ipp +++ /dev/null @@ -1,43 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_STDC_NAMESPACE -// TITLE: std:: namespace for C API's -// DESCRIPTION: The contents of C++ standard headers for C library -// functions (the headers) have not been placed -// in namespace std. This test is difficult - some libraries -// "fake" the std C functions by adding using declarations -// to import them into namespace std, unfortunately they don't -// necessarily catch all of them... - -#include -#include -#include - -#undef isspace -#undef isalpha -#undef ispunct - -namespace boost_no_stdc_namespace{ - - -int test() -{ - char c = 0; -#ifndef BOOST_NO_CTYPE_FUNCTIONS - (void)std::isspace(c); - (void)std::isalpha(c); - (void)std::ispunct(c); -#endif - (void)std::strlen(&c); - (void)std::clock(); - - return 0; -} - -} - diff --git a/libs/config/test/boost_no_swprintf.ipp b/libs/config/test/boost_no_swprintf.ipp deleted file mode 100644 index 4b3a460f8..000000000 --- a/libs/config/test/boost_no_swprintf.ipp +++ /dev/null @@ -1,31 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_SWPRINTF -// TITLE: swprintf -// DESCRIPTION: The platform does not have a conforming version of swprintf. - -#include -#include - - -namespace boost_no_swprintf{ - -int test() -{ - wchar_t buf[10]; - swprintf(buf, 10, L"%d", 10); - return 0; -} - -} - - - - - - diff --git a/libs/config/test/boost_no_tem_local_classes.ipp b/libs/config/test/boost_no_tem_local_classes.ipp deleted file mode 100644 index 876980ec3..000000000 --- a/libs/config/test/boost_no_tem_local_classes.ipp +++ /dev/null @@ -1,33 +0,0 @@ - -// Copyright (C) 2009-2012 Lorenzo Caminiti -// Distributed under the Boost Software License, Version 1.0 -// (see accompanying file LICENSE_1_0.txt or a copy at -// http://www.boost.org/LICENSE_1_0.txt) -// Home at http://www.boost.org/libs/config - -// MACRO: BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS -// TITLE: local classes as template parameters -// DESCRIPTION: Local classes cannot be passed as template parameters. - -// NOTE: Local classes cannot be passed as template parameters in C++03 (even -// if some C++03 compilers, like MSVC and older GCC, allow it). Local classes -// can instead be passed as template parameters in C++11 (see also N2657, note -// that this macro does not check if unnamed types can also be passed as -// template parameters but it is intentionally limited to local named classes -// because some non C++11 compilers might only support local named classes as -// template parameters which is still very useful to program local functors). -namespace boost_no_cxx11_local_class_template_parameters { - -template struct a { void use() {} }; -template void f(T) {} - -int test() { - class local_class {} local_obj; - a a1; - a1.use(); // Avoid unused variable warning. - f(local_obj); - return 0; -} - -} // namespace - diff --git a/libs/config/test/boost_no_template_aliases.ipp b/libs/config/test/boost_no_template_aliases.ipp deleted file mode 100644 index 90451e0ea..000000000 --- a/libs/config/test/boost_no_template_aliases.ipp +++ /dev/null @@ -1,22 +0,0 @@ -// (C) Copyright Beman Dawes 2009 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_TEMPLATE_ALIASES -// TITLE: C++0x template_aliases feature unavailable -// DESCRIPTION: The compiler does not support the C++0x template_aliases feature - -namespace boost_no_cxx11_template_aliases { - -using PINT = void (*)(int); // using plus C-style type - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_no_template_streams.ipp b/libs/config/test/boost_no_template_streams.ipp deleted file mode 100644 index bb24e132c..000000000 --- a/libs/config/test/boost_no_template_streams.ipp +++ /dev/null @@ -1,29 +0,0 @@ -// (C) Copyright John Maddock 2008. -// 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/config for most recent version. - -// MACRO: BOOST_NO_TEMPLATED_IOSTREAMS -// TITLE: basic_iostream<> -// DESCRIPTION: The platform supports "new style" templated iostreams. - -#include - - -namespace boost_no_templated_iostreams{ - -int test() -{ - std::basic_ostream >& osr = std::cout; - (void)osr; - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_no_template_template.ipp b/libs/config/test/boost_no_template_template.ipp deleted file mode 100644 index a07944524..000000000 --- a/libs/config/test/boost_no_template_template.ipp +++ /dev/null @@ -1,50 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_TEMPLATE_TEMPLATES -// TITLE: template template paramters. -// DESCRIPTION: Verify that template template parameters both work -// and can be deduced through a function call. - - -namespace boost_no_template_templates{ - - -template -class foo -{ -public: - foo(){}; - foo(const T&){}; - const foo& bar()const{ return *this; } - foo& operator=(const foo&){ return *this; } -}; - -template class U> -U sinhc_pi(const U x) -{ - return x.bar(); -} - - -int test() -{ - foo f1; - foo f2; - f1 = sinhc_pi(f1); - f2 = sinhc_pi(f2); - return 0; -} - - -} - - - - - - diff --git a/libs/config/test/boost_no_two_phase_lookup.ipp b/libs/config/test/boost_no_two_phase_lookup.ipp deleted file mode 100644 index 2c5419c8d..000000000 --- a/libs/config/test/boost_no_two_phase_lookup.ipp +++ /dev/null @@ -1,41 +0,0 @@ -// (C) Copyright Alisdair Meredith 2006. -// 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/config for most recent version. - -// MACRO: BOOST_NO_TWO_PHASE_NAME_LOOKUP -// TITLE: Two phase name lookup -// DESCRIPTION: If the compiler does not perform two phase name lookup - -namespace boost_no_two_phase_name_lookup { - -template< class T > -struct base { - int call() { - return 1; - } -}; - -int call() { - return 0; -} - -template< class T > -struct derived : base< T > { - int call_test() { - return call(); - } -}; - -int test() -{ - derived< int > d; - return d.call_test(); -} - -} - - - diff --git a/libs/config/test/boost_no_typeid.ipp b/libs/config/test/boost_no_typeid.ipp deleted file mode 100644 index 72dd4d3d2..000000000 --- a/libs/config/test/boost_no_typeid.ipp +++ /dev/null @@ -1,24 +0,0 @@ -// (C) Copyright Peter Dimov 2007. -// 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/config for most recent version. - -// MACRO: BOOST_NO_TYPEID -// TITLE: typeid unavailable -// DESCRIPTION: The compiler does not support typeid in this mode - -#include - -namespace boost_no_typeid -{ - -int test() -{ - (void)typeid(int); - return 0; -} - -} - diff --git a/libs/config/test/boost_no_typename_with_ctor.ipp b/libs/config/test/boost_no_typename_with_ctor.ipp deleted file mode 100644 index 6cf4da844..000000000 --- a/libs/config/test/boost_no_typename_with_ctor.ipp +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2008 N. Musatti -// 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/config for most recent version. - -// MACRO: BOOST_NO_TYPENAME_WITH_CTOR -// TITLE: Use of typename keyword with constructors -// DESCRIPTION: If the compiler rejects the typename keyword when calling -// the constructor of a dependent type - -namespace boost_no_typename_with_ctor { - -struct A {}; - -template -struct B { - typedef T type; -}; - -template -typename T::type f() { - return typename T::type(); -} - -int test() { - A a = f >(); - (void)a; - return 0; -} - -} - diff --git a/libs/config/test/boost_no_unicode_literals.ipp b/libs/config/test/boost_no_unicode_literals.ipp deleted file mode 100644 index d5ffa0cb5..000000000 --- a/libs/config/test/boost_no_unicode_literals.ipp +++ /dev/null @@ -1,29 +0,0 @@ -// (C) Copyright Beman Dawes 2008 - -// 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/config for more information. - -// MACRO: BOOST_NO_CXX11_UNICODE_LITERALS -// TITLE: C++0x unicode literals unavailable -// DESCRIPTION: The compiler does not support C++0x Unicode literals (N2442) - -namespace boost_no_cxx11_unicode_literals { - -template -void quiet_warning(const CharT*){} - -int test() -{ - const char* c8 = u8""; - const char16_t* c16 = u""; - const char32_t* c32 = U""; - quiet_warning(c8); - quiet_warning(c16); - quiet_warning(c32); - return 0; -} - -} diff --git a/libs/config/test/boost_no_unified_init.ipp b/libs/config/test/boost_no_unified_init.ipp deleted file mode 100644 index 428c8f43d..000000000 --- a/libs/config/test/boost_no_unified_init.ipp +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (C) 2011 John Maddock -// 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/config for most recent version. - -// MACRO: BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX -// TITLE: C++0x unified initialization syntax unavailable -// DESCRIPTION: The compiler does not support C++0x unified initialization syntax: see http://en.wikipedia.org/wiki/C%2B%2B0x#Uniform_initialization - -#include - -namespace boost_no_cxx11_unified_initialization_syntax { - -struct BasicStruct -{ - int x; - double y; -}; - -struct AltStruct -{ -public: - AltStruct(int x, double y) : x_{x}, y_{y} {} - int X() const { return x_; } - double Y() const { return y_; } -private: - int x_; - double y_; -}; - -struct IdString -{ - std::string name; - int identifier; - bool operator == (const IdString& other) - { - return identifier == other.identifier && name == other.name; - } -}; - -IdString get_string() -{ - return {"SomeName", 4}; //Note the lack of explicit type. -} - -int test() -{ - BasicStruct var1{5, 3.2}; - AltStruct var2{2, 4.3}; - (void) var1; - (void) var2; - - IdString id{"SomeName", 4}; - return id == get_string() ? 0 : 1; -} - -} diff --git a/libs/config/test/boost_no_using_breaks_adl.ipp b/libs/config/test/boost_no_using_breaks_adl.ipp deleted file mode 100644 index e44e285d9..000000000 --- a/libs/config/test/boost_no_using_breaks_adl.ipp +++ /dev/null @@ -1,73 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -// TITLE: broken ADL -// DESCRIPTION: Using declarations break argument dependent lookup -// (probably Borland specific), the fix is to use -// using namespace whatever; rather than -// using whatever::symbol;. - - -namespace boost_ns -{ - template - T* get_pointer(T* p) - { return p; } - - namespace inner2 - { - template - struct X {}; - - template - T* get_pointer(X) - { return 0; } - } -} - -namespace user_ns -{ - template - struct Y{}; - - template - T* get_pointer(user_ns::Y) - { return 0; } - - template - int f(T x) - { - // use this as a workaround: - //using namespace boost; - // this statement breaks ADL: - using boost_ns::get_pointer; // conforming compilers require - // this one to find the auto_ptr - // and T* overloads - return get_pointer(x) == 0; - } -} - -namespace boost_function_scope_using_declaration_breaks_adl{ - -int test() -{ - int i; - typedef void* pv; - i = user_ns::f(pv()); - i = user_ns::f(boost_ns::inner2::X()); - (void)i; - return 0; -} - -} - - - - - - diff --git a/libs/config/test/boost_no_using_decl_overld.ipp b/libs/config/test/boost_no_using_decl_overld.ipp deleted file mode 100644 index c0174636e..000000000 --- a/libs/config/test/boost_no_using_decl_overld.ipp +++ /dev/null @@ -1,33 +0,0 @@ -// (C) Copyright Eric Friedman 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) - -// MACRO: BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE -// TITLE: using declaration function overloads from a typename base -// DESCRIPTION: The compiler will not accept a using declaration -// that brings a function from a typename used as a base class -// into a derived class if functions of the same name -// are present in the derived class. - -namespace boost_no_using_declaration_overloads_from_typename_base { - -struct base -{ - static void f() { } -}; - -template -struct using_overloads_from_typename_base : Base -{ - using Base::f; - static T f(const T& t) { return t; } -}; - -int test() -{ - using_overloads_from_typename_base::f(); - return using_overloads_from_typename_base::f(0); -} - -} diff --git a/libs/config/test/boost_no_using_template.ipp b/libs/config/test/boost_no_using_template.ipp deleted file mode 100644 index 73e8b9f30..000000000 --- a/libs/config/test/boost_no_using_template.ipp +++ /dev/null @@ -1,47 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_USING_TEMPLATE -// TITLE: using template declarations -// DESCRIPTION: The compiler will not accept a using declaration -// that imports a class or function template -// into a named namespace. Probably Borland/MSVC6 specific. - -template -int global_foo(T) -{ - return 0; -} - -template -struct op -{ - friend op operator +(const op&, const op&) - { - return op(); - }; -}; - -namespace boost_no_using_template{ - -using ::global_foo; -using ::op; - -int test() -{ - boost_no_using_template::op a; - boost_no_using_template::op b; - a+b; - return boost_no_using_template::global_foo(0); -} - -} - - - - - diff --git a/libs/config/test/boost_no_variadic_macros.ipp b/libs/config/test/boost_no_variadic_macros.ipp deleted file mode 100644 index 50f60a72e..000000000 --- a/libs/config/test/boost_no_variadic_macros.ipp +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (C) 2010 Edward Diener -// 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/config for most recent version. - -// MACRO: BOOST_NO_CXX11_VARIADIC_MACROS -// TITLE: C++0x variadic macros unavailable -// DESCRIPTION: The compiler does not support C++0x variadic macros - -// This is a simple test - -#define TEST_VARIADIC_MACRO_SIMPLE(avalue,...) __VA_ARGS__ - -/* - - This is a more complicated test, which Steve Watanabe graciously - supplied, when I asked if it were possible to strip the parantheses - from a macro argument. I have changed the names somewhat to prevent - any common clashes with other macros in the config testing suite - by prepending to each macro name TEST_VARIADIC_MACRO_. - - You may find this test overdone and may want to remove it. - -*/ - -#define TEST_VARIADIC_MACRO_CAT(x, y) TEST_VARIADIC_MACRO_CAT_I(x, y) -#define TEST_VARIADIC_MACRO_CAT_I(x, y) x ## y - -#define TEST_VARIADIC_MACRO_APPLY(macro, args) TEST_VARIADIC_MACRO_APPLY_I(macro, args) -#define TEST_VARIADIC_MACRO_APPLY_I(macro, args) macro args - -#define TEST_VARIADIC_MACRO_STRIP_PARENS(x) TEST_VARIADIC_MACRO_EVAL((TEST_VARIADIC_MACRO_STRIP_PARENS_I x), x) -#define TEST_VARIADIC_MACRO_STRIP_PARENS_I(...) 1,1 - -#define TEST_VARIADIC_MACRO_EVAL(test, x) TEST_VARIADIC_MACRO_EVAL_I(test, x) -#define TEST_VARIADIC_MACRO_EVAL_I(test, x) TEST_VARIADIC_MACRO_MAYBE_STRIP_PARENS(TEST_VARIADIC_MACRO_TEST_ARITY test, x) - -#define TEST_VARIADIC_MACRO_TEST_ARITY(...) TEST_VARIADIC_MACRO_APPLY(TEST_VARIADIC_MACRO_TEST_ARITY_I, (__VA_ARGS__, 2, 1)) -#define TEST_VARIADIC_MACRO_TEST_ARITY_I(a,b,c,...) c - -#define TEST_VARIADIC_MACRO_MAYBE_STRIP_PARENS(cond, x) TEST_VARIADIC_MACRO_MAYBE_STRIP_PARENS_I(cond, x) -#define TEST_VARIADIC_MACRO_MAYBE_STRIP_PARENS_I(cond, x) TEST_VARIADIC_MACRO_CAT(TEST_VARIADIC_MACRO_MAYBE_STRIP_PARENS_, cond)(x) - -#define TEST_VARIADIC_MACRO_MAYBE_STRIP_PARENS_1(x) x -#define TEST_VARIADIC_MACRO_MAYBE_STRIP_PARENS_2(x) TEST_VARIADIC_MACRO_APPLY(TEST_VARIADIC_MACRO_MAYBE_STRIP_PARENS_2_I, x) -#define TEST_VARIADIC_MACRO_MAYBE_STRIP_PARENS_2_I(...) __VA_ARGS__ - -namespace boost_no_cxx11_variadic_macros { - -void quiet_warning(int){} - -template struct test_variadic_macro_class {}; - -int test() -{ - - int x = TEST_VARIADIC_MACRO_STRIP_PARENS(3); - quiet_warning(x); - return 0; -} - -} diff --git a/libs/config/test/boost_no_variadic_templates.ipp b/libs/config/test/boost_no_variadic_templates.ipp deleted file mode 100644 index 570e8f2e1..000000000 --- a/libs/config/test/boost_no_variadic_templates.ipp +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (C) 2007 Douglas Gregor -// 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/config for most recent version. - -// MACRO: BOOST_NO_CXX11_VARIADIC_TEMPLATES -// TITLE: C++0x variadic templates unavailable -// DESCRIPTION: The compiler does not support C++0x variadic templates - -namespace boost_no_cxx11_variadic_templates { - -template struct tuple {}; - -int test() -{ - return 0; -} - -} diff --git a/libs/config/test/boost_no_void_returns.ipp b/libs/config/test/boost_no_void_returns.ipp deleted file mode 100644 index 920c44bfa..000000000 --- a/libs/config/test/boost_no_void_returns.ipp +++ /dev/null @@ -1,34 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_VOID_RETURNS -// TITLE: no void returns -// DESCRIPTION: The compiler does not allow a void function -// to return the result of calling another void -// function. -// -// void f() {} -// void g() { return f(); } - - -namespace boost_no_void_returns{ - -void f() {} - -void g() { return f(); } - -int test() -{ - return 0; -} - -} - - - - - diff --git a/libs/config/test/boost_no_wchar_t.ipp b/libs/config/test/boost_no_wchar_t.ipp deleted file mode 100644 index 8a9825845..000000000 --- a/libs/config/test/boost_no_wchar_t.ipp +++ /dev/null @@ -1,45 +0,0 @@ -// (C) Copyright John Maddock 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/config for most recent version. - -// MACRO: BOOST_NO_INTRINSIC_WCHAR_T -// TITLE: intrinsic wchar_t -// DESCRIPTION: The C++ implementation does not provide wchar_t, -// or it is really a synonym for another integral type. -// Use this symbol to decide whether it is appropriate -// to explicitly specialize a template on wchar_t if there -// is already a specialization for other integer types. - -#ifndef BOOST_NO_CWCHAR -#include -#endif - -namespace boost_no_intrinsic_wchar_t{ - -template -struct is_int{ int i; }; - -template <> struct is_int{ int i; }; -template <> struct is_int{ int i; }; -template <> struct is_int{ int i; }; -template <> struct is_int{ int i; }; -template <> struct is_int{ int i; }; -template <> struct is_int{ int i; }; -template <> struct is_int{ int i; }; -template <> struct is_int{ int i; }; -template <> struct is_int{ int i; }; -template <> struct is_int{ int i; }; - -int test() -{ - return 0; -} - -} - - - - diff --git a/libs/config/test/cmd_line_check.cpp b/libs/config/test/cmd_line_check.cpp deleted file mode 100644 index 33dff6466..000000000 --- a/libs/config/test/cmd_line_check.cpp +++ /dev/null @@ -1,9 +0,0 @@ - -#ifndef __clang__ -# error "This test is for Clang only" -#endif - -int main() -{ - return 0; -} \ No newline at end of file diff --git a/libs/config/test/config_build_check.cpp b/libs/config/test/config_build_check.cpp deleted file mode 100644 index b95d1c5ea..000000000 --- a/libs/config/test/config_build_check.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright John Maddock 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/config for the most recent version.// -// Revision $Id$ -// - -# include "../test/boost_has_int128.ipp" -# include "../test/boost_no_constexpr.ipp" -# include "../test/boost_no_cxx11_user_lit.ipp" - -int main( int, char *[] ) -{ - return boost_has_int128::test() || boost_no_cxx11_constexpr::test() || boost_no_cxx11_user_defined_literals::test(); -} - diff --git a/libs/config/test/config_info.cpp b/libs/config/test/config_info.cpp deleted file mode 100644 index 53251d28d..000000000 --- a/libs/config/test/config_info.cpp +++ /dev/null @@ -1,1186 +0,0 @@ -// Boost config.hpp configuration test program file -----------------------// - -// (C) Copyright John Maddock 2001 - 2003. -// (C) Copyright Jens Maurer 2001. -// (C) Copyright Peter Dimov 2001. -// (C) Copyright Darin Adler 2001. -// (C) Copyright Beman Dawes 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/config for most recent version. -// -// Revision $Id$ -// - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef BOOST_HAS_UNISTD_H -#include -#endif - -#if defined(__MINGW32__) -# include <_mingw.h> -#endif - -static unsigned int indent = 4; -static unsigned int width = 40; - -using std::cout; -using std::istream; - -void print_macro(const char* name, const char* value) -{ - // if name == value+1 then then macro is not defined, - // in which case we don't print anything: - if(0 != strcmp(name, value+1)) - { - for(unsigned i = 0; i < indent; ++i) std::cout.put(' '); - std::cout << std::setw(width); - cout.setf(istream::left, istream::adjustfield); - std::cout << name; - if(value[1]) - { - // macro has a value: - std::cout << value << "\n"; - } - else - { - // macro is defined but has no value: - std::cout << " [no value]\n"; - } - } -} - -#define PRINT_MACRO(X) print_macro(#X, BOOST_STRINGIZE(=X)) - -template -void print_expression(const char* expression, T val) -{ - for(unsigned i = 0; i < indent; ++i) std::cout.put(' '); - std::cout << std::setw(width); - std::cout.setf(istream::left, istream::adjustfield); - std::cout << expression << "=" << val << std::endl; -} - -#define PRINT_EXPRESSION(E) print_expression(#E, E); - -template -void print_byte_order(const char* what, T /* t */ ) -{ - T val = 0; - unsigned i; - for(i = 1; i < sizeof(T); ++i) - { - val |= (CHAR_BIT * static_cast(i)) << (CHAR_BIT * static_cast(i)); - } - const char* p = reinterpret_cast(&val); - - for(i = 0; i < indent; ++i) std::cout.put(' '); - std::cout << std::setw(width); - std::cout.setf(istream::left, istream::adjustfield); - std::cout << what << "="; - for(i = 0; i < sizeof(T); ++i) - { - std::cout << (int)p[i] << " "; - } - std::cout << std::endl; -} - -#define PRINT_ORDER(T) print_byte_order(BOOST_STRINGIZE(byte order for type T), T()) - -template -void print_sign(const char* what, T t) -{ - t = static_cast(-1); // cast suppresses warnings - for(unsigned i = 0; i < indent; ++i) std::cout.put(' '); - std::cout << "Type " << what << " is " << ((t > 0) ? "unsigned" : "signed") << std::endl; -} - -#define PRINT_SIGN(T) print_sign(#T, T()) - - -void print_compiler_macros() -{ - std::cout << BOOST_COMPILER << "\n"; - // Borland options: - PRINT_MACRO(__BORLANDC__); - PRINT_MACRO(__CDECL__); - PRINT_MACRO(_CHAR_UNSIGNED); - PRINT_MACRO(__CODEGUARD__); - PRINT_MACRO(__CONSOLE__); - PRINT_MACRO(_CPPUNWIND); - PRINT_MACRO(__cplusplus); - PRINT_MACRO(__FLAT__); - PRINT_MACRO(__FUNC__); - PRINT_MACRO(_M_IX86); - PRINT_MACRO(__MSDOS__); - PRINT_MACRO(__MT__ ); - PRINT_MACRO(__PASCAL__); - PRINT_MACRO(__STDC__); - PRINT_MACRO(__TLS__); - PRINT_MACRO(_WCHAR_T); - PRINT_MACRO(_Windows); - PRINT_MACRO(__WIN32__); - PRINT_MACRO(_WIN32); - PRINT_MACRO(_WIN64); - PRINT_MACRO(_WIN32_WCE); - PRINT_MACRO(WIN32); - PRINT_MACRO(_RTLDLL); - PRINT_MACRO(__DEBUG); - -// Internal MSVC 7 error workaround (Peter Dimov) - -#ifndef _NATIVE_WCHAR_T_DEFINED - PRINT_MACRO(_WCHAR_T_DEFINED); -#endif - // MSVC macros: - PRINT_MACRO(_CPPRTTI); - PRINT_MACRO(_DLL); - PRINT_MACRO(_M_ALPHA); - PRINT_MACRO(_M_MPPC); - PRINT_MACRO(_M_MRX000); - PRINT_MACRO(_M_PPC); - PRINT_MACRO(_MFC_VER); - PRINT_MACRO(_MSC_EXTENSIONS); - PRINT_MACRO(_MSC_VER); - PRINT_MACRO(_MSC_FULL_VER); - PRINT_MACRO(_MT); - PRINT_MACRO(_NATIVE_WCHAR_T_DEFINED); - // GNUC options: - PRINT_MACRO(__GNUC__); - PRINT_MACRO(__GNUC_MINOR__); - PRINT_MACRO(__GNUC_PATCHLEVEL__); - PRINT_MACRO(__STDC_VERSION__); - PRINT_MACRO(__GNUG__); - PRINT_MACRO(__STRICT_ANSI__); - PRINT_MACRO(__GXX_EXPERIMENTAL_CXX0X__); - PRINT_MACRO(__VERSION__); - PRINT_MACRO(__OPTIMIZE__); - PRINT_MACRO(__CHAR_UNSIGNED__); - PRINT_MACRO(__REGISTER_PREFIX__); - PRINT_MACRO(__USER_LABEL_PREFIX__); - PRINT_MACRO(__GNUPRO__); - PRINT_MACRO(__EXCEPTIONS); - PRINT_MACRO(__FreeBSD__); - PRINT_MACRO(__FreeBSD_cc_version); - PRINT_MACRO(__ELF__); - PRINT_MACRO(__GNUPRO__); - PRINT_MACRO(unix); - PRINT_MACRO(bsd); - PRINT_MACRO(vax); - PRINT_MACRO(mc68000); - PRINT_MACRO(m68k); - PRINT_MACRO(M68020); - PRINT_MACRO(_AM29K); - PRINT_MACRO(ns32000); - PRINT_MACRO(sun); - PRINT_MACRO(pyr); - PRINT_MACRO(sequent); - PRINT_MACRO(__i386__); - PRINT_MACRO(__sparc); - PRINT_MACRO(__sparc__); - PRINT_MACRO(__powerpc__); - PRINT_MACRO(__hppa); - PRINT_MACRO(__CYGWIN__); - PRINT_MACRO(__MINGW32__); - PRINT_MACRO(__GXX_RTTI); - // HP aCC: - PRINT_MACRO(__HP_aCC); - PRINT_MACRO(_HPACC_); - PRINT_MACRO(__LP64__); - PRINT_MACRO(__RISC2_0__); - PRINT_MACRO(__STDCPP__); - PRINT_MACRO(__hppa); - PRINT_MACRO(__hpux); - PRINT_MACRO(__hp9000s800); - PRINT_MACRO(__hp9000s700); - PRINT_MACRO(_PA_RISC1_1); - PRINT_MACRO(__HPUX_SOURCE); - PRINT_MACRO(_INCLUDE__STDC_A1_SOURCE); - // SGI IRIX: - PRINT_MACRO(__sgi); - PRINT_MACRO(_COMPILER_VERSION); - // Sunpro: - PRINT_MACRO(__SUNPRO_CC); - PRINT_MACRO(__SUNPRO_CC_COMPAT); - PRINT_MACRO(__BUILTIN_VA_ARG_INCR); - PRINT_MACRO(__sun); - PRINT_MACRO(__SVR4); - PRINT_MACRO(__unix); - PRINT_MACRO(__sparcv9); - PRINT_MACRO(__i386); - PRINT_MACRO(i386); - // Metrowerks - PRINT_MACRO(__MWERKS__); - PRINT_MACRO(__MSL__); - PRINT_MACRO(__MSL_CPP__); - PRINT_MACRO(__A5__); - PRINT_MACRO(__embedded_cplusplus); - PRINT_MACRO(__fourbyteints__); - PRINT_MACRO(__IEEEdoubles__); - PRINT_MACRO(__MC68K__); - PRINT_MACRO(__MC68020__); - PRINT_MACRO(__MC68881__); - PRINT_MACRO(__MIPS__); - PRINT_MACRO(__MIPS_ISA2__); - PRINT_MACRO(__MIPS_ISA3__); - PRINT_MACRO(__MIPS_ISA4__); - PRINT_MACRO(__MWBROWSER__); - PRINT_MACRO(__profile__); - PRINT_MACRO(__powerc); - PRINT_MACRO(_powerc); - PRINT_MACRO(__POWERPC__); - PRINT_MACRO(macintosh); - PRINT_MACRO(__MACH__); - PRINT_MACRO(__APPLE__); - PRINT_MACRO(__APPLE_CC__); - // MPW (MrCpp and SCpp) - PRINT_MACRO(__MRC__); - PRINT_MACRO(__SC__); - PRINT_MACRO(__FPCE__); - PRINT_MACRO(__FPCE_IEEE__); - PRINT_MACRO(MPW_CPLUS); - PRINT_MACRO(MPW_C); - PRINT_MACRO(__MC601); - PRINT_MACRO(__POWERPC); - PRINT_MACRO(__useAppleExts__); - PRINT_MACRO(powerc); - PRINT_MACRO(MC68000); - PRINT_MACRO(THINK_PLUS); - PRINT_MACRO(mc68881); - PRINT_MACRO(__FAR_CODE__); - PRINT_MACRO(__FAR_DATA__); - PRINT_MACRO(__CFM68K__); - // EDG - PRINT_MACRO(__EDG__); - PRINT_MACRO(__EDG_VERSION__); - PRINT_MACRO(c_plusplus); // indication for strict mode - PRINT_MACRO(_BOOL); - PRINT_MACRO(_EXPLICIT); - PRINT_MACRO(__SIGNED_CHARS__); - PRINT_MACRO(_TYPENAME); - PRINT_MACRO(_WCHAR_T); - PRINT_MACRO(__ARRAY_OPERATORS); - PRINT_MACRO(__EDG_ABI_COMPATIBILITY_VERSION); - PRINT_MACRO(__EDG_IMPLICIT_USING_STD); - PRINT_MACRO(__EDG_RUNTIME_USES_NAMESPACES); - PRINT_MACRO(__BOOL_DEFINED); - PRINT_MACRO(__RTTI); - PRINT_MACRO(__PLACEMENT_DELETE); - PRINT_MACRO(__NO_LONG_LONG); - - // Intel options: - PRINT_MACRO(__INTEL__); - PRINT_MACRO(__ICC); - PRINT_MACRO(__ICL); - PRINT_MACRO(__ECC); - PRINT_MACRO(__INTEL_COMPILER); - PRINT_MACRO(__INITIAL_POINTER_SIZE); - PRINT_MACRO(_INTEGRAL_MAX_BITS); - PRINT_MACRO(__INTEL_COMPILER_BUILD_DATE); - PRINT_MACRO(__INTEL_MS_COMPAT_LEVEL); - PRINT_MACRO(__LONG_DOUBLE_SIZE__); - PRINT_MACRO(_M_X64); - PRINT_MACRO(_OPENMP); - PRINT_MACRO(_OPENMPT); - PRINT_MACRO(_PGO_INSTRUMENT); - PRINT_MACRO(__QMSPP_); - PRINT_MACRO(__INTEL_RTTI__); - PRINT_MACRO(__INTEL_CXX11_MODE__); - - // Cray options: - PRINT_MACRO(_CRAYC); - PRINT_MACRO(_RELEASE); - PRINT_MACRO(cray); - PRINT_MACRO(CRAY); - PRINT_MACRO(CRAY1); - PRINT_MACRO(_CRAY1); - PRINT_MACRO(_CRAYMPP); - PRINT_MACRO(_CRAYT3E); - PRINT_MACRO(_CRAYIEEE); - PRINT_MACRO(_ADDR32); - PRINT_MACRO(_ADDR64); - PRINT_MACRO(_LD64); - PRINT_MACRO(_FASTMD); - PRINT_MACRO(_MAXVL); - - // misc compilers not covered so far: - PRINT_MACRO(__USLC__); - PRINT_MACRO(__DECCXX); - PRINT_MACRO(__IBMCPP__); - PRINT_MACRO(_REENTRANT); - PRINT_MACRO(_PTHREADS); - PRINT_MACRO(__STDC_HOSTED__); - PRINT_MACRO(__COMO__); - PRINT_MACRO(__COMO_VERSION__); - PRINT_MACRO(__DM__); - PRINT_MACRO(__osf__); - PRINT_MACRO(__OSF__); - PRINT_MACRO(__QNXNTO__); - PRINT_MACRO(__QNX__); - PRINT_MACRO(_NTO_VERSION); - PRINT_MACRO(__OPEN64__); - PRINT_MACRO(__open64); - PRINT_MACRO(__NVCC__); - PRINT_MACRO(__CUDACC__); - PRINT_MACRO(__CUDACC_RDC__); - PRINT_MACRO(__CUDACC_VER_MAJOR__); - PRINT_MACRO(__CUDACC_VER_MINOR__); - PRINT_MACRO(__CUDACC_VER_BUILD__); - PRINT_MACRO(__CUDACC_VER__); -} - -void print_stdlib_macros() -{ - std::cout << BOOST_STDLIB << std::endl; - #ifdef _RWSTD_VER - // Rogue Wave 2.x config options: - PRINT_MACRO(__NO_EDG_EXCEPTION_CLASSES); - PRINT_MACRO(_RWSTD_ALLOCATOR); - PRINT_MACRO(_RWSTD_BAD_ALLOC_DEFINED); - PRINT_MACRO(_RWSTD_BAD_EXCEPTION_DEFINED); - PRINT_MACRO(_RWSTD_BOUNDS_CHECKING); - PRINT_MACRO(_RWSTD_COMPILE_INSTANTIATE); - PRINT_MACRO(_RWSTD_DEFAULT_PRECISION); - PRINT_MACRO(_RWSTD_EXCEPTION_DEFINED); - PRINT_MACRO(_RWSTD_EXCEPTION_HANDLER_IN_STD); - PRINT_MACRO(_RWSTD_EXCEPTION_PREDEFINED); - PRINT_MACRO(_RWSTD_FLT_ROUNDS_IS_CONSTANT); - PRINT_MACRO(_RWSTD_LOCALIZED_ERRORS); - PRINT_MACRO(_RWSTD_MESSAGE); - PRINT_MACRO(_RWSTD_MUTEXATTR_DEFAULT); - PRINT_MACRO(_RWSTD_NO_ANSI_SPRINTF); - PRINT_MACRO(_RWSTD_NO_ARG_MATCH); - PRINT_MACRO(_RWSTD_NO_BAD_CAST); - PRINT_MACRO(_RWSTD_NO_BASE_CLASS_MATCH); - PRINT_MACRO(_RWSTD_NO_BOOL); - PRINT_MACRO(_RWSTD_NO_BUILTIN_CTOR); - PRINT_MACRO(_RWSTD_NO_CATOPEN_CATGETS); - PRINT_MACRO(_RWSTD_NO_CLASS_PARTIAL_SPEC); - PRINT_MACRO(_RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES); - PRINT_MACRO(_RWSTD_NO_COMPLICATED_EXCEPTIONS); - PRINT_MACRO(_RWSTD_NO_COMPLICATED_TYPEDEF); - PRINT_MACRO(_RWSTD_NO_CONST_INST); - PRINT_MACRO(_RWSTD_NO_CTOR_RETURN); - PRINT_MACRO(_RWSTD_NO_DEFAULT_FOR_TPARAM); - PRINT_MACRO(_RWSTD_NO_DEFAULT_TEMPLATE_ARGS); - PRINT_MACRO(_RWSTD_NO_DESTROY_BUILTIN); - PRINT_MACRO(_RWSTD_NO_DESTROY_NONBUILTIN); - PRINT_MACRO(_RWSTD_NO_EMBEDDED_TYPEDEF); - PRINT_MACRO(_RWSTD_NO_EX_SPEC); - PRINT_MACRO(_RWSTD_NO_EXCEPTIONS); - PRINT_MACRO(_RWSTD_NO_EXPLICIT); - PRINT_MACRO(_RWSTD_NO_EXPLICIT_ARG); - PRINT_MACRO(_RWSTD_NO_EXPLICIT_FUNC_INSTANTIATION); - PRINT_MACRO(_RWSTD_NO_EXPLICIT_INSTANTIATION); - PRINT_MACRO(_RWSTD_NO_EXTENSION); - PRINT_MACRO(_RWSTD_NO_FORWARD_SPECIALIZATIONS); - PRINT_MACRO(_RWSTD_NO_FPOS_T); - PRINT_MACRO(_RWSTD_NO_FRIEND_TEMPLATES); - PRINT_MACRO(_RWSTD_NO_FUNC_PARTIAL_SPEC); - PRINT_MACRO(_RWSTD_NO_GETTIMEOFDAY); - PRINT_MACRO(_RWSTD_NO_GLOBAL_TZ); - PRINT_MACRO(_RWSTD_NO_INHERITED_TYPEDEFS); - PRINT_MACRO(_RWSTD_NO_INIT_CONST_TEMPLATE_REF_ARG); - PRINT_MACRO(_RWSTD_NO_INT_TYPEDEF); - PRINT_MACRO(_RWSTD_NO_LDIV); - PRINT_MACRO(_RWSTD_NO_LEADING_UNDERSCORE); - PRINT_MACRO(_RWSTD_NO_LOCALE); - PRINT_MACRO(_RWSTD_NO_LONG_NAME); - PRINT_MACRO(_RWSTD_NO_LONGDOUBLE); - PRINT_MACRO(_RWSTD_NO_MBSTATE_T); - PRINT_MACRO(_RWSTD_NO_MEM_CLASS_TEMPLATES); - PRINT_MACRO(_RWSTD_NO_MEMBER_TEMPLATES); - PRINT_MACRO(_RWSTD_NO_MEMBER_TYPE_TPARAM); - PRINT_MACRO(_RWSTD_NO_MEMBER_WO_DEF_CTOR); - PRINT_MACRO(_RWSTD_NO_MEMMOVE); - PRINT_MACRO(_RWSTD_NO_MULTI_DIM_ARRAY); - PRINT_MACRO(_RWSTD_NO_MUTABLE); - PRINT_MACRO(_RWSTD_NO_NAME_INJECTION); - PRINT_MACRO(_RWSTD_NO_NAMESPACE); - PRINT_MACRO(_RWSTD_NO_NESTING_TEMPLATES); - PRINT_MACRO(_RWSTD_NO_NEW_BRACKETS); - PRINT_MACRO(_RWSTD_NO_NEW_DECL); - PRINT_MACRO(_RWSTD_NO_NEW_HEADER); - PRINT_MACRO(_RWSTD_NO_NEW_TEMPLATE_SYNTAX); - PRINT_MACRO(_RWSTD_NO_NONCLASS_ARROW_RETURN); - PRINT_MACRO(_RWSTD_NO_NONTYPE_ARGS); - PRINT_MACRO(_RWSTD_NO_ONLY_NEEDED_INSTANTIATION); - PRINT_MACRO(_RWSTD_NO_OVERLOAD_C_POW); - PRINT_MACRO(_RWSTD_NO_OVERLOAD_OF_TEMPLATE_FUNCTION); - PRINT_MACRO(_RWSTD_NO_OVERLOAD_WCHAR); - PRINT_MACRO(_RWSTD_NO_PART_SPEC_OVERLOAD); - PRINT_MACRO(_RWSTD_NO_RET_TEMPLATE); - PRINT_MACRO(_RWSTD_NO_SIMPLE_DEFAULT_TEMPLATES); - PRINT_MACRO(_RWSTD_NO_STATIC_CAST); - PRINT_MACRO(_RWSTD_NO_STATIC_DEF); - PRINT_MACRO(_RWSTD_NO_STATIC_DEF2); - PRINT_MACRO(_RWSTD_NO_STATIC_DEF3); - PRINT_MACRO(_RWSTD_NO_STATIC_MEM_DEF); - PRINT_MACRO(_RWSTD_NO_STI_SIMPLE); - PRINT_MACRO(_RWSTD_NO_STI_TEMPLATE); - PRINT_MACRO(_RWSTD_NO_STREAM_LONG_DOUBLE); - PRINT_MACRO(_RWSTD_NO_STRFTIME_CAPC); - PRINT_MACRO(_RWSTD_NO_STRICT_TEMPLATE_INSTANTIATE); - PRINT_MACRO(_RWSTD_NO_SWPRINTF); - PRINT_MACRO(_RWSTD_NO_TEMPLATE_ON_RETURN_TYPE); - PRINT_MACRO(_RWSTD_NO_TEMPLATE_TEMPLATE); - PRINT_MACRO(_RWSTD_NO_THREADS); - PRINT_MACRO(_RWSTD_NO_THROW_SPEC_ON_NEW); - PRINT_MACRO(_RWSTD_NO_THROW_WITH_SHARED); - PRINT_MACRO(_RWSTD_NO_TYPEDEF_INST); - PRINT_MACRO(_RWSTD_NO_TYPEDEF_OVERLOAD); - PRINT_MACRO(_RWSTD_NO_TYPENAME); - PRINT_MACRO(_RWSTD_NO_UNDEFINED_FRIEND); - PRINT_MACRO(_RWSTD_NO_UNINITIALIZED_STATIC_DEF); - PRINT_MACRO(_RWSTD_NO_WCHAR_H); - PRINT_MACRO(_RWSTD_NO_WCTYPE_H); - PRINT_MACRO(_RWSTD_NO_WIDE_CHAR); - PRINT_MACRO(_RWSTD_NO_WINT_TYPE); - PRINT_MACRO(_RWSTD_NO_WSTR); - PRINT_MACRO(_RWSTD_NOT_ALL_WSTR_CFUNCTIONS); - PRINT_MACRO(_RWSTD_POSIX_D10_THREADS); - PRINT_MACRO(_RWSTD_POSIX_THREADS); - PRINT_MACRO(_RWSTD_REQUIRES_IEEEFP); - PRINT_MACRO(_RWSTD_SOLARIS_THREADS); - PRINT_MACRO(_RWSTD_STRUCT_TM_TZ); - PRINT_MACRO(_RWSTD_WIDE_STRING_NULL_PROBLEM); - #elif defined(__STD_RWCOMPILER_H__) - // Rogue Wave 1.x std lib: - PRINT_MACRO(__NO_EDG_EXCEPTION_CLASSES); - PRINT_MACRO(RWSTD_ALLOCATOR); - PRINT_MACRO(RWSTD_BAD_ALLOC_DEFINED); - PRINT_MACRO(RWSTD_BAD_EXCEPTION_DEFINED); - PRINT_MACRO(RWSTD_BOUNDS_CHECKING); - PRINT_MACRO(RWSTD_COMPILE_INSTANTIATE); - PRINT_MACRO(RWSTD_DEFAULT_PRECISION); - PRINT_MACRO(RWSTD_EXCEPTION_DEFINED); - PRINT_MACRO(RWSTD_EXCEPTION_HANDLER_IN_STD); - PRINT_MACRO(RWSTD_EXCEPTION_PREDEFINED); - PRINT_MACRO(RWSTD_FLT_ROUNDS_IS_CONSTANT); - PRINT_MACRO(RWSTD_LOCALIZED_ERRORS); - PRINT_MACRO(RWSTD_MESSAGE); - PRINT_MACRO(RWSTD_MUTEXATTR_DEFAULT); - PRINT_MACRO(RWSTD_NO_ANSI_SPRINTF); - PRINT_MACRO(RWSTD_NO_ARG_MATCH); - PRINT_MACRO(RWSTD_NO_BAD_CAST); - PRINT_MACRO(RWSTD_NO_BASE_CLASS_MATCH); - PRINT_MACRO(RWSTD_NO_BOOL); - PRINT_MACRO(RWSTD_NO_BUILTIN_CTOR); - PRINT_MACRO(RWSTD_NO_CATOPEN_CATGETS); - PRINT_MACRO(RWSTD_NO_CLASS_PARTIAL_SPEC); - PRINT_MACRO(RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES); - PRINT_MACRO(RWSTD_NO_COMPLICATED_EXCEPTIONS); - PRINT_MACRO(RWSTD_NO_COMPLICATED_TYPEDEF); - PRINT_MACRO(RWSTD_NO_CONST_INST); - PRINT_MACRO(RWSTD_NO_CTOR_RETURN); - PRINT_MACRO(RWSTD_NO_DEFAULT_FOR_TPARAM); - PRINT_MACRO(RWSTD_NO_DEFAULT_TEMPLATE_ARGS); - PRINT_MACRO(RWSTD_NO_DESTROY_BUILTIN); - PRINT_MACRO(RWSTD_NO_DESTROY_NONBUILTIN); - PRINT_MACRO(RWSTD_NO_EMBEDDED_TYPEDEF); - PRINT_MACRO(RWSTD_NO_EX_SPEC); - PRINT_MACRO(RWSTD_NO_EXCEPTIONS); - PRINT_MACRO(RWSTD_NO_EXPLICIT); - PRINT_MACRO(RWSTD_NO_EXPLICIT_ARG); - PRINT_MACRO(RWSTD_NO_EXPLICIT_FUNC_INSTANTIATION); - PRINT_MACRO(RWSTD_NO_EXPLICIT_INSTANTIATION); - PRINT_MACRO(RWSTD_NO_EXTENSION); - PRINT_MACRO(RWSTD_NO_FORWARD_SPECIALIZATIONS); - PRINT_MACRO(RWSTD_NO_FPOS_T); - PRINT_MACRO(RWSTD_NO_FRIEND_TEMPLATES); - PRINT_MACRO(RWSTD_NO_FUNC_PARTIAL_SPEC); - PRINT_MACRO(RWSTD_NO_GETTIMEOFDAY); - PRINT_MACRO(RWSTD_NO_GLOBAL_TZ); - PRINT_MACRO(RWSTD_NO_INHERITED_TYPEDEFS); - PRINT_MACRO(RWSTD_NO_INIT_CONST_TEMPLATE_REF_ARG); - PRINT_MACRO(RWSTD_NO_INT_TYPEDEF); - PRINT_MACRO(RWSTD_NO_LDIV); - PRINT_MACRO(RWSTD_NO_LEADING_UNDERSCORE); - PRINT_MACRO(RWSTD_NO_LOCALE); - PRINT_MACRO(RWSTD_NO_LONG_NAME); - PRINT_MACRO(RWSTD_NO_LONGDOUBLE); - PRINT_MACRO(RWSTD_NO_MBSTATE_T); - PRINT_MACRO(RWSTD_NO_MEM_CLASS_TEMPLATES); - PRINT_MACRO(RWSTD_NO_MEMBER_TEMPLATES); - PRINT_MACRO(RWSTD_NO_MEMBER_TYPE_TPARAM); - PRINT_MACRO(RWSTD_NO_MEMBER_WO_DEF_CTOR); - PRINT_MACRO(RWSTD_NO_MEMMOVE); - PRINT_MACRO(RWSTD_NO_MULTI_DIM_ARRAY); - PRINT_MACRO(RWSTD_NO_MUTABLE); - PRINT_MACRO(RWSTD_NO_NAME_INJECTION); - PRINT_MACRO(RWSTD_NO_NAMESPACE); - PRINT_MACRO(RWSTD_NO_NESTING_TEMPLATES); - PRINT_MACRO(RWSTD_NO_NEW_BRACKETS); - PRINT_MACRO(RWSTD_NO_NEW_DECL); - PRINT_MACRO(RWSTD_NO_NEW_HEADER); - PRINT_MACRO(RWSTD_NO_NEW_TEMPLATE_SYNTAX); - PRINT_MACRO(RWSTD_NO_NONCLASS_ARROW_RETURN); - PRINT_MACRO(RWSTD_NO_NONTYPE_ARGS); - PRINT_MACRO(RWSTD_NO_ONLY_NEEDED_INSTANTIATION); - PRINT_MACRO(RWSTD_NO_OVERLOAD_C_POW); - PRINT_MACRO(RWSTD_NO_OVERLOAD_OF_TEMPLATE_FUNCTION); - PRINT_MACRO(RWSTD_NO_OVERLOAD_WCHAR); - PRINT_MACRO(RWSTD_NO_PART_SPEC_OVERLOAD); - PRINT_MACRO(RWSTD_NO_RET_TEMPLATE); - PRINT_MACRO(RWSTD_NO_SIMPLE_DEFAULT_TEMPLATES); - PRINT_MACRO(RWSTD_NO_STATIC_CAST); - PRINT_MACRO(RWSTD_NO_STATIC_DEF); - PRINT_MACRO(RWSTD_NO_STATIC_DEF2); - PRINT_MACRO(RWSTD_NO_STATIC_DEF3); - PRINT_MACRO(RWSTD_NO_STATIC_MEM_DEF); - PRINT_MACRO(RWSTD_NO_STI_SIMPLE); - PRINT_MACRO(RWSTD_NO_STI_TEMPLATE); - PRINT_MACRO(RWSTD_NO_STREAM_LONG_DOUBLE); - PRINT_MACRO(RWSTD_NO_STRFTIME_CAPC); - PRINT_MACRO(RWSTD_NO_STRICT_TEMPLATE_INSTANTIATE); - PRINT_MACRO(RWSTD_NO_SWPRINTF); - PRINT_MACRO(RWSTD_NO_TEMPLATE_ON_RETURN_TYPE); - PRINT_MACRO(RWSTD_NO_TEMPLATE_TEMPLATE); - PRINT_MACRO(RWSTD_NO_THREADS); - PRINT_MACRO(RWSTD_NO_THROW_SPEC_ON_NEW); - PRINT_MACRO(RWSTD_NO_THROW_WITH_SHARED); - PRINT_MACRO(RWSTD_NO_TYPEDEF_INST); - PRINT_MACRO(RWSTD_NO_TYPEDEF_OVERLOAD); - PRINT_MACRO(RWSTD_NO_TYPENAME); - PRINT_MACRO(RWSTD_NO_UNDEFINED_FRIEND); - PRINT_MACRO(RWSTD_NO_UNINITIALIZED_STATIC_DEF); - PRINT_MACRO(RWSTD_NO_WCHAR_H); - PRINT_MACRO(RWSTD_NO_WCTYPE_H); - PRINT_MACRO(RWSTD_NO_WIDE_CHAR); - PRINT_MACRO(RWSTD_NO_WINT_TYPE); - PRINT_MACRO(RWSTD_NO_WSTR); - PRINT_MACRO(RWSTD_NOT_ALL_WSTR_CFUNCTIONS); - PRINT_MACRO(RWSTD_POSIX_D10_THREADS); - PRINT_MACRO(RWSTD_POSIX_THREADS); - PRINT_MACRO(RWSTD_REQUIRES_IEEEFP); - PRINT_MACRO(RWSTD_SOLARIS_THREADS); - PRINT_MACRO(RWSTD_STRUCT_TM_TZ); - PRINT_MACRO(RWSTD_WIDE_STRING_NULL_PROBLEM); - #endif - // Dinkumware options: - PRINT_MACRO(_CPPLIB_VER); - PRINT_MACRO(_GLOBAL_USING); - PRINT_MACRO(_HAS_EXCEPTIONS); - PRINT_MACRO(_HAS_MEMBER_TEMPLATES_REBIND); - PRINT_MACRO(_HAS_TEMPLATE_PARTIAL_ORDERING); - // Libc++: - PRINT_MACRO(_LIBCPP_VERSION); - // STLPort and generic SGI STL options: - PRINT_MACRO(__SGI_STL_NO_ARROW_OPERATOR); - PRINT_MACRO(__SGI_STL_OWN_IOSTREAMS); - PRINT_MACRO(__SGI_STL_PORT); - PRINT_MACRO(__STL_AUTOMATIC_TYPE_TRAITS); - PRINT_MACRO(__STL_BASE_MATCH_BUG); - PRINT_MACRO(__STL_BASE_TYPEDEF_BUG); - PRINT_MACRO(__STL_BASE_TYPEDEF_OUTSIDE_BUG); - PRINT_MACRO(__STL_BROKEN_USING_DIRECTIVE); - PRINT_MACRO(__STL_CONST_CONSTRUCTOR_BUG); - PRINT_MACRO(__STL_DEBUG); - PRINT_MACRO(__STL_DEBUG_ALLOC); - PRINT_MACRO(__STL_DEFAULT_CONSTRUCTOR_BUG); - PRINT_MACRO(__STL_DEFAULT_TYPE_PARAM); - PRINT_MACRO(__STL_DONT_REDEFINE_STD); - PRINT_MACRO(__STL_DONT_USE_BOOL_TYPEDEF); - PRINT_MACRO(__STL_HAS_NO_EXCEPTIONS); - PRINT_MACRO(__STL_HAS_NO_NAMESPACES); - PRINT_MACRO(__STL_HAS_NO_NEW_C_HEADERS); - PRINT_MACRO(__STL_HAS_NO_NEW_IOSTREAMS); - PRINT_MACRO(__STL_IMPORT_VENDOR_CSTD); - PRINT_MACRO(__STL_LIMITED_DEFAULT_TEMPLATES); - PRINT_MACRO(__STL_LINK_TIME_INSTANTIATION); - PRINT_MACRO(__STL_LONG_LONG); - PRINT_MACRO(__STL_LOOP_INLINE_PROBLEMS); - PRINT_MACRO(__STL_MEMBER_POINTER_PARAM_BUG); - PRINT_MACRO(__STL_NEED_EXPLICIT); - PRINT_MACRO(__STL_NEED_MUTABLE); - PRINT_MACRO(__STL_NEED_TYPENAME); - PRINT_MACRO(__STL_NESTED_TYPE_PARAM_BUG); - PRINT_MACRO(__STL_NO_BAD_ALLOC); - PRINT_MACRO(__STL_NO_BOOL); - PRINT_MACRO(__STL_NO_CLASS_PARTIAL_SPECIALIZATION); - PRINT_MACRO(__STL_NO_CSTD_FUNCTION_IMPORTS); - PRINT_MACRO(__STL_NO_DEFAULT_NON_TYPE_PARAM); - PRINT_MACRO(__STL_NO_EXCEPTION_HEADER); - PRINT_MACRO(__STL_NO_EXCEPTION_SPEC); - PRINT_MACRO(__STL_NO_EXCEPTIONS); - PRINT_MACRO(__STL_NO_EXPLICIT_FUNCTION_TMPL_ARGS); - PRINT_MACRO(__STL_NO_FRIEND_TEMPLATES); - PRINT_MACRO(__STL_NO_FUNCTION_TMPL_PARTIAL_ORDER); - PRINT_MACRO(__STL_NO_IOSTREAMS); - PRINT_MACRO(__STL_NO_LONG_DOUBLE); - PRINT_MACRO(__STL_NO_MEMBER_TEMPLATE_CLASSES); - PRINT_MACRO(__STL_NO_MEMBER_TEMPLATE_KEYWORD); - PRINT_MACRO(__STL_NO_MEMBER_TEMPLATES); - PRINT_MACRO(__STL_NO_METHOD_SPECIALIZATION); - PRINT_MACRO(__STL_NO_NAMESPACES); - PRINT_MACRO(__STL_NO_NEW_IOSTREAMS); - PRINT_MACRO(__STL_NO_NEW_NEW_HEADER); - PRINT_MACRO(__STL_NO_NEW_STYLE_CASTS); - PRINT_MACRO(__STL_NO_PARTIAL_SPECIALIZATION_SYNTAX); - PRINT_MACRO(__STL_NO_QUALIFIED_FRIENDS); - PRINT_MACRO(__STL_NO_RELOPS_NAMESPACE); - PRINT_MACRO(__STL_NO_SGI_IOSTREAMS); - PRINT_MACRO(__STL_NO_STATIC_TEMPLATE_DATA); - PRINT_MACRO(__STL_NO_TEMPLATE_CONVERSIONS); - PRINT_MACRO(__STL_NO_WCHAR_T); - PRINT_MACRO(__STL_NON_TYPE_TMPL_PARAM_BUG); - PRINT_MACRO(__STL_NONTEMPL_BASE_MATCH_BUG); - PRINT_MACRO(__STL_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS); - PRINT_MACRO(__STL_RAND48); - PRINT_MACRO(__STL_STATIC_ARRAY_BUG); - PRINT_MACRO(__STL_STATIC_CONST_INIT_BUG); - PRINT_MACRO(__STL_STATIC_CONST_INIT_BUG); - PRINT_MACRO(__STL_THROW_RETURN_BUG); - PRINT_MACRO(__STL_TRIVIAL_CONSTRUCTOR_BUG); - PRINT_MACRO(__STL_TRIVIAL_DESTRUCTOR_BUG); - PRINT_MACRO(__STL_UNINITIALIZABLE_PRIVATE); - PRINT_MACRO(__STL_USE_ABBREVS); - PRINT_MACRO(__STL_USE_DEFALLOC); - PRINT_MACRO(__STL_USE_MALLOC); - PRINT_MACRO(__STL_USE_NEW_C_HEADERS); - PRINT_MACRO(__STL_USE_NEW_IOSTREAMS); - PRINT_MACRO(__STL_USE_NEWALLOC); - PRINT_MACRO(__STL_USE_OWN_NAMESPACE); - PRINT_MACRO(__STL_USE_SGI_ALLOCATORS); - PRINT_MACRO(__STL_WCHAR_T_IS_USHORT); - PRINT_MACRO(__STL_WEAK_ATTRIBUTE); - PRINT_MACRO(__STL_YVALS_H); - PRINT_MACRO(_NOTHREADS); - PRINT_MACRO(_PTHREADS); -#if defined(__SGI_STL_PORT) && (__SGI_STL_PORT > 0x0400) - PRINT_MACRO(_STLP_AUTOMATIC_TYPE_TRAITS); - PRINT_MACRO(_STLP_BASE_MATCH_BUG); - PRINT_MACRO(_STLP_BASE_TYPEDEF_BUG); - PRINT_MACRO(_STLP_BASE_TYPEDEF_OUTSIDE_BUG); - PRINT_MACRO(_STLP_BROKEN_USING_DIRECTIVE); - PRINT_MACRO(_STLP_CONST_CONSTRUCTOR_BUG); - PRINT_MACRO(_STLP_DEBUG); - PRINT_MACRO(_STLP_DEBUG_ALLOC); - PRINT_MACRO(_STLP_DEFAULT_CONSTRUCTOR_BUG); - PRINT_MACRO(_STLP_DEFAULT_TYPE_PARAM); - PRINT_MACRO(_STLP_DONT_REDEFINE_STD); - PRINT_MACRO(_STLP_DONT_USE_BOOL_TYPEDEF); - PRINT_MACRO(_STLP_HAS_NO_EXCEPTIONS); - PRINT_MACRO(_STLP_HAS_NO_NAMESPACES); - PRINT_MACRO(_STLP_HAS_NO_NEW_C_HEADERS); - PRINT_MACRO(_STLP_HAS_NO_NEW_IOSTREAMS); - PRINT_MACRO(_STLP_IMPORT_VENDOR_CSTD); - PRINT_MACRO(_STLP_LIMITED_DEFAULT_TEMPLATES); - PRINT_MACRO(_STLP_LINK_TIME_INSTANTIATION); - PRINT_MACRO(_STLP_LONG_LONG); - PRINT_MACRO(_STLP_LOOP_INLINE_PROBLEMS); - PRINT_MACRO(_STLP_MEMBER_POINTER_PARAM_BUG); - PRINT_MACRO(_STLP_NEED_EXPLICIT); - PRINT_MACRO(_STLP_NEED_MUTABLE); - PRINT_MACRO(_STLP_NEED_TYPENAME); - PRINT_MACRO(_STLP_NESTED_TYPE_PARAM_BUG); - PRINT_MACRO(_STLP_NO_ARROW_OPERATOR); - PRINT_MACRO(_STLP_NO_BAD_ALLOC); - PRINT_MACRO(_STLP_NO_BOOL); - PRINT_MACRO(_STLP_NO_CLASS_PARTIAL_SPECIALIZATION); - PRINT_MACRO(_STLP_NO_CSTD_FUNCTION_IMPORTS); - PRINT_MACRO(_STLP_NO_DEFAULT_NON_TYPE_PARAM); - PRINT_MACRO(_STLP_NO_EXCEPTION_HEADER); - PRINT_MACRO(_STLP_NO_EXCEPTION_SPEC); - PRINT_MACRO(_STLP_NO_EXCEPTIONS); - PRINT_MACRO(_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS); - PRINT_MACRO(_STLP_NO_FRIEND_TEMPLATES); - PRINT_MACRO(_STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER); - PRINT_MACRO(_STLP_NO_IOSTREAMS); - PRINT_MACRO(_STLP_NO_LONG_DOUBLE); - PRINT_MACRO(_STLP_NO_MEMBER_TEMPLATE_CLASSES); - PRINT_MACRO(_STLP_NO_MEMBER_TEMPLATE_KEYWORD); - PRINT_MACRO(_STLP_NO_MEMBER_TEMPLATES); - PRINT_MACRO(_STLP_NO_METHOD_SPECIALIZATION); - PRINT_MACRO(_STLP_NO_NAMESPACES); - PRINT_MACRO(_STLP_NO_NEW_IOSTREAMS); - PRINT_MACRO(_STLP_NO_NEW_NEW_HEADER); - PRINT_MACRO(_STLP_NO_NEW_STYLE_CASTS); - PRINT_MACRO(_STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX); - PRINT_MACRO(_STLP_NO_QUALIFIED_FRIENDS); - PRINT_MACRO(_STLP_NO_RELOPS_NAMESPACE); - PRINT_MACRO(_STLP_NO_SGI_IOSTREAMS); - PRINT_MACRO(_STLP_NO_STATIC_TEMPLATE_DATA); - PRINT_MACRO(_STLP_NO_TEMPLATE_CONVERSIONS); - PRINT_MACRO(_STLP_NO_WCHAR_T); - PRINT_MACRO(_STLP_NON_TYPE_TMPL_PARAM_BUG); - PRINT_MACRO(_STLP_NONTEMPL_BASE_MATCH_BUG); - PRINT_MACRO(_STLP_OWN_IOSTREAMS); - PRINT_MACRO(_STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS); - PRINT_MACRO(_STLP_RAND48); - PRINT_MACRO(_STLP_STATIC_ARRAY_BUG); - PRINT_MACRO(_STLP_STATIC_CONST_INIT_BUG); - PRINT_MACRO(_STLP_STATIC_CONST_INIT_BUG); - PRINT_MACRO(_STLP_THROW_RETURN_BUG); - PRINT_MACRO(_STLP_TRIVIAL_CONSTRUCTOR_BUG); - PRINT_MACRO(_STLP_TRIVIAL_DESTRUCTOR_BUG); - PRINT_MACRO(_STLP_UNINITIALIZABLE_PRIVATE); - PRINT_MACRO(_STLP_USE_ABBREVS); - PRINT_MACRO(_STLP_USE_DEFALLOC); - PRINT_MACRO(_STLP_USE_MALLOC); - PRINT_MACRO(_STLP_USE_NEW_C_HEADERS); - PRINT_MACRO(_STLP_USE_NEWALLOC); - PRINT_MACRO(_STLP_USE_OWN_NAMESPACE); - PRINT_MACRO(_STLP_USE_SGI_ALLOCATORS); - PRINT_MACRO(_STLP_WCHAR_T_IS_USHORT); - PRINT_MACRO(_STLP_WEAK_ATTRIBUTE); - PRINT_MACRO(_STLP_YVALS_H); -#endif - PRINT_MACRO(__GLIBCPP__); - PRINT_MACRO(_GLIBCPP_USE_WCHAR_T); - PRINT_MACRO(_GLIBCPP_VERSION); - PRINT_MACRO(__GLIBCXX__); - PRINT_MACRO(_GLIBCXX_USE_WCHAR_T); - PRINT_MACRO(_GLIBCXX_VERSION); - PRINT_MACRO(_GLIBCXX_USE_LONG_LONG); - PRINT_MACRO(_GLIBCXX_USE_NLS); - PRINT_MACRO(_GLIBCXX_USE_C99_MATH); - PRINT_MACRO(_GLIBCXX_USE_C99); - PRINT_MACRO(_GLIBCXX_CONCEPT_CHECKS); - PRINT_MACRO(_GLIBCXX_USE_LFS); - PRINT_MACRO(_GLIBCXX_SYMVER); - PRINT_MACRO(_GLIBCXX_MEM_LIMITS); - PRINT_MACRO(_GLIBCXX_HOSTED); - PRINT_MACRO(_GLIBCXX_SJLJ_EXCEPTIONS); - - // Modena C++ standard library - PRINT_MACRO(MSIPL_ANSI_HEADER); - PRINT_MACRO(MSIPL_BOOL_BUILTIN); - PRINT_MACRO(MSIPL_DEF_EXPLICIT); - PRINT_MACRO(MSIPL_DEF_TEMPARG); - PRINT_MACRO(MSIPL_EXPINST_ALLOWED); - PRINT_MACRO(MSIPL_EXPLICIT_FUNC_TEMPLATE_ARG); - PRINT_MACRO(MISPL_EXPLICIT_TEMPLATE_ARGUMENT); - PRINT_MACRO(MSIPL_FUNC_TEMPLATE_DEFARG); - PRINT_MACRO(MSIPL_MEMBER_TEMPLATE); - PRINT_MACRO(MSIPL_MULTITHREAD); - PRINT_MACRO(MSIPL_NON_TYPE_TEMPARG); - PRINT_MACRO(MSIPL_PARTIAL_TEMPL); - PRINT_MACRO(MSIPL_STATIC_CONST_INIT); - PRINT_MACRO(MSIPL_TEMPL_NEWSPEC); - PRINT_MACRO(MSIPL_TYPENAME); - PRINT_MACRO(MSIPL_USING_NAMESPACE); - PRINT_MACRO(MSIPL_WCHART); -} - -void print_platform_macros() -{ - std::cout << "Detected Platform: " << BOOST_PLATFORM << std::endl; - // signedness: - PRINT_SIGN(char); - PRINT_SIGN(wchar_t); - // byte ordering: - PRINT_ORDER(short); - PRINT_ORDER(int); - PRINT_ORDER(long); - // sizes: - PRINT_EXPRESSION(sizeof(wchar_t)); - PRINT_EXPRESSION(sizeof(short)); - PRINT_EXPRESSION(sizeof(int)); - PRINT_EXPRESSION(sizeof(long)); - PRINT_EXPRESSION(sizeof(size_t)); - PRINT_EXPRESSION(sizeof(ptrdiff_t)); - PRINT_EXPRESSION(sizeof(void*)); - PRINT_EXPRESSION(sizeof(void(*)(void))); - PRINT_EXPRESSION(sizeof(float)); - PRINT_EXPRESSION(sizeof(double)); - PRINT_EXPRESSION(sizeof(long double)); - // limits: - PRINT_MACRO(CHAR_BIT); - PRINT_MACRO(CHAR_MAX); - PRINT_MACRO(WCHAR_MAX); - PRINT_MACRO(SHRT_MAX); - PRINT_MACRO(INT_MAX); - PRINT_MACRO(LONG_MAX); - PRINT_MACRO(LLONG_MAX); - PRINT_MACRO(LONG_LONG_MAX); - PRINT_MACRO(LONGLONG_MAX); - PRINT_MACRO(ULLONG_MAX); // uses these, so we need to know them - PRINT_MACRO(ULONG_LONG_MAX); - PRINT_MACRO(ULONGLONG_MAX); - // general C99: - PRINT_MACRO(__STDC_IEC_559__); - PRINT_MACRO(__STDC_IEC_559_COMPLEX__); - PRINT_MACRO(__STDC_ISO_10646__); - // GNU: - PRINT_MACRO(__GLIBC__); - PRINT_MACRO(__GLIBC_MINOR__); - PRINT_MACRO(__GNU_LIBRARY__); - PRINT_MACRO(_BSD_SOURCE); - PRINT_MACRO(_GNU_SOURCE); - PRINT_MACRO(_ISOC99_SOURCE); - PRINT_MACRO(_ISOC9X_SOURCE); - PRINT_MACRO(_LARGEFILE_SOURCE); - PRINT_MACRO(_LARGEFILE64_SOURCE); - PRINT_MACRO(_SVID_SOURCE); - PRINT_MACRO(_THREAD_SAFE); - PRINT_MACRO(_XOPEN_SOURCE_EXTENDED); - PRINT_MACRO(XPG); - PRINT_MACRO(__MINGW32_MAJOR_VERSION); - PRINT_MACRO(__MINGW32_MINOR_VERSION); - // POSIX: - PRINT_MACRO(_POSIX_ADVISORY_INFO); - PRINT_MACRO(_POSIX_ASYNCHRONOUS_IO); - PRINT_MACRO(_POSIX_BARRIERS); - PRINT_MACRO(_POSIX_C_SOURCE); - PRINT_MACRO(_POSIX_CHOWN_RESTRICTED); - PRINT_MACRO(_POSIX_CLOCK_SELECTION); - PRINT_MACRO(_POSIX_CPUTIME); - PRINT_MACRO(_POSIX_FSYNC); - PRINT_MACRO(_POSIX_JOB_CONTROL); - PRINT_MACRO(_POSIX_MAPPED_FILES); - PRINT_MACRO(_POSIX_MEMLOCK); - PRINT_MACRO(_POSIX_MEMLOCK_RANGE); - PRINT_MACRO(_POSIX_MEMORY_PROTECTION); - PRINT_MACRO(_POSIX_MESSAGE_PASSING); - PRINT_MACRO(_POSIX_MONOTONIC_CLOCK); - PRINT_MACRO(_POSIX_NO_TRUNC); - PRINT_MACRO(_POSIX_PRIORITIZED_IO); - PRINT_MACRO(_POSIX_PRIORITY_SCHEDULING); - PRINT_MACRO(_POSIX_RAW_SOCKETS); - PRINT_MACRO(_POSIX_READER_WRITER_LOCKS); - PRINT_MACRO(_POSIX_REALTIME_SIGNALS); - PRINT_MACRO(_POSIX_REGEXP); - PRINT_MACRO(_POSIX_SAVED_IDS); - PRINT_MACRO(_POSIX_SEMAPHORES); - PRINT_MACRO(_POSIX_SHARED_MEMORY_OBJECTS); - PRINT_MACRO(_POSIX_SHELL); - PRINT_MACRO(_POSIX_SOURCE); - PRINT_MACRO(_POSIX_SPAWN); - PRINT_MACRO(_POSIX_SPIN_LOCKS); - PRINT_MACRO(_POSIX_SPORADIC_SERVER); - PRINT_MACRO(_POSIX_SYNCHRONIZED_IO); - PRINT_MACRO(_POSIX_THREAD_ATTR_STACKADDR); - PRINT_MACRO(_POSIX_THREAD_ATTR_STACKSIZE); - PRINT_MACRO(_POSIX_THREAD_CPUTIME); - PRINT_MACRO(_POSIX_THREAD_PRIO_INHERIT); - PRINT_MACRO(_POSIX_THREAD_PRIO_PROTECT); - PRINT_MACRO(_POSIX_THREAD_PRIORITY_SCHEDULING); - PRINT_MACRO(_POSIX_THREAD_PROCESS_SHARED); - PRINT_MACRO(_POSIX_THREAD_SAFE_FUNCTIONS); - PRINT_MACRO(_POSIX_THREAD_SPORADIC_SERVER); - PRINT_MACRO(_POSIX_THREADS); - PRINT_MACRO(_POSIX_TIMEOUTS); - PRINT_MACRO(_POSIX_TIMERS); - PRINT_MACRO(_POSIX_TRACE); - PRINT_MACRO(_POSIX_TRACE_EVENT_FILTER); - PRINT_MACRO(_POSIX_TRACE_INHERIT); - PRINT_MACRO(_POSIX_TRACE_LOG); - PRINT_MACRO(_POSIX_TYPED_MEMORY_OBJECTS); - PRINT_MACRO(_POSIX_VDISABLE); - PRINT_MACRO(_POSIX_VERSION); - PRINT_MACRO(_POSIX2_C_BIND); - PRINT_MACRO(_POSIX2_C_DEV); - PRINT_MACRO(_POSIX2_CHAR_TERM); - PRINT_MACRO(_POSIX2_FORT_DEV); - PRINT_MACRO(_POSIX2_FORT_RUN); - PRINT_MACRO(_POSIX2_LOCALEDEF); - PRINT_MACRO(_POSIX2_PBS); - PRINT_MACRO(_POSIX2_PBS_ACCOUNTING); - PRINT_MACRO(_POSIX2_PBS_CHECKPOINT); - PRINT_MACRO(_POSIX2_PBS_LOCATE); - PRINT_MACRO(_POSIX2_PBS_MESSAGE); - PRINT_MACRO(_POSIX2_PBS_TRACK); - PRINT_MACRO(_POSIX2_SW_DEV); - PRINT_MACRO(_POSIX2_UPE); - PRINT_MACRO(_POSIX2_VERSION); - PRINT_MACRO(_V6_ILP32_OFF32); - PRINT_MACRO(_V6_ILP32_OFFBIG); - PRINT_MACRO(_V6_LP64_OFF64); - PRINT_MACRO(_V6_LPBIG_OFFBIG); - PRINT_MACRO(_XBS5_ILP32_OFF32); - PRINT_MACRO(_XBS5_ILP32_OFFBIG); - PRINT_MACRO(_XBS5_LP64_OFF64); - PRINT_MACRO(_XBS5_LPBIG_OFFBIG); - PRINT_MACRO(_XOPEN_CRYPT); - PRINT_MACRO(_XOPEN_ENH_I18N); - PRINT_MACRO(_XOPEN_LEGACY); - PRINT_MACRO(_XOPEN_REALTIME); - PRINT_MACRO(_XOPEN_REALTIME_THREADS); - PRINT_MACRO(_XOPEN_SHM); - PRINT_MACRO(_XOPEN_SOURCE); - PRINT_MACRO(_XOPEN_STREAMS); - PRINT_MACRO(_XOPEN_UNIX); - PRINT_MACRO(_XOPEN_VERSION); - // Misc: - PRINT_MACRO(__USE_BSD); - PRINT_MACRO(_FILE_OFFSET_BITS); -} - -void print_boost_macros() -{ - std::cout << "Boost version " << BOOST_STRINGIZE(BOOST_VERSION) << std::endl; - // config setup macros first: - PRINT_MACRO(BOOST_USER_CONFIG); - PRINT_MACRO(BOOST_COMPILER_CONFIG); - PRINT_MACRO(BOOST_STDLIB_CONFIG); - PRINT_MACRO(BOOST_PLATFORM_CONFIG); - PRINT_MACRO(BOOST_NO_CONFIG); - PRINT_MACRO(BOOST_NO_USER_CONFIG); - PRINT_MACRO(BOOST_NO_COMPILER_CONFIG); - PRINT_MACRO(BOOST_NO_STDLIB_CONFIG); - PRINT_MACRO(BOOST_NO_PLATFORM_CONFIG); - // then defect and feature macros: - PRINT_MACRO(BOOST_DISABLE_THREADS); - PRINT_MACRO(BOOST_DISABLE_WIN32); - PRINT_MACRO(BOOST_HAS_THREADS); - PRINT_MACRO(BOOST_WINDOWS); - - // BEGIN GENERATED BLOCK DO NOT EDIT THIS!!!!!! - PRINT_MACRO(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG); - PRINT_MACRO(BOOST_DEDUCED_TYPENAME); - PRINT_MACRO(BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL); - PRINT_MACRO(BOOST_HAS_BETHREADS); - PRINT_MACRO(BOOST_HAS_CLOCK_GETTIME); - PRINT_MACRO(BOOST_HAS_DIRENT_H); - PRINT_MACRO(BOOST_HAS_EXPM1); - PRINT_MACRO(BOOST_HAS_FLOAT128); - PRINT_MACRO(BOOST_HAS_FTIME); - PRINT_MACRO(BOOST_HAS_GETSYSTEMTIMEASFILETIME); - PRINT_MACRO(BOOST_HAS_GETTIMEOFDAY); - PRINT_MACRO(BOOST_HAS_HASH); - PRINT_MACRO(BOOST_HAS_INT128); - PRINT_MACRO(BOOST_HAS_LOG1P); - PRINT_MACRO(BOOST_HAS_LONG_LONG); - PRINT_MACRO(BOOST_HAS_MACRO_USE_FACET); - PRINT_MACRO(BOOST_HAS_MS_INT64); - PRINT_MACRO(BOOST_HAS_NANOSLEEP); - PRINT_MACRO(BOOST_HAS_NL_TYPES_H); - PRINT_MACRO(BOOST_HAS_NRVO); - PRINT_MACRO(BOOST_HAS_PARTIAL_STD_ALLOCATOR); - PRINT_MACRO(BOOST_HAS_PTHREADS); - PRINT_MACRO(BOOST_HAS_PTHREAD_DELAY_NP); - PRINT_MACRO(BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE); - PRINT_MACRO(BOOST_HAS_PTHREAD_YIELD); - PRINT_MACRO(BOOST_HAS_RVALUE_REFS); - PRINT_MACRO(BOOST_HAS_SCHED_YIELD); - PRINT_MACRO(BOOST_HAS_SGI_TYPE_TRAITS); - PRINT_MACRO(BOOST_HAS_SIGACTION); - PRINT_MACRO(BOOST_HAS_SLIST); - PRINT_MACRO(BOOST_HAS_STATIC_ASSERT); - PRINT_MACRO(BOOST_HAS_STDINT_H); - PRINT_MACRO(BOOST_HAS_STLP_USE_FACET); - PRINT_MACRO(BOOST_HAS_TR1_ARRAY); - PRINT_MACRO(BOOST_HAS_TR1_BIND); - PRINT_MACRO(BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG); - PRINT_MACRO(BOOST_HAS_TR1_COMPLEX_OVERLOADS); - PRINT_MACRO(BOOST_HAS_TR1_FUNCTION); - PRINT_MACRO(BOOST_HAS_TR1_HASH); - PRINT_MACRO(BOOST_HAS_TR1_MEM_FN); - PRINT_MACRO(BOOST_HAS_TR1_RANDOM); - PRINT_MACRO(BOOST_HAS_TR1_REFERENCE_WRAPPER); - PRINT_MACRO(BOOST_HAS_TR1_REGEX); - PRINT_MACRO(BOOST_HAS_TR1_RESULT_OF); - PRINT_MACRO(BOOST_HAS_TR1_SHARED_PTR); - PRINT_MACRO(BOOST_HAS_TR1_TUPLE); - PRINT_MACRO(BOOST_HAS_TR1_TYPE_TRAITS); - PRINT_MACRO(BOOST_HAS_TR1_UNORDERED_MAP); - PRINT_MACRO(BOOST_HAS_TR1_UNORDERED_SET); - PRINT_MACRO(BOOST_HAS_TR1_UTILITY); - PRINT_MACRO(BOOST_HAS_TWO_ARG_USE_FACET); - PRINT_MACRO(BOOST_HAS_UNISTD_H); - PRINT_MACRO(BOOST_HAS_VARIADIC_TMPL); - PRINT_MACRO(BOOST_HAS_WINTHREADS); - PRINT_MACRO(BOOST_MSVC6_MEMBER_TEMPLATES); - PRINT_MACRO(BOOST_MSVC_STD_ITERATOR); - PRINT_MACRO(BOOST_NO_ADL_BARRIER); - PRINT_MACRO(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP); - PRINT_MACRO(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS); - PRINT_MACRO(BOOST_NO_AUTO_PTR); - PRINT_MACRO(BOOST_NO_COMPLETE_VALUE_INITIALIZATION); - PRINT_MACRO(BOOST_NO_CTYPE_FUNCTIONS); - PRINT_MACRO(BOOST_NO_CV_SPECIALIZATIONS); - PRINT_MACRO(BOOST_NO_CV_VOID_SPECIALIZATIONS); - PRINT_MACRO(BOOST_NO_CWCHAR); - PRINT_MACRO(BOOST_NO_CWCTYPE); - PRINT_MACRO(BOOST_NO_CXX11_ADDRESSOF); - PRINT_MACRO(BOOST_NO_CXX11_ALIGNAS); - PRINT_MACRO(BOOST_NO_CXX11_ALLOCATOR); - PRINT_MACRO(BOOST_NO_CXX11_ATOMIC_SMART_PTR); - PRINT_MACRO(BOOST_NO_CXX11_AUTO_DECLARATIONS); - PRINT_MACRO(BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS); - PRINT_MACRO(BOOST_NO_CXX11_CHAR16_T); - PRINT_MACRO(BOOST_NO_CXX11_CHAR32_T); - PRINT_MACRO(BOOST_NO_CXX11_CONSTEXPR); - PRINT_MACRO(BOOST_NO_CXX11_DECLTYPE); - PRINT_MACRO(BOOST_NO_CXX11_DECLTYPE_N3276); - PRINT_MACRO(BOOST_NO_CXX11_DEFAULTED_FUNCTIONS); - PRINT_MACRO(BOOST_NO_CXX11_DELETED_FUNCTIONS); - PRINT_MACRO(BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS); - PRINT_MACRO(BOOST_NO_CXX11_EXTERN_TEMPLATE); - PRINT_MACRO(BOOST_NO_CXX11_FINAL); - PRINT_MACRO(BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS); - PRINT_MACRO(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS); - PRINT_MACRO(BOOST_NO_CXX11_HDR_ARRAY); - PRINT_MACRO(BOOST_NO_CXX11_HDR_ATOMIC); - PRINT_MACRO(BOOST_NO_CXX11_HDR_CHRONO); - PRINT_MACRO(BOOST_NO_CXX11_HDR_CODECVT); - PRINT_MACRO(BOOST_NO_CXX11_HDR_CONDITION_VARIABLE); - PRINT_MACRO(BOOST_NO_CXX11_HDR_FORWARD_LIST); - PRINT_MACRO(BOOST_NO_CXX11_HDR_FUNCTIONAL); - PRINT_MACRO(BOOST_NO_CXX11_HDR_FUTURE); - PRINT_MACRO(BOOST_NO_CXX11_HDR_INITIALIZER_LIST); - PRINT_MACRO(BOOST_NO_CXX11_HDR_MUTEX); - PRINT_MACRO(BOOST_NO_CXX11_HDR_RANDOM); - PRINT_MACRO(BOOST_NO_CXX11_HDR_RATIO); - PRINT_MACRO(BOOST_NO_CXX11_HDR_REGEX); - PRINT_MACRO(BOOST_NO_CXX11_HDR_SYSTEM_ERROR); - PRINT_MACRO(BOOST_NO_CXX11_HDR_THREAD); - PRINT_MACRO(BOOST_NO_CXX11_HDR_TUPLE); - PRINT_MACRO(BOOST_NO_CXX11_HDR_TYPEINDEX); - PRINT_MACRO(BOOST_NO_CXX11_HDR_TYPE_TRAITS); - PRINT_MACRO(BOOST_NO_CXX11_HDR_UNORDERED_MAP); - PRINT_MACRO(BOOST_NO_CXX11_HDR_UNORDERED_SET); - PRINT_MACRO(BOOST_NO_CXX11_INLINE_NAMESPACES); - PRINT_MACRO(BOOST_NO_CXX11_LAMBDAS); - PRINT_MACRO(BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS); - PRINT_MACRO(BOOST_NO_CXX11_NOEXCEPT); - PRINT_MACRO(BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS); - PRINT_MACRO(BOOST_NO_CXX11_NULLPTR); - PRINT_MACRO(BOOST_NO_CXX11_NUMERIC_LIMITS); - PRINT_MACRO(BOOST_NO_CXX11_RANGE_BASED_FOR); - PRINT_MACRO(BOOST_NO_CXX11_RAW_LITERALS); - PRINT_MACRO(BOOST_NO_CXX11_REF_QUALIFIERS); - PRINT_MACRO(BOOST_NO_CXX11_RVALUE_REFERENCES); - PRINT_MACRO(BOOST_NO_CXX11_SCOPED_ENUMS); - PRINT_MACRO(BOOST_NO_CXX11_SMART_PTR); - PRINT_MACRO(BOOST_NO_CXX11_STATIC_ASSERT); - PRINT_MACRO(BOOST_NO_CXX11_STD_ALIGN); - PRINT_MACRO(BOOST_NO_CXX11_TEMPLATE_ALIASES); - PRINT_MACRO(BOOST_NO_CXX11_THREAD_LOCAL); - PRINT_MACRO(BOOST_NO_CXX11_TRAILING_RESULT_TYPES); - PRINT_MACRO(BOOST_NO_CXX11_UNICODE_LITERALS); - PRINT_MACRO(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX); - PRINT_MACRO(BOOST_NO_CXX11_USER_DEFINED_LITERALS); - PRINT_MACRO(BOOST_NO_CXX11_VARIADIC_MACROS); - PRINT_MACRO(BOOST_NO_CXX11_VARIADIC_TEMPLATES); - PRINT_MACRO(BOOST_NO_CXX14_AGGREGATE_NSDMI); - PRINT_MACRO(BOOST_NO_CXX14_BINARY_LITERALS); - PRINT_MACRO(BOOST_NO_CXX14_CONSTEXPR); - PRINT_MACRO(BOOST_NO_CXX14_DECLTYPE_AUTO); - PRINT_MACRO(BOOST_NO_CXX14_DIGIT_SEPARATORS); - PRINT_MACRO(BOOST_NO_CXX14_GENERIC_LAMBDAS); - PRINT_MACRO(BOOST_NO_CXX14_HDR_SHARED_MUTEX); - PRINT_MACRO(BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES); - PRINT_MACRO(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION); - PRINT_MACRO(BOOST_NO_CXX14_STD_EXCHANGE); - PRINT_MACRO(BOOST_NO_CXX14_VARIABLE_TEMPLATES); - PRINT_MACRO(BOOST_NO_CXX17_STD_APPLY); - PRINT_MACRO(BOOST_NO_CXX17_STD_INVOKE); - PRINT_MACRO(BOOST_NO_DEPENDENT_NESTED_DERIVATIONS); - PRINT_MACRO(BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS); - PRINT_MACRO(BOOST_NO_EXCEPTIONS); - PRINT_MACRO(BOOST_NO_EXCEPTION_STD_NAMESPACE); - PRINT_MACRO(BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS); - PRINT_MACRO(BOOST_NO_FENV_H); - PRINT_MACRO(BOOST_NO_FUNCTION_TEMPLATE_ORDERING); - PRINT_MACRO(BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS); - PRINT_MACRO(BOOST_NO_INCLASS_MEMBER_INITIALIZATION); - PRINT_MACRO(BOOST_NO_INTEGRAL_INT64_T); - PRINT_MACRO(BOOST_NO_INTRINSIC_WCHAR_T); - PRINT_MACRO(BOOST_NO_IOSFWD); - PRINT_MACRO(BOOST_NO_IOSTREAM); - PRINT_MACRO(BOOST_NO_IS_ABSTRACT); - PRINT_MACRO(BOOST_NO_LIMITS); - PRINT_MACRO(BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS); - PRINT_MACRO(BOOST_NO_LONG_LONG); - PRINT_MACRO(BOOST_NO_LONG_LONG_NUMERIC_LIMITS); - PRINT_MACRO(BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS); - PRINT_MACRO(BOOST_NO_MEMBER_TEMPLATES); - PRINT_MACRO(BOOST_NO_MEMBER_TEMPLATE_FRIENDS); - PRINT_MACRO(BOOST_NO_MEMBER_TEMPLATE_KEYWORD); - PRINT_MACRO(BOOST_NO_MS_INT64_NUMERIC_LIMITS); - PRINT_MACRO(BOOST_NO_NESTED_FRIENDSHIP); - PRINT_MACRO(BOOST_NO_OPERATORS_IN_NAMESPACE); - PRINT_MACRO(BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS); - PRINT_MACRO(BOOST_NO_POINTER_TO_MEMBER_CONST); - PRINT_MACRO(BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS); - PRINT_MACRO(BOOST_NO_PRIVATE_IN_AGGREGATE); - PRINT_MACRO(BOOST_NO_RTTI); - PRINT_MACRO(BOOST_NO_SFINAE); - PRINT_MACRO(BOOST_NO_SFINAE_EXPR); - PRINT_MACRO(BOOST_NO_STDC_NAMESPACE); - PRINT_MACRO(BOOST_NO_STD_ALLOCATOR); - PRINT_MACRO(BOOST_NO_STD_DISTANCE); - PRINT_MACRO(BOOST_NO_STD_ITERATOR); - PRINT_MACRO(BOOST_NO_STD_ITERATOR_TRAITS); - PRINT_MACRO(BOOST_NO_STD_LOCALE); - PRINT_MACRO(BOOST_NO_STD_MESSAGES); - PRINT_MACRO(BOOST_NO_STD_MIN_MAX); - PRINT_MACRO(BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN); - PRINT_MACRO(BOOST_NO_STD_TYPEINFO); - PRINT_MACRO(BOOST_NO_STD_USE_FACET); - PRINT_MACRO(BOOST_NO_STD_WSTREAMBUF); - PRINT_MACRO(BOOST_NO_STD_WSTRING); - PRINT_MACRO(BOOST_NO_STRINGSTREAM); - PRINT_MACRO(BOOST_NO_SWPRINTF); - PRINT_MACRO(BOOST_NO_TEMPLATED_IOSTREAMS); - PRINT_MACRO(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS); - PRINT_MACRO(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION); - PRINT_MACRO(BOOST_NO_TEMPLATE_TEMPLATES); - PRINT_MACRO(BOOST_NO_TWO_PHASE_NAME_LOOKUP); - PRINT_MACRO(BOOST_NO_TYPEID); - PRINT_MACRO(BOOST_NO_TYPENAME_WITH_CTOR); - PRINT_MACRO(BOOST_NO_UNREACHABLE_RETURN_DETECTION); - PRINT_MACRO(BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE); - PRINT_MACRO(BOOST_NO_USING_TEMPLATE); - PRINT_MACRO(BOOST_NO_VOID_RETURNS); - - - - - - - - - - - - - - - // END GENERATED BLOCK - - PRINT_MACRO(BOOST_INTEL); - PRINT_MACRO(BOOST_MSVC); - PRINT_MACRO(BOOST_STD_EXTENSION_NAMESPACE); - PRINT_MACRO(BOOST_UNREACHABLE_RETURN(0)); - PRINT_MACRO(BOOST_CONSTEXPR); - PRINT_MACRO(BOOST_CONSTEXPR_OR_CONST); - PRINT_MACRO(BOOST_STATIC_CONSTEXPR); - PRINT_MACRO(BOOST_NOEXCEPT); - PRINT_MACRO(BOOST_FORCEINLINE); - PRINT_MACRO(BOOST_NOINLINE); - PRINT_MACRO(BOOST_FALLTHROUGH); -} - -void print_separator() -{ - std::cout << -"\n\n*********************************************************************\n\n"; -} - -int main() -{ - - // boost compiler workaround defines - print_compiler_macros(); - print_separator(); - print_stdlib_macros(); - print_separator(); - print_platform_macros(); - print_separator(); - print_boost_macros(); - - return 0; -} diff --git a/libs/config/test/config_test.cpp b/libs/config/test/config_test.cpp deleted file mode 100644 index 77f4511c0..000000000 --- a/libs/config/test/config_test.cpp +++ /dev/null @@ -1,2011 +0,0 @@ -// This file was automatically generated on Mon Dec 12 19:37:08 2016 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - -// Test file for config setup -// This file should compile, if it does not then -// one or more macros need to be defined. -// see boost_*.ipp for more details - -// Do not edit this file, it was generated automatically by - -#include -#include -#include "test.hpp" - -int error_count = 0; - -#ifndef BOOST_NO_ADL_BARRIER -#include "boost_no_adl_barrier.ipp" -#else -namespace boost_no_adl_barrier = empty_boost; -#endif -#ifndef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -#include "boost_no_arg_dep_lookup.ipp" -#else -namespace boost_no_argument_dependent_lookup = empty_boost; -#endif -#ifndef BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS -#include "boost_no_array_type_spec.ipp" -#else -namespace boost_no_array_type_specializations = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_AUTO_DECLARATIONS -#include "boost_no_auto_declarations.ipp" -#else -namespace boost_no_cxx11_auto_declarations = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS -#include "boost_no_auto_multidecl.ipp" -#else -namespace boost_no_cxx11_auto_multideclarations = empty_boost; -#endif -#ifndef BOOST_NO_AUTO_PTR -#include "boost_no_auto_ptr.ipp" -#else -namespace boost_no_auto_ptr = empty_boost; -#endif -#ifndef BOOST_BCB_PARTIAL_SPECIALIZATION_BUG -#include "boost_no_bcb_partial_spec.ipp" -#else -namespace boost_bcb_partial_specialization_bug = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_CHAR16_T -#include "boost_no_char16_t.ipp" -#else -namespace boost_no_cxx11_char16_t = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_CHAR32_T -#include "boost_no_char32_t.ipp" -#else -namespace boost_no_cxx11_char32_t = empty_boost; -#endif -#ifndef BOOST_NO_COMPLETE_VALUE_INITIALIZATION -#include "boost_no_com_value_init.ipp" -#else -namespace boost_no_complete_value_initialization = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_CONSTEXPR -#include "boost_no_constexpr.ipp" -#else -namespace boost_no_cxx11_constexpr = empty_boost; -#endif -#ifndef BOOST_NO_CTYPE_FUNCTIONS -#include "boost_no_ctype_functions.ipp" -#else -namespace boost_no_ctype_functions = empty_boost; -#endif -#ifndef BOOST_NO_CV_SPECIALIZATIONS -#include "boost_no_cv_spec.ipp" -#else -namespace boost_no_cv_specializations = empty_boost; -#endif -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -#include "boost_no_cv_void_spec.ipp" -#else -namespace boost_no_cv_void_specializations = empty_boost; -#endif -#ifndef BOOST_NO_CWCHAR -#include "boost_no_cwchar.ipp" -#else -namespace boost_no_cwchar = empty_boost; -#endif -#ifndef BOOST_NO_CWCTYPE -#include "boost_no_cwctype.ipp" -#else -namespace boost_no_cwctype = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_ADDRESSOF -#include "boost_no_cxx11_addressof.ipp" -#else -namespace boost_no_cxx11_addressof = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_ALIGNAS -#include "boost_no_cxx11_alignas.ipp" -#else -namespace boost_no_cxx11_alignas = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_ALLOCATOR -#include "boost_no_cxx11_allocator.ipp" -#else -namespace boost_no_cxx11_allocator = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_ATOMIC_SMART_PTR -#include "boost_no_cxx11_atomic_sp.ipp" -#else -namespace boost_no_cxx11_atomic_smart_ptr = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_FINAL -#include "boost_no_cxx11_final.ipp" -#else -namespace boost_no_cxx11_final = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_ARRAY -#include "boost_no_cxx11_hdr_array.ipp" -#else -namespace boost_no_cxx11_hdr_array = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_ATOMIC -#include "boost_no_cxx11_hdr_atomic.ipp" -#else -namespace boost_no_cxx11_hdr_atomic = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_CHRONO -#include "boost_no_cxx11_hdr_chrono.ipp" -#else -namespace boost_no_cxx11_hdr_chrono = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_CODECVT -#include "boost_no_cxx11_hdr_codecvt.ipp" -#else -namespace boost_no_cxx11_hdr_codecvt = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_CONDITION_VARIABLE -#include "boost_no_cxx11_hdr_condition_variable.ipp" -#else -namespace boost_no_cxx11_hdr_condition_variable = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_FORWARD_LIST -#include "boost_no_cxx11_hdr_forward_list.ipp" -#else -namespace boost_no_cxx11_hdr_forward_list = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_FUTURE -#include "boost_no_cxx11_hdr_future.ipp" -#else -namespace boost_no_cxx11_hdr_future = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST -#include "boost_no_cxx11_hdr_initializer_list.ipp" -#else -namespace boost_no_cxx11_hdr_initializer_list = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_MUTEX -#include "boost_no_cxx11_hdr_mutex.ipp" -#else -namespace boost_no_cxx11_hdr_mutex = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_RANDOM -#include "boost_no_cxx11_hdr_random.ipp" -#else -namespace boost_no_cxx11_hdr_random = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_RATIO -#include "boost_no_cxx11_hdr_ratio.ipp" -#else -namespace boost_no_cxx11_hdr_ratio = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_REGEX -#include "boost_no_cxx11_hdr_regex.ipp" -#else -namespace boost_no_cxx11_hdr_regex = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_SYSTEM_ERROR -#include "boost_no_cxx11_hdr_system_error.ipp" -#else -namespace boost_no_cxx11_hdr_system_error = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_THREAD -#include "boost_no_cxx11_hdr_thread.ipp" -#else -namespace boost_no_cxx11_hdr_thread = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_TUPLE -#include "boost_no_cxx11_hdr_tuple.ipp" -#else -namespace boost_no_cxx11_hdr_tuple = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_TYPE_TRAITS -#include "boost_no_cxx11_hdr_type_traits.ipp" -#else -namespace boost_no_cxx11_hdr_type_traits = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_TYPEINDEX -#include "boost_no_cxx11_hdr_typeindex.ipp" -#else -namespace boost_no_cxx11_hdr_typeindex = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_UNORDERED_MAP -#include "boost_no_cxx11_hdr_unordered_map.ipp" -#else -namespace boost_no_cxx11_hdr_unordered_map = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_UNORDERED_SET -#include "boost_no_cxx11_hdr_unordered_set.ipp" -#else -namespace boost_no_cxx11_hdr_unordered_set = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_INLINE_NAMESPACES -#include "boost_no_cxx11_inline_namespaces.ipp" -#else -namespace boost_no_cxx11_inline_namespaces = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS -#include "boost_no_cxx11_non_pub_def_fun.ipp" -#else -namespace boost_no_cxx11_non_public_defaulted_functions = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_NUMERIC_LIMITS -#include "boost_no_cxx11_numeric_limits.ipp" -#else -namespace boost_no_cxx11_numeric_limits = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_REF_QUALIFIERS -#include "boost_no_cxx11_ref_qualifiers.ipp" -#else -namespace boost_no_cxx11_ref_qualifiers = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_SMART_PTR -#include "boost_no_cxx11_smart_ptr.ipp" -#else -namespace boost_no_cxx11_smart_ptr = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_STD_ALIGN -#include "boost_no_cxx11_std_align.ipp" -#else -namespace boost_no_cxx11_std_align = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_THREAD_LOCAL -#include "boost_no_cxx11_thread_local.ipp" -#else -namespace boost_no_cxx11_thread_local = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_TRAILING_RESULT_TYPES -#include "boost_no_cxx11_trailing_result_types.ipp" -#else -namespace boost_no_cxx11_trailing_result_types = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_USER_DEFINED_LITERALS -#include "boost_no_cxx11_user_lit.ipp" -#else -namespace boost_no_cxx11_user_defined_literals = empty_boost; -#endif -#ifndef BOOST_NO_CXX14_BINARY_LITERALS -#include "boost_no_cxx14_binary_literals.ipp" -#else -namespace boost_no_cxx14_binary_literals = empty_boost; -#endif -#ifndef BOOST_NO_CXX14_CONSTEXPR -#include "boost_no_cxx14_constexpr.ipp" -#else -namespace boost_no_cxx14_constexpr = empty_boost; -#endif -#ifndef BOOST_NO_CXX14_DECLTYPE_AUTO -#include "boost_no_cxx14_decltype_auto.ipp" -#else -namespace boost_no_cxx14_decltype_auto = empty_boost; -#endif -#ifndef BOOST_NO_CXX14_DIGIT_SEPARATORS -#include "boost_no_cxx14_digit_separator.ipp" -#else -namespace boost_no_cxx14_digit_separators = empty_boost; -#endif -#ifndef BOOST_NO_CXX14_GENERIC_LAMBDAS -#include "boost_no_cxx14_generic_lambda.ipp" -#else -namespace boost_no_cxx14_generic_lambdas = empty_boost; -#endif -#ifndef BOOST_NO_CXX14_HDR_SHARED_MUTEX -#include "boost_no_cxx14_hdr_shared_mutex.ipp" -#else -namespace boost_no_cxx14_hdr_shared_mutex = empty_boost; -#endif -#ifndef BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES -#include "boost_no_cxx14_lambda_capture.ipp" -#else -namespace boost_no_cxx14_initialized_lambda_captures = empty_boost; -#endif -#ifndef BOOST_NO_CXX14_AGGREGATE_NSDMI -#include "boost_no_cxx14_member_init.ipp" -#else -namespace boost_no_cxx14_aggregate_nsdmi = empty_boost; -#endif -#ifndef BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION -#include "boost_no_cxx14_return_type_ded.ipp" -#else -namespace boost_no_cxx14_return_type_deduction = empty_boost; -#endif -#ifndef BOOST_NO_CXX14_STD_EXCHANGE -#include "boost_no_cxx14_std_exchange.ipp" -#else -namespace boost_no_cxx14_std_exchange = empty_boost; -#endif -#ifndef BOOST_NO_CXX14_VARIABLE_TEMPLATES -#include "boost_no_cxx14_var_templ.ipp" -#else -namespace boost_no_cxx14_variable_templates = empty_boost; -#endif -#ifndef BOOST_NO_CXX17_STD_APPLY -#include "boost_no_cxx17_std_apply.ipp" -#else -namespace boost_no_cxx17_std_apply = empty_boost; -#endif -#ifndef BOOST_NO_CXX17_STD_INVOKE -#include "boost_no_cxx17_std_invoke.ipp" -#else -namespace boost_no_cxx17_std_invoke = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL -#include "boost_no_cxx_hdr_functional.ipp" -#else -namespace boost_no_cxx11_hdr_functional = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_DECLTYPE -#include "boost_no_decltype.ipp" -#else -namespace boost_no_cxx11_decltype = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_DECLTYPE_N3276 -#include "boost_no_decltype_n3276.ipp" -#else -namespace boost_no_cxx11_decltype_n3276 = empty_boost; -#endif -#ifndef BOOST_DEDUCED_TYPENAME -#include "boost_no_ded_typename.ipp" -#else -namespace boost_deduced_typename = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS -#include "boost_no_defaulted_functions.ipp" -#else -namespace boost_no_cxx11_defaulted_functions = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_DELETED_FUNCTIONS -#include "boost_no_deleted_functions.ipp" -#else -namespace boost_no_cxx11_deleted_functions = empty_boost; -#endif -#ifndef BOOST_NO_DEPENDENT_NESTED_DERIVATIONS -#include "boost_no_dep_nested_class.ipp" -#else -namespace boost_no_dependent_nested_derivations = empty_boost; -#endif -#ifndef BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS -#include "boost_no_dep_val_param.ipp" -#else -namespace boost_no_dependent_types_in_template_value_parameters = empty_boost; -#endif -#ifndef BOOST_NO_EXCEPTION_STD_NAMESPACE -#include "boost_no_excep_std.ipp" -#else -namespace boost_no_exception_std_namespace = empty_boost; -#endif -#ifndef BOOST_NO_EXCEPTIONS -#include "boost_no_exceptions.ipp" -#else -namespace boost_no_exceptions = empty_boost; -#endif -#ifndef BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -#include "boost_no_exp_func_tem_arg.ipp" -#else -namespace boost_no_explicit_function_template_arguments = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS -#include "boost_no_explicit_cvt_ops.ipp" -#else -namespace boost_no_cxx11_explicit_conversion_operators = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_EXTERN_TEMPLATE -#include "boost_no_extern_template.ipp" -#else -namespace boost_no_cxx11_extern_template = empty_boost; -#endif -#ifndef BOOST_NO_FENV_H -#include "boost_no_fenv_h.ipp" -#else -namespace boost_no_fenv_h = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS -#include "boost_no_fixed_len_variadic_templates.ipp" -#else -namespace boost_no_cxx11_fixed_length_variadic_template_expansion_packs = empty_boost; -#endif -#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING -#include "boost_no_func_tmp_order.ipp" -#else -namespace boost_no_function_template_ordering = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS -#include "boost_no_function_template_default_args.ipp" -#else -namespace boost_no_cxx11_function_template_default_args = empty_boost; -#endif -#ifndef BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS -#include "boost_no_function_type_spec.ipp" -#else -namespace boost_no_function_type_specializations = empty_boost; -#endif -#ifndef BOOST_NO_MS_INT64_NUMERIC_LIMITS -#include "boost_no_i64_limits.ipp" -#else -namespace boost_no_ms_int64_numeric_limits = empty_boost; -#endif -#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION -#include "boost_no_inline_memb_init.ipp" -#else -namespace boost_no_inclass_member_initialization = empty_boost; -#endif -#ifndef BOOST_NO_INTEGRAL_INT64_T -#include "boost_no_integral_int64_t.ipp" -#else -namespace boost_no_integral_int64_t = empty_boost; -#endif -#ifndef BOOST_NO_IOSFWD -#include "boost_no_iosfwd.ipp" -#else -namespace boost_no_iosfwd = empty_boost; -#endif -#ifndef BOOST_NO_IOSTREAM -#include "boost_no_iostream.ipp" -#else -namespace boost_no_iostream = empty_boost; -#endif -#ifndef BOOST_NO_IS_ABSTRACT -#include "boost_no_is_abstract.ipp" -#else -namespace boost_no_is_abstract = empty_boost; -#endif -#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS -#include "boost_no_iter_construct.ipp" -#else -namespace boost_no_templated_iterator_constructors = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_LAMBDAS -#include "boost_no_lambdas.ipp" -#else -namespace boost_no_cxx11_lambdas = empty_boost; -#endif -#ifndef BOOST_NO_LIMITS -#include "boost_no_limits.ipp" -#else -namespace boost_no_limits = empty_boost; -#endif -#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -#include "boost_no_limits_const_exp.ipp" -#else -namespace boost_no_limits_compile_time_constants = empty_boost; -#endif -#ifndef BOOST_NO_LONG_LONG_NUMERIC_LIMITS -#include "boost_no_ll_limits.ipp" -#else -namespace boost_no_long_long_numeric_limits = empty_boost; -#endif -#ifndef BOOST_NO_LONG_LONG -#include "boost_no_long_long.ipp" -#else -namespace boost_no_long_long = empty_boost; -#endif -#ifndef BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS -#include "boost_no_mem_func_spec.ipp" -#else -namespace boost_no_member_function_specializations = empty_boost; -#endif -#ifndef BOOST_NO_MEMBER_TEMPLATE_KEYWORD -#include "boost_no_mem_tem_keyword.ipp" -#else -namespace boost_no_member_template_keyword = empty_boost; -#endif -#ifndef BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS -#include "boost_no_mem_tem_pnts.ipp" -#else -namespace boost_no_pointer_to_member_template_parameters = empty_boost; -#endif -#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS -#include "boost_no_mem_templ_frnds.ipp" -#else -namespace boost_no_member_template_friends = empty_boost; -#endif -#ifndef BOOST_NO_MEMBER_TEMPLATES -#include "boost_no_mem_templates.ipp" -#else -namespace boost_no_member_templates = empty_boost; -#endif -#ifndef BOOST_NO_NESTED_FRIENDSHIP -#include "boost_no_nested_friendship.ipp" -#else -namespace boost_no_nested_friendship = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_NOEXCEPT -#include "boost_no_noexcept.ipp" -#else -namespace boost_no_cxx11_noexcept = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_NULLPTR -#include "boost_no_nullptr.ipp" -#else -namespace boost_no_cxx11_nullptr = empty_boost; -#endif -#ifndef BOOST_NO_OPERATORS_IN_NAMESPACE -#include "boost_no_ops_in_namespace.ipp" -#else -namespace boost_no_operators_in_namespace = empty_boost; -#endif -#ifndef BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS -#include "boost_no_part_spec_def_args.ipp" -#else -namespace boost_no_partial_specialization_implicit_default_args = empty_boost; -#endif -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -#include "boost_no_partial_spec.ipp" -#else -namespace boost_no_template_partial_specialization = empty_boost; -#endif -#ifndef BOOST_NO_PRIVATE_IN_AGGREGATE -#include "boost_no_priv_aggregate.ipp" -#else -namespace boost_no_private_in_aggregate = empty_boost; -#endif -#ifndef BOOST_NO_POINTER_TO_MEMBER_CONST -#include "boost_no_ptr_mem_const.ipp" -#else -namespace boost_no_pointer_to_member_const = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_RANGE_BASED_FOR -#include "boost_no_range_based_for.ipp" -#else -namespace boost_no_cxx11_range_based_for = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_RAW_LITERALS -#include "boost_no_raw_literals.ipp" -#else -namespace boost_no_cxx11_raw_literals = empty_boost; -#endif -#ifndef BOOST_NO_UNREACHABLE_RETURN_DETECTION -#include "boost_no_ret_det.ipp" -#else -namespace boost_no_unreachable_return_detection = empty_boost; -#endif -#ifndef BOOST_NO_RTTI -#include "boost_no_rtti.ipp" -#else -namespace boost_no_rtti = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES -#include "boost_no_rvalue_references.ipp" -#else -namespace boost_no_cxx11_rvalue_references = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_SCOPED_ENUMS -#include "boost_no_scoped_enums.ipp" -#else -namespace boost_no_cxx11_scoped_enums = empty_boost; -#endif -#ifndef BOOST_NO_SFINAE -#include "boost_no_sfinae.ipp" -#else -namespace boost_no_sfinae = empty_boost; -#endif -#ifndef BOOST_NO_SFINAE_EXPR -#include "boost_no_sfinae_expr.ipp" -#else -namespace boost_no_sfinae_expr = empty_boost; -#endif -#ifndef BOOST_NO_STRINGSTREAM -#include "boost_no_sstream.ipp" -#else -namespace boost_no_stringstream = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_STATIC_ASSERT -#include "boost_no_static_assert.ipp" -#else -namespace boost_no_cxx11_static_assert = empty_boost; -#endif -#ifndef BOOST_NO_STD_ALLOCATOR -#include "boost_no_std_allocator.ipp" -#else -namespace boost_no_std_allocator = empty_boost; -#endif -#ifndef BOOST_NO_STD_DISTANCE -#include "boost_no_std_distance.ipp" -#else -namespace boost_no_std_distance = empty_boost; -#endif -#ifndef BOOST_NO_STD_ITERATOR_TRAITS -#include "boost_no_std_iter_traits.ipp" -#else -namespace boost_no_std_iterator_traits = empty_boost; -#endif -#ifndef BOOST_NO_STD_ITERATOR -#include "boost_no_std_iterator.ipp" -#else -namespace boost_no_std_iterator = empty_boost; -#endif -#ifndef BOOST_NO_STD_LOCALE -#include "boost_no_std_locale.ipp" -#else -namespace boost_no_std_locale = empty_boost; -#endif -#ifndef BOOST_NO_STD_MESSAGES -#include "boost_no_std_messages.ipp" -#else -namespace boost_no_std_messages = empty_boost; -#endif -#ifndef BOOST_NO_STD_MIN_MAX -#include "boost_no_std_min_max.ipp" -#else -namespace boost_no_std_min_max = empty_boost; -#endif -#ifndef BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN -#include "boost_no_std_oi_assign.ipp" -#else -namespace boost_no_std_output_iterator_assign = empty_boost; -#endif -#ifndef BOOST_NO_STD_TYPEINFO -#include "boost_no_std_typeinfo.ipp" -#else -namespace boost_no_std_typeinfo = empty_boost; -#endif -#ifndef BOOST_NO_STD_USE_FACET -#include "boost_no_std_use_facet.ipp" -#else -namespace boost_no_std_use_facet = empty_boost; -#endif -#ifndef BOOST_NO_STD_WSTREAMBUF -#include "boost_no_std_wstreambuf.ipp" -#else -namespace boost_no_std_wstreambuf = empty_boost; -#endif -#ifndef BOOST_NO_STD_WSTRING -#include "boost_no_std_wstring.ipp" -#else -namespace boost_no_std_wstring = empty_boost; -#endif -#ifndef BOOST_NO_STDC_NAMESPACE -#include "boost_no_stdc_namespace.ipp" -#else -namespace boost_no_stdc_namespace = empty_boost; -#endif -#ifndef BOOST_NO_SWPRINTF -#include "boost_no_swprintf.ipp" -#else -namespace boost_no_swprintf = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS -#include "boost_no_tem_local_classes.ipp" -#else -namespace boost_no_cxx11_local_class_template_parameters = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_TEMPLATE_ALIASES -#include "boost_no_template_aliases.ipp" -#else -namespace boost_no_cxx11_template_aliases = empty_boost; -#endif -#ifndef BOOST_NO_TEMPLATED_IOSTREAMS -#include "boost_no_template_streams.ipp" -#else -namespace boost_no_templated_iostreams = empty_boost; -#endif -#ifndef BOOST_NO_TEMPLATE_TEMPLATES -#include "boost_no_template_template.ipp" -#else -namespace boost_no_template_templates = empty_boost; -#endif -#ifndef BOOST_NO_TWO_PHASE_NAME_LOOKUP -#include "boost_no_two_phase_lookup.ipp" -#else -namespace boost_no_two_phase_name_lookup = empty_boost; -#endif -#ifndef BOOST_NO_TYPEID -#include "boost_no_typeid.ipp" -#else -namespace boost_no_typeid = empty_boost; -#endif -#ifndef BOOST_NO_TYPENAME_WITH_CTOR -#include "boost_no_typename_with_ctor.ipp" -#else -namespace boost_no_typename_with_ctor = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_UNICODE_LITERALS -#include "boost_no_unicode_literals.ipp" -#else -namespace boost_no_cxx11_unicode_literals = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX -#include "boost_no_unified_init.ipp" -#else -namespace boost_no_cxx11_unified_initialization_syntax = empty_boost; -#endif -#ifndef BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -#include "boost_no_using_breaks_adl.ipp" -#else -namespace boost_function_scope_using_declaration_breaks_adl = empty_boost; -#endif -#ifndef BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE -#include "boost_no_using_decl_overld.ipp" -#else -namespace boost_no_using_declaration_overloads_from_typename_base = empty_boost; -#endif -#ifndef BOOST_NO_USING_TEMPLATE -#include "boost_no_using_template.ipp" -#else -namespace boost_no_using_template = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_VARIADIC_MACROS -#include "boost_no_variadic_macros.ipp" -#else -namespace boost_no_cxx11_variadic_macros = empty_boost; -#endif -#ifndef BOOST_NO_CXX11_VARIADIC_TEMPLATES -#include "boost_no_variadic_templates.ipp" -#else -namespace boost_no_cxx11_variadic_templates = empty_boost; -#endif -#ifndef BOOST_NO_VOID_RETURNS -#include "boost_no_void_returns.ipp" -#else -namespace boost_no_void_returns = empty_boost; -#endif -#ifndef BOOST_NO_INTRINSIC_WCHAR_T -#include "boost_no_wchar_t.ipp" -#else -namespace boost_no_intrinsic_wchar_t = empty_boost; -#endif - -#ifdef BOOST_HAS_TWO_ARG_USE_FACET -#include "boost_has_2arg_use_facet.ipp" -#else -namespace boost_has_two_arg_use_facet = empty_boost; -#endif -#ifdef BOOST_HAS_BETHREADS -#include "boost_has_bethreads.ipp" -#else -namespace boost_has_bethreads = empty_boost; -#endif -#ifdef BOOST_HAS_CLOCK_GETTIME -#include "boost_has_clock_gettime.ipp" -#else -namespace boost_has_clock_gettime = empty_boost; -#endif -#ifdef BOOST_HAS_DIRENT_H -#include "boost_has_dirent_h.ipp" -#else -namespace boost_has_dirent_h = empty_boost; -#endif -#ifdef BOOST_HAS_EXPM1 -#include "boost_has_expm1.ipp" -#else -namespace boost_has_expm1 = empty_boost; -#endif -#ifdef BOOST_HAS_FLOAT128 -#include "boost_has_float128.ipp" -#else -namespace boost_has_float128 = empty_boost; -#endif -#ifdef BOOST_HAS_FTIME -#include "boost_has_ftime.ipp" -#else -namespace boost_has_ftime = empty_boost; -#endif -#ifdef BOOST_HAS_GETSYSTEMTIMEASFILETIME -#include "boost_has_getsystemtimeasfiletime.ipp" -#else -namespace boost_has_getsystemtimeasfiletime = empty_boost; -#endif -#ifdef BOOST_HAS_GETTIMEOFDAY -#include "boost_has_gettimeofday.ipp" -#else -namespace boost_has_gettimeofday = empty_boost; -#endif -#ifdef BOOST_HAS_HASH -#include "boost_has_hash.ipp" -#else -namespace boost_has_hash = empty_boost; -#endif -#ifdef BOOST_HAS_INT128 -#include "boost_has_int128.ipp" -#else -namespace boost_has_int128 = empty_boost; -#endif -#ifdef BOOST_HAS_LOG1P -#include "boost_has_log1p.ipp" -#else -namespace boost_has_log1p = empty_boost; -#endif -#ifdef BOOST_HAS_LONG_LONG -#include "boost_has_long_long.ipp" -#else -namespace boost_has_long_long = empty_boost; -#endif -#ifdef BOOST_HAS_MACRO_USE_FACET -#include "boost_has_macro_use_facet.ipp" -#else -namespace boost_has_macro_use_facet = empty_boost; -#endif -#ifdef BOOST_HAS_MS_INT64 -#include "boost_has_ms_int64.ipp" -#else -namespace boost_has_ms_int64 = empty_boost; -#endif -#ifdef BOOST_HAS_NANOSLEEP -#include "boost_has_nanosleep.ipp" -#else -namespace boost_has_nanosleep = empty_boost; -#endif -#ifdef BOOST_HAS_NL_TYPES_H -#include "boost_has_nl_types_h.ipp" -#else -namespace boost_has_nl_types_h = empty_boost; -#endif -#ifdef BOOST_HAS_NRVO -#include "boost_has_nrvo.ipp" -#else -namespace boost_has_nrvo = empty_boost; -#endif -#ifdef BOOST_HAS_PARTIAL_STD_ALLOCATOR -#include "boost_has_part_alloc.ipp" -#else -namespace boost_has_partial_std_allocator = empty_boost; -#endif -#ifdef BOOST_HAS_PTHREAD_DELAY_NP -#include "boost_has_pthread_delay_np.ipp" -#else -namespace boost_has_pthread_delay_np = empty_boost; -#endif -#ifdef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -#include "boost_has_pthread_ma_st.ipp" -#else -namespace boost_has_pthread_mutexattr_settype = empty_boost; -#endif -#ifdef BOOST_HAS_PTHREAD_YIELD -#include "boost_has_pthread_yield.ipp" -#else -namespace boost_has_pthread_yield = empty_boost; -#endif -#ifdef BOOST_HAS_PTHREADS -#include "boost_has_pthreads.ipp" -#else -namespace boost_has_pthreads = empty_boost; -#endif -#ifdef BOOST_HAS_RVALUE_REFS -#include "boost_has_rvalue_refs.ipp" -#else -namespace boost_has_rvalue_refs = empty_boost; -#endif -#ifdef BOOST_HAS_SCHED_YIELD -#include "boost_has_sched_yield.ipp" -#else -namespace boost_has_sched_yield = empty_boost; -#endif -#ifdef BOOST_HAS_SGI_TYPE_TRAITS -#include "boost_has_sgi_type_traits.ipp" -#else -namespace boost_has_sgi_type_traits = empty_boost; -#endif -#ifdef BOOST_HAS_SIGACTION -#include "boost_has_sigaction.ipp" -#else -namespace boost_has_sigaction = empty_boost; -#endif -#ifdef BOOST_HAS_SLIST -#include "boost_has_slist.ipp" -#else -namespace boost_has_slist = empty_boost; -#endif -#ifdef BOOST_HAS_STATIC_ASSERT -#include "boost_has_static_assert.ipp" -#else -namespace boost_has_static_assert = empty_boost; -#endif -#ifdef BOOST_HAS_STDINT_H -#include "boost_has_stdint_h.ipp" -#else -namespace boost_has_stdint_h = empty_boost; -#endif -#ifdef BOOST_HAS_STLP_USE_FACET -#include "boost_has_stlp_use_facet.ipp" -#else -namespace boost_has_stlp_use_facet = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_ARRAY -#include "boost_has_tr1_array.ipp" -#else -namespace boost_has_tr1_array = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_BIND -#include "boost_has_tr1_bind.ipp" -#else -namespace boost_has_tr1_bind = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_COMPLEX_OVERLOADS -#include "boost_has_tr1_complex_over.ipp" -#else -namespace boost_has_tr1_complex_overloads = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG -#include "boost_has_tr1_complex_trig.ipp" -#else -namespace boost_has_tr1_complex_inverse_trig = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_FUNCTION -#include "boost_has_tr1_function.ipp" -#else -namespace boost_has_tr1_function = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_HASH -#include "boost_has_tr1_hash.ipp" -#else -namespace boost_has_tr1_hash = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_MEM_FN -#include "boost_has_tr1_mem_fn.ipp" -#else -namespace boost_has_tr1_mem_fn = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_RANDOM -#include "boost_has_tr1_random.ipp" -#else -namespace boost_has_tr1_random = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_REFERENCE_WRAPPER -#include "boost_has_tr1_ref_wrap.ipp" -#else -namespace boost_has_tr1_reference_wrapper = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_REGEX -#include "boost_has_tr1_regex.ipp" -#else -namespace boost_has_tr1_regex = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_RESULT_OF -#include "boost_has_tr1_result_of.ipp" -#else -namespace boost_has_tr1_result_of = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_SHARED_PTR -#include "boost_has_tr1_shared_ptr.ipp" -#else -namespace boost_has_tr1_shared_ptr = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_TUPLE -#include "boost_has_tr1_tuple.ipp" -#else -namespace boost_has_tr1_tuple = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_TYPE_TRAITS -#include "boost_has_tr1_type_traits.ipp" -#else -namespace boost_has_tr1_type_traits = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_UNORDERED_MAP -#include "boost_has_tr1_unordered_map.ipp" -#else -namespace boost_has_tr1_unordered_map = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_UNORDERED_SET -#include "boost_has_tr1_unordered_set.ipp" -#else -namespace boost_has_tr1_unordered_set = empty_boost; -#endif -#ifdef BOOST_HAS_TR1_UTILITY -#include "boost_has_tr1_utility.ipp" -#else -namespace boost_has_tr1_utility = empty_boost; -#endif -#ifdef BOOST_HAS_UNISTD_H -#include "boost_has_unistd_h.ipp" -#else -namespace boost_has_unistd_h = empty_boost; -#endif -#ifdef BOOST_HAS_VARIADIC_TMPL -#include "boost_has_variadic_tmpl.ipp" -#else -namespace boost_has_variadic_tmpl = empty_boost; -#endif -#ifdef BOOST_MSVC6_MEMBER_TEMPLATES -#include "boost_has_vc6_mem_templ.ipp" -#else -namespace boost_msvc6_member_templates = empty_boost; -#endif -#ifdef BOOST_MSVC_STD_ITERATOR -#include "boost_has_vc_iterator.ipp" -#else -namespace boost_msvc_std_iterator = empty_boost; -#endif -#ifdef BOOST_HAS_WINTHREADS -#include "boost_has_winthreads.ipp" -#else -namespace boost_has_winthreads = empty_boost; -#endif - -int main( int, char *[] ) -{ - if(0 != boost_has_two_arg_use_facet::test()) - { - std::cerr << "Failed test for BOOST_HAS_TWO_ARG_USE_FACET at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_bethreads::test()) - { - std::cerr << "Failed test for BOOST_HAS_BETHREADS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_clock_gettime::test()) - { - std::cerr << "Failed test for BOOST_HAS_CLOCK_GETTIME at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_dirent_h::test()) - { - std::cerr << "Failed test for BOOST_HAS_DIRENT_H at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_expm1::test()) - { - std::cerr << "Failed test for BOOST_HAS_EXPM1 at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_float128::test()) - { - std::cerr << "Failed test for BOOST_HAS_FLOAT128 at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_ftime::test()) - { - std::cerr << "Failed test for BOOST_HAS_FTIME at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_getsystemtimeasfiletime::test()) - { - std::cerr << "Failed test for BOOST_HAS_GETSYSTEMTIMEASFILETIME at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_gettimeofday::test()) - { - std::cerr << "Failed test for BOOST_HAS_GETTIMEOFDAY at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_hash::test()) - { - std::cerr << "Failed test for BOOST_HAS_HASH at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_int128::test()) - { - std::cerr << "Failed test for BOOST_HAS_INT128 at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_log1p::test()) - { - std::cerr << "Failed test for BOOST_HAS_LOG1P at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_long_long::test()) - { - std::cerr << "Failed test for BOOST_HAS_LONG_LONG at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_macro_use_facet::test()) - { - std::cerr << "Failed test for BOOST_HAS_MACRO_USE_FACET at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_ms_int64::test()) - { - std::cerr << "Failed test for BOOST_HAS_MS_INT64 at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_nanosleep::test()) - { - std::cerr << "Failed test for BOOST_HAS_NANOSLEEP at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_nl_types_h::test()) - { - std::cerr << "Failed test for BOOST_HAS_NL_TYPES_H at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_nrvo::test()) - { - std::cerr << "Failed test for BOOST_HAS_NRVO at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_partial_std_allocator::test()) - { - std::cerr << "Failed test for BOOST_HAS_PARTIAL_STD_ALLOCATOR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_pthread_delay_np::test()) - { - std::cerr << "Failed test for BOOST_HAS_PTHREAD_DELAY_NP at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_pthread_mutexattr_settype::test()) - { - std::cerr << "Failed test for BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_pthread_yield::test()) - { - std::cerr << "Failed test for BOOST_HAS_PTHREAD_YIELD at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_pthreads::test()) - { - std::cerr << "Failed test for BOOST_HAS_PTHREADS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_rvalue_refs::test()) - { - std::cerr << "Failed test for BOOST_HAS_RVALUE_REFS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_sched_yield::test()) - { - std::cerr << "Failed test for BOOST_HAS_SCHED_YIELD at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_sgi_type_traits::test()) - { - std::cerr << "Failed test for BOOST_HAS_SGI_TYPE_TRAITS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_sigaction::test()) - { - std::cerr << "Failed test for BOOST_HAS_SIGACTION at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_slist::test()) - { - std::cerr << "Failed test for BOOST_HAS_SLIST at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_static_assert::test()) - { - std::cerr << "Failed test for BOOST_HAS_STATIC_ASSERT at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_stdint_h::test()) - { - std::cerr << "Failed test for BOOST_HAS_STDINT_H at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_stlp_use_facet::test()) - { - std::cerr << "Failed test for BOOST_HAS_STLP_USE_FACET at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_array::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_ARRAY at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_bind::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_BIND at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_complex_overloads::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_COMPLEX_OVERLOADS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_complex_inverse_trig::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_function::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_FUNCTION at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_hash::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_HASH at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_mem_fn::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_MEM_FN at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_random::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_RANDOM at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_reference_wrapper::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_REFERENCE_WRAPPER at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_regex::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_REGEX at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_result_of::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_RESULT_OF at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_shared_ptr::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_SHARED_PTR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_tuple::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_TUPLE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_type_traits::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_TYPE_TRAITS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_unordered_map::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_UNORDERED_MAP at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_unordered_set::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_UNORDERED_SET at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_tr1_utility::test()) - { - std::cerr << "Failed test for BOOST_HAS_TR1_UTILITY at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_unistd_h::test()) - { - std::cerr << "Failed test for BOOST_HAS_UNISTD_H at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_variadic_tmpl::test()) - { - std::cerr << "Failed test for BOOST_HAS_VARIADIC_TMPL at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_msvc6_member_templates::test()) - { - std::cerr << "Failed test for BOOST_MSVC6_MEMBER_TEMPLATES at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_msvc_std_iterator::test()) - { - std::cerr << "Failed test for BOOST_MSVC_STD_ITERATOR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_has_winthreads::test()) - { - std::cerr << "Failed test for BOOST_HAS_WINTHREADS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_adl_barrier::test()) - { - std::cerr << "Failed test for BOOST_NO_ADL_BARRIER at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_argument_dependent_lookup::test()) - { - std::cerr << "Failed test for BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_array_type_specializations::test()) - { - std::cerr << "Failed test for BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_auto_declarations::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_AUTO_DECLARATIONS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_auto_multideclarations::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_auto_ptr::test()) - { - std::cerr << "Failed test for BOOST_NO_AUTO_PTR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_bcb_partial_specialization_bug::test()) - { - std::cerr << "Failed test for BOOST_BCB_PARTIAL_SPECIALIZATION_BUG at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_char16_t::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_CHAR16_T at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_char32_t::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_CHAR32_T at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_complete_value_initialization::test()) - { - std::cerr << "Failed test for BOOST_NO_COMPLETE_VALUE_INITIALIZATION at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_constexpr::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_CONSTEXPR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_ctype_functions::test()) - { - std::cerr << "Failed test for BOOST_NO_CTYPE_FUNCTIONS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cv_specializations::test()) - { - std::cerr << "Failed test for BOOST_NO_CV_SPECIALIZATIONS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cv_void_specializations::test()) - { - std::cerr << "Failed test for BOOST_NO_CV_VOID_SPECIALIZATIONS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cwchar::test()) - { - std::cerr << "Failed test for BOOST_NO_CWCHAR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cwctype::test()) - { - std::cerr << "Failed test for BOOST_NO_CWCTYPE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_addressof::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_ADDRESSOF at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_alignas::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_ALIGNAS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_allocator::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_ALLOCATOR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_atomic_smart_ptr::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_ATOMIC_SMART_PTR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_final::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_FINAL at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_array::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_ARRAY at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_atomic::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_ATOMIC at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_chrono::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_CHRONO at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_codecvt::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_CODECVT at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_condition_variable::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_CONDITION_VARIABLE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_forward_list::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_FORWARD_LIST at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_future::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_FUTURE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_initializer_list::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_INITIALIZER_LIST at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_mutex::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_MUTEX at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_random::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_RANDOM at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_ratio::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_RATIO at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_regex::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_REGEX at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_system_error::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_SYSTEM_ERROR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_thread::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_THREAD at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_tuple::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_TUPLE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_type_traits::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_TYPE_TRAITS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_typeindex::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_TYPEINDEX at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_unordered_map::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_UNORDERED_MAP at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_unordered_set::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_UNORDERED_SET at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_inline_namespaces::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_INLINE_NAMESPACES at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_non_public_defaulted_functions::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_numeric_limits::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_NUMERIC_LIMITS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_ref_qualifiers::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_REF_QUALIFIERS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_smart_ptr::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_SMART_PTR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_std_align::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_STD_ALIGN at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_thread_local::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_THREAD_LOCAL at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_trailing_result_types::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_TRAILING_RESULT_TYPES at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_user_defined_literals::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_USER_DEFINED_LITERALS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx14_binary_literals::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX14_BINARY_LITERALS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx14_constexpr::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX14_CONSTEXPR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx14_decltype_auto::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX14_DECLTYPE_AUTO at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx14_digit_separators::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX14_DIGIT_SEPARATORS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx14_generic_lambdas::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX14_GENERIC_LAMBDAS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx14_hdr_shared_mutex::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX14_HDR_SHARED_MUTEX at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx14_initialized_lambda_captures::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx14_aggregate_nsdmi::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX14_AGGREGATE_NSDMI at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx14_return_type_deduction::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx14_std_exchange::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX14_STD_EXCHANGE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx14_variable_templates::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX14_VARIABLE_TEMPLATES at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx17_std_apply::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX17_STD_APPLY at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx17_std_invoke::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX17_STD_INVOKE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_hdr_functional::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_HDR_FUNCTIONAL at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_decltype::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_DECLTYPE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_decltype_n3276::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_DECLTYPE_N3276 at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_deduced_typename::test()) - { - std::cerr << "Failed test for BOOST_DEDUCED_TYPENAME at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_defaulted_functions::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_DEFAULTED_FUNCTIONS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_deleted_functions::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_DELETED_FUNCTIONS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_dependent_nested_derivations::test()) - { - std::cerr << "Failed test for BOOST_NO_DEPENDENT_NESTED_DERIVATIONS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_dependent_types_in_template_value_parameters::test()) - { - std::cerr << "Failed test for BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_exception_std_namespace::test()) - { - std::cerr << "Failed test for BOOST_NO_EXCEPTION_STD_NAMESPACE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_exceptions::test()) - { - std::cerr << "Failed test for BOOST_NO_EXCEPTIONS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_explicit_function_template_arguments::test()) - { - std::cerr << "Failed test for BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_explicit_conversion_operators::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_extern_template::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_EXTERN_TEMPLATE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_fenv_h::test()) - { - std::cerr << "Failed test for BOOST_NO_FENV_H at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_fixed_length_variadic_template_expansion_packs::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_function_template_ordering::test()) - { - std::cerr << "Failed test for BOOST_NO_FUNCTION_TEMPLATE_ORDERING at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_function_template_default_args::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_function_type_specializations::test()) - { - std::cerr << "Failed test for BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_ms_int64_numeric_limits::test()) - { - std::cerr << "Failed test for BOOST_NO_MS_INT64_NUMERIC_LIMITS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_inclass_member_initialization::test()) - { - std::cerr << "Failed test for BOOST_NO_INCLASS_MEMBER_INITIALIZATION at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_integral_int64_t::test()) - { - std::cerr << "Failed test for BOOST_NO_INTEGRAL_INT64_T at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_iosfwd::test()) - { - std::cerr << "Failed test for BOOST_NO_IOSFWD at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_iostream::test()) - { - std::cerr << "Failed test for BOOST_NO_IOSTREAM at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_is_abstract::test()) - { - std::cerr << "Failed test for BOOST_NO_IS_ABSTRACT at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_templated_iterator_constructors::test()) - { - std::cerr << "Failed test for BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_lambdas::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_LAMBDAS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_limits::test()) - { - std::cerr << "Failed test for BOOST_NO_LIMITS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_limits_compile_time_constants::test()) - { - std::cerr << "Failed test for BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_long_long_numeric_limits::test()) - { - std::cerr << "Failed test for BOOST_NO_LONG_LONG_NUMERIC_LIMITS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_long_long::test()) - { - std::cerr << "Failed test for BOOST_NO_LONG_LONG at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_member_function_specializations::test()) - { - std::cerr << "Failed test for BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_member_template_keyword::test()) - { - std::cerr << "Failed test for BOOST_NO_MEMBER_TEMPLATE_KEYWORD at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_pointer_to_member_template_parameters::test()) - { - std::cerr << "Failed test for BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_member_template_friends::test()) - { - std::cerr << "Failed test for BOOST_NO_MEMBER_TEMPLATE_FRIENDS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_member_templates::test()) - { - std::cerr << "Failed test for BOOST_NO_MEMBER_TEMPLATES at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_nested_friendship::test()) - { - std::cerr << "Failed test for BOOST_NO_NESTED_FRIENDSHIP at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_noexcept::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_NOEXCEPT at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_nullptr::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_NULLPTR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_operators_in_namespace::test()) - { - std::cerr << "Failed test for BOOST_NO_OPERATORS_IN_NAMESPACE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_partial_specialization_implicit_default_args::test()) - { - std::cerr << "Failed test for BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_template_partial_specialization::test()) - { - std::cerr << "Failed test for BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_private_in_aggregate::test()) - { - std::cerr << "Failed test for BOOST_NO_PRIVATE_IN_AGGREGATE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_pointer_to_member_const::test()) - { - std::cerr << "Failed test for BOOST_NO_POINTER_TO_MEMBER_CONST at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_range_based_for::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_RANGE_BASED_FOR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_raw_literals::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_RAW_LITERALS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_unreachable_return_detection::test()) - { - std::cerr << "Failed test for BOOST_NO_UNREACHABLE_RETURN_DETECTION at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_rtti::test()) - { - std::cerr << "Failed test for BOOST_NO_RTTI at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_rvalue_references::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_RVALUE_REFERENCES at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_scoped_enums::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_SCOPED_ENUMS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_sfinae::test()) - { - std::cerr << "Failed test for BOOST_NO_SFINAE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_sfinae_expr::test()) - { - std::cerr << "Failed test for BOOST_NO_SFINAE_EXPR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_stringstream::test()) - { - std::cerr << "Failed test for BOOST_NO_STRINGSTREAM at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_static_assert::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_STATIC_ASSERT at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_std_allocator::test()) - { - std::cerr << "Failed test for BOOST_NO_STD_ALLOCATOR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_std_distance::test()) - { - std::cerr << "Failed test for BOOST_NO_STD_DISTANCE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_std_iterator_traits::test()) - { - std::cerr << "Failed test for BOOST_NO_STD_ITERATOR_TRAITS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_std_iterator::test()) - { - std::cerr << "Failed test for BOOST_NO_STD_ITERATOR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_std_locale::test()) - { - std::cerr << "Failed test for BOOST_NO_STD_LOCALE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_std_messages::test()) - { - std::cerr << "Failed test for BOOST_NO_STD_MESSAGES at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_std_min_max::test()) - { - std::cerr << "Failed test for BOOST_NO_STD_MIN_MAX at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_std_output_iterator_assign::test()) - { - std::cerr << "Failed test for BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_std_typeinfo::test()) - { - std::cerr << "Failed test for BOOST_NO_STD_TYPEINFO at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_std_use_facet::test()) - { - std::cerr << "Failed test for BOOST_NO_STD_USE_FACET at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_std_wstreambuf::test()) - { - std::cerr << "Failed test for BOOST_NO_STD_WSTREAMBUF at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_std_wstring::test()) - { - std::cerr << "Failed test for BOOST_NO_STD_WSTRING at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_stdc_namespace::test()) - { - std::cerr << "Failed test for BOOST_NO_STDC_NAMESPACE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_swprintf::test()) - { - std::cerr << "Failed test for BOOST_NO_SWPRINTF at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_local_class_template_parameters::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_template_aliases::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_TEMPLATE_ALIASES at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_templated_iostreams::test()) - { - std::cerr << "Failed test for BOOST_NO_TEMPLATED_IOSTREAMS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_template_templates::test()) - { - std::cerr << "Failed test for BOOST_NO_TEMPLATE_TEMPLATES at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_two_phase_name_lookup::test()) - { - std::cerr << "Failed test for BOOST_NO_TWO_PHASE_NAME_LOOKUP at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_typeid::test()) - { - std::cerr << "Failed test for BOOST_NO_TYPEID at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_typename_with_ctor::test()) - { - std::cerr << "Failed test for BOOST_NO_TYPENAME_WITH_CTOR at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_unicode_literals::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_UNICODE_LITERALS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_unified_initialization_syntax::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_function_scope_using_declaration_breaks_adl::test()) - { - std::cerr << "Failed test for BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_using_declaration_overloads_from_typename_base::test()) - { - std::cerr << "Failed test for BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_using_template::test()) - { - std::cerr << "Failed test for BOOST_NO_USING_TEMPLATE at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_variadic_macros::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_VARIADIC_MACROS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_cxx11_variadic_templates::test()) - { - std::cerr << "Failed test for BOOST_NO_CXX11_VARIADIC_TEMPLATES at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_void_returns::test()) - { - std::cerr << "Failed test for BOOST_NO_VOID_RETURNS at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - if(0 != boost_no_intrinsic_wchar_t::test()) - { - std::cerr << "Failed test for BOOST_NO_INTRINSIC_WCHAR_T at: " << __FILE__ << ":" << __LINE__ << std::endl; - ++error_count; - } - return error_count; -} - diff --git a/libs/config/test/config_test_c.c b/libs/config/test/config_test_c.c deleted file mode 100644 index 9955dbe60..000000000 --- a/libs/config/test/config_test_c.c +++ /dev/null @@ -1,9 +0,0 @@ - - -#include - - -int main() -{ - return 0; -} diff --git a/libs/config/test/cstdint_include_test.cpp b/libs/config/test/cstdint_include_test.cpp deleted file mode 100644 index 25d37c82d..000000000 --- a/libs/config/test/cstdint_include_test.cpp +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright John Maddock 2009. -// Distributed under the 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 __STDC_CONSTANT_MACROS -#include // must be the only #include! - -int main() -{ - boost::int8_t i8 = INT8_C(0); - (void)i8; - boost::uint8_t ui8 = UINT8_C(0); - (void)ui8; - boost::int16_t i16 = INT16_C(0); - (void)i16; - boost::uint16_t ui16 = UINT16_C(0); - (void)ui16; - boost::int32_t i32 = INT32_C(0); - (void)i32; - boost::uint32_t ui32 = UINT32_C(0); - (void)ui32; -#ifndef BOOST_NO_INT64_T - boost::int64_t i64 = 0; - (void)i64; - boost::uint64_t ui64 = 0; - (void)ui64; -#endif - boost::int_least8_t i8least = INT8_C(0); - (void)i8least; - boost::uint_least8_t ui8least = UINT8_C(0); - (void)ui8least; - boost::int_least16_t i16least = INT16_C(0); - (void)i16least; - boost::uint_least16_t ui16least = UINT16_C(0); - (void)ui16least; - boost::int_least32_t i32least = INT32_C(0); - (void)i32least; - boost::uint_least32_t ui32least = UINT32_C(0); - (void)ui32least; -#ifndef BOOST_NO_INT64_T - boost::int_least64_t i64least = 0; - (void)i64least; - boost::uint_least64_t ui64least = 0; - (void)ui64least; -#endif - boost::int_fast8_t i8fast = INT8_C(0); - (void)i8fast; - boost::uint_fast8_t ui8fast = UINT8_C(0); - (void)ui8fast; - boost::int_fast16_t i16fast = INT16_C(0); - (void)i16fast; - boost::uint_fast16_t ui16fast = UINT16_C(0); - (void)ui16fast; - boost::int_fast32_t i32fast = INT32_C(0); - (void)i32fast; - boost::uint_fast32_t ui32fast = UINT32_C(0); - (void)ui32fast; -#ifndef BOOST_NO_INT64_T - boost::int_fast64_t i64fast = 0; - (void)i64fast; - boost::uint_fast64_t ui64fast = 0; - (void)ui64fast; -#endif - boost::intmax_t im = 0; - (void)im; - boost::uintmax_t uim = 0; - (void)uim; -} diff --git a/libs/config/test/cstdint_test.cpp b/libs/config/test/cstdint_test.cpp deleted file mode 100644 index f3cbd9bbf..000000000 --- a/libs/config/test/cstdint_test.cpp +++ /dev/null @@ -1,238 +0,0 @@ -// boost cstdint.hpp test program ------------------------------------------// - -// Copyright Beman Dawes 2000. Distributed under the 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/integer for documentation. - -// Revision History -// 11 Sep 01 Adapted to work with macros defined in native stdint.h (John Maddock) -// 12 Nov 00 Adapted to merged -// 23 Sep 00 Added INTXX_C constant macro support + int64_t support (John Maddock). -// 28 Jun 00 Initial version - -// -// There are two ways to test this: in version 1, we include cstdint.hpp as the first -// include, which means we get decide whether __STDC_CONSTANT_MACROS is defined. -// In version two we include stdint.h with __STDC_CONSTANT_MACROS *NOT* defined first, -// and check that we still end up with compatible definitions for the INT#_C macros. -// -// This is version 1. -// - -#if defined(__GNUC__) && (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) -// We can't suppress this warning on the command line as not all GCC versions support -Wno-type-limits : -#pragma GCC diagnostic ignored "-Wtype-limits" -#endif - -#include -#include -#include - -#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION -// -// the following class is designed to verify -// that the various INTXX_C macros can be used -// in integral constant expressions: -// -struct integral_constant_checker -{ - static const boost::int8_t int8 = INT8_C(-127); - static const boost::int_least8_t int_least8 = INT8_C(-127); - static const boost::int_fast8_t int_fast8 = INT8_C(-127); - - static const boost::uint8_t uint8 = UINT8_C(255); - static const boost::uint_least8_t uint_least8 = UINT8_C(255); - static const boost::uint_fast8_t uint_fast8 = UINT8_C(255); - - static const boost::int16_t int16 = INT16_C(-32767); - static const boost::int_least16_t int_least16 = INT16_C(-32767); - static const boost::int_fast16_t int_fast16 = INT16_C(-32767); - - static const boost::uint16_t uint16 = UINT16_C(65535); - static const boost::uint_least16_t uint_least16 = UINT16_C(65535); - static const boost::uint_fast16_t uint_fast16 = UINT16_C(65535); - - static const boost::int32_t int32 = INT32_C(-2147483647); - static const boost::int_least32_t int_least32 = INT32_C(-2147483647); - static const boost::int_fast32_t int_fast32 = INT32_C(-2147483647); - - static const boost::uint32_t uint32 = UINT32_C(4294967295); - static const boost::uint_least32_t uint_least32 = UINT32_C(4294967295); - static const boost::uint_fast32_t uint_fast32 = UINT32_C(4294967295); - - static void check(); -}; - -void integral_constant_checker::check() -{ - BOOST_TEST( int8 == -127 ); - BOOST_TEST( int_least8 == -127 ); - BOOST_TEST( int_fast8 == -127 ); - BOOST_TEST( uint8 == 255u ); - BOOST_TEST( uint_least8 == 255u ); - BOOST_TEST( uint_fast8 == 255u ); - BOOST_TEST( int16 == -32767 ); - BOOST_TEST( int_least16 == -32767 ); - BOOST_TEST( int_fast16 == -32767 ); - BOOST_TEST( uint16 == 65535u ); - BOOST_TEST( uint_least16 == 65535u ); - BOOST_TEST( uint_fast16 == 65535u ); - BOOST_TEST( int32 == -2147483647 ); - BOOST_TEST( int_least32 == -2147483647 ); - BOOST_TEST( int_fast32 == -2147483647 ); - BOOST_TEST( uint32 == 4294967295u ); - BOOST_TEST( uint_least32 == 4294967295u ); - BOOST_TEST( uint_fast32 == 4294967295u ); -} -#endif // BOOST_NO_INCLASS_MEMBER_INITIALIZATION - -// -// the following function simply verifies that the type -// of an integral constant is correctly defined: -// -#ifdef __BORLANDC__ -#pragma option -w-8008 -#pragma option -w-8066 -#endif -template -void integral_constant_type_check(T1, T2) -{ - // - // the types T1 and T2 may not be exactly - // the same type, but they should be the - // same size and signedness. We could use - // numeric_limits to verify this, but - // numeric_limits implementations currently - // vary too much, or are incomplete or missing. - // - T1 t1 = static_cast(-1); // cast suppresses warnings - T2 t2 = static_cast(-1); // ditto -#if defined(BOOST_HAS_STDINT_H) - // if we have a native stdint.h - // then the INTXX_C macros may define - // a type that's wider than required: - BOOST_TEST(sizeof(T1) <= sizeof(T2)); -#else - BOOST_TEST(sizeof(T1) == sizeof(T2)); - BOOST_TEST(t1 == t2); -#endif -#if defined(BOOST_HAS_STDINT_H) - // native headers are permitted to promote small - // unsigned types to type int: - if(sizeof(T1) >= sizeof(int)) - { - if(t1 > 0) - BOOST_TEST(t2 > 0); - else - BOOST_TEST(!(t2 > 0)); - } - else if(t1 < 0) - BOOST_TEST(!(t2 > 0)); -#else - if(t1 > 0) - BOOST_TEST(t2 > 0); - else - BOOST_TEST(!(t2 > 0)); -#endif -} - - -int main(int, char*[]) -{ -#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION - integral_constant_checker::check(); -#endif - // - // verify the types of the integral constants: - // - integral_constant_type_check(boost::int8_t(0), INT8_C(0)); - integral_constant_type_check(boost::uint8_t(0), UINT8_C(0)); - integral_constant_type_check(boost::int16_t(0), INT16_C(0)); - integral_constant_type_check(boost::uint16_t(0), UINT16_C(0)); - integral_constant_type_check(boost::int32_t(0), INT32_C(0)); - integral_constant_type_check(boost::uint32_t(0), UINT32_C(0)); -#ifndef BOOST_NO_INT64_T - integral_constant_type_check(boost::int64_t(0), INT64_C(0)); - integral_constant_type_check(boost::uint64_t(0), UINT64_C(0)); -#endif - // - boost::int8_t int8 = INT8_C(-127); - boost::int_least8_t int_least8 = INT8_C(-127); - boost::int_fast8_t int_fast8 = INT8_C(-127); - - boost::uint8_t uint8 = UINT8_C(255); - boost::uint_least8_t uint_least8 = UINT8_C(255); - boost::uint_fast8_t uint_fast8 = UINT8_C(255); - - boost::int16_t int16 = INT16_C(-32767); - boost::int_least16_t int_least16 = INT16_C(-32767); - boost::int_fast16_t int_fast16 = INT16_C(-32767); - - boost::uint16_t uint16 = UINT16_C(65535); - boost::uint_least16_t uint_least16 = UINT16_C(65535); - boost::uint_fast16_t uint_fast16 = UINT16_C(65535); - - boost::int32_t int32 = INT32_C(-2147483647); - boost::int_least32_t int_least32 = INT32_C(-2147483647); - boost::int_fast32_t int_fast32 = INT32_C(-2147483647); - - boost::uint32_t uint32 = UINT32_C(4294967295); - boost::uint_least32_t uint_least32 = UINT32_C(4294967295); - boost::uint_fast32_t uint_fast32 = UINT32_C(4294967295); - -#ifndef BOOST_NO_INT64_T - boost::int64_t int64 = INT64_C(-9223372036854775807); - boost::int_least64_t int_least64 = INT64_C(-9223372036854775807); - boost::int_fast64_t int_fast64 = INT64_C(-9223372036854775807); - - boost::uint64_t uint64 = UINT64_C(18446744073709551615); - boost::uint_least64_t uint_least64 = UINT64_C(18446744073709551615); - boost::uint_fast64_t uint_fast64 = UINT64_C(18446744073709551615); - - boost::intmax_t intmax = INTMAX_C(-9223372036854775807); - boost::uintmax_t uintmax = UINTMAX_C(18446744073709551615); -#else - boost::intmax_t intmax = INTMAX_C(-2147483647); - boost::uintmax_t uintmax = UINTMAX_C(4294967295); -#endif - - BOOST_TEST( int8 == -127 ); - BOOST_TEST( int_least8 == -127 ); - BOOST_TEST( int_fast8 == -127 ); - BOOST_TEST( uint8 == 255u ); - BOOST_TEST( uint_least8 == 255u ); - BOOST_TEST( uint_fast8 == 255u ); - BOOST_TEST( int16 == -32767 ); - BOOST_TEST( int_least16 == -32767 ); - BOOST_TEST( int_fast16 == -32767 ); - BOOST_TEST( uint16 == 65535u ); - BOOST_TEST( uint_least16 == 65535u ); - BOOST_TEST( uint_fast16 == 65535u ); - BOOST_TEST( int32 == -2147483647 ); - BOOST_TEST( int_least32 == -2147483647 ); - BOOST_TEST( int_fast32 == -2147483647 ); - BOOST_TEST( uint32 == 4294967295u ); - BOOST_TEST( uint_least32 == 4294967295u ); - BOOST_TEST( uint_fast32 == 4294967295u ); - -#ifndef BOOST_NO_INT64_T - BOOST_TEST( int64 == INT64_C(-9223372036854775807) ); - BOOST_TEST( int_least64 == INT64_C(-9223372036854775807) ); - BOOST_TEST( int_fast64 == INT64_C(-9223372036854775807) ); - BOOST_TEST( uint64 == UINT64_C(18446744073709551615) ); - BOOST_TEST( uint_least64 == UINT64_C(18446744073709551615) ); - BOOST_TEST( uint_fast64 == UINT64_C(18446744073709551615) ); - BOOST_TEST( intmax == INT64_C(-9223372036854775807) ); - BOOST_TEST( uintmax == UINT64_C(18446744073709551615) ); -#else - BOOST_TEST( intmax == -2147483647 ); - BOOST_TEST( uintmax == 4294967295u ); -#endif - - - std::cout << "OK\n"; - return boost::report_errors(); -} diff --git a/libs/config/test/cstdint_test2.cpp b/libs/config/test/cstdint_test2.cpp deleted file mode 100644 index 91ff28f4c..000000000 --- a/libs/config/test/cstdint_test2.cpp +++ /dev/null @@ -1,248 +0,0 @@ -// boost cstdint.hpp test program ------------------------------------------// - -// Copyright Beman Dawes 2000. Distributed under the 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/integer for documentation. - -// Revision History -// 11 Sep 01 Adapted to work with macros defined in native stdint.h (John Maddock) -// 12 Nov 00 Adapted to merged -// 23 Sep 00 Added INTXX_C constant macro support + int64_t support (John Maddock). -// 28 Jun 00 Initial version - -// -// There are two ways to test this: in version 1, we include cstdint.hpp as the first -// include, which means we get decide whether __STDC_CONSTANT_MACROS is defined. -// In version two we include stdint.h with __STDC_CONSTANT_MACROS *NOT* defined first, -// and check that we still end up with compatible definitions for the INT#_C macros. -// -// This is version 2. -// - -#if defined(__GNUC__) && (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) -// We can't suppress this warning on the command line as not all GCC versions support -Wno-type-limits : -#pragma GCC diagnostic ignored "-Wtype-limits" -#endif - -#include - -#ifdef BOOST_HAS_STDINT_H -#ifdef __hpux -# include -#else -# include -#endif -#endif - -#include -#include -#include - -#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION -// -// the following class is designed to verify -// that the various INTXX_C macros can be used -// in integral constant expressions: -// -struct integral_constant_checker -{ - static const boost::int8_t int8 = INT8_C(-127); - static const boost::int_least8_t int_least8 = INT8_C(-127); - static const boost::int_fast8_t int_fast8 = INT8_C(-127); - - static const boost::uint8_t uint8 = UINT8_C(255); - static const boost::uint_least8_t uint_least8 = UINT8_C(255); - static const boost::uint_fast8_t uint_fast8 = UINT8_C(255); - - static const boost::int16_t int16 = INT16_C(-32767); - static const boost::int_least16_t int_least16 = INT16_C(-32767); - static const boost::int_fast16_t int_fast16 = INT16_C(-32767); - - static const boost::uint16_t uint16 = UINT16_C(65535); - static const boost::uint_least16_t uint_least16 = UINT16_C(65535); - static const boost::uint_fast16_t uint_fast16 = UINT16_C(65535); - - static const boost::int32_t int32 = INT32_C(-2147483647); - static const boost::int_least32_t int_least32 = INT32_C(-2147483647); - static const boost::int_fast32_t int_fast32 = INT32_C(-2147483647); - - static const boost::uint32_t uint32 = UINT32_C(4294967295); - static const boost::uint_least32_t uint_least32 = UINT32_C(4294967295); - static const boost::uint_fast32_t uint_fast32 = UINT32_C(4294967295); - - static void check(); -}; - -void integral_constant_checker::check() -{ - BOOST_TEST( int8 == -127 ); - BOOST_TEST( int_least8 == -127 ); - BOOST_TEST( int_fast8 == -127 ); - BOOST_TEST( uint8 == 255u ); - BOOST_TEST( uint_least8 == 255u ); - BOOST_TEST( uint_fast8 == 255u ); - BOOST_TEST( int16 == -32767 ); - BOOST_TEST( int_least16 == -32767 ); - BOOST_TEST( int_fast16 == -32767 ); - BOOST_TEST( uint16 == 65535u ); - BOOST_TEST( uint_least16 == 65535u ); - BOOST_TEST( uint_fast16 == 65535u ); - BOOST_TEST( int32 == -2147483647 ); - BOOST_TEST( int_least32 == -2147483647 ); - BOOST_TEST( int_fast32 == -2147483647 ); - BOOST_TEST( uint32 == 4294967295u ); - BOOST_TEST( uint_least32 == 4294967295u ); - BOOST_TEST( uint_fast32 == 4294967295u ); -} -#endif // BOOST_NO_INCLASS_MEMBER_INITIALIZATION - -// -// the following function simply verifies that the type -// of an integral constant is correctly defined: -// -#ifdef __BORLANDC__ -#pragma option -w-8008 -#pragma option -w-8066 -#endif -template -void integral_constant_type_check(T1, T2) -{ - // - // the types T1 and T2 may not be exactly - // the same type, but they should be the - // same size and signedness. We could use - // numeric_limits to verify this, but - // numeric_limits implementations currently - // vary too much, or are incomplete or missing. - // - T1 t1 = static_cast(-1); // cast suppresses warnings - T2 t2 = static_cast(-1); // ditto -#if defined(BOOST_HAS_STDINT_H) - // if we have a native stdint.h - // then the INTXX_C macros may define - // a type that's wider than required: - BOOST_TEST(sizeof(T1) <= sizeof(T2)); -#else - BOOST_TEST(sizeof(T1) == sizeof(T2)); - BOOST_TEST(t1 == t2); -#endif -#if defined(BOOST_HAS_STDINT_H) - // native headers are permitted to promote small - // unsigned types to type int: - if(sizeof(T1) >= sizeof(int)) - { - if(t1 > 0) - BOOST_TEST(t2 > 0); - else - BOOST_TEST(!(t2 > 0)); - } - else if(t1 < 0) - BOOST_TEST(!(t2 > 0)); -#else - if(t1 > 0) - BOOST_TEST(t2 > 0); - else - BOOST_TEST(!(t2 > 0)); -#endif -} - - -int main(int, char*[]) -{ -#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION - integral_constant_checker::check(); -#endif - // - // verify the types of the integral constants: - // - integral_constant_type_check(boost::int8_t(0), INT8_C(0)); - integral_constant_type_check(boost::uint8_t(0), UINT8_C(0)); - integral_constant_type_check(boost::int16_t(0), INT16_C(0)); - integral_constant_type_check(boost::uint16_t(0), UINT16_C(0)); - integral_constant_type_check(boost::int32_t(0), INT32_C(0)); - integral_constant_type_check(boost::uint32_t(0), UINT32_C(0)); -#ifndef BOOST_NO_INT64_T - integral_constant_type_check(boost::int64_t(0), INT64_C(0)); - integral_constant_type_check(boost::uint64_t(0), UINT64_C(0)); -#endif - // - boost::int8_t int8 = INT8_C(-127); - boost::int_least8_t int_least8 = INT8_C(-127); - boost::int_fast8_t int_fast8 = INT8_C(-127); - - boost::uint8_t uint8 = UINT8_C(255); - boost::uint_least8_t uint_least8 = UINT8_C(255); - boost::uint_fast8_t uint_fast8 = UINT8_C(255); - - boost::int16_t int16 = INT16_C(-32767); - boost::int_least16_t int_least16 = INT16_C(-32767); - boost::int_fast16_t int_fast16 = INT16_C(-32767); - - boost::uint16_t uint16 = UINT16_C(65535); - boost::uint_least16_t uint_least16 = UINT16_C(65535); - boost::uint_fast16_t uint_fast16 = UINT16_C(65535); - - boost::int32_t int32 = INT32_C(-2147483647); - boost::int_least32_t int_least32 = INT32_C(-2147483647); - boost::int_fast32_t int_fast32 = INT32_C(-2147483647); - - boost::uint32_t uint32 = UINT32_C(4294967295); - boost::uint_least32_t uint_least32 = UINT32_C(4294967295); - boost::uint_fast32_t uint_fast32 = UINT32_C(4294967295); - -#ifndef BOOST_NO_INT64_T - boost::int64_t int64 = INT64_C(-9223372036854775807); - boost::int_least64_t int_least64 = INT64_C(-9223372036854775807); - boost::int_fast64_t int_fast64 = INT64_C(-9223372036854775807); - - boost::uint64_t uint64 = UINT64_C(18446744073709551615); - boost::uint_least64_t uint_least64 = UINT64_C(18446744073709551615); - boost::uint_fast64_t uint_fast64 = UINT64_C(18446744073709551615); - - boost::intmax_t intmax = INTMAX_C(-9223372036854775807); - boost::uintmax_t uintmax = UINTMAX_C(18446744073709551615); -#else - boost::intmax_t intmax = INTMAX_C(-2147483647); - boost::uintmax_t uintmax = UINTMAX_C(4294967295); -#endif - - BOOST_TEST( int8 == -127 ); - BOOST_TEST( int_least8 == -127 ); - BOOST_TEST( int_fast8 == -127 ); - BOOST_TEST( uint8 == 255u ); - BOOST_TEST( uint_least8 == 255u ); - BOOST_TEST( uint_fast8 == 255u ); - BOOST_TEST( int16 == -32767 ); - BOOST_TEST( int_least16 == -32767 ); - BOOST_TEST( int_fast16 == -32767 ); - BOOST_TEST( uint16 == 65535u ); - BOOST_TEST( uint_least16 == 65535u ); - BOOST_TEST( uint_fast16 == 65535u ); - BOOST_TEST( int32 == -2147483647 ); - BOOST_TEST( int_least32 == -2147483647 ); - BOOST_TEST( int_fast32 == -2147483647 ); - BOOST_TEST( uint32 == 4294967295u ); - BOOST_TEST( uint_least32 == 4294967295u ); - BOOST_TEST( uint_fast32 == 4294967295u ); - -#ifndef BOOST_NO_INT64_T - BOOST_TEST( int64 == INT64_C(-9223372036854775807) ); - BOOST_TEST( int_least64 == INT64_C(-9223372036854775807) ); - BOOST_TEST( int_fast64 == INT64_C(-9223372036854775807) ); - BOOST_TEST( uint64 == UINT64_C(18446744073709551615) ); - BOOST_TEST( uint_least64 == UINT64_C(18446744073709551615) ); - BOOST_TEST( uint_fast64 == UINT64_C(18446744073709551615) ); - BOOST_TEST( intmax == INT64_C(-9223372036854775807) ); - BOOST_TEST( uintmax == UINT64_C(18446744073709551615) ); -#else - BOOST_TEST( intmax == -2147483647 ); - BOOST_TEST( uintmax == 4294967295u ); -#endif - - - std::cout << "OK\n"; - return boost::report_errors(); -} diff --git a/libs/config/test/has_2arg_use_facet_fail.cpp b/libs/config/test/has_2arg_use_facet_fail.cpp deleted file mode 100644 index 1d0999dcb..000000000 --- a/libs/config/test/has_2arg_use_facet_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_TWO_ARG_USE_FACET -// This file should not compile, if it does then -// BOOST_HAS_TWO_ARG_USE_FACET should be defined. -// See file boost_has_2arg_use_facet.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TWO_ARG_USE_FACET -#include "boost_has_2arg_use_facet.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_two_arg_use_facet::test(); -} - diff --git a/libs/config/test/has_2arg_use_facet_pass.cpp b/libs/config/test/has_2arg_use_facet_pass.cpp deleted file mode 100644 index dbfda303b..000000000 --- a/libs/config/test/has_2arg_use_facet_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_TWO_ARG_USE_FACET -// This file should compile, if it does not then -// BOOST_HAS_TWO_ARG_USE_FACET should not be defined. -// See file boost_has_2arg_use_facet.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TWO_ARG_USE_FACET -#include "boost_has_2arg_use_facet.ipp" -#else -namespace boost_has_two_arg_use_facet = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_two_arg_use_facet::test(); -} - diff --git a/libs/config/test/has_bethreads_fail.cpp b/libs/config/test/has_bethreads_fail.cpp deleted file mode 100644 index 8606f3dc1..000000000 --- a/libs/config/test/has_bethreads_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_BETHREADS -// This file should not compile, if it does then -// BOOST_HAS_BETHREADS should be defined. -// See file boost_has_bethreads.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_BETHREADS -#include "boost_has_bethreads.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_bethreads::test(); -} - diff --git a/libs/config/test/has_bethreads_pass.cpp b/libs/config/test/has_bethreads_pass.cpp deleted file mode 100644 index 5f4bbdbec..000000000 --- a/libs/config/test/has_bethreads_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_BETHREADS -// This file should compile, if it does not then -// BOOST_HAS_BETHREADS should not be defined. -// See file boost_has_bethreads.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_BETHREADS -#include "boost_has_bethreads.ipp" -#else -namespace boost_has_bethreads = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_bethreads::test(); -} - diff --git a/libs/config/test/has_clock_gettime_fail.cpp b/libs/config/test/has_clock_gettime_fail.cpp deleted file mode 100644 index 4cf5dfe01..000000000 --- a/libs/config/test/has_clock_gettime_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_CLOCK_GETTIME -// This file should not compile, if it does then -// BOOST_HAS_CLOCK_GETTIME should be defined. -// See file boost_has_clock_gettime.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_CLOCK_GETTIME -#include "boost_has_clock_gettime.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_clock_gettime::test(); -} - diff --git a/libs/config/test/has_clock_gettime_pass.cpp b/libs/config/test/has_clock_gettime_pass.cpp deleted file mode 100644 index 16e57b4ac..000000000 --- a/libs/config/test/has_clock_gettime_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_CLOCK_GETTIME -// This file should compile, if it does not then -// BOOST_HAS_CLOCK_GETTIME should not be defined. -// See file boost_has_clock_gettime.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_CLOCK_GETTIME -#include "boost_has_clock_gettime.ipp" -#else -namespace boost_has_clock_gettime = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_clock_gettime::test(); -} - diff --git a/libs/config/test/has_dirent_h_fail.cpp b/libs/config/test/has_dirent_h_fail.cpp deleted file mode 100644 index 4304df30f..000000000 --- a/libs/config/test/has_dirent_h_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_DIRENT_H -// This file should not compile, if it does then -// BOOST_HAS_DIRENT_H should be defined. -// See file boost_has_dirent_h.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_DIRENT_H -#include "boost_has_dirent_h.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_dirent_h::test(); -} - diff --git a/libs/config/test/has_dirent_h_pass.cpp b/libs/config/test/has_dirent_h_pass.cpp deleted file mode 100644 index 184152b67..000000000 --- a/libs/config/test/has_dirent_h_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_DIRENT_H -// This file should compile, if it does not then -// BOOST_HAS_DIRENT_H should not be defined. -// See file boost_has_dirent_h.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_DIRENT_H -#include "boost_has_dirent_h.ipp" -#else -namespace boost_has_dirent_h = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_dirent_h::test(); -} - diff --git a/libs/config/test/has_expm1_fail.cpp b/libs/config/test/has_expm1_fail.cpp deleted file mode 100644 index 2ccd2868e..000000000 --- a/libs/config/test/has_expm1_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Oct 14 18:38:49 2005 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_EXPM1 -// This file should not compile, if it does then -// BOOST_HAS_EXPM1 should be defined. -// See file boost_has_expm1.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_EXPM1 -#include "boost_has_expm1.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_expm1::test(); -} - diff --git a/libs/config/test/has_expm1_pass.cpp b/libs/config/test/has_expm1_pass.cpp deleted file mode 100644 index 9f9af2f85..000000000 --- a/libs/config/test/has_expm1_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Oct 14 18:38:49 2005 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_EXPM1 -// This file should compile, if it does not then -// BOOST_HAS_EXPM1 should not be defined. -// See file boost_has_expm1.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_EXPM1 -#include "boost_has_expm1.ipp" -#else -namespace boost_has_expm1 = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_expm1::test(); -} - diff --git a/libs/config/test/has_float128_fail.cpp b/libs/config/test/has_float128_fail.cpp deleted file mode 100644 index cbb42b210..000000000 --- a/libs/config/test/has_float128_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Aug 13 16:29:35 2015 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_FLOAT128 -// This file should not compile, if it does then -// BOOST_HAS_FLOAT128 should be defined. -// See file boost_has_float128.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_FLOAT128 -#include "boost_has_float128.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_float128::test(); -} - diff --git a/libs/config/test/has_float128_pass.cpp b/libs/config/test/has_float128_pass.cpp deleted file mode 100644 index fb0a56833..000000000 --- a/libs/config/test/has_float128_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Aug 13 16:29:35 2015 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_FLOAT128 -// This file should compile, if it does not then -// BOOST_HAS_FLOAT128 should not be defined. -// See file boost_has_float128.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_FLOAT128 -#include "boost_has_float128.ipp" -#else -namespace boost_has_float128 = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_float128::test(); -} - diff --git a/libs/config/test/has_ftime_fail.cpp b/libs/config/test/has_ftime_fail.cpp deleted file mode 100644 index ecbfde361..000000000 --- a/libs/config/test/has_ftime_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_FTIME -// This file should not compile, if it does then -// BOOST_HAS_FTIME should be defined. -// See file boost_has_ftime.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_FTIME -#include "boost_has_ftime.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_ftime::test(); -} - diff --git a/libs/config/test/has_ftime_pass.cpp b/libs/config/test/has_ftime_pass.cpp deleted file mode 100644 index 6dc150f2b..000000000 --- a/libs/config/test/has_ftime_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_FTIME -// This file should compile, if it does not then -// BOOST_HAS_FTIME should not be defined. -// See file boost_has_ftime.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_FTIME -#include "boost_has_ftime.ipp" -#else -namespace boost_has_ftime = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_ftime::test(); -} - diff --git a/libs/config/test/has_getsystemtimeasfiletime_fail.cpp b/libs/config/test/has_getsystemtimeasfiletime_fail.cpp deleted file mode 100644 index 154149385..000000000 --- a/libs/config/test/has_getsystemtimeasfiletime_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Wed Jul 13 18:50:13 2011 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 72327 2011-06-01 14:51:03Z eric_niebler $ -// - - -// Test file for macro BOOST_HAS_GETSYSTEMTIMEASFILETIME -// This file should not compile, if it does then -// BOOST_HAS_GETSYSTEMTIMEASFILETIME should be defined. -// See file boost_has_getsystemtimeasfiletime.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_GETSYSTEMTIMEASFILETIME -#include "boost_has_getsystemtimeasfiletime.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_getsystemtimeasfiletime::test(); -} - diff --git a/libs/config/test/has_getsystemtimeasfiletime_pass.cpp b/libs/config/test/has_getsystemtimeasfiletime_pass.cpp deleted file mode 100644 index e8ea83bbe..000000000 --- a/libs/config/test/has_getsystemtimeasfiletime_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Wed Jul 13 18:50:13 2011 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 72327 2011-06-01 14:51:03Z eric_niebler $ -// - - -// Test file for macro BOOST_HAS_GETSYSTEMTIMEASFILETIME -// This file should compile, if it does not then -// BOOST_HAS_GETSYSTEMTIMEASFILETIME should not be defined. -// See file boost_has_getsystemtimeasfiletime.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_GETSYSTEMTIMEASFILETIME -#include "boost_has_getsystemtimeasfiletime.ipp" -#else -namespace boost_has_getsystemtimeasfiletime = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_getsystemtimeasfiletime::test(); -} - diff --git a/libs/config/test/has_gettimeofday_fail.cpp b/libs/config/test/has_gettimeofday_fail.cpp deleted file mode 100644 index 4f59b562c..000000000 --- a/libs/config/test/has_gettimeofday_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_GETTIMEOFDAY -// This file should not compile, if it does then -// BOOST_HAS_GETTIMEOFDAY should be defined. -// See file boost_has_gettimeofday.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_GETTIMEOFDAY -#include "boost_has_gettimeofday.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_gettimeofday::test(); -} - diff --git a/libs/config/test/has_gettimeofday_pass.cpp b/libs/config/test/has_gettimeofday_pass.cpp deleted file mode 100644 index 033a88fe3..000000000 --- a/libs/config/test/has_gettimeofday_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_GETTIMEOFDAY -// This file should compile, if it does not then -// BOOST_HAS_GETTIMEOFDAY should not be defined. -// See file boost_has_gettimeofday.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_GETTIMEOFDAY -#include "boost_has_gettimeofday.ipp" -#else -namespace boost_has_gettimeofday = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_gettimeofday::test(); -} - diff --git a/libs/config/test/has_hash_fail.cpp b/libs/config/test/has_hash_fail.cpp deleted file mode 100644 index 6b3ac3a60..000000000 --- a/libs/config/test/has_hash_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_HASH -// This file should not compile, if it does then -// BOOST_HAS_HASH should be defined. -// See file boost_has_hash.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_HASH -#include "boost_has_hash.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_hash::test(); -} - diff --git a/libs/config/test/has_hash_pass.cpp b/libs/config/test/has_hash_pass.cpp deleted file mode 100644 index 3f3dd82f5..000000000 --- a/libs/config/test/has_hash_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:03:59 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_HASH -// This file should compile, if it does not then -// BOOST_HAS_HASH should not be defined. -// See file boost_has_hash.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_HASH -#include "boost_has_hash.ipp" -#else -namespace boost_has_hash = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_hash::test(); -} - diff --git a/libs/config/test/has_int128_fail.cpp b/libs/config/test/has_int128_fail.cpp deleted file mode 100644 index a22755710..000000000 --- a/libs/config/test/has_int128_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Oct 25 10:14:36 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_INT128 -// This file should not compile, if it does then -// BOOST_HAS_INT128 should be defined. -// See file boost_has_int128.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_INT128 -#include "boost_has_int128.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_int128::test(); -} - diff --git a/libs/config/test/has_int128_pass.cpp b/libs/config/test/has_int128_pass.cpp deleted file mode 100644 index 9c5939013..000000000 --- a/libs/config/test/has_int128_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Oct 25 10:14:36 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_INT128 -// This file should compile, if it does not then -// BOOST_HAS_INT128 should not be defined. -// See file boost_has_int128.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_INT128 -#include "boost_has_int128.ipp" -#else -namespace boost_has_int128 = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_int128::test(); -} - diff --git a/libs/config/test/has_log1p_fail.cpp b/libs/config/test/has_log1p_fail.cpp deleted file mode 100644 index a2de7cbe4..000000000 --- a/libs/config/test/has_log1p_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Apr 02 11:49:11 2005 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_LOG1P -// This file should not compile, if it does then -// BOOST_HAS_LOG1P should be defined. -// See file boost_has_log1p.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_LOG1P -#include "boost_has_log1p.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_log1p::test(); -} - diff --git a/libs/config/test/has_log1p_pass.cpp b/libs/config/test/has_log1p_pass.cpp deleted file mode 100644 index bf44febfe..000000000 --- a/libs/config/test/has_log1p_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Apr 02 11:49:11 2005 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_LOG1P -// This file should compile, if it does not then -// BOOST_HAS_LOG1P should not be defined. -// See file boost_has_log1p.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_LOG1P -#include "boost_has_log1p.ipp" -#else -namespace boost_has_log1p = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_log1p::test(); -} - diff --git a/libs/config/test/has_long_long_fail.cpp b/libs/config/test/has_long_long_fail.cpp deleted file mode 100644 index 84632676d..000000000 --- a/libs/config/test/has_long_long_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_LONG_LONG -// This file should not compile, if it does then -// BOOST_HAS_LONG_LONG should be defined. -// See file boost_has_long_long.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_LONG_LONG -#include "boost_has_long_long.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_long_long::test(); -} - diff --git a/libs/config/test/has_long_long_pass.cpp b/libs/config/test/has_long_long_pass.cpp deleted file mode 100644 index 6042e6677..000000000 --- a/libs/config/test/has_long_long_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_LONG_LONG -// This file should compile, if it does not then -// BOOST_HAS_LONG_LONG should not be defined. -// See file boost_has_long_long.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_LONG_LONG -#include "boost_has_long_long.ipp" -#else -namespace boost_has_long_long = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_long_long::test(); -} - diff --git a/libs/config/test/has_macro_use_facet_fail.cpp b/libs/config/test/has_macro_use_facet_fail.cpp deleted file mode 100644 index 8da11830a..000000000 --- a/libs/config/test/has_macro_use_facet_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_MACRO_USE_FACET -// This file should not compile, if it does then -// BOOST_HAS_MACRO_USE_FACET should be defined. -// See file boost_has_macro_use_facet.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_MACRO_USE_FACET -#include "boost_has_macro_use_facet.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_macro_use_facet::test(); -} - diff --git a/libs/config/test/has_macro_use_facet_pass.cpp b/libs/config/test/has_macro_use_facet_pass.cpp deleted file mode 100644 index 041d026ab..000000000 --- a/libs/config/test/has_macro_use_facet_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_MACRO_USE_FACET -// This file should compile, if it does not then -// BOOST_HAS_MACRO_USE_FACET should not be defined. -// See file boost_has_macro_use_facet.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_MACRO_USE_FACET -#include "boost_has_macro_use_facet.ipp" -#else -namespace boost_has_macro_use_facet = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_macro_use_facet::test(); -} - diff --git a/libs/config/test/has_ms_int64_fail.cpp b/libs/config/test/has_ms_int64_fail.cpp deleted file mode 100644 index 6171feda5..000000000 --- a/libs/config/test/has_ms_int64_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_MS_INT64 -// This file should not compile, if it does then -// BOOST_HAS_MS_INT64 should be defined. -// See file boost_has_ms_int64.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_MS_INT64 -#include "boost_has_ms_int64.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_ms_int64::test(); -} - diff --git a/libs/config/test/has_ms_int64_pass.cpp b/libs/config/test/has_ms_int64_pass.cpp deleted file mode 100644 index 94038d994..000000000 --- a/libs/config/test/has_ms_int64_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_MS_INT64 -// This file should compile, if it does not then -// BOOST_HAS_MS_INT64 should not be defined. -// See file boost_has_ms_int64.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_MS_INT64 -#include "boost_has_ms_int64.ipp" -#else -namespace boost_has_ms_int64 = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_ms_int64::test(); -} - diff --git a/libs/config/test/has_nanosleep_fail.cpp b/libs/config/test/has_nanosleep_fail.cpp deleted file mode 100644 index cb7eba90a..000000000 --- a/libs/config/test/has_nanosleep_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_NANOSLEEP -// This file should not compile, if it does then -// BOOST_HAS_NANOSLEEP should be defined. -// See file boost_has_nanosleep.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_NANOSLEEP -#include "boost_has_nanosleep.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_nanosleep::test(); -} - diff --git a/libs/config/test/has_nanosleep_pass.cpp b/libs/config/test/has_nanosleep_pass.cpp deleted file mode 100644 index 3aeac63cc..000000000 --- a/libs/config/test/has_nanosleep_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_NANOSLEEP -// This file should compile, if it does not then -// BOOST_HAS_NANOSLEEP should not be defined. -// See file boost_has_nanosleep.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_NANOSLEEP -#include "boost_has_nanosleep.ipp" -#else -namespace boost_has_nanosleep = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_nanosleep::test(); -} - diff --git a/libs/config/test/has_nl_types_h_fail.cpp b/libs/config/test/has_nl_types_h_fail.cpp deleted file mode 100644 index ffd76cf32..000000000 --- a/libs/config/test/has_nl_types_h_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_NL_TYPES_H -// This file should not compile, if it does then -// BOOST_HAS_NL_TYPES_H should be defined. -// See file boost_has_nl_types_h.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_NL_TYPES_H -#include "boost_has_nl_types_h.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_nl_types_h::test(); -} - diff --git a/libs/config/test/has_nl_types_h_pass.cpp b/libs/config/test/has_nl_types_h_pass.cpp deleted file mode 100644 index 631031491..000000000 --- a/libs/config/test/has_nl_types_h_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_NL_TYPES_H -// This file should compile, if it does not then -// BOOST_HAS_NL_TYPES_H should not be defined. -// See file boost_has_nl_types_h.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_NL_TYPES_H -#include "boost_has_nl_types_h.ipp" -#else -namespace boost_has_nl_types_h = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_nl_types_h::test(); -} - diff --git a/libs/config/test/has_nrvo_fail.cpp b/libs/config/test/has_nrvo_fail.cpp deleted file mode 100644 index c05f17cee..000000000 --- a/libs/config/test/has_nrvo_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_NRVO -// This file should not compile, if it does then -// BOOST_HAS_NRVO should be defined. -// See file boost_has_nrvo.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_NRVO -#include "boost_has_nrvo.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_nrvo::test(); -} - diff --git a/libs/config/test/has_nrvo_pass.cpp b/libs/config/test/has_nrvo_pass.cpp deleted file mode 100644 index e216186a7..000000000 --- a/libs/config/test/has_nrvo_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_NRVO -// This file should compile, if it does not then -// BOOST_HAS_NRVO should not be defined. -// See file boost_has_nrvo.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_NRVO -#include "boost_has_nrvo.ipp" -#else -namespace boost_has_nrvo = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_nrvo::test(); -} - diff --git a/libs/config/test/has_part_alloc_fail.cpp b/libs/config/test/has_part_alloc_fail.cpp deleted file mode 100644 index 33c54247e..000000000 --- a/libs/config/test/has_part_alloc_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_PARTIAL_STD_ALLOCATOR -// This file should not compile, if it does then -// BOOST_HAS_PARTIAL_STD_ALLOCATOR should be defined. -// See file boost_has_part_alloc.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_PARTIAL_STD_ALLOCATOR -#include "boost_has_part_alloc.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_partial_std_allocator::test(); -} - diff --git a/libs/config/test/has_part_alloc_pass.cpp b/libs/config/test/has_part_alloc_pass.cpp deleted file mode 100644 index c885e20b7..000000000 --- a/libs/config/test/has_part_alloc_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_PARTIAL_STD_ALLOCATOR -// This file should compile, if it does not then -// BOOST_HAS_PARTIAL_STD_ALLOCATOR should not be defined. -// See file boost_has_part_alloc.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_PARTIAL_STD_ALLOCATOR -#include "boost_has_part_alloc.ipp" -#else -namespace boost_has_partial_std_allocator = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_partial_std_allocator::test(); -} - diff --git a/libs/config/test/has_pthread_delay_np_fail.cpp b/libs/config/test/has_pthread_delay_np_fail.cpp deleted file mode 100644 index 9f21869ac..000000000 --- a/libs/config/test/has_pthread_delay_np_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_PTHREAD_DELAY_NP -// This file should not compile, if it does then -// BOOST_HAS_PTHREAD_DELAY_NP should be defined. -// See file boost_has_pthread_delay_np.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_PTHREAD_DELAY_NP -#include "boost_has_pthread_delay_np.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_pthread_delay_np::test(); -} - diff --git a/libs/config/test/has_pthread_delay_np_pass.cpp b/libs/config/test/has_pthread_delay_np_pass.cpp deleted file mode 100644 index 6f78617a4..000000000 --- a/libs/config/test/has_pthread_delay_np_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_PTHREAD_DELAY_NP -// This file should compile, if it does not then -// BOOST_HAS_PTHREAD_DELAY_NP should not be defined. -// See file boost_has_pthread_delay_np.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_PTHREAD_DELAY_NP -#include "boost_has_pthread_delay_np.ipp" -#else -namespace boost_has_pthread_delay_np = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_pthread_delay_np::test(); -} - diff --git a/libs/config/test/has_pthread_ma_st_fail.cpp b/libs/config/test/has_pthread_ma_st_fail.cpp deleted file mode 100644 index a3bbab8e0..000000000 --- a/libs/config/test/has_pthread_ma_st_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -// This file should not compile, if it does then -// BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE should be defined. -// See file boost_has_pthread_ma_st.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -#include "boost_has_pthread_ma_st.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_pthread_mutexattr_settype::test(); -} - diff --git a/libs/config/test/has_pthread_ma_st_pass.cpp b/libs/config/test/has_pthread_ma_st_pass.cpp deleted file mode 100644 index a0cb1a091..000000000 --- a/libs/config/test/has_pthread_ma_st_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -// This file should compile, if it does not then -// BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE should not be defined. -// See file boost_has_pthread_ma_st.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE -#include "boost_has_pthread_ma_st.ipp" -#else -namespace boost_has_pthread_mutexattr_settype = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_pthread_mutexattr_settype::test(); -} - diff --git a/libs/config/test/has_pthread_yield_fail.cpp b/libs/config/test/has_pthread_yield_fail.cpp deleted file mode 100644 index eb4228b25..000000000 --- a/libs/config/test/has_pthread_yield_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_PTHREAD_YIELD -// This file should not compile, if it does then -// BOOST_HAS_PTHREAD_YIELD should be defined. -// See file boost_has_pthread_yield.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_PTHREAD_YIELD -#include "boost_has_pthread_yield.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_pthread_yield::test(); -} - diff --git a/libs/config/test/has_pthread_yield_pass.cpp b/libs/config/test/has_pthread_yield_pass.cpp deleted file mode 100644 index 4af209a09..000000000 --- a/libs/config/test/has_pthread_yield_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_PTHREAD_YIELD -// This file should compile, if it does not then -// BOOST_HAS_PTHREAD_YIELD should not be defined. -// See file boost_has_pthread_yield.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_PTHREAD_YIELD -#include "boost_has_pthread_yield.ipp" -#else -namespace boost_has_pthread_yield = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_pthread_yield::test(); -} - diff --git a/libs/config/test/has_pthreads_fail.cpp b/libs/config/test/has_pthreads_fail.cpp deleted file mode 100644 index 14156648a..000000000 --- a/libs/config/test/has_pthreads_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_PTHREADS -// This file should not compile, if it does then -// BOOST_HAS_PTHREADS should be defined. -// See file boost_has_pthreads.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_PTHREADS -#include "boost_has_pthreads.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_pthreads::test(); -} - diff --git a/libs/config/test/has_pthreads_pass.cpp b/libs/config/test/has_pthreads_pass.cpp deleted file mode 100644 index 0737392f7..000000000 --- a/libs/config/test/has_pthreads_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_PTHREADS -// This file should compile, if it does not then -// BOOST_HAS_PTHREADS should not be defined. -// See file boost_has_pthreads.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_PTHREADS -#include "boost_has_pthreads.ipp" -#else -namespace boost_has_pthreads = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_pthreads::test(); -} - diff --git a/libs/config/test/has_rvalue_refs_fail.cpp b/libs/config/test/has_rvalue_refs_fail.cpp deleted file mode 100644 index cf880e965..000000000 --- a/libs/config/test/has_rvalue_refs_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:21 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_RVALUE_REFS -// This file should not compile, if it does then -// BOOST_HAS_RVALUE_REFS should be defined. -// See file boost_has_rvalue_refs.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_RVALUE_REFS -#include "boost_has_rvalue_refs.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_rvalue_refs::test(); -} - diff --git a/libs/config/test/has_rvalue_refs_pass.cpp b/libs/config/test/has_rvalue_refs_pass.cpp deleted file mode 100644 index 616924949..000000000 --- a/libs/config/test/has_rvalue_refs_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:21 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_RVALUE_REFS -// This file should compile, if it does not then -// BOOST_HAS_RVALUE_REFS should not be defined. -// See file boost_has_rvalue_refs.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_RVALUE_REFS -#include "boost_has_rvalue_refs.ipp" -#else -namespace boost_has_rvalue_refs = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_rvalue_refs::test(); -} - diff --git a/libs/config/test/has_sched_yield_fail.cpp b/libs/config/test/has_sched_yield_fail.cpp deleted file mode 100644 index b494ed10e..000000000 --- a/libs/config/test/has_sched_yield_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_SCHED_YIELD -// This file should not compile, if it does then -// BOOST_HAS_SCHED_YIELD should be defined. -// See file boost_has_sched_yield.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_SCHED_YIELD -#include "boost_has_sched_yield.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_sched_yield::test(); -} - diff --git a/libs/config/test/has_sched_yield_pass.cpp b/libs/config/test/has_sched_yield_pass.cpp deleted file mode 100644 index 56741d1f7..000000000 --- a/libs/config/test/has_sched_yield_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_SCHED_YIELD -// This file should compile, if it does not then -// BOOST_HAS_SCHED_YIELD should not be defined. -// See file boost_has_sched_yield.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_SCHED_YIELD -#include "boost_has_sched_yield.ipp" -#else -namespace boost_has_sched_yield = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_sched_yield::test(); -} - diff --git a/libs/config/test/has_sgi_type_traits_fail.cpp b/libs/config/test/has_sgi_type_traits_fail.cpp deleted file mode 100644 index 1be718299..000000000 --- a/libs/config/test/has_sgi_type_traits_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_SGI_TYPE_TRAITS -// This file should not compile, if it does then -// BOOST_HAS_SGI_TYPE_TRAITS should be defined. -// See file boost_has_sgi_type_traits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_SGI_TYPE_TRAITS -#include "boost_has_sgi_type_traits.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_sgi_type_traits::test(); -} - diff --git a/libs/config/test/has_sgi_type_traits_pass.cpp b/libs/config/test/has_sgi_type_traits_pass.cpp deleted file mode 100644 index 81f059205..000000000 --- a/libs/config/test/has_sgi_type_traits_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_SGI_TYPE_TRAITS -// This file should compile, if it does not then -// BOOST_HAS_SGI_TYPE_TRAITS should not be defined. -// See file boost_has_sgi_type_traits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_SGI_TYPE_TRAITS -#include "boost_has_sgi_type_traits.ipp" -#else -namespace boost_has_sgi_type_traits = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_sgi_type_traits::test(); -} - diff --git a/libs/config/test/has_sigaction_fail.cpp b/libs/config/test/has_sigaction_fail.cpp deleted file mode 100644 index b9ea9891f..000000000 --- a/libs/config/test/has_sigaction_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_SIGACTION -// This file should not compile, if it does then -// BOOST_HAS_SIGACTION should be defined. -// See file boost_has_sigaction.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_SIGACTION -#include "boost_has_sigaction.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_sigaction::test(); -} - diff --git a/libs/config/test/has_sigaction_pass.cpp b/libs/config/test/has_sigaction_pass.cpp deleted file mode 100644 index 5fa104091..000000000 --- a/libs/config/test/has_sigaction_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_SIGACTION -// This file should compile, if it does not then -// BOOST_HAS_SIGACTION should not be defined. -// See file boost_has_sigaction.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_SIGACTION -#include "boost_has_sigaction.ipp" -#else -namespace boost_has_sigaction = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_sigaction::test(); -} - diff --git a/libs/config/test/has_slist_fail.cpp b/libs/config/test/has_slist_fail.cpp deleted file mode 100644 index 0d656fda2..000000000 --- a/libs/config/test/has_slist_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_SLIST -// This file should not compile, if it does then -// BOOST_HAS_SLIST should be defined. -// See file boost_has_slist.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_SLIST -#include "boost_has_slist.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_slist::test(); -} - diff --git a/libs/config/test/has_slist_pass.cpp b/libs/config/test/has_slist_pass.cpp deleted file mode 100644 index 79af70055..000000000 --- a/libs/config/test/has_slist_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_SLIST -// This file should compile, if it does not then -// BOOST_HAS_SLIST should not be defined. -// See file boost_has_slist.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_SLIST -#include "boost_has_slist.ipp" -#else -namespace boost_has_slist = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_slist::test(); -} - diff --git a/libs/config/test/has_static_assert_fail.cpp b/libs/config/test/has_static_assert_fail.cpp deleted file mode 100644 index a6456edb2..000000000 --- a/libs/config/test/has_static_assert_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:21 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_STATIC_ASSERT -// This file should not compile, if it does then -// BOOST_HAS_STATIC_ASSERT should be defined. -// See file boost_has_static_assert.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_STATIC_ASSERT -#include "boost_has_static_assert.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_static_assert::test(); -} - diff --git a/libs/config/test/has_static_assert_pass.cpp b/libs/config/test/has_static_assert_pass.cpp deleted file mode 100644 index 00f038975..000000000 --- a/libs/config/test/has_static_assert_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:21 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_STATIC_ASSERT -// This file should compile, if it does not then -// BOOST_HAS_STATIC_ASSERT should not be defined. -// See file boost_has_static_assert.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_STATIC_ASSERT -#include "boost_has_static_assert.ipp" -#else -namespace boost_has_static_assert = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_static_assert::test(); -} - diff --git a/libs/config/test/has_stdint_h_fail.cpp b/libs/config/test/has_stdint_h_fail.cpp deleted file mode 100644 index 66a1017bf..000000000 --- a/libs/config/test/has_stdint_h_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_STDINT_H -// This file should not compile, if it does then -// BOOST_HAS_STDINT_H should be defined. -// See file boost_has_stdint_h.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_STDINT_H -#include "boost_has_stdint_h.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_stdint_h::test(); -} - diff --git a/libs/config/test/has_stdint_h_pass.cpp b/libs/config/test/has_stdint_h_pass.cpp deleted file mode 100644 index 4b8eca9b2..000000000 --- a/libs/config/test/has_stdint_h_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_STDINT_H -// This file should compile, if it does not then -// BOOST_HAS_STDINT_H should not be defined. -// See file boost_has_stdint_h.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_STDINT_H -#include "boost_has_stdint_h.ipp" -#else -namespace boost_has_stdint_h = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_stdint_h::test(); -} - diff --git a/libs/config/test/has_stlp_use_facet_fail.cpp b/libs/config/test/has_stlp_use_facet_fail.cpp deleted file mode 100644 index 115f03b3f..000000000 --- a/libs/config/test/has_stlp_use_facet_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_STLP_USE_FACET -// This file should not compile, if it does then -// BOOST_HAS_STLP_USE_FACET should be defined. -// See file boost_has_stlp_use_facet.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_STLP_USE_FACET -#include "boost_has_stlp_use_facet.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_stlp_use_facet::test(); -} - diff --git a/libs/config/test/has_stlp_use_facet_pass.cpp b/libs/config/test/has_stlp_use_facet_pass.cpp deleted file mode 100644 index 9c50c6336..000000000 --- a/libs/config/test/has_stlp_use_facet_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_STLP_USE_FACET -// This file should compile, if it does not then -// BOOST_HAS_STLP_USE_FACET should not be defined. -// See file boost_has_stlp_use_facet.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_STLP_USE_FACET -#include "boost_has_stlp_use_facet.ipp" -#else -namespace boost_has_stlp_use_facet = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_stlp_use_facet::test(); -} - diff --git a/libs/config/test/has_tr1_array_fail.cpp b/libs/config/test/has_tr1_array_fail.cpp deleted file mode 100644 index 36a33a153..000000000 --- a/libs/config/test/has_tr1_array_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:31 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_ARRAY -// This file should not compile, if it does then -// BOOST_HAS_TR1_ARRAY should be defined. -// See file boost_has_tr1_array.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_ARRAY -#include "boost_has_tr1_array.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_array::test(); -} - diff --git a/libs/config/test/has_tr1_array_pass.cpp b/libs/config/test/has_tr1_array_pass.cpp deleted file mode 100644 index 4b0731571..000000000 --- a/libs/config/test/has_tr1_array_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:31 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_ARRAY -// This file should compile, if it does not then -// BOOST_HAS_TR1_ARRAY should not be defined. -// See file boost_has_tr1_array.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_ARRAY -#include "boost_has_tr1_array.ipp" -#else -namespace boost_has_tr1_array = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_array::test(); -} - diff --git a/libs/config/test/has_tr1_bind_fail.cpp b/libs/config/test/has_tr1_bind_fail.cpp deleted file mode 100644 index 7af7516ec..000000000 --- a/libs/config/test/has_tr1_bind_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:31 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_BIND -// This file should not compile, if it does then -// BOOST_HAS_TR1_BIND should be defined. -// See file boost_has_tr1_bind.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_BIND -#include "boost_has_tr1_bind.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_bind::test(); -} - diff --git a/libs/config/test/has_tr1_bind_pass.cpp b/libs/config/test/has_tr1_bind_pass.cpp deleted file mode 100644 index 54a6a6be9..000000000 --- a/libs/config/test/has_tr1_bind_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:31 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_BIND -// This file should compile, if it does not then -// BOOST_HAS_TR1_BIND should not be defined. -// See file boost_has_tr1_bind.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_BIND -#include "boost_has_tr1_bind.ipp" -#else -namespace boost_has_tr1_bind = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_bind::test(); -} - diff --git a/libs/config/test/has_tr1_complex_over_fail.cpp b/libs/config/test/has_tr1_complex_over_fail.cpp deleted file mode 100644 index 1f282190d..000000000 --- a/libs/config/test/has_tr1_complex_over_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_COMPLEX_OVERLOADS -// This file should not compile, if it does then -// BOOST_HAS_TR1_COMPLEX_OVERLOADS should be defined. -// See file boost_has_tr1_complex_over.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_COMPLEX_OVERLOADS -#include "boost_has_tr1_complex_over.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_complex_overloads::test(); -} - diff --git a/libs/config/test/has_tr1_complex_over_pass.cpp b/libs/config/test/has_tr1_complex_over_pass.cpp deleted file mode 100644 index 5535cdad0..000000000 --- a/libs/config/test/has_tr1_complex_over_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_COMPLEX_OVERLOADS -// This file should compile, if it does not then -// BOOST_HAS_TR1_COMPLEX_OVERLOADS should not be defined. -// See file boost_has_tr1_complex_over.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_COMPLEX_OVERLOADS -#include "boost_has_tr1_complex_over.ipp" -#else -namespace boost_has_tr1_complex_overloads = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_complex_overloads::test(); -} - diff --git a/libs/config/test/has_tr1_complex_trig_fail.cpp b/libs/config/test/has_tr1_complex_trig_fail.cpp deleted file mode 100644 index 3c1ce163e..000000000 --- a/libs/config/test/has_tr1_complex_trig_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG -// This file should not compile, if it does then -// BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG should be defined. -// See file boost_has_tr1_complex_trig.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG -#include "boost_has_tr1_complex_trig.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_complex_inverse_trig::test(); -} - diff --git a/libs/config/test/has_tr1_complex_trig_pass.cpp b/libs/config/test/has_tr1_complex_trig_pass.cpp deleted file mode 100644 index 9aca24b42..000000000 --- a/libs/config/test/has_tr1_complex_trig_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG -// This file should compile, if it does not then -// BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG should not be defined. -// See file boost_has_tr1_complex_trig.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG -#include "boost_has_tr1_complex_trig.ipp" -#else -namespace boost_has_tr1_complex_inverse_trig = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_complex_inverse_trig::test(); -} - diff --git a/libs/config/test/has_tr1_function_fail.cpp b/libs/config/test/has_tr1_function_fail.cpp deleted file mode 100644 index f6e3a2dbc..000000000 --- a/libs/config/test/has_tr1_function_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_FUNCTION -// This file should not compile, if it does then -// BOOST_HAS_TR1_FUNCTION should be defined. -// See file boost_has_tr1_function.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_FUNCTION -#include "boost_has_tr1_function.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_function::test(); -} - diff --git a/libs/config/test/has_tr1_function_pass.cpp b/libs/config/test/has_tr1_function_pass.cpp deleted file mode 100644 index 8aa466c18..000000000 --- a/libs/config/test/has_tr1_function_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_FUNCTION -// This file should compile, if it does not then -// BOOST_HAS_TR1_FUNCTION should not be defined. -// See file boost_has_tr1_function.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_FUNCTION -#include "boost_has_tr1_function.ipp" -#else -namespace boost_has_tr1_function = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_function::test(); -} - diff --git a/libs/config/test/has_tr1_hash_fail.cpp b/libs/config/test/has_tr1_hash_fail.cpp deleted file mode 100644 index 2c072e88d..000000000 --- a/libs/config/test/has_tr1_hash_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_HASH -// This file should not compile, if it does then -// BOOST_HAS_TR1_HASH should be defined. -// See file boost_has_tr1_hash.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_HASH -#include "boost_has_tr1_hash.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_hash::test(); -} - diff --git a/libs/config/test/has_tr1_hash_pass.cpp b/libs/config/test/has_tr1_hash_pass.cpp deleted file mode 100644 index 48c293477..000000000 --- a/libs/config/test/has_tr1_hash_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_HASH -// This file should compile, if it does not then -// BOOST_HAS_TR1_HASH should not be defined. -// See file boost_has_tr1_hash.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_HASH -#include "boost_has_tr1_hash.ipp" -#else -namespace boost_has_tr1_hash = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_hash::test(); -} - diff --git a/libs/config/test/has_tr1_mem_fn_fail.cpp b/libs/config/test/has_tr1_mem_fn_fail.cpp deleted file mode 100644 index 01bff252d..000000000 --- a/libs/config/test/has_tr1_mem_fn_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_MEM_FN -// This file should not compile, if it does then -// BOOST_HAS_TR1_MEM_FN should be defined. -// See file boost_has_tr1_mem_fn.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_MEM_FN -#include "boost_has_tr1_mem_fn.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_mem_fn::test(); -} - diff --git a/libs/config/test/has_tr1_mem_fn_pass.cpp b/libs/config/test/has_tr1_mem_fn_pass.cpp deleted file mode 100644 index 9a1398d08..000000000 --- a/libs/config/test/has_tr1_mem_fn_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_MEM_FN -// This file should compile, if it does not then -// BOOST_HAS_TR1_MEM_FN should not be defined. -// See file boost_has_tr1_mem_fn.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_MEM_FN -#include "boost_has_tr1_mem_fn.ipp" -#else -namespace boost_has_tr1_mem_fn = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_mem_fn::test(); -} - diff --git a/libs/config/test/has_tr1_random_fail.cpp b/libs/config/test/has_tr1_random_fail.cpp deleted file mode 100644 index 15e5a3a81..000000000 --- a/libs/config/test/has_tr1_random_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_RANDOM -// This file should not compile, if it does then -// BOOST_HAS_TR1_RANDOM should be defined. -// See file boost_has_tr1_random.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_RANDOM -#include "boost_has_tr1_random.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_random::test(); -} - diff --git a/libs/config/test/has_tr1_random_pass.cpp b/libs/config/test/has_tr1_random_pass.cpp deleted file mode 100644 index 9dd86abf8..000000000 --- a/libs/config/test/has_tr1_random_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_RANDOM -// This file should compile, if it does not then -// BOOST_HAS_TR1_RANDOM should not be defined. -// See file boost_has_tr1_random.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_RANDOM -#include "boost_has_tr1_random.ipp" -#else -namespace boost_has_tr1_random = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_random::test(); -} - diff --git a/libs/config/test/has_tr1_ref_wrap_fail.cpp b/libs/config/test/has_tr1_ref_wrap_fail.cpp deleted file mode 100644 index c44abb581..000000000 --- a/libs/config/test/has_tr1_ref_wrap_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_REFERENCE_WRAPPER -// This file should not compile, if it does then -// BOOST_HAS_TR1_REFERENCE_WRAPPER should be defined. -// See file boost_has_tr1_ref_wrap.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_REFERENCE_WRAPPER -#include "boost_has_tr1_ref_wrap.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_reference_wrapper::test(); -} - diff --git a/libs/config/test/has_tr1_ref_wrap_pass.cpp b/libs/config/test/has_tr1_ref_wrap_pass.cpp deleted file mode 100644 index 909530120..000000000 --- a/libs/config/test/has_tr1_ref_wrap_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_REFERENCE_WRAPPER -// This file should compile, if it does not then -// BOOST_HAS_TR1_REFERENCE_WRAPPER should not be defined. -// See file boost_has_tr1_ref_wrap.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_REFERENCE_WRAPPER -#include "boost_has_tr1_ref_wrap.ipp" -#else -namespace boost_has_tr1_reference_wrapper = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_reference_wrapper::test(); -} - diff --git a/libs/config/test/has_tr1_regex_fail.cpp b/libs/config/test/has_tr1_regex_fail.cpp deleted file mode 100644 index 7daac7320..000000000 --- a/libs/config/test/has_tr1_regex_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_REGEX -// This file should not compile, if it does then -// BOOST_HAS_TR1_REGEX should be defined. -// See file boost_has_tr1_regex.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_REGEX -#include "boost_has_tr1_regex.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_regex::test(); -} - diff --git a/libs/config/test/has_tr1_regex_pass.cpp b/libs/config/test/has_tr1_regex_pass.cpp deleted file mode 100644 index d6cfa887e..000000000 --- a/libs/config/test/has_tr1_regex_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_REGEX -// This file should compile, if it does not then -// BOOST_HAS_TR1_REGEX should not be defined. -// See file boost_has_tr1_regex.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_REGEX -#include "boost_has_tr1_regex.ipp" -#else -namespace boost_has_tr1_regex = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_regex::test(); -} - diff --git a/libs/config/test/has_tr1_result_of_fail.cpp b/libs/config/test/has_tr1_result_of_fail.cpp deleted file mode 100644 index 1fc14f3ba..000000000 --- a/libs/config/test/has_tr1_result_of_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_RESULT_OF -// This file should not compile, if it does then -// BOOST_HAS_TR1_RESULT_OF should be defined. -// See file boost_has_tr1_result_of.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_RESULT_OF -#include "boost_has_tr1_result_of.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_result_of::test(); -} - diff --git a/libs/config/test/has_tr1_result_of_pass.cpp b/libs/config/test/has_tr1_result_of_pass.cpp deleted file mode 100644 index b770847c0..000000000 --- a/libs/config/test/has_tr1_result_of_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_RESULT_OF -// This file should compile, if it does not then -// BOOST_HAS_TR1_RESULT_OF should not be defined. -// See file boost_has_tr1_result_of.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_RESULT_OF -#include "boost_has_tr1_result_of.ipp" -#else -namespace boost_has_tr1_result_of = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_result_of::test(); -} - diff --git a/libs/config/test/has_tr1_shared_ptr_fail.cpp b/libs/config/test/has_tr1_shared_ptr_fail.cpp deleted file mode 100644 index bbd2fc517..000000000 --- a/libs/config/test/has_tr1_shared_ptr_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_SHARED_PTR -// This file should not compile, if it does then -// BOOST_HAS_TR1_SHARED_PTR should be defined. -// See file boost_has_tr1_shared_ptr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_SHARED_PTR -#include "boost_has_tr1_shared_ptr.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_shared_ptr::test(); -} - diff --git a/libs/config/test/has_tr1_shared_ptr_pass.cpp b/libs/config/test/has_tr1_shared_ptr_pass.cpp deleted file mode 100644 index a4c9764a6..000000000 --- a/libs/config/test/has_tr1_shared_ptr_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_SHARED_PTR -// This file should compile, if it does not then -// BOOST_HAS_TR1_SHARED_PTR should not be defined. -// See file boost_has_tr1_shared_ptr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_SHARED_PTR -#include "boost_has_tr1_shared_ptr.ipp" -#else -namespace boost_has_tr1_shared_ptr = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_shared_ptr::test(); -} - diff --git a/libs/config/test/has_tr1_tuple_fail.cpp b/libs/config/test/has_tr1_tuple_fail.cpp deleted file mode 100644 index 5ea571e3a..000000000 --- a/libs/config/test/has_tr1_tuple_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_TUPLE -// This file should not compile, if it does then -// BOOST_HAS_TR1_TUPLE should be defined. -// See file boost_has_tr1_tuple.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_TUPLE -#include "boost_has_tr1_tuple.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_tuple::test(); -} - diff --git a/libs/config/test/has_tr1_tuple_pass.cpp b/libs/config/test/has_tr1_tuple_pass.cpp deleted file mode 100644 index 6c6d949b6..000000000 --- a/libs/config/test/has_tr1_tuple_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_TUPLE -// This file should compile, if it does not then -// BOOST_HAS_TR1_TUPLE should not be defined. -// See file boost_has_tr1_tuple.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_TUPLE -#include "boost_has_tr1_tuple.ipp" -#else -namespace boost_has_tr1_tuple = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_tuple::test(); -} - diff --git a/libs/config/test/has_tr1_type_traits_fail.cpp b/libs/config/test/has_tr1_type_traits_fail.cpp deleted file mode 100644 index b4edd4ef0..000000000 --- a/libs/config/test/has_tr1_type_traits_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_TYPE_TRAITS -// This file should not compile, if it does then -// BOOST_HAS_TR1_TYPE_TRAITS should be defined. -// See file boost_has_tr1_type_traits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_TYPE_TRAITS -#include "boost_has_tr1_type_traits.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_type_traits::test(); -} - diff --git a/libs/config/test/has_tr1_type_traits_pass.cpp b/libs/config/test/has_tr1_type_traits_pass.cpp deleted file mode 100644 index d2c51ddf0..000000000 --- a/libs/config/test/has_tr1_type_traits_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_TYPE_TRAITS -// This file should compile, if it does not then -// BOOST_HAS_TR1_TYPE_TRAITS should not be defined. -// See file boost_has_tr1_type_traits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_TYPE_TRAITS -#include "boost_has_tr1_type_traits.ipp" -#else -namespace boost_has_tr1_type_traits = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_type_traits::test(); -} - diff --git a/libs/config/test/has_tr1_unordered_map_fail.cpp b/libs/config/test/has_tr1_unordered_map_fail.cpp deleted file mode 100644 index b272dbbe8..000000000 --- a/libs/config/test/has_tr1_unordered_map_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_UNORDERED_MAP -// This file should not compile, if it does then -// BOOST_HAS_TR1_UNORDERED_MAP should be defined. -// See file boost_has_tr1_unordered_map.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_UNORDERED_MAP -#include "boost_has_tr1_unordered_map.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_unordered_map::test(); -} - diff --git a/libs/config/test/has_tr1_unordered_map_pass.cpp b/libs/config/test/has_tr1_unordered_map_pass.cpp deleted file mode 100644 index e222c01a0..000000000 --- a/libs/config/test/has_tr1_unordered_map_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_UNORDERED_MAP -// This file should compile, if it does not then -// BOOST_HAS_TR1_UNORDERED_MAP should not be defined. -// See file boost_has_tr1_unordered_map.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_UNORDERED_MAP -#include "boost_has_tr1_unordered_map.ipp" -#else -namespace boost_has_tr1_unordered_map = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_unordered_map::test(); -} - diff --git a/libs/config/test/has_tr1_unordered_set_fail.cpp b/libs/config/test/has_tr1_unordered_set_fail.cpp deleted file mode 100644 index d11fb3522..000000000 --- a/libs/config/test/has_tr1_unordered_set_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_UNORDERED_SET -// This file should not compile, if it does then -// BOOST_HAS_TR1_UNORDERED_SET should be defined. -// See file boost_has_tr1_unordered_set.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_UNORDERED_SET -#include "boost_has_tr1_unordered_set.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_unordered_set::test(); -} - diff --git a/libs/config/test/has_tr1_unordered_set_pass.cpp b/libs/config/test/has_tr1_unordered_set_pass.cpp deleted file mode 100644 index 23c9406ec..000000000 --- a/libs/config/test/has_tr1_unordered_set_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:32 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_UNORDERED_SET -// This file should compile, if it does not then -// BOOST_HAS_TR1_UNORDERED_SET should not be defined. -// See file boost_has_tr1_unordered_set.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_UNORDERED_SET -#include "boost_has_tr1_unordered_set.ipp" -#else -namespace boost_has_tr1_unordered_set = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_unordered_set::test(); -} - diff --git a/libs/config/test/has_tr1_utility_fail.cpp b/libs/config/test/has_tr1_utility_fail.cpp deleted file mode 100644 index 5c82a0d59..000000000 --- a/libs/config/test/has_tr1_utility_fail.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:33 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_UTILITY -// This file should not compile, if it does then -// BOOST_HAS_TR1_UTILITY should be defined. -// See file boost_has_tr1_utility.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifndef BOOST_HAS_TR1_UTILITY -#include "boost_has_tr1_utility.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_utility::test(); -} - diff --git a/libs/config/test/has_tr1_utility_pass.cpp b/libs/config/test/has_tr1_utility_pass.cpp deleted file mode 100644 index ccdd1acd8..000000000 --- a/libs/config/test/has_tr1_utility_pass.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// This file was automatically generated on Sat Jul 12 12:39:33 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_HAS_TR1_UTILITY -// This file should compile, if it does not then -// BOOST_HAS_TR1_UTILITY should not be defined. -// See file boost_has_tr1_utility.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include -#include "test.hpp" - -#ifdef BOOST_HAS_TR1_UTILITY -#include "boost_has_tr1_utility.ipp" -#else -namespace boost_has_tr1_utility = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_tr1_utility::test(); -} - diff --git a/libs/config/test/has_unistd_h_fail.cpp b/libs/config/test/has_unistd_h_fail.cpp deleted file mode 100644 index 363aea220..000000000 --- a/libs/config/test/has_unistd_h_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_UNISTD_H -// This file should not compile, if it does then -// BOOST_HAS_UNISTD_H should be defined. -// See file boost_has_unistd_h.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_UNISTD_H -#include "boost_has_unistd_h.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_unistd_h::test(); -} - diff --git a/libs/config/test/has_unistd_h_pass.cpp b/libs/config/test/has_unistd_h_pass.cpp deleted file mode 100644 index 70f813755..000000000 --- a/libs/config/test/has_unistd_h_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_UNISTD_H -// This file should compile, if it does not then -// BOOST_HAS_UNISTD_H should not be defined. -// See file boost_has_unistd_h.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_UNISTD_H -#include "boost_has_unistd_h.ipp" -#else -namespace boost_has_unistd_h = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_unistd_h::test(); -} - diff --git a/libs/config/test/has_variadic_tmpl_fail.cpp b/libs/config/test/has_variadic_tmpl_fail.cpp deleted file mode 100644 index 17baab780..000000000 --- a/libs/config/test/has_variadic_tmpl_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:21 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_VARIADIC_TMPL -// This file should not compile, if it does then -// BOOST_HAS_VARIADIC_TMPL should be defined. -// See file boost_has_variadic_tmpl.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_VARIADIC_TMPL -#include "boost_has_variadic_tmpl.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_variadic_tmpl::test(); -} - diff --git a/libs/config/test/has_variadic_tmpl_pass.cpp b/libs/config/test/has_variadic_tmpl_pass.cpp deleted file mode 100644 index 8b65b8d22..000000000 --- a/libs/config/test/has_variadic_tmpl_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:21 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_VARIADIC_TMPL -// This file should compile, if it does not then -// BOOST_HAS_VARIADIC_TMPL should not be defined. -// See file boost_has_variadic_tmpl.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_VARIADIC_TMPL -#include "boost_has_variadic_tmpl.ipp" -#else -namespace boost_has_variadic_tmpl = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_variadic_tmpl::test(); -} - diff --git a/libs/config/test/has_vc6_mem_templ_fail.cpp b/libs/config/test/has_vc6_mem_templ_fail.cpp deleted file mode 100644 index 6fa512abe..000000000 --- a/libs/config/test/has_vc6_mem_templ_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_MSVC6_MEMBER_TEMPLATES -// This file should not compile, if it does then -// BOOST_MSVC6_MEMBER_TEMPLATES should be defined. -// See file boost_has_vc6_mem_templ.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_MSVC6_MEMBER_TEMPLATES -#include "boost_has_vc6_mem_templ.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_msvc6_member_templates::test(); -} - diff --git a/libs/config/test/has_vc6_mem_templ_pass.cpp b/libs/config/test/has_vc6_mem_templ_pass.cpp deleted file mode 100644 index 85325a9de..000000000 --- a/libs/config/test/has_vc6_mem_templ_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_MSVC6_MEMBER_TEMPLATES -// This file should compile, if it does not then -// BOOST_MSVC6_MEMBER_TEMPLATES should not be defined. -// See file boost_has_vc6_mem_templ.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_MSVC6_MEMBER_TEMPLATES -#include "boost_has_vc6_mem_templ.ipp" -#else -namespace boost_msvc6_member_templates = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_msvc6_member_templates::test(); -} - diff --git a/libs/config/test/has_vc_iterator_fail.cpp b/libs/config/test/has_vc_iterator_fail.cpp deleted file mode 100644 index e453e56ac..000000000 --- a/libs/config/test/has_vc_iterator_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_MSVC_STD_ITERATOR -// This file should not compile, if it does then -// BOOST_MSVC_STD_ITERATOR should be defined. -// See file boost_has_vc_iterator.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_MSVC_STD_ITERATOR -#include "boost_has_vc_iterator.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_msvc_std_iterator::test(); -} - diff --git a/libs/config/test/has_vc_iterator_pass.cpp b/libs/config/test/has_vc_iterator_pass.cpp deleted file mode 100644 index 102cab736..000000000 --- a/libs/config/test/has_vc_iterator_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_MSVC_STD_ITERATOR -// This file should compile, if it does not then -// BOOST_MSVC_STD_ITERATOR should not be defined. -// See file boost_has_vc_iterator.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_MSVC_STD_ITERATOR -#include "boost_has_vc_iterator.ipp" -#else -namespace boost_msvc_std_iterator = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_msvc_std_iterator::test(); -} - diff --git a/libs/config/test/has_winthreads_fail.cpp b/libs/config/test/has_winthreads_fail.cpp deleted file mode 100644 index e9f6c7142..000000000 --- a/libs/config/test/has_winthreads_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_WINTHREADS -// This file should not compile, if it does then -// BOOST_HAS_WINTHREADS should be defined. -// See file boost_has_winthreads.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_HAS_WINTHREADS -#include "boost_has_winthreads.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_has_winthreads::test(); -} - diff --git a/libs/config/test/has_winthreads_pass.cpp b/libs/config/test/has_winthreads_pass.cpp deleted file mode 100644 index 49d020fc9..000000000 --- a/libs/config/test/has_winthreads_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_HAS_WINTHREADS -// This file should compile, if it does not then -// BOOST_HAS_WINTHREADS should not be defined. -// See file boost_has_winthreads.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_HAS_WINTHREADS -#include "boost_has_winthreads.ipp" -#else -namespace boost_has_winthreads = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_has_winthreads::test(); -} - diff --git a/libs/config/test/helper_macro_test.cpp b/libs/config/test/helper_macro_test.cpp deleted file mode 100644 index 81737fec0..000000000 --- a/libs/config/test/helper_macro_test.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// 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) - -#include - -int test_fallthrough(int n) -{ - switch (n) - { - case 0: - n++; - BOOST_FALLTHROUGH; - case 1: - n++; - break; - } - return n; -} - -int test_unreachable(int i) -{ - if(BOOST_LIKELY(i)) return i; - - throw i; - BOOST_UNREACHABLE_RETURN(0); -} - -BOOST_FORCEINLINE int always_inline(int i){ return ++i; } -BOOST_NOINLINE int never_inline(int i){ return ++i; } - -BOOST_NORETURN void always_throw() -{ - throw 0; -} - - -#define test_fallthrough(x) foobar(x) - - -int main() -{ - typedef int unused_type BOOST_ATTRIBUTE_UNUSED; - try - { - int result = test_fallthrough BOOST_PREVENT_MACRO_SUBSTITUTION(0); - BOOST_STATIC_CONSTANT(bool, value = 0); - result += test_unreachable(1); - result += always_inline(2); - result += never_inline(3); - if(BOOST_UNLIKELY(!result)) - always_throw(); - } - catch(int) - { - return 1; - } - return 0; -} - diff --git a/libs/config/test/limits_test.cpp b/libs/config/test/limits_test.cpp deleted file mode 100644 index 62444965d..000000000 --- a/libs/config/test/limits_test.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/* boost limits_test.cpp test your file for important - * - * Copyright Jens Maurer 2000 - * Distributed under the 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$ - */ - -#include -#include -#include -#include - -/* - * General portability note: - * MSVC mis-compiles explicit function template instantiations. - * For example, f() and f() are both compiled to call f(). - * BCC is unable to implicitly convert a "const char *" to a std::string - * when using explicit function template instantiations. - * - * Therefore, avoid explicit function template instantiations. - */ -#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300) -template inline T make_char_numeric_for_streaming(T x) { return x; } -namespace fix{ -inline int make_char_numeric_for_streaming(char c) { return c; } -inline int make_char_numeric_for_streaming(signed char c) { return c; } -inline int make_char_numeric_for_streaming(unsigned char c) { return c; } -} -using namespace fix; -# if defined(_YVALS) && !defined(_CPPLIB_VER) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) -// fix for missing operator<< in original Dinkumware lib: -std::ostream& operator<<(std::ostream& os, __int64 i ) -{ - char buf[80]; - sprintf(buf,"%I64d", i ); - os << buf; - return os; -} -std::ostream& operator<<(std::ostream& os, unsigned __int64 i ) -{ - char buf[80]; - sprintf(buf,"%I64u", i ); - os << buf; - return os; -} -# endif -#else -template inline T make_char_numeric_for_streaming(T x) { return x; } -inline int make_char_numeric_for_streaming(char c) { return c; } -inline int make_char_numeric_for_streaming(signed char c) { return c; } -inline int make_char_numeric_for_streaming(unsigned char c) { return c; } -#endif - -#if (defined(_GLIBCPP_VERSION) || defined(_GLIBCXX_VERSION)) \ - && defined(BOOST_HAS_LONG_LONG) \ - && !defined(_GLIBCPP_USE_LONG_LONG) \ - && !defined(_GLIBCXX_USE_LONG_LONG) -// -// Some libstdc++ versions have numeric_limits but no -// iostream support for long long. TODO, find a better fix!! -// -std::ostream& operator<<(std::ostream& os, long long i ) -{ - return os << static_cast(i); -} -std::ostream& operator<<(std::ostream& os, unsigned long long i ) -{ - return os << static_cast(i); -} -#endif - -template -void test_integral_limits(const T &, const char * msg) -{ - typedef std::numeric_limits lim; - std::cout << "Testing " << msg - << " (size " << sizeof(T) << ")" - << " min: " << make_char_numeric_for_streaming((lim::min)()) - << ", max: " << make_char_numeric_for_streaming((lim::max)()) - << std::endl; - - BOOST_TEST(static_cast(lim::is_specialized)); - BOOST_TEST(static_cast(lim::is_integer)); - // BOOST_TEST(lim::is_modulo); - BOOST_TEST(static_cast((lim::min)() < (lim::max)())); -} - -template -void print_hex_val(T t, const char* name) -{ - const unsigned char* p = (const unsigned char*)&t; - std::cout << "hex value of " << name << " is: "; - for (unsigned int i = 0; i < sizeof(T); ++i) { - if(p[i] <= 0xF) - std::cout << "0"; - std::cout << std::hex << (int)p[i]; - } - std::cout << std::dec << std::endl; -} - -template -void test_float_limits(const T &, const char * msg) -{ - std::cout << "\nTesting " << msg << std::endl; - typedef std::numeric_limits lim; - - BOOST_TEST(static_cast(lim::is_specialized)); - BOOST_TEST(static_cast(!lim::is_modulo)); - BOOST_TEST(static_cast(!lim::is_integer)); - BOOST_TEST(static_cast(lim::is_signed)); - - const T infinity = lim::infinity(); - const T qnan = lim::quiet_NaN(); - const T snan = lim::signaling_NaN(); - - std::cout << "IEEE-compatible: " << lim::is_iec559 - << ", traps: " << lim::traps - << ", bounded: " << lim::is_bounded - << ", exact: " << lim::is_exact << '\n' - << "min: " << (lim::min)() << ", max: " << (lim::max)() << '\n' - << "infinity: " << infinity << ", QNaN: " << qnan << '\n'; - print_hex_val((lim::max)(), "max"); - print_hex_val(infinity, "infinity"); - print_hex_val(qnan, "qnan"); - print_hex_val(snan, "snan"); - - BOOST_TEST((lim::max)() > 1000); - BOOST_TEST((lim::min)() > 0); - BOOST_TEST((lim::min)() < 0.001); - BOOST_TEST(lim::epsilon() > 0); - - if(lim::is_iec559) { - BOOST_TEST(static_cast(lim::has_infinity)); - BOOST_TEST(static_cast(lim::has_quiet_NaN)); - BOOST_TEST(static_cast(lim::has_signaling_NaN)); - } else { - std::cout << "Does not claim IEEE conformance" << std::endl; - } - - if(lim::has_infinity) { - // Make sure those values are not 0 or similar nonsense. - // Infinity must compare as if larger than the maximum representable value. - BOOST_TEST(infinity > (lim::max)()); - BOOST_TEST(-infinity < -(lim::max)()); - } else { - std::cout << "Does not have infinity" << std::endl; - } - - if(lim::has_quiet_NaN) { - // NaNs shall always compare "false" when compared for equality - // If one of these fail, your compiler may be optimizing incorrectly, - // or the standard library is incorrectly configured. - BOOST_TEST(! (qnan == 42)); - BOOST_TEST(qnan != 42); - if(lim::is_iec559) - { - BOOST_TEST(! (qnan == qnan)); - BOOST_TEST(qnan != qnan); - } - - // The following tests may cause arithmetic traps. - // BOOST_TEST(! (qnan < 42)); - // BOOST_TEST(! (qnan > 42)); - // BOOST_TEST(! (qnan <= 42)); - // BOOST_TEST(! (qnan >= 42)); - } else { - std::cout << "Does not have QNaN" << std::endl; - } -} - - -int cpp_main(int, char*[]) -{ - test_integral_limits(bool(), "bool"); - test_integral_limits(char(), "char"); - typedef signed char signed_char; - test_integral_limits(signed_char(), "signed char"); - typedef unsigned char unsigned_char; - test_integral_limits(unsigned_char(), "unsigned char"); - test_integral_limits(wchar_t(), "wchar_t"); - test_integral_limits(short(), "short"); - typedef unsigned short unsigned_short; - test_integral_limits(unsigned_short(), "unsigned short"); - test_integral_limits(int(), "int"); - typedef unsigned int unsigned_int; - test_integral_limits(unsigned_int(), "unsigned int"); - test_integral_limits(long(), "long"); - typedef unsigned long unsigned_long; - test_integral_limits(unsigned_long(), "unsigned long"); -#if defined(BOOST_HAS_LONG_LONG) - test_integral_limits(::boost::long_long_type(), "long long"); - test_integral_limits(::boost::ulong_long_type(), "unsigned long long"); -#endif -#ifdef BOOST_HAS_MS_INT64 - typedef __int64 long_long2; - test_integral_limits(long_long2(), "__int64"); - typedef unsigned __int64 unsigned_long_long2; - test_integral_limits(unsigned_long_long2(), "unsigned __int64"); -#endif - - test_float_limits(float(), "float"); - test_float_limits(double(), "double"); - typedef long double long_double; - test_float_limits(long_double(), "long double"); - // Some compilers don't pay attention to std:3.6.1/5 and issue a - // warning here if "return 0;" is omitted. - return 0; -} - - diff --git a/libs/config/test/link/Jamfile.v2 b/libs/config/test/link/Jamfile.v2 deleted file mode 100644 index c5da6c29e..000000000 --- a/libs/config/test/link/Jamfile.v2 +++ /dev/null @@ -1,19 +0,0 @@ -# copyright John Maddock 2003 -# 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) - -lib link_test : link_test.cpp - : shared shared - # This is needed to make the test work, I'm unsure if this - # should be set globally. - BOOST_DYN_LINK=1 - # Override multi inherited from parent. - single - : - debug release - ; - -run main.cpp link_test : : : BOOST_DYN_LINK=1 BOOST_CONFIG_NO_LIB shared shared single : link_test_test ; - - diff --git a/libs/config/test/link/bc_gen.sh b/libs/config/test/link/bc_gen.sh deleted file mode 100644 index 6e48dda8b..000000000 --- a/libs/config/test/link/bc_gen.sh +++ /dev/null @@ -1,286 +0,0 @@ -#! /bin/bash - -# copyright 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) - -libname="" -src="" -header="" -all_dep="" - -# current makefile: -out="" -# temporary file: -tout="" -# install target temp file: -iout="" -# debug flag: -debug="no" -# compile options: -opts="" -# main output sub-directory: -subdir="" - -####################################################################### -# -# section for C++ Builder -# -####################################################################### - -function bcb_gen_lib() -{ - all_dep="$all_dep $subdir\\$libname $subdir\\$libname.lib $subdir\\$libname.exe" - echo " copy $subdir\\$libname.lib \$(BCROOT)\\lib" >> $iout -# -# set up section comments: - cat >> $tout << EOF -######################################################## -# -# section for $libname.lib -# -######################################################## -EOF -# -# process source files: - all_obj="" - all_lib_obj="" - for file in $src - do - obj=`echo "$file" | sed 's/\(.*\)cpp/\1obj/g'` - obj="$subdir\\$libname\\$obj" - all_obj="$all_obj $obj" - all_lib_obj="$all_lib_obj \"$obj\"" - echo "$obj: $file \$(ALL_HEADER)" >> $tout - echo " bcc32 @&&|" >> $tout - echo "-c \$(INCLUDES) $opts \$(CXXFLAGS) -o$obj $file" >> $tout - echo "|" >> $tout - echo "" >> $tout - done -# -# now for the directories for this library: - echo "$subdir\\$libname : " >> $tout - echo " -@mkdir $subdir\\$libname" >> $tout - echo "" >> $tout -# -# now for the clean options for this library: - all_clean="$all_clean $libname""_clean" - echo "$libname"_clean : >> $tout - echo " del $subdir\\$libname\\"'*.obj' >> $tout - echo " del $subdir\\$libname\\"'*.il?' >> $tout - echo " del $subdir\\$libname\\"'*.csm' >> $tout - echo " del $subdir\\$libname\\"'*.tds' >> $tout - echo "" >> $tout -# -# now for the main target for this library: - echo $subdir\\$libname.lib : $all_obj >> $tout - echo " tlib @&&|" >> $tout - echo "/P128 /C /u /a \$(XSFLAGS) \"$subdir\\$libname.lib\" $all_lib_obj" >> $tout - echo "|" >> $tout - echo "" >> $tout -# now the test program: - echo "$subdir\\$libname.exe : main.cpp $subdir\\$libname.lib" >> $tout - echo " bcc32 \$(INCLUDES) $opts /DBOOST_LIB_DIAGNOSTIC=1 \$(CXXFLAGS) -L./$subdir -e./$subdir/$libname.exe main.cpp" >> $tout - echo " echo running test progam $subdir"'\'"$libname.exe" >> $tout - echo " $subdir"'\'"$libname.exe" >> $tout - echo "" >> $tout -} - -function bcb_gen_dll() -{ - all_dep="$all_dep $subdir\\$libname $subdir\\$libname.lib $subdir\\$libname.exe" - echo " copy $subdir\\$libname.lib \$(BCROOT)\\lib" >> $iout - echo " copy $subdir\\$libname.dll \$(BCROOT)\\bin" >> $iout - echo " copy $subdir\\$libname.tds \$(BCROOT)\\bin" >> $iout -# -# set up section comments: - cat >> $tout << EOF -######################################################## -# -# section for $libname.lib -# -######################################################## -EOF -# -# process source files: - all_obj="" - for file in $src - do - obj=`echo "$file" | sed 's/\(.*\)cpp/\1obj/g'` - obj="$subdir\\$libname\\$obj" - all_obj="$all_obj $obj" - echo "$obj: $file \$(ALL_HEADER)" >> $tout - echo " bcc32 @&&|" >> $tout - echo "-c \$(INCLUDES) $opts \$(CXXFLAGS) -DBOOST_DYN_LINK -o$obj $file" >> $tout - echo "|" >> $tout - echo "" >> $tout - done -# -# now for the directories for this library: - echo "$subdir\\$libname :" >> $tout - echo " -@mkdir $subdir\\$libname" >> $tout - echo "" >> $tout -# -# now for the clean options for this library: - all_clean="$all_clean $libname""_clean" - echo "$libname"_clean : >> $tout - echo " del $subdir\\$libname\\"'*.obj' >> $tout - echo " del $subdir\\$libname\\"'*.il?' >> $tout - echo " del $subdir\\$libname\\"'*.csm' >> $tout - echo " del $subdir\\$libname\\"'*.tds' >> $tout - echo " del $subdir\\"'*.tds' >> $tout - echo "" >> $tout -# -# now for the main target for this library: - echo $subdir\\$libname.lib : $all_obj >> $tout - echo " bcc32 @&&|" >> $tout - echo "-lw-dup -lw-dpl $opts -e$subdir\\$libname.dll \$(XLFLAGS) $all_obj \$(LIBS)" >> $tout - echo "|" >> $tout - echo " implib -w $subdir\\$libname.lib $subdir\\$libname.dll" >> $tout - echo "" >> $tout -# now the test program: - echo "$subdir\\$libname.exe : main.cpp $subdir\\$libname.lib" >> $tout - echo " bcc32 \$(INCLUDES) $opts /DBOOST_LIB_DIAGNOSTIC=1 \$(CXXFLAGS) -DBOOST_DYN_LINK -L./$subdir -e./$subdir/$libname.exe main.cpp" >> $tout - echo " echo running test program $subdir"'\'"$libname.exe" >> $tout - echo " $subdir"'\'"$libname.exe" >> $tout - echo "" >> $tout -} - - - -function bcb_gen() -{ - tout="temp" - iout="temp_install" - all_dep="$subdir" - all_clean="" - echo > $out - echo > $tout - rm -f $iout - - libname="liblink_test-${subdir}-s-${boost_version}" - opts="-tWM- -D_NO_VCL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8037 -w-8057 -DSTRICT; -I\$(BCROOT)\include;../../../../" - bcb_gen_lib - - libname="liblink_test-${subdir}-mt-s-${boost_version}" - opts="-tWM -D_NO_VCL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I\$(BCROOT)\include;../../../../" - bcb_gen_lib - - libname="link_test-${subdir}-mt-${boost_version}" - opts="-tWD -tWM -tWR -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I\$(BCROOT)\include;../../../../ -L\$(BCROOT)\lib;\$(BCROOT)\lib\release;" - bcb_gen_dll - - libname="link_test-${subdir}-${boost_version}" - opts="-tWD -tWR -tWM- -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I\$(BCROOT)\include;../../../../ -L\$(BCROOT)\lib;\$(BCROOT)\lib\release;" - bcb_gen_dll - - libname="liblink_test-${subdir}-mt-${boost_version}" - opts="-tWD -tWM -tWR -DBOOST_REGEX_STATIC_LINK -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I\$(BCROOT)\include;../../../../ -L\$(BCROOT)\lib;\$(BCROOT)\lib\release;" - bcb_gen_lib - - libname="liblink_test-${subdir}-${boost_version}" - opts="-tWD -tWR -tWM- -DBOOST_REGEX_STATIC_LINK -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I\$(BCROOT)\include;../../../../ -L\$(BCROOT)\lib;\$(BCROOT)\lib\release;" - bcb_gen_lib - # - # debug versions: - libname="liblink_test-${subdir}-sd-${boost_version}" - opts="-tWM- -D_NO_VCL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8037 -w-8057 -DSTRICT; -I\$(BCROOT)\include;../../../../" - bcb_gen_lib - - libname="liblink_test-${subdir}-mt-sd-${boost_version}" - opts="-tWM -D_NO_VCL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I\$(BCROOT)\include;../../../../" - bcb_gen_lib - - libname="link_test-${subdir}-mt-d-${boost_version}" - opts="-tWD -tWM -tWR -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I\$(BCROOT)\include;../../../../ -L\$(BCROOT)\lib;\$(BCROOT)\lib\release;" - bcb_gen_dll - - libname="link_test-${subdir}-d-${boost_version}" - opts="-tWD -tWR -tWM- -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I\$(BCROOT)\include;../../../../ -L\$(BCROOT)\lib;\$(BCROOT)\lib\release;" - bcb_gen_dll - - libname="liblink_test-${subdir}-mt-d-${boost_version}" - opts="-tWD -tWM -tWR -DBOOST_REGEX_STATIC_LINK -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I\$(BCROOT)\include;../../../../ -L\$(BCROOT)\lib;\$(BCROOT)\lib\release;" - bcb_gen_lib - - libname="liblink_test-${subdir}-d-${boost_version}" - opts="-tWD -tWR -tWM- -DBOOST_REGEX_STATIC_LINK -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I\$(BCROOT)\include;../../../../ -L\$(BCROOT)\lib;\$(BCROOT)\lib\release;" - bcb_gen_lib - - - cat > $out << EOF -# copyright 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) -# -# auto generated makefile for C++ Builder -# -# usage: -# make -# brings libraries up to date -# make install -# brings libraries up to date and copies binaries to your C++ Builder /lib and /bin directories (recomended) -# make clean -# removes all temporary files. - -# -# Add additional compiler options here: -# -CXXFLAGS= -# -# Add additional include directories here: -# -INCLUDES= -# -# add additional linker flags here: -# -XLFLAGS= -# -# add additional libraries to link to here: -# -LIBS= -# -# add additional static-library creation flags here: -# -XSFLAGS= - -!ifndef BCROOT -BCROOT=\$(MAKEDIR)\\.. -!endif - -EOF - echo "" >> $out - echo "ALL_HEADER=$header" >> $out - echo "" >> $out - echo "all : $all_dep" >> $out - echo >> $out - echo "clean : $all_clean" >> $out - echo >> $out - echo "install : all" >> $out - cat $iout >> $out - echo >> $out - echo $subdir : >> $out - echo " -@mkdir $subdir" >> $out - echo "" >> $out - - cat $tout >> $out -} - -. common.sh - -# -# generate C++ Builder 6 files: -out="borland.mak" -subdir="borland" -has_stlport="yes" -bcb_gen - - - - - - - - diff --git a/libs/config/test/link/borland.mak b/libs/config/test/link/borland.mak deleted file mode 100644 index 624759c77..000000000 --- a/libs/config/test/link/borland.mak +++ /dev/null @@ -1,429 +0,0 @@ -# copyright 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) -# -# auto generated makefile for C++ Builder -# -# usage: -# make -# brings libraries up to date -# make install -# brings libraries up to date and copies binaries to your C++ Builder /lib and /bin directories (recomended) -# make clean -# removes all temporary files. - -# -# Add additional compiler options here: -# -CXXFLAGS= -# -# Add additional include directories here: -# -INCLUDES= -# -# add additional linker flags here: -# -XLFLAGS= -# -# add additional libraries to link to here: -# -LIBS= -# -# add additional static-library creation flags here: -# -XSFLAGS= - -!ifndef BCROOT -BCROOT=$(MAKEDIR)\.. -!endif - - -ALL_HEADER= - -all : borland borland\liblink_test-borland-s-1_35 borland\liblink_test-borland-s-1_35.lib borland\liblink_test-borland-s-1_35.exe borland\liblink_test-borland-mt-s-1_35 borland\liblink_test-borland-mt-s-1_35.lib borland\liblink_test-borland-mt-s-1_35.exe borland\link_test-borland-mt-1_35 borland\link_test-borland-mt-1_35.lib borland\link_test-borland-mt-1_35.exe borland\link_test-borland-1_35 borland\link_test-borland-1_35.lib borland\link_test-borland-1_35.exe borland\liblink_test-borland-mt-1_35 borland\liblink_test-borland-mt-1_35.lib borland\liblink_test-borland-mt-1_35.exe borland\liblink_test-borland-1_35 borland\liblink_test-borland-1_35.lib borland\liblink_test-borland-1_35.exe borland\liblink_test-borland-sd-1_35 borland\liblink_test-borland-sd-1_35.lib borland\liblink_test-borland-sd-1_35.exe borland\liblink_test-borland-mt-sd-1_35 borland\liblink_test-borland-mt-sd-1_35.lib borland\liblink_test-borland-mt-sd-1_35.exe borland\link_test-borland-mt-d-1_35 borland\link_test-borland-mt-d-1_35.lib borland\link_test-borland-mt-d-1_35.exe borland\link_test-borland-d-1_35 borland\link_test-borland-d-1_35.lib borland\link_test-borland-d-1_35.exe borland\liblink_test-borland-mt-d-1_35 borland\liblink_test-borland-mt-d-1_35.lib borland\liblink_test-borland-mt-d-1_35.exe borland\liblink_test-borland-d-1_35 borland\liblink_test-borland-d-1_35.lib borland\liblink_test-borland-d-1_35.exe - -clean : liblink_test-borland-s-1_35_clean liblink_test-borland-mt-s-1_35_clean link_test-borland-mt-1_35_clean link_test-borland-1_35_clean liblink_test-borland-mt-1_35_clean liblink_test-borland-1_35_clean liblink_test-borland-sd-1_35_clean liblink_test-borland-mt-sd-1_35_clean link_test-borland-mt-d-1_35_clean link_test-borland-d-1_35_clean liblink_test-borland-mt-d-1_35_clean liblink_test-borland-d-1_35_clean - -install : all - copy borland\liblink_test-borland-s-1_35.lib $(BCROOT)\lib - copy borland\liblink_test-borland-mt-s-1_35.lib $(BCROOT)\lib - copy borland\link_test-borland-mt-1_35.lib $(BCROOT)\lib - copy borland\link_test-borland-mt-1_35.dll $(BCROOT)\bin - copy borland\link_test-borland-mt-1_35.tds $(BCROOT)\bin - copy borland\link_test-borland-1_35.lib $(BCROOT)\lib - copy borland\link_test-borland-1_35.dll $(BCROOT)\bin - copy borland\link_test-borland-1_35.tds $(BCROOT)\bin - copy borland\liblink_test-borland-mt-1_35.lib $(BCROOT)\lib - copy borland\liblink_test-borland-1_35.lib $(BCROOT)\lib - copy borland\liblink_test-borland-sd-1_35.lib $(BCROOT)\lib - copy borland\liblink_test-borland-mt-sd-1_35.lib $(BCROOT)\lib - copy borland\link_test-borland-mt-d-1_35.lib $(BCROOT)\lib - copy borland\link_test-borland-mt-d-1_35.dll $(BCROOT)\bin - copy borland\link_test-borland-mt-d-1_35.tds $(BCROOT)\bin - copy borland\link_test-borland-d-1_35.lib $(BCROOT)\lib - copy borland\link_test-borland-d-1_35.dll $(BCROOT)\bin - copy borland\link_test-borland-d-1_35.tds $(BCROOT)\bin - copy borland\liblink_test-borland-mt-d-1_35.lib $(BCROOT)\lib - copy borland\liblink_test-borland-d-1_35.lib $(BCROOT)\lib - -borland : - -@mkdir borland - - -######################################################## -# -# section for liblink_test-borland-s-1_35.lib -# -######################################################## -borland\liblink_test-borland-s-1_35\link_test.obj: link_test.cpp $(ALL_HEADER) - bcc32 @&&| --c $(INCLUDES) -tWM- -D_NO_VCL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8037 -w-8057 -DSTRICT; -I$(BCROOT)\include;../../../../ $(CXXFLAGS) -oborland\liblink_test-borland-s-1_35\link_test.obj link_test.cpp -| - -borland\liblink_test-borland-s-1_35 : - -@mkdir borland\liblink_test-borland-s-1_35 - -liblink_test-borland-s-1_35_clean : - del borland\liblink_test-borland-s-1_35\*.obj - del borland\liblink_test-borland-s-1_35\*.il? - del borland\liblink_test-borland-s-1_35\*.csm - del borland\liblink_test-borland-s-1_35\*.tds - -borland\liblink_test-borland-s-1_35.lib : borland\liblink_test-borland-s-1_35\link_test.obj - tlib @&&| -/P128 /C /u /a $(XSFLAGS) "borland\liblink_test-borland-s-1_35.lib" "borland\liblink_test-borland-s-1_35\link_test.obj" -| - -borland\liblink_test-borland-s-1_35.exe : main.cpp borland\liblink_test-borland-s-1_35.lib - bcc32 $(INCLUDES) -tWM- -D_NO_VCL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8037 -w-8057 -DSTRICT; -I$(BCROOT)\include;../../../../ /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -L./borland -e./borland/liblink_test-borland-s-1_35.exe main.cpp - echo running test progam borland\liblink_test-borland-s-1_35.exe - borland\liblink_test-borland-s-1_35.exe - -######################################################## -# -# section for liblink_test-borland-mt-s-1_35.lib -# -######################################################## -borland\liblink_test-borland-mt-s-1_35\link_test.obj: link_test.cpp $(ALL_HEADER) - bcc32 @&&| --c $(INCLUDES) -tWM -D_NO_VCL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ $(CXXFLAGS) -oborland\liblink_test-borland-mt-s-1_35\link_test.obj link_test.cpp -| - -borland\liblink_test-borland-mt-s-1_35 : - -@mkdir borland\liblink_test-borland-mt-s-1_35 - -liblink_test-borland-mt-s-1_35_clean : - del borland\liblink_test-borland-mt-s-1_35\*.obj - del borland\liblink_test-borland-mt-s-1_35\*.il? - del borland\liblink_test-borland-mt-s-1_35\*.csm - del borland\liblink_test-borland-mt-s-1_35\*.tds - -borland\liblink_test-borland-mt-s-1_35.lib : borland\liblink_test-borland-mt-s-1_35\link_test.obj - tlib @&&| -/P128 /C /u /a $(XSFLAGS) "borland\liblink_test-borland-mt-s-1_35.lib" "borland\liblink_test-borland-mt-s-1_35\link_test.obj" -| - -borland\liblink_test-borland-mt-s-1_35.exe : main.cpp borland\liblink_test-borland-mt-s-1_35.lib - bcc32 $(INCLUDES) -tWM -D_NO_VCL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -L./borland -e./borland/liblink_test-borland-mt-s-1_35.exe main.cpp - echo running test progam borland\liblink_test-borland-mt-s-1_35.exe - borland\liblink_test-borland-mt-s-1_35.exe - -######################################################## -# -# section for link_test-borland-mt-1_35.lib -# -######################################################## -borland\link_test-borland-mt-1_35\link_test.obj: link_test.cpp $(ALL_HEADER) - bcc32 @&&| --c $(INCLUDES) -tWD -tWM -tWR -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; $(CXXFLAGS) -DBOOST_DYN_LINK -oborland\link_test-borland-mt-1_35\link_test.obj link_test.cpp -| - -borland\link_test-borland-mt-1_35 : - -@mkdir borland\link_test-borland-mt-1_35 - -link_test-borland-mt-1_35_clean : - del borland\link_test-borland-mt-1_35\*.obj - del borland\link_test-borland-mt-1_35\*.il? - del borland\link_test-borland-mt-1_35\*.csm - del borland\link_test-borland-mt-1_35\*.tds - del borland\*.tds - -borland\link_test-borland-mt-1_35.lib : borland\link_test-borland-mt-1_35\link_test.obj - bcc32 @&&| --lw-dup -lw-dpl -tWD -tWM -tWR -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; -eborland\link_test-borland-mt-1_35.dll $(XLFLAGS) borland\link_test-borland-mt-1_35\link_test.obj $(LIBS) -| - implib -w borland\link_test-borland-mt-1_35.lib borland\link_test-borland-mt-1_35.dll - -borland\link_test-borland-mt-1_35.exe : main.cpp borland\link_test-borland-mt-1_35.lib - bcc32 $(INCLUDES) -tWD -tWM -tWR -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -DBOOST_DYN_LINK -L./borland -e./borland/link_test-borland-mt-1_35.exe main.cpp - echo running test program borland\link_test-borland-mt-1_35.exe - borland\link_test-borland-mt-1_35.exe - -######################################################## -# -# section for link_test-borland-1_35.lib -# -######################################################## -borland\link_test-borland-1_35\link_test.obj: link_test.cpp $(ALL_HEADER) - bcc32 @&&| --c $(INCLUDES) -tWD -tWR -tWM- -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; $(CXXFLAGS) -DBOOST_DYN_LINK -oborland\link_test-borland-1_35\link_test.obj link_test.cpp -| - -borland\link_test-borland-1_35 : - -@mkdir borland\link_test-borland-1_35 - -link_test-borland-1_35_clean : - del borland\link_test-borland-1_35\*.obj - del borland\link_test-borland-1_35\*.il? - del borland\link_test-borland-1_35\*.csm - del borland\link_test-borland-1_35\*.tds - del borland\*.tds - -borland\link_test-borland-1_35.lib : borland\link_test-borland-1_35\link_test.obj - bcc32 @&&| --lw-dup -lw-dpl -tWD -tWR -tWM- -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; -eborland\link_test-borland-1_35.dll $(XLFLAGS) borland\link_test-borland-1_35\link_test.obj $(LIBS) -| - implib -w borland\link_test-borland-1_35.lib borland\link_test-borland-1_35.dll - -borland\link_test-borland-1_35.exe : main.cpp borland\link_test-borland-1_35.lib - bcc32 $(INCLUDES) -tWD -tWR -tWM- -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -DBOOST_DYN_LINK -L./borland -e./borland/link_test-borland-1_35.exe main.cpp - echo running test program borland\link_test-borland-1_35.exe - borland\link_test-borland-1_35.exe - -######################################################## -# -# section for liblink_test-borland-mt-1_35.lib -# -######################################################## -borland\liblink_test-borland-mt-1_35\link_test.obj: link_test.cpp $(ALL_HEADER) - bcc32 @&&| --c $(INCLUDES) -tWD -tWM -tWR -DBOOST_REGEX_STATIC_LINK -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; $(CXXFLAGS) -oborland\liblink_test-borland-mt-1_35\link_test.obj link_test.cpp -| - -borland\liblink_test-borland-mt-1_35 : - -@mkdir borland\liblink_test-borland-mt-1_35 - -liblink_test-borland-mt-1_35_clean : - del borland\liblink_test-borland-mt-1_35\*.obj - del borland\liblink_test-borland-mt-1_35\*.il? - del borland\liblink_test-borland-mt-1_35\*.csm - del borland\liblink_test-borland-mt-1_35\*.tds - -borland\liblink_test-borland-mt-1_35.lib : borland\liblink_test-borland-mt-1_35\link_test.obj - tlib @&&| -/P128 /C /u /a $(XSFLAGS) "borland\liblink_test-borland-mt-1_35.lib" "borland\liblink_test-borland-mt-1_35\link_test.obj" -| - -borland\liblink_test-borland-mt-1_35.exe : main.cpp borland\liblink_test-borland-mt-1_35.lib - bcc32 $(INCLUDES) -tWD -tWM -tWR -DBOOST_REGEX_STATIC_LINK -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -L./borland -e./borland/liblink_test-borland-mt-1_35.exe main.cpp - echo running test progam borland\liblink_test-borland-mt-1_35.exe - borland\liblink_test-borland-mt-1_35.exe - -######################################################## -# -# section for liblink_test-borland-1_35.lib -# -######################################################## -borland\liblink_test-borland-1_35\link_test.obj: link_test.cpp $(ALL_HEADER) - bcc32 @&&| --c $(INCLUDES) -tWD -tWR -tWM- -DBOOST_REGEX_STATIC_LINK -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; $(CXXFLAGS) -oborland\liblink_test-borland-1_35\link_test.obj link_test.cpp -| - -borland\liblink_test-borland-1_35 : - -@mkdir borland\liblink_test-borland-1_35 - -liblink_test-borland-1_35_clean : - del borland\liblink_test-borland-1_35\*.obj - del borland\liblink_test-borland-1_35\*.il? - del borland\liblink_test-borland-1_35\*.csm - del borland\liblink_test-borland-1_35\*.tds - -borland\liblink_test-borland-1_35.lib : borland\liblink_test-borland-1_35\link_test.obj - tlib @&&| -/P128 /C /u /a $(XSFLAGS) "borland\liblink_test-borland-1_35.lib" "borland\liblink_test-borland-1_35\link_test.obj" -| - -borland\liblink_test-borland-1_35.exe : main.cpp borland\liblink_test-borland-1_35.lib - bcc32 $(INCLUDES) -tWD -tWR -tWM- -DBOOST_REGEX_STATIC_LINK -D_NO_VCL -D_RTLDLL -O2 -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -L./borland -e./borland/liblink_test-borland-1_35.exe main.cpp - echo running test progam borland\liblink_test-borland-1_35.exe - borland\liblink_test-borland-1_35.exe - -######################################################## -# -# section for liblink_test-borland-sd-1_35.lib -# -######################################################## -borland\liblink_test-borland-sd-1_35\link_test.obj: link_test.cpp $(ALL_HEADER) - bcc32 @&&| --c $(INCLUDES) -tWM- -D_NO_VCL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8037 -w-8057 -DSTRICT; -I$(BCROOT)\include;../../../../ $(CXXFLAGS) -oborland\liblink_test-borland-sd-1_35\link_test.obj link_test.cpp -| - -borland\liblink_test-borland-sd-1_35 : - -@mkdir borland\liblink_test-borland-sd-1_35 - -liblink_test-borland-sd-1_35_clean : - del borland\liblink_test-borland-sd-1_35\*.obj - del borland\liblink_test-borland-sd-1_35\*.il? - del borland\liblink_test-borland-sd-1_35\*.csm - del borland\liblink_test-borland-sd-1_35\*.tds - -borland\liblink_test-borland-sd-1_35.lib : borland\liblink_test-borland-sd-1_35\link_test.obj - tlib @&&| -/P128 /C /u /a $(XSFLAGS) "borland\liblink_test-borland-sd-1_35.lib" "borland\liblink_test-borland-sd-1_35\link_test.obj" -| - -borland\liblink_test-borland-sd-1_35.exe : main.cpp borland\liblink_test-borland-sd-1_35.lib - bcc32 $(INCLUDES) -tWM- -D_NO_VCL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8037 -w-8057 -DSTRICT; -I$(BCROOT)\include;../../../../ /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -L./borland -e./borland/liblink_test-borland-sd-1_35.exe main.cpp - echo running test progam borland\liblink_test-borland-sd-1_35.exe - borland\liblink_test-borland-sd-1_35.exe - -######################################################## -# -# section for liblink_test-borland-mt-sd-1_35.lib -# -######################################################## -borland\liblink_test-borland-mt-sd-1_35\link_test.obj: link_test.cpp $(ALL_HEADER) - bcc32 @&&| --c $(INCLUDES) -tWM -D_NO_VCL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ $(CXXFLAGS) -oborland\liblink_test-borland-mt-sd-1_35\link_test.obj link_test.cpp -| - -borland\liblink_test-borland-mt-sd-1_35 : - -@mkdir borland\liblink_test-borland-mt-sd-1_35 - -liblink_test-borland-mt-sd-1_35_clean : - del borland\liblink_test-borland-mt-sd-1_35\*.obj - del borland\liblink_test-borland-mt-sd-1_35\*.il? - del borland\liblink_test-borland-mt-sd-1_35\*.csm - del borland\liblink_test-borland-mt-sd-1_35\*.tds - -borland\liblink_test-borland-mt-sd-1_35.lib : borland\liblink_test-borland-mt-sd-1_35\link_test.obj - tlib @&&| -/P128 /C /u /a $(XSFLAGS) "borland\liblink_test-borland-mt-sd-1_35.lib" "borland\liblink_test-borland-mt-sd-1_35\link_test.obj" -| - -borland\liblink_test-borland-mt-sd-1_35.exe : main.cpp borland\liblink_test-borland-mt-sd-1_35.lib - bcc32 $(INCLUDES) -tWM -D_NO_VCL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -L./borland -e./borland/liblink_test-borland-mt-sd-1_35.exe main.cpp - echo running test progam borland\liblink_test-borland-mt-sd-1_35.exe - borland\liblink_test-borland-mt-sd-1_35.exe - -######################################################## -# -# section for link_test-borland-mt-d-1_35.lib -# -######################################################## -borland\link_test-borland-mt-d-1_35\link_test.obj: link_test.cpp $(ALL_HEADER) - bcc32 @&&| --c $(INCLUDES) -tWD -tWM -tWR -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; $(CXXFLAGS) -DBOOST_DYN_LINK -oborland\link_test-borland-mt-d-1_35\link_test.obj link_test.cpp -| - -borland\link_test-borland-mt-d-1_35 : - -@mkdir borland\link_test-borland-mt-d-1_35 - -link_test-borland-mt-d-1_35_clean : - del borland\link_test-borland-mt-d-1_35\*.obj - del borland\link_test-borland-mt-d-1_35\*.il? - del borland\link_test-borland-mt-d-1_35\*.csm - del borland\link_test-borland-mt-d-1_35\*.tds - del borland\*.tds - -borland\link_test-borland-mt-d-1_35.lib : borland\link_test-borland-mt-d-1_35\link_test.obj - bcc32 @&&| --lw-dup -lw-dpl -tWD -tWM -tWR -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; -eborland\link_test-borland-mt-d-1_35.dll $(XLFLAGS) borland\link_test-borland-mt-d-1_35\link_test.obj $(LIBS) -| - implib -w borland\link_test-borland-mt-d-1_35.lib borland\link_test-borland-mt-d-1_35.dll - -borland\link_test-borland-mt-d-1_35.exe : main.cpp borland\link_test-borland-mt-d-1_35.lib - bcc32 $(INCLUDES) -tWD -tWM -tWR -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -DBOOST_DYN_LINK -L./borland -e./borland/link_test-borland-mt-d-1_35.exe main.cpp - echo running test program borland\link_test-borland-mt-d-1_35.exe - borland\link_test-borland-mt-d-1_35.exe - -######################################################## -# -# section for link_test-borland-d-1_35.lib -# -######################################################## -borland\link_test-borland-d-1_35\link_test.obj: link_test.cpp $(ALL_HEADER) - bcc32 @&&| --c $(INCLUDES) -tWD -tWR -tWM- -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; $(CXXFLAGS) -DBOOST_DYN_LINK -oborland\link_test-borland-d-1_35\link_test.obj link_test.cpp -| - -borland\link_test-borland-d-1_35 : - -@mkdir borland\link_test-borland-d-1_35 - -link_test-borland-d-1_35_clean : - del borland\link_test-borland-d-1_35\*.obj - del borland\link_test-borland-d-1_35\*.il? - del borland\link_test-borland-d-1_35\*.csm - del borland\link_test-borland-d-1_35\*.tds - del borland\*.tds - -borland\link_test-borland-d-1_35.lib : borland\link_test-borland-d-1_35\link_test.obj - bcc32 @&&| --lw-dup -lw-dpl -tWD -tWR -tWM- -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; -eborland\link_test-borland-d-1_35.dll $(XLFLAGS) borland\link_test-borland-d-1_35\link_test.obj $(LIBS) -| - implib -w borland\link_test-borland-d-1_35.lib borland\link_test-borland-d-1_35.dll - -borland\link_test-borland-d-1_35.exe : main.cpp borland\link_test-borland-d-1_35.lib - bcc32 $(INCLUDES) -tWD -tWR -tWM- -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -DBOOST_DYN_LINK -L./borland -e./borland/link_test-borland-d-1_35.exe main.cpp - echo running test program borland\link_test-borland-d-1_35.exe - borland\link_test-borland-d-1_35.exe - -######################################################## -# -# section for liblink_test-borland-mt-d-1_35.lib -# -######################################################## -borland\liblink_test-borland-mt-d-1_35\link_test.obj: link_test.cpp $(ALL_HEADER) - bcc32 @&&| --c $(INCLUDES) -tWD -tWM -tWR -DBOOST_REGEX_STATIC_LINK -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; $(CXXFLAGS) -oborland\liblink_test-borland-mt-d-1_35\link_test.obj link_test.cpp -| - -borland\liblink_test-borland-mt-d-1_35 : - -@mkdir borland\liblink_test-borland-mt-d-1_35 - -liblink_test-borland-mt-d-1_35_clean : - del borland\liblink_test-borland-mt-d-1_35\*.obj - del borland\liblink_test-borland-mt-d-1_35\*.il? - del borland\liblink_test-borland-mt-d-1_35\*.csm - del borland\liblink_test-borland-mt-d-1_35\*.tds - -borland\liblink_test-borland-mt-d-1_35.lib : borland\liblink_test-borland-mt-d-1_35\link_test.obj - tlib @&&| -/P128 /C /u /a $(XSFLAGS) "borland\liblink_test-borland-mt-d-1_35.lib" "borland\liblink_test-borland-mt-d-1_35\link_test.obj" -| - -borland\liblink_test-borland-mt-d-1_35.exe : main.cpp borland\liblink_test-borland-mt-d-1_35.lib - bcc32 $(INCLUDES) -tWD -tWM -tWR -DBOOST_REGEX_STATIC_LINK -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -L./borland -e./borland/liblink_test-borland-mt-d-1_35.exe main.cpp - echo running test progam borland\liblink_test-borland-mt-d-1_35.exe - borland\liblink_test-borland-mt-d-1_35.exe - -######################################################## -# -# section for liblink_test-borland-d-1_35.lib -# -######################################################## -borland\liblink_test-borland-d-1_35\link_test.obj: link_test.cpp $(ALL_HEADER) - bcc32 @&&| --c $(INCLUDES) -tWD -tWR -tWM- -DBOOST_REGEX_STATIC_LINK -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; $(CXXFLAGS) -oborland\liblink_test-borland-d-1_35\link_test.obj link_test.cpp -| - -borland\liblink_test-borland-d-1_35 : - -@mkdir borland\liblink_test-borland-d-1_35 - -liblink_test-borland-d-1_35_clean : - del borland\liblink_test-borland-d-1_35\*.obj - del borland\liblink_test-borland-d-1_35\*.il? - del borland\liblink_test-borland-d-1_35\*.csm - del borland\liblink_test-borland-d-1_35\*.tds - -borland\liblink_test-borland-d-1_35.lib : borland\liblink_test-borland-d-1_35\link_test.obj - tlib @&&| -/P128 /C /u /a $(XSFLAGS) "borland\liblink_test-borland-d-1_35.lib" "borland\liblink_test-borland-d-1_35\link_test.obj" -| - -borland\liblink_test-borland-d-1_35.exe : main.cpp borland\liblink_test-borland-d-1_35.lib - bcc32 $(INCLUDES) -tWD -tWR -tWM- -DBOOST_REGEX_STATIC_LINK -D_NO_VCL -D_RTLDLL -v -Ve -Vx -w-inl -w-aus -w-rch -w-8012 -w-8057 -w-8037 -DSTRICT; -I$(BCROOT)\include;../../../../ -L$(BCROOT)\lib;$(BCROOT)\lib\release; /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -L./borland -e./borland/liblink_test-borland-d-1_35.exe main.cpp - echo running test progam borland\liblink_test-borland-d-1_35.exe - borland\liblink_test-borland-d-1_35.exe - diff --git a/libs/config/test/link/common.sh b/libs/config/test/link/common.sh deleted file mode 100644 index 9725a5c36..000000000 --- a/libs/config/test/link/common.sh +++ /dev/null @@ -1,19 +0,0 @@ -# copyright 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) -# -# locate all the header dependencies: -header="" -# -# locate all the source files: -src=link_test.cpp - -boost_version=$(grep 'define.*BOOST_LIB_VERSION' ../../../../boost/version.hpp | sed 's/.*"\([^"]*\)".*/\1/') - - - - - - - diff --git a/libs/config/test/link/link_test.cpp b/libs/config/test/link/link_test.cpp deleted file mode 100644 index be80bfcdc..000000000 --- a/libs/config/test/link/link_test.cpp +++ /dev/null @@ -1,54 +0,0 @@ -// (C) Copyright John Maddock 2003. -// 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/config for the most recent version. - - -#define BOOST_CONFIG_SOURCE - -#include "link_test.hpp" -#include -#include - -bool BOOST_CONFIG_DECL check_options( - bool m_dyn_link, - bool m_dyn_rtl, - bool m_has_threads, - bool m_debug, - bool m_stlp_debug) -{ - if(m_dyn_link != dyn_link) - { - std::cout << "Dynamic link options do not match" << std::endl; - std::cout << "Application setting = " << m_dyn_link << " Library setting = " << dyn_link << std::endl; - return false; - } - if(m_dyn_rtl != dyn_rtl) - { - std::cout << "Runtime library options do not match" << std::endl; - std::cout << "Application setting = " << m_dyn_rtl << " Library setting = " << dyn_rtl << std::endl; - return false; - } - if(m_has_threads != has_threads) - { - std::cout << "Threading options do not match" << std::endl; - std::cout << "Application setting = " << m_has_threads << " Library setting = " << has_threads << std::endl; - return false; - } - if(m_debug != debug) - { - std::cout << "Debug options do not match" << std::endl; - std::cout << "Application setting = " << m_debug << " Library setting = " << debug << std::endl; - return false; - } - if(m_stlp_debug != stl_debug) - { - std::cout << "STLPort debug options do not match" << std::endl; - std::cout << "Application setting = " << m_stlp_debug << " Library setting = " << stl_debug << std::endl; - return false; - } - return true; -} - diff --git a/libs/config/test/link/link_test.hpp b/libs/config/test/link/link_test.hpp deleted file mode 100644 index c95d963a4..000000000 --- a/libs/config/test/link/link_test.hpp +++ /dev/null @@ -1,108 +0,0 @@ -// (C) Copyright John Maddock 2003. -// 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/config for the most recent version. - -#ifndef BOOST_LINK_TEST_HPP -#define BOOST_LINK_TEST_HPP - -#include - -// -// set up code to determine our compilers options, -// we will check that these are the same in the -// .exe and the .dll: -// -#ifdef BOOST_DYN_LINK -static const bool dyn_link = true; -#else -static const bool dyn_link = false; -#endif -#if defined(_DLL) || defined(_RTLDLL) -static const bool dyn_rtl = true; -#else -static const bool dyn_rtl = false; -#endif -#if defined(BOOST_HAS_THREADS) -static const bool has_threads = true; -#else -static const bool has_threads = false; -#endif -#if defined(_DEBUG) -static const bool debug = true; -#else -static const bool debug = false; -#endif -#if defined(__STL_DEBUG) || defined(_STLP_DEBUG) -static const bool stl_debug = true; -#else -static const bool stl_debug = false; -#endif - -// -// set up import and export options: -// -#if defined(BOOST_DYN_LINK) -# ifdef BOOST_CONFIG_SOURCE -# define BOOST_CONFIG_DECL BOOST_SYMBOL_EXPORT -# else -# define BOOST_CONFIG_DECL BOOST_SYMBOL_IMPORT -# endif -#endif -#ifndef BOOST_CONFIG_DECL -# define BOOST_CONFIG_DECL -#endif - -// -// define our entry point: -// -bool BOOST_CONFIG_DECL check_options( - bool m_dyn_link, - bool m_dyn_rtl, - bool m_has_threads, - bool m_debug, - bool m_stlp_debug); - -// -// set up automatic linking: -// -#if !defined(BOOST_CONFIG_SOURCE) && !defined(BOOST_CONFIG_NO_LIB) -# define BOOST_LIB_NAME link_test -# include -#endif - -#ifndef BOOST_NO_CXX11_EXTERN_TEMPLATE - -template -T test_free_proc(T v) -{ - return v; -} - -template -struct tester -{ - static int test(); -}; - -template -int tester::test() -{ - return 0; -} - -#ifdef BOOST_CONFIG_SOURCE -template BOOST_SYMBOL_EXPORT int test_free_proc(int); -template BOOST_SYMBOL_EXPORT int tester::test(); -#else -extern template BOOST_SYMBOL_IMPORT int test_free_proc(int); -extern template BOOST_SYMBOL_IMPORT int tester::test(); -#endif - -#endif // BOOST_NO_CXX11_EXTERN_TEMPLATE - -#endif // BOOST_LINK_TEST_HPP - - diff --git a/libs/config/test/link/main.cpp b/libs/config/test/link/main.cpp deleted file mode 100644 index 7233560e2..000000000 --- a/libs/config/test/link/main.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// (C) Copyright John Maddock 2003. -// 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/config for the most recent version. - -#include "link_test.hpp" - -int main() -{ -#ifndef BOOST_NO_CXX11_EXTERN_TEMPLATE - test_free_proc(0); - tester::test(); -#endif - return check_options(dyn_link, dyn_rtl, has_threads, debug, stl_debug) ? 0 : -1; -} - - diff --git a/libs/config/test/link/test/Jamfile.v2 b/libs/config/test/link/test/Jamfile.v2 deleted file mode 100644 index 251e52566..000000000 --- a/libs/config/test/link/test/Jamfile.v2 +++ /dev/null @@ -1,117 +0,0 @@ -# copyright John Maddock 2006 -# 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) - -import type ; - -type.register AUTOLINK_LIB ; - -import generators ; -import "class" : new ; - -# This generator creates library using standard generators, -# and then add usage requirements with the -# path of the created library. -class autolink-generator : generator -{ - import generators ; - import "class" ; - import property-set ; - import path ; - - rule run ( project name ? : property-set : sources + ) - { - local result = [ generators.construct $(project) $(name) - : LIB : $(property-set) : $(sources) ] ; - - local targets ; - local usage-requirements ; - - if [ class.is-a $(result[1]) : property-set ] - { - usage-requirements = $(result[1]) ; - targets = $(result[2-]) ; - } - else - { - usage-requirements = [ property-set.empty ] ; - targets = $(result) ; - } - - local extra ; - local paths ; - local pwd = [ path.pwd ] ; - for local t in $(targets) - { - if [ type.is-derived [ $(t).type ] LIB ] - { - paths += [ path.root [ path.make [ $(t).path ] ] $(pwd) ] ; - } - } - extra += $(paths:G=) ; - if $(extra) - { - extra = [ sequence.unique $(extra) ] ; - usage-requirements = [ $(usage-requirements).add-raw $(extra) ] ; - } - return $(usage-requirements) $(targets) ; - } -} - -generators.register [ - new autolink-generator $(__name__).autolink : : AUTOLINK_LIB ] ; - -project : requirements -multi false ; - -autolink-lib link_test : ../link_test.cpp - : shared:BOOST_DYN_LINK=1 - : - ; - - -explicit link_test ; - -run ../main.cpp link_test - : : : msvc-8.0:no msvc-9.0:no msvc-10.0:no msvc-11.0:no msvc-12.0:no static static single debug : link_test_ssd ; - -run ../main.cpp link_test - : : : msvc-8.0:no msvc-9.0:no msvc-10.0:no msvc-11.0:no msvc-12.0:no static static single release : link_test_ssr ; - -run ../main.cpp link_test - : : : static static multi debug : link_test_smd ; - -run ../main.cpp link_test - : : : static static multi release : link_test_smr ; - -run ../main.cpp link_test - : : : static shared multi debug : link_test_dmd ; - -run ../main.cpp link_test - : : : static shared multi release : link_test_dmr ; - -run ../main.cpp link_test - : : : static shared single debug : link_test_dsd ; - -run ../main.cpp link_test - : : : static shared single release : link_test_dsr ; - -run ../main.cpp link_test - : : : BOOST_DYN_LINK=1 shared shared multi debug : link_test_dll_dmd ; - -run ../main.cpp link_test - : : : BOOST_DYN_LINK=1 shared shared multi release : link_test_dll_dmr ; - -run ../main.cpp link_test - : : : BOOST_DYN_LINK=1 shared shared single debug : link_test_dll_dsd ; - -run ../main.cpp link_test - : : : BOOST_DYN_LINK=1 shared shared single release : link_test_dll_dsr ; - - - - - - - - diff --git a/libs/config/test/link/vc6-stlport.mak b/libs/config/test/link/vc6-stlport.mak deleted file mode 100644 index 3eb3dc56d..000000000 --- a/libs/config/test/link/vc6-stlport.mak +++ /dev/null @@ -1,292 +0,0 @@ -# copyright 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) -# -# auto generated makefile for VC6+STLPort -# -# usage: -# make -# brings libraries up to date -# make install -# brings libraries up to date and copies binaries to your VC6 /lib and /bin directories (recomended) -# - -# -# Add additional compiler options here: -# -CXXFLAGS= -# -# Add additional include directories here: -# -INCLUDES= -# -# add additional linker flags here: -# -XLFLAGS= -# -# add additional static-library creation flags here: -# -XSFLAGS= - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -!IF "$(MSVCDIR)" == "" -!ERROR Variable MSVCDIR not set. -!ENDIF - -!IF "$(STLPORT_PATH)" == "" -!ERROR Variable STLPORT_PATH not set. -!ENDIF - - -ALL_HEADER= - -all : main_dir liblink_test-vc6-stlport-mt-s-1_35_dir ./vc6-stlport/liblink_test-vc6-stlport-mt-s-1_35.lib ./vc6-stlport/liblink_test-vc6-stlport-mt-s-1_35.exe liblink_test-vc6-stlport-mt-sgd-1_35_dir ./vc6-stlport/liblink_test-vc6-stlport-mt-sgd-1_35.lib ./vc6-stlport/liblink_test-vc6-stlport-mt-sgd-1_35.exe link_test-vc6-stlport-mt-gd-1_35_dir ./vc6-stlport/link_test-vc6-stlport-mt-gd-1_35.lib ./vc6-stlport/link_test-vc6-stlport-mt-gd-1_35.exe link_test-vc6-stlport-mt-1_35_dir ./vc6-stlport/link_test-vc6-stlport-mt-1_35.lib ./vc6-stlport/link_test-vc6-stlport-mt-1_35.exe liblink_test-vc6-stlport-mt-1_35_dir ./vc6-stlport/liblink_test-vc6-stlport-mt-1_35.lib ./vc6-stlport/liblink_test-vc6-stlport-mt-1_35.exe liblink_test-vc6-stlport-mt-gd-1_35_dir ./vc6-stlport/liblink_test-vc6-stlport-mt-gd-1_35.lib ./vc6-stlport/liblink_test-vc6-stlport-mt-gd-1_35.exe link_test-vc6-stlport-mt-pgd-1_35_dir ./vc6-stlport/link_test-vc6-stlport-mt-pgd-1_35.lib ./vc6-stlport/link_test-vc6-stlport-mt-pgd-1_35.exe liblink_test-vc6-stlport-mt-spgd-1_35_dir ./vc6-stlport/liblink_test-vc6-stlport-mt-spgd-1_35.lib ./vc6-stlport/liblink_test-vc6-stlport-mt-spgd-1_35.exe liblink_test-vc6-stlport-mt-pgd-1_35_dir ./vc6-stlport/liblink_test-vc6-stlport-mt-pgd-1_35.lib ./vc6-stlport/liblink_test-vc6-stlport-mt-pgd-1_35.exe - -clean : liblink_test-vc6-stlport-mt-s-1_35_clean liblink_test-vc6-stlport-mt-sgd-1_35_clean link_test-vc6-stlport-mt-gd-1_35_clean link_test-vc6-stlport-mt-1_35_clean liblink_test-vc6-stlport-mt-1_35_clean liblink_test-vc6-stlport-mt-gd-1_35_clean link_test-vc6-stlport-mt-pgd-1_35_clean liblink_test-vc6-stlport-mt-spgd-1_35_clean liblink_test-vc6-stlport-mt-pgd-1_35_clean - -install : stlport_check all - copy vc6-stlport\liblink_test-vc6-stlport-mt-s-1_35.lib "$(MSVCDIR)\lib" - copy vc6-stlport\liblink_test-vc6-stlport-mt-sgd-1_35.lib "$(MSVCDIR)\lib" - copy vc6-stlport\link_test-vc6-stlport-mt-gd-1_35.lib "$(MSVCDIR)\lib" - copy vc6-stlport\link_test-vc6-stlport-mt-gd-1_35.dll "$(MSVCDIR)\bin" - copy vc6-stlport\link_test-vc6-stlport-mt-1_35.lib "$(MSVCDIR)\lib" - copy vc6-stlport\link_test-vc6-stlport-mt-1_35.dll "$(MSVCDIR)\bin" - copy vc6-stlport\liblink_test-vc6-stlport-mt-1_35.lib "$(MSVCDIR)\lib" - copy vc6-stlport\liblink_test-vc6-stlport-mt-gd-1_35.lib "$(MSVCDIR)\lib" - copy vc6-stlport\link_test-vc6-stlport-mt-pgd-1_35.lib "$(MSVCDIR)\lib" - copy vc6-stlport\link_test-vc6-stlport-mt-pgd-1_35.dll "$(MSVCDIR)\bin" - copy vc6-stlport\link_test-vc6-stlport-mt-pgd-1_35.pdb "$(MSVCDIR)\lib" - copy vc6-stlport\liblink_test-vc6-stlport-mt-spgd-1_35.lib "$(MSVCDIR)\lib" - copy vc6-stlport\liblink_test-vc6-stlport-mt-spgd-1_35.pdb "$(MSVCDIR)\lib" - copy vc6-stlport\liblink_test-vc6-stlport-mt-pgd-1_35.lib "$(MSVCDIR)\lib" - copy vc6-stlport\liblink_test-vc6-stlport-mt-pgd-1_35.pdb "$(MSVCDIR)\lib" - -main_dir : - @if not exist "vc6-stlport\$(NULL)" mkdir vc6-stlport - -stlport_check : $(STLPORT_PATH)\stlport\string - echo - - -######################################################## -# -# section for liblink_test-vc6-stlport-mt-s-1_35.lib -# -######################################################## -vc6-stlport/liblink_test-vc6-stlport-mt-s-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MT /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB $(CXXFLAGS) -Y- -Fo./vc6-stlport/liblink_test-vc6-stlport-mt-s-1_35/ -Fdvc6-stlport/liblink_test-vc6-stlport-mt-s-1_35.pdb link_test.cpp - -liblink_test-vc6-stlport-mt-s-1_35_dir : - @if not exist "vc6-stlport\liblink_test-vc6-stlport-mt-s-1_35\$(NULL)" mkdir vc6-stlport\liblink_test-vc6-stlport-mt-s-1_35 - -liblink_test-vc6-stlport-mt-s-1_35_clean : - del vc6-stlport\liblink_test-vc6-stlport-mt-s-1_35\*.obj - del vc6-stlport\liblink_test-vc6-stlport-mt-s-1_35\*.idb - del vc6-stlport\liblink_test-vc6-stlport-mt-s-1_35\*.exp - del vc6-stlport\liblink_test-vc6-stlport-mt-s-1_35\*.pch - -./vc6-stlport/liblink_test-vc6-stlport-mt-s-1_35.lib : vc6-stlport/liblink_test-vc6-stlport-mt-s-1_35/link_test.obj - link -lib /nologo /out:vc6-stlport/liblink_test-vc6-stlport-mt-s-1_35.lib $(XSFLAGS) vc6-stlport/liblink_test-vc6-stlport-mt-s-1_35/link_test.obj - -./vc6-stlport/liblink_test-vc6-stlport-mt-s-1_35.exe : main.cpp ./vc6-stlport/liblink_test-vc6-stlport-mt-s-1_35.lib - cl $(INCLUDES) /nologo /MT /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6-stlport/liblink_test-vc6-stlport-mt-s-1_35.exe main.cpp /link /LIBPATH:./vc6-stlport - vc6-stlport\liblink_test-vc6-stlport-mt-s-1_35.exe - -######################################################## -# -# section for liblink_test-vc6-stlport-mt-sgd-1_35.lib -# -######################################################## -vc6-stlport/liblink_test-vc6-stlport-mt-sgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /GX $(CXXFLAGS) -Y- -Fo./vc6-stlport/liblink_test-vc6-stlport-mt-sgd-1_35/ -Fdvc6-stlport/liblink_test-vc6-stlport-mt-sgd-1_35.pdb link_test.cpp - -liblink_test-vc6-stlport-mt-sgd-1_35_dir : - @if not exist "vc6-stlport\liblink_test-vc6-stlport-mt-sgd-1_35\$(NULL)" mkdir vc6-stlport\liblink_test-vc6-stlport-mt-sgd-1_35 - -liblink_test-vc6-stlport-mt-sgd-1_35_clean : - del vc6-stlport\liblink_test-vc6-stlport-mt-sgd-1_35\*.obj - del vc6-stlport\liblink_test-vc6-stlport-mt-sgd-1_35\*.idb - del vc6-stlport\liblink_test-vc6-stlport-mt-sgd-1_35\*.exp - del vc6-stlport\liblink_test-vc6-stlport-mt-sgd-1_35\*.pch - -./vc6-stlport/liblink_test-vc6-stlport-mt-sgd-1_35.lib : vc6-stlport/liblink_test-vc6-stlport-mt-sgd-1_35/link_test.obj - link -lib /nologo /out:vc6-stlport/liblink_test-vc6-stlport-mt-sgd-1_35.lib $(XSFLAGS) vc6-stlport/liblink_test-vc6-stlport-mt-sgd-1_35/link_test.obj - -./vc6-stlport/liblink_test-vc6-stlport-mt-sgd-1_35.exe : main.cpp ./vc6-stlport/liblink_test-vc6-stlport-mt-sgd-1_35.lib - cl $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /GX /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6-stlport/liblink_test-vc6-stlport-mt-sgd-1_35.exe main.cpp /link /LIBPATH:./vc6-stlport - vc6-stlport\liblink_test-vc6-stlport-mt-sgd-1_35.exe - -######################################################## -# -# section for link_test-vc6-stlport-mt-gd-1_35.lib -# -######################################################## -vc6-stlport/link_test-vc6-stlport-mt-gd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX $(CXXFLAGS) -Y- -Fo./vc6-stlport/link_test-vc6-stlport-mt-gd-1_35/ -Fdvc6-stlport/link_test-vc6-stlport-mt-gd-1_35.pdb link_test.cpp - -link_test-vc6-stlport-mt-gd-1_35_dir : - @if not exist "vc6-stlport\link_test-vc6-stlport-mt-gd-1_35\$(NULL)" mkdir vc6-stlport\link_test-vc6-stlport-mt-gd-1_35 - -link_test-vc6-stlport-mt-gd-1_35_clean : - del vc6-stlport\link_test-vc6-stlport-mt-gd-1_35\*.obj - del vc6-stlport\link_test-vc6-stlport-mt-gd-1_35\*.idb - del vc6-stlport\link_test-vc6-stlport-mt-gd-1_35\*.exp - del vc6-stlport\link_test-vc6-stlport-mt-gd-1_35\*.pch - -./vc6-stlport/link_test-vc6-stlport-mt-gd-1_35.lib : vc6-stlport/link_test-vc6-stlport-mt-gd-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc6-stlport/link_test-vc6-stlport-mt-gd-1_35.pdb" /debug /machine:I386 /out:"vc6-stlport/link_test-vc6-stlport-mt-gd-1_35.dll" /implib:"vc6-stlport/link_test-vc6-stlport-mt-gd-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc6-stlport/link_test-vc6-stlport-mt-gd-1_35/link_test.obj - -./vc6-stlport/link_test-vc6-stlport-mt-gd-1_35.exe : main.cpp ./vc6-stlport/link_test-vc6-stlport-mt-gd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6-stlport/link_test-vc6-stlport-mt-gd-1_35.exe main.cpp /link /LIBPATH:./vc6-stlport - vc6-stlport\link_test-vc6-stlport-mt-gd-1_35.exe - -######################################################## -# -# section for link_test-vc6-stlport-mt-1_35.lib -# -######################################################## -vc6-stlport/link_test-vc6-stlport-mt-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /I$(STLPORT_PATH)\stlport /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL $(CXXFLAGS) -Y- -Fo./vc6-stlport/link_test-vc6-stlport-mt-1_35/ -Fdvc6-stlport/link_test-vc6-stlport-mt-1_35.pdb link_test.cpp - -link_test-vc6-stlport-mt-1_35_dir : - @if not exist "vc6-stlport\link_test-vc6-stlport-mt-1_35\$(NULL)" mkdir vc6-stlport\link_test-vc6-stlport-mt-1_35 - -link_test-vc6-stlport-mt-1_35_clean : - del vc6-stlport\link_test-vc6-stlport-mt-1_35\*.obj - del vc6-stlport\link_test-vc6-stlport-mt-1_35\*.idb - del vc6-stlport\link_test-vc6-stlport-mt-1_35\*.exp - del vc6-stlport\link_test-vc6-stlport-mt-1_35\*.pch - -./vc6-stlport/link_test-vc6-stlport-mt-1_35.lib : vc6-stlport/link_test-vc6-stlport-mt-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc6-stlport/link_test-vc6-stlport-mt-1_35.pdb" /debug /machine:I386 /out:"vc6-stlport/link_test-vc6-stlport-mt-1_35.dll" /implib:"vc6-stlport/link_test-vc6-stlport-mt-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc6-stlport/link_test-vc6-stlport-mt-1_35/link_test.obj - -./vc6-stlport/link_test-vc6-stlport-mt-1_35.exe : main.cpp ./vc6-stlport/link_test-vc6-stlport-mt-1_35.lib - cl $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /I$(STLPORT_PATH)\stlport /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6-stlport/link_test-vc6-stlport-mt-1_35.exe main.cpp /link /LIBPATH:./vc6-stlport - vc6-stlport\link_test-vc6-stlport-mt-1_35.exe - -######################################################## -# -# section for liblink_test-vc6-stlport-mt-1_35.lib -# -######################################################## -vc6-stlport/liblink_test-vc6-stlport-mt-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL $(CXXFLAGS) -Y- -Fo./vc6-stlport/liblink_test-vc6-stlport-mt-1_35/ -Fdvc6-stlport/liblink_test-vc6-stlport-mt-1_35.pdb link_test.cpp - -liblink_test-vc6-stlport-mt-1_35_dir : - @if not exist "vc6-stlport\liblink_test-vc6-stlport-mt-1_35\$(NULL)" mkdir vc6-stlport\liblink_test-vc6-stlport-mt-1_35 - -liblink_test-vc6-stlport-mt-1_35_clean : - del vc6-stlport\liblink_test-vc6-stlport-mt-1_35\*.obj - del vc6-stlport\liblink_test-vc6-stlport-mt-1_35\*.idb - del vc6-stlport\liblink_test-vc6-stlport-mt-1_35\*.exp - del vc6-stlport\liblink_test-vc6-stlport-mt-1_35\*.pch - -./vc6-stlport/liblink_test-vc6-stlport-mt-1_35.lib : vc6-stlport/liblink_test-vc6-stlport-mt-1_35/link_test.obj - link -lib /nologo /out:vc6-stlport/liblink_test-vc6-stlport-mt-1_35.lib $(XSFLAGS) vc6-stlport/liblink_test-vc6-stlport-mt-1_35/link_test.obj - -./vc6-stlport/liblink_test-vc6-stlport-mt-1_35.exe : main.cpp ./vc6-stlport/liblink_test-vc6-stlport-mt-1_35.lib - cl $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6-stlport/liblink_test-vc6-stlport-mt-1_35.exe main.cpp /link /LIBPATH:./vc6-stlport - vc6-stlport\liblink_test-vc6-stlport-mt-1_35.exe - -######################################################## -# -# section for liblink_test-vc6-stlport-mt-gd-1_35.lib -# -######################################################## -vc6-stlport/liblink_test-vc6-stlport-mt-gd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX $(CXXFLAGS) -Y- -Fo./vc6-stlport/liblink_test-vc6-stlport-mt-gd-1_35/ -Fdvc6-stlport/liblink_test-vc6-stlport-mt-gd-1_35.pdb link_test.cpp - -liblink_test-vc6-stlport-mt-gd-1_35_dir : - @if not exist "vc6-stlport\liblink_test-vc6-stlport-mt-gd-1_35\$(NULL)" mkdir vc6-stlport\liblink_test-vc6-stlport-mt-gd-1_35 - -liblink_test-vc6-stlport-mt-gd-1_35_clean : - del vc6-stlport\liblink_test-vc6-stlport-mt-gd-1_35\*.obj - del vc6-stlport\liblink_test-vc6-stlport-mt-gd-1_35\*.idb - del vc6-stlport\liblink_test-vc6-stlport-mt-gd-1_35\*.exp - del vc6-stlport\liblink_test-vc6-stlport-mt-gd-1_35\*.pch - -./vc6-stlport/liblink_test-vc6-stlport-mt-gd-1_35.lib : vc6-stlport/liblink_test-vc6-stlport-mt-gd-1_35/link_test.obj - link -lib /nologo /out:vc6-stlport/liblink_test-vc6-stlport-mt-gd-1_35.lib $(XSFLAGS) vc6-stlport/liblink_test-vc6-stlport-mt-gd-1_35/link_test.obj - -./vc6-stlport/liblink_test-vc6-stlport-mt-gd-1_35.exe : main.cpp ./vc6-stlport/liblink_test-vc6-stlport-mt-gd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6-stlport/liblink_test-vc6-stlport-mt-gd-1_35.exe main.cpp /link /LIBPATH:./vc6-stlport - vc6-stlport\liblink_test-vc6-stlport-mt-gd-1_35.exe - -######################################################## -# -# section for link_test-vc6-stlport-mt-pgd-1_35.lib -# -######################################################## -vc6-stlport/link_test-vc6-stlport-mt-pgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX $(CXXFLAGS) -Y- -Fo./vc6-stlport/link_test-vc6-stlport-mt-pgd-1_35/ -Fdvc6-stlport/link_test-vc6-stlport-mt-pgd-1_35.pdb link_test.cpp - -link_test-vc6-stlport-mt-pgd-1_35_dir : - @if not exist "vc6-stlport\link_test-vc6-stlport-mt-pgd-1_35\$(NULL)" mkdir vc6-stlport\link_test-vc6-stlport-mt-pgd-1_35 - -link_test-vc6-stlport-mt-pgd-1_35_clean : - del vc6-stlport\link_test-vc6-stlport-mt-pgd-1_35\*.obj - del vc6-stlport\link_test-vc6-stlport-mt-pgd-1_35\*.idb - del vc6-stlport\link_test-vc6-stlport-mt-pgd-1_35\*.exp - del vc6-stlport\link_test-vc6-stlport-mt-pgd-1_35\*.pch - -./vc6-stlport/link_test-vc6-stlport-mt-pgd-1_35.lib : vc6-stlport/link_test-vc6-stlport-mt-pgd-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc6-stlport/link_test-vc6-stlport-mt-pgd-1_35.pdb" /debug /machine:I386 /out:"vc6-stlport/link_test-vc6-stlport-mt-pgd-1_35.dll" /implib:"vc6-stlport/link_test-vc6-stlport-mt-pgd-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc6-stlport/link_test-vc6-stlport-mt-pgd-1_35/link_test.obj - -./vc6-stlport/link_test-vc6-stlport-mt-pgd-1_35.exe : main.cpp ./vc6-stlport/link_test-vc6-stlport-mt-pgd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6-stlport/link_test-vc6-stlport-mt-pgd-1_35.exe main.cpp /link /LIBPATH:./vc6-stlport - vc6-stlport\link_test-vc6-stlport-mt-pgd-1_35.exe - -######################################################## -# -# section for liblink_test-vc6-stlport-mt-spgd-1_35.lib -# -######################################################## -vc6-stlport/liblink_test-vc6-stlport-mt-spgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D__STL_DEBUG /D_STLP_DEBUG /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /GX $(CXXFLAGS) -Y- -Fo./vc6-stlport/liblink_test-vc6-stlport-mt-spgd-1_35/ -Fdvc6-stlport/liblink_test-vc6-stlport-mt-spgd-1_35.pdb link_test.cpp - -liblink_test-vc6-stlport-mt-spgd-1_35_dir : - @if not exist "vc6-stlport\liblink_test-vc6-stlport-mt-spgd-1_35\$(NULL)" mkdir vc6-stlport\liblink_test-vc6-stlport-mt-spgd-1_35 - -liblink_test-vc6-stlport-mt-spgd-1_35_clean : - del vc6-stlport\liblink_test-vc6-stlport-mt-spgd-1_35\*.obj - del vc6-stlport\liblink_test-vc6-stlport-mt-spgd-1_35\*.idb - del vc6-stlport\liblink_test-vc6-stlport-mt-spgd-1_35\*.exp - del vc6-stlport\liblink_test-vc6-stlport-mt-spgd-1_35\*.pch - -./vc6-stlport/liblink_test-vc6-stlport-mt-spgd-1_35.lib : vc6-stlport/liblink_test-vc6-stlport-mt-spgd-1_35/link_test.obj - link -lib /nologo /out:vc6-stlport/liblink_test-vc6-stlport-mt-spgd-1_35.lib $(XSFLAGS) vc6-stlport/liblink_test-vc6-stlport-mt-spgd-1_35/link_test.obj - -./vc6-stlport/liblink_test-vc6-stlport-mt-spgd-1_35.exe : main.cpp ./vc6-stlport/liblink_test-vc6-stlport-mt-spgd-1_35.lib - cl $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D__STL_DEBUG /D_STLP_DEBUG /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /GX /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6-stlport/liblink_test-vc6-stlport-mt-spgd-1_35.exe main.cpp /link /LIBPATH:./vc6-stlport - vc6-stlport\liblink_test-vc6-stlport-mt-spgd-1_35.exe - -######################################################## -# -# section for liblink_test-vc6-stlport-mt-pgd-1_35.lib -# -######################################################## -vc6-stlport/liblink_test-vc6-stlport-mt-pgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX $(CXXFLAGS) -Y- -Fo./vc6-stlport/liblink_test-vc6-stlport-mt-pgd-1_35/ -Fdvc6-stlport/liblink_test-vc6-stlport-mt-pgd-1_35.pdb link_test.cpp - -liblink_test-vc6-stlport-mt-pgd-1_35_dir : - @if not exist "vc6-stlport\liblink_test-vc6-stlport-mt-pgd-1_35\$(NULL)" mkdir vc6-stlport\liblink_test-vc6-stlport-mt-pgd-1_35 - -liblink_test-vc6-stlport-mt-pgd-1_35_clean : - del vc6-stlport\liblink_test-vc6-stlport-mt-pgd-1_35\*.obj - del vc6-stlport\liblink_test-vc6-stlport-mt-pgd-1_35\*.idb - del vc6-stlport\liblink_test-vc6-stlport-mt-pgd-1_35\*.exp - del vc6-stlport\liblink_test-vc6-stlport-mt-pgd-1_35\*.pch - -./vc6-stlport/liblink_test-vc6-stlport-mt-pgd-1_35.lib : vc6-stlport/liblink_test-vc6-stlport-mt-pgd-1_35/link_test.obj - link -lib /nologo /out:vc6-stlport/liblink_test-vc6-stlport-mt-pgd-1_35.lib $(XSFLAGS) vc6-stlport/liblink_test-vc6-stlport-mt-pgd-1_35/link_test.obj - -./vc6-stlport/liblink_test-vc6-stlport-mt-pgd-1_35.exe : main.cpp ./vc6-stlport/liblink_test-vc6-stlport-mt-pgd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6-stlport/liblink_test-vc6-stlport-mt-pgd-1_35.exe main.cpp /link /LIBPATH:./vc6-stlport - vc6-stlport\liblink_test-vc6-stlport-mt-pgd-1_35.exe - diff --git a/libs/config/test/link/vc6.mak b/libs/config/test/link/vc6.mak deleted file mode 100644 index b5a7798f2..000000000 --- a/libs/config/test/link/vc6.mak +++ /dev/null @@ -1,260 +0,0 @@ -# copyright 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) -# -# auto generated makefile for VC6 compiler -# -# usage: -# make -# brings libraries up to date -# make install -# brings libraries up to date and copies binaries to your VC6 /lib and /bin directories (recomended) -# - -# -# Add additional compiler options here: -# -CXXFLAGS= -# -# Add additional include directories here: -# -INCLUDES= -# -# add additional linker flags here: -# -XLFLAGS= -# -# add additional static-library creation flags here: -# -XSFLAGS= - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -!IF "$(MSVCDIR)" == "" -!ERROR Variable MSVCDIR not set. -!ENDIF - - -ALL_HEADER= - -all : main_dir liblink_test-vc6-s-1_35_dir ./vc6/liblink_test-vc6-s-1_35.lib ./vc6/liblink_test-vc6-s-1_35.exe liblink_test-vc6-mt-s-1_35_dir ./vc6/liblink_test-vc6-mt-s-1_35.lib ./vc6/liblink_test-vc6-mt-s-1_35.exe liblink_test-vc6-sgd-1_35_dir ./vc6/liblink_test-vc6-sgd-1_35.lib ./vc6/liblink_test-vc6-sgd-1_35.exe liblink_test-vc6-mt-sgd-1_35_dir ./vc6/liblink_test-vc6-mt-sgd-1_35.lib ./vc6/liblink_test-vc6-mt-sgd-1_35.exe link_test-vc6-mt-gd-1_35_dir ./vc6/link_test-vc6-mt-gd-1_35.lib ./vc6/link_test-vc6-mt-gd-1_35.exe link_test-vc6-mt-1_35_dir ./vc6/link_test-vc6-mt-1_35.lib ./vc6/link_test-vc6-mt-1_35.exe liblink_test-vc6-mt-1_35_dir ./vc6/liblink_test-vc6-mt-1_35.lib ./vc6/liblink_test-vc6-mt-1_35.exe liblink_test-vc6-mt-gd-1_35_dir ./vc6/liblink_test-vc6-mt-gd-1_35.lib ./vc6/liblink_test-vc6-mt-gd-1_35.exe - -clean : liblink_test-vc6-s-1_35_clean liblink_test-vc6-mt-s-1_35_clean liblink_test-vc6-sgd-1_35_clean liblink_test-vc6-mt-sgd-1_35_clean link_test-vc6-mt-gd-1_35_clean link_test-vc6-mt-1_35_clean liblink_test-vc6-mt-1_35_clean liblink_test-vc6-mt-gd-1_35_clean - -install : all - copy vc6\liblink_test-vc6-s-1_35.lib "$(MSVCDIR)\lib" - copy vc6\liblink_test-vc6-mt-s-1_35.lib "$(MSVCDIR)\lib" - copy vc6\liblink_test-vc6-sgd-1_35.lib "$(MSVCDIR)\lib" - copy vc6\liblink_test-vc6-sgd-1_35.pdb "$(MSVCDIR)\lib" - copy vc6\liblink_test-vc6-mt-sgd-1_35.lib "$(MSVCDIR)\lib" - copy vc6\liblink_test-vc6-mt-sgd-1_35.pdb "$(MSVCDIR)\lib" - copy vc6\link_test-vc6-mt-gd-1_35.lib "$(MSVCDIR)\lib" - copy vc6\link_test-vc6-mt-gd-1_35.dll "$(MSVCDIR)\bin" - copy vc6\link_test-vc6-mt-gd-1_35.pdb "$(MSVCDIR)\lib" - copy vc6\link_test-vc6-mt-1_35.lib "$(MSVCDIR)\lib" - copy vc6\link_test-vc6-mt-1_35.dll "$(MSVCDIR)\bin" - copy vc6\liblink_test-vc6-mt-1_35.lib "$(MSVCDIR)\lib" - copy vc6\liblink_test-vc6-mt-gd-1_35.lib "$(MSVCDIR)\lib" - copy vc6\liblink_test-vc6-mt-gd-1_35.pdb "$(MSVCDIR)\lib" - -main_dir : - @if not exist "vc6\$(NULL)" mkdir vc6 - - -######################################################## -# -# section for liblink_test-vc6-s-1_35.lib -# -######################################################## -vc6/liblink_test-vc6-s-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /ML /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD $(CXXFLAGS) -Y- -Fo./vc6/liblink_test-vc6-s-1_35/ -Fdvc6/liblink_test-vc6-s-1_35.pdb link_test.cpp - -liblink_test-vc6-s-1_35_dir : - @if not exist "vc6\liblink_test-vc6-s-1_35\$(NULL)" mkdir vc6\liblink_test-vc6-s-1_35 - -liblink_test-vc6-s-1_35_clean : - del vc6\liblink_test-vc6-s-1_35\*.obj - del vc6\liblink_test-vc6-s-1_35\*.idb - del vc6\liblink_test-vc6-s-1_35\*.exp - del vc6\liblink_test-vc6-s-1_35\*.pch - -./vc6/liblink_test-vc6-s-1_35.lib : vc6/liblink_test-vc6-s-1_35/link_test.obj - link -lib /nologo /out:vc6/liblink_test-vc6-s-1_35.lib $(XSFLAGS) vc6/liblink_test-vc6-s-1_35/link_test.obj - -./vc6/liblink_test-vc6-s-1_35.exe : main.cpp ./vc6/liblink_test-vc6-s-1_35.lib - cl $(INCLUDES) /nologo /ML /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6/liblink_test-vc6-s-1_35.exe main.cpp /link /LIBPATH:./vc6 - vc6\liblink_test-vc6-s-1_35.exe - -######################################################## -# -# section for liblink_test-vc6-mt-s-1_35.lib -# -######################################################## -vc6/liblink_test-vc6-mt-s-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MT /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD $(CXXFLAGS) -Y- -Fo./vc6/liblink_test-vc6-mt-s-1_35/ -Fdvc6/liblink_test-vc6-mt-s-1_35.pdb link_test.cpp - -liblink_test-vc6-mt-s-1_35_dir : - @if not exist "vc6\liblink_test-vc6-mt-s-1_35\$(NULL)" mkdir vc6\liblink_test-vc6-mt-s-1_35 - -liblink_test-vc6-mt-s-1_35_clean : - del vc6\liblink_test-vc6-mt-s-1_35\*.obj - del vc6\liblink_test-vc6-mt-s-1_35\*.idb - del vc6\liblink_test-vc6-mt-s-1_35\*.exp - del vc6\liblink_test-vc6-mt-s-1_35\*.pch - -./vc6/liblink_test-vc6-mt-s-1_35.lib : vc6/liblink_test-vc6-mt-s-1_35/link_test.obj - link -lib /nologo /out:vc6/liblink_test-vc6-mt-s-1_35.lib $(XSFLAGS) vc6/liblink_test-vc6-mt-s-1_35/link_test.obj - -./vc6/liblink_test-vc6-mt-s-1_35.exe : main.cpp ./vc6/liblink_test-vc6-mt-s-1_35.lib - cl $(INCLUDES) /nologo /MT /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6/liblink_test-vc6-mt-s-1_35.exe main.cpp /link /LIBPATH:./vc6 - vc6\liblink_test-vc6-mt-s-1_35.exe - -######################################################## -# -# section for liblink_test-vc6-sgd-1_35.lib -# -######################################################## -vc6/liblink_test-vc6-sgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MLd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_DEBUG /D_MBCS /D_LIB /FD /GX $(CXXFLAGS) -Y- -Fo./vc6/liblink_test-vc6-sgd-1_35/ -Fdvc6/liblink_test-vc6-sgd-1_35.pdb link_test.cpp - -liblink_test-vc6-sgd-1_35_dir : - @if not exist "vc6\liblink_test-vc6-sgd-1_35\$(NULL)" mkdir vc6\liblink_test-vc6-sgd-1_35 - -liblink_test-vc6-sgd-1_35_clean : - del vc6\liblink_test-vc6-sgd-1_35\*.obj - del vc6\liblink_test-vc6-sgd-1_35\*.idb - del vc6\liblink_test-vc6-sgd-1_35\*.exp - del vc6\liblink_test-vc6-sgd-1_35\*.pch - -./vc6/liblink_test-vc6-sgd-1_35.lib : vc6/liblink_test-vc6-sgd-1_35/link_test.obj - link -lib /nologo /out:vc6/liblink_test-vc6-sgd-1_35.lib $(XSFLAGS) vc6/liblink_test-vc6-sgd-1_35/link_test.obj - -./vc6/liblink_test-vc6-sgd-1_35.exe : main.cpp ./vc6/liblink_test-vc6-sgd-1_35.lib - cl $(INCLUDES) /nologo /MLd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_DEBUG /D_MBCS /D_LIB /FD /GX /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6/liblink_test-vc6-sgd-1_35.exe main.cpp /link /LIBPATH:./vc6 - vc6\liblink_test-vc6-sgd-1_35.exe - -######################################################## -# -# section for liblink_test-vc6-mt-sgd-1_35.lib -# -######################################################## -vc6/liblink_test-vc6-mt-sgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /FD /GX $(CXXFLAGS) -Y- -Fo./vc6/liblink_test-vc6-mt-sgd-1_35/ -Fdvc6/liblink_test-vc6-mt-sgd-1_35.pdb link_test.cpp - -liblink_test-vc6-mt-sgd-1_35_dir : - @if not exist "vc6\liblink_test-vc6-mt-sgd-1_35\$(NULL)" mkdir vc6\liblink_test-vc6-mt-sgd-1_35 - -liblink_test-vc6-mt-sgd-1_35_clean : - del vc6\liblink_test-vc6-mt-sgd-1_35\*.obj - del vc6\liblink_test-vc6-mt-sgd-1_35\*.idb - del vc6\liblink_test-vc6-mt-sgd-1_35\*.exp - del vc6\liblink_test-vc6-mt-sgd-1_35\*.pch - -./vc6/liblink_test-vc6-mt-sgd-1_35.lib : vc6/liblink_test-vc6-mt-sgd-1_35/link_test.obj - link -lib /nologo /out:vc6/liblink_test-vc6-mt-sgd-1_35.lib $(XSFLAGS) vc6/liblink_test-vc6-mt-sgd-1_35/link_test.obj - -./vc6/liblink_test-vc6-mt-sgd-1_35.exe : main.cpp ./vc6/liblink_test-vc6-mt-sgd-1_35.lib - cl $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /FD /GX /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6/liblink_test-vc6-mt-sgd-1_35.exe main.cpp /link /LIBPATH:./vc6 - vc6\liblink_test-vc6-mt-sgd-1_35.exe - -######################################################## -# -# section for link_test-vc6-mt-gd-1_35.lib -# -######################################################## -vc6/link_test-vc6-mt-gd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /D_DEBUG /DBOOST_DYN_LINK /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD /GX $(CXXFLAGS) -Y- -Fo./vc6/link_test-vc6-mt-gd-1_35/ -Fdvc6/link_test-vc6-mt-gd-1_35.pdb link_test.cpp - -link_test-vc6-mt-gd-1_35_dir : - @if not exist "vc6\link_test-vc6-mt-gd-1_35\$(NULL)" mkdir vc6\link_test-vc6-mt-gd-1_35 - -link_test-vc6-mt-gd-1_35_clean : - del vc6\link_test-vc6-mt-gd-1_35\*.obj - del vc6\link_test-vc6-mt-gd-1_35\*.idb - del vc6\link_test-vc6-mt-gd-1_35\*.exp - del vc6\link_test-vc6-mt-gd-1_35\*.pch - -./vc6/link_test-vc6-mt-gd-1_35.lib : vc6/link_test-vc6-mt-gd-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc6/link_test-vc6-mt-gd-1_35.pdb" /debug /machine:I386 /out:"vc6/link_test-vc6-mt-gd-1_35.dll" /implib:"vc6/link_test-vc6-mt-gd-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc6/link_test-vc6-mt-gd-1_35/link_test.obj - -./vc6/link_test-vc6-mt-gd-1_35.exe : main.cpp ./vc6/link_test-vc6-mt-gd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /D_DEBUG /DBOOST_DYN_LINK /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD /GX /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6/link_test-vc6-mt-gd-1_35.exe main.cpp /link /LIBPATH:./vc6 - vc6\link_test-vc6-mt-gd-1_35.exe - -######################################################## -# -# section for link_test-vc6-mt-1_35.lib -# -######################################################## -vc6/link_test-vc6-mt-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD $(CXXFLAGS) -Y- -Fo./vc6/link_test-vc6-mt-1_35/ -Fdvc6/link_test-vc6-mt-1_35.pdb link_test.cpp - -link_test-vc6-mt-1_35_dir : - @if not exist "vc6\link_test-vc6-mt-1_35\$(NULL)" mkdir vc6\link_test-vc6-mt-1_35 - -link_test-vc6-mt-1_35_clean : - del vc6\link_test-vc6-mt-1_35\*.obj - del vc6\link_test-vc6-mt-1_35\*.idb - del vc6\link_test-vc6-mt-1_35\*.exp - del vc6\link_test-vc6-mt-1_35\*.pch - -./vc6/link_test-vc6-mt-1_35.lib : vc6/link_test-vc6-mt-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc6/link_test-vc6-mt-1_35.pdb" /debug /machine:I386 /out:"vc6/link_test-vc6-mt-1_35.dll" /implib:"vc6/link_test-vc6-mt-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc6/link_test-vc6-mt-1_35/link_test.obj - -./vc6/link_test-vc6-mt-1_35.exe : main.cpp ./vc6/link_test-vc6-mt-1_35.lib - cl $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6/link_test-vc6-mt-1_35.exe main.cpp /link /LIBPATH:./vc6 - vc6\link_test-vc6-mt-1_35.exe - -######################################################## -# -# section for liblink_test-vc6-mt-1_35.lib -# -######################################################## -vc6/liblink_test-vc6-mt-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD $(CXXFLAGS) -Y- -Fo./vc6/liblink_test-vc6-mt-1_35/ -Fdvc6/liblink_test-vc6-mt-1_35.pdb link_test.cpp - -liblink_test-vc6-mt-1_35_dir : - @if not exist "vc6\liblink_test-vc6-mt-1_35\$(NULL)" mkdir vc6\liblink_test-vc6-mt-1_35 - -liblink_test-vc6-mt-1_35_clean : - del vc6\liblink_test-vc6-mt-1_35\*.obj - del vc6\liblink_test-vc6-mt-1_35\*.idb - del vc6\liblink_test-vc6-mt-1_35\*.exp - del vc6\liblink_test-vc6-mt-1_35\*.pch - -./vc6/liblink_test-vc6-mt-1_35.lib : vc6/liblink_test-vc6-mt-1_35/link_test.obj - link -lib /nologo /out:vc6/liblink_test-vc6-mt-1_35.lib $(XSFLAGS) vc6/liblink_test-vc6-mt-1_35/link_test.obj - -./vc6/liblink_test-vc6-mt-1_35.exe : main.cpp ./vc6/liblink_test-vc6-mt-1_35.lib - cl $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6/liblink_test-vc6-mt-1_35.exe main.cpp /link /LIBPATH:./vc6 - vc6\liblink_test-vc6-mt-1_35.exe - -######################################################## -# -# section for liblink_test-vc6-mt-gd-1_35.lib -# -######################################################## -vc6/liblink_test-vc6-mt-gd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD /GX $(CXXFLAGS) -Y- -Fo./vc6/liblink_test-vc6-mt-gd-1_35/ -Fdvc6/liblink_test-vc6-mt-gd-1_35.pdb link_test.cpp - -liblink_test-vc6-mt-gd-1_35_dir : - @if not exist "vc6\liblink_test-vc6-mt-gd-1_35\$(NULL)" mkdir vc6\liblink_test-vc6-mt-gd-1_35 - -liblink_test-vc6-mt-gd-1_35_clean : - del vc6\liblink_test-vc6-mt-gd-1_35\*.obj - del vc6\liblink_test-vc6-mt-gd-1_35\*.idb - del vc6\liblink_test-vc6-mt-gd-1_35\*.exp - del vc6\liblink_test-vc6-mt-gd-1_35\*.pch - -./vc6/liblink_test-vc6-mt-gd-1_35.lib : vc6/liblink_test-vc6-mt-gd-1_35/link_test.obj - link -lib /nologo /out:vc6/liblink_test-vc6-mt-gd-1_35.lib $(XSFLAGS) vc6/liblink_test-vc6-mt-gd-1_35/link_test.obj - -./vc6/liblink_test-vc6-mt-gd-1_35.exe : main.cpp ./vc6/liblink_test-vc6-mt-gd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD /GX /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc6/liblink_test-vc6-mt-gd-1_35.exe main.cpp /link /LIBPATH:./vc6 - vc6\liblink_test-vc6-mt-gd-1_35.exe - diff --git a/libs/config/test/link/vc7-stlport.mak b/libs/config/test/link/vc7-stlport.mak deleted file mode 100644 index 5e500f197..000000000 --- a/libs/config/test/link/vc7-stlport.mak +++ /dev/null @@ -1,292 +0,0 @@ -# copyright 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) -# -# auto generated makefile for VC6+STLPort -# -# usage: -# make -# brings libraries up to date -# make install -# brings libraries up to date and copies binaries to your VC6 /lib and /bin directories (recomended) -# - -# -# Add additional compiler options here: -# -CXXFLAGS= -# -# Add additional include directories here: -# -INCLUDES= -# -# add additional linker flags here: -# -XLFLAGS= -# -# add additional static-library creation flags here: -# -XSFLAGS= - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -!IF "$(MSVCDIR)" == "" -!ERROR Variable MSVCDIR not set. -!ENDIF - -!IF "$(STLPORT_PATH)" == "" -!ERROR Variable STLPORT_PATH not set. -!ENDIF - - -ALL_HEADER= - -all : main_dir liblink_test-vc7-stlport-mt-s-1_35_dir ./vc7-stlport/liblink_test-vc7-stlport-mt-s-1_35.lib ./vc7-stlport/liblink_test-vc7-stlport-mt-s-1_35.exe liblink_test-vc7-stlport-mt-sgd-1_35_dir ./vc7-stlport/liblink_test-vc7-stlport-mt-sgd-1_35.lib ./vc7-stlport/liblink_test-vc7-stlport-mt-sgd-1_35.exe link_test-vc7-stlport-mt-gd-1_35_dir ./vc7-stlport/link_test-vc7-stlport-mt-gd-1_35.lib ./vc7-stlport/link_test-vc7-stlport-mt-gd-1_35.exe link_test-vc7-stlport-mt-1_35_dir ./vc7-stlport/link_test-vc7-stlport-mt-1_35.lib ./vc7-stlport/link_test-vc7-stlport-mt-1_35.exe liblink_test-vc7-stlport-mt-1_35_dir ./vc7-stlport/liblink_test-vc7-stlport-mt-1_35.lib ./vc7-stlport/liblink_test-vc7-stlport-mt-1_35.exe liblink_test-vc7-stlport-mt-gd-1_35_dir ./vc7-stlport/liblink_test-vc7-stlport-mt-gd-1_35.lib ./vc7-stlport/liblink_test-vc7-stlport-mt-gd-1_35.exe link_test-vc7-stlport-mt-pgd-1_35_dir ./vc7-stlport/link_test-vc7-stlport-mt-pgd-1_35.lib ./vc7-stlport/link_test-vc7-stlport-mt-pgd-1_35.exe liblink_test-vc7-stlport-mt-spgd-1_35_dir ./vc7-stlport/liblink_test-vc7-stlport-mt-spgd-1_35.lib ./vc7-stlport/liblink_test-vc7-stlport-mt-spgd-1_35.exe liblink_test-vc7-stlport-mt-pgd-1_35_dir ./vc7-stlport/liblink_test-vc7-stlport-mt-pgd-1_35.lib ./vc7-stlport/liblink_test-vc7-stlport-mt-pgd-1_35.exe - -clean : liblink_test-vc7-stlport-mt-s-1_35_clean liblink_test-vc7-stlport-mt-sgd-1_35_clean link_test-vc7-stlport-mt-gd-1_35_clean link_test-vc7-stlport-mt-1_35_clean liblink_test-vc7-stlport-mt-1_35_clean liblink_test-vc7-stlport-mt-gd-1_35_clean link_test-vc7-stlport-mt-pgd-1_35_clean liblink_test-vc7-stlport-mt-spgd-1_35_clean liblink_test-vc7-stlport-mt-pgd-1_35_clean - -install : stlport_check all - copy vc7-stlport\liblink_test-vc7-stlport-mt-s-1_35.lib "$(MSVCDIR)\lib" - copy vc7-stlport\liblink_test-vc7-stlport-mt-sgd-1_35.lib "$(MSVCDIR)\lib" - copy vc7-stlport\link_test-vc7-stlport-mt-gd-1_35.lib "$(MSVCDIR)\lib" - copy vc7-stlport\link_test-vc7-stlport-mt-gd-1_35.dll "$(MSVCDIR)\bin" - copy vc7-stlport\link_test-vc7-stlport-mt-1_35.lib "$(MSVCDIR)\lib" - copy vc7-stlport\link_test-vc7-stlport-mt-1_35.dll "$(MSVCDIR)\bin" - copy vc7-stlport\liblink_test-vc7-stlport-mt-1_35.lib "$(MSVCDIR)\lib" - copy vc7-stlport\liblink_test-vc7-stlport-mt-gd-1_35.lib "$(MSVCDIR)\lib" - copy vc7-stlport\link_test-vc7-stlport-mt-pgd-1_35.lib "$(MSVCDIR)\lib" - copy vc7-stlport\link_test-vc7-stlport-mt-pgd-1_35.dll "$(MSVCDIR)\bin" - copy vc7-stlport\link_test-vc7-stlport-mt-pgd-1_35.pdb "$(MSVCDIR)\lib" - copy vc7-stlport\liblink_test-vc7-stlport-mt-spgd-1_35.lib "$(MSVCDIR)\lib" - copy vc7-stlport\liblink_test-vc7-stlport-mt-spgd-1_35.pdb "$(MSVCDIR)\lib" - copy vc7-stlport\liblink_test-vc7-stlport-mt-pgd-1_35.lib "$(MSVCDIR)\lib" - copy vc7-stlport\liblink_test-vc7-stlport-mt-pgd-1_35.pdb "$(MSVCDIR)\lib" - -main_dir : - @if not exist "vc7-stlport\$(NULL)" mkdir vc7-stlport - -stlport_check : $(STLPORT_PATH)\stlport\string - echo - - -######################################################## -# -# section for liblink_test-vc7-stlport-mt-s-1_35.lib -# -######################################################## -vc7-stlport/liblink_test-vc7-stlport-mt-s-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MT /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB $(CXXFLAGS) -Y- -Fo./vc7-stlport/liblink_test-vc7-stlport-mt-s-1_35/ -Fdvc7-stlport/liblink_test-vc7-stlport-mt-s-1_35.pdb link_test.cpp - -liblink_test-vc7-stlport-mt-s-1_35_dir : - @if not exist "vc7-stlport\liblink_test-vc7-stlport-mt-s-1_35\$(NULL)" mkdir vc7-stlport\liblink_test-vc7-stlport-mt-s-1_35 - -liblink_test-vc7-stlport-mt-s-1_35_clean : - del vc7-stlport\liblink_test-vc7-stlport-mt-s-1_35\*.obj - del vc7-stlport\liblink_test-vc7-stlport-mt-s-1_35\*.idb - del vc7-stlport\liblink_test-vc7-stlport-mt-s-1_35\*.exp - del vc7-stlport\liblink_test-vc7-stlport-mt-s-1_35\*.pch - -./vc7-stlport/liblink_test-vc7-stlport-mt-s-1_35.lib : vc7-stlport/liblink_test-vc7-stlport-mt-s-1_35/link_test.obj - link -lib /nologo /out:vc7-stlport/liblink_test-vc7-stlport-mt-s-1_35.lib $(XSFLAGS) vc7-stlport/liblink_test-vc7-stlport-mt-s-1_35/link_test.obj - -./vc7-stlport/liblink_test-vc7-stlport-mt-s-1_35.exe : main.cpp ./vc7-stlport/liblink_test-vc7-stlport-mt-s-1_35.lib - cl $(INCLUDES) /nologo /MT /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7-stlport/liblink_test-vc7-stlport-mt-s-1_35.exe main.cpp /link /LIBPATH:./vc7-stlport - vc7-stlport\liblink_test-vc7-stlport-mt-s-1_35.exe - -######################################################## -# -# section for liblink_test-vc7-stlport-mt-sgd-1_35.lib -# -######################################################## -vc7-stlport/liblink_test-vc7-stlport-mt-sgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc7-stlport/liblink_test-vc7-stlport-mt-sgd-1_35/ -Fdvc7-stlport/liblink_test-vc7-stlport-mt-sgd-1_35.pdb link_test.cpp - -liblink_test-vc7-stlport-mt-sgd-1_35_dir : - @if not exist "vc7-stlport\liblink_test-vc7-stlport-mt-sgd-1_35\$(NULL)" mkdir vc7-stlport\liblink_test-vc7-stlport-mt-sgd-1_35 - -liblink_test-vc7-stlport-mt-sgd-1_35_clean : - del vc7-stlport\liblink_test-vc7-stlport-mt-sgd-1_35\*.obj - del vc7-stlport\liblink_test-vc7-stlport-mt-sgd-1_35\*.idb - del vc7-stlport\liblink_test-vc7-stlport-mt-sgd-1_35\*.exp - del vc7-stlport\liblink_test-vc7-stlport-mt-sgd-1_35\*.pch - -./vc7-stlport/liblink_test-vc7-stlport-mt-sgd-1_35.lib : vc7-stlport/liblink_test-vc7-stlport-mt-sgd-1_35/link_test.obj - link -lib /nologo /out:vc7-stlport/liblink_test-vc7-stlport-mt-sgd-1_35.lib $(XSFLAGS) vc7-stlport/liblink_test-vc7-stlport-mt-sgd-1_35/link_test.obj - -./vc7-stlport/liblink_test-vc7-stlport-mt-sgd-1_35.exe : main.cpp ./vc7-stlport/liblink_test-vc7-stlport-mt-sgd-1_35.lib - cl $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7-stlport/liblink_test-vc7-stlport-mt-sgd-1_35.exe main.cpp /link /LIBPATH:./vc7-stlport - vc7-stlport\liblink_test-vc7-stlport-mt-sgd-1_35.exe - -######################################################## -# -# section for link_test-vc7-stlport-mt-gd-1_35.lib -# -######################################################## -vc7-stlport/link_test-vc7-stlport-mt-gd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc7-stlport/link_test-vc7-stlport-mt-gd-1_35/ -Fdvc7-stlport/link_test-vc7-stlport-mt-gd-1_35.pdb link_test.cpp - -link_test-vc7-stlport-mt-gd-1_35_dir : - @if not exist "vc7-stlport\link_test-vc7-stlport-mt-gd-1_35\$(NULL)" mkdir vc7-stlport\link_test-vc7-stlport-mt-gd-1_35 - -link_test-vc7-stlport-mt-gd-1_35_clean : - del vc7-stlport\link_test-vc7-stlport-mt-gd-1_35\*.obj - del vc7-stlport\link_test-vc7-stlport-mt-gd-1_35\*.idb - del vc7-stlport\link_test-vc7-stlport-mt-gd-1_35\*.exp - del vc7-stlport\link_test-vc7-stlport-mt-gd-1_35\*.pch - -./vc7-stlport/link_test-vc7-stlport-mt-gd-1_35.lib : vc7-stlport/link_test-vc7-stlport-mt-gd-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc7-stlport/link_test-vc7-stlport-mt-gd-1_35.pdb" /debug /machine:I386 /out:"vc7-stlport/link_test-vc7-stlport-mt-gd-1_35.dll" /implib:"vc7-stlport/link_test-vc7-stlport-mt-gd-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc7-stlport/link_test-vc7-stlport-mt-gd-1_35/link_test.obj - -./vc7-stlport/link_test-vc7-stlport-mt-gd-1_35.exe : main.cpp ./vc7-stlport/link_test-vc7-stlport-mt-gd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7-stlport/link_test-vc7-stlport-mt-gd-1_35.exe main.cpp /link /LIBPATH:./vc7-stlport - vc7-stlport\link_test-vc7-stlport-mt-gd-1_35.exe - -######################################################## -# -# section for link_test-vc7-stlport-mt-1_35.lib -# -######################################################## -vc7-stlport/link_test-vc7-stlport-mt-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /I$(STLPORT_PATH)\stlport /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL $(CXXFLAGS) -Y- -Fo./vc7-stlport/link_test-vc7-stlport-mt-1_35/ -Fdvc7-stlport/link_test-vc7-stlport-mt-1_35.pdb link_test.cpp - -link_test-vc7-stlport-mt-1_35_dir : - @if not exist "vc7-stlport\link_test-vc7-stlport-mt-1_35\$(NULL)" mkdir vc7-stlport\link_test-vc7-stlport-mt-1_35 - -link_test-vc7-stlport-mt-1_35_clean : - del vc7-stlport\link_test-vc7-stlport-mt-1_35\*.obj - del vc7-stlport\link_test-vc7-stlport-mt-1_35\*.idb - del vc7-stlport\link_test-vc7-stlport-mt-1_35\*.exp - del vc7-stlport\link_test-vc7-stlport-mt-1_35\*.pch - -./vc7-stlport/link_test-vc7-stlport-mt-1_35.lib : vc7-stlport/link_test-vc7-stlport-mt-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc7-stlport/link_test-vc7-stlport-mt-1_35.pdb" /debug /machine:I386 /out:"vc7-stlport/link_test-vc7-stlport-mt-1_35.dll" /implib:"vc7-stlport/link_test-vc7-stlport-mt-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc7-stlport/link_test-vc7-stlport-mt-1_35/link_test.obj - -./vc7-stlport/link_test-vc7-stlport-mt-1_35.exe : main.cpp ./vc7-stlport/link_test-vc7-stlport-mt-1_35.lib - cl $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /I$(STLPORT_PATH)\stlport /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7-stlport/link_test-vc7-stlport-mt-1_35.exe main.cpp /link /LIBPATH:./vc7-stlport - vc7-stlport\link_test-vc7-stlport-mt-1_35.exe - -######################################################## -# -# section for liblink_test-vc7-stlport-mt-1_35.lib -# -######################################################## -vc7-stlport/liblink_test-vc7-stlport-mt-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL $(CXXFLAGS) -Y- -Fo./vc7-stlport/liblink_test-vc7-stlport-mt-1_35/ -Fdvc7-stlport/liblink_test-vc7-stlport-mt-1_35.pdb link_test.cpp - -liblink_test-vc7-stlport-mt-1_35_dir : - @if not exist "vc7-stlport\liblink_test-vc7-stlport-mt-1_35\$(NULL)" mkdir vc7-stlport\liblink_test-vc7-stlport-mt-1_35 - -liblink_test-vc7-stlport-mt-1_35_clean : - del vc7-stlport\liblink_test-vc7-stlport-mt-1_35\*.obj - del vc7-stlport\liblink_test-vc7-stlport-mt-1_35\*.idb - del vc7-stlport\liblink_test-vc7-stlport-mt-1_35\*.exp - del vc7-stlport\liblink_test-vc7-stlport-mt-1_35\*.pch - -./vc7-stlport/liblink_test-vc7-stlport-mt-1_35.lib : vc7-stlport/liblink_test-vc7-stlport-mt-1_35/link_test.obj - link -lib /nologo /out:vc7-stlport/liblink_test-vc7-stlport-mt-1_35.lib $(XSFLAGS) vc7-stlport/liblink_test-vc7-stlport-mt-1_35/link_test.obj - -./vc7-stlport/liblink_test-vc7-stlport-mt-1_35.exe : main.cpp ./vc7-stlport/liblink_test-vc7-stlport-mt-1_35.lib - cl $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7-stlport/liblink_test-vc7-stlport-mt-1_35.exe main.cpp /link /LIBPATH:./vc7-stlport - vc7-stlport\liblink_test-vc7-stlport-mt-1_35.exe - -######################################################## -# -# section for liblink_test-vc7-stlport-mt-gd-1_35.lib -# -######################################################## -vc7-stlport/liblink_test-vc7-stlport-mt-gd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc7-stlport/liblink_test-vc7-stlport-mt-gd-1_35/ -Fdvc7-stlport/liblink_test-vc7-stlport-mt-gd-1_35.pdb link_test.cpp - -liblink_test-vc7-stlport-mt-gd-1_35_dir : - @if not exist "vc7-stlport\liblink_test-vc7-stlport-mt-gd-1_35\$(NULL)" mkdir vc7-stlport\liblink_test-vc7-stlport-mt-gd-1_35 - -liblink_test-vc7-stlport-mt-gd-1_35_clean : - del vc7-stlport\liblink_test-vc7-stlport-mt-gd-1_35\*.obj - del vc7-stlport\liblink_test-vc7-stlport-mt-gd-1_35\*.idb - del vc7-stlport\liblink_test-vc7-stlport-mt-gd-1_35\*.exp - del vc7-stlport\liblink_test-vc7-stlport-mt-gd-1_35\*.pch - -./vc7-stlport/liblink_test-vc7-stlport-mt-gd-1_35.lib : vc7-stlport/liblink_test-vc7-stlport-mt-gd-1_35/link_test.obj - link -lib /nologo /out:vc7-stlport/liblink_test-vc7-stlport-mt-gd-1_35.lib $(XSFLAGS) vc7-stlport/liblink_test-vc7-stlport-mt-gd-1_35/link_test.obj - -./vc7-stlport/liblink_test-vc7-stlport-mt-gd-1_35.exe : main.cpp ./vc7-stlport/liblink_test-vc7-stlport-mt-gd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7-stlport/liblink_test-vc7-stlport-mt-gd-1_35.exe main.cpp /link /LIBPATH:./vc7-stlport - vc7-stlport\liblink_test-vc7-stlport-mt-gd-1_35.exe - -######################################################## -# -# section for link_test-vc7-stlport-mt-pgd-1_35.lib -# -######################################################## -vc7-stlport/link_test-vc7-stlport-mt-pgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc7-stlport/link_test-vc7-stlport-mt-pgd-1_35/ -Fdvc7-stlport/link_test-vc7-stlport-mt-pgd-1_35.pdb link_test.cpp - -link_test-vc7-stlport-mt-pgd-1_35_dir : - @if not exist "vc7-stlport\link_test-vc7-stlport-mt-pgd-1_35\$(NULL)" mkdir vc7-stlport\link_test-vc7-stlport-mt-pgd-1_35 - -link_test-vc7-stlport-mt-pgd-1_35_clean : - del vc7-stlport\link_test-vc7-stlport-mt-pgd-1_35\*.obj - del vc7-stlport\link_test-vc7-stlport-mt-pgd-1_35\*.idb - del vc7-stlport\link_test-vc7-stlport-mt-pgd-1_35\*.exp - del vc7-stlport\link_test-vc7-stlport-mt-pgd-1_35\*.pch - -./vc7-stlport/link_test-vc7-stlport-mt-pgd-1_35.lib : vc7-stlport/link_test-vc7-stlport-mt-pgd-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc7-stlport/link_test-vc7-stlport-mt-pgd-1_35.pdb" /debug /machine:I386 /out:"vc7-stlport/link_test-vc7-stlport-mt-pgd-1_35.dll" /implib:"vc7-stlport/link_test-vc7-stlport-mt-pgd-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc7-stlport/link_test-vc7-stlport-mt-pgd-1_35/link_test.obj - -./vc7-stlport/link_test-vc7-stlport-mt-pgd-1_35.exe : main.cpp ./vc7-stlport/link_test-vc7-stlport-mt-pgd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7-stlport/link_test-vc7-stlport-mt-pgd-1_35.exe main.cpp /link /LIBPATH:./vc7-stlport - vc7-stlport\link_test-vc7-stlport-mt-pgd-1_35.exe - -######################################################## -# -# section for liblink_test-vc7-stlport-mt-spgd-1_35.lib -# -######################################################## -vc7-stlport/liblink_test-vc7-stlport-mt-spgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D__STL_DEBUG /D_STLP_DEBUG /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc7-stlport/liblink_test-vc7-stlport-mt-spgd-1_35/ -Fdvc7-stlport/liblink_test-vc7-stlport-mt-spgd-1_35.pdb link_test.cpp - -liblink_test-vc7-stlport-mt-spgd-1_35_dir : - @if not exist "vc7-stlport\liblink_test-vc7-stlport-mt-spgd-1_35\$(NULL)" mkdir vc7-stlport\liblink_test-vc7-stlport-mt-spgd-1_35 - -liblink_test-vc7-stlport-mt-spgd-1_35_clean : - del vc7-stlport\liblink_test-vc7-stlport-mt-spgd-1_35\*.obj - del vc7-stlport\liblink_test-vc7-stlport-mt-spgd-1_35\*.idb - del vc7-stlport\liblink_test-vc7-stlport-mt-spgd-1_35\*.exp - del vc7-stlport\liblink_test-vc7-stlport-mt-spgd-1_35\*.pch - -./vc7-stlport/liblink_test-vc7-stlport-mt-spgd-1_35.lib : vc7-stlport/liblink_test-vc7-stlport-mt-spgd-1_35/link_test.obj - link -lib /nologo /out:vc7-stlport/liblink_test-vc7-stlport-mt-spgd-1_35.lib $(XSFLAGS) vc7-stlport/liblink_test-vc7-stlport-mt-spgd-1_35/link_test.obj - -./vc7-stlport/liblink_test-vc7-stlport-mt-spgd-1_35.exe : main.cpp ./vc7-stlport/liblink_test-vc7-stlport-mt-spgd-1_35.lib - cl $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D__STL_DEBUG /D_STLP_DEBUG /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7-stlport/liblink_test-vc7-stlport-mt-spgd-1_35.exe main.cpp /link /LIBPATH:./vc7-stlport - vc7-stlport\liblink_test-vc7-stlport-mt-spgd-1_35.exe - -######################################################## -# -# section for liblink_test-vc7-stlport-mt-pgd-1_35.lib -# -######################################################## -vc7-stlport/liblink_test-vc7-stlport-mt-pgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc7-stlport/liblink_test-vc7-stlport-mt-pgd-1_35/ -Fdvc7-stlport/liblink_test-vc7-stlport-mt-pgd-1_35.pdb link_test.cpp - -liblink_test-vc7-stlport-mt-pgd-1_35_dir : - @if not exist "vc7-stlport\liblink_test-vc7-stlport-mt-pgd-1_35\$(NULL)" mkdir vc7-stlport\liblink_test-vc7-stlport-mt-pgd-1_35 - -liblink_test-vc7-stlport-mt-pgd-1_35_clean : - del vc7-stlport\liblink_test-vc7-stlport-mt-pgd-1_35\*.obj - del vc7-stlport\liblink_test-vc7-stlport-mt-pgd-1_35\*.idb - del vc7-stlport\liblink_test-vc7-stlport-mt-pgd-1_35\*.exp - del vc7-stlport\liblink_test-vc7-stlport-mt-pgd-1_35\*.pch - -./vc7-stlport/liblink_test-vc7-stlport-mt-pgd-1_35.lib : vc7-stlport/liblink_test-vc7-stlport-mt-pgd-1_35/link_test.obj - link -lib /nologo /out:vc7-stlport/liblink_test-vc7-stlport-mt-pgd-1_35.lib $(XSFLAGS) vc7-stlport/liblink_test-vc7-stlport-mt-pgd-1_35/link_test.obj - -./vc7-stlport/liblink_test-vc7-stlport-mt-pgd-1_35.exe : main.cpp ./vc7-stlport/liblink_test-vc7-stlport-mt-pgd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7-stlport/liblink_test-vc7-stlport-mt-pgd-1_35.exe main.cpp /link /LIBPATH:./vc7-stlport - vc7-stlport\liblink_test-vc7-stlport-mt-pgd-1_35.exe - diff --git a/libs/config/test/link/vc7.mak b/libs/config/test/link/vc7.mak deleted file mode 100644 index afae0c571..000000000 --- a/libs/config/test/link/vc7.mak +++ /dev/null @@ -1,260 +0,0 @@ -# copyright 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) -# -# auto generated makefile for VC6 compiler -# -# usage: -# make -# brings libraries up to date -# make install -# brings libraries up to date and copies binaries to your VC6 /lib and /bin directories (recomended) -# - -# -# Add additional compiler options here: -# -CXXFLAGS= -# -# Add additional include directories here: -# -INCLUDES= -# -# add additional linker flags here: -# -XLFLAGS= -# -# add additional static-library creation flags here: -# -XSFLAGS= - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -!IF "$(MSVCDIR)" == "" -!ERROR Variable MSVCDIR not set. -!ENDIF - - -ALL_HEADER= - -all : main_dir liblink_test-vc7-s-1_35_dir ./vc7/liblink_test-vc7-s-1_35.lib ./vc7/liblink_test-vc7-s-1_35.exe liblink_test-vc7-mt-s-1_35_dir ./vc7/liblink_test-vc7-mt-s-1_35.lib ./vc7/liblink_test-vc7-mt-s-1_35.exe liblink_test-vc7-sgd-1_35_dir ./vc7/liblink_test-vc7-sgd-1_35.lib ./vc7/liblink_test-vc7-sgd-1_35.exe liblink_test-vc7-mt-sgd-1_35_dir ./vc7/liblink_test-vc7-mt-sgd-1_35.lib ./vc7/liblink_test-vc7-mt-sgd-1_35.exe link_test-vc7-mt-gd-1_35_dir ./vc7/link_test-vc7-mt-gd-1_35.lib ./vc7/link_test-vc7-mt-gd-1_35.exe link_test-vc7-mt-1_35_dir ./vc7/link_test-vc7-mt-1_35.lib ./vc7/link_test-vc7-mt-1_35.exe liblink_test-vc7-mt-1_35_dir ./vc7/liblink_test-vc7-mt-1_35.lib ./vc7/liblink_test-vc7-mt-1_35.exe liblink_test-vc7-mt-gd-1_35_dir ./vc7/liblink_test-vc7-mt-gd-1_35.lib ./vc7/liblink_test-vc7-mt-gd-1_35.exe - -clean : liblink_test-vc7-s-1_35_clean liblink_test-vc7-mt-s-1_35_clean liblink_test-vc7-sgd-1_35_clean liblink_test-vc7-mt-sgd-1_35_clean link_test-vc7-mt-gd-1_35_clean link_test-vc7-mt-1_35_clean liblink_test-vc7-mt-1_35_clean liblink_test-vc7-mt-gd-1_35_clean - -install : all - copy vc7\liblink_test-vc7-s-1_35.lib "$(MSVCDIR)\lib" - copy vc7\liblink_test-vc7-mt-s-1_35.lib "$(MSVCDIR)\lib" - copy vc7\liblink_test-vc7-sgd-1_35.lib "$(MSVCDIR)\lib" - copy vc7\liblink_test-vc7-sgd-1_35.pdb "$(MSVCDIR)\lib" - copy vc7\liblink_test-vc7-mt-sgd-1_35.lib "$(MSVCDIR)\lib" - copy vc7\liblink_test-vc7-mt-sgd-1_35.pdb "$(MSVCDIR)\lib" - copy vc7\link_test-vc7-mt-gd-1_35.lib "$(MSVCDIR)\lib" - copy vc7\link_test-vc7-mt-gd-1_35.dll "$(MSVCDIR)\bin" - copy vc7\link_test-vc7-mt-gd-1_35.pdb "$(MSVCDIR)\lib" - copy vc7\link_test-vc7-mt-1_35.lib "$(MSVCDIR)\lib" - copy vc7\link_test-vc7-mt-1_35.dll "$(MSVCDIR)\bin" - copy vc7\liblink_test-vc7-mt-1_35.lib "$(MSVCDIR)\lib" - copy vc7\liblink_test-vc7-mt-gd-1_35.lib "$(MSVCDIR)\lib" - copy vc7\liblink_test-vc7-mt-gd-1_35.pdb "$(MSVCDIR)\lib" - -main_dir : - @if not exist "vc7\$(NULL)" mkdir vc7 - - -######################################################## -# -# section for liblink_test-vc7-s-1_35.lib -# -######################################################## -vc7/liblink_test-vc7-s-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /ML /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD $(CXXFLAGS) -Y- -Fo./vc7/liblink_test-vc7-s-1_35/ -Fdvc7/liblink_test-vc7-s-1_35.pdb link_test.cpp - -liblink_test-vc7-s-1_35_dir : - @if not exist "vc7\liblink_test-vc7-s-1_35\$(NULL)" mkdir vc7\liblink_test-vc7-s-1_35 - -liblink_test-vc7-s-1_35_clean : - del vc7\liblink_test-vc7-s-1_35\*.obj - del vc7\liblink_test-vc7-s-1_35\*.idb - del vc7\liblink_test-vc7-s-1_35\*.exp - del vc7\liblink_test-vc7-s-1_35\*.pch - -./vc7/liblink_test-vc7-s-1_35.lib : vc7/liblink_test-vc7-s-1_35/link_test.obj - link -lib /nologo /out:vc7/liblink_test-vc7-s-1_35.lib $(XSFLAGS) vc7/liblink_test-vc7-s-1_35/link_test.obj - -./vc7/liblink_test-vc7-s-1_35.exe : main.cpp ./vc7/liblink_test-vc7-s-1_35.lib - cl $(INCLUDES) /nologo /ML /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7/liblink_test-vc7-s-1_35.exe main.cpp /link /LIBPATH:./vc7 - vc7\liblink_test-vc7-s-1_35.exe - -######################################################## -# -# section for liblink_test-vc7-mt-s-1_35.lib -# -######################################################## -vc7/liblink_test-vc7-mt-s-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MT /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD $(CXXFLAGS) -Y- -Fo./vc7/liblink_test-vc7-mt-s-1_35/ -Fdvc7/liblink_test-vc7-mt-s-1_35.pdb link_test.cpp - -liblink_test-vc7-mt-s-1_35_dir : - @if not exist "vc7\liblink_test-vc7-mt-s-1_35\$(NULL)" mkdir vc7\liblink_test-vc7-mt-s-1_35 - -liblink_test-vc7-mt-s-1_35_clean : - del vc7\liblink_test-vc7-mt-s-1_35\*.obj - del vc7\liblink_test-vc7-mt-s-1_35\*.idb - del vc7\liblink_test-vc7-mt-s-1_35\*.exp - del vc7\liblink_test-vc7-mt-s-1_35\*.pch - -./vc7/liblink_test-vc7-mt-s-1_35.lib : vc7/liblink_test-vc7-mt-s-1_35/link_test.obj - link -lib /nologo /out:vc7/liblink_test-vc7-mt-s-1_35.lib $(XSFLAGS) vc7/liblink_test-vc7-mt-s-1_35/link_test.obj - -./vc7/liblink_test-vc7-mt-s-1_35.exe : main.cpp ./vc7/liblink_test-vc7-mt-s-1_35.lib - cl $(INCLUDES) /nologo /MT /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7/liblink_test-vc7-mt-s-1_35.exe main.cpp /link /LIBPATH:./vc7 - vc7\liblink_test-vc7-mt-s-1_35.exe - -######################################################## -# -# section for liblink_test-vc7-sgd-1_35.lib -# -######################################################## -vc7/liblink_test-vc7-sgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MLd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_DEBUG /D_MBCS /D_LIB /FD /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc7/liblink_test-vc7-sgd-1_35/ -Fdvc7/liblink_test-vc7-sgd-1_35.pdb link_test.cpp - -liblink_test-vc7-sgd-1_35_dir : - @if not exist "vc7\liblink_test-vc7-sgd-1_35\$(NULL)" mkdir vc7\liblink_test-vc7-sgd-1_35 - -liblink_test-vc7-sgd-1_35_clean : - del vc7\liblink_test-vc7-sgd-1_35\*.obj - del vc7\liblink_test-vc7-sgd-1_35\*.idb - del vc7\liblink_test-vc7-sgd-1_35\*.exp - del vc7\liblink_test-vc7-sgd-1_35\*.pch - -./vc7/liblink_test-vc7-sgd-1_35.lib : vc7/liblink_test-vc7-sgd-1_35/link_test.obj - link -lib /nologo /out:vc7/liblink_test-vc7-sgd-1_35.lib $(XSFLAGS) vc7/liblink_test-vc7-sgd-1_35/link_test.obj - -./vc7/liblink_test-vc7-sgd-1_35.exe : main.cpp ./vc7/liblink_test-vc7-sgd-1_35.lib - cl $(INCLUDES) /nologo /MLd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_DEBUG /D_MBCS /D_LIB /FD /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7/liblink_test-vc7-sgd-1_35.exe main.cpp /link /LIBPATH:./vc7 - vc7\liblink_test-vc7-sgd-1_35.exe - -######################################################## -# -# section for liblink_test-vc7-mt-sgd-1_35.lib -# -######################################################## -vc7/liblink_test-vc7-mt-sgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /FD /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc7/liblink_test-vc7-mt-sgd-1_35/ -Fdvc7/liblink_test-vc7-mt-sgd-1_35.pdb link_test.cpp - -liblink_test-vc7-mt-sgd-1_35_dir : - @if not exist "vc7\liblink_test-vc7-mt-sgd-1_35\$(NULL)" mkdir vc7\liblink_test-vc7-mt-sgd-1_35 - -liblink_test-vc7-mt-sgd-1_35_clean : - del vc7\liblink_test-vc7-mt-sgd-1_35\*.obj - del vc7\liblink_test-vc7-mt-sgd-1_35\*.idb - del vc7\liblink_test-vc7-mt-sgd-1_35\*.exp - del vc7\liblink_test-vc7-mt-sgd-1_35\*.pch - -./vc7/liblink_test-vc7-mt-sgd-1_35.lib : vc7/liblink_test-vc7-mt-sgd-1_35/link_test.obj - link -lib /nologo /out:vc7/liblink_test-vc7-mt-sgd-1_35.lib $(XSFLAGS) vc7/liblink_test-vc7-mt-sgd-1_35/link_test.obj - -./vc7/liblink_test-vc7-mt-sgd-1_35.exe : main.cpp ./vc7/liblink_test-vc7-mt-sgd-1_35.lib - cl $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /FD /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7/liblink_test-vc7-mt-sgd-1_35.exe main.cpp /link /LIBPATH:./vc7 - vc7\liblink_test-vc7-mt-sgd-1_35.exe - -######################################################## -# -# section for link_test-vc7-mt-gd-1_35.lib -# -######################################################## -vc7/link_test-vc7-mt-gd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /D_DEBUG /DBOOST_DYN_LINK /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc7/link_test-vc7-mt-gd-1_35/ -Fdvc7/link_test-vc7-mt-gd-1_35.pdb link_test.cpp - -link_test-vc7-mt-gd-1_35_dir : - @if not exist "vc7\link_test-vc7-mt-gd-1_35\$(NULL)" mkdir vc7\link_test-vc7-mt-gd-1_35 - -link_test-vc7-mt-gd-1_35_clean : - del vc7\link_test-vc7-mt-gd-1_35\*.obj - del vc7\link_test-vc7-mt-gd-1_35\*.idb - del vc7\link_test-vc7-mt-gd-1_35\*.exp - del vc7\link_test-vc7-mt-gd-1_35\*.pch - -./vc7/link_test-vc7-mt-gd-1_35.lib : vc7/link_test-vc7-mt-gd-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc7/link_test-vc7-mt-gd-1_35.pdb" /debug /machine:I386 /out:"vc7/link_test-vc7-mt-gd-1_35.dll" /implib:"vc7/link_test-vc7-mt-gd-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc7/link_test-vc7-mt-gd-1_35/link_test.obj - -./vc7/link_test-vc7-mt-gd-1_35.exe : main.cpp ./vc7/link_test-vc7-mt-gd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /D_DEBUG /DBOOST_DYN_LINK /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7/link_test-vc7-mt-gd-1_35.exe main.cpp /link /LIBPATH:./vc7 - vc7\link_test-vc7-mt-gd-1_35.exe - -######################################################## -# -# section for link_test-vc7-mt-1_35.lib -# -######################################################## -vc7/link_test-vc7-mt-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD $(CXXFLAGS) -Y- -Fo./vc7/link_test-vc7-mt-1_35/ -Fdvc7/link_test-vc7-mt-1_35.pdb link_test.cpp - -link_test-vc7-mt-1_35_dir : - @if not exist "vc7\link_test-vc7-mt-1_35\$(NULL)" mkdir vc7\link_test-vc7-mt-1_35 - -link_test-vc7-mt-1_35_clean : - del vc7\link_test-vc7-mt-1_35\*.obj - del vc7\link_test-vc7-mt-1_35\*.idb - del vc7\link_test-vc7-mt-1_35\*.exp - del vc7\link_test-vc7-mt-1_35\*.pch - -./vc7/link_test-vc7-mt-1_35.lib : vc7/link_test-vc7-mt-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc7/link_test-vc7-mt-1_35.pdb" /debug /machine:I386 /out:"vc7/link_test-vc7-mt-1_35.dll" /implib:"vc7/link_test-vc7-mt-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc7/link_test-vc7-mt-1_35/link_test.obj - -./vc7/link_test-vc7-mt-1_35.exe : main.cpp ./vc7/link_test-vc7-mt-1_35.lib - cl $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7/link_test-vc7-mt-1_35.exe main.cpp /link /LIBPATH:./vc7 - vc7\link_test-vc7-mt-1_35.exe - -######################################################## -# -# section for liblink_test-vc7-mt-1_35.lib -# -######################################################## -vc7/liblink_test-vc7-mt-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD $(CXXFLAGS) -Y- -Fo./vc7/liblink_test-vc7-mt-1_35/ -Fdvc7/liblink_test-vc7-mt-1_35.pdb link_test.cpp - -liblink_test-vc7-mt-1_35_dir : - @if not exist "vc7\liblink_test-vc7-mt-1_35\$(NULL)" mkdir vc7\liblink_test-vc7-mt-1_35 - -liblink_test-vc7-mt-1_35_clean : - del vc7\liblink_test-vc7-mt-1_35\*.obj - del vc7\liblink_test-vc7-mt-1_35\*.idb - del vc7\liblink_test-vc7-mt-1_35\*.exp - del vc7\liblink_test-vc7-mt-1_35\*.pch - -./vc7/liblink_test-vc7-mt-1_35.lib : vc7/liblink_test-vc7-mt-1_35/link_test.obj - link -lib /nologo /out:vc7/liblink_test-vc7-mt-1_35.lib $(XSFLAGS) vc7/liblink_test-vc7-mt-1_35/link_test.obj - -./vc7/liblink_test-vc7-mt-1_35.exe : main.cpp ./vc7/liblink_test-vc7-mt-1_35.lib - cl $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7/liblink_test-vc7-mt-1_35.exe main.cpp /link /LIBPATH:./vc7 - vc7\liblink_test-vc7-mt-1_35.exe - -######################################################## -# -# section for liblink_test-vc7-mt-gd-1_35.lib -# -######################################################## -vc7/liblink_test-vc7-mt-gd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc7/liblink_test-vc7-mt-gd-1_35/ -Fdvc7/liblink_test-vc7-mt-gd-1_35.pdb link_test.cpp - -liblink_test-vc7-mt-gd-1_35_dir : - @if not exist "vc7\liblink_test-vc7-mt-gd-1_35\$(NULL)" mkdir vc7\liblink_test-vc7-mt-gd-1_35 - -liblink_test-vc7-mt-gd-1_35_clean : - del vc7\liblink_test-vc7-mt-gd-1_35\*.obj - del vc7\liblink_test-vc7-mt-gd-1_35\*.idb - del vc7\liblink_test-vc7-mt-gd-1_35\*.exp - del vc7\liblink_test-vc7-mt-gd-1_35\*.pch - -./vc7/liblink_test-vc7-mt-gd-1_35.lib : vc7/liblink_test-vc7-mt-gd-1_35/link_test.obj - link -lib /nologo /out:vc7/liblink_test-vc7-mt-gd-1_35.lib $(XSFLAGS) vc7/liblink_test-vc7-mt-gd-1_35/link_test.obj - -./vc7/liblink_test-vc7-mt-gd-1_35.exe : main.cpp ./vc7/liblink_test-vc7-mt-gd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc7/liblink_test-vc7-mt-gd-1_35.exe main.cpp /link /LIBPATH:./vc7 - vc7\liblink_test-vc7-mt-gd-1_35.exe - diff --git a/libs/config/test/link/vc71-stlport.mak b/libs/config/test/link/vc71-stlport.mak deleted file mode 100644 index 5725e4cd6..000000000 --- a/libs/config/test/link/vc71-stlport.mak +++ /dev/null @@ -1,292 +0,0 @@ -# copyright 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) -# -# auto generated makefile for VC6+STLPort -# -# usage: -# make -# brings libraries up to date -# make install -# brings libraries up to date and copies binaries to your VC6 /lib and /bin directories (recomended) -# - -# -# Add additional compiler options here: -# -CXXFLAGS= -# -# Add additional include directories here: -# -INCLUDES= -# -# add additional linker flags here: -# -XLFLAGS= -# -# add additional static-library creation flags here: -# -XSFLAGS= - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -!IF "$(MSVCDIR)" == "" -!ERROR Variable MSVCDIR not set. -!ENDIF - -!IF "$(STLPORT_PATH)" == "" -!ERROR Variable STLPORT_PATH not set. -!ENDIF - - -ALL_HEADER= - -all : main_dir liblink_test-vc71-stlport-mt-s-1_35_dir ./vc71-stlport/liblink_test-vc71-stlport-mt-s-1_35.lib ./vc71-stlport/liblink_test-vc71-stlport-mt-s-1_35.exe liblink_test-vc71-stlport-mt-sgd-1_35_dir ./vc71-stlport/liblink_test-vc71-stlport-mt-sgd-1_35.lib ./vc71-stlport/liblink_test-vc71-stlport-mt-sgd-1_35.exe link_test-vc71-stlport-mt-gd-1_35_dir ./vc71-stlport/link_test-vc71-stlport-mt-gd-1_35.lib ./vc71-stlport/link_test-vc71-stlport-mt-gd-1_35.exe link_test-vc71-stlport-mt-1_35_dir ./vc71-stlport/link_test-vc71-stlport-mt-1_35.lib ./vc71-stlport/link_test-vc71-stlport-mt-1_35.exe liblink_test-vc71-stlport-mt-1_35_dir ./vc71-stlport/liblink_test-vc71-stlport-mt-1_35.lib ./vc71-stlport/liblink_test-vc71-stlport-mt-1_35.exe liblink_test-vc71-stlport-mt-gd-1_35_dir ./vc71-stlport/liblink_test-vc71-stlport-mt-gd-1_35.lib ./vc71-stlport/liblink_test-vc71-stlport-mt-gd-1_35.exe link_test-vc71-stlport-mt-pgd-1_35_dir ./vc71-stlport/link_test-vc71-stlport-mt-pgd-1_35.lib ./vc71-stlport/link_test-vc71-stlport-mt-pgd-1_35.exe liblink_test-vc71-stlport-mt-spgd-1_35_dir ./vc71-stlport/liblink_test-vc71-stlport-mt-spgd-1_35.lib ./vc71-stlport/liblink_test-vc71-stlport-mt-spgd-1_35.exe liblink_test-vc71-stlport-mt-pgd-1_35_dir ./vc71-stlport/liblink_test-vc71-stlport-mt-pgd-1_35.lib ./vc71-stlport/liblink_test-vc71-stlport-mt-pgd-1_35.exe - -clean : liblink_test-vc71-stlport-mt-s-1_35_clean liblink_test-vc71-stlport-mt-sgd-1_35_clean link_test-vc71-stlport-mt-gd-1_35_clean link_test-vc71-stlport-mt-1_35_clean liblink_test-vc71-stlport-mt-1_35_clean liblink_test-vc71-stlport-mt-gd-1_35_clean link_test-vc71-stlport-mt-pgd-1_35_clean liblink_test-vc71-stlport-mt-spgd-1_35_clean liblink_test-vc71-stlport-mt-pgd-1_35_clean - -install : stlport_check all - copy vc71-stlport\liblink_test-vc71-stlport-mt-s-1_35.lib "$(MSVCDIR)\lib" - copy vc71-stlport\liblink_test-vc71-stlport-mt-sgd-1_35.lib "$(MSVCDIR)\lib" - copy vc71-stlport\link_test-vc71-stlport-mt-gd-1_35.lib "$(MSVCDIR)\lib" - copy vc71-stlport\link_test-vc71-stlport-mt-gd-1_35.dll "$(MSVCDIR)\bin" - copy vc71-stlport\link_test-vc71-stlport-mt-1_35.lib "$(MSVCDIR)\lib" - copy vc71-stlport\link_test-vc71-stlport-mt-1_35.dll "$(MSVCDIR)\bin" - copy vc71-stlport\liblink_test-vc71-stlport-mt-1_35.lib "$(MSVCDIR)\lib" - copy vc71-stlport\liblink_test-vc71-stlport-mt-gd-1_35.lib "$(MSVCDIR)\lib" - copy vc71-stlport\link_test-vc71-stlport-mt-pgd-1_35.lib "$(MSVCDIR)\lib" - copy vc71-stlport\link_test-vc71-stlport-mt-pgd-1_35.dll "$(MSVCDIR)\bin" - copy vc71-stlport\link_test-vc71-stlport-mt-pgd-1_35.pdb "$(MSVCDIR)\lib" - copy vc71-stlport\liblink_test-vc71-stlport-mt-spgd-1_35.lib "$(MSVCDIR)\lib" - copy vc71-stlport\liblink_test-vc71-stlport-mt-spgd-1_35.pdb "$(MSVCDIR)\lib" - copy vc71-stlport\liblink_test-vc71-stlport-mt-pgd-1_35.lib "$(MSVCDIR)\lib" - copy vc71-stlport\liblink_test-vc71-stlport-mt-pgd-1_35.pdb "$(MSVCDIR)\lib" - -main_dir : - @if not exist "vc71-stlport\$(NULL)" mkdir vc71-stlport - -stlport_check : $(STLPORT_PATH)\stlport\string - echo - - -######################################################## -# -# section for liblink_test-vc71-stlport-mt-s-1_35.lib -# -######################################################## -vc71-stlport/liblink_test-vc71-stlport-mt-s-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MT /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB $(CXXFLAGS) -Y- -Fo./vc71-stlport/liblink_test-vc71-stlport-mt-s-1_35/ -Fdvc71-stlport/liblink_test-vc71-stlport-mt-s-1_35.pdb link_test.cpp - -liblink_test-vc71-stlport-mt-s-1_35_dir : - @if not exist "vc71-stlport\liblink_test-vc71-stlport-mt-s-1_35\$(NULL)" mkdir vc71-stlport\liblink_test-vc71-stlport-mt-s-1_35 - -liblink_test-vc71-stlport-mt-s-1_35_clean : - del vc71-stlport\liblink_test-vc71-stlport-mt-s-1_35\*.obj - del vc71-stlport\liblink_test-vc71-stlport-mt-s-1_35\*.idb - del vc71-stlport\liblink_test-vc71-stlport-mt-s-1_35\*.exp - del vc71-stlport\liblink_test-vc71-stlport-mt-s-1_35\*.pch - -./vc71-stlport/liblink_test-vc71-stlport-mt-s-1_35.lib : vc71-stlport/liblink_test-vc71-stlport-mt-s-1_35/link_test.obj - link -lib /nologo /out:vc71-stlport/liblink_test-vc71-stlport-mt-s-1_35.lib $(XSFLAGS) vc71-stlport/liblink_test-vc71-stlport-mt-s-1_35/link_test.obj - -./vc71-stlport/liblink_test-vc71-stlport-mt-s-1_35.exe : main.cpp ./vc71-stlport/liblink_test-vc71-stlport-mt-s-1_35.lib - cl $(INCLUDES) /nologo /MT /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71-stlport/liblink_test-vc71-stlport-mt-s-1_35.exe main.cpp /link /LIBPATH:./vc71-stlport - vc71-stlport\liblink_test-vc71-stlport-mt-s-1_35.exe - -######################################################## -# -# section for liblink_test-vc71-stlport-mt-sgd-1_35.lib -# -######################################################## -vc71-stlport/liblink_test-vc71-stlport-mt-sgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc71-stlport/liblink_test-vc71-stlport-mt-sgd-1_35/ -Fdvc71-stlport/liblink_test-vc71-stlport-mt-sgd-1_35.pdb link_test.cpp - -liblink_test-vc71-stlport-mt-sgd-1_35_dir : - @if not exist "vc71-stlport\liblink_test-vc71-stlport-mt-sgd-1_35\$(NULL)" mkdir vc71-stlport\liblink_test-vc71-stlport-mt-sgd-1_35 - -liblink_test-vc71-stlport-mt-sgd-1_35_clean : - del vc71-stlport\liblink_test-vc71-stlport-mt-sgd-1_35\*.obj - del vc71-stlport\liblink_test-vc71-stlport-mt-sgd-1_35\*.idb - del vc71-stlport\liblink_test-vc71-stlport-mt-sgd-1_35\*.exp - del vc71-stlport\liblink_test-vc71-stlport-mt-sgd-1_35\*.pch - -./vc71-stlport/liblink_test-vc71-stlport-mt-sgd-1_35.lib : vc71-stlport/liblink_test-vc71-stlport-mt-sgd-1_35/link_test.obj - link -lib /nologo /out:vc71-stlport/liblink_test-vc71-stlport-mt-sgd-1_35.lib $(XSFLAGS) vc71-stlport/liblink_test-vc71-stlport-mt-sgd-1_35/link_test.obj - -./vc71-stlport/liblink_test-vc71-stlport-mt-sgd-1_35.exe : main.cpp ./vc71-stlport/liblink_test-vc71-stlport-mt-sgd-1_35.lib - cl $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71-stlport/liblink_test-vc71-stlport-mt-sgd-1_35.exe main.cpp /link /LIBPATH:./vc71-stlport - vc71-stlport\liblink_test-vc71-stlport-mt-sgd-1_35.exe - -######################################################## -# -# section for link_test-vc71-stlport-mt-gd-1_35.lib -# -######################################################## -vc71-stlport/link_test-vc71-stlport-mt-gd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc71-stlport/link_test-vc71-stlport-mt-gd-1_35/ -Fdvc71-stlport/link_test-vc71-stlport-mt-gd-1_35.pdb link_test.cpp - -link_test-vc71-stlport-mt-gd-1_35_dir : - @if not exist "vc71-stlport\link_test-vc71-stlport-mt-gd-1_35\$(NULL)" mkdir vc71-stlport\link_test-vc71-stlport-mt-gd-1_35 - -link_test-vc71-stlport-mt-gd-1_35_clean : - del vc71-stlport\link_test-vc71-stlport-mt-gd-1_35\*.obj - del vc71-stlport\link_test-vc71-stlport-mt-gd-1_35\*.idb - del vc71-stlport\link_test-vc71-stlport-mt-gd-1_35\*.exp - del vc71-stlport\link_test-vc71-stlport-mt-gd-1_35\*.pch - -./vc71-stlport/link_test-vc71-stlport-mt-gd-1_35.lib : vc71-stlport/link_test-vc71-stlport-mt-gd-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc71-stlport/link_test-vc71-stlport-mt-gd-1_35.pdb" /debug /machine:I386 /out:"vc71-stlport/link_test-vc71-stlport-mt-gd-1_35.dll" /implib:"vc71-stlport/link_test-vc71-stlport-mt-gd-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc71-stlport/link_test-vc71-stlport-mt-gd-1_35/link_test.obj - -./vc71-stlport/link_test-vc71-stlport-mt-gd-1_35.exe : main.cpp ./vc71-stlport/link_test-vc71-stlport-mt-gd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71-stlport/link_test-vc71-stlport-mt-gd-1_35.exe main.cpp /link /LIBPATH:./vc71-stlport - vc71-stlport\link_test-vc71-stlport-mt-gd-1_35.exe - -######################################################## -# -# section for link_test-vc71-stlport-mt-1_35.lib -# -######################################################## -vc71-stlport/link_test-vc71-stlport-mt-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /I$(STLPORT_PATH)\stlport /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL $(CXXFLAGS) -Y- -Fo./vc71-stlport/link_test-vc71-stlport-mt-1_35/ -Fdvc71-stlport/link_test-vc71-stlport-mt-1_35.pdb link_test.cpp - -link_test-vc71-stlport-mt-1_35_dir : - @if not exist "vc71-stlport\link_test-vc71-stlport-mt-1_35\$(NULL)" mkdir vc71-stlport\link_test-vc71-stlport-mt-1_35 - -link_test-vc71-stlport-mt-1_35_clean : - del vc71-stlport\link_test-vc71-stlport-mt-1_35\*.obj - del vc71-stlport\link_test-vc71-stlport-mt-1_35\*.idb - del vc71-stlport\link_test-vc71-stlport-mt-1_35\*.exp - del vc71-stlport\link_test-vc71-stlport-mt-1_35\*.pch - -./vc71-stlport/link_test-vc71-stlport-mt-1_35.lib : vc71-stlport/link_test-vc71-stlport-mt-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc71-stlport/link_test-vc71-stlport-mt-1_35.pdb" /debug /machine:I386 /out:"vc71-stlport/link_test-vc71-stlport-mt-1_35.dll" /implib:"vc71-stlport/link_test-vc71-stlport-mt-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc71-stlport/link_test-vc71-stlport-mt-1_35/link_test.obj - -./vc71-stlport/link_test-vc71-stlport-mt-1_35.exe : main.cpp ./vc71-stlport/link_test-vc71-stlport-mt-1_35.lib - cl $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /I$(STLPORT_PATH)\stlport /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71-stlport/link_test-vc71-stlport-mt-1_35.exe main.cpp /link /LIBPATH:./vc71-stlport - vc71-stlport\link_test-vc71-stlport-mt-1_35.exe - -######################################################## -# -# section for liblink_test-vc71-stlport-mt-1_35.lib -# -######################################################## -vc71-stlport/liblink_test-vc71-stlport-mt-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL $(CXXFLAGS) -Y- -Fo./vc71-stlport/liblink_test-vc71-stlport-mt-1_35/ -Fdvc71-stlport/liblink_test-vc71-stlport-mt-1_35.pdb link_test.cpp - -liblink_test-vc71-stlport-mt-1_35_dir : - @if not exist "vc71-stlport\liblink_test-vc71-stlport-mt-1_35\$(NULL)" mkdir vc71-stlport\liblink_test-vc71-stlport-mt-1_35 - -liblink_test-vc71-stlport-mt-1_35_clean : - del vc71-stlport\liblink_test-vc71-stlport-mt-1_35\*.obj - del vc71-stlport\liblink_test-vc71-stlport-mt-1_35\*.idb - del vc71-stlport\liblink_test-vc71-stlport-mt-1_35\*.exp - del vc71-stlport\liblink_test-vc71-stlport-mt-1_35\*.pch - -./vc71-stlport/liblink_test-vc71-stlport-mt-1_35.lib : vc71-stlport/liblink_test-vc71-stlport-mt-1_35/link_test.obj - link -lib /nologo /out:vc71-stlport/liblink_test-vc71-stlport-mt-1_35.lib $(XSFLAGS) vc71-stlport/liblink_test-vc71-stlport-mt-1_35/link_test.obj - -./vc71-stlport/liblink_test-vc71-stlport-mt-1_35.exe : main.cpp ./vc71-stlport/liblink_test-vc71-stlport-mt-1_35.lib - cl $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71-stlport/liblink_test-vc71-stlport-mt-1_35.exe main.cpp /link /LIBPATH:./vc71-stlport - vc71-stlport\liblink_test-vc71-stlport-mt-1_35.exe - -######################################################## -# -# section for liblink_test-vc71-stlport-mt-gd-1_35.lib -# -######################################################## -vc71-stlport/liblink_test-vc71-stlport-mt-gd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc71-stlport/liblink_test-vc71-stlport-mt-gd-1_35/ -Fdvc71-stlport/liblink_test-vc71-stlport-mt-gd-1_35.pdb link_test.cpp - -liblink_test-vc71-stlport-mt-gd-1_35_dir : - @if not exist "vc71-stlport\liblink_test-vc71-stlport-mt-gd-1_35\$(NULL)" mkdir vc71-stlport\liblink_test-vc71-stlport-mt-gd-1_35 - -liblink_test-vc71-stlport-mt-gd-1_35_clean : - del vc71-stlport\liblink_test-vc71-stlport-mt-gd-1_35\*.obj - del vc71-stlport\liblink_test-vc71-stlport-mt-gd-1_35\*.idb - del vc71-stlport\liblink_test-vc71-stlport-mt-gd-1_35\*.exp - del vc71-stlport\liblink_test-vc71-stlport-mt-gd-1_35\*.pch - -./vc71-stlport/liblink_test-vc71-stlport-mt-gd-1_35.lib : vc71-stlport/liblink_test-vc71-stlport-mt-gd-1_35/link_test.obj - link -lib /nologo /out:vc71-stlport/liblink_test-vc71-stlport-mt-gd-1_35.lib $(XSFLAGS) vc71-stlport/liblink_test-vc71-stlport-mt-gd-1_35/link_test.obj - -./vc71-stlport/liblink_test-vc71-stlport-mt-gd-1_35.exe : main.cpp ./vc71-stlport/liblink_test-vc71-stlport-mt-gd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71-stlport/liblink_test-vc71-stlport-mt-gd-1_35.exe main.cpp /link /LIBPATH:./vc71-stlport - vc71-stlport\liblink_test-vc71-stlport-mt-gd-1_35.exe - -######################################################## -# -# section for link_test-vc71-stlport-mt-pgd-1_35.lib -# -######################################################## -vc71-stlport/link_test-vc71-stlport-mt-pgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc71-stlport/link_test-vc71-stlport-mt-pgd-1_35/ -Fdvc71-stlport/link_test-vc71-stlport-mt-pgd-1_35.pdb link_test.cpp - -link_test-vc71-stlport-mt-pgd-1_35_dir : - @if not exist "vc71-stlport\link_test-vc71-stlport-mt-pgd-1_35\$(NULL)" mkdir vc71-stlport\link_test-vc71-stlport-mt-pgd-1_35 - -link_test-vc71-stlport-mt-pgd-1_35_clean : - del vc71-stlport\link_test-vc71-stlport-mt-pgd-1_35\*.obj - del vc71-stlport\link_test-vc71-stlport-mt-pgd-1_35\*.idb - del vc71-stlport\link_test-vc71-stlport-mt-pgd-1_35\*.exp - del vc71-stlport\link_test-vc71-stlport-mt-pgd-1_35\*.pch - -./vc71-stlport/link_test-vc71-stlport-mt-pgd-1_35.lib : vc71-stlport/link_test-vc71-stlport-mt-pgd-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc71-stlport/link_test-vc71-stlport-mt-pgd-1_35.pdb" /debug /machine:I386 /out:"vc71-stlport/link_test-vc71-stlport-mt-pgd-1_35.dll" /implib:"vc71-stlport/link_test-vc71-stlport-mt-pgd-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc71-stlport/link_test-vc71-stlport-mt-pgd-1_35/link_test.obj - -./vc71-stlport/link_test-vc71-stlport-mt-pgd-1_35.exe : main.cpp ./vc71-stlport/link_test-vc71-stlport-mt-pgd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71-stlport/link_test-vc71-stlport-mt-pgd-1_35.exe main.cpp /link /LIBPATH:./vc71-stlport - vc71-stlport\link_test-vc71-stlport-mt-pgd-1_35.exe - -######################################################## -# -# section for liblink_test-vc71-stlport-mt-spgd-1_35.lib -# -######################################################## -vc71-stlport/liblink_test-vc71-stlport-mt-spgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D__STL_DEBUG /D_STLP_DEBUG /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc71-stlport/liblink_test-vc71-stlport-mt-spgd-1_35/ -Fdvc71-stlport/liblink_test-vc71-stlport-mt-spgd-1_35.pdb link_test.cpp - -liblink_test-vc71-stlport-mt-spgd-1_35_dir : - @if not exist "vc71-stlport\liblink_test-vc71-stlport-mt-spgd-1_35\$(NULL)" mkdir vc71-stlport\liblink_test-vc71-stlport-mt-spgd-1_35 - -liblink_test-vc71-stlport-mt-spgd-1_35_clean : - del vc71-stlport\liblink_test-vc71-stlport-mt-spgd-1_35\*.obj - del vc71-stlport\liblink_test-vc71-stlport-mt-spgd-1_35\*.idb - del vc71-stlport\liblink_test-vc71-stlport-mt-spgd-1_35\*.exp - del vc71-stlport\liblink_test-vc71-stlport-mt-spgd-1_35\*.pch - -./vc71-stlport/liblink_test-vc71-stlport-mt-spgd-1_35.lib : vc71-stlport/liblink_test-vc71-stlport-mt-spgd-1_35/link_test.obj - link -lib /nologo /out:vc71-stlport/liblink_test-vc71-stlport-mt-spgd-1_35.lib $(XSFLAGS) vc71-stlport/liblink_test-vc71-stlport-mt-spgd-1_35/link_test.obj - -./vc71-stlport/liblink_test-vc71-stlport-mt-spgd-1_35.exe : main.cpp ./vc71-stlport/liblink_test-vc71-stlport-mt-spgd-1_35.lib - cl $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D__STL_DEBUG /D_STLP_DEBUG /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71-stlport/liblink_test-vc71-stlport-mt-spgd-1_35.exe main.cpp /link /LIBPATH:./vc71-stlport - vc71-stlport\liblink_test-vc71-stlport-mt-spgd-1_35.exe - -######################################################## -# -# section for liblink_test-vc71-stlport-mt-pgd-1_35.lib -# -######################################################## -vc71-stlport/liblink_test-vc71-stlport-mt-pgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc71-stlport/liblink_test-vc71-stlport-mt-pgd-1_35/ -Fdvc71-stlport/liblink_test-vc71-stlport-mt-pgd-1_35.pdb link_test.cpp - -liblink_test-vc71-stlport-mt-pgd-1_35_dir : - @if not exist "vc71-stlport\liblink_test-vc71-stlport-mt-pgd-1_35\$(NULL)" mkdir vc71-stlport\liblink_test-vc71-stlport-mt-pgd-1_35 - -liblink_test-vc71-stlport-mt-pgd-1_35_clean : - del vc71-stlport\liblink_test-vc71-stlport-mt-pgd-1_35\*.obj - del vc71-stlport\liblink_test-vc71-stlport-mt-pgd-1_35\*.idb - del vc71-stlport\liblink_test-vc71-stlport-mt-pgd-1_35\*.exp - del vc71-stlport\liblink_test-vc71-stlport-mt-pgd-1_35\*.pch - -./vc71-stlport/liblink_test-vc71-stlport-mt-pgd-1_35.lib : vc71-stlport/liblink_test-vc71-stlport-mt-pgd-1_35/link_test.obj - link -lib /nologo /out:vc71-stlport/liblink_test-vc71-stlport-mt-pgd-1_35.lib $(XSFLAGS) vc71-stlport/liblink_test-vc71-stlport-mt-pgd-1_35/link_test.obj - -./vc71-stlport/liblink_test-vc71-stlport-mt-pgd-1_35.exe : main.cpp ./vc71-stlport/liblink_test-vc71-stlport-mt-pgd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71-stlport/liblink_test-vc71-stlport-mt-pgd-1_35.exe main.cpp /link /LIBPATH:./vc71-stlport - vc71-stlport\liblink_test-vc71-stlport-mt-pgd-1_35.exe - diff --git a/libs/config/test/link/vc71.mak b/libs/config/test/link/vc71.mak deleted file mode 100644 index 887394631..000000000 --- a/libs/config/test/link/vc71.mak +++ /dev/null @@ -1,260 +0,0 @@ -# copyright 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) -# -# auto generated makefile for VC6 compiler -# -# usage: -# make -# brings libraries up to date -# make install -# brings libraries up to date and copies binaries to your VC6 /lib and /bin directories (recomended) -# - -# -# Add additional compiler options here: -# -CXXFLAGS= -# -# Add additional include directories here: -# -INCLUDES= -# -# add additional linker flags here: -# -XLFLAGS= -# -# add additional static-library creation flags here: -# -XSFLAGS= - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -!IF "$(MSVCDIR)" == "" -!ERROR Variable MSVCDIR not set. -!ENDIF - - -ALL_HEADER= - -all : main_dir liblink_test-vc71-s-1_35_dir ./vc71/liblink_test-vc71-s-1_35.lib ./vc71/liblink_test-vc71-s-1_35.exe liblink_test-vc71-mt-s-1_35_dir ./vc71/liblink_test-vc71-mt-s-1_35.lib ./vc71/liblink_test-vc71-mt-s-1_35.exe liblink_test-vc71-sgd-1_35_dir ./vc71/liblink_test-vc71-sgd-1_35.lib ./vc71/liblink_test-vc71-sgd-1_35.exe liblink_test-vc71-mt-sgd-1_35_dir ./vc71/liblink_test-vc71-mt-sgd-1_35.lib ./vc71/liblink_test-vc71-mt-sgd-1_35.exe link_test-vc71-mt-gd-1_35_dir ./vc71/link_test-vc71-mt-gd-1_35.lib ./vc71/link_test-vc71-mt-gd-1_35.exe link_test-vc71-mt-1_35_dir ./vc71/link_test-vc71-mt-1_35.lib ./vc71/link_test-vc71-mt-1_35.exe liblink_test-vc71-mt-1_35_dir ./vc71/liblink_test-vc71-mt-1_35.lib ./vc71/liblink_test-vc71-mt-1_35.exe liblink_test-vc71-mt-gd-1_35_dir ./vc71/liblink_test-vc71-mt-gd-1_35.lib ./vc71/liblink_test-vc71-mt-gd-1_35.exe - -clean : liblink_test-vc71-s-1_35_clean liblink_test-vc71-mt-s-1_35_clean liblink_test-vc71-sgd-1_35_clean liblink_test-vc71-mt-sgd-1_35_clean link_test-vc71-mt-gd-1_35_clean link_test-vc71-mt-1_35_clean liblink_test-vc71-mt-1_35_clean liblink_test-vc71-mt-gd-1_35_clean - -install : all - copy vc71\liblink_test-vc71-s-1_35.lib "$(MSVCDIR)\lib" - copy vc71\liblink_test-vc71-mt-s-1_35.lib "$(MSVCDIR)\lib" - copy vc71\liblink_test-vc71-sgd-1_35.lib "$(MSVCDIR)\lib" - copy vc71\liblink_test-vc71-sgd-1_35.pdb "$(MSVCDIR)\lib" - copy vc71\liblink_test-vc71-mt-sgd-1_35.lib "$(MSVCDIR)\lib" - copy vc71\liblink_test-vc71-mt-sgd-1_35.pdb "$(MSVCDIR)\lib" - copy vc71\link_test-vc71-mt-gd-1_35.lib "$(MSVCDIR)\lib" - copy vc71\link_test-vc71-mt-gd-1_35.dll "$(MSVCDIR)\bin" - copy vc71\link_test-vc71-mt-gd-1_35.pdb "$(MSVCDIR)\lib" - copy vc71\link_test-vc71-mt-1_35.lib "$(MSVCDIR)\lib" - copy vc71\link_test-vc71-mt-1_35.dll "$(MSVCDIR)\bin" - copy vc71\liblink_test-vc71-mt-1_35.lib "$(MSVCDIR)\lib" - copy vc71\liblink_test-vc71-mt-gd-1_35.lib "$(MSVCDIR)\lib" - copy vc71\liblink_test-vc71-mt-gd-1_35.pdb "$(MSVCDIR)\lib" - -main_dir : - @if not exist "vc71\$(NULL)" mkdir vc71 - - -######################################################## -# -# section for liblink_test-vc71-s-1_35.lib -# -######################################################## -vc71/liblink_test-vc71-s-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /ML /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD $(CXXFLAGS) -Y- -Fo./vc71/liblink_test-vc71-s-1_35/ -Fdvc71/liblink_test-vc71-s-1_35.pdb link_test.cpp - -liblink_test-vc71-s-1_35_dir : - @if not exist "vc71\liblink_test-vc71-s-1_35\$(NULL)" mkdir vc71\liblink_test-vc71-s-1_35 - -liblink_test-vc71-s-1_35_clean : - del vc71\liblink_test-vc71-s-1_35\*.obj - del vc71\liblink_test-vc71-s-1_35\*.idb - del vc71\liblink_test-vc71-s-1_35\*.exp - del vc71\liblink_test-vc71-s-1_35\*.pch - -./vc71/liblink_test-vc71-s-1_35.lib : vc71/liblink_test-vc71-s-1_35/link_test.obj - link -lib /nologo /out:vc71/liblink_test-vc71-s-1_35.lib $(XSFLAGS) vc71/liblink_test-vc71-s-1_35/link_test.obj - -./vc71/liblink_test-vc71-s-1_35.exe : main.cpp ./vc71/liblink_test-vc71-s-1_35.lib - cl $(INCLUDES) /nologo /ML /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71/liblink_test-vc71-s-1_35.exe main.cpp /link /LIBPATH:./vc71 - vc71\liblink_test-vc71-s-1_35.exe - -######################################################## -# -# section for liblink_test-vc71-mt-s-1_35.lib -# -######################################################## -vc71/liblink_test-vc71-mt-s-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MT /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD $(CXXFLAGS) -Y- -Fo./vc71/liblink_test-vc71-mt-s-1_35/ -Fdvc71/liblink_test-vc71-mt-s-1_35.pdb link_test.cpp - -liblink_test-vc71-mt-s-1_35_dir : - @if not exist "vc71\liblink_test-vc71-mt-s-1_35\$(NULL)" mkdir vc71\liblink_test-vc71-mt-s-1_35 - -liblink_test-vc71-mt-s-1_35_clean : - del vc71\liblink_test-vc71-mt-s-1_35\*.obj - del vc71\liblink_test-vc71-mt-s-1_35\*.idb - del vc71\liblink_test-vc71-mt-s-1_35\*.exp - del vc71\liblink_test-vc71-mt-s-1_35\*.pch - -./vc71/liblink_test-vc71-mt-s-1_35.lib : vc71/liblink_test-vc71-mt-s-1_35/link_test.obj - link -lib /nologo /out:vc71/liblink_test-vc71-mt-s-1_35.lib $(XSFLAGS) vc71/liblink_test-vc71-mt-s-1_35/link_test.obj - -./vc71/liblink_test-vc71-mt-s-1_35.exe : main.cpp ./vc71/liblink_test-vc71-mt-s-1_35.lib - cl $(INCLUDES) /nologo /MT /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71/liblink_test-vc71-mt-s-1_35.exe main.cpp /link /LIBPATH:./vc71 - vc71\liblink_test-vc71-mt-s-1_35.exe - -######################################################## -# -# section for liblink_test-vc71-sgd-1_35.lib -# -######################################################## -vc71/liblink_test-vc71-sgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MLd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_DEBUG /D_MBCS /D_LIB /FD /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc71/liblink_test-vc71-sgd-1_35/ -Fdvc71/liblink_test-vc71-sgd-1_35.pdb link_test.cpp - -liblink_test-vc71-sgd-1_35_dir : - @if not exist "vc71\liblink_test-vc71-sgd-1_35\$(NULL)" mkdir vc71\liblink_test-vc71-sgd-1_35 - -liblink_test-vc71-sgd-1_35_clean : - del vc71\liblink_test-vc71-sgd-1_35\*.obj - del vc71\liblink_test-vc71-sgd-1_35\*.idb - del vc71\liblink_test-vc71-sgd-1_35\*.exp - del vc71\liblink_test-vc71-sgd-1_35\*.pch - -./vc71/liblink_test-vc71-sgd-1_35.lib : vc71/liblink_test-vc71-sgd-1_35/link_test.obj - link -lib /nologo /out:vc71/liblink_test-vc71-sgd-1_35.lib $(XSFLAGS) vc71/liblink_test-vc71-sgd-1_35/link_test.obj - -./vc71/liblink_test-vc71-sgd-1_35.exe : main.cpp ./vc71/liblink_test-vc71-sgd-1_35.lib - cl $(INCLUDES) /nologo /MLd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_DEBUG /D_MBCS /D_LIB /FD /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71/liblink_test-vc71-sgd-1_35.exe main.cpp /link /LIBPATH:./vc71 - vc71\liblink_test-vc71-sgd-1_35.exe - -######################################################## -# -# section for liblink_test-vc71-mt-sgd-1_35.lib -# -######################################################## -vc71/liblink_test-vc71-mt-sgd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /FD /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc71/liblink_test-vc71-mt-sgd-1_35/ -Fdvc71/liblink_test-vc71-mt-sgd-1_35.pdb link_test.cpp - -liblink_test-vc71-mt-sgd-1_35_dir : - @if not exist "vc71\liblink_test-vc71-mt-sgd-1_35\$(NULL)" mkdir vc71\liblink_test-vc71-mt-sgd-1_35 - -liblink_test-vc71-mt-sgd-1_35_clean : - del vc71\liblink_test-vc71-mt-sgd-1_35\*.obj - del vc71\liblink_test-vc71-mt-sgd-1_35\*.idb - del vc71\liblink_test-vc71-mt-sgd-1_35\*.exp - del vc71\liblink_test-vc71-mt-sgd-1_35\*.pch - -./vc71/liblink_test-vc71-mt-sgd-1_35.lib : vc71/liblink_test-vc71-mt-sgd-1_35/link_test.obj - link -lib /nologo /out:vc71/liblink_test-vc71-mt-sgd-1_35.lib $(XSFLAGS) vc71/liblink_test-vc71-mt-sgd-1_35/link_test.obj - -./vc71/liblink_test-vc71-mt-sgd-1_35.exe : main.cpp ./vc71/liblink_test-vc71-mt-sgd-1_35.lib - cl $(INCLUDES) /nologo /MTd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /FD /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71/liblink_test-vc71-mt-sgd-1_35.exe main.cpp /link /LIBPATH:./vc71 - vc71\liblink_test-vc71-mt-sgd-1_35.exe - -######################################################## -# -# section for link_test-vc71-mt-gd-1_35.lib -# -######################################################## -vc71/link_test-vc71-mt-gd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /D_DEBUG /DBOOST_DYN_LINK /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc71/link_test-vc71-mt-gd-1_35/ -Fdvc71/link_test-vc71-mt-gd-1_35.pdb link_test.cpp - -link_test-vc71-mt-gd-1_35_dir : - @if not exist "vc71\link_test-vc71-mt-gd-1_35\$(NULL)" mkdir vc71\link_test-vc71-mt-gd-1_35 - -link_test-vc71-mt-gd-1_35_clean : - del vc71\link_test-vc71-mt-gd-1_35\*.obj - del vc71\link_test-vc71-mt-gd-1_35\*.idb - del vc71\link_test-vc71-mt-gd-1_35\*.exp - del vc71\link_test-vc71-mt-gd-1_35\*.pch - -./vc71/link_test-vc71-mt-gd-1_35.lib : vc71/link_test-vc71-mt-gd-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc71/link_test-vc71-mt-gd-1_35.pdb" /debug /machine:I386 /out:"vc71/link_test-vc71-mt-gd-1_35.dll" /implib:"vc71/link_test-vc71-mt-gd-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc71/link_test-vc71-mt-gd-1_35/link_test.obj - -./vc71/link_test-vc71-mt-gd-1_35.exe : main.cpp ./vc71/link_test-vc71-mt-gd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /D_DEBUG /DBOOST_DYN_LINK /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71/link_test-vc71-mt-gd-1_35.exe main.cpp /link /LIBPATH:./vc71 - vc71\link_test-vc71-mt-gd-1_35.exe - -######################################################## -# -# section for link_test-vc71-mt-1_35.lib -# -######################################################## -vc71/link_test-vc71-mt-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD $(CXXFLAGS) -Y- -Fo./vc71/link_test-vc71-mt-1_35/ -Fdvc71/link_test-vc71-mt-1_35.pdb link_test.cpp - -link_test-vc71-mt-1_35_dir : - @if not exist "vc71\link_test-vc71-mt-1_35\$(NULL)" mkdir vc71\link_test-vc71-mt-1_35 - -link_test-vc71-mt-1_35_clean : - del vc71\link_test-vc71-mt-1_35\*.obj - del vc71\link_test-vc71-mt-1_35\*.idb - del vc71\link_test-vc71-mt-1_35\*.exp - del vc71\link_test-vc71-mt-1_35\*.pch - -./vc71/link_test-vc71-mt-1_35.lib : vc71/link_test-vc71-mt-1_35/link_test.obj - link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"vc71/link_test-vc71-mt-1_35.pdb" /debug /machine:I386 /out:"vc71/link_test-vc71-mt-1_35.dll" /implib:"vc71/link_test-vc71-mt-1_35.lib" /LIBPATH:$(STLPORT_PATH)\lib $(XLFLAGS) vc71/link_test-vc71-mt-1_35/link_test.obj - -./vc71/link_test-vc71-mt-1_35.exe : main.cpp ./vc71/link_test-vc71-mt-1_35.lib - cl $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71/link_test-vc71-mt-1_35.exe main.cpp /link /LIBPATH:./vc71 - vc71\link_test-vc71-mt-1_35.exe - -######################################################## -# -# section for liblink_test-vc71-mt-1_35.lib -# -######################################################## -vc71/liblink_test-vc71-mt-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD $(CXXFLAGS) -Y- -Fo./vc71/liblink_test-vc71-mt-1_35/ -Fdvc71/liblink_test-vc71-mt-1_35.pdb link_test.cpp - -liblink_test-vc71-mt-1_35_dir : - @if not exist "vc71\liblink_test-vc71-mt-1_35\$(NULL)" mkdir vc71\liblink_test-vc71-mt-1_35 - -liblink_test-vc71-mt-1_35_clean : - del vc71\liblink_test-vc71-mt-1_35\*.obj - del vc71\liblink_test-vc71-mt-1_35\*.idb - del vc71\liblink_test-vc71-mt-1_35\*.exp - del vc71\liblink_test-vc71-mt-1_35\*.pch - -./vc71/liblink_test-vc71-mt-1_35.lib : vc71/liblink_test-vc71-mt-1_35/link_test.obj - link -lib /nologo /out:vc71/liblink_test-vc71-mt-1_35.lib $(XSFLAGS) vc71/liblink_test-vc71-mt-1_35/link_test.obj - -./vc71/liblink_test-vc71-mt-1_35.exe : main.cpp ./vc71/liblink_test-vc71-mt-1_35.lib - cl $(INCLUDES) /nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71/liblink_test-vc71-mt-1_35.exe main.cpp /link /LIBPATH:./vc71 - vc71\liblink_test-vc71-mt-1_35.exe - -######################################################## -# -# section for liblink_test-vc71-mt-gd-1_35.lib -# -######################################################## -vc71/liblink_test-vc71-mt-gd-1_35/link_test.obj: link_test.cpp $(ALL_HEADER) - cl /c $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD /GX /RTC1 $(CXXFLAGS) -Y- -Fo./vc71/liblink_test-vc71-mt-gd-1_35/ -Fdvc71/liblink_test-vc71-mt-gd-1_35.pdb link_test.cpp - -liblink_test-vc71-mt-gd-1_35_dir : - @if not exist "vc71\liblink_test-vc71-mt-gd-1_35\$(NULL)" mkdir vc71\liblink_test-vc71-mt-gd-1_35 - -liblink_test-vc71-mt-gd-1_35_clean : - del vc71\liblink_test-vc71-mt-gd-1_35\*.obj - del vc71\liblink_test-vc71-mt-gd-1_35\*.idb - del vc71\liblink_test-vc71-mt-gd-1_35\*.exp - del vc71\liblink_test-vc71-mt-gd-1_35\*.pch - -./vc71/liblink_test-vc71-mt-gd-1_35.lib : vc71/liblink_test-vc71-mt-gd-1_35/link_test.obj - link -lib /nologo /out:vc71/liblink_test-vc71-mt-gd-1_35.lib $(XSFLAGS) vc71/liblink_test-vc71-mt-gd-1_35/link_test.obj - -./vc71/liblink_test-vc71-mt-gd-1_35.exe : main.cpp ./vc71/liblink_test-vc71-mt-gd-1_35.lib - cl $(INCLUDES) /nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD /GX /RTC1 /DBOOST_LIB_DIAGNOSTIC=1 $(CXXFLAGS) -o ./vc71/liblink_test-vc71-mt-gd-1_35.exe main.cpp /link /LIBPATH:./vc71 - vc71\liblink_test-vc71-mt-gd-1_35.exe - diff --git a/libs/config/test/link/vc_gen.sh b/libs/config/test/link/vc_gen.sh deleted file mode 100644 index 1ba46f3bc..000000000 --- a/libs/config/test/link/vc_gen.sh +++ /dev/null @@ -1,424 +0,0 @@ -#! /bin/bash -# copyright 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) - -libname="" -src="" -header="" -all_dep="" - -# current makefile: -out="" -# temporary file: -tout="" -# install target temp file: -iout="" -# debug flag: -debug="no" -# compile options: -opts="" -# main output sub-directory: -subdir="" -# extra debug /RTc options: -debug_extra="" - -function vc6_gen_lib() -{ - all_dep="$all_dep $libname""_dir ./$subdir/$libname.lib ./$subdir/$libname.exe" - echo " copy $subdir\\$libname.lib "'"$'"(MSVCDIR)\\lib"'"' >> $iout - if test $debug == "yes"; then - echo " copy $subdir\\$libname.pdb "'"$'"(MSVCDIR)\\lib"'"' >> $iout - fi -# -# set up section comments: - cat >> $tout << EOF -######################################################## -# -# section for $libname.lib -# -######################################################## -EOF -# -# process source files: - all_obj="" - for file in $src - do - obj=`echo "$file" | sed 's/\(.*\)cpp/\1obj/g'` - obj="$subdir/$libname/$obj" - all_obj="$all_obj $obj" - echo "$obj: $file \$(ALL_HEADER)" >> $tout - echo " cl /c \$(INCLUDES) $opts \$(CXXFLAGS) -Y- -Fo./$subdir/$libname/ -Fd$subdir/$libname.pdb $file" >> $tout - echo "" >> $tout - done -# -# now for the directories for this library: - echo "$libname"_dir : >> $tout - echo " @if not exist \"$subdir\\$libname\\\$(NULL)\" mkdir $subdir\\$libname" >> $tout - echo "" >> $tout -# -# now for the clean options for this library: - all_clean="$all_clean $libname""_clean" - echo "$libname"_clean : >> $tout - echo " del $subdir\\$libname\\"'*.obj' >> $tout - echo " del $subdir\\$libname\\"'*.idb' >> $tout - echo " del $subdir\\$libname\\"'*.exp' >> $tout - echo " del $subdir\\$libname\\"'*.pch' >> $tout - echo "" >> $tout -# -# now for the main target for this library: - echo ./$subdir/$libname.lib : $all_obj >> $tout - echo " link -lib /nologo /out:$subdir/$libname.lib \$(XSFLAGS) $all_obj" >> $tout - echo "" >> $tout -# now the test program: - echo ./$subdir/$libname.exe : main.cpp ./$subdir/$libname.lib >> $tout - echo " cl \$(INCLUDES) $opts /DBOOST_LIB_DIAGNOSTIC=1 \$(CXXFLAGS) -o ./$subdir/$libname.exe main.cpp /link /LIBPATH:./$subdir" >> $tout - echo " $subdir"'\'"$libname.exe" >> $tout - echo "" >> $tout -} - -function vc6_gen_dll() -{ - all_dep="$all_dep $libname""_dir ./$subdir/$libname.lib ./$subdir/$libname.exe" - echo " copy $subdir\\$libname.lib "'"$'"(MSVCDIR)\\lib"'"' >> $iout - echo " copy $subdir\\$libname.dll "'"$'"(MSVCDIR)\\bin"'"' >> $iout - if test $debug == "yes"; then - echo " copy $subdir\\$libname.pdb "'"$'"(MSVCDIR)\\lib"'"' >> $iout - fi -# -# set up section comments: - cat >> $tout << EOF -######################################################## -# -# section for $libname.lib -# -######################################################## -EOF -# -# process source files: - all_obj="" - for file in $src - do - obj=`echo "$file" | sed 's/\(.*\)cpp/\1obj/g'` - obj="$subdir/$libname/$obj" - all_obj="$all_obj $obj" - echo "$obj: $file \$(ALL_HEADER)" >> $tout - echo " cl /c \$(INCLUDES) $opts \$(CXXFLAGS) -Y- -Fo./$subdir/$libname/ -Fd$subdir/$libname.pdb $file" >> $tout - echo "" >> $tout - done -# -# now for the directories for this library: - echo "$libname"_dir : >> $tout - echo " @if not exist \"$subdir\\$libname\\\$(NULL)\" mkdir $subdir\\$libname" >> $tout - echo "" >> $tout -# -# now for the clean options for this library: - all_clean="$all_clean $libname""_clean" - echo "$libname"_clean : >> $tout - echo " del $subdir\\$libname\\"'*.obj' >> $tout - echo " del $subdir\\$libname\\"'*.idb' >> $tout - echo " del $subdir\\$libname\\"'*.exp' >> $tout - echo " del $subdir\\$libname\\"'*.pch' >> $tout - echo "" >> $tout -# -# now for the main target for this library: - echo ./$subdir/$libname.lib : $all_obj >> $tout - echo " link kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:\"$subdir/$libname.pdb\" /debug /machine:I386 /out:\"$subdir/$libname.dll\" /implib:\"$subdir/$libname.lib\" /LIBPATH:\$(STLPORT_PATH)\\lib \$(XLFLAGS) $all_obj" >> $tout - echo "" >> $tout -# now the test program: - echo ./$subdir/$libname.exe : main.cpp ./$subdir/$libname.lib >> $tout - echo " cl \$(INCLUDES) $opts /DBOOST_LIB_DIAGNOSTIC=1 \$(CXXFLAGS) -o ./$subdir/$libname.exe main.cpp /link /LIBPATH:./$subdir" >> $tout - echo " $subdir"'\'"$libname.exe" >> $tout - echo "" >> $tout -} - -is_stlport="no" - -function vc6_gen() -{ - debug="no" - tout="temp" - iout="temp_install" - all_dep="main_dir" - all_clean="" - echo > $out - echo > $tout - rm -f $iout - - libname="liblink_test-${subdir}-s-${boost_version}" - opts='/nologo /ML /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD' - vc6_gen_lib - - libname="liblink_test-${subdir}-mt-s-${boost_version}" - opts='/nologo /MT /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB /FD ' - vc6_gen_lib - - debug="yes" - libname="liblink_test-${subdir}-sgd-${boost_version}" - opts='/nologo /MLd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_DEBUG /D_MBCS /D_LIB /FD '"$debug_extra"' ' - vc6_gen_lib - - libname="liblink_test-${subdir}-mt-sgd-${boost_version}" - opts='/nologo /MTd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB /FD '"$debug_extra"' ' - vc6_gen_lib - - libname="link_test-${subdir}-mt-gd-${boost_version}" - opts='/nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /D_DEBUG /DBOOST_DYN_LINK /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD '"$debug_extra"' ' - vc6_gen_dll - - debug="no" - opts='/nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD ' - libname="link_test-${subdir}-mt-${boost_version}" - vc6_gen_dll - - debug="no" - opts='/nologo /MD /W3 /GX /O2 /GB /GF /Gy /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL /FD ' - libname="liblink_test-${subdir}-mt-${boost_version}" - vc6_gen_lib - - debug="yes" - libname="liblink_test-${subdir}-mt-gd-${boost_version}" - opts='/nologo /MDd /W3 /Gm /GX /Zi /Od /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL /FD '"$debug_extra"' ' - vc6_gen_lib - - cat > $out << EOF -# copyright 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) -# -# auto generated makefile for VC6 compiler -# -# usage: -# make -# brings libraries up to date -# make install -# brings libraries up to date and copies binaries to your VC6 /lib and /bin directories (recomended) -# - -# -# Add additional compiler options here: -# -CXXFLAGS= -# -# Add additional include directories here: -# -INCLUDES= -# -# add additional linker flags here: -# -XLFLAGS= -# -# add additional static-library creation flags here: -# -XSFLAGS= - -!IF "\$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -!IF "\$(MSVCDIR)" == "" -!ERROR Variable MSVCDIR not set. -!ENDIF - -EOF - echo "" >> $out - echo "ALL_HEADER=$header" >> $out - echo "" >> $out - echo "all : $all_dep" >> $out - echo >> $out - echo "clean : $all_clean" >> $out - echo >> $out - echo "install : all" >> $out - cat $iout >> $out - echo >> $out - echo main_dir : >> $out - echo " @if not exist \"$subdir\\\$(NULL)\" mkdir $subdir" >> $out - echo "" >> $out - - cat $tout >> $out -} - -function vc6_stlp_gen() -{ - debug="no" - tout="temp" - iout="temp_install" - all_dep="main_dir" - all_clean="" - echo > $out - echo > $tout - rm -f $iout - - libname="liblink_test-${subdir}-mt-s-${boost_version}" - opts='/nologo /MT /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D_MT /DWIN32 /DNDEBUG /D_MBCS /D_LIB ' - vc6_gen_lib - - debug="true" - libname="liblink_test-${subdir}-mt-sgd-${boost_version}" - opts='/nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB '"$debug_extra"' ' - vc6_gen_lib - - libname="link_test-${subdir}-mt-gd-${boost_version}" - opts='/nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL '"$debug_extra"' ' - vc6_gen_dll - - debug="no" - opts='/nologo /MD /W3 /GX /O2 /GB /GF /I$(STLPORT_PATH)\stlport /Gy /I..\..\..\..\ /DBOOST_DYN_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL ' - libname="link_test-${subdir}-mt-${boost_version}" - vc6_gen_dll - - debug="no" - opts='/nologo /MD /W3 /GX /O2 /GB /GF /Gy /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /DNDEBUG /DWIN32 /D_WINDOWS /D_MBCS /D_USRDLL ' - libname="liblink_test-${subdir}-mt-${boost_version}" - vc6_gen_lib - - debug="true" - libname="liblink_test-${subdir}-mt-gd-${boost_version}" - opts='/nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL '"$debug_extra"' ' - vc6_gen_lib - -# debug STLPort mode: -# not yet supported by bjam? - debug="yes" - opts='/nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_DYN_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL '"$debug_extra"' ' - libname="link_test-${subdir}-mt-pgd-${boost_version}" - vc6_gen_dll - libname="liblink_test-${subdir}-mt-spgd-${boost_version}" - opts='/nologo /MTd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /D__STL_DEBUG /D_STLP_DEBUG /DWIN32 /D_MT /D_DEBUG /D_MBCS /D_LIB '"$debug_extra"' ' - vc6_gen_lib - opts='/nologo /MDd /W3 /Gm /GX /Zi /Od /I$(STLPORT_PATH)\stlport /I..\..\..\..\ /DBOOST_REGEX_STATIC_LINK /D__STL_DEBUG /D_STLP_DEBUG /D_DEBUG /DWIN32 /D_WINDOWS /D_MBCS /DUSRDLL '"$debug_extra"' ' - libname="liblink_test-${subdir}-mt-pgd-${boost_version}" - vc6_gen_lib - - cat > $out << EOF -# copyright 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) -# -# auto generated makefile for VC6+STLPort -# -# usage: -# make -# brings libraries up to date -# make install -# brings libraries up to date and copies binaries to your VC6 /lib and /bin directories (recomended) -# - -# -# Add additional compiler options here: -# -CXXFLAGS= -# -# Add additional include directories here: -# -INCLUDES= -# -# add additional linker flags here: -# -XLFLAGS= -# -# add additional static-library creation flags here: -# -XSFLAGS= - -!IF "\$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -!IF "\$(MSVCDIR)" == "" -!ERROR Variable MSVCDIR not set. -!ENDIF - -!IF "\$(STLPORT_PATH)" == "" -!ERROR Variable STLPORT_PATH not set. -!ENDIF - -EOF - echo "" >> $out - echo "ALL_HEADER=$header" >> $out - echo "" >> $out - echo "all : $all_dep" >> $out - echo >> $out - echo "clean : $all_clean" >> $out - echo >> $out - echo "install : stlport_check all" >> $out - cat $iout >> $out - echo >> $out - echo main_dir : >> $out - echo " @if not exist \"$subdir\\\$(NULL)\" mkdir $subdir" >> $out - echo "" >> $out - echo 'stlport_check : $(STLPORT_PATH)\stlport\string' >> $out - echo " echo" >> $out - echo "" >> $out - - cat $tout >> $out -} - - -. common.sh - -# -# generate vc6 makefile: -debug_extra="/GX" -out="vc6.mak" -subdir="vc6" -vc6_gen -# -# generate vc6-stlport makefile: -is_stlport="yes" -out="vc6-stlport.mak" -no_single="yes" -subdir="vc6-stlport" -vc6_stlp_gen -# -# generate vc7 makefile: -debug_extra="/GX /RTC1" -is_stlport="no" -out="vc7.mak" -no_single="no" -subdir="vc7" -vc6_gen -# -# generate vc7-stlport makefile: -is_stlport="yes" -out="vc7-stlport.mak" -no_single="yes" -subdir="vc7-stlport" -vc6_stlp_gen -# -# generate vc71 makefile: -is_stlport="no" -out="vc71.mak" -no_single="no" -subdir="vc71" -vc6_gen -# -# generate vc71-stlport makefile: -is_stlport="yes" -out="vc71-stlport.mak" -no_single="yes" -subdir="vc71-stlport" -vc6_stlp_gen - - -# -# remove tmep files; -rm -f $tout $iout - - - - - - - - - - - diff --git a/libs/config/test/math_info.cpp b/libs/config/test/math_info.cpp deleted file mode 100644 index 47fe9ffe4..000000000 --- a/libs/config/test/math_info.cpp +++ /dev/null @@ -1,365 +0,0 @@ -// (C) Copyright 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) - -// See http://www.boost.org/libs/config/test for most recent version. - -// -// This test prints out informative information about , -// and . Note that this file does require a correctly configured -// Boost setup, and so can't be folded into config_info which is designed -// to function without Boost.Confg support. Each test is documented in -// more detail below. -// - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef BOOST_NO_STDC_NAMESPACE -namespace std{ using ::strcmp; using ::pow; using ::fabs; using ::sqrt; using ::sin; using ::atan2; } -#endif - -static unsigned int indent = 4; -static unsigned int width = 40; - -void print_macro(const char* name, const char* value) -{ - // if name == value+1 then then macro is not defined, - // in which case we don't print anything: - if(0 != std::strcmp(name, value+1)) - { - for(unsigned i = 0; i < indent; ++i) std::cout.put(' '); - std::cout << std::setw(width); - std::cout.setf(std::istream::left, std::istream::adjustfield); - std::cout << name; - if(value[1]) - { - // macro has a value: - std::cout << value << "\n"; - } - else - { - // macro is defined but has no value: - std::cout << " [no value]\n"; - } - } -} - -#define PRINT_MACRO(X) print_macro(#X, BOOST_STRINGIZE(=X)) - -template -void print_expression(const char* expression, T val) -{ - for(unsigned i = 0; i < indent; ++i) std::cout.put(' '); - std::cout << std::setw(width); - std::cout.setf(std::istream::left, std::istream::adjustfield); - std::cout << std::setprecision(std::numeric_limits::digits10+2); - std::cout << expression << "=" << val << std::endl; -} - -#define PRINT_EXPRESSION(E) print_expression(#E, E); - - -template -void print_limits(T, const char* name) -{ - // - // Output general information on numeric_limits, as well as - // probing known and supected problems. - // - std::cout << - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" - "std::numeric_limits information for type " << name << std::endl; - std::cout << - " is_specialized = " << std::numeric_limits::is_specialized << std::endl; - std::cout << - " min" "() = " << std::setprecision(std::numeric_limits::digits10 + 2) << (std::numeric_limits::min)() << std::endl; - std::cout << - " max" "() = " << std::setprecision(std::numeric_limits::digits10 + 2) << (std::numeric_limits::max)() << std::endl; - std::cout << - " digits = " << std::numeric_limits::digits << std::endl; - std::cout << - " digits10 = " << std::numeric_limits::digits10 << std::endl; - std::cout << - " is_signed = " << std::numeric_limits::is_signed << std::endl; - std::cout << - " is_integer = " << std::numeric_limits::is_integer << std::endl; - std::cout << - " is_exact = " << std::numeric_limits::is_exact << std::endl; - std::cout << - " radix = " << std::numeric_limits::radix << std::endl; - - std::cout << - " epsilon() = " << std::setprecision(std::numeric_limits::digits10 + 2) << (std::numeric_limits::epsilon)() << std::endl; - std::cout << - " round_error() = " << std::setprecision(std::numeric_limits::digits10 + 2) << (std::numeric_limits::round_error)() << std::endl; - - std::cout << - " min_exponent = " << std::numeric_limits::min_exponent << std::endl; - std::cout << - " min_exponent10 = " << std::numeric_limits::min_exponent10 << std::endl; - std::cout << - " max_exponent = " << std::numeric_limits::max_exponent << std::endl; - std::cout << - " max_exponent10 = " << std::numeric_limits::max_exponent10 << std::endl; - std::cout << - " has_infinity = " << std::numeric_limits::has_infinity << std::endl; - std::cout << - " has_quiet_NaN = " << std::numeric_limits::has_quiet_NaN << std::endl; - std::cout << - " has_signaling_NaN = " << std::numeric_limits::has_signaling_NaN << std::endl; - std::cout << - " has_denorm = " << std::numeric_limits::has_denorm << std::endl; - std::cout << - " has_denorm_loss = " << std::numeric_limits::has_denorm_loss << std::endl; - - std::cout << - " infinity() = " << std::setprecision(std::numeric_limits::digits10 + 2) << (std::numeric_limits::infinity)() << std::endl; - std::cout << - " quiet_NaN() = " << std::setprecision(std::numeric_limits::digits10 + 2) << (std::numeric_limits::quiet_NaN)() << std::endl; - std::cout << - " signaling_NaN() = " << std::setprecision(std::numeric_limits::digits10 + 2) << (std::numeric_limits::signaling_NaN)() << std::endl; - std::cout << - " denorm_min() = " << std::setprecision(std::numeric_limits::digits10 + 2) << (std::numeric_limits::denorm_min)() << std::endl; - - - std::cout << - " is_iec559 = " << std::numeric_limits::is_iec559 << std::endl; - std::cout << - " is_bounded = " << std::numeric_limits::is_bounded << std::endl; - std::cout << - " is_modulo = " << std::numeric_limits::is_modulo << std::endl; - std::cout << - " traps = " << std::numeric_limits::traps << std::endl; - std::cout << - " tinyness_before = " << std::numeric_limits::tinyness_before << std::endl; - std::cout << - " round_style = " << std::numeric_limits::round_style << std::endl << std::endl; - - if(std::numeric_limits::is_exact == 0) - { - bool r = std::numeric_limits::epsilon() == std::pow(static_cast(std::numeric_limits::radix), 1-std::numeric_limits::digits); - if(r) - std::cout << "Epsilon has sane value of std::pow(std::numeric_limits::radix, 1-std::numeric_limits::digits)." << std::endl; - else - std::cout << "CAUTION: epsilon does not have a sane value." << std::endl; - std::cout << std::endl; - } - std::cout << - " sizeof(" << name << ") = " << sizeof(T) << std::endl; - std::cout << - " alignment_of<" << name << "> = " << boost::alignment_of::value << std::endl << std::endl; -} -/* -template -bool is_same_type(T, T) -{ - return true; -}*/ -bool is_same_type(float, float) -{ return true; } -bool is_same_type(double, double) -{ return true; } -bool is_same_type(long double, long double) -{ return true; } -template -bool is_same_type(T, U) -{ - return false; -} - -// -// We need this to test whether abs has been overloaded for -// the floating point types or not: -// -namespace std{ -#if !BOOST_WORKAROUND(BOOST_MSVC, == 1300) && \ - !defined(_LIBCPP_VERSION) -template -char abs(T) -{ - return ' '; -} -#endif -} - - -template -void test_overloads(T, const char* name) -{ - // - // Probe known and suspected problems with the std lib Math functions. - // - std::cout << - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" - "Math function overload information for type " << name << std::endl; - - // - // Are the math functions overloaded for type T, - // or do we just get double versions? - // - bool r = is_same_type(std::fabs(T(0)), T(0)); - r &= is_same_type(std::sqrt(T(0)), T(0)); - r &= is_same_type(std::sin(T(0)), T(0)); - if(r) - std::cout << "The Math functions are overloaded for type " << name << std::endl; - else - std::cout << "CAUTION: The Math functions are NOT overloaded for type " << name << std::endl; - - // - // Check that a few of the functions work OK, we do this because if these - // are implemented as double precision internally then we can get - // overflow or underflow when passing arguments of other types. - // - r = (std::fabs((std::numeric_limits::max)()) == (std::numeric_limits::max)()); - r &= (std::fabs(-(std::numeric_limits::max)()) == (std::numeric_limits::max)()); - r &= (std::fabs((std::numeric_limits::min)()) == (std::numeric_limits::min)()); - r &= (std::fabs(-(std::numeric_limits::min)()) == (std::numeric_limits::min)()); - if(r) - std::cout << "std::fabs looks OK for type " << name << std::endl; - else - std::cout << "CAUTION: std::fabs is broken for type " << name << std::endl; - - // - // abs not overloaded for real arguments with VC6 (and others?) - // - r = (std::abs((std::numeric_limits::max)()) == (std::numeric_limits::max)()); - r &= (std::abs(-(std::numeric_limits::max)()) == (std::numeric_limits::max)()); - r &= (std::abs((std::numeric_limits::min)()) == (std::numeric_limits::min)()); - r &= (std::abs(-(std::numeric_limits::min)()) == (std::numeric_limits::min)()); - if(r) - std::cout << "std::abs looks OK for type " << name << std::endl; - else - std::cout << "CAUTION: std::abs is broken for type " << name << std::endl; - - // - // std::sqrt on FreeBSD converts long double arguments to double leading to - // overflow/underflow: - // - r = (std::sqrt((std::numeric_limits::max)()) < (std::numeric_limits::max)()); - if(r) - std::cout << "std::sqrt looks OK for type " << name << std::endl; - else - std::cout << "CAUTION: std::sqrt is broken for type " << name << std::endl; - - // - // Sanity check for atan2: verify that it returns arguments in the correct - // range and not just atan(x/y). - // - static const T half_pi = static_cast(1.57079632679489661923132169163975144L); - - T val = std::atan2(T(-1), T(-1)); - r = -half_pi > val; - val = std::atan2(T(1), T(-1)); - r &= half_pi < val; - val = std::atan2(T(1), T(1)); - r &= (val > 0) && (val < half_pi); - val = std::atan2(T(-1), T(1)); - r &= (val < 0) && (val > -half_pi); - if(r) - std::cout << "std::atan2 looks OK for type " << name << std::endl; - else - std::cout << "CAUTION: std::atan2 is broken for type " << name << std::endl; -} - - - -int main() -{ - // - // Start by printing the values of the macros from float.h - // - std::cout << - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" - "Macros from " << std::endl; - -#ifdef __BORLANDC__ - // Turn off hardware exceptions so we don't just abort - // when calling numeric_limits members. - _control87(MCW_EM,MCW_EM); -#endif - - PRINT_EXPRESSION(HUGE_VAL); -#ifdef HUGE_VALF - PRINT_EXPRESSION(HUGE_VALF); -#endif -#ifdef HUGE_VALL - PRINT_EXPRESSION(HUGE_VALL); -#endif -#ifdef INFINITY - PRINT_EXPRESSION(INFINITY); -#endif - - PRINT_MACRO(NAN); - PRINT_MACRO(FP_INFINITE); - PRINT_MACRO(FP_NAN); - PRINT_MACRO(FP_NORMAL); - PRINT_MACRO(FP_SUBNORMAL); - PRINT_MACRO(FP_ZERO); - PRINT_MACRO(FP_FAST_FMA); - PRINT_MACRO(FP_FAST_FMAF); - PRINT_MACRO(FP_FAST_FMAL); - PRINT_MACRO(FP_ILOGB0); - PRINT_MACRO(FP_ILOGBNAN); - PRINT_MACRO(MATH_ERRNO); - PRINT_MACRO(MATH_ERREXCEPT); - - PRINT_EXPRESSION(FLT_MIN_10_EXP); - PRINT_EXPRESSION(FLT_DIG); - PRINT_EXPRESSION(FLT_MIN_EXP); - PRINT_EXPRESSION(FLT_EPSILON); - PRINT_EXPRESSION(FLT_RADIX); - PRINT_EXPRESSION(FLT_MANT_DIG); - PRINT_EXPRESSION(FLT_ROUNDS); - PRINT_EXPRESSION(FLT_MAX); - PRINT_EXPRESSION(FLT_MAX_10_EXP); - PRINT_EXPRESSION(FLT_MAX_EXP); - PRINT_EXPRESSION(FLT_MIN); - PRINT_EXPRESSION(DBL_DIG); - PRINT_EXPRESSION(DBL_MIN_EXP); - PRINT_EXPRESSION(DBL_EPSILON); - PRINT_EXPRESSION(DBL_MANT_DIG); - PRINT_EXPRESSION(DBL_MAX); - PRINT_EXPRESSION(DBL_MIN); - PRINT_EXPRESSION(DBL_MAX_10_EXP); - PRINT_EXPRESSION(DBL_MAX_EXP); - PRINT_EXPRESSION(DBL_MIN_10_EXP); - PRINT_EXPRESSION(LDBL_MAX_10_EXP); - PRINT_EXPRESSION(LDBL_MAX_EXP); - PRINT_EXPRESSION(LDBL_MIN); - PRINT_EXPRESSION(LDBL_MIN_10_EXP); - PRINT_EXPRESSION(LDBL_DIG); - PRINT_EXPRESSION(LDBL_MIN_EXP); - PRINT_EXPRESSION(LDBL_EPSILON); - PRINT_EXPRESSION(LDBL_MANT_DIG); - PRINT_EXPRESSION(LDBL_MAX); - - std::cout << std::endl; - - // - // print out numeric_limits info: - // - print_limits(float(0), "float"); - print_limits(double(0), "double"); - print_limits((long double)(0), "long double"); - - // - // print out function overload information: - // - test_overloads(float(0), "float"); - test_overloads(double(0), "double"); - test_overloads((long double)(0), "long double"); - return 0; -} - - - - diff --git a/libs/config/test/no_adl_barrier_fail.cpp b/libs/config/test/no_adl_barrier_fail.cpp deleted file mode 100644 index a21e0b3b6..000000000 --- a/libs/config/test/no_adl_barrier_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Mar 28 16:52:13 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 40184 2007-10-19 12:46:54Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_ADL_BARRIER -// This file should not compile, if it does then -// BOOST_NO_ADL_BARRIER should not be defined. -// See file boost_no_adl_barrier.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_ADL_BARRIER -#include "boost_no_adl_barrier.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_adl_barrier::test(); -} - diff --git a/libs/config/test/no_adl_barrier_pass.cpp b/libs/config/test/no_adl_barrier_pass.cpp deleted file mode 100644 index 39bef3fb4..000000000 --- a/libs/config/test/no_adl_barrier_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Mar 28 16:52:13 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 40184 2007-10-19 12:46:54Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_ADL_BARRIER -// This file should compile, if it does not then -// BOOST_NO_ADL_BARRIER should be defined. -// See file boost_no_adl_barrier.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_ADL_BARRIER -#include "boost_no_adl_barrier.ipp" -#else -namespace boost_no_adl_barrier = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_adl_barrier::test(); -} - diff --git a/libs/config/test/no_arg_dep_lookup_fail.cpp b/libs/config/test/no_arg_dep_lookup_fail.cpp deleted file mode 100644 index 7733f87b0..000000000 --- a/libs/config/test/no_arg_dep_lookup_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -// This file should not compile, if it does then -// BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP should not be defined. -// See file boost_no_arg_dep_lookup.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -#include "boost_no_arg_dep_lookup.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_argument_dependent_lookup::test(); -} - diff --git a/libs/config/test/no_arg_dep_lookup_pass.cpp b/libs/config/test/no_arg_dep_lookup_pass.cpp deleted file mode 100644 index 1a8d7a7b8..000000000 --- a/libs/config/test/no_arg_dep_lookup_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -// This file should compile, if it does not then -// BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP should be defined. -// See file boost_no_arg_dep_lookup.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP -#include "boost_no_arg_dep_lookup.ipp" -#else -namespace boost_no_argument_dependent_lookup = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_argument_dependent_lookup::test(); -} - diff --git a/libs/config/test/no_array_type_spec_fail.cpp b/libs/config/test/no_array_type_spec_fail.cpp deleted file mode 100644 index 9299736e0..000000000 --- a/libs/config/test/no_array_type_spec_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS -// This file should not compile, if it does then -// BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS should not be defined. -// See file boost_no_array_type_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS -#include "boost_no_array_type_spec.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_array_type_specializations::test(); -} - diff --git a/libs/config/test/no_array_type_spec_pass.cpp b/libs/config/test/no_array_type_spec_pass.cpp deleted file mode 100644 index 75ab43404..000000000 --- a/libs/config/test/no_array_type_spec_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS -// This file should compile, if it does not then -// BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS should be defined. -// See file boost_no_array_type_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS -#include "boost_no_array_type_spec.ipp" -#else -namespace boost_no_array_type_specializations = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_array_type_specializations::test(); -} - diff --git a/libs/config/test/no_auto_declarations_fail.cpp b/libs/config/test/no_auto_declarations_fail.cpp deleted file mode 100644 index 8f770df7f..000000000 --- a/libs/config/test/no_auto_declarations_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Mar 12 17:32:04 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_AUTO_DECLARATIONS -// This file should not compile, if it does then -// BOOST_NO_CXX11_AUTO_DECLARATIONS should not be defined. -// See file boost_no_auto_declarations.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_AUTO_DECLARATIONS -#include "boost_no_auto_declarations.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_auto_declarations::test(); -} - diff --git a/libs/config/test/no_auto_declarations_pass.cpp b/libs/config/test/no_auto_declarations_pass.cpp deleted file mode 100644 index b901aaff7..000000000 --- a/libs/config/test/no_auto_declarations_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Mar 12 17:32:04 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_AUTO_DECLARATIONS -// This file should compile, if it does not then -// BOOST_NO_CXX11_AUTO_DECLARATIONS should be defined. -// See file boost_no_auto_declarations.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_AUTO_DECLARATIONS -#include "boost_no_auto_declarations.ipp" -#else -namespace boost_no_cxx11_auto_declarations = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_auto_declarations::test(); -} - diff --git a/libs/config/test/no_auto_multidecl_fail.cpp b/libs/config/test/no_auto_multidecl_fail.cpp deleted file mode 100644 index 664644739..000000000 --- a/libs/config/test/no_auto_multidecl_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Mar 12 17:32:04 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS -// This file should not compile, if it does then -// BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS should not be defined. -// See file boost_no_auto_multidecl.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS -#include "boost_no_auto_multidecl.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_auto_multideclarations::test(); -} - diff --git a/libs/config/test/no_auto_multidecl_pass.cpp b/libs/config/test/no_auto_multidecl_pass.cpp deleted file mode 100644 index b2071ea64..000000000 --- a/libs/config/test/no_auto_multidecl_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Mar 12 17:32:04 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS -// This file should compile, if it does not then -// BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS should be defined. -// See file boost_no_auto_multidecl.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_AUTO_MULTIDECLARATIONS -#include "boost_no_auto_multidecl.ipp" -#else -namespace boost_no_cxx11_auto_multideclarations = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_auto_multideclarations::test(); -} - diff --git a/libs/config/test/no_auto_ptr_fail.cpp b/libs/config/test/no_auto_ptr_fail.cpp deleted file mode 100644 index da64bb92c..000000000 --- a/libs/config/test/no_auto_ptr_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_AUTO_PTR -// This file should not compile, if it does then -// BOOST_NO_AUTO_PTR should not be defined. -// See file boost_no_auto_ptr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_AUTO_PTR -#include "boost_no_auto_ptr.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_auto_ptr::test(); -} - diff --git a/libs/config/test/no_auto_ptr_pass.cpp b/libs/config/test/no_auto_ptr_pass.cpp deleted file mode 100644 index 3a978a744..000000000 --- a/libs/config/test/no_auto_ptr_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:00 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_AUTO_PTR -// This file should compile, if it does not then -// BOOST_NO_AUTO_PTR should be defined. -// See file boost_no_auto_ptr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_AUTO_PTR -#include "boost_no_auto_ptr.ipp" -#else -namespace boost_no_auto_ptr = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_auto_ptr::test(); -} - diff --git a/libs/config/test/no_bcb_partial_spec_fail.cpp b/libs/config/test/no_bcb_partial_spec_fail.cpp deleted file mode 100644 index c19747bdd..000000000 --- a/libs/config/test/no_bcb_partial_spec_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_BCB_PARTIAL_SPECIALIZATION_BUG -// This file should not compile, if it does then -// BOOST_BCB_PARTIAL_SPECIALIZATION_BUG should not be defined. -// See file boost_no_bcb_partial_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_BCB_PARTIAL_SPECIALIZATION_BUG -#include "boost_no_bcb_partial_spec.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_bcb_partial_specialization_bug::test(); -} - diff --git a/libs/config/test/no_bcb_partial_spec_pass.cpp b/libs/config/test/no_bcb_partial_spec_pass.cpp deleted file mode 100644 index a6605bc85..000000000 --- a/libs/config/test/no_bcb_partial_spec_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_BCB_PARTIAL_SPECIALIZATION_BUG -// This file should compile, if it does not then -// BOOST_BCB_PARTIAL_SPECIALIZATION_BUG should be defined. -// See file boost_no_bcb_partial_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_BCB_PARTIAL_SPECIALIZATION_BUG -#include "boost_no_bcb_partial_spec.ipp" -#else -namespace boost_bcb_partial_specialization_bug = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_bcb_partial_specialization_bug::test(); -} - diff --git a/libs/config/test/no_char16_t_fail.cpp b/libs/config/test/no_char16_t_fail.cpp deleted file mode 100644 index 63ddf7ac9..000000000 --- a/libs/config/test/no_char16_t_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 09:24:04 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_CHAR16_T -// This file should not compile, if it does then -// BOOST_NO_CXX11_CHAR16_T should not be defined. -// See file boost_no_char16_t.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_CHAR16_T -#include "boost_no_char16_t.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_char16_t::test(); -} - diff --git a/libs/config/test/no_char16_t_pass.cpp b/libs/config/test/no_char16_t_pass.cpp deleted file mode 100644 index b714f0983..000000000 --- a/libs/config/test/no_char16_t_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 09:24:04 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_CHAR16_T -// This file should compile, if it does not then -// BOOST_NO_CXX11_CHAR16_T should be defined. -// See file boost_no_char16_t.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_CHAR16_T -#include "boost_no_char16_t.ipp" -#else -namespace boost_no_cxx11_char16_t = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_char16_t::test(); -} - diff --git a/libs/config/test/no_char32_t_fail.cpp b/libs/config/test/no_char32_t_fail.cpp deleted file mode 100644 index 868050eea..000000000 --- a/libs/config/test/no_char32_t_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 09:24:04 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_CHAR32_T -// This file should not compile, if it does then -// BOOST_NO_CXX11_CHAR32_T should not be defined. -// See file boost_no_char32_t.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_CHAR32_T -#include "boost_no_char32_t.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_char32_t::test(); -} - diff --git a/libs/config/test/no_char32_t_pass.cpp b/libs/config/test/no_char32_t_pass.cpp deleted file mode 100644 index 4bb7d5f31..000000000 --- a/libs/config/test/no_char32_t_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 09:24:04 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_CHAR32_T -// This file should compile, if it does not then -// BOOST_NO_CXX11_CHAR32_T should be defined. -// See file boost_no_char32_t.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_CHAR32_T -#include "boost_no_char32_t.ipp" -#else -namespace boost_no_cxx11_char32_t = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_char32_t::test(); -} - diff --git a/libs/config/test/no_com_value_init_fail.cpp b/libs/config/test/no_com_value_init_fail.cpp deleted file mode 100644 index ec89a8581..000000000 --- a/libs/config/test/no_com_value_init_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Apr 09 12:24:53 2010 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 49281 2008-10-11 15:40:44Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_COMPLETE_VALUE_INITIALIZATION -// This file should not compile, if it does then -// BOOST_NO_COMPLETE_VALUE_INITIALIZATION should not be defined. -// See file boost_no_com_value_init.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_COMPLETE_VALUE_INITIALIZATION -#include "boost_no_com_value_init.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_complete_value_initialization::test(); -} - diff --git a/libs/config/test/no_com_value_init_pass.cpp b/libs/config/test/no_com_value_init_pass.cpp deleted file mode 100644 index cfe00a22a..000000000 --- a/libs/config/test/no_com_value_init_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Apr 09 12:24:53 2010 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 49281 2008-10-11 15:40:44Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_COMPLETE_VALUE_INITIALIZATION -// This file should compile, if it does not then -// BOOST_NO_COMPLETE_VALUE_INITIALIZATION should be defined. -// See file boost_no_com_value_init.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_COMPLETE_VALUE_INITIALIZATION -#include "boost_no_com_value_init.ipp" -#else -namespace boost_no_complete_value_initialization = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_complete_value_initialization::test(); -} - diff --git a/libs/config/test/no_constexpr_fail.cpp b/libs/config/test/no_constexpr_fail.cpp deleted file mode 100644 index 0f1163c40..000000000 --- a/libs/config/test/no_constexpr_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Jun 19 16:26:16 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_CONSTEXPR -// This file should not compile, if it does then -// BOOST_NO_CXX11_CONSTEXPR should not be defined. -// See file boost_no_constexpr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_CONSTEXPR -#include "boost_no_constexpr.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_constexpr::test(); -} - diff --git a/libs/config/test/no_constexpr_pass.cpp b/libs/config/test/no_constexpr_pass.cpp deleted file mode 100644 index fbacd360a..000000000 --- a/libs/config/test/no_constexpr_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Jun 19 16:26:16 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_CONSTEXPR -// This file should compile, if it does not then -// BOOST_NO_CXX11_CONSTEXPR should be defined. -// See file boost_no_constexpr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_CONSTEXPR -#include "boost_no_constexpr.ipp" -#else -namespace boost_no_cxx11_constexpr = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_constexpr::test(); -} - diff --git a/libs/config/test/no_ctype_functions_fail.cpp b/libs/config/test/no_ctype_functions_fail.cpp deleted file mode 100644 index 5379c7d18..000000000 --- a/libs/config/test/no_ctype_functions_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_CTYPE_FUNCTIONS -// This file should not compile, if it does then -// BOOST_NO_CTYPE_FUNCTIONS should not be defined. -// See file boost_no_ctype_functions.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CTYPE_FUNCTIONS -#include "boost_no_ctype_functions.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_ctype_functions::test(); -} - diff --git a/libs/config/test/no_ctype_functions_pass.cpp b/libs/config/test/no_ctype_functions_pass.cpp deleted file mode 100644 index 64e285fa1..000000000 --- a/libs/config/test/no_ctype_functions_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_CTYPE_FUNCTIONS -// This file should compile, if it does not then -// BOOST_NO_CTYPE_FUNCTIONS should be defined. -// See file boost_no_ctype_functions.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CTYPE_FUNCTIONS -#include "boost_no_ctype_functions.ipp" -#else -namespace boost_no_ctype_functions = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_ctype_functions::test(); -} - diff --git a/libs/config/test/no_cv_spec_fail.cpp b/libs/config/test/no_cv_spec_fail.cpp deleted file mode 100644 index 8b2658fd1..000000000 --- a/libs/config/test/no_cv_spec_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_CV_SPECIALIZATIONS -// This file should not compile, if it does then -// BOOST_NO_CV_SPECIALIZATIONS should not be defined. -// See file boost_no_cv_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CV_SPECIALIZATIONS -#include "boost_no_cv_spec.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cv_specializations::test(); -} - diff --git a/libs/config/test/no_cv_spec_pass.cpp b/libs/config/test/no_cv_spec_pass.cpp deleted file mode 100644 index 310c4efdb..000000000 --- a/libs/config/test/no_cv_spec_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_CV_SPECIALIZATIONS -// This file should compile, if it does not then -// BOOST_NO_CV_SPECIALIZATIONS should be defined. -// See file boost_no_cv_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CV_SPECIALIZATIONS -#include "boost_no_cv_spec.ipp" -#else -namespace boost_no_cv_specializations = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cv_specializations::test(); -} - diff --git a/libs/config/test/no_cv_void_spec_fail.cpp b/libs/config/test/no_cv_void_spec_fail.cpp deleted file mode 100644 index 0608d56b3..000000000 --- a/libs/config/test/no_cv_void_spec_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_CV_VOID_SPECIALIZATIONS -// This file should not compile, if it does then -// BOOST_NO_CV_VOID_SPECIALIZATIONS should not be defined. -// See file boost_no_cv_void_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CV_VOID_SPECIALIZATIONS -#include "boost_no_cv_void_spec.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cv_void_specializations::test(); -} - diff --git a/libs/config/test/no_cv_void_spec_pass.cpp b/libs/config/test/no_cv_void_spec_pass.cpp deleted file mode 100644 index 7eac2959a..000000000 --- a/libs/config/test/no_cv_void_spec_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_CV_VOID_SPECIALIZATIONS -// This file should compile, if it does not then -// BOOST_NO_CV_VOID_SPECIALIZATIONS should be defined. -// See file boost_no_cv_void_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS -#include "boost_no_cv_void_spec.ipp" -#else -namespace boost_no_cv_void_specializations = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cv_void_specializations::test(); -} - diff --git a/libs/config/test/no_cwchar_fail.cpp b/libs/config/test/no_cwchar_fail.cpp deleted file mode 100644 index e49e9837c..000000000 --- a/libs/config/test/no_cwchar_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_CWCHAR -// This file should not compile, if it does then -// BOOST_NO_CWCHAR should not be defined. -// See file boost_no_cwchar.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CWCHAR -#include "boost_no_cwchar.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cwchar::test(); -} - diff --git a/libs/config/test/no_cwchar_pass.cpp b/libs/config/test/no_cwchar_pass.cpp deleted file mode 100644 index ae82820f3..000000000 --- a/libs/config/test/no_cwchar_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_CWCHAR -// This file should compile, if it does not then -// BOOST_NO_CWCHAR should be defined. -// See file boost_no_cwchar.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CWCHAR -#include "boost_no_cwchar.ipp" -#else -namespace boost_no_cwchar = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cwchar::test(); -} - diff --git a/libs/config/test/no_cwctype_fail.cpp b/libs/config/test/no_cwctype_fail.cpp deleted file mode 100644 index 85bdcbc94..000000000 --- a/libs/config/test/no_cwctype_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_CWCTYPE -// This file should not compile, if it does then -// BOOST_NO_CWCTYPE should not be defined. -// See file boost_no_cwctype.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CWCTYPE -#include "boost_no_cwctype.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cwctype::test(); -} - diff --git a/libs/config/test/no_cwctype_pass.cpp b/libs/config/test/no_cwctype_pass.cpp deleted file mode 100644 index 1cb1c4bec..000000000 --- a/libs/config/test/no_cwctype_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_CWCTYPE -// This file should compile, if it does not then -// BOOST_NO_CWCTYPE should be defined. -// See file boost_no_cwctype.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CWCTYPE -#include "boost_no_cwctype.ipp" -#else -namespace boost_no_cwctype = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cwctype::test(); -} - diff --git a/libs/config/test/no_cxx11_addressof_fail.cpp b/libs/config/test/no_cxx11_addressof_fail.cpp deleted file mode 100644 index 9216b5eff..000000000 --- a/libs/config/test/no_cxx11_addressof_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Tue Feb 11 17:12:27 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_ADDRESSOF -// This file should not compile, if it does then -// BOOST_NO_CXX11_ADDRESSOF should not be defined. -// See file boost_no_cxx11_addressof.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_ADDRESSOF -#include "boost_no_cxx11_addressof.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_addressof::test(); -} - diff --git a/libs/config/test/no_cxx11_addressof_pass.cpp b/libs/config/test/no_cxx11_addressof_pass.cpp deleted file mode 100644 index e4e84abc1..000000000 --- a/libs/config/test/no_cxx11_addressof_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Tue Feb 11 17:12:27 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_ADDRESSOF -// This file should compile, if it does not then -// BOOST_NO_CXX11_ADDRESSOF should be defined. -// See file boost_no_cxx11_addressof.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_ADDRESSOF -#include "boost_no_cxx11_addressof.ipp" -#else -namespace boost_no_cxx11_addressof = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_addressof::test(); -} - diff --git a/libs/config/test/no_cxx11_alignas_fail.cpp b/libs/config/test/no_cxx11_alignas_fail.cpp deleted file mode 100644 index 767aaa34d..000000000 --- a/libs/config/test/no_cxx11_alignas_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 28 18:36:48 2013 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_ALIGNAS -// This file should not compile, if it does then -// BOOST_NO_CXX11_ALIGNAS should not be defined. -// See file boost_no_cxx11_alignas.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_ALIGNAS -#include "boost_no_cxx11_alignas.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_alignas::test(); -} - diff --git a/libs/config/test/no_cxx11_alignas_pass.cpp b/libs/config/test/no_cxx11_alignas_pass.cpp deleted file mode 100644 index b8b84b935..000000000 --- a/libs/config/test/no_cxx11_alignas_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 28 18:36:48 2013 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_ALIGNAS -// This file should compile, if it does not then -// BOOST_NO_CXX11_ALIGNAS should be defined. -// See file boost_no_cxx11_alignas.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_ALIGNAS -#include "boost_no_cxx11_alignas.ipp" -#else -namespace boost_no_cxx11_alignas = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_alignas::test(); -} - diff --git a/libs/config/test/no_cxx11_allocator_fail.cpp b/libs/config/test/no_cxx11_allocator_fail.cpp deleted file mode 100644 index 0fdb14be6..000000000 --- a/libs/config/test/no_cxx11_allocator_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 22 11:15:42 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 72327 2011-06-01 14:51:03Z eric_niebler $ -// - - -// Test file for macro BOOST_NO_CXX11_ALLOCATOR -// This file should not compile, if it does then -// BOOST_NO_CXX11_ALLOCATOR should not be defined. -// See file boost_no_cxx11_allocator.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_ALLOCATOR -#include "boost_no_cxx11_allocator.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_allocator::test(); -} - diff --git a/libs/config/test/no_cxx11_allocator_pass.cpp b/libs/config/test/no_cxx11_allocator_pass.cpp deleted file mode 100644 index 20a4d63b4..000000000 --- a/libs/config/test/no_cxx11_allocator_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 22 11:15:42 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 72327 2011-06-01 14:51:03Z eric_niebler $ -// - - -// Test file for macro BOOST_NO_CXX11_ALLOCATOR -// This file should compile, if it does not then -// BOOST_NO_CXX11_ALLOCATOR should be defined. -// See file boost_no_cxx11_allocator.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_ALLOCATOR -#include "boost_no_cxx11_allocator.ipp" -#else -namespace boost_no_cxx11_allocator = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_allocator::test(); -} - diff --git a/libs/config/test/no_cxx11_atomic_sp_fail.cpp b/libs/config/test/no_cxx11_atomic_sp_fail.cpp deleted file mode 100644 index 9c8a62024..000000000 --- a/libs/config/test/no_cxx11_atomic_sp_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 22 11:15:42 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 72327 2011-06-01 14:51:03Z eric_niebler $ -// - - -// Test file for macro BOOST_NO_CXX11_ATOMIC_SMART_PTR -// This file should not compile, if it does then -// BOOST_NO_CXX11_ATOMIC_SMART_PTR should not be defined. -// See file boost_no_cxx11_atomic_sp.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_ATOMIC_SMART_PTR -#include "boost_no_cxx11_atomic_sp.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_atomic_smart_ptr::test(); -} - diff --git a/libs/config/test/no_cxx11_atomic_sp_pass.cpp b/libs/config/test/no_cxx11_atomic_sp_pass.cpp deleted file mode 100644 index 5b7b1719b..000000000 --- a/libs/config/test/no_cxx11_atomic_sp_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 22 11:15:42 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 72327 2011-06-01 14:51:03Z eric_niebler $ -// - - -// Test file for macro BOOST_NO_CXX11_ATOMIC_SMART_PTR -// This file should compile, if it does not then -// BOOST_NO_CXX11_ATOMIC_SMART_PTR should be defined. -// See file boost_no_cxx11_atomic_sp.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_ATOMIC_SMART_PTR -#include "boost_no_cxx11_atomic_sp.ipp" -#else -namespace boost_no_cxx11_atomic_smart_ptr = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_atomic_smart_ptr::test(); -} - diff --git a/libs/config/test/no_cxx11_final_fail.cpp b/libs/config/test/no_cxx11_final_fail.cpp deleted file mode 100644 index 50c35a207..000000000 --- a/libs/config/test/no_cxx11_final_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Aug 15 15:51:00 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_FINAL -// This file should not compile, if it does then -// BOOST_NO_CXX11_FINAL should not be defined. -// See file boost_no_cxx11_final.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_FINAL -#include "boost_no_cxx11_final.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_final::test(); -} - diff --git a/libs/config/test/no_cxx11_final_pass.cpp b/libs/config/test/no_cxx11_final_pass.cpp deleted file mode 100644 index e18530bd4..000000000 --- a/libs/config/test/no_cxx11_final_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Aug 15 15:51:00 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_FINAL -// This file should compile, if it does not then -// BOOST_NO_CXX11_FINAL should be defined. -// See file boost_no_cxx11_final.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_FINAL -#include "boost_no_cxx11_final.ipp" -#else -namespace boost_no_cxx11_final = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_final::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_array_fail.cpp b/libs/config/test/no_cxx11_hdr_array_fail.cpp deleted file mode 100644 index 766c0f586..000000000 --- a/libs/config/test/no_cxx11_hdr_array_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 12:10:32 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_ARRAY -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_ARRAY should not be defined. -// See file boost_no_cxx11_hdr_array.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_ARRAY -#include "boost_no_cxx11_hdr_array.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_array::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_array_pass.cpp b/libs/config/test/no_cxx11_hdr_array_pass.cpp deleted file mode 100644 index 493840542..000000000 --- a/libs/config/test/no_cxx11_hdr_array_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 12:10:32 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_ARRAY -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_ARRAY should be defined. -// See file boost_no_cxx11_hdr_array.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_ARRAY -#include "boost_no_cxx11_hdr_array.ipp" -#else -namespace boost_no_cxx11_hdr_array = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_array::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_atomic_fail.cpp b/libs/config/test/no_cxx11_hdr_atomic_fail.cpp deleted file mode 100644 index cb6bd124e..000000000 --- a/libs/config/test/no_cxx11_hdr_atomic_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Dec 12 19:07:12 2013 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_ATOMIC -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_ATOMIC should not be defined. -// See file boost_no_cxx11_hdr_atomic.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_ATOMIC -#include "boost_no_cxx11_hdr_atomic.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_atomic::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_atomic_pass.cpp b/libs/config/test/no_cxx11_hdr_atomic_pass.cpp deleted file mode 100644 index 7258f646b..000000000 --- a/libs/config/test/no_cxx11_hdr_atomic_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Dec 12 19:07:12 2013 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_ATOMIC -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_ATOMIC should be defined. -// See file boost_no_cxx11_hdr_atomic.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_ATOMIC -#include "boost_no_cxx11_hdr_atomic.ipp" -#else -namespace boost_no_cxx11_hdr_atomic = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_atomic::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_chrono_fail.cpp b/libs/config/test/no_cxx11_hdr_chrono_fail.cpp deleted file mode 100644 index d1ac76e0b..000000000 --- a/libs/config/test/no_cxx11_hdr_chrono_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_CHRONO -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_CHRONO should not be defined. -// See file boost_no_cxx11_hdr_chrono.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_CHRONO -#include "boost_no_cxx11_hdr_chrono.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_chrono::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_chrono_pass.cpp b/libs/config/test/no_cxx11_hdr_chrono_pass.cpp deleted file mode 100644 index 3bc1af88a..000000000 --- a/libs/config/test/no_cxx11_hdr_chrono_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_CHRONO -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_CHRONO should be defined. -// See file boost_no_cxx11_hdr_chrono.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_CHRONO -#include "boost_no_cxx11_hdr_chrono.ipp" -#else -namespace boost_no_cxx11_hdr_chrono = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_chrono::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_codecvt_fail.cpp b/libs/config/test/no_cxx11_hdr_codecvt_fail.cpp deleted file mode 100644 index 041fd0a2d..000000000 --- a/libs/config/test/no_cxx11_hdr_codecvt_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_CODECVT -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_CODECVT should not be defined. -// See file boost_no_cxx11_hdr_codecvt.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_CODECVT -#include "boost_no_cxx11_hdr_codecvt.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_codecvt::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_codecvt_pass.cpp b/libs/config/test/no_cxx11_hdr_codecvt_pass.cpp deleted file mode 100644 index 241a38d44..000000000 --- a/libs/config/test/no_cxx11_hdr_codecvt_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_CODECVT -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_CODECVT should be defined. -// See file boost_no_cxx11_hdr_codecvt.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_CODECVT -#include "boost_no_cxx11_hdr_codecvt.ipp" -#else -namespace boost_no_cxx11_hdr_codecvt = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_codecvt::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_condition_variable_fail.cpp b/libs/config/test/no_cxx11_hdr_condition_variable_fail.cpp deleted file mode 100644 index f34cd377c..000000000 --- a/libs/config/test/no_cxx11_hdr_condition_variable_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_CONDITION_VARIABLE -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_CONDITION_VARIABLE should not be defined. -// See file boost_no_cxx11_hdr_condition_variable.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_CONDITION_VARIABLE -#include "boost_no_cxx11_hdr_condition_variable.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_condition_variable::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_condition_variable_pass.cpp b/libs/config/test/no_cxx11_hdr_condition_variable_pass.cpp deleted file mode 100644 index 017084bbb..000000000 --- a/libs/config/test/no_cxx11_hdr_condition_variable_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_CONDITION_VARIABLE -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_CONDITION_VARIABLE should be defined. -// See file boost_no_cxx11_hdr_condition_variable.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_CONDITION_VARIABLE -#include "boost_no_cxx11_hdr_condition_variable.ipp" -#else -namespace boost_no_cxx11_hdr_condition_variable = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_condition_variable::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_forward_list_fail.cpp b/libs/config/test/no_cxx11_hdr_forward_list_fail.cpp deleted file mode 100644 index 9a1205d41..000000000 --- a/libs/config/test/no_cxx11_hdr_forward_list_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_FORWARD_LIST -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_FORWARD_LIST should not be defined. -// See file boost_no_cxx11_hdr_forward_list.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_FORWARD_LIST -#include "boost_no_cxx11_hdr_forward_list.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_forward_list::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_forward_list_pass.cpp b/libs/config/test/no_cxx11_hdr_forward_list_pass.cpp deleted file mode 100644 index 3e8b55b59..000000000 --- a/libs/config/test/no_cxx11_hdr_forward_list_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_FORWARD_LIST -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_FORWARD_LIST should be defined. -// See file boost_no_cxx11_hdr_forward_list.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_FORWARD_LIST -#include "boost_no_cxx11_hdr_forward_list.ipp" -#else -namespace boost_no_cxx11_hdr_forward_list = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_forward_list::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_future_fail.cpp b/libs/config/test/no_cxx11_hdr_future_fail.cpp deleted file mode 100644 index 7640f9d36..000000000 --- a/libs/config/test/no_cxx11_hdr_future_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_FUTURE -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_FUTURE should not be defined. -// See file boost_no_cxx11_hdr_future.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_FUTURE -#include "boost_no_cxx11_hdr_future.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_future::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_future_pass.cpp b/libs/config/test/no_cxx11_hdr_future_pass.cpp deleted file mode 100644 index ec169526d..000000000 --- a/libs/config/test/no_cxx11_hdr_future_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_FUTURE -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_FUTURE should be defined. -// See file boost_no_cxx11_hdr_future.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_FUTURE -#include "boost_no_cxx11_hdr_future.ipp" -#else -namespace boost_no_cxx11_hdr_future = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_future::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_initializer_list_fail.cpp b/libs/config/test/no_cxx11_hdr_initializer_list_fail.cpp deleted file mode 100644 index 6dfe099e1..000000000 --- a/libs/config/test/no_cxx11_hdr_initializer_list_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_INITIALIZER_LIST -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_INITIALIZER_LIST should not be defined. -// See file boost_no_cxx11_hdr_initializer_list.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_INITIALIZER_LIST -#include "boost_no_cxx11_hdr_initializer_list.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_initializer_list::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_initializer_list_pass.cpp b/libs/config/test/no_cxx11_hdr_initializer_list_pass.cpp deleted file mode 100644 index 2a7153905..000000000 --- a/libs/config/test/no_cxx11_hdr_initializer_list_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_INITIALIZER_LIST -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_INITIALIZER_LIST should be defined. -// See file boost_no_cxx11_hdr_initializer_list.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST -#include "boost_no_cxx11_hdr_initializer_list.ipp" -#else -namespace boost_no_cxx11_hdr_initializer_list = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_initializer_list::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_mutex_fail.cpp b/libs/config/test/no_cxx11_hdr_mutex_fail.cpp deleted file mode 100644 index 87432ec95..000000000 --- a/libs/config/test/no_cxx11_hdr_mutex_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_MUTEX -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_MUTEX should not be defined. -// See file boost_no_cxx11_hdr_mutex.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_MUTEX -#include "boost_no_cxx11_hdr_mutex.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_mutex::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_mutex_pass.cpp b/libs/config/test/no_cxx11_hdr_mutex_pass.cpp deleted file mode 100644 index a912b2cad..000000000 --- a/libs/config/test/no_cxx11_hdr_mutex_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_MUTEX -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_MUTEX should be defined. -// See file boost_no_cxx11_hdr_mutex.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_MUTEX -#include "boost_no_cxx11_hdr_mutex.ipp" -#else -namespace boost_no_cxx11_hdr_mutex = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_mutex::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_random_fail.cpp b/libs/config/test/no_cxx11_hdr_random_fail.cpp deleted file mode 100644 index e4ed0f8e7..000000000 --- a/libs/config/test/no_cxx11_hdr_random_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_RANDOM -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_RANDOM should not be defined. -// See file boost_no_cxx11_hdr_random.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_RANDOM -#include "boost_no_cxx11_hdr_random.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_random::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_random_pass.cpp b/libs/config/test/no_cxx11_hdr_random_pass.cpp deleted file mode 100644 index 7995481a2..000000000 --- a/libs/config/test/no_cxx11_hdr_random_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_RANDOM -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_RANDOM should be defined. -// See file boost_no_cxx11_hdr_random.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_RANDOM -#include "boost_no_cxx11_hdr_random.ipp" -#else -namespace boost_no_cxx11_hdr_random = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_random::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_ratio_fail.cpp b/libs/config/test/no_cxx11_hdr_ratio_fail.cpp deleted file mode 100644 index 8e15efb62..000000000 --- a/libs/config/test/no_cxx11_hdr_ratio_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_RATIO -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_RATIO should not be defined. -// See file boost_no_cxx11_hdr_ratio.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_RATIO -#include "boost_no_cxx11_hdr_ratio.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_ratio::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_ratio_pass.cpp b/libs/config/test/no_cxx11_hdr_ratio_pass.cpp deleted file mode 100644 index 8c1b2d460..000000000 --- a/libs/config/test/no_cxx11_hdr_ratio_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_RATIO -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_RATIO should be defined. -// See file boost_no_cxx11_hdr_ratio.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_RATIO -#include "boost_no_cxx11_hdr_ratio.ipp" -#else -namespace boost_no_cxx11_hdr_ratio = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_ratio::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_regex_fail.cpp b/libs/config/test/no_cxx11_hdr_regex_fail.cpp deleted file mode 100644 index 178d5b566..000000000 --- a/libs/config/test/no_cxx11_hdr_regex_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_REGEX -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_REGEX should not be defined. -// See file boost_no_cxx11_hdr_regex.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_REGEX -#include "boost_no_cxx11_hdr_regex.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_regex::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_regex_pass.cpp b/libs/config/test/no_cxx11_hdr_regex_pass.cpp deleted file mode 100644 index 6acd2e8e0..000000000 --- a/libs/config/test/no_cxx11_hdr_regex_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_REGEX -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_REGEX should be defined. -// See file boost_no_cxx11_hdr_regex.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_REGEX -#include "boost_no_cxx11_hdr_regex.ipp" -#else -namespace boost_no_cxx11_hdr_regex = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_regex::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_system_error_fail.cpp b/libs/config/test/no_cxx11_hdr_system_error_fail.cpp deleted file mode 100644 index 85bb100b0..000000000 --- a/libs/config/test/no_cxx11_hdr_system_error_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_SYSTEM_ERROR -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_SYSTEM_ERROR should not be defined. -// See file boost_no_cxx11_hdr_system_error.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_SYSTEM_ERROR -#include "boost_no_cxx11_hdr_system_error.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_system_error::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_system_error_pass.cpp b/libs/config/test/no_cxx11_hdr_system_error_pass.cpp deleted file mode 100644 index 042b52f8f..000000000 --- a/libs/config/test/no_cxx11_hdr_system_error_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_SYSTEM_ERROR -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_SYSTEM_ERROR should be defined. -// See file boost_no_cxx11_hdr_system_error.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_SYSTEM_ERROR -#include "boost_no_cxx11_hdr_system_error.ipp" -#else -namespace boost_no_cxx11_hdr_system_error = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_system_error::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_thread_fail.cpp b/libs/config/test/no_cxx11_hdr_thread_fail.cpp deleted file mode 100644 index 0e54a012b..000000000 --- a/libs/config/test/no_cxx11_hdr_thread_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 12:45:15 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_THREAD -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_THREAD should not be defined. -// See file boost_no_cxx11_hdr_thread.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_THREAD -#include "boost_no_cxx11_hdr_thread.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_thread::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_thread_pass.cpp b/libs/config/test/no_cxx11_hdr_thread_pass.cpp deleted file mode 100644 index 34313ab3d..000000000 --- a/libs/config/test/no_cxx11_hdr_thread_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 12:45:15 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_THREAD -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_THREAD should be defined. -// See file boost_no_cxx11_hdr_thread.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_THREAD -#include "boost_no_cxx11_hdr_thread.ipp" -#else -namespace boost_no_cxx11_hdr_thread = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_thread::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_tuple_fail.cpp b/libs/config/test/no_cxx11_hdr_tuple_fail.cpp deleted file mode 100644 index 655de0f66..000000000 --- a/libs/config/test/no_cxx11_hdr_tuple_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_TUPLE -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_TUPLE should not be defined. -// See file boost_no_cxx11_hdr_tuple.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_TUPLE -#include "boost_no_cxx11_hdr_tuple.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_tuple::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_tuple_pass.cpp b/libs/config/test/no_cxx11_hdr_tuple_pass.cpp deleted file mode 100644 index 505a77933..000000000 --- a/libs/config/test/no_cxx11_hdr_tuple_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_TUPLE -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_TUPLE should be defined. -// See file boost_no_cxx11_hdr_tuple.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_TUPLE -#include "boost_no_cxx11_hdr_tuple.ipp" -#else -namespace boost_no_cxx11_hdr_tuple = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_tuple::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_type_traits_fail.cpp b/libs/config/test/no_cxx11_hdr_type_traits_fail.cpp deleted file mode 100644 index 603e57e2a..000000000 --- a/libs/config/test/no_cxx11_hdr_type_traits_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_TYPE_TRAITS -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_TYPE_TRAITS should not be defined. -// See file boost_no_cxx11_hdr_type_traits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_TYPE_TRAITS -#include "boost_no_cxx11_hdr_type_traits.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_type_traits::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_type_traits_pass.cpp b/libs/config/test/no_cxx11_hdr_type_traits_pass.cpp deleted file mode 100644 index 1f57ef621..000000000 --- a/libs/config/test/no_cxx11_hdr_type_traits_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_TYPE_TRAITS -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_TYPE_TRAITS should be defined. -// See file boost_no_cxx11_hdr_type_traits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_TYPE_TRAITS -#include "boost_no_cxx11_hdr_type_traits.ipp" -#else -namespace boost_no_cxx11_hdr_type_traits = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_type_traits::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_typeindex_fail.cpp b/libs/config/test/no_cxx11_hdr_typeindex_fail.cpp deleted file mode 100644 index 3c43b7b66..000000000 --- a/libs/config/test/no_cxx11_hdr_typeindex_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Jun 04 12:51:34 2010 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 49281 2008-10-11 15:40:44Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_TYPEINDEX -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_TYPEINDEX should not be defined. -// See file boost_no_cxx11_hdr_typeindex.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_TYPEINDEX -#include "boost_no_cxx11_hdr_typeindex.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_typeindex::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_typeindex_pass.cpp b/libs/config/test/no_cxx11_hdr_typeindex_pass.cpp deleted file mode 100644 index c0d999e8e..000000000 --- a/libs/config/test/no_cxx11_hdr_typeindex_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Jun 04 12:51:34 2010 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 49281 2008-10-11 15:40:44Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_TYPEINDEX -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_TYPEINDEX should be defined. -// See file boost_no_cxx11_hdr_typeindex.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_TYPEINDEX -#include "boost_no_cxx11_hdr_typeindex.ipp" -#else -namespace boost_no_cxx11_hdr_typeindex = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_typeindex::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_unordered_map_fail.cpp b/libs/config/test/no_cxx11_hdr_unordered_map_fail.cpp deleted file mode 100644 index dad493bb2..000000000 --- a/libs/config/test/no_cxx11_hdr_unordered_map_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_UNORDERED_MAP -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_UNORDERED_MAP should not be defined. -// See file boost_no_cxx11_hdr_unordered_map.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_UNORDERED_MAP -#include "boost_no_cxx11_hdr_unordered_map.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_unordered_map::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_unordered_map_pass.cpp b/libs/config/test/no_cxx11_hdr_unordered_map_pass.cpp deleted file mode 100644 index cc30df478..000000000 --- a/libs/config/test/no_cxx11_hdr_unordered_map_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_UNORDERED_MAP -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_UNORDERED_MAP should be defined. -// See file boost_no_cxx11_hdr_unordered_map.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_UNORDERED_MAP -#include "boost_no_cxx11_hdr_unordered_map.ipp" -#else -namespace boost_no_cxx11_hdr_unordered_map = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_unordered_map::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_unordered_set_fail.cpp b/libs/config/test/no_cxx11_hdr_unordered_set_fail.cpp deleted file mode 100644 index df9e75d9e..000000000 --- a/libs/config/test/no_cxx11_hdr_unordered_set_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_UNORDERED_SET -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_UNORDERED_SET should not be defined. -// See file boost_no_cxx11_hdr_unordered_set.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_UNORDERED_SET -#include "boost_no_cxx11_hdr_unordered_set.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_unordered_set::test(); -} - diff --git a/libs/config/test/no_cxx11_hdr_unordered_set_pass.cpp b/libs/config/test/no_cxx11_hdr_unordered_set_pass.cpp deleted file mode 100644 index 97c5632a6..000000000 --- a/libs/config/test/no_cxx11_hdr_unordered_set_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri May 15 11:57:42 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_UNORDERED_SET -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_UNORDERED_SET should be defined. -// See file boost_no_cxx11_hdr_unordered_set.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_UNORDERED_SET -#include "boost_no_cxx11_hdr_unordered_set.ipp" -#else -namespace boost_no_cxx11_hdr_unordered_set = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_unordered_set::test(); -} - diff --git a/libs/config/test/no_cxx11_inline_namespaces_fail.cpp b/libs/config/test/no_cxx11_inline_namespaces_fail.cpp deleted file mode 100644 index 09ca60c8f..000000000 --- a/libs/config/test/no_cxx11_inline_namespaces_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 28 18:36:48 2013 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_INLINE_NAMESPACES -// This file should not compile, if it does then -// BOOST_NO_CXX11_INLINE_NAMESPACES should not be defined. -// See file boost_no_cxx11_inline_namespaces.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_INLINE_NAMESPACES -#include "boost_no_cxx11_inline_namespaces.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_inline_namespaces::test(); -} - diff --git a/libs/config/test/no_cxx11_inline_namespaces_pass.cpp b/libs/config/test/no_cxx11_inline_namespaces_pass.cpp deleted file mode 100644 index 4988af97b..000000000 --- a/libs/config/test/no_cxx11_inline_namespaces_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 28 18:36:48 2013 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_INLINE_NAMESPACES -// This file should compile, if it does not then -// BOOST_NO_CXX11_INLINE_NAMESPACES should be defined. -// See file boost_no_cxx11_inline_namespaces.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_INLINE_NAMESPACES -#include "boost_no_cxx11_inline_namespaces.ipp" -#else -namespace boost_no_cxx11_inline_namespaces = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_inline_namespaces::test(); -} - diff --git a/libs/config/test/no_cxx11_non_pub_def_fun_fail.cpp b/libs/config/test/no_cxx11_non_pub_def_fun_fail.cpp deleted file mode 100644 index 59f32b6cf..000000000 --- a/libs/config/test/no_cxx11_non_pub_def_fun_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Aug 22 18:33:20 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS -// This file should not compile, if it does then -// BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS should not be defined. -// See file boost_no_cxx11_non_pub_def_fun.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS -#include "boost_no_cxx11_non_pub_def_fun.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_non_public_defaulted_functions::test(); -} - diff --git a/libs/config/test/no_cxx11_non_pub_def_fun_pass.cpp b/libs/config/test/no_cxx11_non_pub_def_fun_pass.cpp deleted file mode 100644 index 2e00a6a73..000000000 --- a/libs/config/test/no_cxx11_non_pub_def_fun_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Aug 22 18:33:20 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS -// This file should compile, if it does not then -// BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS should be defined. -// See file boost_no_cxx11_non_pub_def_fun.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_NON_PUBLIC_DEFAULTED_FUNCTIONS -#include "boost_no_cxx11_non_pub_def_fun.ipp" -#else -namespace boost_no_cxx11_non_public_defaulted_functions = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_non_public_defaulted_functions::test(); -} - diff --git a/libs/config/test/no_cxx11_numeric_limits_fail.cpp b/libs/config/test/no_cxx11_numeric_limits_fail.cpp deleted file mode 100644 index 607171930..000000000 --- a/libs/config/test/no_cxx11_numeric_limits_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Sep 25 16:53:41 2010 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 49281 2008-10-11 15:40:44Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_CXX11_NUMERIC_LIMITS -// This file should not compile, if it does then -// BOOST_NO_CXX11_NUMERIC_LIMITS should not be defined. -// See file boost_no_limits_lowest.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_NUMERIC_LIMITS -#include "boost_no_cxx11_numeric_limits.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_numeric_limits::test(); -} - diff --git a/libs/config/test/no_cxx11_numeric_limits_pass.cpp b/libs/config/test/no_cxx11_numeric_limits_pass.cpp deleted file mode 100644 index eb2c6cd41..000000000 --- a/libs/config/test/no_cxx11_numeric_limits_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Sep 25 16:53:41 2010 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 49281 2008-10-11 15:40:44Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_CXX11_NUMERIC_LIMITS -// This file should compile, if it does not then -// BOOST_NO_CXX11_NUMERIC_LIMITS should be defined. -// See file boost_no_limits_lowest.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_NUMERIC_LIMITS -#include "boost_no_cxx11_numeric_limits.ipp" -#else -namespace boost_no_cxx11_numeric_limits = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_numeric_limits::test(); -} - diff --git a/libs/config/test/no_cxx11_ref_qualifiers_fail.cpp b/libs/config/test/no_cxx11_ref_qualifiers_fail.cpp deleted file mode 100644 index 413ca8e9b..000000000 --- a/libs/config/test/no_cxx11_ref_qualifiers_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Wed May 28 17:13:04 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_REF_QUALIFIERS -// This file should not compile, if it does then -// BOOST_NO_CXX11_REF_QUALIFIERS should not be defined. -// See file boost_no_cxx11_ref_qualifiers.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_REF_QUALIFIERS -#include "boost_no_cxx11_ref_qualifiers.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_ref_qualifiers::test(); -} - diff --git a/libs/config/test/no_cxx11_ref_qualifiers_pass.cpp b/libs/config/test/no_cxx11_ref_qualifiers_pass.cpp deleted file mode 100644 index 99216f60e..000000000 --- a/libs/config/test/no_cxx11_ref_qualifiers_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Wed May 28 17:13:04 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_REF_QUALIFIERS -// This file should compile, if it does not then -// BOOST_NO_CXX11_REF_QUALIFIERS should be defined. -// See file boost_no_cxx11_ref_qualifiers.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_REF_QUALIFIERS -#include "boost_no_cxx11_ref_qualifiers.ipp" -#else -namespace boost_no_cxx11_ref_qualifiers = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_ref_qualifiers::test(); -} - diff --git a/libs/config/test/no_cxx11_smart_ptr_fail.cpp b/libs/config/test/no_cxx11_smart_ptr_fail.cpp deleted file mode 100644 index 41908940a..000000000 --- a/libs/config/test/no_cxx11_smart_ptr_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 22 11:15:43 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 72327 2011-06-01 14:51:03Z eric_niebler $ -// - - -// Test file for macro BOOST_NO_CXX11_SMART_PTR -// This file should not compile, if it does then -// BOOST_NO_CXX11_SMART_PTR should not be defined. -// See file boost_no_cxx11_smart_ptr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_SMART_PTR -#include "boost_no_cxx11_smart_ptr.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_smart_ptr::test(); -} - diff --git a/libs/config/test/no_cxx11_smart_ptr_pass.cpp b/libs/config/test/no_cxx11_smart_ptr_pass.cpp deleted file mode 100644 index 334cae64c..000000000 --- a/libs/config/test/no_cxx11_smart_ptr_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 22 11:15:43 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 72327 2011-06-01 14:51:03Z eric_niebler $ -// - - -// Test file for macro BOOST_NO_CXX11_SMART_PTR -// This file should compile, if it does not then -// BOOST_NO_CXX11_SMART_PTR should be defined. -// See file boost_no_cxx11_smart_ptr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_SMART_PTR -#include "boost_no_cxx11_smart_ptr.ipp" -#else -namespace boost_no_cxx11_smart_ptr = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_smart_ptr::test(); -} - diff --git a/libs/config/test/no_cxx11_std_align_fail.cpp b/libs/config/test/no_cxx11_std_align_fail.cpp deleted file mode 100644 index 7a87dea2f..000000000 --- a/libs/config/test/no_cxx11_std_align_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Tue Feb 11 16:14:42 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_STD_ALIGN -// This file should not compile, if it does then -// BOOST_NO_CXX11_STD_ALIGN should not be defined. -// See file boost_no_cxx11_std_align.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_STD_ALIGN -#include "boost_no_cxx11_std_align.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_std_align::test(); -} - diff --git a/libs/config/test/no_cxx11_std_align_pass.cpp b/libs/config/test/no_cxx11_std_align_pass.cpp deleted file mode 100644 index 4ee4ba65b..000000000 --- a/libs/config/test/no_cxx11_std_align_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Tue Feb 11 16:14:42 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_STD_ALIGN -// This file should compile, if it does not then -// BOOST_NO_CXX11_STD_ALIGN should be defined. -// See file boost_no_cxx11_std_align.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_STD_ALIGN -#include "boost_no_cxx11_std_align.ipp" -#else -namespace boost_no_cxx11_std_align = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_std_align::test(); -} - diff --git a/libs/config/test/no_cxx11_thread_local_fail.cpp b/libs/config/test/no_cxx11_thread_local_fail.cpp deleted file mode 100644 index 957c622ee..000000000 --- a/libs/config/test/no_cxx11_thread_local_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Jul 1 18:47:25 2016 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_THREAD_LOCAL -// This file should not compile, if it does then -// BOOST_NO_CXX11_THREAD_LOCAL should not be defined. -// See file boost_no_cxx11_thread_local.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_THREAD_LOCAL -#include "boost_no_cxx11_thread_local.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_thread_local::test(); -} - diff --git a/libs/config/test/no_cxx11_thread_local_pass.cpp b/libs/config/test/no_cxx11_thread_local_pass.cpp deleted file mode 100644 index 3e54ca2b5..000000000 --- a/libs/config/test/no_cxx11_thread_local_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Jul 1 18:47:25 2016 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_THREAD_LOCAL -// This file should compile, if it does not then -// BOOST_NO_CXX11_THREAD_LOCAL should be defined. -// See file boost_no_cxx11_thread_local.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_THREAD_LOCAL -#include "boost_no_cxx11_thread_local.ipp" -#else -namespace boost_no_cxx11_thread_local = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_thread_local::test(); -} - diff --git a/libs/config/test/no_cxx11_trailing_result_types_fail.cpp b/libs/config/test/no_cxx11_trailing_result_types_fail.cpp deleted file mode 100644 index edabc2def..000000000 --- a/libs/config/test/no_cxx11_trailing_result_types_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 28 18:36:48 2013 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_TRAILING_RESULT_TYPES -// This file should not compile, if it does then -// BOOST_NO_CXX11_TRAILING_RESULT_TYPES should not be defined. -// See file boost_no_cxx11_trailing_result_types.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_TRAILING_RESULT_TYPES -#include "boost_no_cxx11_trailing_result_types.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_trailing_result_types::test(); -} - diff --git a/libs/config/test/no_cxx11_trailing_result_types_pass.cpp b/libs/config/test/no_cxx11_trailing_result_types_pass.cpp deleted file mode 100644 index 6cc54cf0a..000000000 --- a/libs/config/test/no_cxx11_trailing_result_types_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 28 18:36:48 2013 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_TRAILING_RESULT_TYPES -// This file should compile, if it does not then -// BOOST_NO_CXX11_TRAILING_RESULT_TYPES should be defined. -// See file boost_no_cxx11_trailing_result_types.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_TRAILING_RESULT_TYPES -#include "boost_no_cxx11_trailing_result_types.ipp" -#else -namespace boost_no_cxx11_trailing_result_types = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_trailing_result_types::test(); -} - diff --git a/libs/config/test/no_cxx11_user_lit_fail.cpp b/libs/config/test/no_cxx11_user_lit_fail.cpp deleted file mode 100644 index 266645569..000000000 --- a/libs/config/test/no_cxx11_user_lit_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 28 18:36:48 2013 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 72327 2011-06-01 14:51:03Z eric_niebler $ -// - - -// Test file for macro BOOST_NO_CXX11_USER_DEFINED_LITERALS -// This file should not compile, if it does then -// BOOST_NO_CXX11_USER_DEFINED_LITERALS should not be defined. -// See file boost_no_cxx11_user_lit.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_USER_DEFINED_LITERALS -#include "boost_no_cxx11_user_lit.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_user_defined_literals::test(); -} - diff --git a/libs/config/test/no_cxx11_user_lit_pass.cpp b/libs/config/test/no_cxx11_user_lit_pass.cpp deleted file mode 100644 index d1408f5ea..000000000 --- a/libs/config/test/no_cxx11_user_lit_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 28 18:36:48 2013 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 72327 2011-06-01 14:51:03Z eric_niebler $ -// - - -// Test file for macro BOOST_NO_CXX11_USER_DEFINED_LITERALS -// This file should compile, if it does not then -// BOOST_NO_CXX11_USER_DEFINED_LITERALS should be defined. -// See file boost_no_cxx11_user_lit.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_USER_DEFINED_LITERALS -#include "boost_no_cxx11_user_lit.ipp" -#else -namespace boost_no_cxx11_user_defined_literals = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_user_defined_literals::test(); -} - diff --git a/libs/config/test/no_cxx14_binary_literals_fail.cpp b/libs/config/test/no_cxx14_binary_literals_fail.cpp deleted file mode 100644 index 759e87197..000000000 --- a/libs/config/test/no_cxx14_binary_literals_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:16 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_BINARY_LITERALS -// This file should not compile, if it does then -// BOOST_NO_CXX14_BINARY_LITERALS should not be defined. -// See file boost_no_cxx14_binary_literals.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX14_BINARY_LITERALS -#include "boost_no_cxx14_binary_literals.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_binary_literals::test(); -} - diff --git a/libs/config/test/no_cxx14_binary_literals_pass.cpp b/libs/config/test/no_cxx14_binary_literals_pass.cpp deleted file mode 100644 index 94debc27f..000000000 --- a/libs/config/test/no_cxx14_binary_literals_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:16 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_BINARY_LITERALS -// This file should compile, if it does not then -// BOOST_NO_CXX14_BINARY_LITERALS should be defined. -// See file boost_no_cxx14_binary_literals.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX14_BINARY_LITERALS -#include "boost_no_cxx14_binary_literals.ipp" -#else -namespace boost_no_cxx14_binary_literals = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_binary_literals::test(); -} - diff --git a/libs/config/test/no_cxx14_constexpr_fail.cpp b/libs/config/test/no_cxx14_constexpr_fail.cpp deleted file mode 100644 index 0028023ba..000000000 --- a/libs/config/test/no_cxx14_constexpr_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:16 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_CONSTEXPR -// This file should not compile, if it does then -// BOOST_NO_CXX14_CONSTEXPR should not be defined. -// See file boost_no_cxx14_constexpr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX14_CONSTEXPR -#include "boost_no_cxx14_constexpr.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_constexpr::test(); -} - diff --git a/libs/config/test/no_cxx14_constexpr_pass.cpp b/libs/config/test/no_cxx14_constexpr_pass.cpp deleted file mode 100644 index 8272f9189..000000000 --- a/libs/config/test/no_cxx14_constexpr_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:16 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_CONSTEXPR -// This file should compile, if it does not then -// BOOST_NO_CXX14_CONSTEXPR should be defined. -// See file boost_no_cxx14_constexpr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX14_CONSTEXPR -#include "boost_no_cxx14_constexpr.ipp" -#else -namespace boost_no_cxx14_constexpr = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_constexpr::test(); -} - diff --git a/libs/config/test/no_cxx14_decltype_auto_fail.cpp b/libs/config/test/no_cxx14_decltype_auto_fail.cpp deleted file mode 100644 index 78639cf56..000000000 --- a/libs/config/test/no_cxx14_decltype_auto_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:16 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_DECLTYPE_AUTO -// This file should not compile, if it does then -// BOOST_NO_CXX14_DECLTYPE_AUTO should not be defined. -// See file boost_no_cxx14_decltype_auto.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX14_DECLTYPE_AUTO -#include "boost_no_cxx14_decltype_auto.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_decltype_auto::test(); -} - diff --git a/libs/config/test/no_cxx14_decltype_auto_pass.cpp b/libs/config/test/no_cxx14_decltype_auto_pass.cpp deleted file mode 100644 index e36cb64d2..000000000 --- a/libs/config/test/no_cxx14_decltype_auto_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:16 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_DECLTYPE_AUTO -// This file should compile, if it does not then -// BOOST_NO_CXX14_DECLTYPE_AUTO should be defined. -// See file boost_no_cxx14_decltype_auto.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX14_DECLTYPE_AUTO -#include "boost_no_cxx14_decltype_auto.ipp" -#else -namespace boost_no_cxx14_decltype_auto = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_decltype_auto::test(); -} - diff --git a/libs/config/test/no_cxx14_digit_separator_fail.cpp b/libs/config/test/no_cxx14_digit_separator_fail.cpp deleted file mode 100644 index 59a300183..000000000 --- a/libs/config/test/no_cxx14_digit_separator_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:16 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_DIGIT_SEPARATORS -// This file should not compile, if it does then -// BOOST_NO_CXX14_DIGIT_SEPARATORS should not be defined. -// See file boost_no_cxx14_digit_separator.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX14_DIGIT_SEPARATORS -#include "boost_no_cxx14_digit_separator.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_digit_separators::test(); -} - diff --git a/libs/config/test/no_cxx14_digit_separator_pass.cpp b/libs/config/test/no_cxx14_digit_separator_pass.cpp deleted file mode 100644 index a8814fe07..000000000 --- a/libs/config/test/no_cxx14_digit_separator_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:16 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_DIGIT_SEPARATORS -// This file should compile, if it does not then -// BOOST_NO_CXX14_DIGIT_SEPARATORS should be defined. -// See file boost_no_cxx14_digit_separator.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX14_DIGIT_SEPARATORS -#include "boost_no_cxx14_digit_separator.ipp" -#else -namespace boost_no_cxx14_digit_separators = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_digit_separators::test(); -} - diff --git a/libs/config/test/no_cxx14_generic_lambda_fail.cpp b/libs/config/test/no_cxx14_generic_lambda_fail.cpp deleted file mode 100644 index 928f76532..000000000 --- a/libs/config/test/no_cxx14_generic_lambda_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:16 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_GENERIC_LAMBDAS -// This file should not compile, if it does then -// BOOST_NO_CXX14_GENERIC_LAMBDAS should not be defined. -// See file boost_no_cxx14_generic_lambda.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX14_GENERIC_LAMBDAS -#include "boost_no_cxx14_generic_lambda.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_generic_lambdas::test(); -} - diff --git a/libs/config/test/no_cxx14_generic_lambda_pass.cpp b/libs/config/test/no_cxx14_generic_lambda_pass.cpp deleted file mode 100644 index bef36ac6e..000000000 --- a/libs/config/test/no_cxx14_generic_lambda_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:16 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_GENERIC_LAMBDAS -// This file should compile, if it does not then -// BOOST_NO_CXX14_GENERIC_LAMBDAS should be defined. -// See file boost_no_cxx14_generic_lambda.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX14_GENERIC_LAMBDAS -#include "boost_no_cxx14_generic_lambda.ipp" -#else -namespace boost_no_cxx14_generic_lambdas = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_generic_lambdas::test(); -} - diff --git a/libs/config/test/no_cxx14_hdr_shared_mutex_fail.cpp b/libs/config/test/no_cxx14_hdr_shared_mutex_fail.cpp deleted file mode 100644 index 11c93bbe1..000000000 --- a/libs/config/test/no_cxx14_hdr_shared_mutex_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Jun 26 21:47:59 2015 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_HDR_SHARED_MUTEX -// This file should not compile, if it does then -// BOOST_NO_CXX14_HDR_SHARED_MUTEX should not be defined. -// See file boost_no_cxx14_hdr_shared_mutex.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX14_HDR_SHARED_MUTEX -#include "boost_no_cxx14_hdr_shared_mutex.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_hdr_shared_mutex::test(); -} - diff --git a/libs/config/test/no_cxx14_hdr_shared_mutex_pass.cpp b/libs/config/test/no_cxx14_hdr_shared_mutex_pass.cpp deleted file mode 100644 index 20c5f7bbc..000000000 --- a/libs/config/test/no_cxx14_hdr_shared_mutex_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Jun 26 21:47:59 2015 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_HDR_SHARED_MUTEX -// This file should compile, if it does not then -// BOOST_NO_CXX14_HDR_SHARED_MUTEX should be defined. -// See file boost_no_cxx14_hdr_shared_mutex.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX14_HDR_SHARED_MUTEX -#include "boost_no_cxx14_hdr_shared_mutex.ipp" -#else -namespace boost_no_cxx14_hdr_shared_mutex = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_hdr_shared_mutex::test(); -} - diff --git a/libs/config/test/no_cxx14_lambda_capture_fail.cpp b/libs/config/test/no_cxx14_lambda_capture_fail.cpp deleted file mode 100644 index 515cc08e9..000000000 --- a/libs/config/test/no_cxx14_lambda_capture_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:17 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES -// This file should not compile, if it does then -// BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES should not be defined. -// See file boost_no_cxx14_lambda_capture.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES -#include "boost_no_cxx14_lambda_capture.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_initialized_lambda_captures::test(); -} - diff --git a/libs/config/test/no_cxx14_lambda_capture_pass.cpp b/libs/config/test/no_cxx14_lambda_capture_pass.cpp deleted file mode 100644 index d5c09c5f0..000000000 --- a/libs/config/test/no_cxx14_lambda_capture_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:17 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES -// This file should compile, if it does not then -// BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES should be defined. -// See file boost_no_cxx14_lambda_capture.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES -#include "boost_no_cxx14_lambda_capture.ipp" -#else -namespace boost_no_cxx14_initialized_lambda_captures = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_initialized_lambda_captures::test(); -} - diff --git a/libs/config/test/no_cxx14_member_init_fail.cpp b/libs/config/test/no_cxx14_member_init_fail.cpp deleted file mode 100644 index ba3ae4e26..000000000 --- a/libs/config/test/no_cxx14_member_init_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:17 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_AGGREGATE_NSDMI -// This file should not compile, if it does then -// BOOST_NO_CXX14_AGGREGATE_NSDMI should not be defined. -// See file boost_no_cxx14_member_init.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX14_AGGREGATE_NSDMI -#include "boost_no_cxx14_member_init.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_aggregate_nsdmi::test(); -} - diff --git a/libs/config/test/no_cxx14_member_init_pass.cpp b/libs/config/test/no_cxx14_member_init_pass.cpp deleted file mode 100644 index 9dd8e8977..000000000 --- a/libs/config/test/no_cxx14_member_init_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:17 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_AGGREGATE_NSDMI -// This file should compile, if it does not then -// BOOST_NO_CXX14_AGGREGATE_NSDMI should be defined. -// See file boost_no_cxx14_member_init.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX14_AGGREGATE_NSDMI -#include "boost_no_cxx14_member_init.ipp" -#else -namespace boost_no_cxx14_aggregate_nsdmi = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_aggregate_nsdmi::test(); -} - diff --git a/libs/config/test/no_cxx14_return_type_ded_fail.cpp b/libs/config/test/no_cxx14_return_type_ded_fail.cpp deleted file mode 100644 index a969c8405..000000000 --- a/libs/config/test/no_cxx14_return_type_ded_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:17 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION -// This file should not compile, if it does then -// BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION should not be defined. -// See file boost_no_cxx14_return_type_ded.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION -#include "boost_no_cxx14_return_type_ded.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_return_type_deduction::test(); -} - diff --git a/libs/config/test/no_cxx14_return_type_ded_pass.cpp b/libs/config/test/no_cxx14_return_type_ded_pass.cpp deleted file mode 100644 index f3e35f375..000000000 --- a/libs/config/test/no_cxx14_return_type_ded_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:17 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION -// This file should compile, if it does not then -// BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION should be defined. -// See file boost_no_cxx14_return_type_ded.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION -#include "boost_no_cxx14_return_type_ded.ipp" -#else -namespace boost_no_cxx14_return_type_deduction = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_return_type_deduction::test(); -} - diff --git a/libs/config/test/no_cxx14_std_exchange_fail.cpp b/libs/config/test/no_cxx14_std_exchange_fail.cpp deleted file mode 100644 index c71003774..000000000 --- a/libs/config/test/no_cxx14_std_exchange_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Oct 14 12:13:46 2016 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX17_STD_APPLY -// This file should not compile, if it does then -// BOOST_NO_CXX17_STD_APPLY should not be defined. -// See file boost_no_cxx17_std_apply.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX14_STD_EXCHANGE -#include "boost_no_cxx14_std_exchange.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_std_exchange::test(); -} - diff --git a/libs/config/test/no_cxx14_std_exchange_pass.cpp b/libs/config/test/no_cxx14_std_exchange_pass.cpp deleted file mode 100644 index edac2fbf5..000000000 --- a/libs/config/test/no_cxx14_std_exchange_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Oct 14 12:13:46 2016 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX17_STD_APPLY -// This file should compile, if it does not then -// BOOST_NO_CXX!/_STD_APPLY should be defined. -// See file boost_no_cxx17_std_apply.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX14_STD_EXCHANGE -#include "boost_no_cxx14_std_exchange.ipp" -#else -namespace boost_no_cxx14_std_exchange = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_std_exchange::test(); -} - diff --git a/libs/config/test/no_cxx14_var_templ_fail.cpp b/libs/config/test/no_cxx14_var_templ_fail.cpp deleted file mode 100644 index 438ccd7e6..000000000 --- a/libs/config/test/no_cxx14_var_templ_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:17 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_VARIABLE_TEMPLATES -// This file should not compile, if it does then -// BOOST_NO_CXX14_VARIABLE_TEMPLATES should not be defined. -// See file boost_no_cxx14_var_templ.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX14_VARIABLE_TEMPLATES -#include "boost_no_cxx14_var_templ.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_variable_templates::test(); -} - diff --git a/libs/config/test/no_cxx14_var_templ_pass.cpp b/libs/config/test/no_cxx14_var_templ_pass.cpp deleted file mode 100644 index 90c7b4c51..000000000 --- a/libs/config/test/no_cxx14_var_templ_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sat Oct 11 19:26:17 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX14_VARIABLE_TEMPLATES -// This file should compile, if it does not then -// BOOST_NO_CXX14_VARIABLE_TEMPLATES should be defined. -// See file boost_no_cxx14_var_templ.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX14_VARIABLE_TEMPLATES -#include "boost_no_cxx14_var_templ.ipp" -#else -namespace boost_no_cxx14_variable_templates = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx14_variable_templates::test(); -} - diff --git a/libs/config/test/no_cxx17_std_apply_fail.cpp b/libs/config/test/no_cxx17_std_apply_fail.cpp deleted file mode 100644 index e1c3d367a..000000000 --- a/libs/config/test/no_cxx17_std_apply_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Oct 14 12:13:46 2016 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX17_STD_APPLY -// This file should not compile, if it does then -// BOOST_NO_CXX17_STD_APPLY should not be defined. -// See file boost_no_cxx17_std_apply.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX17_STD_APPLY -#include "boost_no_cxx17_std_apply.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx17_std_apply::test(); -} - diff --git a/libs/config/test/no_cxx17_std_apply_pass.cpp b/libs/config/test/no_cxx17_std_apply_pass.cpp deleted file mode 100644 index b3aa87448..000000000 --- a/libs/config/test/no_cxx17_std_apply_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Oct 14 12:13:46 2016 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX17_STD_APPLY -// This file should compile, if it does not then -// BOOST_NO_CXX!/_STD_APPLY should be defined. -// See file boost_no_cxx17_std_apply.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX17_STD_APPLY -#include "boost_no_cxx17_std_apply.ipp" -#else -namespace boost_no_cxx17_std_apply = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx17_std_apply::test(); -} - diff --git a/libs/config/test/no_cxx17_std_invoke_fail.cpp b/libs/config/test/no_cxx17_std_invoke_fail.cpp deleted file mode 100644 index a34fc7a88..000000000 --- a/libs/config/test/no_cxx17_std_invoke_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Oct 14 12:13:46 2016 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX17_STD_INVOKE -// This file should not compile, if it does then -// BOOST_NO_STD_INVOKE should not be defined. -// See file boost_no_cxx17_std_invoke.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX17_STD_INVOKE -#include "boost_no_cxx17_std_invoke.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx17_std_invoke::test(); -} - diff --git a/libs/config/test/no_cxx17_std_invoke_pass.cpp b/libs/config/test/no_cxx17_std_invoke_pass.cpp deleted file mode 100644 index 76e28e17d..000000000 --- a/libs/config/test/no_cxx17_std_invoke_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Oct 14 12:13:46 2016 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX17_STD_INVOKE -// This file should compile, if it does not then -// BOOST_NO_STD_INVOKE should be defined. -// See file boost_no_cxx17_std_invoke.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX17_STD_INVOKE -#include "boost_no_cxx17_std_invoke.ipp" -#else -namespace boost_no_cxx17_std_invoke = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx17_std_invoke::test(); -} - diff --git a/libs/config/test/no_cxx_hdr_functional_fail.cpp b/libs/config/test/no_cxx_hdr_functional_fail.cpp deleted file mode 100644 index 15f885a29..000000000 --- a/libs/config/test/no_cxx_hdr_functional_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 22 11:15:43 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 72327 2011-06-01 14:51:03Z eric_niebler $ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_FUNCTIONAL -// This file should not compile, if it does then -// BOOST_NO_CXX11_HDR_FUNCTIONAL should not be defined. -// See file boost_no_cxx_hdr_functional.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_HDR_FUNCTIONAL -#include "boost_no_cxx_hdr_functional.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_functional::test(); -} - diff --git a/libs/config/test/no_cxx_hdr_functional_pass.cpp b/libs/config/test/no_cxx_hdr_functional_pass.cpp deleted file mode 100644 index a5fe5c5c1..000000000 --- a/libs/config/test/no_cxx_hdr_functional_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Apr 22 11:15:43 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 72327 2011-06-01 14:51:03Z eric_niebler $ -// - - -// Test file for macro BOOST_NO_CXX11_HDR_FUNCTIONAL -// This file should compile, if it does not then -// BOOST_NO_CXX11_HDR_FUNCTIONAL should be defined. -// See file boost_no_cxx_hdr_functional.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_HDR_FUNCTIONAL -#include "boost_no_cxx_hdr_functional.ipp" -#else -namespace boost_no_cxx11_hdr_functional = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_hdr_functional::test(); -} - diff --git a/libs/config/test/no_decltype_fail.cpp b/libs/config/test/no_decltype_fail.cpp deleted file mode 100644 index 59be58668..000000000 --- a/libs/config/test/no_decltype_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 07:24:54 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_DECLTYPE -// This file should not compile, if it does then -// BOOST_NO_CXX11_DECLTYPE should not be defined. -// See file boost_no_decltype.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_DECLTYPE -#include "boost_no_decltype.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_decltype::test(); -} - diff --git a/libs/config/test/no_decltype_n3276_fail.cpp b/libs/config/test/no_decltype_n3276_fail.cpp deleted file mode 100644 index 1e86fb6f4..000000000 --- a/libs/config/test/no_decltype_n3276_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Wed Jun 1 21:44:56 2011 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_DECLTYPE_N3276 -// This file should not compile, if it does then -// BOOST_NO_CXX11_DECLTYPE_N3276 should not be defined. -// See file boost_no_decltype_n3276.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_DECLTYPE_N3276 -#include "boost_no_decltype_n3276.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_decltype_n3276::test(); -} - diff --git a/libs/config/test/no_decltype_n3276_pass.cpp b/libs/config/test/no_decltype_n3276_pass.cpp deleted file mode 100644 index 0eb3a21f9..000000000 --- a/libs/config/test/no_decltype_n3276_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Wed Jun 1 21:44:56 2011 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_DECLTYPE_N3276 -// This file should compile, if it does not then -// BOOST_NO_CXX11_DECLTYPE_N3276 should be defined. -// See file boost_no_decltype_n3276.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_DECLTYPE_N3276 -#include "boost_no_decltype_n3276.ipp" -#else -namespace boost_no_cxx11_decltype_n3276 = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_decltype_n3276::test(); -} - diff --git a/libs/config/test/no_decltype_pass.cpp b/libs/config/test/no_decltype_pass.cpp deleted file mode 100644 index 91dfe258d..000000000 --- a/libs/config/test/no_decltype_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 07:24:54 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_DECLTYPE -// This file should compile, if it does not then -// BOOST_NO_CXX11_DECLTYPE should be defined. -// See file boost_no_decltype.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_DECLTYPE -#include "boost_no_decltype.ipp" -#else -namespace boost_no_cxx11_decltype = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_decltype::test(); -} - diff --git a/libs/config/test/no_ded_typename_fail.cpp b/libs/config/test/no_ded_typename_fail.cpp deleted file mode 100644 index d82937f2a..000000000 --- a/libs/config/test/no_ded_typename_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_DEDUCED_TYPENAME -// This file should not compile, if it does then -// BOOST_DEDUCED_TYPENAME should not be defined. -// See file boost_no_ded_typename.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_DEDUCED_TYPENAME -#include "boost_no_ded_typename.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_deduced_typename::test(); -} - diff --git a/libs/config/test/no_ded_typename_pass.cpp b/libs/config/test/no_ded_typename_pass.cpp deleted file mode 100644 index fe59f3651..000000000 --- a/libs/config/test/no_ded_typename_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_DEDUCED_TYPENAME -// This file should compile, if it does not then -// BOOST_DEDUCED_TYPENAME should be defined. -// See file boost_no_ded_typename.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_DEDUCED_TYPENAME -#include "boost_no_ded_typename.ipp" -#else -namespace boost_deduced_typename = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_deduced_typename::test(); -} - diff --git a/libs/config/test/no_defaulted_functions_fail.cpp b/libs/config/test/no_defaulted_functions_fail.cpp deleted file mode 100644 index 58569579f..000000000 --- a/libs/config/test/no_defaulted_functions_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Jun 20 11:01:41 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_DEFAULTED_FUNCTIONS -// This file should not compile, if it does then -// BOOST_NO_CXX11_DEFAULTED_FUNCTIONS should not be defined. -// See file boost_no_defaulted_functions.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS -#include "boost_no_defaulted_functions.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_defaulted_functions::test(); -} - diff --git a/libs/config/test/no_defaulted_functions_pass.cpp b/libs/config/test/no_defaulted_functions_pass.cpp deleted file mode 100644 index d35f89e0a..000000000 --- a/libs/config/test/no_defaulted_functions_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Jun 20 11:01:41 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_DEFAULTED_FUNCTIONS -// This file should compile, if it does not then -// BOOST_NO_CXX11_DEFAULTED_FUNCTIONS should be defined. -// See file boost_no_defaulted_functions.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS -#include "boost_no_defaulted_functions.ipp" -#else -namespace boost_no_cxx11_defaulted_functions = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_defaulted_functions::test(); -} - diff --git a/libs/config/test/no_deleted_functions_fail.cpp b/libs/config/test/no_deleted_functions_fail.cpp deleted file mode 100644 index e08abe885..000000000 --- a/libs/config/test/no_deleted_functions_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Jun 19 16:26:16 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_DELETED_FUNCTIONS -// This file should not compile, if it does then -// BOOST_NO_CXX11_DELETED_FUNCTIONS should not be defined. -// See file boost_no_deleted_functions.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_DELETED_FUNCTIONS -#include "boost_no_deleted_functions.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_deleted_functions::test(); -} - diff --git a/libs/config/test/no_deleted_functions_pass.cpp b/libs/config/test/no_deleted_functions_pass.cpp deleted file mode 100644 index d157332a9..000000000 --- a/libs/config/test/no_deleted_functions_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Jun 19 16:26:16 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_DELETED_FUNCTIONS -// This file should compile, if it does not then -// BOOST_NO_CXX11_DELETED_FUNCTIONS should be defined. -// See file boost_no_deleted_functions.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_DELETED_FUNCTIONS -#include "boost_no_deleted_functions.ipp" -#else -namespace boost_no_cxx11_deleted_functions = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_deleted_functions::test(); -} - diff --git a/libs/config/test/no_dep_nested_class_fail.cpp b/libs/config/test/no_dep_nested_class_fail.cpp deleted file mode 100644 index ca98977c8..000000000 --- a/libs/config/test/no_dep_nested_class_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_DEPENDENT_NESTED_DERIVATIONS -// This file should not compile, if it does then -// BOOST_NO_DEPENDENT_NESTED_DERIVATIONS should not be defined. -// See file boost_no_dep_nested_class.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_DEPENDENT_NESTED_DERIVATIONS -#include "boost_no_dep_nested_class.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_dependent_nested_derivations::test(); -} - diff --git a/libs/config/test/no_dep_nested_class_pass.cpp b/libs/config/test/no_dep_nested_class_pass.cpp deleted file mode 100644 index 1eaa6e616..000000000 --- a/libs/config/test/no_dep_nested_class_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_DEPENDENT_NESTED_DERIVATIONS -// This file should compile, if it does not then -// BOOST_NO_DEPENDENT_NESTED_DERIVATIONS should be defined. -// See file boost_no_dep_nested_class.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_DEPENDENT_NESTED_DERIVATIONS -#include "boost_no_dep_nested_class.ipp" -#else -namespace boost_no_dependent_nested_derivations = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_dependent_nested_derivations::test(); -} - diff --git a/libs/config/test/no_dep_val_param_fail.cpp b/libs/config/test/no_dep_val_param_fail.cpp deleted file mode 100644 index 1c0a96f45..000000000 --- a/libs/config/test/no_dep_val_param_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS -// This file should not compile, if it does then -// BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS should not be defined. -// See file boost_no_dep_val_param.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS -#include "boost_no_dep_val_param.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_dependent_types_in_template_value_parameters::test(); -} - diff --git a/libs/config/test/no_dep_val_param_pass.cpp b/libs/config/test/no_dep_val_param_pass.cpp deleted file mode 100644 index 57f6bdf21..000000000 --- a/libs/config/test/no_dep_val_param_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS -// This file should compile, if it does not then -// BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS should be defined. -// See file boost_no_dep_val_param.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS -#include "boost_no_dep_val_param.ipp" -#else -namespace boost_no_dependent_types_in_template_value_parameters = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_dependent_types_in_template_value_parameters::test(); -} - diff --git a/libs/config/test/no_excep_std_fail.cpp b/libs/config/test/no_excep_std_fail.cpp deleted file mode 100644 index 0c557ac45..000000000 --- a/libs/config/test/no_excep_std_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_EXCEPTION_STD_NAMESPACE -// This file should not compile, if it does then -// BOOST_NO_EXCEPTION_STD_NAMESPACE should not be defined. -// See file boost_no_excep_std.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_EXCEPTION_STD_NAMESPACE -#include "boost_no_excep_std.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_exception_std_namespace::test(); -} - diff --git a/libs/config/test/no_excep_std_pass.cpp b/libs/config/test/no_excep_std_pass.cpp deleted file mode 100644 index 9b5f9ca1c..000000000 --- a/libs/config/test/no_excep_std_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_EXCEPTION_STD_NAMESPACE -// This file should compile, if it does not then -// BOOST_NO_EXCEPTION_STD_NAMESPACE should be defined. -// See file boost_no_excep_std.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_EXCEPTION_STD_NAMESPACE -#include "boost_no_excep_std.ipp" -#else -namespace boost_no_exception_std_namespace = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_exception_std_namespace::test(); -} - diff --git a/libs/config/test/no_exceptions_fail.cpp b/libs/config/test/no_exceptions_fail.cpp deleted file mode 100644 index e1f3f4902..000000000 --- a/libs/config/test/no_exceptions_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_EXCEPTIONS -// This file should not compile, if it does then -// BOOST_NO_EXCEPTIONS should not be defined. -// See file boost_no_exceptions.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_EXCEPTIONS -#include "boost_no_exceptions.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_exceptions::test(); -} - diff --git a/libs/config/test/no_exceptions_pass.cpp b/libs/config/test/no_exceptions_pass.cpp deleted file mode 100644 index f2bf58214..000000000 --- a/libs/config/test/no_exceptions_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_EXCEPTIONS -// This file should compile, if it does not then -// BOOST_NO_EXCEPTIONS should be defined. -// See file boost_no_exceptions.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_EXCEPTIONS -#include "boost_no_exceptions.ipp" -#else -namespace boost_no_exceptions = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_exceptions::test(); -} - diff --git a/libs/config/test/no_exp_func_tem_arg_fail.cpp b/libs/config/test/no_exp_func_tem_arg_fail.cpp deleted file mode 100644 index e491c4dba..000000000 --- a/libs/config/test/no_exp_func_tem_arg_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -// This file should not compile, if it does then -// BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS should not be defined. -// See file boost_no_exp_func_tem_arg.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -#include "boost_no_exp_func_tem_arg.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_explicit_function_template_arguments::test(); -} - diff --git a/libs/config/test/no_exp_func_tem_arg_pass.cpp b/libs/config/test/no_exp_func_tem_arg_pass.cpp deleted file mode 100644 index 6e2377788..000000000 --- a/libs/config/test/no_exp_func_tem_arg_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -// This file should compile, if it does not then -// BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS should be defined. -// See file boost_no_exp_func_tem_arg.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -#include "boost_no_exp_func_tem_arg.ipp" -#else -namespace boost_no_explicit_function_template_arguments = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_explicit_function_template_arguments::test(); -} - diff --git a/libs/config/test/no_explicit_cvt_ops_fail.cpp b/libs/config/test/no_explicit_cvt_ops_fail.cpp deleted file mode 100644 index ba150874e..000000000 --- a/libs/config/test/no_explicit_cvt_ops_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Jun 20 11:51:15 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS -// This file should not compile, if it does then -// BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS should not be defined. -// See file boost_no_explicit_cvt_ops.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS -#include "boost_no_explicit_cvt_ops.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_explicit_conversion_operators::test(); -} - diff --git a/libs/config/test/no_explicit_cvt_ops_pass.cpp b/libs/config/test/no_explicit_cvt_ops_pass.cpp deleted file mode 100644 index 2e3c42069..000000000 --- a/libs/config/test/no_explicit_cvt_ops_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Fri Jun 20 11:51:15 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS -// This file should compile, if it does not then -// BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS should be defined. -// See file boost_no_explicit_cvt_ops.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_EXPLICIT_CONVERSION_OPERATORS -#include "boost_no_explicit_cvt_ops.ipp" -#else -namespace boost_no_cxx11_explicit_conversion_operators = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_explicit_conversion_operators::test(); -} - diff --git a/libs/config/test/no_extern_template_fail.cpp b/libs/config/test/no_extern_template_fail.cpp deleted file mode 100644 index 80c87744e..000000000 --- a/libs/config/test/no_extern_template_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 09:24:04 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_EXTERN_TEMPLATE -// This file should not compile, if it does then -// BOOST_NO_CXX11_EXTERN_TEMPLATE should not be defined. -// See file boost_no_extern_template.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_EXTERN_TEMPLATE -#include "boost_no_extern_template.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_extern_template::test(); -} - diff --git a/libs/config/test/no_extern_template_pass.cpp b/libs/config/test/no_extern_template_pass.cpp deleted file mode 100644 index acbd037c0..000000000 --- a/libs/config/test/no_extern_template_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 09:24:04 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_EXTERN_TEMPLATE -// This file should compile, if it does not then -// BOOST_NO_CXX11_EXTERN_TEMPLATE should be defined. -// See file boost_no_extern_template.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_EXTERN_TEMPLATE -#include "boost_no_extern_template.ipp" -#else -namespace boost_no_cxx11_extern_template = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_extern_template::test(); -} - diff --git a/libs/config/test/no_fenv_h_fail.cpp b/libs/config/test/no_fenv_h_fail.cpp deleted file mode 100644 index 9b2f41039..000000000 --- a/libs/config/test/no_fenv_h_fail.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright Bryce Lelbach 2010. -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_FENV_H -// This file should not compile, if it does then -// BOOST_NO_FENV_H should not be defined. -// See file boost_no_fenv_h.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_FENV_H -#include "boost_no_fenv_h.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_fenv_h::test(); -} - diff --git a/libs/config/test/no_fenv_h_pass.cpp b/libs/config/test/no_fenv_h_pass.cpp deleted file mode 100644 index 573d62449..000000000 --- a/libs/config/test/no_fenv_h_pass.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright Bryce Lelbach 2010. -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_FENV_H -// This file should compile, if it does not then -// BOOST_NO_FENV_H should be defined. -// See file boost_no_fenv_h.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_FENV_H -#include "boost_no_fenv_h.ipp" -#else -namespace boost_no_fenv_h = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_fenv_h::test(); -} - diff --git a/libs/config/test/no_fixed_len_variadic_templates_fail.cpp b/libs/config/test/no_fixed_len_variadic_templates_fail.cpp deleted file mode 100644 index 70988291d..000000000 --- a/libs/config/test/no_fixed_len_variadic_templates_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Mon Aug 25 18:12:27 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS -// This file should not compile, if it does then -// BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS should not be defined. -// See file boost_no_fixed_len_variadic_templates.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS -#include "boost_no_fixed_len_variadic_templates.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_fixed_length_variadic_template_expansion_packs::test(); -} - diff --git a/libs/config/test/no_fixed_len_variadic_templates_pass.cpp b/libs/config/test/no_fixed_len_variadic_templates_pass.cpp deleted file mode 100644 index 2c52f5343..000000000 --- a/libs/config/test/no_fixed_len_variadic_templates_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Mon Aug 25 18:12:27 2014 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS -// This file should compile, if it does not then -// BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS should be defined. -// See file boost_no_fixed_len_variadic_templates.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_FIXED_LENGTH_VARIADIC_TEMPLATE_EXPANSION_PACKS -#include "boost_no_fixed_len_variadic_templates.ipp" -#else -namespace boost_no_cxx11_fixed_length_variadic_template_expansion_packs = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_fixed_length_variadic_template_expansion_packs::test(); -} - diff --git a/libs/config/test/no_func_tmp_order_fail.cpp b/libs/config/test/no_func_tmp_order_fail.cpp deleted file mode 100644 index 7736e908d..000000000 --- a/libs/config/test/no_func_tmp_order_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_FUNCTION_TEMPLATE_ORDERING -// This file should not compile, if it does then -// BOOST_NO_FUNCTION_TEMPLATE_ORDERING should not be defined. -// See file boost_no_func_tmp_order.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_FUNCTION_TEMPLATE_ORDERING -#include "boost_no_func_tmp_order.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_function_template_ordering::test(); -} - diff --git a/libs/config/test/no_func_tmp_order_pass.cpp b/libs/config/test/no_func_tmp_order_pass.cpp deleted file mode 100644 index 003829f54..000000000 --- a/libs/config/test/no_func_tmp_order_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_FUNCTION_TEMPLATE_ORDERING -// This file should compile, if it does not then -// BOOST_NO_FUNCTION_TEMPLATE_ORDERING should be defined. -// See file boost_no_func_tmp_order.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING -#include "boost_no_func_tmp_order.ipp" -#else -namespace boost_no_function_template_ordering = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_function_template_ordering::test(); -} - diff --git a/libs/config/test/no_function_template_default_args_fail.cpp b/libs/config/test/no_function_template_default_args_fail.cpp deleted file mode 100644 index e10568e88..000000000 --- a/libs/config/test/no_function_template_default_args_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Aug 02 08:25:59 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS -// This file should not compile, if it does then -// BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS should not be defined. -// See file boost_no_function_template_default_args.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS -#include "boost_no_function_template_default_args.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_function_template_default_args::test(); -} - diff --git a/libs/config/test/no_function_template_default_args_pass.cpp b/libs/config/test/no_function_template_default_args_pass.cpp deleted file mode 100644 index 478c98629..000000000 --- a/libs/config/test/no_function_template_default_args_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Aug 02 08:25:59 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS -// This file should compile, if it does not then -// BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS should be defined. -// See file boost_no_function_template_default_args.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS -#include "boost_no_function_template_default_args.ipp" -#else -namespace boost_no_cxx11_function_template_default_args = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_function_template_default_args::test(); -} - diff --git a/libs/config/test/no_function_type_spec_fail.cpp b/libs/config/test/no_function_type_spec_fail.cpp deleted file mode 100644 index 6ae1dba27..000000000 --- a/libs/config/test/no_function_type_spec_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sun Dec 31 16:23:48 2006 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS -// This file should not compile, if it does then -// BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS should not be defined. -// See file boost_no_function_type_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS -#include "boost_no_function_type_spec.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_function_type_specializations::test(); -} - diff --git a/libs/config/test/no_function_type_spec_pass.cpp b/libs/config/test/no_function_type_spec_pass.cpp deleted file mode 100644 index e70de0c40..000000000 --- a/libs/config/test/no_function_type_spec_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sun Dec 31 16:23:48 2006 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS -// This file should compile, if it does not then -// BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS should be defined. -// See file boost_no_function_type_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_FUNCTION_TYPE_SPECIALIZATIONS -#include "boost_no_function_type_spec.ipp" -#else -namespace boost_no_function_type_specializations = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_function_type_specializations::test(); -} - diff --git a/libs/config/test/no_i64_limits_fail.cpp b/libs/config/test/no_i64_limits_fail.cpp deleted file mode 100644 index 63f01b342..000000000 --- a/libs/config/test/no_i64_limits_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_MS_INT64_NUMERIC_LIMITS -// This file should not compile, if it does then -// BOOST_NO_MS_INT64_NUMERIC_LIMITS should not be defined. -// See file boost_no_i64_limits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_MS_INT64_NUMERIC_LIMITS -#include "boost_no_i64_limits.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_ms_int64_numeric_limits::test(); -} - diff --git a/libs/config/test/no_i64_limits_pass.cpp b/libs/config/test/no_i64_limits_pass.cpp deleted file mode 100644 index 58e63e710..000000000 --- a/libs/config/test/no_i64_limits_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_MS_INT64_NUMERIC_LIMITS -// This file should compile, if it does not then -// BOOST_NO_MS_INT64_NUMERIC_LIMITS should be defined. -// See file boost_no_i64_limits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_MS_INT64_NUMERIC_LIMITS -#include "boost_no_i64_limits.ipp" -#else -namespace boost_no_ms_int64_numeric_limits = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_ms_int64_numeric_limits::test(); -} - diff --git a/libs/config/test/no_inline_memb_init_fail.cpp b/libs/config/test/no_inline_memb_init_fail.cpp deleted file mode 100644 index e4b9a6f6f..000000000 --- a/libs/config/test/no_inline_memb_init_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_INCLASS_MEMBER_INITIALIZATION -// This file should not compile, if it does then -// BOOST_NO_INCLASS_MEMBER_INITIALIZATION should not be defined. -// See file boost_no_inline_memb_init.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_INCLASS_MEMBER_INITIALIZATION -#include "boost_no_inline_memb_init.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_inclass_member_initialization::test(); -} - diff --git a/libs/config/test/no_inline_memb_init_pass.cpp b/libs/config/test/no_inline_memb_init_pass.cpp deleted file mode 100644 index 1b5131340..000000000 --- a/libs/config/test/no_inline_memb_init_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_INCLASS_MEMBER_INITIALIZATION -// This file should compile, if it does not then -// BOOST_NO_INCLASS_MEMBER_INITIALIZATION should be defined. -// See file boost_no_inline_memb_init.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION -#include "boost_no_inline_memb_init.ipp" -#else -namespace boost_no_inclass_member_initialization = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_inclass_member_initialization::test(); -} - diff --git a/libs/config/test/no_integral_int64_t_fail.cpp b/libs/config/test/no_integral_int64_t_fail.cpp deleted file mode 100644 index 92280dfd6..000000000 --- a/libs/config/test/no_integral_int64_t_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_INTEGRAL_INT64_T -// This file should not compile, if it does then -// BOOST_NO_INTEGRAL_INT64_T should not be defined. -// See file boost_no_integral_int64_t.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_INTEGRAL_INT64_T -#include "boost_no_integral_int64_t.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_integral_int64_t::test(); -} - diff --git a/libs/config/test/no_integral_int64_t_pass.cpp b/libs/config/test/no_integral_int64_t_pass.cpp deleted file mode 100644 index 012a562fe..000000000 --- a/libs/config/test/no_integral_int64_t_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_INTEGRAL_INT64_T -// This file should compile, if it does not then -// BOOST_NO_INTEGRAL_INT64_T should be defined. -// See file boost_no_integral_int64_t.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_INTEGRAL_INT64_T -#include "boost_no_integral_int64_t.ipp" -#else -namespace boost_no_integral_int64_t = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_integral_int64_t::test(); -} - diff --git a/libs/config/test/no_iosfwd_fail.cpp b/libs/config/test/no_iosfwd_fail.cpp deleted file mode 100644 index a1c6d9188..000000000 --- a/libs/config/test/no_iosfwd_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:21 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_IOSFWD -// This file should not compile, if it does then -// BOOST_NO_IOSFWD should not be defined. -// See file boost_no_iosfwd.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_IOSFWD -#include "boost_no_iosfwd.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_iosfwd::test(); -} - diff --git a/libs/config/test/no_iosfwd_pass.cpp b/libs/config/test/no_iosfwd_pass.cpp deleted file mode 100644 index 6e631d903..000000000 --- a/libs/config/test/no_iosfwd_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:21 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_IOSFWD -// This file should compile, if it does not then -// BOOST_NO_IOSFWD should be defined. -// See file boost_no_iosfwd.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_IOSFWD -#include "boost_no_iosfwd.ipp" -#else -namespace boost_no_iosfwd = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_iosfwd::test(); -} - diff --git a/libs/config/test/no_iostream_fail.cpp b/libs/config/test/no_iostream_fail.cpp deleted file mode 100644 index 67a845955..000000000 --- a/libs/config/test/no_iostream_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:21 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_IOSTREAM -// This file should not compile, if it does then -// BOOST_NO_IOSTREAM should not be defined. -// See file boost_no_iostream.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_IOSTREAM -#include "boost_no_iostream.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_iostream::test(); -} - diff --git a/libs/config/test/no_iostream_pass.cpp b/libs/config/test/no_iostream_pass.cpp deleted file mode 100644 index ba1d0ac30..000000000 --- a/libs/config/test/no_iostream_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:21 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_IOSTREAM -// This file should compile, if it does not then -// BOOST_NO_IOSTREAM should be defined. -// See file boost_no_iostream.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_IOSTREAM -#include "boost_no_iostream.ipp" -#else -namespace boost_no_iostream = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_iostream::test(); -} - diff --git a/libs/config/test/no_is_abstract_fail.cpp b/libs/config/test/no_is_abstract_fail.cpp deleted file mode 100644 index 1a5c57bef..000000000 --- a/libs/config/test/no_is_abstract_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_IS_ABSTRACT -// This file should not compile, if it does then -// BOOST_NO_IS_ABSTRACT should not be defined. -// See file boost_no_is_abstract.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_IS_ABSTRACT -#include "boost_no_is_abstract.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_is_abstract::test(); -} - diff --git a/libs/config/test/no_is_abstract_pass.cpp b/libs/config/test/no_is_abstract_pass.cpp deleted file mode 100644 index a9caf6863..000000000 --- a/libs/config/test/no_is_abstract_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_IS_ABSTRACT -// This file should compile, if it does not then -// BOOST_NO_IS_ABSTRACT should be defined. -// See file boost_no_is_abstract.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_IS_ABSTRACT -#include "boost_no_is_abstract.ipp" -#else -namespace boost_no_is_abstract = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_is_abstract::test(); -} - diff --git a/libs/config/test/no_iter_construct_fail.cpp b/libs/config/test/no_iter_construct_fail.cpp deleted file mode 100644 index bc618648a..000000000 --- a/libs/config/test/no_iter_construct_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS -// This file should not compile, if it does then -// BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS should not be defined. -// See file boost_no_iter_construct.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS -#include "boost_no_iter_construct.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_templated_iterator_constructors::test(); -} - diff --git a/libs/config/test/no_iter_construct_pass.cpp b/libs/config/test/no_iter_construct_pass.cpp deleted file mode 100644 index 6d063bedf..000000000 --- a/libs/config/test/no_iter_construct_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS -// This file should compile, if it does not then -// BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS should be defined. -// See file boost_no_iter_construct.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS -#include "boost_no_iter_construct.ipp" -#else -namespace boost_no_templated_iterator_constructors = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_templated_iterator_constructors::test(); -} - diff --git a/libs/config/test/no_lambdas_fail.cpp b/libs/config/test/no_lambdas_fail.cpp deleted file mode 100644 index 68680bc99..000000000 --- a/libs/config/test/no_lambdas_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 14 16:01:35 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_LAMBDAS -// This file should not compile, if it does then -// BOOST_NO_CXX11_LAMBDAS should not be defined. -// See file boost_no_lambdas.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_LAMBDAS -#include "boost_no_lambdas.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_lambdas::test(); -} - diff --git a/libs/config/test/no_lambdas_pass.cpp b/libs/config/test/no_lambdas_pass.cpp deleted file mode 100644 index 453a72a73..000000000 --- a/libs/config/test/no_lambdas_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 14 16:01:35 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_LAMBDAS -// This file should compile, if it does not then -// BOOST_NO_CXX11_LAMBDAS should be defined. -// See file boost_no_lambdas.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_LAMBDAS -#include "boost_no_lambdas.ipp" -#else -namespace boost_no_cxx11_lambdas = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_lambdas::test(); -} - diff --git a/libs/config/test/no_limits_const_exp_fail.cpp b/libs/config/test/no_limits_const_exp_fail.cpp deleted file mode 100644 index 9f916d9bd..000000000 --- a/libs/config/test/no_limits_const_exp_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -// This file should not compile, if it does then -// BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS should not be defined. -// See file boost_no_limits_const_exp.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -#include "boost_no_limits_const_exp.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_limits_compile_time_constants::test(); -} - diff --git a/libs/config/test/no_limits_const_exp_pass.cpp b/libs/config/test/no_limits_const_exp_pass.cpp deleted file mode 100644 index a280b7657..000000000 --- a/libs/config/test/no_limits_const_exp_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -// This file should compile, if it does not then -// BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS should be defined. -// See file boost_no_limits_const_exp.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -#include "boost_no_limits_const_exp.ipp" -#else -namespace boost_no_limits_compile_time_constants = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_limits_compile_time_constants::test(); -} - diff --git a/libs/config/test/no_limits_fail.cpp b/libs/config/test/no_limits_fail.cpp deleted file mode 100644 index d685397cc..000000000 --- a/libs/config/test/no_limits_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_LIMITS -// This file should not compile, if it does then -// BOOST_NO_LIMITS should not be defined. -// See file boost_no_limits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_LIMITS -#include "boost_no_limits.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_limits::test(); -} - diff --git a/libs/config/test/no_limits_pass.cpp b/libs/config/test/no_limits_pass.cpp deleted file mode 100644 index 7d77cac32..000000000 --- a/libs/config/test/no_limits_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_LIMITS -// This file should compile, if it does not then -// BOOST_NO_LIMITS should be defined. -// See file boost_no_limits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_LIMITS -#include "boost_no_limits.ipp" -#else -namespace boost_no_limits = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_limits::test(); -} - diff --git a/libs/config/test/no_ll_limits_fail.cpp b/libs/config/test/no_ll_limits_fail.cpp deleted file mode 100644 index 477262c7b..000000000 --- a/libs/config/test/no_ll_limits_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_LONG_LONG_NUMERIC_LIMITS -// This file should not compile, if it does then -// BOOST_NO_LONG_LONG_NUMERIC_LIMITS should not be defined. -// See file boost_no_ll_limits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_LONG_LONG_NUMERIC_LIMITS -#include "boost_no_ll_limits.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_long_long_numeric_limits::test(); -} - diff --git a/libs/config/test/no_ll_limits_pass.cpp b/libs/config/test/no_ll_limits_pass.cpp deleted file mode 100644 index 2c6a3860a..000000000 --- a/libs/config/test/no_ll_limits_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_LONG_LONG_NUMERIC_LIMITS -// This file should compile, if it does not then -// BOOST_NO_LONG_LONG_NUMERIC_LIMITS should be defined. -// See file boost_no_ll_limits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_LONG_LONG_NUMERIC_LIMITS -#include "boost_no_ll_limits.ipp" -#else -namespace boost_no_long_long_numeric_limits = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_long_long_numeric_limits::test(); -} - diff --git a/libs/config/test/no_long_long_fail.cpp b/libs/config/test/no_long_long_fail.cpp deleted file mode 100644 index 2a2e724f0..000000000 --- a/libs/config/test/no_long_long_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 07:24:54 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_LONG_LONG -// This file should not compile, if it does then -// BOOST_NO_LONG_LONG should not be defined. -// See file boost_no_long_long.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_LONG_LONG -#include "boost_no_long_long.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_long_long::test(); -} - diff --git a/libs/config/test/no_long_long_pass.cpp b/libs/config/test/no_long_long_pass.cpp deleted file mode 100644 index 3e00f1b39..000000000 --- a/libs/config/test/no_long_long_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 07:24:54 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_LONG_LONG -// This file should compile, if it does not then -// BOOST_NO_LONG_LONG should be defined. -// See file boost_no_long_long.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_LONG_LONG -#include "boost_no_long_long.ipp" -#else -namespace boost_no_long_long = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_long_long::test(); -} - diff --git a/libs/config/test/no_mem_func_spec_fail.cpp b/libs/config/test/no_mem_func_spec_fail.cpp deleted file mode 100644 index 4216ed409..000000000 --- a/libs/config/test/no_mem_func_spec_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS -// This file should not compile, if it does then -// BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS should not be defined. -// See file boost_no_mem_func_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS -#include "boost_no_mem_func_spec.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_member_function_specializations::test(); -} - diff --git a/libs/config/test/no_mem_func_spec_pass.cpp b/libs/config/test/no_mem_func_spec_pass.cpp deleted file mode 100644 index a26ceb0e3..000000000 --- a/libs/config/test/no_mem_func_spec_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS -// This file should compile, if it does not then -// BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS should be defined. -// See file boost_no_mem_func_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_MEMBER_FUNCTION_SPECIALIZATIONS -#include "boost_no_mem_func_spec.ipp" -#else -namespace boost_no_member_function_specializations = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_member_function_specializations::test(); -} - diff --git a/libs/config/test/no_mem_tem_keyword_fail.cpp b/libs/config/test/no_mem_tem_keyword_fail.cpp deleted file mode 100644 index fe6b96289..000000000 --- a/libs/config/test/no_mem_tem_keyword_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_MEMBER_TEMPLATE_KEYWORD -// This file should not compile, if it does then -// BOOST_NO_MEMBER_TEMPLATE_KEYWORD should not be defined. -// See file boost_no_mem_tem_keyword.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_MEMBER_TEMPLATE_KEYWORD -#include "boost_no_mem_tem_keyword.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_member_template_keyword::test(); -} - diff --git a/libs/config/test/no_mem_tem_keyword_pass.cpp b/libs/config/test/no_mem_tem_keyword_pass.cpp deleted file mode 100644 index 7beb15975..000000000 --- a/libs/config/test/no_mem_tem_keyword_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_MEMBER_TEMPLATE_KEYWORD -// This file should compile, if it does not then -// BOOST_NO_MEMBER_TEMPLATE_KEYWORD should be defined. -// See file boost_no_mem_tem_keyword.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_MEMBER_TEMPLATE_KEYWORD -#include "boost_no_mem_tem_keyword.ipp" -#else -namespace boost_no_member_template_keyword = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_member_template_keyword::test(); -} - diff --git a/libs/config/test/no_mem_tem_pnts_fail.cpp b/libs/config/test/no_mem_tem_pnts_fail.cpp deleted file mode 100644 index bca3ee0af..000000000 --- a/libs/config/test/no_mem_tem_pnts_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS -// This file should not compile, if it does then -// BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS should not be defined. -// See file boost_no_mem_tem_pnts.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS -#include "boost_no_mem_tem_pnts.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_pointer_to_member_template_parameters::test(); -} - diff --git a/libs/config/test/no_mem_tem_pnts_pass.cpp b/libs/config/test/no_mem_tem_pnts_pass.cpp deleted file mode 100644 index bf273cc36..000000000 --- a/libs/config/test/no_mem_tem_pnts_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS -// This file should compile, if it does not then -// BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS should be defined. -// See file boost_no_mem_tem_pnts.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS -#include "boost_no_mem_tem_pnts.ipp" -#else -namespace boost_no_pointer_to_member_template_parameters = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_pointer_to_member_template_parameters::test(); -} - diff --git a/libs/config/test/no_mem_templ_frnds_fail.cpp b/libs/config/test/no_mem_templ_frnds_fail.cpp deleted file mode 100644 index a8602c1f1..000000000 --- a/libs/config/test/no_mem_templ_frnds_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_MEMBER_TEMPLATE_FRIENDS -// This file should not compile, if it does then -// BOOST_NO_MEMBER_TEMPLATE_FRIENDS should not be defined. -// See file boost_no_mem_templ_frnds.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS -#include "boost_no_mem_templ_frnds.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_member_template_friends::test(); -} - diff --git a/libs/config/test/no_mem_templ_frnds_pass.cpp b/libs/config/test/no_mem_templ_frnds_pass.cpp deleted file mode 100644 index a234eba7b..000000000 --- a/libs/config/test/no_mem_templ_frnds_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_MEMBER_TEMPLATE_FRIENDS -// This file should compile, if it does not then -// BOOST_NO_MEMBER_TEMPLATE_FRIENDS should be defined. -// See file boost_no_mem_templ_frnds.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS -#include "boost_no_mem_templ_frnds.ipp" -#else -namespace boost_no_member_template_friends = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_member_template_friends::test(); -} - diff --git a/libs/config/test/no_mem_templates_fail.cpp b/libs/config/test/no_mem_templates_fail.cpp deleted file mode 100644 index 3b6227da6..000000000 --- a/libs/config/test/no_mem_templates_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_MEMBER_TEMPLATES -// This file should not compile, if it does then -// BOOST_NO_MEMBER_TEMPLATES should not be defined. -// See file boost_no_mem_templates.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_MEMBER_TEMPLATES -#include "boost_no_mem_templates.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_member_templates::test(); -} - diff --git a/libs/config/test/no_mem_templates_pass.cpp b/libs/config/test/no_mem_templates_pass.cpp deleted file mode 100644 index 7935f1146..000000000 --- a/libs/config/test/no_mem_templates_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:01 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_MEMBER_TEMPLATES -// This file should compile, if it does not then -// BOOST_NO_MEMBER_TEMPLATES should be defined. -// See file boost_no_mem_templates.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_MEMBER_TEMPLATES -#include "boost_no_mem_templates.ipp" -#else -namespace boost_no_member_templates = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_member_templates::test(); -} - diff --git a/libs/config/test/no_nested_friendship_fail.cpp b/libs/config/test/no_nested_friendship_fail.cpp deleted file mode 100644 index dd90e404a..000000000 --- a/libs/config/test/no_nested_friendship_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Sep 18 23:32:18 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_NESTED_FRIENDSHIP -// This file should not compile, if it does then -// BOOST_NO_NESTED_FRIENDSHIP should not be defined. -// See file boost_no_nested_friendship.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_NESTED_FRIENDSHIP -#include "boost_no_nested_friendship.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_nested_friendship::test(); -} - diff --git a/libs/config/test/no_nested_friendship_pass.cpp b/libs/config/test/no_nested_friendship_pass.cpp deleted file mode 100644 index 3e114bc9d..000000000 --- a/libs/config/test/no_nested_friendship_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Sep 18 23:32:18 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_NESTED_FRIENDSHIP -// This file should compile, if it does not then -// BOOST_NO_NESTED_FRIENDSHIP should be defined. -// See file boost_no_nested_friendship.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_NESTED_FRIENDSHIP -#include "boost_no_nested_friendship.ipp" -#else -namespace boost_no_nested_friendship = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_nested_friendship::test(); -} - diff --git a/libs/config/test/no_noexcept_fail.cpp b/libs/config/test/no_noexcept_fail.cpp deleted file mode 100644 index b49d9bed7..000000000 --- a/libs/config/test/no_noexcept_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 5 04:40:08 2011 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_NOEXCEPT -// This file should not compile, if it does then -// BOOST_NO_CXX11_NOEXCEPT should not be defined. -// See file boost_no_noexcept.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_NOEXCEPT -#include "boost_no_noexcept.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_noexcept::test(); -} - diff --git a/libs/config/test/no_noexcept_pass.cpp b/libs/config/test/no_noexcept_pass.cpp deleted file mode 100644 index 4f07f7d07..000000000 --- a/libs/config/test/no_noexcept_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 5 04:40:08 2011 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_NOEXCEPT -// This file should compile, if it does not then -// BOOST_NO_CXX11_NOEXCEPT should be defined. -// See file boost_no_noexcept.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_NOEXCEPT -#include "boost_no_noexcept.ipp" -#else -namespace boost_no_cxx11_noexcept = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_noexcept::test(); -} - diff --git a/libs/config/test/no_nullptr_fail.cpp b/libs/config/test/no_nullptr_fail.cpp deleted file mode 100644 index c870ef236..000000000 --- a/libs/config/test/no_nullptr_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 14 16:01:35 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_NULLPTR -// This file should not compile, if it does then -// BOOST_NO_CXX11_NULLPTR should not be defined. -// See file boost_no_nullptr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_NULLPTR -#include "boost_no_nullptr.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_nullptr::test(); -} - diff --git a/libs/config/test/no_nullptr_pass.cpp b/libs/config/test/no_nullptr_pass.cpp deleted file mode 100644 index 34450ad50..000000000 --- a/libs/config/test/no_nullptr_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 14 16:01:35 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_NULLPTR -// This file should compile, if it does not then -// BOOST_NO_CXX11_NULLPTR should be defined. -// See file boost_no_nullptr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_NULLPTR -#include "boost_no_nullptr.ipp" -#else -namespace boost_no_cxx11_nullptr = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_nullptr::test(); -} - diff --git a/libs/config/test/no_ops_in_namespace_fail.cpp b/libs/config/test/no_ops_in_namespace_fail.cpp deleted file mode 100644 index 2e746ece0..000000000 --- a/libs/config/test/no_ops_in_namespace_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_OPERATORS_IN_NAMESPACE -// This file should not compile, if it does then -// BOOST_NO_OPERATORS_IN_NAMESPACE should not be defined. -// See file boost_no_ops_in_namespace.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_OPERATORS_IN_NAMESPACE -#include "boost_no_ops_in_namespace.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_operators_in_namespace::test(); -} - diff --git a/libs/config/test/no_ops_in_namespace_pass.cpp b/libs/config/test/no_ops_in_namespace_pass.cpp deleted file mode 100644 index 5004411dd..000000000 --- a/libs/config/test/no_ops_in_namespace_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_OPERATORS_IN_NAMESPACE -// This file should compile, if it does not then -// BOOST_NO_OPERATORS_IN_NAMESPACE should be defined. -// See file boost_no_ops_in_namespace.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_OPERATORS_IN_NAMESPACE -#include "boost_no_ops_in_namespace.ipp" -#else -namespace boost_no_operators_in_namespace = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_operators_in_namespace::test(); -} - diff --git a/libs/config/test/no_part_spec_def_args_fail.cpp b/libs/config/test/no_part_spec_def_args_fail.cpp deleted file mode 100644 index 68f34d275..000000000 --- a/libs/config/test/no_part_spec_def_args_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Mon Apr 21 12:40:41 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 44422 2008-04-14 18:06:59Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS -// This file should not compile, if it does then -// BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS should not be defined. -// See file boost_no_part_spec_def_args.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS -#include "boost_no_part_spec_def_args.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_partial_specialization_implicit_default_args::test(); -} - diff --git a/libs/config/test/no_part_spec_def_args_pass.cpp b/libs/config/test/no_part_spec_def_args_pass.cpp deleted file mode 100644 index 06864228b..000000000 --- a/libs/config/test/no_part_spec_def_args_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Mon Apr 21 12:40:41 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 44422 2008-04-14 18:06:59Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS -// This file should compile, if it does not then -// BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS should be defined. -// See file boost_no_part_spec_def_args.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_PARTIAL_SPECIALIZATION_IMPLICIT_DEFAULT_ARGS -#include "boost_no_part_spec_def_args.ipp" -#else -namespace boost_no_partial_specialization_implicit_default_args = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_partial_specialization_implicit_default_args::test(); -} - diff --git a/libs/config/test/no_partial_spec_fail.cpp b/libs/config/test/no_partial_spec_fail.cpp deleted file mode 100644 index 0b24a97d8..000000000 --- a/libs/config/test/no_partial_spec_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -// This file should not compile, if it does then -// BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION should not be defined. -// See file boost_no_partial_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -#include "boost_no_partial_spec.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_template_partial_specialization::test(); -} - diff --git a/libs/config/test/no_partial_spec_pass.cpp b/libs/config/test/no_partial_spec_pass.cpp deleted file mode 100644 index 5767410a6..000000000 --- a/libs/config/test/no_partial_spec_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -// This file should compile, if it does not then -// BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION should be defined. -// See file boost_no_partial_spec.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -#include "boost_no_partial_spec.ipp" -#else -namespace boost_no_template_partial_specialization = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_template_partial_specialization::test(); -} - diff --git a/libs/config/test/no_priv_aggregate_fail.cpp b/libs/config/test/no_priv_aggregate_fail.cpp deleted file mode 100644 index 22ed88fa6..000000000 --- a/libs/config/test/no_priv_aggregate_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_PRIVATE_IN_AGGREGATE -// This file should not compile, if it does then -// BOOST_NO_PRIVATE_IN_AGGREGATE should not be defined. -// See file boost_no_priv_aggregate.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_PRIVATE_IN_AGGREGATE -#include "boost_no_priv_aggregate.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_private_in_aggregate::test(); -} - diff --git a/libs/config/test/no_priv_aggregate_pass.cpp b/libs/config/test/no_priv_aggregate_pass.cpp deleted file mode 100644 index 839be57a9..000000000 --- a/libs/config/test/no_priv_aggregate_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_PRIVATE_IN_AGGREGATE -// This file should compile, if it does not then -// BOOST_NO_PRIVATE_IN_AGGREGATE should be defined. -// See file boost_no_priv_aggregate.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_PRIVATE_IN_AGGREGATE -#include "boost_no_priv_aggregate.ipp" -#else -namespace boost_no_private_in_aggregate = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_private_in_aggregate::test(); -} - diff --git a/libs/config/test/no_ptr_mem_const_fail.cpp b/libs/config/test/no_ptr_mem_const_fail.cpp deleted file mode 100644 index 36eb9dc35..000000000 --- a/libs/config/test/no_ptr_mem_const_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_POINTER_TO_MEMBER_CONST -// This file should not compile, if it does then -// BOOST_NO_POINTER_TO_MEMBER_CONST should not be defined. -// See file boost_no_ptr_mem_const.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_POINTER_TO_MEMBER_CONST -#include "boost_no_ptr_mem_const.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_pointer_to_member_const::test(); -} - diff --git a/libs/config/test/no_ptr_mem_const_pass.cpp b/libs/config/test/no_ptr_mem_const_pass.cpp deleted file mode 100644 index c15d7ad1a..000000000 --- a/libs/config/test/no_ptr_mem_const_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_POINTER_TO_MEMBER_CONST -// This file should compile, if it does not then -// BOOST_NO_POINTER_TO_MEMBER_CONST should be defined. -// See file boost_no_ptr_mem_const.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_POINTER_TO_MEMBER_CONST -#include "boost_no_ptr_mem_const.ipp" -#else -namespace boost_no_pointer_to_member_const = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_pointer_to_member_const::test(); -} - diff --git a/libs/config/test/no_range_based_for_fail.cpp b/libs/config/test/no_range_based_for_fail.cpp deleted file mode 100644 index 6b0a0f54d..000000000 --- a/libs/config/test/no_range_based_for_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Tue Jul 10 14:28:33 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_RANGE_BASED_FOR -// This file should not compile, if it does then -// BOOST_NO_CXX11_RANGE_BASED_FOR should not be defined. -// See file boost_no_range_based_for.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_RANGE_BASED_FOR -#include "boost_no_range_based_for.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_range_based_for::test(); -} - diff --git a/libs/config/test/no_range_based_for_pass.cpp b/libs/config/test/no_range_based_for_pass.cpp deleted file mode 100644 index b8207c579..000000000 --- a/libs/config/test/no_range_based_for_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Tue Jul 10 14:28:33 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_RANGE_BASED_FOR -// This file should compile, if it does not then -// BOOST_NO_CXX11_RANGE_BASED_FOR should be defined. -// See file boost_no_range_based_for.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_RANGE_BASED_FOR -#include "boost_no_range_based_for.ipp" -#else -namespace boost_no_cxx11_range_based_for = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_range_based_for::test(); -} - diff --git a/libs/config/test/no_raw_literals_fail.cpp b/libs/config/test/no_raw_literals_fail.cpp deleted file mode 100644 index 3c535fadf..000000000 --- a/libs/config/test/no_raw_literals_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Jun 19 16:26:16 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_RAW_LITERALS -// This file should not compile, if it does then -// BOOST_NO_CXX11_RAW_LITERALS should not be defined. -// See file boost_no_raw_literals.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_RAW_LITERALS -#include "boost_no_raw_literals.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_raw_literals::test(); -} - diff --git a/libs/config/test/no_raw_literals_pass.cpp b/libs/config/test/no_raw_literals_pass.cpp deleted file mode 100644 index ddf99c271..000000000 --- a/libs/config/test/no_raw_literals_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Jun 19 16:26:16 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_RAW_LITERALS -// This file should compile, if it does not then -// BOOST_NO_CXX11_RAW_LITERALS should be defined. -// See file boost_no_raw_literals.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_RAW_LITERALS -#include "boost_no_raw_literals.ipp" -#else -namespace boost_no_cxx11_raw_literals = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_raw_literals::test(); -} - diff --git a/libs/config/test/no_ret_det_fail.cpp b/libs/config/test/no_ret_det_fail.cpp deleted file mode 100644 index e48bfa4f7..000000000 --- a/libs/config/test/no_ret_det_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_UNREACHABLE_RETURN_DETECTION -// This file should not compile, if it does then -// BOOST_NO_UNREACHABLE_RETURN_DETECTION should not be defined. -// See file boost_no_ret_det.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_UNREACHABLE_RETURN_DETECTION -#include "boost_no_ret_det.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_unreachable_return_detection::test(); -} - diff --git a/libs/config/test/no_ret_det_pass.cpp b/libs/config/test/no_ret_det_pass.cpp deleted file mode 100644 index 7d45813f7..000000000 --- a/libs/config/test/no_ret_det_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_UNREACHABLE_RETURN_DETECTION -// This file should compile, if it does not then -// BOOST_NO_UNREACHABLE_RETURN_DETECTION should be defined. -// See file boost_no_ret_det.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_UNREACHABLE_RETURN_DETECTION -#include "boost_no_ret_det.ipp" -#else -namespace boost_no_unreachable_return_detection = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_unreachable_return_detection::test(); -} - diff --git a/libs/config/test/no_rtti_fail.cpp b/libs/config/test/no_rtti_fail.cpp deleted file mode 100644 index f24f15d62..000000000 --- a/libs/config/test/no_rtti_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Mon Aug 25 10:51:51 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 47351 2008-07-12 12:41:52Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_RTTI -// This file should not compile, if it does then -// BOOST_NO_RTTI should not be defined. -// See file boost_no_rtti.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_RTTI -#include "boost_no_rtti.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_rtti::test(); -} - diff --git a/libs/config/test/no_rtti_pass.cpp b/libs/config/test/no_rtti_pass.cpp deleted file mode 100644 index 9809213f2..000000000 --- a/libs/config/test/no_rtti_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Mon Aug 25 10:51:51 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 47351 2008-07-12 12:41:52Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_RTTI -// This file should compile, if it does not then -// BOOST_NO_RTTI should be defined. -// See file boost_no_rtti.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_RTTI -#include "boost_no_rtti.ipp" -#else -namespace boost_no_rtti = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_rtti::test(); -} - diff --git a/libs/config/test/no_rvalue_references_fail.cpp b/libs/config/test/no_rvalue_references_fail.cpp deleted file mode 100644 index 390b6c5f5..000000000 --- a/libs/config/test/no_rvalue_references_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 07:24:54 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_RVALUE_REFERENCES -// This file should not compile, if it does then -// BOOST_NO_CXX11_RVALUE_REFERENCES should not be defined. -// See file boost_no_rvalue_references.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES -#include "boost_no_rvalue_references.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_rvalue_references::test(); -} - diff --git a/libs/config/test/no_rvalue_references_pass.cpp b/libs/config/test/no_rvalue_references_pass.cpp deleted file mode 100644 index c11494c6c..000000000 --- a/libs/config/test/no_rvalue_references_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 07:24:54 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_RVALUE_REFERENCES -// This file should compile, if it does not then -// BOOST_NO_CXX11_RVALUE_REFERENCES should be defined. -// See file boost_no_rvalue_references.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES -#include "boost_no_rvalue_references.ipp" -#else -namespace boost_no_cxx11_rvalue_references = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_rvalue_references::test(); -} - diff --git a/libs/config/test/no_scoped_enums_fail.cpp b/libs/config/test/no_scoped_enums_fail.cpp deleted file mode 100644 index 4c1c184df..000000000 --- a/libs/config/test/no_scoped_enums_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 08:00:48 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_SCOPED_ENUMS -// This file should not compile, if it does then -// BOOST_NO_CXX11_SCOPED_ENUMS should not be defined. -// See file boost_no_scoped_enums.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_SCOPED_ENUMS -#include "boost_no_scoped_enums.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_scoped_enums::test(); -} - diff --git a/libs/config/test/no_scoped_enums_pass.cpp b/libs/config/test/no_scoped_enums_pass.cpp deleted file mode 100644 index 501fea90e..000000000 --- a/libs/config/test/no_scoped_enums_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 08:00:48 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_SCOPED_ENUMS -// This file should compile, if it does not then -// BOOST_NO_CXX11_SCOPED_ENUMS should be defined. -// See file boost_no_scoped_enums.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_SCOPED_ENUMS -#include "boost_no_scoped_enums.ipp" -#else -namespace boost_no_cxx11_scoped_enums = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_scoped_enums::test(); -} - diff --git a/libs/config/test/no_sfinae_expr_fail.cpp b/libs/config/test/no_sfinae_expr_fail.cpp deleted file mode 100644 index e7c8b03d7..000000000 --- a/libs/config/test/no_sfinae_expr_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Aug 02 08:25:59 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_SFINAE_EXPR -// This file should not compile, if it does then -// BOOST_NO_SFINAE_EXPR should not be defined. -// See file boost_no_sfinae_expr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_SFINAE_EXPR -#include "boost_no_sfinae_expr.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_sfinae_expr::test(); -} - diff --git a/libs/config/test/no_sfinae_expr_pass.cpp b/libs/config/test/no_sfinae_expr_pass.cpp deleted file mode 100644 index fc87d786b..000000000 --- a/libs/config/test/no_sfinae_expr_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Sun Aug 02 08:25:59 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_SFINAE_EXPR -// This file should compile, if it does not then -// BOOST_NO_SFINAE_EXPR should be defined. -// See file boost_no_sfinae_expr.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_SFINAE_EXPR -#include "boost_no_sfinae_expr.ipp" -#else -namespace boost_no_sfinae_expr = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_sfinae_expr::test(); -} - diff --git a/libs/config/test/no_sfinae_fail.cpp b/libs/config/test/no_sfinae_fail.cpp deleted file mode 100644 index 915f92460..000000000 --- a/libs/config/test/no_sfinae_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_SFINAE -// This file should not compile, if it does then -// BOOST_NO_SFINAE should not be defined. -// See file boost_no_sfinae.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_SFINAE -#include "boost_no_sfinae.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_sfinae::test(); -} - diff --git a/libs/config/test/no_sfinae_pass.cpp b/libs/config/test/no_sfinae_pass.cpp deleted file mode 100644 index 8ebfc383f..000000000 --- a/libs/config/test/no_sfinae_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_SFINAE -// This file should compile, if it does not then -// BOOST_NO_SFINAE should be defined. -// See file boost_no_sfinae.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_SFINAE -#include "boost_no_sfinae.ipp" -#else -namespace boost_no_sfinae = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_sfinae::test(); -} - diff --git a/libs/config/test/no_sstream_fail.cpp b/libs/config/test/no_sstream_fail.cpp deleted file mode 100644 index 3cb5d9af1..000000000 --- a/libs/config/test/no_sstream_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STRINGSTREAM -// This file should not compile, if it does then -// BOOST_NO_STRINGSTREAM should not be defined. -// See file boost_no_sstream.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STRINGSTREAM -#include "boost_no_sstream.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_stringstream::test(); -} - diff --git a/libs/config/test/no_sstream_pass.cpp b/libs/config/test/no_sstream_pass.cpp deleted file mode 100644 index de325a397..000000000 --- a/libs/config/test/no_sstream_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STRINGSTREAM -// This file should compile, if it does not then -// BOOST_NO_STRINGSTREAM should be defined. -// See file boost_no_sstream.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STRINGSTREAM -#include "boost_no_sstream.ipp" -#else -namespace boost_no_stringstream = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_stringstream::test(); -} - diff --git a/libs/config/test/no_static_assert_fail.cpp b/libs/config/test/no_static_assert_fail.cpp deleted file mode 100644 index f958c683d..000000000 --- a/libs/config/test/no_static_assert_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 07:24:54 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_STATIC_ASSERT -// This file should not compile, if it does then -// BOOST_NO_CXX11_STATIC_ASSERT should not be defined. -// See file boost_no_static_assert.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_STATIC_ASSERT -#include "boost_no_static_assert.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_static_assert::test(); -} - diff --git a/libs/config/test/no_static_assert_pass.cpp b/libs/config/test/no_static_assert_pass.cpp deleted file mode 100644 index 852988763..000000000 --- a/libs/config/test/no_static_assert_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 07:24:54 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_STATIC_ASSERT -// This file should compile, if it does not then -// BOOST_NO_CXX11_STATIC_ASSERT should be defined. -// See file boost_no_static_assert.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_STATIC_ASSERT -#include "boost_no_static_assert.ipp" -#else -namespace boost_no_cxx11_static_assert = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_static_assert::test(); -} - diff --git a/libs/config/test/no_std_allocator_fail.cpp b/libs/config/test/no_std_allocator_fail.cpp deleted file mode 100644 index e5213dcc2..000000000 --- a/libs/config/test/no_std_allocator_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_ALLOCATOR -// This file should not compile, if it does then -// BOOST_NO_STD_ALLOCATOR should not be defined. -// See file boost_no_std_allocator.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STD_ALLOCATOR -#include "boost_no_std_allocator.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_std_allocator::test(); -} - diff --git a/libs/config/test/no_std_allocator_pass.cpp b/libs/config/test/no_std_allocator_pass.cpp deleted file mode 100644 index 63ab611c6..000000000 --- a/libs/config/test/no_std_allocator_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_ALLOCATOR -// This file should compile, if it does not then -// BOOST_NO_STD_ALLOCATOR should be defined. -// See file boost_no_std_allocator.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STD_ALLOCATOR -#include "boost_no_std_allocator.ipp" -#else -namespace boost_no_std_allocator = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_std_allocator::test(); -} - diff --git a/libs/config/test/no_std_distance_fail.cpp b/libs/config/test/no_std_distance_fail.cpp deleted file mode 100644 index a8c21a43a..000000000 --- a/libs/config/test/no_std_distance_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_DISTANCE -// This file should not compile, if it does then -// BOOST_NO_STD_DISTANCE should not be defined. -// See file boost_no_std_distance.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STD_DISTANCE -#include "boost_no_std_distance.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_std_distance::test(); -} - diff --git a/libs/config/test/no_std_distance_pass.cpp b/libs/config/test/no_std_distance_pass.cpp deleted file mode 100644 index 870d86d9c..000000000 --- a/libs/config/test/no_std_distance_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_DISTANCE -// This file should compile, if it does not then -// BOOST_NO_STD_DISTANCE should be defined. -// See file boost_no_std_distance.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STD_DISTANCE -#include "boost_no_std_distance.ipp" -#else -namespace boost_no_std_distance = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_std_distance::test(); -} - diff --git a/libs/config/test/no_std_iter_traits_fail.cpp b/libs/config/test/no_std_iter_traits_fail.cpp deleted file mode 100644 index 98ba389f7..000000000 --- a/libs/config/test/no_std_iter_traits_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_ITERATOR_TRAITS -// This file should not compile, if it does then -// BOOST_NO_STD_ITERATOR_TRAITS should not be defined. -// See file boost_no_std_iter_traits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STD_ITERATOR_TRAITS -#include "boost_no_std_iter_traits.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_std_iterator_traits::test(); -} - diff --git a/libs/config/test/no_std_iter_traits_pass.cpp b/libs/config/test/no_std_iter_traits_pass.cpp deleted file mode 100644 index 30b7399d9..000000000 --- a/libs/config/test/no_std_iter_traits_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_ITERATOR_TRAITS -// This file should compile, if it does not then -// BOOST_NO_STD_ITERATOR_TRAITS should be defined. -// See file boost_no_std_iter_traits.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STD_ITERATOR_TRAITS -#include "boost_no_std_iter_traits.ipp" -#else -namespace boost_no_std_iterator_traits = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_std_iterator_traits::test(); -} - diff --git a/libs/config/test/no_std_iterator_fail.cpp b/libs/config/test/no_std_iterator_fail.cpp deleted file mode 100644 index 7da3216dc..000000000 --- a/libs/config/test/no_std_iterator_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_ITERATOR -// This file should not compile, if it does then -// BOOST_NO_STD_ITERATOR should not be defined. -// See file boost_no_std_iterator.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STD_ITERATOR -#include "boost_no_std_iterator.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_std_iterator::test(); -} - diff --git a/libs/config/test/no_std_iterator_pass.cpp b/libs/config/test/no_std_iterator_pass.cpp deleted file mode 100644 index 7dbd9ce5f..000000000 --- a/libs/config/test/no_std_iterator_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_ITERATOR -// This file should compile, if it does not then -// BOOST_NO_STD_ITERATOR should be defined. -// See file boost_no_std_iterator.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STD_ITERATOR -#include "boost_no_std_iterator.ipp" -#else -namespace boost_no_std_iterator = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_std_iterator::test(); -} - diff --git a/libs/config/test/no_std_locale_fail.cpp b/libs/config/test/no_std_locale_fail.cpp deleted file mode 100644 index 46d2a4656..000000000 --- a/libs/config/test/no_std_locale_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_LOCALE -// This file should not compile, if it does then -// BOOST_NO_STD_LOCALE should not be defined. -// See file boost_no_std_locale.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STD_LOCALE -#include "boost_no_std_locale.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_std_locale::test(); -} - diff --git a/libs/config/test/no_std_locale_pass.cpp b/libs/config/test/no_std_locale_pass.cpp deleted file mode 100644 index 95a16483c..000000000 --- a/libs/config/test/no_std_locale_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_LOCALE -// This file should compile, if it does not then -// BOOST_NO_STD_LOCALE should be defined. -// See file boost_no_std_locale.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STD_LOCALE -#include "boost_no_std_locale.ipp" -#else -namespace boost_no_std_locale = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_std_locale::test(); -} - diff --git a/libs/config/test/no_std_messages_fail.cpp b/libs/config/test/no_std_messages_fail.cpp deleted file mode 100644 index f5da5a28b..000000000 --- a/libs/config/test/no_std_messages_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_MESSAGES -// This file should not compile, if it does then -// BOOST_NO_STD_MESSAGES should not be defined. -// See file boost_no_std_messages.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STD_MESSAGES -#include "boost_no_std_messages.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_std_messages::test(); -} - diff --git a/libs/config/test/no_std_messages_pass.cpp b/libs/config/test/no_std_messages_pass.cpp deleted file mode 100644 index c3d1786e0..000000000 --- a/libs/config/test/no_std_messages_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_MESSAGES -// This file should compile, if it does not then -// BOOST_NO_STD_MESSAGES should be defined. -// See file boost_no_std_messages.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STD_MESSAGES -#include "boost_no_std_messages.ipp" -#else -namespace boost_no_std_messages = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_std_messages::test(); -} - diff --git a/libs/config/test/no_std_min_max_fail.cpp b/libs/config/test/no_std_min_max_fail.cpp deleted file mode 100644 index 438d55a2b..000000000 --- a/libs/config/test/no_std_min_max_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_MIN_MAX -// This file should not compile, if it does then -// BOOST_NO_STD_MIN_MAX should not be defined. -// See file boost_no_std_min_max.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STD_MIN_MAX -#include "boost_no_std_min_max.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_std_min_max::test(); -} - diff --git a/libs/config/test/no_std_min_max_pass.cpp b/libs/config/test/no_std_min_max_pass.cpp deleted file mode 100644 index f5349aa39..000000000 --- a/libs/config/test/no_std_min_max_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_MIN_MAX -// This file should compile, if it does not then -// BOOST_NO_STD_MIN_MAX should be defined. -// See file boost_no_std_min_max.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STD_MIN_MAX -#include "boost_no_std_min_max.ipp" -#else -namespace boost_no_std_min_max = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_std_min_max::test(); -} - diff --git a/libs/config/test/no_std_oi_assign_fail.cpp b/libs/config/test/no_std_oi_assign_fail.cpp deleted file mode 100644 index 353e3a109..000000000 --- a/libs/config/test/no_std_oi_assign_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN -// This file should not compile, if it does then -// BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN should not be defined. -// See file boost_no_std_oi_assign.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN -#include "boost_no_std_oi_assign.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_std_output_iterator_assign::test(); -} - diff --git a/libs/config/test/no_std_oi_assign_pass.cpp b/libs/config/test/no_std_oi_assign_pass.cpp deleted file mode 100644 index 7f16148db..000000000 --- a/libs/config/test/no_std_oi_assign_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN -// This file should compile, if it does not then -// BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN should be defined. -// See file boost_no_std_oi_assign.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STD_OUTPUT_ITERATOR_ASSIGN -#include "boost_no_std_oi_assign.ipp" -#else -namespace boost_no_std_output_iterator_assign = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_std_output_iterator_assign::test(); -} - diff --git a/libs/config/test/no_std_typeinfo_fail.cpp b/libs/config/test/no_std_typeinfo_fail.cpp deleted file mode 100644 index 7bb145f07..000000000 --- a/libs/config/test/no_std_typeinfo_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:22 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_TYPEINFO -// This file should not compile, if it does then -// BOOST_NO_STD_TYPEINFO should not be defined. -// See file boost_no_std_typeinfo.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STD_TYPEINFO -#include "boost_no_std_typeinfo.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_std_typeinfo::test(); -} - diff --git a/libs/config/test/no_std_typeinfo_pass.cpp b/libs/config/test/no_std_typeinfo_pass.cpp deleted file mode 100644 index 0bfd031a3..000000000 --- a/libs/config/test/no_std_typeinfo_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:22 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_TYPEINFO -// This file should compile, if it does not then -// BOOST_NO_STD_TYPEINFO should be defined. -// See file boost_no_std_typeinfo.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STD_TYPEINFO -#include "boost_no_std_typeinfo.ipp" -#else -namespace boost_no_std_typeinfo = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_std_typeinfo::test(); -} - diff --git a/libs/config/test/no_std_use_facet_fail.cpp b/libs/config/test/no_std_use_facet_fail.cpp deleted file mode 100644 index e1c06b6a9..000000000 --- a/libs/config/test/no_std_use_facet_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_USE_FACET -// This file should not compile, if it does then -// BOOST_NO_STD_USE_FACET should not be defined. -// See file boost_no_std_use_facet.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STD_USE_FACET -#include "boost_no_std_use_facet.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_std_use_facet::test(); -} - diff --git a/libs/config/test/no_std_use_facet_pass.cpp b/libs/config/test/no_std_use_facet_pass.cpp deleted file mode 100644 index 111f38233..000000000 --- a/libs/config/test/no_std_use_facet_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_USE_FACET -// This file should compile, if it does not then -// BOOST_NO_STD_USE_FACET should be defined. -// See file boost_no_std_use_facet.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STD_USE_FACET -#include "boost_no_std_use_facet.ipp" -#else -namespace boost_no_std_use_facet = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_std_use_facet::test(); -} - diff --git a/libs/config/test/no_std_wstreambuf_fail.cpp b/libs/config/test/no_std_wstreambuf_fail.cpp deleted file mode 100644 index 40e6ecb94..000000000 --- a/libs/config/test/no_std_wstreambuf_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_WSTREAMBUF -// This file should not compile, if it does then -// BOOST_NO_STD_WSTREAMBUF should not be defined. -// See file boost_no_std_wstreambuf.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STD_WSTREAMBUF -#include "boost_no_std_wstreambuf.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_std_wstreambuf::test(); -} - diff --git a/libs/config/test/no_std_wstreambuf_pass.cpp b/libs/config/test/no_std_wstreambuf_pass.cpp deleted file mode 100644 index f5aa6c639..000000000 --- a/libs/config/test/no_std_wstreambuf_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_WSTREAMBUF -// This file should compile, if it does not then -// BOOST_NO_STD_WSTREAMBUF should be defined. -// See file boost_no_std_wstreambuf.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STD_WSTREAMBUF -#include "boost_no_std_wstreambuf.ipp" -#else -namespace boost_no_std_wstreambuf = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_std_wstreambuf::test(); -} - diff --git a/libs/config/test/no_std_wstring_fail.cpp b/libs/config/test/no_std_wstring_fail.cpp deleted file mode 100644 index 39a5fa83f..000000000 --- a/libs/config/test/no_std_wstring_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_WSTRING -// This file should not compile, if it does then -// BOOST_NO_STD_WSTRING should not be defined. -// See file boost_no_std_wstring.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STD_WSTRING -#include "boost_no_std_wstring.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_std_wstring::test(); -} - diff --git a/libs/config/test/no_std_wstring_pass.cpp b/libs/config/test/no_std_wstring_pass.cpp deleted file mode 100644 index 0fb8e0319..000000000 --- a/libs/config/test/no_std_wstring_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STD_WSTRING -// This file should compile, if it does not then -// BOOST_NO_STD_WSTRING should be defined. -// See file boost_no_std_wstring.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STD_WSTRING -#include "boost_no_std_wstring.ipp" -#else -namespace boost_no_std_wstring = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_std_wstring::test(); -} - diff --git a/libs/config/test/no_stdc_namespace_fail.cpp b/libs/config/test/no_stdc_namespace_fail.cpp deleted file mode 100644 index 745a2b899..000000000 --- a/libs/config/test/no_stdc_namespace_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STDC_NAMESPACE -// This file should not compile, if it does then -// BOOST_NO_STDC_NAMESPACE should not be defined. -// See file boost_no_stdc_namespace.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_STDC_NAMESPACE -#include "boost_no_stdc_namespace.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_stdc_namespace::test(); -} - diff --git a/libs/config/test/no_stdc_namespace_pass.cpp b/libs/config/test/no_stdc_namespace_pass.cpp deleted file mode 100644 index 8b8eeafe7..000000000 --- a/libs/config/test/no_stdc_namespace_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_STDC_NAMESPACE -// This file should compile, if it does not then -// BOOST_NO_STDC_NAMESPACE should be defined. -// See file boost_no_stdc_namespace.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_STDC_NAMESPACE -#include "boost_no_stdc_namespace.ipp" -#else -namespace boost_no_stdc_namespace = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_stdc_namespace::test(); -} - diff --git a/libs/config/test/no_swprintf_fail.cpp b/libs/config/test/no_swprintf_fail.cpp deleted file mode 100644 index 3df0b132f..000000000 --- a/libs/config/test/no_swprintf_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_SWPRINTF -// This file should not compile, if it does then -// BOOST_NO_SWPRINTF should not be defined. -// See file boost_no_swprintf.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_SWPRINTF -#include "boost_no_swprintf.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_swprintf::test(); -} - diff --git a/libs/config/test/no_swprintf_pass.cpp b/libs/config/test/no_swprintf_pass.cpp deleted file mode 100644 index 3d4ef7096..000000000 --- a/libs/config/test/no_swprintf_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_SWPRINTF -// This file should compile, if it does not then -// BOOST_NO_SWPRINTF should be defined. -// See file boost_no_swprintf.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_SWPRINTF -#include "boost_no_swprintf.ipp" -#else -namespace boost_no_swprintf = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_swprintf::test(); -} - diff --git a/libs/config/test/no_tem_local_classes_fail.cpp b/libs/config/test/no_tem_local_classes_fail.cpp deleted file mode 100644 index f6c2a31ff..000000000 --- a/libs/config/test/no_tem_local_classes_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Wed Mar 21 13:05:19 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS -// This file should not compile, if it does then -// BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS should not be defined. -// See file boost_no_tem_local_classes.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS -#include "boost_no_tem_local_classes.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_local_class_template_parameters::test(); -} - diff --git a/libs/config/test/no_tem_local_classes_pass.cpp b/libs/config/test/no_tem_local_classes_pass.cpp deleted file mode 100644 index 036819c18..000000000 --- a/libs/config/test/no_tem_local_classes_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Wed Mar 21 13:05:19 2012 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS -// This file should compile, if it does not then -// BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS should be defined. -// See file boost_no_tem_local_classes.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_LOCAL_CLASS_TEMPLATE_PARAMETERS -#include "boost_no_tem_local_classes.ipp" -#else -namespace boost_no_cxx11_local_class_template_parameters = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_local_class_template_parameters::test(); -} - diff --git a/libs/config/test/no_template_aliases_fail.cpp b/libs/config/test/no_template_aliases_fail.cpp deleted file mode 100644 index fd4af49e5..000000000 --- a/libs/config/test/no_template_aliases_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 14 16:01:36 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_TEMPLATE_ALIASES -// This file should not compile, if it does then -// BOOST_NO_CXX11_TEMPLATE_ALIASES should not be defined. -// See file boost_no_template_aliases.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_TEMPLATE_ALIASES -#include "boost_no_template_aliases.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_template_aliases::test(); -} - diff --git a/libs/config/test/no_template_aliases_pass.cpp b/libs/config/test/no_template_aliases_pass.cpp deleted file mode 100644 index ed66a355e..000000000 --- a/libs/config/test/no_template_aliases_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 14 16:01:36 2009 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_TEMPLATE_ALIASES -// This file should compile, if it does not then -// BOOST_NO_CXX11_TEMPLATE_ALIASES should be defined. -// See file boost_no_template_aliases.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_TEMPLATE_ALIASES -#include "boost_no_template_aliases.ipp" -#else -namespace boost_no_cxx11_template_aliases = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_template_aliases::test(); -} - diff --git a/libs/config/test/no_template_streams_fail.cpp b/libs/config/test/no_template_streams_fail.cpp deleted file mode 100644 index 16dfd5b16..000000000 --- a/libs/config/test/no_template_streams_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Mon Apr 21 10:10:52 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 44422 2008-04-14 18:06:59Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_TEMPLATED_IOSTREAMS -// This file should not compile, if it does then -// BOOST_NO_TEMPLATED_IOSTREAMS should not be defined. -// See file boost_no_template_streams.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_TEMPLATED_IOSTREAMS -#include "boost_no_template_streams.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_templated_iostreams::test(); -} - diff --git a/libs/config/test/no_template_streams_pass.cpp b/libs/config/test/no_template_streams_pass.cpp deleted file mode 100644 index 9ea790981..000000000 --- a/libs/config/test/no_template_streams_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Mon Apr 21 10:10:52 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 44422 2008-04-14 18:06:59Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_TEMPLATED_IOSTREAMS -// This file should compile, if it does not then -// BOOST_NO_TEMPLATED_IOSTREAMS should be defined. -// See file boost_no_template_streams.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_TEMPLATED_IOSTREAMS -#include "boost_no_template_streams.ipp" -#else -namespace boost_no_templated_iostreams = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_templated_iostreams::test(); -} - diff --git a/libs/config/test/no_template_template_fail.cpp b/libs/config/test/no_template_template_fail.cpp deleted file mode 100644 index 44f8a2b61..000000000 --- a/libs/config/test/no_template_template_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_TEMPLATE_TEMPLATES -// This file should not compile, if it does then -// BOOST_NO_TEMPLATE_TEMPLATES should not be defined. -// See file boost_no_template_template.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_TEMPLATE_TEMPLATES -#include "boost_no_template_template.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_template_templates::test(); -} - diff --git a/libs/config/test/no_template_template_pass.cpp b/libs/config/test/no_template_template_pass.cpp deleted file mode 100644 index e70c33e16..000000000 --- a/libs/config/test/no_template_template_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_TEMPLATE_TEMPLATES -// This file should compile, if it does not then -// BOOST_NO_TEMPLATE_TEMPLATES should be defined. -// See file boost_no_template_template.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_TEMPLATE_TEMPLATES -#include "boost_no_template_template.ipp" -#else -namespace boost_no_template_templates = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_template_templates::test(); -} - diff --git a/libs/config/test/no_two_phase_lookup_fail.cpp b/libs/config/test/no_two_phase_lookup_fail.cpp deleted file mode 100644 index 6be607227..000000000 --- a/libs/config/test/no_two_phase_lookup_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Mon Jan 01 12:05:16 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_TWO_PHASE_NAME_LOOKUP -// This file should not compile, if it does then -// BOOST_NO_TWO_PHASE_NAME_LOOKUP should not be defined. -// See file boost_no_two_phase_lookup.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_TWO_PHASE_NAME_LOOKUP -#include "boost_no_two_phase_lookup.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_two_phase_name_lookup::test(); -} - diff --git a/libs/config/test/no_two_phase_lookup_pass.cpp b/libs/config/test/no_two_phase_lookup_pass.cpp deleted file mode 100644 index 544958767..000000000 --- a/libs/config/test/no_two_phase_lookup_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Mon Jan 01 12:05:16 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_TWO_PHASE_NAME_LOOKUP -// This file should compile, if it does not then -// BOOST_NO_TWO_PHASE_NAME_LOOKUP should be defined. -// See file boost_no_two_phase_lookup.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_TWO_PHASE_NAME_LOOKUP -#include "boost_no_two_phase_lookup.ipp" -#else -namespace boost_no_two_phase_name_lookup = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_two_phase_name_lookup::test(); -} - diff --git a/libs/config/test/no_typeid_fail.cpp b/libs/config/test/no_typeid_fail.cpp deleted file mode 100644 index 7c3e4b23b..000000000 --- a/libs/config/test/no_typeid_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:22 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_TYPEID -// This file should not compile, if it does then -// BOOST_NO_TYPEID should not be defined. -// See file boost_no_typeid.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_TYPEID -#include "boost_no_typeid.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_typeid::test(); -} - diff --git a/libs/config/test/no_typeid_pass.cpp b/libs/config/test/no_typeid_pass.cpp deleted file mode 100644 index 80582ef3b..000000000 --- a/libs/config/test/no_typeid_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Sat Aug 25 12:32:22 2007 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_TYPEID -// This file should compile, if it does not then -// BOOST_NO_TYPEID should be defined. -// See file boost_no_typeid.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_TYPEID -#include "boost_no_typeid.ipp" -#else -namespace boost_no_typeid = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_typeid::test(); -} - diff --git a/libs/config/test/no_typename_with_ctor_fail.cpp b/libs/config/test/no_typename_with_ctor_fail.cpp deleted file mode 100644 index 74ee7b0e6..000000000 --- a/libs/config/test/no_typename_with_ctor_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Sep 18 23:32:18 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_TYPENAME_WITH_CTOR -// This file should not compile, if it does then -// BOOST_NO_TYPENAME_WITH_CTOR should not be defined. -// See file boost_no_typename_with_ctor.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_TYPENAME_WITH_CTOR -#include "boost_no_typename_with_ctor.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_typename_with_ctor::test(); -} - diff --git a/libs/config/test/no_typename_with_ctor_pass.cpp b/libs/config/test/no_typename_with_ctor_pass.cpp deleted file mode 100644 index 4a2d9bbcc..000000000 --- a/libs/config/test/no_typename_with_ctor_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu Sep 18 23:32:18 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_TYPENAME_WITH_CTOR -// This file should compile, if it does not then -// BOOST_NO_TYPENAME_WITH_CTOR should be defined. -// See file boost_no_typename_with_ctor.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_TYPENAME_WITH_CTOR -#include "boost_no_typename_with_ctor.ipp" -#else -namespace boost_no_typename_with_ctor = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_typename_with_ctor::test(); -} - diff --git a/libs/config/test/no_unicode_literals_fail.cpp b/libs/config/test/no_unicode_literals_fail.cpp deleted file mode 100644 index 381f562ac..000000000 --- a/libs/config/test/no_unicode_literals_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 09:24:04 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_UNICODE_LITERALS -// This file should not compile, if it does then -// BOOST_NO_CXX11_UNICODE_LITERALS should not be defined. -// See file boost_no_unicode_literals.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_UNICODE_LITERALS -#include "boost_no_unicode_literals.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_unicode_literals::test(); -} - diff --git a/libs/config/test/no_unicode_literals_pass.cpp b/libs/config/test/no_unicode_literals_pass.cpp deleted file mode 100644 index 3fd454707..000000000 --- a/libs/config/test/no_unicode_literals_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 09:24:04 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_UNICODE_LITERALS -// This file should compile, if it does not then -// BOOST_NO_CXX11_UNICODE_LITERALS should be defined. -// See file boost_no_unicode_literals.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_UNICODE_LITERALS -#include "boost_no_unicode_literals.ipp" -#else -namespace boost_no_cxx11_unicode_literals = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_unicode_literals::test(); -} - diff --git a/libs/config/test/no_unified_init_fail.cpp b/libs/config/test/no_unified_init_fail.cpp deleted file mode 100644 index 5535fe7d3..000000000 --- a/libs/config/test/no_unified_init_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Mon May 09 12:11:17 2011 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 70001 2011-03-15 13:17:46Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX -// This file should not compile, if it does then -// BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX should not be defined. -// See file boost_no_unified_init.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX -#include "boost_no_unified_init.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_unified_initialization_syntax::test(); -} - diff --git a/libs/config/test/no_unified_init_pass.cpp b/libs/config/test/no_unified_init_pass.cpp deleted file mode 100644 index f4cf57178..000000000 --- a/libs/config/test/no_unified_init_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Mon May 09 12:11:17 2011 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 70001 2011-03-15 13:17:46Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX -// This file should compile, if it does not then -// BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX should be defined. -// See file boost_no_unified_init.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX -#include "boost_no_unified_init.ipp" -#else -namespace boost_no_cxx11_unified_initialization_syntax = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_unified_initialization_syntax::test(); -} - diff --git a/libs/config/test/no_using_breaks_adl_fail.cpp b/libs/config/test/no_using_breaks_adl_fail.cpp deleted file mode 100644 index 39a9b84d6..000000000 --- a/libs/config/test/no_using_breaks_adl_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -// This file should not compile, if it does then -// BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL should not be defined. -// See file boost_no_using_breaks_adl.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -#include "boost_no_using_breaks_adl.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_function_scope_using_declaration_breaks_adl::test(); -} - diff --git a/libs/config/test/no_using_breaks_adl_pass.cpp b/libs/config/test/no_using_breaks_adl_pass.cpp deleted file mode 100644 index 5f4cb4933..000000000 --- a/libs/config/test/no_using_breaks_adl_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -// This file should compile, if it does not then -// BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL should be defined. -// See file boost_no_using_breaks_adl.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_FUNCTION_SCOPE_USING_DECLARATION_BREAKS_ADL -#include "boost_no_using_breaks_adl.ipp" -#else -namespace boost_function_scope_using_declaration_breaks_adl = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_function_scope_using_declaration_breaks_adl::test(); -} - diff --git a/libs/config/test/no_using_decl_overld_fail.cpp b/libs/config/test/no_using_decl_overld_fail.cpp deleted file mode 100644 index 35e12697a..000000000 --- a/libs/config/test/no_using_decl_overld_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE -// This file should not compile, if it does then -// BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE should not be defined. -// See file boost_no_using_decl_overld.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE -#include "boost_no_using_decl_overld.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_using_declaration_overloads_from_typename_base::test(); -} - diff --git a/libs/config/test/no_using_decl_overld_pass.cpp b/libs/config/test/no_using_decl_overld_pass.cpp deleted file mode 100644 index c5290fc45..000000000 --- a/libs/config/test/no_using_decl_overld_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE -// This file should compile, if it does not then -// BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE should be defined. -// See file boost_no_using_decl_overld.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_USING_DECLARATION_OVERLOADS_FROM_TYPENAME_BASE -#include "boost_no_using_decl_overld.ipp" -#else -namespace boost_no_using_declaration_overloads_from_typename_base = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_using_declaration_overloads_from_typename_base::test(); -} - diff --git a/libs/config/test/no_using_template_fail.cpp b/libs/config/test/no_using_template_fail.cpp deleted file mode 100644 index febbbcd66..000000000 --- a/libs/config/test/no_using_template_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_USING_TEMPLATE -// This file should not compile, if it does then -// BOOST_NO_USING_TEMPLATE should not be defined. -// See file boost_no_using_template.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_USING_TEMPLATE -#include "boost_no_using_template.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_using_template::test(); -} - diff --git a/libs/config/test/no_using_template_pass.cpp b/libs/config/test/no_using_template_pass.cpp deleted file mode 100644 index b48a31e36..000000000 --- a/libs/config/test/no_using_template_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_USING_TEMPLATE -// This file should compile, if it does not then -// BOOST_NO_USING_TEMPLATE should be defined. -// See file boost_no_using_template.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_USING_TEMPLATE -#include "boost_no_using_template.ipp" -#else -namespace boost_no_using_template = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_using_template::test(); -} - diff --git a/libs/config/test/no_variadic_macros_fail.cpp b/libs/config/test/no_variadic_macros_fail.cpp deleted file mode 100644 index d76c4f362..000000000 --- a/libs/config/test/no_variadic_macros_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Tue Aug 17 09:59:01 2010 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 49281 2008-10-11 15:40:44Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_CXX11_VARIADIC_MACROS -// This file should not compile, if it does then -// BOOST_NO_CXX11_VARIADIC_MACROS should not be defined. -// See file boost_no_variadic_macros.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_VARIADIC_MACROS -#include "boost_no_variadic_macros.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_variadic_macros::test(); -} - diff --git a/libs/config/test/no_variadic_macros_pass.cpp b/libs/config/test/no_variadic_macros_pass.cpp deleted file mode 100644 index 291b6ea66..000000000 --- a/libs/config/test/no_variadic_macros_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Tue Aug 17 09:59:01 2010 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id: generate.cpp 49281 2008-10-11 15:40:44Z johnmaddock $ -// - - -// Test file for macro BOOST_NO_CXX11_VARIADIC_MACROS -// This file should compile, if it does not then -// BOOST_NO_CXX11_VARIADIC_MACROS should be defined. -// See file boost_no_variadic_macros.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_VARIADIC_MACROS -#include "boost_no_variadic_macros.ipp" -#else -namespace boost_no_cxx11_variadic_macros = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_variadic_macros::test(); -} - diff --git a/libs/config/test/no_variadic_templates_fail.cpp b/libs/config/test/no_variadic_templates_fail.cpp deleted file mode 100644 index 05fc2c7ad..000000000 --- a/libs/config/test/no_variadic_templates_fail.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 07:24:54 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_VARIADIC_TEMPLATES -// This file should not compile, if it does then -// BOOST_NO_CXX11_VARIADIC_TEMPLATES should not be defined. -// See file boost_no_variadic_templates.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES -#include "boost_no_variadic_templates.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_variadic_templates::test(); -} - diff --git a/libs/config/test/no_variadic_templates_pass.cpp b/libs/config/test/no_variadic_templates_pass.cpp deleted file mode 100644 index 2b95540ea..000000000 --- a/libs/config/test/no_variadic_templates_pass.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// This file was automatically generated on Thu May 29 07:24:54 2008 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version.// -// Revision $Id$ -// - - -// Test file for macro BOOST_NO_CXX11_VARIADIC_TEMPLATES -// This file should compile, if it does not then -// BOOST_NO_CXX11_VARIADIC_TEMPLATES should be defined. -// See file boost_no_variadic_templates.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_CXX11_VARIADIC_TEMPLATES -#include "boost_no_variadic_templates.ipp" -#else -namespace boost_no_cxx11_variadic_templates = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_cxx11_variadic_templates::test(); -} - diff --git a/libs/config/test/no_void_returns_fail.cpp b/libs/config/test/no_void_returns_fail.cpp deleted file mode 100644 index ff08562a3..000000000 --- a/libs/config/test/no_void_returns_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_VOID_RETURNS -// This file should not compile, if it does then -// BOOST_NO_VOID_RETURNS should not be defined. -// See file boost_no_void_returns.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_VOID_RETURNS -#include "boost_no_void_returns.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_void_returns::test(); -} - diff --git a/libs/config/test/no_void_returns_pass.cpp b/libs/config/test/no_void_returns_pass.cpp deleted file mode 100644 index 73a0882b7..000000000 --- a/libs/config/test/no_void_returns_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_VOID_RETURNS -// This file should compile, if it does not then -// BOOST_NO_VOID_RETURNS should be defined. -// See file boost_no_void_returns.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_VOID_RETURNS -#include "boost_no_void_returns.ipp" -#else -namespace boost_no_void_returns = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_void_returns::test(); -} - diff --git a/libs/config/test/no_wchar_t_fail.cpp b/libs/config/test/no_wchar_t_fail.cpp deleted file mode 100644 index c1b0712e3..000000000 --- a/libs/config/test/no_wchar_t_fail.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_INTRINSIC_WCHAR_T -// This file should not compile, if it does then -// BOOST_NO_INTRINSIC_WCHAR_T should not be defined. -// See file boost_no_wchar_t.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifdef BOOST_NO_INTRINSIC_WCHAR_T -#include "boost_no_wchar_t.ipp" -#else -#error "this file should not compile" -#endif - -int main( int, char *[] ) -{ - return boost_no_intrinsic_wchar_t::test(); -} - diff --git a/libs/config/test/no_wchar_t_pass.cpp b/libs/config/test/no_wchar_t_pass.cpp deleted file mode 100644 index b31c07fb5..000000000 --- a/libs/config/test/no_wchar_t_pass.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// This file was automatically generated on Fri Dec 03 18:04:02 2004 -// by libs/config/tools/generate.cpp -// Copyright John Maddock 2002-4. -// 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/config for the most recent version. - -// Test file for macro BOOST_NO_INTRINSIC_WCHAR_T -// This file should compile, if it does not then -// BOOST_NO_INTRINSIC_WCHAR_T should be defined. -// See file boost_no_wchar_t.ipp for details - -// Must not have BOOST_ASSERT_CONFIG set; it defeats -// the objective of this file: -#ifdef BOOST_ASSERT_CONFIG -# undef BOOST_ASSERT_CONFIG -#endif - -#include -#include "test.hpp" - -#ifndef BOOST_NO_INTRINSIC_WCHAR_T -#include "boost_no_wchar_t.ipp" -#else -namespace boost_no_intrinsic_wchar_t = empty_boost; -#endif - -int main( int, char *[] ) -{ - return boost_no_intrinsic_wchar_t::test(); -} - diff --git a/libs/config/test/test.hpp b/libs/config/test/test.hpp deleted file mode 100644 index af7578096..000000000 --- a/libs/config/test/test.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// (C) Copyright John Maddock 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/config for the most recent version. - -#ifndef BOOST_CONFIG_TEST_HPP -#define BOOST_CONFIG_TEST_HPP - -namespace empty_boost{ - -int test() -{ - return 0; -} - -} - -#endif - diff --git a/libs/config/test/threads/test_thread_fail1.cpp b/libs/config/test/threads/test_thread_fail1.cpp deleted file mode 100644 index 5e0406bb3..000000000 --- a/libs/config/test/threads/test_thread_fail1.cpp +++ /dev/null @@ -1,10 +0,0 @@ -// (C) Copyright John Maddock 2003. -// 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) - -// disable thread support: -#define BOOST_DISABLE_THREADS -// this should now be a compiler error: -#include -// we should never get here... diff --git a/libs/config/test/threads/test_thread_fail2.cpp b/libs/config/test/threads/test_thread_fail2.cpp deleted file mode 100644 index 56ba4a073..000000000 --- a/libs/config/test/threads/test_thread_fail2.cpp +++ /dev/null @@ -1,13 +0,0 @@ -// (C) Copyright John Maddock 2003. -// 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) - -#include -// disable thread support: -#ifdef BOOST_HAS_THREADS -# undef BOOST_HAS_THREADS -#endif -// this should now be a compiler error: -#include -// we should never get here... diff --git a/libs/crc/crc.html b/libs/crc/crc.html deleted file mode 100644 index bfb77a71e..000000000 --- a/libs/crc/crc.html +++ /dev/null @@ -1,635 +0,0 @@ - - - - -Boost CRC Library Documentation - - - - -

boost.png (6897 bytes)Header <boost/crc.hpp>

- -

The header <boost/crc.hpp> supplies two -class templates in namespace boost. These templates define -objects that can compute the CRC, or cyclic redundancy code -(or check), of a given stream of data. The header also supplies -function templates to compute a CRC in one step.

- -

Contents

- -
    -
  1. Contents
  2. -
  3. Header Synopsis
  4. -
  5. Rationale
  6. -
  7. Background -
  8. -
  9. Theoretical CRC Computer
  10. -
  11. Optimized CRC Computer
  12. -
  13. Computer Usage
  14. -
  15. CRC Function
  16. -
  17. Augmented-CRC Functions
  18. -
  19. Pre-Defined CRC Samples
  20. -
  21. References
  22. -
  23. Credits -
  24. -
- -

Header Synopsis

- -
#include <boost/integer.hpp>  // for boost::uint_t
-#include <cstddef>            // for std::size_t
-
-namespace boost
-{
-
-template < std::size_t Bits >
-    class crc_basic;
-
-template < std::size_t Bits, impl_def TruncPoly = 0u,
-           impl_def InitRem = 0u,
-           impl_def FinalXor = 0u, bool ReflectIn = false,
-           bool ReflectRem = false >
-    class crc_optimal;
-
-template < std::size_t Bits, impl_def TruncPoly,
-           impl_def InitRem, impl_def FinalXor,
-           bool ReflectIn, bool ReflectRem >
-    typename uint_t<Bits>::fast  crc( void const *buffer,
-     std::size_t byte_count );
-
-template < std::size_t Bits, impl_def TruncPoly >
-    typename uint_t<Bits>::fast  augmented_crc( void const *buffer,
-     std::size_t byte_count,
-     typename uint_t<Bits>::fast initial_remainder );
-
-template < std::size_t Bits, impl_def TruncPoly >
-    typename uint_t<Bits>::fast  augmented_crc( void const *buffer,
-     std::size_t byte_count );
-
-typedef crc_optimal<16, 0x8005, 0, 0, true, true>         crc_16_type;
-typedef crc_optimal<16, 0x1021, 0xFFFF, 0, false, false>  crc_ccitt_type;
-typedef crc_optimal<16, 0x8408, 0, 0, true, true>         crc_xmodem_type;
-
-typedef crc_optimal<32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true, true>
-  crc_32_type;
-
-}
-
- -

The implementation-defined type impl_def stands for the -quickest-to-manipulate built-in unsigned integral type that can -represent at least Bits bits.

- -

Rationale

- -

A common error detection technique, especially with electronic -communications, is an appended checksum. The transmitter sends its data -bits, followed by the bits of the checksum. The checksum is based on -operations done on the data bit stream. The receiver applies the same -operations on the bits it gets, and then gets the checksum. If the -computed checksum doesn't match the received checksum, then an error -ocurred in the transmission. There is the slight chance that the error -is only in the checksum, and an actually-correct data stream is -rejected. There is also the chance of an error occurring that does not -change the checksum, making that error invisible. CRC is a common -checksum type, used for error detection for hardware interfaces and -encoding formats.

- -

Background

- -

CRCs work by computing the remainder of a modulo-2 polynominal -division. The message is treated as the (binary) coefficents of a long -polynominal for the dividend, with the earlier bits of the message fed -first as the polynominal's highest coefficents. A particular CRC -algorithm has another polynominal associated with it to be used as the -divisor. The quotient is ignored. The remainder of the division -considered the checksum. However, the division uses modulo-2 rules (no -carries) for the coefficents.

- -

See A -Painless Guide to CRC Error Detection Algorithms for complete -information. A clearer guide is at the Easier Said Than -Done web page.

- -

CRC Parameters

- -
-
Truncated polynominal -
The divisor polynominal has a degree one bit larger than the - checksum (remainder) size. That highest bit is always one, so - it is ignored when describing a particular CRC type. Excluding - this bit makes the divisor fit in the same data type as the - checksum. - -
Initial remainder -
The interim CRC remainder changes as each bit is processed. - Usually, the interim remainder starts at zero, but some CRCs use - a different initial value to avoid "blind spots." A - blind spot is when a common sequence of message bits does not - change certain interim remainder values. - -
Final XOR value -
A CRC remainder can be combined with a defined value, via - a bitwise exclusive-or operation, before being returned to the - user. The value is usually zero, meaning the interim remainder - is returned unchanged. The other common value is an all-ones - value, meaning that the bitwise complement of the interim - remainder is returned. - -
Reflected input -
A message's bits are usually fed a byte at a time, with the - highest bits of the byte treated as the higher bits of the - dividend polynominal. Some CRCs reflect the bits (about the - byte's center, so the first and last bits are switched, - etc.) before feeding. - -
Reflected (remainder) output -
Some CRCs return the reflection of the interim remainder (taking - place before the final XOR value stage). -
- -

Theoretical CRC Computer

- -
template < std::size_t Bits >
-class boost::crc_basic
-{
-public:
-    // Type
-    typedef implementation_defined  value_type;
-
-    // Constant reflecting template parameter
-    static  std::size_t const  bit_count = Bits;
-
-    // Constructor
-    explicit  crc_basic( value_type truncated_polynominal,
-               value_type initial_remainder = 0, value_type final_xor_value = 0,
-               bool reflect_input = false, bool reflect_remainder = false );
-
-    // Internal Operations
-    value_type  get_truncated_polynominal() const;
-    value_type  get_initial_remainder() const;
-    value_type  get_final_xor_value() const;
-    bool        get_reflect_input() const;
-    bool        get_reflect_remainder() const;
-
-    value_type  get_interim_remainder() const;
-    void        reset( value_type new_rem );
-    void        reset();
-
-    // External Operations
-    void  process_bit( bool bit );
-    void  process_bits( unsigned char bits, std::size_t bit_count );
-    void  process_byte( unsigned char byte );
-    void  process_block( void const *bytes_begin, void const *bytes_end );
-    void  process_bytes( void const *buffer, std::size_t byte_count );
-
-    value_type  checksum() const;
-
-};
-
- -

The value_type is the smallest built-in type that can -hold the specified (by Bits) number of bits. This should -be boost::uint_t<Bits>::least, see the documentation for integer type -selection for details.

- -

This implementation is slow since it computes its CRC the same way as -in theory, bit by bit. No optimizations are performed. It wastes space -since most of the CRC parameters are specified at run-time as -constructor parameters.

- -

Optimized CRC Computer

- -
template < std::size_t Bits, impl_def TruncPoly,
-           impl_def InitRem, impl_def FinalXor,
-           bool ReflectIn, bool ReflectRem >
-class boost::crc_optimal
-{
-public:
-    // Type
-    typedef implementation_defined  value_type;
-
-    // Constants reflecting template parameters
-    static  std::size_t const  bit_count = Bits;
-    static  value_type const   truncated_polynominal = TruncPoly;
-    static  value_type const   initial_remainder = InitRem;
-    static  value_type const   final_xor_value = FinalXor;
-    static  bool const         reflect_input = ReflectIn;
-    static  bool const         reflect_remainder = ReflectRem;
-
-    // Constructor
-    explicit  crc_optimal( value_type init_rem = InitRem );
-
-    // Internal Operations
-    value_type  get_truncated_polynominal() const;
-    value_type  get_initial_remainder() const;
-    value_type  get_final_xor_value() const;
-    bool        get_reflect_input() const;
-    bool        get_reflect_remainder() const;
-
-    value_type  get_interim_remainder() const;
-    void        reset( value_type new_rem = InitRem );
-
-    // External Operations
-    void  process_byte( unsigned char byte );
-    void  process_block( void const *bytes_begin, void const *bytes_end );
-    void  process_bytes( void const *buffer, std::size_t byte_count );
-
-    value_type  checksum() const;
-
-    // Operators
-    void        operator ()( unsigned char byte );
-    value_type  operator ()() const;
-
-};
-
- -

The value_type is the quickest-to-manipulate built-in -type that can hold at least the specified (by Bits) number -of bits. This should be boost::uint_t<Bits>::fast. -See the integer type selection -documentation for details. The TruncPoly, -InitRem, and FinalXor template parameters also -are of this type.

- -

This implementation is fast since it uses as many optimizations as -practical. All of the CRC parameters are specified at compile-time as -template parameters. No individual bits are considered; only whole -bytes are passed. A table of interim CRC values versus byte values is -pre-computed when the first object using a particular bit size, -truncated polynominal, and input reflection state is processed.

- -

Computer Usage

- -

The two class templates have different policies on where the CRC's -parameters go. Both class templates use the number of bits in the CRC -as the first template parameter. The theoretical computer class -template has the bit count as its only template parameter, all the other -CRC parameters are entered through the constructor. The optimized -computer class template obtains all its CRC parameters as template -parameters, and instantiated objects are usually -default-constructed.

- -

The CRC parameters can be inspected at run-time with the following -member functions: get_truncated_polynominal, -get_initial_remainder, get_final_xor_value, -get_reflect_input, and get_reflect_remainder. -The fast computer also provides compile-time constants for its CRC -parameters.

- -

The get_interim_remainder member function returns the -internal state of the CRC remainder. It represents the unreflected -remainder of the last division. Saving an interim remainder allows the -freezing of CRC processing, as long as the other CRC parameters and the -current position of the bit stream are saved. Restarting a frozen -stream involves constructing a new computer with the most of the old -computer's parameters. The only change is to use the frozen remainder -as the new computer's initial remainder. Then the interrupted bit -stream can be fed as if nothing happened. The fast CRC computer has a -special constructor that takes one argument, an interim remainder, for -this purpose (overriding the initial remainder CRC parameter).

- -

The reset member functions reset the internal state of -the CRC remainder to the given value. If no value is given, then the -internal remainder is set to the initial remainder value when the object -was created. The remainder must be unreflected. When a CRC calculation -is finished, calling reset lets the object be reused for a -new session.

- -

After any construction, both CRC computers work the same way. -Feeding new data to a computer is in a seperate operation(s) from -extracting the current CRC value from the computer. The following table -lists the feeding and extracting operations.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Regular CRC Operations
OperationDescription
void process_bit( bool bit );Feeds the single bit to the computer, updating - the interim CRC. It is only defined for the slow CRC - computer.
void process_bits( unsigned char bits, std::size_t - bit_count );Acts as applying process_bit to the lowest - bit_count bits given in bits, most - significant relevant bit first. The results are undefined - if bit_count exceeds the number of bits per byte. - It is only defined for the slow CRC computer.
void process_byte( unsigned char byte );Acts as applying process_bit to the all the - bits in byte. If reflection is not desired, the - bits are fed from the most to least significant. The bits - are fed in the opposite order if reflection is desired.
void process_block( void const *bytes_begin, void - const *bytes_end );Acts as applying process_byte to each byte in - the given memory block. This memory block starts at - bytes_begin and finishes before - bytes_end. The bytes are processed in that - order.
void process_bytes( void const *buffer, std::size_t - byte_count );Acts as applying process_byte to each byte in - the given memory block. This memory block starts at - buffer and lasts for byte_count bytes. - The bytes are processed in ascending order.
value_type checksum() const;Returns the CRC checksum of the data passed in so far, - possibly after applying the remainder-reflection and - exclusive-or operations.
void operator ()( unsigned char byte );Calls process_byte. This member function lets - its object act as a (stateful) function object. It is only - defined for the fast CRC computer.
value_type operator ()() const;Calls checksum. This member function lets - its object act as a generator function object. It is only - defined for the fast CRC computer.
- -

You can use them like this:

- -
#include <boost/crc.hpp>      // for boost::crc_basic, boost::crc_optimal
-#include <boost/cstdint.hpp>  // for boost::uint16_t
-
-#include <algorithm>  // for std::for_each
-#include <cassert>    // for assert
-#include <cstddef>    // for std::size_t
-#include <iostream>   // for std::cout
-#include <ostream>    // for std::endl
-
-
-// Main function
-int
-main ()
-{
-    // This is "123456789" in ASCII
-    unsigned char const  data[] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-     0x38, 0x39 };
-    std::size_t const    data_len = sizeof( data ) / sizeof( data[0] );
-
-    // The expected CRC for the given data
-    boost::uint16_t const  expected = 0x29B1;
-
-    // Simulate CRC-CCITT
-    boost::crc_basic<16>  crc_ccitt1( 0x1021, 0xFFFF, 0, false, false );
-    crc_ccitt1.process_bytes( data, data_len );
-    assert( crc_ccitt1.checksum() == expected );
-
-    // Repeat with the optimal version (assuming a 16-bit type exists)
-    boost::crc_optimal<16, 0x1021, 0xFFFF, 0, false, false>  crc_ccitt2;
-    crc_ccitt2 = std::for_each( data, data + data_len, crc_ccitt2 );
-    assert( crc_ccitt2() == expected );
-
-    std::cout << "All tests passed." << std::endl;
-    return 0;
-}
-
- -

CRC Function

- -
template < std::size_t Bits, impl_def TruncPoly,
- impl_def InitRem, impl_def FinalXor,
- bool ReflectIn, bool ReflectRem >
-typename boost::uint_t<Bits>::fast
-boost::crc( void const *buffer, std::size_t byte_count );
-
- -

The boost::crc function template computes the CRC of a -given data block. The data block starts at the address given by -buffer and lasts for byte_count bytes. The CRC -parameters are passed through template arguments, identical to the -optimized CRC computer (see above). In fact, -such a computer is used to implement this function.

- -

Augmented-CRC Functions

- -
template < std::size_t Bits, impl_def TruncPoly >
-typename boost::uint_t<Bits>::fast
-boost::augmented_crc( void const *buffer, std::size_t byte_count,
- typename boost::uint_t<Bits>::fast initial_remainder );
-
-template < std::size_t Bits, impl_def TruncPoly >
-typename boost::uint_t<Bits>::fast
-boost::augmented_crc( void const *buffer, std::size_t byte_count );
-
- -

All the other CRC-computing function or class templates work assuming -that the division steps start immediately on the first message bits. -The two boost::augmented_crc function templates have a -different division order. Instead of combining (via bitwise -exclusive-or) the current message bit with the highest bit of a separate -remainder, these templates shift a new message bit into the low bit of a -remainder register as the highest bit is shifted out. The new method -means that the bits in the inital remainder value are processed before -any of the actual message bits are processed. To compensate, the real -CRC can only be extracted after feeding enough zero bits (the same count -as the register size) after the message bits.

- -

The template parameters of both versions of the function template are -the CRC's bit size (Bits) and the truncated polynominal -(TruncPoly). The version of the function template that -takes two arguments calls the three-argument version with the -initial_remainder parameter filled as zero. Both versions -work on the data block starting at the address buffer for -byte_count bytes.

- -

These function templates are useful if the bytes of the CRC directly -follow the message's bytes. First, set the bytes of where the CRC will -go to zero. Then use augmented_crc over the augmented -message, i.e. the message bytes and the appended CRC bytes. Then -assign the result to the CRC. To later check a received message, either -use augmented_crc (with the same parameters as -transmission, of course) on the received unaugmented message -and check if the result equals the CRC, or use -augmented_crc on the received augmented message -and check if the result equals zero. Note that the CRC has to be stored -with the more-significant bytes first (big-endian).

- -

Interruptions in the CRC data can be handled by feeding the result of -augmented_crc of the previous data block as the -initial_remainder when calling augmented_crc on -the next data block. Remember that the actual CRC can only be -determined after feeding the augmented bytes. Since this method uses -modulo-2 polynominal division at its most raw, neither final XOR values -nor reflection can be used.

- -

Note that for the same CRC system, the initial remainder for -augmented message method will be different than for the unaugmented -message method. The main exception is zero; if the augmented-CRC -algorithm uses a zero initial remainder, the equivalent unaugmented-CRC -algorithm will also use a zero initial remainder. Given an initial -remainder for a augmented-CRC algorithm, the result from processing just -zero-valued CRC bytes without any message bytes is the equivalent inital -remainder for the unaugmented-CRC algorithm. An example follows:

- -
#include <boost/crc.hpp>      // for boost::crc_basic, boost::augmented_crc
-#include <boost/cstdint.hpp>  // for boost::uint16_t
-
-#include <cassert>    // for assert
-#include <iostream>   // for std::cout
-#include <ostream>    // for std::endl
-
-
-// Main function
-int
-main ()
-{
-    using boost::uint16_t;
-    using boost::augmented_crc;
-
-    uint16_t        data[6] = { 2, 4, 31, 67, 98, 0 };
-    uint16_t const  init_rem = 0x123;
-
-    uint16_t  crc1 = augmented_crc<16, 0x8005>( data, sizeof(data), init_rem );
-
-    uint16_t const  zero = 0;
-    uint16_t const  new_init_rem = augmented_crc<16, 0x8005>( &zero, sizeof(zero) );
-
-    boost::crc_basic<16>  crc2( 0x8005, new_init_rem );
-    crc2.process_block( data, &data[5] );  // don't include CRC
-    assert( crc2.checksum() == crc1 );
-
-    std::cout << "All tests passed." << std::endl;
-    return 0;
-}
-
- -

Pre-Defined CRC Samples

- -

Four sample CRC types are given, representing several common CRC -algorithms. For example, computations from boost::crc_32_type -can be used for implementing the PKZip standard. Note that, in general, this -library is concerned with CRC implementation, and not with determining -"good" sets of CRC parameters.

- - - - - - - - - - - - - - - - - - - - - - - -
Common CRCs
AlgorithmExample Protocols
crc_16_typeBISYNCH, ARC
crc_ccitt_typedesignated by CCITT (Comité Consultatif International - Télégraphique et Téléphonique)
crc_xmodem_typeXMODEM
crc_32_typePKZip, AUTODIN II, Ethernet, FDDI
- -
- -

References

- - - -

Credits

- -

Contributors

- -
-
Michael Barr (mbarr@netrino.com) -
Wrote Easier Said - Than Done, a less-confusing guide to implementing CRC - algorithms. (Originally published as "Slow and Steady - Never Lost the Race" in the January 2000 issue of Embedded Systems - Programming, pages 37–46.) - -
Daryle Walker -
Started the library and contributed the theoretical and optimal - CRC computation class templates and the CRC computing function - template. Contributed crc_test.cpp and crc_example.cpp. - -
Ross N. Williams -
Wrote A - Painless Guide to CRC Error Detection Algorithms, a - definitive source of CRC information. -
- -

Acknowledgements

- -

For giving advice on compiler/C++ compliance, implementation, -interface, algorithms, and bug reports:

- -
    -
  • Darin Adler
  • -
  • Beman Dawes
  • -
  • Doug Gregor
  • -
  • John Maddock
  • -
  • Joe Mariadassou
  • -
  • Jens Maurer
  • -
  • Vladimir Prus
  • -
  • Joel Young
  • -
- -

History

- -
-
15 Jun 2003, Daryle Walker -
Added example program. - -
14 May 2001, Daryle Walker -
Initial version. -
- -
- -

Revised: 15 June 2003

- -

Copyright 2001, 2003 Daryle Walker. Use, modification, and distribution -are subject to the Boost Software License, Version 1.0. (See accompanying -file LICENSE_1_0.txt or a copy at -<http://www.boost.org/LICENSE_1_0.txt>.)

- - - diff --git a/libs/crc/crc_example.cpp b/libs/crc/crc_example.cpp deleted file mode 100644 index a40e61d1e..000000000 --- a/libs/crc/crc_example.cpp +++ /dev/null @@ -1,75 +0,0 @@ -// Boost CRC example program file ------------------------------------------// - -// Copyright 2003 Daryle Walker. Use, modification, and distribution are -// subject to the Boost Software License, Version 1.0. (See accompanying file -// LICENSE_1_0.txt or a copy at .) - -// See for the library's home page. - -// Revision History -// 17 Jun 2003 Initial version (Daryle Walker) - -#include // for boost::crc_32_type - -#include // for EXIT_SUCCESS, EXIT_FAILURE -#include // for std::exception -#include // for std::ifstream -#include // for std::ios_base, etc. -#include // for std::cerr, std::cout -#include // for std::endl - - -// Redefine this to change to processing buffer size -#ifndef PRIVATE_BUFFER_SIZE -#define PRIVATE_BUFFER_SIZE 1024 -#endif - -// Global objects -std::streamsize const buffer_size = PRIVATE_BUFFER_SIZE; - - -// Main program -int -main -( - int argc, - char const * argv[] -) -try -{ - boost::crc_32_type result; - - for ( int i = 1 ; i < argc ; ++i ) - { - std::ifstream ifs( argv[i], std::ios_base::binary ); - - if ( ifs ) - { - do - { - char buffer[ buffer_size ]; - - ifs.read( buffer, buffer_size ); - result.process_bytes( buffer, ifs.gcount() ); - } while ( ifs ); - } - else - { - std::cerr << "Failed to open file '" << argv[i] << "'." - << std::endl; - } - } - - std::cout << std::hex << std::uppercase << result.checksum() << std::endl; - return EXIT_SUCCESS; -} -catch ( std::exception &e ) -{ - std::cerr << "Found an exception with '" << e.what() << "'." << std::endl; - return EXIT_FAILURE; -} -catch ( ... ) -{ - std::cerr << "Found an unknown exception." << std::endl; - return EXIT_FAILURE; -} diff --git a/libs/crc/index.html b/libs/crc/index.html deleted file mode 100644 index 5e75417a7..000000000 --- a/libs/crc/index.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - -Boost CRC Library - - - - - - - - - - - - - -
boost.png (6897 bytes)HomeLibrariesPeopleFAQMore
- -

CRC Library

- -

The header crc.hpp provides two implementations of CRC -(cyclic redundancy code) computation objects and two implementations of -CRC computation functions. The implementations are template-based.

- -

The first object implementation is for theoretical use. It can -process single bits, but is considered slow for practical use. The -second object implementation is byte-oriented and uses look-up -tables for fast operation. The optimized implementation should -be suitable for general use. The first function implementation uses the -optimized object. The second function implementation allows the use of -a CRC that directly follows its data.

- - - -
- -

Revised: 14 May 2001

- -

Copyright 2001 Daryle Walker. Use, modification, and distribution -are subject to the Boost Software License, Version 1.0. (See accompanying -file LICENSE_1_0.txt or a copy at -<http://www.boost.org/LICENSE_1_0.txt>.)

- - - diff --git a/libs/crc/test/Jamfile.v2 b/libs/crc/test/Jamfile.v2 deleted file mode 100644 index 8916b6d7a..000000000 --- a/libs/crc/test/Jamfile.v2 +++ /dev/null @@ -1,14 +0,0 @@ -#~ Copyright Rene Rivera 2008 -#~ Distributed under the Boost Software License, Version 1.0. -#~ (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -project - : requirements - /boost/test//boost_test_exec_monitor/static - ; - -import testing ; - -test-suite crc : - [ run crc_test.cpp ] - ; diff --git a/libs/crc/test/crc_test.cpp b/libs/crc/test/crc_test.cpp deleted file mode 100644 index 8df203fe1..000000000 --- a/libs/crc/test/crc_test.cpp +++ /dev/null @@ -1,761 +0,0 @@ -// Boost CRC test program file ---------------------------------------------// - -// Copyright 2001, 2003, 2004 Daryle Walker. Use, modification, and -// distribution are subject to the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or a copy at -// .) - -// See for the library's home page. - -// Revision History -// 28 Aug 2004 Added CRC tests for polynominals shorter than 8 bits -// (Daryle Walker, by patch from Bert Klaps) -// 23 Aug 2003 Adjust to updated Test framework (Daryle Walker) -// 14 May 2001 Initial version (Daryle Walker) - - -#include // for BOOST_MSVC, etc. -#include // for boost::crc_basic, etc. -#include // for boost::uint16_t, etc. -#include // for boost::exit_success -#include // for boost::uint_t -#include // for boost::minstd_rand -#include // for main, etc. -#include // for boost::timer - -#include // for std::for_each, std::generate_n, std::count -#include // for CHAR_BIT -#include // for std::size_t -#include // for std::cout (std::ostream and std::endl indirectly) - - -#if CHAR_BIT != 8 -#error The expected results assume an eight-bit byte. -#endif - -#if !(defined(BOOST_NO_DEPENDENT_TYPES_IN_TEMPLATE_VALUE_PARAMETERS) || (defined(BOOST_MSVC) && (BOOST_MSVC <= 1300))) -#define CRC_PARM_TYPE typename boost::uint_t::fast -#else -#define CRC_PARM_TYPE unsigned long -#endif - -#if !defined(BOOST_MSVC) && !defined(__GNUC__) -#define PRIVATE_DECLARE_BOOST( TypeName ) using boost:: TypeName -#else -#define PRIVATE_DECLARE_BOOST( TypeName ) typedef boost:: TypeName TypeName -#endif - - -// Types -template < std::size_t Bits, CRC_PARM_TYPE TrPo, CRC_PARM_TYPE InRe, - CRC_PARM_TYPE FiXo, bool ReIn, bool ReRe > -class crc_tester -{ -public: - // All the following were separate function templates, but they have - // been moved to class-static member functions of a class template - // because MS VC++ 6 can't handle function templates that can't - // deduce all their template arguments from their function arguments. - - typedef typename boost::uint_t::fast value_type; - - static void master_test( char const *test_name, value_type expected ); - -private: - typedef boost::crc_optimal - optimal_crc_type; - typedef boost::crc_basic basic_crc_type; - - static void compute_test( value_type expected ); - static void interrupt_test( value_type expected ); - static void error_test(); - -}; // crc_tester - -// Global data -unsigned char const std_data[] = { 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39 }; -std::size_t const std_data_len = sizeof( std_data ) / sizeof( std_data[0] ); - -boost::uint16_t const std_crc_ccitt_result = 0x29B1; -boost::uint16_t const std_crc_16_result = 0xBB3D; -boost::uint32_t const std_crc_32_result = 0xCBF43926; - -// Function prototypes -void timing_test(); -boost::uint32_t basic_crc32( void const *buffer, std::size_t byte_count ); -boost::uint32_t optimal_crc32( void const *buffer, std::size_t byte_count ); -boost::uint32_t quick_crc32( void const *buffer, std::size_t byte_count ); -boost::uint32_t quick_reflect( boost::uint32_t value, std::size_t bits ); -double time_trial( char const *name, - boost::uint32_t (*crc_func)(void const *, std::size_t), - boost::uint32_t expected, void const *data, std::size_t length ); - -void augmented_tests(); -boost::uint32_t native_to_big( boost::uint32_t x ); -boost::uint32_t big_to_native( boost::uint32_t x ); - -void small_crc_test1(); -void small_crc_test2(); - - -// Macro to compact code -#define PRIVATE_TESTER_NAME crc_tester - -// Run a test on slow and fast CRC computers and function -template < std::size_t Bits, CRC_PARM_TYPE TrPo, CRC_PARM_TYPE InRe, - CRC_PARM_TYPE FiXo, bool ReIn, bool ReRe > -void -PRIVATE_TESTER_NAME::compute_test -( - typename PRIVATE_TESTER_NAME::value_type expected -) -{ - std::cout << "\tDoing computation tests." << std::endl; - - optimal_crc_type fast_crc; - basic_crc_type slow_crc( TrPo, InRe, FiXo, ReIn, ReRe ); - value_type const func_result = boost::crc( std_data, std_data_len ); - - fast_crc.process_bytes( std_data, std_data_len ); - slow_crc.process_bytes( std_data, std_data_len ); - BOOST_CHECK( fast_crc.checksum() == expected ); - BOOST_CHECK( slow_crc.checksum() == expected ); - BOOST_CHECK( func_result == expected ); -} - -// Run a test in two runs, and check all the inspectors -template < std::size_t Bits, CRC_PARM_TYPE TrPo, CRC_PARM_TYPE InRe, - CRC_PARM_TYPE FiXo, bool ReIn, bool ReRe > -void -PRIVATE_TESTER_NAME::interrupt_test -( - typename PRIVATE_TESTER_NAME::value_type expected -) -{ - std::cout << "\tDoing interrupt tests." << std::endl; - - // Process the first half of the data (also test accessors) - optimal_crc_type fast_crc1; - basic_crc_type slow_crc1( fast_crc1.get_truncated_polynominal(), - fast_crc1.get_initial_remainder(), fast_crc1.get_final_xor_value(), - fast_crc1.get_reflect_input(), fast_crc1.get_reflect_remainder() ); - - BOOST_CHECK( fast_crc1.get_interim_remainder() == - slow_crc1.get_initial_remainder() ); - - std::size_t const mid_way = std_data_len / 2; - unsigned char const * const std_data_end = std_data + std_data_len; - - fast_crc1.process_bytes( std_data, mid_way ); - slow_crc1.process_bytes( std_data, mid_way ); - BOOST_CHECK( fast_crc1.checksum() == slow_crc1.checksum() ); - - // Process the second half of the data (also test accessors) - boost::crc_optimal - fast_crc2( fast_crc1.get_interim_remainder() ); - boost::crc_basic slow_crc2( - slow_crc1.get_truncated_polynominal(), slow_crc1.get_interim_remainder(), - slow_crc1.get_final_xor_value(), slow_crc1.get_reflect_input(), - slow_crc1.get_reflect_remainder() ); - - fast_crc2.process_block( std_data + mid_way, std_data_end ); - slow_crc2.process_block( std_data + mid_way, std_data_end ); - BOOST_CHECK( fast_crc2.checksum() == slow_crc2.checksum() ); - BOOST_CHECK( fast_crc2.checksum() == expected ); - BOOST_CHECK( slow_crc2.checksum() == expected ); -} - -// Run a test to see if a single-bit error is detected -template < std::size_t Bits, CRC_PARM_TYPE TrPo, CRC_PARM_TYPE InRe, - CRC_PARM_TYPE FiXo, bool ReIn, bool ReRe > -void -PRIVATE_TESTER_NAME::error_test -( -) -{ - PRIVATE_DECLARE_BOOST( uint32_t ); - - // A single-bit error is ensured to be detected if the polynominal - // has at least two bits set. The highest bit is what is removed - // to give the truncated polynominal, and it is always set. This - // means that the truncated polynominal needs at least one of its - // bits set, which implies that it cannot be zero. - if ( !(TrPo & boost::detail::mask_uint_t::sig_bits_fast) ) - { - BOOST_FAIL( "truncated CRC polymonial is zero" ); - } - - std::cout << "\tDoing error tests." << std::endl; - - // Create a random block of data - uint32_t ran_data[ 256 ]; - std::size_t const ran_length = sizeof(ran_data) / sizeof(ran_data[0]); - - std::generate_n( ran_data, ran_length, boost::minstd_rand() ); - - // Create computers and compute the checksum of the data - optimal_crc_type fast_tester; - basic_crc_type slow_tester( TrPo, InRe, FiXo, ReIn, ReRe ); - - fast_tester.process_bytes( ran_data, sizeof(ran_data) ); - slow_tester.process_bytes( ran_data, sizeof(ran_data) ); - - uint32_t const fast_checksum = fast_tester.checksum(); - uint32_t const slow_checksum = slow_tester.checksum(); - - BOOST_CHECK( fast_checksum == slow_checksum ); - - // Do the checksum again (and test resetting ability) - fast_tester.reset(); - slow_tester.reset( InRe ); - fast_tester.process_bytes( ran_data, sizeof(ran_data) ); - slow_tester.process_bytes( ran_data, sizeof(ran_data) ); - BOOST_CHECK( fast_tester.checksum() == slow_tester.checksum() ); - BOOST_CHECK( fast_tester.checksum() == fast_checksum ); - BOOST_CHECK( slow_tester.checksum() == slow_checksum ); - - // Produce a single-bit error - ran_data[ ran_data[0] % ran_length ] ^= ( 1 << (ran_data[1] % 32) ); - - // Compute the checksum of the errorenous data - // (and continue testing resetting ability) - fast_tester.reset( InRe ); - slow_tester.reset(); - fast_tester.process_bytes( ran_data, sizeof(ran_data) ); - slow_tester.process_bytes( ran_data, sizeof(ran_data) ); - BOOST_CHECK( fast_tester.checksum() == slow_tester.checksum() ); - BOOST_CHECK( fast_tester.checksum() != fast_checksum ); - BOOST_CHECK( slow_tester.checksum() != slow_checksum ); -} - -// Run the other CRC object tests -template < std::size_t Bits, CRC_PARM_TYPE TrPo, CRC_PARM_TYPE InRe, - CRC_PARM_TYPE FiXo, bool ReIn, bool ReRe > -void -PRIVATE_TESTER_NAME::master_test -( - char const * test_name, - typename PRIVATE_TESTER_NAME::value_type expected -) -{ - std::cout << "Doing test suite for " << test_name << '.' << std::endl; - compute_test( expected ); - interrupt_test( expected ); - error_test(); -} - -// Undo limited macros -#undef PRIVATE_TESTER_NAME - - -// A CRC-32 computer based on crc_basic, for timing -boost::uint32_t -basic_crc32 -( - void const * buffer, - std::size_t byte_count -) -{ - static boost::crc_basic<32> computer( 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, - true, true ); - - computer.reset(); - computer.process_bytes( buffer, byte_count ); - return computer.checksum(); -} - -// A CRC-32 computer based on crc_optimal, for timing -inline -boost::uint32_t -optimal_crc32 -( - void const * buffer, - std::size_t byte_count -) -{ - static boost::crc_32_type computer; - - computer.reset(); - computer.process_bytes( buffer, byte_count ); - return computer.checksum(); -} - -// Reflect the lower "bits" bits of a "value" -boost::uint32_t -quick_reflect -( - boost::uint32_t value, - std::size_t bits -) -{ - boost::uint32_t reflection = 0; - for ( std::size_t i = 0 ; i < bits ; ++i ) - { - if ( value & (1u << i) ) - { - reflection |= 1 << ( bits - 1 - i ); - } - } - - return reflection; -} - -// A customized CRC-32 computer, for timing -boost::uint32_t -quick_crc32 -( - void const * buffer, - std::size_t byte_count -) -{ - PRIVATE_DECLARE_BOOST( uint32_t ); - typedef unsigned char byte_type; - - // Compute the CRC table (first run only) - static bool did_init = false; - static uint32_t crc_table[ 1ul << CHAR_BIT ]; - if ( !did_init ) - { - uint32_t const value_high_bit = static_cast(1) << 31u; - - byte_type dividend = 0; - do - { - uint32_t remainder = 0; - for ( byte_type mask = 1u << (CHAR_BIT - 1u) ; mask ; mask >>= 1 ) - { - if ( dividend & mask ) - { - remainder ^= value_high_bit; - } - - if ( remainder & value_high_bit ) - { - remainder <<= 1; - remainder ^= 0x04C11DB7u; - } - else - { - remainder <<= 1; - } - } - - crc_table[ quick_reflect(dividend, CHAR_BIT) ] - = quick_reflect( remainder, 32 ); - } - while ( ++dividend ); - - did_init = true; - } - - // Compute the CRC of the data - uint32_t rem = 0xFFFFFFFF; - - byte_type const * const b_begin = static_cast( buffer ); - byte_type const * const b_end = b_begin + byte_count; - for ( byte_type const *p = b_begin ; p < b_end ; ++p ) - { - byte_type const byte_index = *p ^ rem; - rem >>= CHAR_BIT; - rem ^= crc_table[ byte_index ]; - } - - return ~rem; -} - -// Run an individual timing trial -double -time_trial -( - char const * name, - boost::uint32_t (*crc_func)(void const *, std::size_t), - boost::uint32_t expected, - void const * data, - std::size_t length -) -{ - PRIVATE_DECLARE_BOOST( uint32_t ); - using std::cout; - - // Limits of a trial - static uint32_t const max_count = 1L << 16; // ~square-root of max - static double const max_time = 3.14159; // easy as pi(e) - - // Mark the trial - cout << '\t' << name << " CRC-32: "; - - // Trial loop - uint32_t trial_count = 0, wrong_count = 0; - double elapsed_time = 0.0; - boost::timer t; - - do - { - uint32_t const scratch = (*crc_func)( data, length ); - - if ( scratch != expected ) - { - ++wrong_count; - } - elapsed_time = t.elapsed(); - ++trial_count; - } while ( (trial_count < max_count) && (elapsed_time < max_time) ); - - if ( wrong_count ) - { - BOOST_ERROR( "at least one time trial didn't match expected" ); - } - - // Report results - double const rate = trial_count / elapsed_time; - - cout << trial_count << " runs, " << elapsed_time << " s, " << rate - << " run/s" << std::endl; - return rate; -} - -// Time runs of Boost CRCs vs. a customized CRC function -void -timing_test -( -) -{ - PRIVATE_DECLARE_BOOST( uint32_t ); - using std::cout; - using std::endl; - - cout << "Doing timing tests." << endl; - - // Create a random block of data - boost::int32_t ran_data[ 256 ]; - std::size_t const ran_length = sizeof(ran_data) / sizeof(ran_data[0]); - - std::generate_n( ran_data, ran_length, boost::minstd_rand() ); - - // Use the first runs as a check. This gives a chance for first- - // time static initialization to not interfere in the timings. - uint32_t const basic_result = basic_crc32( ran_data, sizeof(ran_data) ); - uint32_t const optimal_result = optimal_crc32( ran_data, sizeof(ran_data) ); - uint32_t const quick_result = quick_crc32( ran_data, sizeof(ran_data) ); - - BOOST_CHECK( basic_result == optimal_result ); - BOOST_CHECK( optimal_result == quick_result ); - BOOST_CHECK( quick_result == basic_result ); - - // Run trials - double const basic_rate = time_trial( "Boost-Basic", basic_crc32, - basic_result, ran_data, sizeof(ran_data) ); - double const optimal_rate = time_trial( "Boost-Optimal", optimal_crc32, - optimal_result, ran_data, sizeof(ran_data) ); - double const quick_rate = time_trial( "Reference", quick_crc32, - quick_result, ran_data, sizeof(ran_data) ); - - // Report results - cout << "\tThe optimal Boost version is " << (quick_rate - optimal_rate) - / quick_rate * 100.0 << "% slower than the reference version.\n"; - cout << "\tThe basic Boost version is " << (quick_rate - basic_rate) - / quick_rate * 100.0 << "% slower than the reference version.\n"; - cout << "\tThe basic Boost version is " << (optimal_rate - basic_rate) - / optimal_rate * 100.0 << "% slower than the optimal Boost version." - << endl; -} - - -// Reformat an integer to the big-endian storage format -boost::uint32_t -native_to_big -( - boost::uint32_t x -) -{ - boost::uint32_t temp; - unsigned char * tp = reinterpret_cast( &temp ); - - for ( std::size_t i = sizeof(x) ; i > 0 ; --i ) - { - tp[ i - 1 ] = static_cast( x ); - x >>= CHAR_BIT; - } - - return temp; -} - -// Restore an integer from the big-endian storage format -boost::uint32_t -big_to_native -( - boost::uint32_t x -) -{ - boost::uint32_t temp = 0; - unsigned char * xp = reinterpret_cast( &x ); - - for ( std::size_t i = 0 ; i < sizeof(x) ; ++i ) - { - temp <<= CHAR_BIT; - temp |= xp[ i ]; - } - - return temp; -} - -// Run tests on using CRCs on augmented messages -void -augmented_tests -( -) -{ - #define PRIVATE_ACRC_FUNC boost::augmented_crc<32, 0x04C11DB7> - - using std::size_t; - PRIVATE_DECLARE_BOOST( uint32_t ); - - std::cout << "Doing CRC-augmented message tests." << std::endl; - - // Create a random block of data, with space for a CRC. - uint32_t ran_data[ 257 ]; - size_t const ran_length = sizeof(ran_data) / sizeof(ran_data[0]); - size_t const data_length = ran_length - 1; - - std::generate_n( ran_data, data_length, boost::minstd_rand() ); - - // When creating a CRC for an augmented message, use - // zeros in the appended CRC spot for the first run. - uint32_t & ran_crc = ran_data[ data_length ]; - - ran_crc = 0; - - // Compute the CRC with augmented-CRC computing function - typedef boost::uint_t<32>::fast return_type; - - ran_crc = PRIVATE_ACRC_FUNC( ran_data, sizeof(ran_data) ); - - // With the appended CRC set, running the checksum again should get zero. - // NOTE: CRC algorithm assumes numbers are in big-endian format - ran_crc = native_to_big( ran_crc ); - - uint32_t ran_crc_check = PRIVATE_ACRC_FUNC( ran_data, sizeof(ran_data) ); - - BOOST_CHECK( 0 == ran_crc_check ); - - // Compare that result with other CRC computing functions - // and classes, which don't accept augmented messages. - typedef boost::crc_optimal<32, 0x04C11DB7> fast_crc_type; - typedef boost::crc_basic<32> slow_crc_type; - - fast_crc_type fast_tester; - slow_crc_type slow_tester( 0x04C11DB7 ); - size_t const data_size = data_length * sizeof(ran_data[0]); - uint32_t const func_tester = boost::crc<32, 0x04C11DB7, 0, 0, false, - false>( ran_data, data_size ); - - fast_tester.process_bytes( ran_data, data_size ); - slow_tester.process_bytes( ran_data, data_size ); - BOOST_CHECK( fast_tester.checksum() == slow_tester.checksum() ); - ran_crc = big_to_native( ran_crc ); - BOOST_CHECK( fast_tester.checksum() == ran_crc ); - BOOST_CHECK( func_tester == ran_crc ); - - // Do a single-bit error test - ran_crc = native_to_big( ran_crc ); - ran_data[ ran_data[0] % ran_length ] ^= ( 1 << (ran_data[1] % 32) ); - ran_crc_check = PRIVATE_ACRC_FUNC( ran_data, sizeof(ran_data) ); - BOOST_CHECK( 0 != ran_crc_check ); - - // Run a version of these tests with a nonzero initial remainder. - uint32_t const init_rem = ran_data[ ran_data[2] % ran_length ]; - - ran_crc = 0; - ran_crc = PRIVATE_ACRC_FUNC( ran_data, sizeof(ran_data), init_rem ); - - // Have some fun by processing data in two steps. - size_t const mid_index = ran_length / 2; - - ran_crc = native_to_big( ran_crc ); - ran_crc_check = PRIVATE_ACRC_FUNC( ran_data, mid_index - * sizeof(ran_data[0]), init_rem ); - ran_crc_check = PRIVATE_ACRC_FUNC( &ran_data[mid_index], sizeof(ran_data) - - mid_index * sizeof(ran_data[0]), ran_crc_check ); - BOOST_CHECK( 0 == ran_crc_check ); - - // This substep translates an augmented-CRC initial - // remainder to an unaugmented-CRC initial remainder. - uint32_t const zero = 0; - uint32_t const new_init_rem = PRIVATE_ACRC_FUNC( &zero, sizeof(zero), - init_rem ); - slow_crc_type slow_tester2( 0x04C11DB7, new_init_rem ); - - slow_tester2.process_bytes( ran_data, data_size ); - ran_crc = big_to_native( ran_crc ); - BOOST_CHECK( slow_tester2.checksum() == ran_crc ); - - // Redo single-bit error test - ran_data[ ran_data[3] % ran_length ] ^= ( 1 << (ran_data[4] % 32) ); - ran_crc_check = PRIVATE_ACRC_FUNC( ran_data, sizeof(ran_data), init_rem ); - BOOST_CHECK( 0 != ran_crc_check ); - - #undef PRIVATE_ACRC_FUNC -} - - -// Run tests on CRCs below a byte in size (here, 3 bits) -void -small_crc_test1 -( -) -{ - std::cout << "Doing short-CRC (3-bit augmented) message tests." - << std::endl; - - // The CRC standard is a SDH/SONET Low Order LCAS control word with CRC-3 - // taken from ITU-T G.707 (12/03) XIII.2. - - // Four samples, each four bytes; should all have a CRC of zero - unsigned char const samples[4][4] - = { - { 0x3A, 0xC4, 0x08, 0x06 }, - { 0x42, 0xC5, 0x0A, 0x41 }, - { 0x4A, 0xC5, 0x08, 0x22 }, - { 0x52, 0xC4, 0x08, 0x05 } - }; - - // Basic computer - boost::crc_basic<3> tester1( 0x03 ); - - tester1.process_bytes( samples[0], 4 ); - BOOST_CHECK( tester1.checksum() == 0 ); - - tester1.reset(); - tester1.process_bytes( samples[1], 4 ); - BOOST_CHECK( tester1.checksum() == 0 ); - - tester1.reset(); - tester1.process_bytes( samples[2], 4 ); - BOOST_CHECK( tester1.checksum() == 0 ); - - tester1.reset(); - tester1.process_bytes( samples[3], 4 ); - BOOST_CHECK( tester1.checksum() == 0 ); - - // Optimal computer - #define PRIVATE_CRC_FUNC boost::crc<3, 0x03, 0, 0, false, false> - #define PRIVATE_ACRC_FUNC boost::augmented_crc<3, 0x03> - - BOOST_CHECK( 0 == PRIVATE_CRC_FUNC(samples[0], 4) ); - BOOST_CHECK( 0 == PRIVATE_CRC_FUNC(samples[1], 4) ); - BOOST_CHECK( 0 == PRIVATE_CRC_FUNC(samples[2], 4) ); - BOOST_CHECK( 0 == PRIVATE_CRC_FUNC(samples[3], 4) ); - - // maybe the fix to CRC functions needs to be applied to augmented CRCs? - - #undef PRIVATE_ACRC_FUNC - #undef PRIVATE_CRC_FUNC -} - -// Run tests on CRCs below a byte in size (here, 7 bits) -void -small_crc_test2 -( -) -{ - std::cout << "Doing short-CRC (7-bit augmented) message tests." - << std::endl; - - // The CRC standard is a SDH/SONET J0/J1/J2/N1/N2/TR TTI (trace message) - // with CRC-7, o.a. ITU-T G.707 Annex B, G.832 Annex A. - - // Two samples, each sixteen bytes - // Sample 1 is '\x80' + ASCII("123456789ABCDEF") - // Sample 2 is '\x80' + ASCII("TTI UNAVAILABLE") - unsigned char const samples[2][16] - = { - { 0x80, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, - 0x42, 0x43, 0x44, 0x45, 0x46 }, - { 0x80, 0x54, 0x54, 0x49, 0x20, 0x55, 0x4E, 0x41, 0x56, 0x41, 0x49, - 0x4C, 0x41, 0x42, 0x4C, 0x45 } - }; - unsigned const results[2] = { 0x62, 0x23 }; - - // Basic computer - boost::crc_basic<7> tester1( 0x09 ); - - tester1.process_bytes( samples[0], 16 ); - BOOST_CHECK( tester1.checksum() == results[0] ); - - tester1.reset(); - tester1.process_bytes( samples[1], 16 ); - BOOST_CHECK( tester1.checksum() == results[1] ); - - // Optimal computer - #define PRIVATE_CRC_FUNC boost::crc<7, 0x09, 0, 0, false, false> - #define PRIVATE_ACRC_FUNC boost::augmented_crc<7, 0x09> - - BOOST_CHECK( results[0] == PRIVATE_CRC_FUNC(samples[0], 16) ); - BOOST_CHECK( results[1] == PRIVATE_CRC_FUNC(samples[1], 16) ); - - // maybe the fix to CRC functions needs to be applied to augmented CRCs? - - #undef PRIVATE_ACRC_FUNC - #undef PRIVATE_CRC_FUNC -} - - -#ifndef BOOST_MSVC -// Explicit template instantiations -// (needed to fix a link error in Metrowerks CodeWarrior Pro 5.3) -template class crc_tester<16, 0x1021, 0xFFFF, 0, false, false>; -template class crc_tester<16, 0x8005, 0, 0, true, true>; -template class crc_tester<32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true, true>; -#endif - -// Main testing function -int -test_main -( - int , // "argc" is unused - char * [] // "argv" is unused -) -{ - using std::cout; - using std::endl; - - // Run simulations on some CRC types - typedef crc_tester<16, 0x1021, 0xFFFF, 0, false, false> crc_ccitt_tester; - typedef crc_tester<16, 0x8005, 0, 0, true, true> crc_16_tester; - typedef crc_tester<32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true, true> - crc_32_tester; - - crc_ccitt_tester::master_test( "CRC-CCITT", std_crc_ccitt_result ); - crc_16_tester::master_test( "CRC-16", std_crc_16_result ); - crc_32_tester::master_test( "CRC-32", std_crc_32_result ); - - // Run a timing comparison test - timing_test(); - - // Test using augmented messages - augmented_tests(); - - // Test with CRC types smaller than a byte - small_crc_test1(); - small_crc_test2(); - - // Try a CRC based on the (x + 1) polynominal, which is a factor in - // many real-life polynominals and doesn't fit evenly in a byte. - cout << "Doing one-bit polynominal CRC test." << endl; - boost::crc_basic<1> crc_1( 1 ); - crc_1.process_bytes( std_data, std_data_len ); - BOOST_CHECK( crc_1.checksum() == 1 ); - - // Test the function object interface - cout << "Doing functional object interface test." << endl; - boost::crc_optimal<16, 0x8005, 0, 0, true, true> crc_16; - crc_16 = std::for_each( std_data, std_data + std_data_len, crc_16 ); - BOOST_CHECK( crc_16() == std_crc_16_result ); - - return boost::exit_success; -} diff --git a/libs/iterator/doc/BidirectionalTraversal.html b/libs/iterator/doc/BidirectionalTraversal.html deleted file mode 100644 index 9c45f400e..000000000 --- a/libs/iterator/doc/BidirectionalTraversal.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - -Bidirectional Traversal Concept - - - -
-

Bidirectional Traversal Concept

- - - - -

A class or built-in type X models the Bidirectional Traversal -concept if, in addition to X meeting the requirements of Forward -Traversal Iterator, the following expressions are valid and respect -the stated semantics.

- ----- - - - - - - - - - - - - - - - - - - - - - - -
Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal -Iterator)
ExpressionReturn TypeAssertion/Semantics / -Pre-/Post-condition
--rX&pre: there exists -s such that r -== ++s. post: -s is -dereferenceable. ---(++r) == r. ---r == --s -implies r == -s. &r == &--r.
r--convertible to const X&
-{
-  X tmp = r;
-  --r;
-  return tmp;
-}
-
-
iterator_traversal<X>::typeConvertible to -bidirectional_traversal_tag 
-
- - - diff --git a/libs/iterator/doc/BidirectionalTraversal.rst b/libs/iterator/doc/BidirectionalTraversal.rst deleted file mode 100644 index a62b8bd90..000000000 --- a/libs/iterator/doc/BidirectionalTraversal.rst +++ /dev/null @@ -1,41 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Bidirectional Traversal Concept -............................... - -A class or built-in type ``X`` models the *Bidirectional Traversal* -concept if, in addition to ``X`` meeting the requirements of Forward -Traversal Iterator, the following expressions are valid and respect -the stated semantics. - -+--------------------------------------------------------------------------------------+ -|Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal | -|Iterator) | -+--------------------------------+-------------------------------+---------------------+ -|Expression |Return Type |Assertion/Semantics /| -| | |Pre-/Post-condition | -+================================+===============================+=====================+ -|``--r`` |``X&`` |pre: there exists | -| | |``s`` such that ``r | -| | |== ++s``. post: | -| | |``s`` is | -| | |dereferenceable. | -| | |``--(++r) == r``. | -| | |``--r == --s`` | -| | |implies ``r == | -| | |s``. ``&r == &--r``. | -+--------------------------------+-------------------------------+---------------------+ -|``r--`` |convertible to ``const X&`` |:: | -| | | | -| | | { | -| | | X tmp = r; | -| | | --r; | -| | | return tmp; | -| | | } | -+--------------------------------+-------------------------------+---------------------+ -|``iterator_traversal::type`` |Convertible to | | -| |``bidirectional_traversal_tag``| | -| | | | -+--------------------------------+-------------------------------+---------------------+ diff --git a/libs/iterator/doc/ForwardTraversal.html b/libs/iterator/doc/ForwardTraversal.html deleted file mode 100644 index 702064dde..000000000 --- a/libs/iterator/doc/ForwardTraversal.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - -Forward Traversal Concept - - - -
-

Forward Traversal Concept

- - - - -

A class or built-in type X models the Forward Traversal -concept if, in addition to X meeting the requirements of Default -Constructible and Single Pass Iterator, the following expressions are -valid and respect the stated semantics.

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator)
ExpressionReturn TypeAssertion/Note
X u;X&note: u may have a -singular value.
++rX&r == s and r is -dereferenceable implies -++r == ++s.
iterator_traits<X>::difference_typeA signed integral type representing -the distance between iterators 
iterator_traversal<X>::typeConvertible to -forward_traversal_tag 
-
- - - diff --git a/libs/iterator/doc/ForwardTraversal.rst b/libs/iterator/doc/ForwardTraversal.rst deleted file mode 100644 index 80dd9c7c8..000000000 --- a/libs/iterator/doc/ForwardTraversal.rst +++ /dev/null @@ -1,31 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Forward Traversal Concept -......................... - -A class or built-in type ``X`` models the *Forward Traversal* -concept if, in addition to ``X`` meeting the requirements of Default -Constructible and Single Pass Iterator, the following expressions are -valid and respect the stated semantics. - -+--------------------------------------------------------------------------------------------------------+ -|Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator) | -+---------------------------------------+-----------------------------------+----------------------------+ -|Expression |Return Type |Assertion/Note | -+=======================================+===================================+============================+ -|``X u;`` |``X&`` |note: ``u`` may have a | -| | |singular value. | -+---------------------------------------+-----------------------------------+----------------------------+ -|``++r`` |``X&`` |``r == s`` and ``r`` is | -| | |dereferenceable implies | -| | |``++r == ++s.`` | -+---------------------------------------+-----------------------------------+----------------------------+ -|``iterator_traits::difference_type``|A signed integral type representing| | -| |the distance between iterators | | -| | | | -+---------------------------------------+-----------------------------------+----------------------------+ -|``iterator_traversal::type`` |Convertible to | | -| |``forward_traversal_tag`` | | -+---------------------------------------+-----------------------------------+----------------------------+ diff --git a/libs/iterator/doc/GNUmakefile b/libs/iterator/doc/GNUmakefile deleted file mode 100644 index 85917f787..000000000 --- a/libs/iterator/doc/GNUmakefile +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright David Abrahams 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) - -ECHO = /bin/echo - -all: - @${ECHO} "/libs/iterator/doc/GNUmakefile should be replaced by" - @${ECHO} - @${ECHO} " http://www.boost-consulting.com/writing/GNUmakefile," - @${ECHO} - @${ECHO} "before proceeding. That file is not included in the Boost" - @${ECHO} "distribution because it is licensed under the GPL, which violates" - @${ECHO} "Boost license requirements." - diff --git a/libs/iterator/doc/IncrementableIterator.html b/libs/iterator/doc/IncrementableIterator.html deleted file mode 100644 index ae47b99e4..000000000 --- a/libs/iterator/doc/IncrementableIterator.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - -Incrementable Iterator Concept - - - -
-

Incrementable Iterator Concept

- - - - -

A class or built-in type X models the Incrementable Iterator -concept if, in addition to X being Assignable and Copy -Constructible, the following expressions are valid and respect the -stated semantics.

- ----- - - - - - - - - - - - - - - - - - - - - - - -
Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible)
ExpressionReturn TypeAssertion/Semantics
++rX&&r == &++r
r++X
-{
-   X tmp = r;
-   ++r;
-   return tmp;
-}
-
-
iterator_traversal<X>::typeConvertible to -incrementable_traversal_tag 
-
- - - diff --git a/libs/iterator/doc/IncrementableIterator.rst b/libs/iterator/doc/IncrementableIterator.rst deleted file mode 100644 index a1f92ec1a..000000000 --- a/libs/iterator/doc/IncrementableIterator.rst +++ /dev/null @@ -1,32 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Incrementable Iterator Concept -.............................. - -A class or built-in type ``X`` models the *Incrementable Iterator* -concept if, in addition to ``X`` being Assignable and Copy -Constructible, the following expressions are valid and respect the -stated semantics. - - -+-------------------------------------------------------------------------------------+ -|Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible) | -| | -+--------------------------------+-------------------------------+--------------------+ -|Expression |Return Type |Assertion/Semantics | -+================================+===============================+====================+ -|``++r`` |``X&`` |``&r == &++r`` | -+--------------------------------+-------------------------------+--------------------+ -|``r++`` |``X`` |:: | -| | | | -| | | { | -| | | X tmp = r; | -| | | ++r; | -| | | return tmp; | -| | | } | -+--------------------------------+-------------------------------+--------------------+ -|``iterator_traversal::type`` |Convertible to | | -| |``incrementable_traversal_tag``| | -+--------------------------------+-------------------------------+--------------------+ diff --git a/libs/iterator/doc/InteroperableIterator.rst b/libs/iterator/doc/InteroperableIterator.rst deleted file mode 100644 index 3632ff24a..000000000 --- a/libs/iterator/doc/InteroperableIterator.rst +++ /dev/null @@ -1,61 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Interoperable Iterator Concept -.............................. - -A class or built-in type ``X`` that models Single Pass Iterator is -*interoperable with* a class or built-in type ``Y`` that also models -Single Pass Iterator if the following expressions are valid and -respect the stated semantics. In the tables below, ``x`` is an object -of type ``X``, ``y`` is an object of type ``Y``, ``Distance`` is -``iterator_traits::difference_type``, and ``n`` represents a -constant object of type ``Distance``. - -+-----------+-----------------------+---------------------------------------------------+ -|Expression |Return Type |Assertion/Precondition/Postcondition | -+===========+=======================+===================================================+ -|``y = x`` |``Y`` |post: ``y == x`` | -+-----------+-----------------------+---------------------------------------------------+ -|``Y(x)`` |``Y`` |post: ``Y(x) == x`` | -+-----------+-----------------------+---------------------------------------------------+ -|``x == y`` |convertible to ``bool``|``==`` is an equivalence relation over its domain. | -+-----------+-----------------------+---------------------------------------------------+ -|``y == x`` |convertible to ``bool``|``==`` is an equivalence relation over its domain. | -+-----------+-----------------------+---------------------------------------------------+ -|``x != y`` |convertible to ``bool``|``bool(a==b) != bool(a!=b)`` over its domain. | -+-----------+-----------------------+---------------------------------------------------+ -|``y != x`` |convertible to ``bool``|``bool(a==b) != bool(a!=b)`` over its domain. | -+-----------+-----------------------+---------------------------------------------------+ - -If ``X`` and ``Y`` both model Random Access Traversal Iterator then -the following additional requirements must be met. - -+-----------+-----------------------+---------------------+--------------------------------------+ -|Expression |Return Type |Operational Semantics|Assertion/ Precondition | -+===========+=======================+=====================+======================================+ -|``x < y`` |convertible to ``bool``|``y - x > 0`` |``<`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y < x`` |convertible to ``bool``|``x - y > 0`` |``<`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x > y`` |convertible to ``bool``|``y < x`` |``>`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y > x`` |convertible to ``bool``|``x < y`` |``>`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x >= y`` |convertible to ``bool``|``!(x < y)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y >= x`` |convertible to ``bool``|``!(y < x)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x <= y`` |convertible to ``bool``|``!(x > y)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y <= x`` |convertible to ``bool``|``!(y > x)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y - x`` |``Distance`` |``distance(Y(x),y)`` |pre: there exists a value ``n`` of | -| | | |``Distance`` such that ``x + n == y``.| -| | | |``y == x + (y - x)``. | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x - y`` |``Distance`` |``distance(y,Y(x))`` |pre: there exists a value ``n`` of | -| | | |``Distance`` such that ``y + n == x``.| -| | | |``x == y + (x - y)``. | -+-----------+-----------------------+---------------------+--------------------------------------+ diff --git a/libs/iterator/doc/Jamfile.v2 b/libs/iterator/doc/Jamfile.v2 deleted file mode 100644 index 66ec0e406..000000000 --- a/libs/iterator/doc/Jamfile.v2 +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright Thomas Witt 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) - -using quickbook ; - -xml iterator - : - quickbook/iterator.qbk - ; - -boostbook standalone - : - iterator - : - boost.root=../../../.. - toc.max.depth=3 - toc.section.depth=3 - chunk.section.depth=4 - pdf:boost.url.prefix=http://www.boost.org/doc/libs/release/libs/iterator/doc - ; - -############################################################################### -alias boostdoc ; -explicit boostdoc ; -alias boostrelease : standalone ; -explicit boostrelease ; diff --git a/libs/iterator/doc/LvalueIterator.html b/libs/iterator/doc/LvalueIterator.html deleted file mode 100644 index c20626c17..000000000 --- a/libs/iterator/doc/LvalueIterator.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - -Lvalue Iterator Concept - - - -
-

Lvalue Iterator Concept

- - - - -

The Lvalue Iterator concept adds the requirement that the return -type of operator* type be a reference to the value type of the -iterator.

- ----- - - - - - - - - - - - - - - -
Lvalue Iterator Requirements
ExpressionReturn TypeNote/Assertion
*aT&T is cv -iterator_traits<X>::value_type -where cv is an optional -cv-qualification. -pre: a is -dereferenceable. If a -== b then *a is -equivalent to *b.
-
- - - diff --git a/libs/iterator/doc/LvalueIterator.rst b/libs/iterator/doc/LvalueIterator.rst deleted file mode 100644 index 39c267290..000000000 --- a/libs/iterator/doc/LvalueIterator.rst +++ /dev/null @@ -1,25 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Lvalue Iterator Concept -....................... - -The *Lvalue Iterator* concept adds the requirement that the return -type of ``operator*`` type be a reference to the value type of the -iterator. - -+-------------------------------------------------------------+ -| Lvalue Iterator Requirements | -+-------------+-----------+-----------------------------------+ -|Expression |Return Type|Note/Assertion | -+=============+===========+===================================+ -|``*a`` | ``T&`` |``T`` is *cv* | -| | |``iterator_traits::value_type`` | -| | |where *cv* is an optional | -| | |cv-qualification. | -| | |pre: ``a`` is | -| | |dereferenceable. If ``a | -| | |== b`` then ``*a`` is | -| | |equivalent to ``*b``. | -+-------------+-----------+-----------------------------------+ diff --git a/libs/iterator/doc/RandomAccessTraversal.html b/libs/iterator/doc/RandomAccessTraversal.html deleted file mode 100644 index 4c681a6f4..000000000 --- a/libs/iterator/doc/RandomAccessTraversal.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - -Random Access Traversal Concept - - - -
-

Random Access Traversal Concept

- - - - -

A class or built-in type X models the Random Access Traversal -concept if the following expressions are valid and respect the stated -semantics. In the table below, Distance is -iterator_traits<X>::difference_type and n represents a -constant object of type Distance.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal)
ExpressionReturn TypeOperational SemanticsAssertion/ -Precondition
r += nX&
-{
-  Distance m = n;
-  if (m >= 0)
-    while (m--)
-      ++r;
-  else
-    while (m++)
-      --r;
-  return r;
-}
-
-
 
a + n, n + aX{ X tmp = a; return tmp -+= n; } 
r -= nX&return r += -n 
a - nX{ X tmp = a; return tmp --= n; } 
b - aDistancea < b ?  distance(a,b) -: -distance(b,a)pre: there exists a -value n of -Distance such that -a + n == b. b -== a + (b - a).
a[n]convertible to T*(a + n)pre: a is a Readable -Iterator
a[n] = vconvertible to T*(a + n) = vpre: a is a Writable -iterator
a < bconvertible to boolb - a > 0< is a total -ordering relation
a > bconvertible to boolb < a> is a total -ordering relation
a >= bconvertible to bool!(a < b) 
a <= bconvertible to bool!(a > b) 
iterator_traversal<X>::typeConvertible to -random_access_traversal_tag  
-
- - - diff --git a/libs/iterator/doc/RandomAccessTraversal.rst b/libs/iterator/doc/RandomAccessTraversal.rst deleted file mode 100644 index 490faf6f2..000000000 --- a/libs/iterator/doc/RandomAccessTraversal.rst +++ /dev/null @@ -1,67 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Random Access Traversal Concept -............................... - -A class or built-in type ``X`` models the *Random Access Traversal* -concept if the following expressions are valid and respect the stated -semantics. In the table below, ``Distance`` is -``iterator_traits::difference_type`` and ``n`` represents a -constant object of type ``Distance``. - -+------------------------------------------------------------------------------------------------------------------+ -|Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal) | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|Expression |Return Type |Operational Semantics |Assertion/ | -| | | |Precondition | -+===============================+=================================+=========================+======================+ -|``r += n`` |``X&`` |:: | | -| | | | | -| | | { | | -| | | Distance m = n; | | -| | | if (m >= 0) | | -| | | while (m--) | | -| | | ++r; | | -| | | else | | -| | | while (m++) | | -| | | --r; | | -| | | return r; | | -| | | } | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a + n``, ``n + a`` |``X`` |``{ X tmp = a; return tmp| | -| | |+= n; }`` | | -| | | | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``r -= n`` |``X&`` |``return r += -n`` | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a - n`` |``X`` |``{ X tmp = a; return tmp| | -| | |-= n; }`` | | -| | | | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``b - a`` |``Distance`` |``a < b ? distance(a,b) |pre: there exists a | -| | |: -distance(b,a)`` |value ``n`` of | -| | | |``Distance`` such that| -| | | |``a + n == b``. ``b | -| | | |== a + (b - a)``. | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a[n]`` |convertible to T |``*(a + n)`` |pre: a is a *Readable | -| | | |Iterator* | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a[n] = v`` |convertible to T |``*(a + n) = v`` |pre: a is a *Writable | -| | | |iterator* | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a < b`` |convertible to ``bool`` |``b - a > 0`` |``<`` is a total | -| | | |ordering relation | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a > b`` |convertible to ``bool`` |``b < a`` |``>`` is a total | -| | | |ordering relation | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a >= b`` |convertible to ``bool`` |``!(a < b)`` | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a <= b`` |convertible to ``bool`` |``!(a > b)`` | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``iterator_traversal::type``|Convertible to | | | -| |``random_access_traversal_tag`` | | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ diff --git a/libs/iterator/doc/ReadableIterator.html b/libs/iterator/doc/ReadableIterator.html deleted file mode 100644 index 04be02175..000000000 --- a/libs/iterator/doc/ReadableIterator.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - -Readable Iterator Concept - - - -
-

Readable Iterator Concept

- - - - -

A class or built-in type X models the Readable Iterator concept -for value type T if, in addition to X being Assignable and -Copy Constructible, the following expressions are valid and respect -the stated semantics. U is the type of any specified member of -type T.

- ----- - - - - - - - - - - - - - - - - - - - - - - -
Readable Iterator Requirements (in addition to Assignable and Copy Constructible)
ExpressionReturn TypeNote/Precondition
iterator_traits<X>::value_typeTAny non-reference, -non-cv-qualified type
*aConvertible to T
-
pre: a is dereferenceable. If a == b then *a
-
is equivalent to *b.
-
-
a->mU&pre: pre: (*a).m is well-defined. Equivalent to (*a).m.
-
- - - diff --git a/libs/iterator/doc/ReadableIterator.rst b/libs/iterator/doc/ReadableIterator.rst deleted file mode 100644 index 27f79f858..000000000 --- a/libs/iterator/doc/ReadableIterator.rst +++ /dev/null @@ -1,26 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Readable Iterator Concept -......................... - -A class or built-in type ``X`` models the *Readable Iterator* concept -for value type ``T`` if, in addition to ``X`` being Assignable and -Copy Constructible, the following expressions are valid and respect -the stated semantics. ``U`` is the type of any specified member of -type ``T``. - -+-----------------------------------------------------------------------------------------------------------------------------+ -|Readable Iterator Requirements (in addition to Assignable and Copy Constructible) | -+-----------------------------------+------------------------+----------------------------------------------------------------+ -|Expression |Return Type |Note/Precondition | -+===================================+========================+================================================================+ -|``iterator_traits::value_type`` |``T`` |Any non-reference, | -| | |non-cv-qualified type | -+-----------------------------------+------------------------+----------------------------------------------------------------+ -|``*a`` | Convertible to ``T`` |pre: ``a`` is dereferenceable. If ``a == b`` then ``*a`` | -| | | is equivalent to ``*b``. | -+-----------------------------------+------------------------+----------------------------------------------------------------+ -|``a->m`` |``U&`` |pre: ``pre: (*a).m`` is well-defined. Equivalent to ``(*a).m``. | -+-----------------------------------+------------------------+----------------------------------------------------------------+ diff --git a/libs/iterator/doc/SinglePassIterator.html b/libs/iterator/doc/SinglePassIterator.html deleted file mode 100644 index bc2835d5b..000000000 --- a/libs/iterator/doc/SinglePassIterator.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - -Single Pass Iterator Concept - - - -
-

Single Pass Iterator Concept

- - - - -

A class or built-in type X models the Single Pass Iterator -concept if the following expressions are valid and respect the stated -semantics.

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality -Comparable)
ExpressionReturn TypeAssertion/Semantics / -Pre-/Post-condition
++rX&pre: r is -dereferenceable; post: -r is dereferenceable or -r is past-the-end
a == bconvertible to bool== is an equivalence -relation over its domain
a != bconvertible to bool!(a == b)
iterator_traversal<X>::typeConvertible to -single_pass_traversal_tag 
-
- - - diff --git a/libs/iterator/doc/SinglePassIterator.rst b/libs/iterator/doc/SinglePassIterator.rst deleted file mode 100644 index eaa50e0ab..000000000 --- a/libs/iterator/doc/SinglePassIterator.rst +++ /dev/null @@ -1,32 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Single Pass Iterator Concept -............................ - -A class or built-in type ``X`` models the *Single Pass Iterator* -concept if the following expressions are valid and respect the stated -semantics. - - -+------------------------------------------------------------------------------------------+ -|Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality | -|Comparable) | -+--------------------------------+-----------------------------+---------------------------+ -|Expression |Return Type |Assertion/Semantics / | -| | |Pre-/Post-condition | -+================================+=============================+===========================+ -|``++r`` |``X&`` |pre: ``r`` is | -| | |dereferenceable; post: | -| | |``r`` is dereferenceable or| -| | |``r`` is past-the-end | -+--------------------------------+-----------------------------+---------------------------+ -|``a == b`` |convertible to ``bool`` |``==`` is an equivalence | -| | |relation over its domain | -+--------------------------------+-----------------------------+---------------------------+ -|``a != b`` |convertible to ``bool`` |``!(a == b)`` | -+--------------------------------+-----------------------------+---------------------------+ -|``iterator_traversal::type`` |Convertible to | | -| |``single_pass_traversal_tag``| | -+--------------------------------+-----------------------------+---------------------------+ diff --git a/libs/iterator/doc/SwappableIterator.html b/libs/iterator/doc/SwappableIterator.html deleted file mode 100644 index e3c1eaebc..000000000 --- a/libs/iterator/doc/SwappableIterator.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - -Swappable Iterator Concept - - - -
-

Swappable Iterator Concept

- - - - -

A class or built-in type X models the Swappable Iterator concept -if, in addition to X being Copy Constructible, the following -expressions are valid and respect the stated semantics.

- ----- - - - - - - - - - - - - - - -
Swappable Iterator Requirements (in addition to Copy Constructible)
ExpressionReturn TypePostcondition
iter_swap(a, b)voidthe pointed to values are -exchanged
-
-
[Note: An iterator that is a model of the Readable and Writable Iterator concepts
-
is also a model of Swappable Iterator. --end note]
-
-
- - - diff --git a/libs/iterator/doc/SwappableIterator.rst b/libs/iterator/doc/SwappableIterator.rst deleted file mode 100644 index 55554e7eb..000000000 --- a/libs/iterator/doc/SwappableIterator.rst +++ /dev/null @@ -1,23 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Swappable Iterator Concept -.......................... - -A class or built-in type ``X`` models the *Swappable Iterator* concept -if, in addition to ``X`` being Copy Constructible, the following -expressions are valid and respect the stated semantics. - -+---------------------------------------------------------------------+ -|Swappable Iterator Requirements (in addition to Copy Constructible) | -+-------------------------+-------------+-----------------------------+ -|Expression |Return Type |Postcondition | -+=========================+=============+=============================+ -|``iter_swap(a, b)`` |``void`` |the pointed to values are | -| | |exchanged | -+-------------------------+-------------+-----------------------------+ - -[*Note:* An iterator that is a model of the *Readable* and *Writable Iterator* concepts - is also a model of *Swappable Iterator*. *--end note*] - diff --git a/libs/iterator/doc/WritableIterator.html b/libs/iterator/doc/WritableIterator.html deleted file mode 100644 index 724747451..000000000 --- a/libs/iterator/doc/WritableIterator.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - -Writable Iterator Concept - - - -
-

Writable Iterator Concept

- - - - -

A class or built-in type X models the Writable Iterator concept -if, in addition to X being Copy Constructible, the following -expressions are valid and respect the stated semantics. Writable -Iterators have an associated set of value types.

- ----- - - - - - - - - - - - - - - -
Writable Iterator Requirements (in addition to Copy Constructible)
ExpressionReturn TypePrecondition
*a = o pre: The type of o -is in the set of -value types of X
-
- - - diff --git a/libs/iterator/doc/WritableIterator.rst b/libs/iterator/doc/WritableIterator.rst deleted file mode 100644 index 49b6e1601..000000000 --- a/libs/iterator/doc/WritableIterator.rst +++ /dev/null @@ -1,21 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Writable Iterator Concept -......................... - -A class or built-in type ``X`` models the *Writable Iterator* concept -if, in addition to ``X`` being Copy Constructible, the following -expressions are valid and respect the stated semantics. Writable -Iterators have an associated *set of value types*. - -+---------------------------------------------------------------------+ -|Writable Iterator Requirements (in addition to Copy Constructible) | -+-------------------------+--------------+----------------------------+ -|Expression |Return Type |Precondition | -+=========================+==============+============================+ -|``*a = o`` | | pre: The type of ``o`` | -| | | is in the set of | -| | | value types of ``X`` | -+-------------------------+--------------+----------------------------+ diff --git a/libs/iterator/doc/access.png b/libs/iterator/doc/access.png deleted file mode 100644 index 80011dcc7c82a35cbc173b314a9e247db0bf3f8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11127 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 diff --git a/libs/iterator/doc/access2old.png b/libs/iterator/doc/access2old.png deleted file mode 100644 index 8a87b84fa565e7b2469926163a668804afd7d65e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42175 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 diff --git a/libs/iterator/doc/counting_iterator.html b/libs/iterator/doc/counting_iterator.html deleted file mode 100644 index 1cb5a17ee..000000000 --- a/libs/iterator/doc/counting_iterator.html +++ /dev/null @@ -1,301 +0,0 @@ - - - - - - -Counting Iterator - - - - - - - -
-

Counting Iterator

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2006-09-11
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
- - - - --- - - - -
abstract:

How would you fill up a vector with the numbers zero -through one hundred using std::copy()? The only iterator -operation missing from builtin integer types is an -operator*() that returns the current value of the integer. -The counting iterator adaptor adds this crucial piece of -functionality to whatever type it wraps. One can use the -counting iterator adaptor not only with integer types, but with -any incrementable type.

- - - -

counting_iterator adapts an object by adding an operator* that -returns the current value of the object. All other iterator operations -are forwarded to the adapted object.

-
-
-
-

counting_iterator synopsis

- - - -
-template <
-    class Incrementable
-  , class CategoryOrTraversal = use_default
-  , class Difference = use_default
->
-class counting_iterator
-{
-public:
-    typedef Incrementable value_type;
-    typedef const Incrementable& reference;
-    typedef const Incrementable* pointer;
-    typedef /* see below */ difference_type;
-    typedef /* see below */ iterator_category;
-
-    counting_iterator();
-    counting_iterator(counting_iterator const& rhs);
-    explicit counting_iterator(Incrementable x);
-    Incrementable const& base() const;
-    reference operator*() const;
-    counting_iterator& operator++();
-    counting_iterator& operator--();
-private:
-    Incrementable m_inc; // exposition
-};
-
-

If the Difference argument is use_default then -difference_type is an unspecified signed integral -type. Otherwise difference_type is Difference.

-

iterator_category is determined according to the following -algorithm:

-
-if (CategoryOrTraversal is not use_default)
-    return CategoryOrTraversal
-else if (numeric_limits<Incrementable>::is_specialized)
-    return iterator-category(
-        random_access_traversal_tag, Incrementable, const Incrementable&)
-else
-    return iterator-category(
-         iterator_traversal<Incrementable>::type,
-         Incrementable, const Incrementable&)
-
-
-
[Note: implementers are encouraged to provide an implementation of
-
operator- and a difference_type that avoids overflows in -the cases where std::numeric_limits<Incrementable>::is_specialized -is true.]
-
-
-
-

counting_iterator requirements

-

The Incrementable argument shall be Copy Constructible and Assignable.

-

If iterator_category is convertible to forward_iterator_tag -or forward_traversal_tag, the following must be well-formed:

-
-Incrementable i, j;
-++i;         // pre-increment
-i == j;      // operator equal
-
-

If iterator_category is convertible to -bidirectional_iterator_tag or bidirectional_traversal_tag, -the following expression must also be well-formed:

-
---i
-
-

If iterator_category is convertible to -random_access_iterator_tag or random_access_traversal_tag, -the following must must also be valid:

-
-counting_iterator::difference_type n;
-i += n;
-n = i - j;
-i < j;
-
-
-
-

counting_iterator models

-

Specializations of counting_iterator model Readable Lvalue -Iterator. In addition, they model the concepts corresponding to the -iterator tags to which their iterator_category is convertible. -Also, if CategoryOrTraversal is not use_default then -counting_iterator models the concept corresponding to the iterator -tag CategoryOrTraversal. Otherwise, if -numeric_limits<Incrementable>::is_specialized, then -counting_iterator models Random Access Traversal Iterator. -Otherwise, counting_iterator models the same iterator traversal -concepts modeled by Incrementable.

-

counting_iterator<X,C1,D1> is interoperable with -counting_iterator<Y,C2,D2> if and only if X is -interoperable with Y.

-
-
-

counting_iterator operations

-

In addition to the operations required by the concepts modeled by -counting_iterator, counting_iterator provides the following -operations.

-

counting_iterator();

- --- - - - - - -
Requires:Incrementable is Default Constructible.
Effects:Default construct the member m_inc.
-

counting_iterator(counting_iterator const& rhs);

- --- - - - -
Effects:Construct member m_inc from rhs.m_inc.
-

explicit counting_iterator(Incrementable x);

- --- - - - -
Effects:Construct member m_inc from x.
-

reference operator*() const;

- --- - - - -
Returns:m_inc
-

counting_iterator& operator++();

- --- - - - - - -
Effects:++m_inc
Returns:*this
-

counting_iterator& operator--();

- --- - - - - - -
Effects:--m_inc
Returns:*this
-

Incrementable const& base() const;

- --- - - - -
Returns:m_inc
- - - -
-template <class Incrementable>
-counting_iterator<Incrementable> make_counting_iterator(Incrementable x);
-
- --- - - - -
Returns:An instance of counting_iterator<Incrementable> -with current constructed from x.
- - - -
-
-

Example

-

This example fills an array with numbers and a second array with -pointers into the first array, using counting_iterator for both -tasks. Finally indirect_iterator is used to print out the numbers -into the first array via indirection through the second array.

-
-int N = 7;
-std::vector<int> numbers;
-typedef std::vector<int>::iterator n_iter;
-std::copy(boost::counting_iterator<int>(0),
-         boost::counting_iterator<int>(N),
-         std::back_inserter(numbers));
-
-std::vector<std::vector<int>::iterator> pointers;
-std::copy(boost::make_counting_iterator(numbers.begin()),
-          boost::make_counting_iterator(numbers.end()),
-          std::back_inserter(pointers));
-
-std::cout << "indirectly printing out the numbers from 0 to "
-          << N << std::endl;
-std::copy(boost::make_indirect_iterator(pointers.begin()),
-          boost::make_indirect_iterator(pointers.end()),
-          std::ostream_iterator<int>(std::cout, " "));
-std::cout << std::endl;
-
-

The output is:

-
-indirectly printing out the numbers from 0 to 7
-0 1 2 3 4 5 6
-
-

The source code for this example can be found here.

-
-
- - - diff --git a/libs/iterator/doc/counting_iterator.pdf b/libs/iterator/doc/counting_iterator.pdf deleted file mode 100644 index 21b2d9656a4acaca75041b05d5cf5c283d7f675a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72583 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 DRus$8G?MVVV%fEcKXQaT3wsU}4Q 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 numbers; - typedef std::vector::iterator n_iter; - std::copy(boost::counting_iterator(0), - boost::counting_iterator(N), - std::back_inserter(numbers)); - - std::vector::iterator> pointers; - std::copy(boost::make_counting_iterator(numbers.begin()), - boost::make_counting_iterator(numbers.end()), - std::back_inserter(pointers)); - - std::cout << "indirectly printing out the numbers from 0 to " - << N << std::endl; - std::copy(boost::make_indirect_iterator(pointers.begin()), - boost::make_indirect_iterator(pointers.end()), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - -The output is:: - - indirectly printing out the numbers from 0 to 7 - 0 1 2 3 4 5 6 - -The source code for this example can be found `here`__. - -__ ../example/counting_iterator_example.cpp - diff --git a/libs/iterator/doc/counting_iterator_ref.rst b/libs/iterator/doc/counting_iterator_ref.rst deleted file mode 100644 index 1c5fd1c4d..000000000 --- a/libs/iterator/doc/counting_iterator_ref.rst +++ /dev/null @@ -1,149 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -:: - - template < - class Incrementable - , class CategoryOrTraversal = use_default - , class Difference = use_default - > - class counting_iterator - { - public: - typedef Incrementable value_type; - typedef const Incrementable& reference; - typedef const Incrementable* pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - - counting_iterator(); - counting_iterator(counting_iterator const& rhs); - explicit counting_iterator(Incrementable x); - Incrementable const& base() const; - reference operator*() const; - counting_iterator& operator++(); - counting_iterator& operator--(); - private: - Incrementable m_inc; // exposition - }; - - -If the ``Difference`` argument is ``use_default`` then -``difference_type`` is an unspecified signed integral -type. Otherwise ``difference_type`` is ``Difference``. - -``iterator_category`` is determined according to the following -algorithm: - -.. parsed-literal:: - - if (CategoryOrTraversal is not use_default) - return CategoryOrTraversal - else if (numeric_limits::is_specialized) - return |iterator-category|_\ ( - random_access_traversal_tag, Incrementable, const Incrementable&) - else - return |iterator-category|_\ ( - iterator_traversal::type, - Incrementable, const Incrementable&) - -[*Note:* implementers are encouraged to provide an implementation of - ``operator-`` and a ``difference_type`` that avoids overflows in - the cases where ``std::numeric_limits::is_specialized`` - is true.] - -``counting_iterator`` requirements -.................................. - -The ``Incrementable`` argument shall be Copy Constructible and Assignable. - -If ``iterator_category`` is convertible to ``forward_iterator_tag`` -or ``forward_traversal_tag``, the following must be well-formed:: - - Incrementable i, j; - ++i; // pre-increment - i == j; // operator equal - - -If ``iterator_category`` is convertible to -``bidirectional_iterator_tag`` or ``bidirectional_traversal_tag``, -the following expression must also be well-formed:: - - --i - -If ``iterator_category`` is convertible to -``random_access_iterator_tag`` or ``random_access_traversal_tag``, -the following must must also be valid:: - - counting_iterator::difference_type n; - i += n; - n = i - j; - i < j; - -``counting_iterator`` models -............................ - -Specializations of ``counting_iterator`` model Readable Lvalue -Iterator. In addition, they model the concepts corresponding to the -iterator tags to which their ``iterator_category`` is convertible. -Also, if ``CategoryOrTraversal`` is not ``use_default`` then -``counting_iterator`` models the concept corresponding to the iterator -tag ``CategoryOrTraversal``. Otherwise, if -``numeric_limits::is_specialized``, then -``counting_iterator`` models Random Access Traversal Iterator. -Otherwise, ``counting_iterator`` models the same iterator traversal -concepts modeled by ``Incrementable``. - -``counting_iterator`` is interoperable with -``counting_iterator`` if and only if ``X`` is -interoperable with ``Y``. - - - -``counting_iterator`` operations -................................ - -In addition to the operations required by the concepts modeled by -``counting_iterator``, ``counting_iterator`` provides the following -operations. - - -``counting_iterator();`` - -:Requires: ``Incrementable`` is Default Constructible. -:Effects: Default construct the member ``m_inc``. - - -``counting_iterator(counting_iterator const& rhs);`` - -:Effects: Construct member ``m_inc`` from ``rhs.m_inc``. - - - -``explicit counting_iterator(Incrementable x);`` - -:Effects: Construct member ``m_inc`` from ``x``. - - -``reference operator*() const;`` - -:Returns: ``m_inc`` - - -``counting_iterator& operator++();`` - -:Effects: ``++m_inc`` -:Returns: ``*this`` - - -``counting_iterator& operator--();`` - -:Effects: ``--m_inc`` -:Returns: ``*this`` - - -``Incrementable const& base() const;`` - -:Returns: ``m_inc`` diff --git a/libs/iterator/doc/default.css b/libs/iterator/doc/default.css deleted file mode 100644 index 8c1e34258..000000000 --- a/libs/iterator/doc/default.css +++ /dev/null @@ -1,226 +0,0 @@ -/* -:Author: David Goodger -:Contact: goodger@users.sourceforge.net -:date: $Date$ -:version: $Revision$ -:copyright: This stylesheet has been placed in the public domain. - -boostinspect:nolicense - -Default cascading style sheet for the HTML output of Docutils. -*/ - -.first { - margin-top: 0 } - -.last { - margin-bottom: 0 } - -a.toc-backref { - text-decoration: none ; - color: black } - -dd { - margin-bottom: 0.5em } - -div.abstract { - margin: 2em 5em } - -div.abstract p.topic-title { - font-weight: bold ; - text-align: center } - -div.attention, div.caution, div.danger, div.error, div.hint, -div.important, div.note, div.tip, div.warning, div.admonition { - margin: 2em ; - border: medium outset ; - padding: 1em } - -div.attention p.admonition-title, div.caution p.admonition-title, -div.danger p.admonition-title, div.error p.admonition-title, -div.warning p.admonition-title { - color: red ; - font-weight: bold ; - font-family: sans-serif } - -div.hint p.admonition-title, div.important p.admonition-title, -div.note p.admonition-title, div.tip p.admonition-title, -div.admonition p.admonition-title { - font-weight: bold ; - font-family: sans-serif } - -div.dedication { - margin: 2em 5em ; - text-align: center ; - font-style: italic } - -div.dedication p.topic-title { - font-weight: bold ; - font-style: normal } - -div.figure { - margin-left: 2em } - -div.footer, div.header { - font-size: smaller } - -div.sidebar { - margin-left: 1em ; - border: medium outset ; - padding: 0em 1em ; - background-color: #ffffee ; - width: 40% ; - float: right ; - clear: right } - -div.sidebar p.rubric { - font-family: sans-serif ; - font-size: medium } - -div.system-messages { - margin: 5em } - -div.system-messages h1 { - color: red } - -div.system-message { - border: medium outset ; - padding: 1em } - -div.system-message p.system-message-title { - color: red ; - font-weight: bold } - -div.topic { - margin: 2em } - -h1.title { - text-align: center } - -h2.subtitle { - text-align: center } - -hr { - width: 75% } - -ol.simple, ul.simple { - margin-bottom: 1em } - -ol.arabic { - list-style: decimal } - -ol.loweralpha { - list-style: lower-alpha } - -ol.upperalpha { - list-style: upper-alpha } - -ol.lowerroman { - list-style: lower-roman } - -ol.upperroman { - list-style: upper-roman } - -p.attribution { - text-align: right ; - margin-left: 50% } - -p.caption { - font-style: italic } - -p.credits { - font-style: italic ; - font-size: smaller } - -p.label { - white-space: nowrap } - -p.rubric { - font-weight: bold ; - font-size: larger ; - color: maroon ; - text-align: center } - -p.sidebar-title { - font-family: sans-serif ; - font-weight: bold ; - font-size: larger } - -p.sidebar-subtitle { - font-family: sans-serif ; - font-weight: bold } - -p.topic-title { - font-weight: bold } - -pre.address { - margin-bottom: 0 ; - margin-top: 0 ; - font-family: serif ; - font-size: 100% } - -pre.line-block { - font-family: serif ; - font-size: 100% } - -pre.literal-block, pre.doctest-block { - margin-left: 2em ; - margin-right: 2em ; - background-color: #eeeeee } - -span.classifier { - font-family: sans-serif ; - font-style: oblique } - -span.classifier-delimiter { - font-family: sans-serif ; - font-weight: bold } - -span.interpreted { - font-family: sans-serif } - -span.option { - white-space: nowrap } - -span.option-argument { - font-style: italic } - -span.pre { - white-space: pre } - -span.problematic { - color: red } - -table { - margin-top: 0.5em ; - margin-bottom: 0.5em } - -table.citation { - border-left: solid thin gray ; - padding-left: 0.5ex } - -table.docinfo { - margin: 2em 4em } - -table.footnote { - border-left: solid thin black ; - padding-left: 0.5ex } - -td, th { - padding-left: 0.5em ; - padding-right: 0.5em ; - vertical-align: top } - -th.docinfo-name, th.field-name { - font-weight: bold ; - text-align: left ; - white-space: nowrap } - -h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { - font-size: 100% } - -tt { - background-color: #eeeeee } - -ul.auto-toc { - list-style-type: none } diff --git a/libs/iterator/doc/docutils.sty b/libs/iterator/doc/docutils.sty deleted file mode 100644 index a6fce3f0a..000000000 --- a/libs/iterator/doc/docutils.sty +++ /dev/null @@ -1,54 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%% docutils.sty: A style for docutils latex output %%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% -%% o author: Alexander Schmolck (a.schmolck@gmx.net) -%% o created: 2002-07-07 10:50:31+00:40 -%% o last modified: $Date: 2004/01/29 05:55:26 $ -%% o keywords: -%% o license: -%XXX titlesec -%% XXX geometry -\usepackage{graphicx} -\usepackage{latexsym} % extra symbols -\usepackage{url} % !!!: pay attention when using in other commands!!! -\usepackage{verbatim} % normal verbatim has lenght-limit -\usepackage{enumerate} % easy style choice with e.g: ``\begin{enumerate}[Ex i.]`` -\usepackage{hyperref} %href, htarget and hlink XXX: pdfauthor, pdfcreator etc. -\usepackage{xr} %XXX do we need this? -% need this to have ``fboxes`` in ``enviroments``, as well as ``verbatim``s -\usepackage{fancybox} -\usepackage{mdwtab} % better tables and arrays (fixes spacing and adds - % vertical align and multirows (m)) -\usepackage{ltxtable} % long and autoscaling tables (use X for autoscaled - % columns) -\newcommand{\transition}{\vspace{2em}\par\hrule{}\par\vspace{2em}} -\newcommand{\classifier}[1]{(\textit{#1})} -\newenvironment{topic}[1]% -{\begin{Sbox}% - \begin{minipage}{.8\textwidth}% - \protect{\large{\textbf{#1}}}\par\vspace{.5em}}% -{\end{minipage}\end{Sbox}\fbox{\TheSbox}\par\vspace{.5em}} -%XXX shadow box for warnings? -\newenvironment{admonition}[1]% -{\begin{center}% - \begin{Sbox}% - \begin{minipage}{.9\textwidth}% - \protect{\textsc{#1}}\par\vspace{.2em}}% -{\end{minipage}\end{Sbox}\fbox{\TheSbox}\par\vspace{.5em}\end{center}} - -\newenvironment{doctest}% -{\VerbatimEnvironment - \begin{Verbatim}}% -{\end{Verbatim}} -% {% -% \begin{Sbox}% -% \begin{minipage}{.8\textwidth}% -% \protect{\large{\textsc{#1}}\par\vspace{.5em}}}% -% {\end{minipage}\end{Sbox}\fbox{\TheSbox}\par\vspace{.5em}} -%{\end{minipage}\end{Sbox}\fbox{\TheSbox}} - - -%% just a piece of example code -% \newcommand{\vitem}% -% {\SaveVerb[{\item[\UseVerb{\MyTemp}]}]{\MyTemp}} diff --git a/libs/iterator/doc/facade-and-adaptor.html b/libs/iterator/doc/facade-and-adaptor.html deleted file mode 100644 index 79d38a30a..000000000 --- a/libs/iterator/doc/facade-and-adaptor.html +++ /dev/null @@ -1,2716 +0,0 @@ - - - - - - -Iterator Facade and Adaptor - - - - - - - - - - diff --git a/libs/iterator/doc/facade-and-adaptor.pdf b/libs/iterator/doc/facade-and-adaptor.pdf deleted file mode 100644 index a77daa477a1f24f3893439ded973ea719d05442b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226024 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 z 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 diff --git a/libs/iterator/doc/facade-and-adaptor.rst b/libs/iterator/doc/facade-and-adaptor.rst deleted file mode 100644 index 6308de4c4..000000000 --- a/libs/iterator/doc/facade-and-adaptor.rst +++ /dev/null @@ -1,438 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -+++++++++++++++++++++++++++++ - Iterator Facade and Adaptor -+++++++++++++++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, `Zephyr Associates, Inc.`_ -:date: $Date$ - -:Number: This is a revised version of N1530_\ =03-0113, which was - accepted for Technical Report 1 by the C++ standard - committee's library working group. - -.. Version 1.9 of this ReStructuredText document corresponds to - n1530_, the paper accepted by the LWG. - -.. _n1530: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1530.html - -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Zephyr Associates, Inc.`: http://www.styleadvisor.com - -:abstract: We propose a set of class templates that help programmers - build standard-conforming iterators, both from scratch and - by adapting other iterators. - -.. contents:: Table of Contents - -============ - Motivation -============ - -Iterators play an important role in modern C++ programming. The -iterator is the central abstraction of the algorithms of the Standard -Library, allowing algorithms to be re-used in in a wide variety of -contexts. The C++ Standard Library contains a wide variety of useful -iterators. Every one of the standard containers comes with constant -and mutable iterators [#mutable]_, and also reverse versions of those -same iterators which traverse the container in the opposite direction. -The Standard also supplies ``istream_iterator`` and -``ostream_iterator`` for reading from and writing to streams, -``insert_iterator``, ``front_insert_iterator`` and -``back_insert_iterator`` for inserting elements into containers, and -``raw_storage_iterator`` for initializing raw memory [7]. - -Despite the many iterators supplied by the Standard Library, obvious -and useful iterators are missing, and creating new iterator types is -still a common task for C++ programmers. The literature documents -several of these, for example line_iterator [3] and Constant_iterator -[9]. The iterator abstraction is so powerful that we expect -programmers will always need to invent new iterator types. - -Although it is easy to create iterators that *almost* conform to the -standard, the iterator requirements contain subtleties which can make -creating an iterator which *actually* conforms quite difficult. -Further, the iterator interface is rich, containing many operators -that are technically redundant and tedious to implement. To automate -the repetitive work of constructing iterators, we propose -``iterator_facade``, an iterator base class template which provides -the rich interface of standard iterators and delegates its -implementation to member functions of the derived class. In addition -to reducing the amount of code necessary to create an iterator, the -``iterator_facade`` also provides compile-time error detection. -Iterator implementation mistakes that often go unnoticed are turned -into compile-time errors because the derived class implementation must -match the expectations of the ``iterator_facade``. - -A common pattern of iterator construction is the adaptation of one -iterator to form a new one. The functionality of an iterator is -composed of four orthogonal aspects: traversal, indirection, equality -comparison and distance measurement. Adapting an old iterator to -create a new one often saves work because one can reuse one aspect of -functionality while redefining the other. For example, the Standard -provides ``reverse_iterator``, which adapts any Bidirectional Iterator -by inverting its direction of traversal. As with plain iterators, -iterator adaptors defined outside the Standard have become commonplace -in the literature: - -* Checked iter[13] adds bounds-checking to an existing iterator. - -* The iterators of the View Template Library[14], which adapts - containers, are themselves adaptors over the underlying iterators. - -* Smart iterators [5] adapt an iterator's dereferencing behavior by - applying a function object to the object being referenced and - returning the result. - -* Custom iterators [4], in which a variety of adaptor types are enumerated. - -* Compound iterators [1], which access a slice out of a container of containers. - -* Several iterator adaptors from the MTL [12]. The MTL contains a - strided iterator, where each call to ``operator++()`` moves the - iterator ahead by some constant factor, and a scaled iterator, which - multiplies the dereferenced value by some constant. - -.. [#concept] We use the term concept to mean a set of requirements - that a type must satisfy to be used with a particular template - parameter. - -.. [#mutable] The term mutable iterator refers to iterators over objects that - can be changed by assigning to the dereferenced iterator, while - constant iterator refers to iterators over objects that cannot be - modified. - -To fulfill the need for constructing adaptors, we propose the -``iterator_adaptor`` class template. Instantiations of -``iterator_adaptor`` serve as a base classes for new iterators, -providing the default behavior of forwarding all operations to the -underlying iterator. The user can selectively replace these features -in the derived iterator class. This proposal also includes a number -of more specialized adaptors, such as the ``transform_iterator`` that -applies some user-specified function during the dereference of the -iterator. - -======================== - Impact on the Standard -======================== - -This proposal is purely an addition to the C++ standard library. -However, note that this proposal relies on the proposal for New -Iterator Concepts. - -======== - Design -======== - -Iterator Concepts -================= - -This proposal is formulated in terms of the new ``iterator concepts`` -as proposed in n1550_, since user-defined and especially adapted -iterators suffer from the well known categorization problems that are -inherent to the current iterator categories. - -.. _n1550: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm - -This proposal does not strictly depend on proposal n1550_, as there -is a direct mapping between new and old categories. This proposal -could be reformulated using this mapping if n1550_ was not accepted. - -Interoperability -================ - -The question of iterator interoperability is poorly addressed in the -current standard. There are currently two defect reports that are -concerned with interoperability issues. - -Issue 179_ concerns the fact that mutable container iterator types -are only required to be convertible to the corresponding constant -iterator types, but objects of these types are not required to -interoperate in comparison or subtraction expressions. This situation -is tedious in practice and out of line with the way built in types -work. This proposal implements the proposed resolution to issue -179_, as most standard library implementations do nowadays. In other -words, if an iterator type A has an implicit or user defined -conversion to an iterator type B, the iterator types are interoperable -and the usual set of operators are available. - -Issue 280_ concerns the current lack of interoperability between -reverse iterator types. The proposed new reverse_iterator template -fixes the issues raised in 280. It provides the desired -interoperability without introducing unwanted overloads. - -.. _179: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#179 -.. _280: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#280 - - -Iterator Facade -=============== - -.. include:: iterator_facade_body.rst - -Iterator Adaptor -================ - -.. include:: iterator_adaptor_body.rst - -Specialized Adaptors -==================== - -This proposal also contains several examples of specialized adaptors -which were easily implemented using ``iterator_adaptor``: - -* ``indirect_iterator``, which iterates over iterators, pointers, - or smart pointers and applies an extra level of dereferencing. - -* A new ``reverse_iterator``, which inverts the direction of a Base - iterator's motion, while allowing adapted constant and mutable - iterators to interact in the expected ways (unlike those in most - implementations of C++98). - -* ``transform_iterator``, which applies a user-defined function object - to the underlying values when dereferenced. - -* ``filter_iterator``, which provides a view of an iterator range in - which some elements of the underlying range are skipped. - -.. _counting: - -* ``counting_iterator``, which adapts any incrementable type - (e.g. integers, iterators) so that incrementing/decrementing the - adapted iterator and dereferencing it produces successive values of - the Base type. - -* ``function_output_iterator``, which makes it easier to create custom - output iterators. - -Based on examples in the Boost library, users have generated many new -adaptors, among them a permutation adaptor which applies some -permutation to a random access iterator, and a strided adaptor, which -adapts a random access iterator by multiplying its unit of motion by a -constant factor. In addition, the Boost Graph Library (BGL) uses -iterator adaptors to adapt other graph libraries, such as LEDA [10] -and Stanford GraphBase [8], to the BGL interface (which requires C++ -Standard compliant iterators). - -=============== - Proposed Text -=============== - - -Header ```` synopsis [lib.iterator.helper.synopsis] -======================================================================= - - -:: - - struct use_default; - - struct iterator_core_access { /* implementation detail */ }; - - template < - class Derived - , class Value - , class CategoryOrTraversal - , class Reference = Value& - , class Difference = ptrdiff_t - > - class iterator_facade; - - template < - class Derived - , class Base - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class iterator_adaptor; - - template < - class Iterator - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class indirect_iterator; - - template - struct pointee; - - template - struct indirect_reference; - - template - class reverse_iterator; - - template < - class UnaryFunction - , class Iterator - , class Reference = use_default - , class Value = use_default - > - class transform_iterator; - - template - class filter_iterator; - - template < - class Incrementable - , class CategoryOrTraversal = use_default - , class Difference = use_default - > - class counting_iterator; - - template - class function_output_iterator; - - - -Iterator facade [lib.iterator.facade] -===================================== - -.. include:: iterator_facade_abstract.rst - -Class template ``iterator_facade`` ----------------------------------- - -.. include:: iterator_facade_ref.rst - -Iterator adaptor [lib.iterator.adaptor] -======================================= - -.. include:: iterator_adaptor_abstract.rst - -Class template ``iterator_adaptor`` ------------------------------------ - -.. include:: iterator_adaptor_ref.rst - - -Specialized adaptors [lib.iterator.special.adaptors] -==================================================== - - -The ``enable_if_convertible::type`` expression used in -this section is for exposition purposes. The converting constructors -for specialized adaptors should be only be in an overload set provided -that an object of type ``X`` is implicitly convertible to an object of -type ``Y``. -The signatures involving ``enable_if_convertible`` should behave -*as-if* ``enable_if_convertible`` were defined to be:: - - template enable_if_convertible_impl - {}; - - template <> enable_if_convertible_impl - { struct type; }; - - template - struct enable_if_convertible - : enable_if_convertible_impl::value> - {}; - -If an expression other than the default argument is used to supply -the value of a function parameter whose type is written in terms -of ``enable_if_convertible``, the program is ill-formed, no -diagnostic required. - -[*Note:* The ``enable_if_convertible`` approach uses SFINAE to -take the constructor out of the overload set when the types are not -implicitly convertible. -] - - -Indirect iterator ------------------ - -.. include:: indirect_iterator_abstract.rst - -Class template ``pointee`` -.................................... - -.. include:: pointee_ref.rst - -Class template ``indirect_reference`` -..................................... - -.. include:: indirect_reference_ref.rst - -Class template ``indirect_iterator`` -.................................... - -.. include:: indirect_iterator_ref.rst - -Reverse iterator ----------------- - -.. include:: reverse_iterator_abstract.rst - -Class template ``reverse_iterator`` -................................... - -.. include:: reverse_iterator_ref.rst - - -Transform iterator ------------------- - -.. include:: transform_iterator_abstract.rst - -Class template ``transform_iterator`` -..................................... - -.. include:: transform_iterator_ref.rst - - -Filter iterator ---------------- - -.. include:: filter_iterator_abstract.rst - - -Class template ``filter_iterator`` -.................................. - -.. include:: filter_iterator_ref.rst - - -Counting iterator ------------------ - -.. include:: counting_iterator_abstract.rst - -Class template ``counting_iterator`` -.................................... - -.. include:: counting_iterator_ref.rst - - -Function output iterator ------------------------- - -.. include:: func_output_iter_abstract.rst - -Class template ``function_output_iterator`` -........................................... - -.. include:: func_output_iter_ref.rst - - - - -.. LocalWords: Abrahams Siek Witt istream ostream iter MTL strided interoperate - LocalWords: CRTP metafunctions inlining lvalue JGS incrementable BGL LEDA cv - LocalWords: GraphBase struct ptrdiff UnaryFunction const int typename bool pp - LocalWords: lhs rhs SFINAE markup iff tmp OtherDerived OtherIterator DWA foo - LocalWords: dereferenceable subobject AdaptableUnaryFunction impl pre ifdef'd - LocalWords: OtherIncrementable Coplien diff --git a/libs/iterator/doc/facade_iterator_category.rst b/libs/iterator/doc/facade_iterator_category.rst deleted file mode 100644 index 6b60d851e..000000000 --- a/libs/iterator/doc/facade_iterator_category.rst +++ /dev/null @@ -1,53 +0,0 @@ -.. |iterator-category| replace:: *iterator-category* -.. _iterator-category: - -.. parsed-literal:: - - *iterator-category*\ (C,R,V) := - if (C is convertible to std::input_iterator_tag - || C is convertible to std::output_iterator_tag - ) - return C - - else if (C is not convertible to incrementable_traversal_tag) - *the program is ill-formed* - - else return a type X satisfying the following two constraints: - - 1. X is convertible to X1, and not to any more-derived - type, where X1 is defined by: - - if (R is a reference type - && C is convertible to forward_traversal_tag) - { - if (C is convertible to random_access_traversal_tag) - X1 = random_access_iterator_tag - else if (C is convertible to bidirectional_traversal_tag) - X1 = bidirectional_iterator_tag - else - X1 = forward_iterator_tag - } - else - { - if (C is convertible to single_pass_traversal_tag - && R is convertible to V) - X1 = input_iterator_tag - else - X1 = C - } - - 2. |category-to-traversal|_\ (X) is convertible to the most - derived traversal tag type to which X is also - convertible, and not to any more-derived traversal tag - type. - -.. |category-to-traversal| replace:: *category-to-traversal* -.. _`category-to-traversal`: new-iter-concepts.html#category-to-traversal - -[Note: the intention is to allow ``iterator_category`` to be one of -the five original category tags when convertibility to one of the -traversal tags would add no information] - -.. Copyright David Abrahams 2004. 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/libs/iterator/doc/filter_iterator.html b/libs/iterator/doc/filter_iterator.html deleted file mode 100644 index bd574f00b..000000000 --- a/libs/iterator/doc/filter_iterator.html +++ /dev/null @@ -1,413 +0,0 @@ - - - - - - -Filter Iterator - - - - - - - - - - - diff --git a/libs/iterator/doc/filter_iterator.pdf b/libs/iterator/doc/filter_iterator.pdf deleted file mode 100644 index 1d8a804fdc30cb43fc63898603fc0f33cb134b9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69532 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 diff --git a/libs/iterator/doc/filter_iterator.rst b/libs/iterator/doc/filter_iterator.rst deleted file mode 100644 index cfa8642c8..000000000 --- a/libs/iterator/doc/filter_iterator.rst +++ /dev/null @@ -1,33 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -+++++++++++++++++ - Filter Iterator -+++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, University of Hanover `Institute for Transport - Railway Operation and Construction`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de - -:abstract: - - .. include:: filter_iterator_abstract.rst - -.. contents:: Table of Contents - -``filter_iterator`` synopsis -............................ - -.. include:: filter_iterator_ref.rst -.. include:: make_filter_iterator.rst - -.. include:: filter_iterator_eg.rst diff --git a/libs/iterator/doc/filter_iterator_abstract.rst b/libs/iterator/doc/filter_iterator_abstract.rst deleted file mode 100644 index 9524efabc..000000000 --- a/libs/iterator/doc/filter_iterator_abstract.rst +++ /dev/null @@ -1,15 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -The filter iterator adaptor creates a view of an iterator range in -which some elements of the range are skipped. A predicate function -object controls which elements are skipped. When the predicate is -applied to an element, if it returns ``true`` then the element is -retained and if it returns ``false`` then the element is skipped -over. When skipping over elements, it is necessary for the filter -adaptor to know when to stop so as to avoid going past the end of the -underlying range. A filter iterator is therefore constructed with pair -of iterators indicating the range of elements in the unfiltered -sequence to be traversed. - diff --git a/libs/iterator/doc/filter_iterator_eg.rst b/libs/iterator/doc/filter_iterator_eg.rst deleted file mode 100644 index dc2770e18..000000000 --- a/libs/iterator/doc/filter_iterator_eg.rst +++ /dev/null @@ -1,72 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Example -....... - -This example uses ``filter_iterator`` and then -``make_filter_iterator`` to output only the positive integers from an -array of integers. Then ``make_filter_iterator`` is is used to output -the integers greater than ``-2``. - -:: - - struct is_positive_number { - bool operator()(int x) { return 0 < x; } - }; - - int main() - { - int numbers_[] = { 0, -1, 4, -3, 5, 8, -2 }; - const int N = sizeof(numbers_)/sizeof(int); - - typedef int* base_iterator; - base_iterator numbers(numbers_); - - // Example using filter_iterator - typedef boost::filter_iterator - FilterIter; - - is_positive_number predicate; - FilterIter filter_iter_first(predicate, numbers, numbers + N); - FilterIter filter_iter_last(predicate, numbers + N, numbers + N); - - std::copy(filter_iter_first, filter_iter_last, std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - // Example using make_filter_iterator() - std::copy(boost::make_filter_iterator(numbers, numbers + N), - boost::make_filter_iterator(numbers + N, numbers + N), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - // Another example using make_filter_iterator() - std::copy( - boost::make_filter_iterator( - std::bind2nd(std::greater(), -2) - , numbers, numbers + N) - - , boost::make_filter_iterator( - std::bind2nd(std::greater(), -2) - , numbers + N, numbers + N) - - , std::ostream_iterator(std::cout, " ") - ); - - std::cout << std::endl; - - return boost::exit_success; - } - - -The output is:: - - 4 5 8 - 4 5 8 - 0 -1 4 5 8 - - -The source code for this example can be found `here`__. - -__ ../example/filter_iterator_example.cpp diff --git a/libs/iterator/doc/filter_iterator_ref.rst b/libs/iterator/doc/filter_iterator_ref.rst deleted file mode 100644 index 1759788c8..000000000 --- a/libs/iterator/doc/filter_iterator_ref.rst +++ /dev/null @@ -1,177 +0,0 @@ -.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt -.. 2004. 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) - -:: - - template - class filter_iterator - { - public: - typedef iterator_traits::value_type value_type; - typedef iterator_traits::reference reference; - typedef iterator_traits::pointer pointer; - typedef iterator_traits::difference_type difference_type; - typedef /* see below */ iterator_category; - - filter_iterator(); - filter_iterator(Predicate f, Iterator x, Iterator end = Iterator()); - filter_iterator(Iterator x, Iterator end = Iterator()); - template - filter_iterator( - filter_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition - ); - Predicate predicate() const; - Iterator end() const; - Iterator const& base() const; - reference operator*() const; - filter_iterator& operator++(); - private: - Predicate m_pred; // exposition only - Iterator m_iter; // exposition only - Iterator m_end; // exposition only - }; - - -If ``Iterator`` models Readable Lvalue Iterator and Bidirectional Traversal -Iterator then ``iterator_category`` is convertible to -``std::bidirectional_iterator_tag``. -Otherwise, if ``Iterator`` models Readable Lvalue Iterator and Forward Traversal -Iterator then ``iterator_category`` is convertible to -``std::forward_iterator_tag``. -Otherwise ``iterator_category`` is -convertible to ``std::input_iterator_tag``. - - -``filter_iterator`` requirements -................................ - -The ``Iterator`` argument shall meet the requirements of Readable -Iterator and Single Pass Iterator or it shall meet the requirements of -Input Iterator. - -The ``Predicate`` argument must be Assignable, Copy Constructible, and -the expression ``p(x)`` must be valid where ``p`` is an object of type -``Predicate``, ``x`` is an object of type -``iterator_traits::value_type``, and where the type of -``p(x)`` must be convertible to ``bool``. - - -``filter_iterator`` models -.......................... - -The concepts that ``filter_iterator`` models are dependent on which -concepts the ``Iterator`` argument models, as specified in the -following tables. - -+---------------------------------+------------------------------------------+ -|If ``Iterator`` models |then ``filter_iterator`` models | -+=================================+==========================================+ -|Single Pass Iterator |Single Pass Iterator | -+---------------------------------+------------------------------------------+ -|Forward Traversal Iterator |Forward Traversal Iterator | -+---------------------------------+------------------------------------------+ -|Bidirectional Traversal Iterator |Bidirectional Traversal Iterator | -+---------------------------------+------------------------------------------+ - -+--------------------------------+----------------------------------------------+ -| If ``Iterator`` models | then ``filter_iterator`` models | -+================================+==============================================+ -| Readable Iterator | Readable Iterator | -+--------------------------------+----------------------------------------------+ -| Writable Iterator | Writable Iterator | -+--------------------------------+----------------------------------------------+ -| Lvalue Iterator | Lvalue Iterator | -+--------------------------------+----------------------------------------------+ - -+-------------------------------------------------------+---------------------------------+ -|If ``Iterator`` models | then ``filter_iterator`` models | -+=======================================================+=================================+ -|Readable Iterator, Single Pass Iterator | Input Iterator | -+-------------------------------------------------------+---------------------------------+ -|Readable Lvalue Iterator, Forward Traversal Iterator | Forward Iterator | -+-------------------------------------------------------+---------------------------------+ -|Writable Lvalue Iterator, Forward Traversal Iterator | Mutable Forward Iterator | -+-------------------------------------------------------+---------------------------------+ -|Writable Lvalue Iterator, Bidirectional Iterator | Mutable Bidirectional Iterator | -+-------------------------------------------------------+---------------------------------+ - - -``filter_iterator`` is interoperable with ``filter_iterator`` -if and only if ``X`` is interoperable with ``Y``. - - -``filter_iterator`` operations -.............................. - -In addition to those operations required by the concepts that -``filter_iterator`` models, ``filter_iterator`` provides the following -operations. - - -``filter_iterator();`` - -:Requires: ``Predicate`` and ``Iterator`` must be Default Constructible. -:Effects: Constructs a ``filter_iterator`` whose``m_pred``, ``m_iter``, and ``m_end`` - members are a default constructed. - - -``filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());`` - -:Effects: Constructs a ``filter_iterator`` where ``m_iter`` is either - the first position in the range ``[x,end)`` such that ``f(*m_iter) == true`` - or else``m_iter == end``. The member ``m_pred`` is constructed from - ``f`` and ``m_end`` from ``end``. - - - -``filter_iterator(Iterator x, Iterator end = Iterator());`` - -:Requires: ``Predicate`` must be Default Constructible and - ``Predicate`` is a class type (not a function pointer). -:Effects: Constructs a ``filter_iterator`` where ``m_iter`` is either - the first position in the range ``[x,end)`` such that ``m_pred(*m_iter) == true`` - or else``m_iter == end``. The member ``m_pred`` is default constructed. - - -:: - - template - filter_iterator( - filter_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition - );`` - -:Requires: ``OtherIterator`` is implicitly convertible to ``Iterator``. -:Effects: Constructs a filter iterator whose members are copied from ``t``. - - -``Predicate predicate() const;`` - -:Returns: ``m_pred`` - - -``Iterator end() const;`` - -:Returns: ``m_end`` - - -``Iterator const& base() const;`` - -:Returns: ``m_iterator`` - - - -``reference operator*() const;`` - -:Returns: ``*m_iter`` - - -``filter_iterator& operator++();`` - -:Effects: Increments ``m_iter`` and then continues to - increment ``m_iter`` until either ``m_iter == m_end`` - or ``m_pred(*m_iter) == true``. -:Returns: ``*this`` diff --git a/libs/iterator/doc/func_output_iter_abstract.rst b/libs/iterator/doc/func_output_iter_abstract.rst deleted file mode 100644 index d4a700f5f..000000000 --- a/libs/iterator/doc/func_output_iter_abstract.rst +++ /dev/null @@ -1,12 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -The function output iterator adaptor makes it easier to create custom -output iterators. The adaptor takes a unary function and creates a -model of Output Iterator. Each item assigned to the output iterator is -passed as an argument to the unary function. The motivation for this -iterator is that creating a conforming output iterator is non-trivial, -particularly because the proper implementation usually requires a -proxy object. - diff --git a/libs/iterator/doc/func_output_iter_ref.rst b/libs/iterator/doc/func_output_iter_ref.rst deleted file mode 100644 index e00eab751..000000000 --- a/libs/iterator/doc/func_output_iter_ref.rst +++ /dev/null @@ -1,73 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Header -...... - -:: - - #include - -:: - - template - class function_output_iterator { - public: - typedef std::output_iterator_tag iterator_category; - typedef void value_type; - typedef void difference_type; - typedef void pointer; - typedef void reference; - - explicit function_output_iterator(); - - explicit function_output_iterator(const UnaryFunction& f); - - /* see below */ operator*(); - function_output_iterator& operator++(); - function_output_iterator& operator++(int); - private: - UnaryFunction m_f; // exposition only - }; - - - -``function_output_iterator`` requirements -......................................... - -``UnaryFunction`` must be Assignable and Copy Constructible. - - - -``function_output_iterator`` models -................................... - -``function_output_iterator`` is a model of the Writable and -Incrementable Iterator concepts. - - - -``function_output_iterator`` operations -....................................... - -``explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());`` - -:Effects: Constructs an instance of ``function_output_iterator`` - with ``m_f`` constructed from ``f``. - - -``operator*();`` - -:Returns: An object ``r`` of unspecified type such that ``r = t`` - is equivalent to ``m_f(t)`` for all ``t``. - - -``function_output_iterator& operator++();`` - -:Returns: ``*this`` - - -``function_output_iterator& operator++(int);`` - -:Returns: ``*this`` diff --git a/libs/iterator/doc/function_input_iterator.html b/libs/iterator/doc/function_input_iterator.html deleted file mode 100644 index e097a4671..000000000 --- a/libs/iterator/doc/function_input_iterator.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - -
- - --- - - - - - -
Author:Dean Michael Berris
License:Distributed under the Boost Software License, Version 1.0 -(See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
-
-

Function Input Iterator

-

The Function Input Iterator allows for creating iterators that encapsulate -a nullary function object and a state object which tracks the number of times -the iterator has been incremented. A Function Input Iterator models the -InputIterator concept and is useful for creating bounded input iterators.

-

Like the Generator Iterator, the Function Input Iterator takes a function -that models the Generator concept (which is basically a nullary or 0-arity -function object). Each increment of the function Function Input Iterator -invokes the generator function and stores the value in the iterator. When -the iterator is dereferenced the stored value is returned.

-

The Function Input Iterator encapsulates a state object which models the -Incrementable Concept and the EqualityComparable Concept. These concepts are -described below as:

-
-

Incrementable Concept

-

A type models the Incrementable Concept when it supports the pre- and post- -increment operators. For a given object i with type I, the following -constructs should be valid:

- ----- - - - - - - - - - - - - -
Construct Description Return Type
i++Post-increment i.I
++iPre-increment i.I&
-

NOTE: An Incrementable type should also be DefaultConstructible.

-
-
-

Synopsis

-
-namespace {
-    template <class Function, class State>
-    class function_input_iterator;
-
-    template <class Function, class State>
-    typename function_input_iterator<Function, State>
-    make_function_input_iterator(Function & f);
-
-    struct infinite;
-}
-
-
-
-

Function Input Iterator Class

-

The class Function Input Iterator class takes two template parameters -Function and State. These two template parameters tell the -Function Input Iterator the type of the function to encapsulate and -the type of the internal state value to hold.

-

The State parameter is important in cases where you want to -control the type of the counter which determines whether two iterators -are at the same state. This allows for creating a pair of iterators which -bound the range of the invocations of the encapsulated functions.

-
-
-

Examples

-

The following example shows how we use the function input iterator class -in cases where we want to create bounded (lazy) generated ranges.

-
-struct generator {
-    typedef int result_type;
-    generator() { srand(time(0)); }
-    result_type operator() () const {
-        return rand();
-    }
-};
-
-int main(int argc, char * argv[]) {
-    generator f;
-    copy(
-            make_function_input_iterator(f, 0),
-            make_function_input_iterator(f, 10),
-            ostream_iterator<int>(cout, " ")
-        );
-    return 0;
-}
-
-

Here we can see that we've bounded the number of invocations using an int -that counts from 0 to 10. Say we want to create an endless stream -of random numbers and encapsulate that in a pair of integers, we can do -it with the boost::infinite helper class.

-
-copy(
-        make_function_input_iterator(f,infinite()),
-        make_function_input_iterator(f,infinite()),
-        ostream_iterator<int>(count, " ")
-    );
-
-

Above, instead of creating a huge vector we rely on the STL copy algorithm -to traverse the function input iterator and call the function object f -as it increments the iterator. The special property of boost::infinite -is that equating two instances always yield false -- and that incrementing -an instance of boost::infinite doesn't do anything. This is an efficient -way of stating that the iterator range provided by two iterators with an -encapsulated infinite state will definitely be infinite.

-
-
-
- - - diff --git a/libs/iterator/doc/function_input_iterator.rst b/libs/iterator/doc/function_input_iterator.rst deleted file mode 100644 index a16b249c9..000000000 --- a/libs/iterator/doc/function_input_iterator.rst +++ /dev/null @@ -1,132 +0,0 @@ -:Author: - `Dean Michael Berris `_ - -:License: - Distributed under the Boost Software License, Version 1.0 - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -:Copyright: - Copyright 2012 Google, Inc. - -Function Input Iterator -======================= - -The Function Input Iterator allows for creating iterators that encapsulate -a nullary function object and a state object which tracks the number of times -the iterator has been incremented. A Function Input Iterator models the -`InputIterator`_ concept and is useful for creating bounded input iterators. - -.. _InputIterator: http://www.sgi.com/tech/stl/InputIterator.html - -The Function Input Iterator takes a function that models the Generator_ concept -(which is basically a nullary or 0-arity function object). The first dereference -of the iterator at a given position invokes the generator function and stores -and returns the result; subsequent dereferences at the same position simply -return the same stored result. Incrementing the iterator places it at a new -position, hence a subsequent dereference will generate a new value via another -invokation of the generator function. This ensures the generator function is -invoked precisely when the iterator is requested to return a (new) value. - -.. _Generator: http://www.sgi.com/tech/stl/Generator.html - -The Function Input Iterator encapsulates a state object which models the -`Incrementable Concept`_ and the EqualityComparable_ Concept. These concepts are -described below as: - -.. _EqualityComparable: http://www.sgi.com/tech/stl/EqualityComparable.html - -Incrementable Concept ---------------------- - -A type models the Incrementable Concept when it supports the pre- and post- -increment operators. For a given object ``i`` with type ``I``, the following -constructs should be valid: - -========= ================= =========== -Construct Description Return Type ------------------------------------------ -i++ Post-increment i. I -++i Pre-increment i. I& -========= ================= =========== - -NOTE: An Incrementable type should also be DefaultConstructible_. - -.. _DefaultConstructible: http://www.sgi.com/tech/stl/DefaultConstructible.html - -Synopsis --------- - -:: - - namespace { - template - class function_input_iterator; - - template - typename function_input_iterator - make_function_input_iterator(Function & f, State s); - - struct infinite; - } - -Function Input Iterator Class ------------------------------ - -The class Function Input Iterator class takes two template parameters -``Function`` and ``State``. These two template parameters tell the -Function Input Iterator the type of the function to encapsulate and -the type of the internal state value to hold. - -The ``State`` parameter is important in cases where you want to -control the type of the counter which determines whether two iterators -are at the same state. This allows for creating a pair of iterators which -bound the range of the invocations of the encapsulated functions. - -Examples --------- - -The following example shows how we use the function input iterator class -in cases where we want to create bounded (lazy) generated ranges. - -:: - - struct generator { - typedef int result_type; - generator() { srand(time(0)); } - result_type operator() () const { - return rand(); - } - }; - - int main(int argc, char * argv[]) { - generator f; - copy( - make_function_input_iterator(f, 0), - make_function_input_iterator(f, 10), - ostream_iterator(cout, " ") - ); - return 0; - } - -Here we can see that we've bounded the number of invocations using an ``int`` -that counts from ``0`` to ``10``. Say we want to create an endless stream -of random numbers and encapsulate that in a pair of integers, we can do -it with the ``boost::infinite`` helper class. - -:: - - copy( - make_function_input_iterator(f,infinite()), - make_function_input_iterator(f,infinite()), - ostream_iterator(cout, " ") - ); - -Above, instead of creating a huge vector we rely on the STL copy algorithm -to traverse the function input iterator and call the function object f -as it increments the iterator. The special property of ``boost::infinite`` -is that equating two instances always yield false -- and that incrementing -an instance of ``boost::infinite`` doesn't do anything. This is an efficient -way of stating that the iterator range provided by two iterators with an -encapsulated infinite state will definitely be infinite. - - diff --git a/libs/iterator/doc/function_output_iterator.html b/libs/iterator/doc/function_output_iterator.html deleted file mode 100644 index 1bae71b86..000000000 --- a/libs/iterator/doc/function_output_iterator.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - -Function Output Iterator - - - - - - - -
-

Function Output Iterator

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2006-09-11
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
- - - - --- - - - -
abstract: - - -The function output iterator adaptor makes it easier to create custom -output iterators. The adaptor takes a unary function and creates a -model of Output Iterator. Each item assigned to the output iterator is -passed as an argument to the unary function. The motivation for this -iterator is that creating a conforming output iterator is non-trivial, -particularly because the proper implementation usually requires a -proxy object.
- - - - - -
-

function_output_iterator requirements

-

UnaryFunction must be Assignable and Copy Constructible.

-
-
-

function_output_iterator models

-

function_output_iterator is a model of the Writable and -Incrementable Iterator concepts.

-
-
-

function_output_iterator operations

-

explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());

- --- - - - -
Effects:Constructs an instance of function_output_iterator -with m_f constructed from f.
-

operator*();

- --- - - - -
Returns:An object r of unspecified type such that r = t -is equivalent to m_f(t) for all t.
-

function_output_iterator& operator++();

- --- - - - -
Returns:*this
-

function_output_iterator& operator++(int);

- --- - - - -
Returns:*this
- - - -
-
-

Example

-
-struct string_appender
-{
-    string_appender(std::string& s)
-        : m_str(&s)
-    {}
-
-    void operator()(const std::string& x) const
-    {
-        *m_str += x;
-    }
-
-    std::string* m_str;
-};
-
-int main(int, char*[])
-{
-  std::vector<std::string> x;
-  x.push_back("hello");
-  x.push_back(" ");
-  x.push_back("world");
-  x.push_back("!");
-
-  std::string s = "";
-  std::copy(x.begin(), x.end(),
-            boost::make_function_output_iterator(string_appender(s)));
-
-  std::cout << s << std::endl;
-
-  return 0;
-}
-
-
-
- - - diff --git a/libs/iterator/doc/function_output_iterator.pdf b/libs/iterator/doc/function_output_iterator.pdf deleted file mode 100644 index cef2274c8785dcb935ad339b2da106d77024be0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57133 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 OAVB@*O<`FP%>M&YdnG~u diff --git a/libs/iterator/doc/function_output_iterator.rst b/libs/iterator/doc/function_output_iterator.rst deleted file mode 100644 index 8018af5a8..000000000 --- a/libs/iterator/doc/function_output_iterator.rst +++ /dev/null @@ -1,28 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -++++++++++++++++++++++++++ - Function Output Iterator -++++++++++++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, University of Hanover `Institute for Transport - Railway Operation and Construction`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de - -:abstract: - - .. include:: func_output_iter_abstract.rst - -.. contents:: Table of Contents - -.. include:: func_output_iter_ref.rst -.. include:: function_output_iterator_eg.rst \ No newline at end of file diff --git a/libs/iterator/doc/function_output_iterator_eg.rst b/libs/iterator/doc/function_output_iterator_eg.rst deleted file mode 100644 index ab09f2dd3..000000000 --- a/libs/iterator/doc/function_output_iterator_eg.rst +++ /dev/null @@ -1,39 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Example -....... - -:: - - struct string_appender - { - string_appender(std::string& s) - : m_str(&s) - {} - - void operator()(const std::string& x) const - { - *m_str += x; - } - - std::string* m_str; - }; - - int main(int, char*[]) - { - std::vector x; - x.push_back("hello"); - x.push_back(" "); - x.push_back("world"); - x.push_back("!"); - - std::string s = ""; - std::copy(x.begin(), x.end(), - boost::make_function_output_iterator(string_appender(s))); - - std::cout << s << std::endl; - - return 0; - } diff --git a/libs/iterator/doc/generate.py b/libs/iterator/doc/generate.py deleted file mode 100644 index f5d0de807..000000000 --- a/libs/iterator/doc/generate.py +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/python -# Copyright David Abrahams 2004. 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) - -# -# Generate html, TeX, and PDF versions of all the source files -# -import os -import sys - -from syscmd import syscmd -from sources import sources - -if 0: - for s in sources: - syscmd('boosthtml %s' % s) -else: - extensions = ('html', 'pdf') - - if len(sys.argv) > 1: - extensions = sys.argv[1:] - - all = [ '%s.%s' % (os.path.splitext(s)[0],ext) - for ext in extensions - for s in sources - ] - - print 'make %s' % ' '.join(all) - syscmd('make %s' % ' '.join(all)) - - diff --git a/libs/iterator/doc/generator_iterator.htm b/libs/iterator/doc/generator_iterator.htm deleted file mode 100644 index b0e376ebe..000000000 --- a/libs/iterator/doc/generator_iterator.htm +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - - Generator Iterator Adaptor Documentation - - - - boost.png (6897 bytes) - -

Generator Iterator Adaptor

- -

Defined in header boost/generator_iterator.hpp

- -

The generator iterator adaptor makes it easier to create custom input - iterators from 0-ary functions and function objects. The adaptor takes a - Generator and - creates a model of Input Iterator. Each - increment retrieves an item from the generator and makes it available to be - retrieved by dereferencing. The motivation for this iterator is that some - concepts can be more naturally expressed as a generator, while most STL - algorithms expect an iterator. An example is the Random Number library.

- -

Synopsis

- -
-
-namespace boost {
-  template <class Generator>
-  class generator_iterator_policies;
-
-  template <class Generator>
-  class generator_iterator_generator;
-
-  template <class Generator>
-  typename generator_iterator_generator<Generator>::type
-  make_generator_iterator(Generator & gen);
-}
-
-
-
- -

The Generator Iterator Generator Class

- -

The class generator_iterator_generator is a helper class whose purpose - is to construct a generator iterator type. The template parameter for this - class is the Generator function object type that is being wrapped. The - generator iterator adaptor only holds a reference (or pointer) to the - function object, therefore the function object must outlive the generator - iterator adaptor constructed from it.

-
-template <class Generator>
-class generator_iterator_generator
-{
-public:
-  typedef unspecified type; // the resulting generator iterator type 
-}
-
- -

Template Parameters

- - - - - - - - - - - - - -
ParameterDescription
GeneratorThe generator (0-ary function object) type being wrapped. The - return type of the function must be defined as - Generator::result_type. The function object must be a model of - Generator.
- -

Concept Model

- -

The generator iterator class is a model of Input Iterator.

- -

Members

- -

The generator iterator implements the member functions and operators - required of the Input Iterator - concept.

-
- -

The - Generator Iterator Object Generator

- -

The make_generator_iterator() function provides a convenient - way to create generator iterator objects. The function saves the user the - trouble of explicitly writing out the iterator types.

- -
-
-template <class Generator>
-typename generator_iterator_generator<Generator>::type
-make_generator_iterator(Generator & gen);
-
-
-
- -

Example

- -

The following program shows how generator_iterator - transforms a generator into an input iterator.

- -
-
-#include <iostream>
-#include <boost/generator_iterator.hpp>
-
-class my_generator
-{
-public:
-  typedef int result_type;
-  my_generator() : state(0) { }
-  int operator()() { return ++state; }
-private:
-  int state;
-};
-
-int main()
-{
-  my_generator gen;
-  boost::generator_iterator_generator<my_generator>::type it = boost::make_generator_iterator(gen);
-  for(int i = 0; i < 10; ++i, ++it)
-    std::cout << *it << std::endl;
-}
-
-
-
- -

Valid HTML 4.01 Transitional

- -

Revised - 05 December, 2006

- -

Copyright © 2001 Jens Maurer

- -

Distributed under the 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/libs/iterator/doc/html/index.html b/libs/iterator/doc/html/index.html deleted file mode 100644 index e487f8633..000000000 --- a/libs/iterator/doc/html/index.html +++ /dev/null @@ -1,296 +0,0 @@ - - - -Chapter 1. Boost.Iterator - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
Next
-
-
-

-Chapter 1. Boost.Iterator

-

-David Abrahams -

-

-Jeremy Siek -

-

-Thomas Witt -

-
-
-

- Distributed under the Boost Software License, Version 1.0. (See accompanying - file LICENSE_1_0.txt or copy at <ulink url="http://www.boost.org/LICENSE_1_0.txt"> - http://www.boost.org/LICENSE_1_0.txt </ulink>) -

-
-
- -
- -

- The Boost Iterator Library contains two parts. The first is a system of concepts - which extend the C++ standard iterator requirements. The second is a framework - of components for building iterators based on these extended concepts and includes - several useful iterator adaptors. The extended iterator concepts have been - carefully designed so that old-style iterators can fit in the new concepts - and so that new-style iterators will be compatible with old-style algorithms, - though algorithms may need to be updated if they want to take full advantage - of the new-style iterator capabilities. Several components of this library - have been accepted into the C++ standard technical report. The components of - the Boost Iterator Library replace the older Boost Iterator Adaptor Library. -

-

- - New-Style - Iterators -

-

- The iterator categories defined in C++98 are extremely limiting because they - bind together two orthogonal concepts: traversal and element access. For example, - because a random access iterator is required to return a reference (and not - a proxy) when dereferenced, it is impossible to capture the capabilities of - vector<bool>::iterator - using the C++98 categories. This is the infamous "vector<bool> - is not a container, and its iterators aren't random access iterators", - debacle about which Herb Sutter wrote two papers for the standards comittee - (N1185 and - N1211), and - a Guru of the Week. New-style - iterators go well beyond patching up vector<bool>, - though: there are lots of other iterators already in use which can't be adequately - represented by the existing concepts. For details about the new iterator concepts, - see our Standard Proposal for New-Style - Iterators. -

-

- - Iterator - Facade and Adaptor -

-

- Writing standard-conforming iterators is tricky, but the need comes up often. - In order to ease the implementation of new iterators, the Boost.Iterator library - provides the facade class template, - which implements many useful defaults and compile-time checks designed to help - the iterator author ensure that his iterator is correct. -

-

- It is also common to define a new iterator that is similar to some underlying - iterator or iterator-like type, but that modifies some aspect of the underlying - type's behavior. For that purpose, the library supplies the adaptor - class template, which is specially designed to take advantage of as much of - the underlying type's behavior as possible. -

-

- Both facade and adaptor - as well as many of the specialized - adaptors_ mentioned below have been - proposed for standardization (Standard - Proposal For Iterator Facade and Adaptor). -

-

- - Specialized - Adaptors -

-

- The iterator library supplies a useful suite of standard-conforming iterator - templates based on the Boost iterator - facade and adaptor templates. -

-
    -
  • - counting_iterator: - an iterator over a sequence of consecutive values. Implements a "lazy - sequence" -
  • -
  • - filter_iterator: - an iterator over the subset of elements of some sequence which satisfy - a given predicate -
  • -
  • - function_output_iterator: - an output iterator wrapping a unary function object; each time an element - is written into the dereferenced iterator, it is passed as a parameter - to the function object. -
  • -
  • - indirect_iterator: - an iterator over the objects pointed-to - by the elements of some sequence. -
  • -
  • - permutation_iterator: - an iterator over the elements of some random-access sequence, rearranged - according to some sequence of integer indices. -
  • -
  • -

    - reverse_iterator: - an iterator which traverses the elements of some bidirectional sequence - in reverse. Corrects many of the shortcomings of C++98's -

    -
    std::reverse_iterator
    -

    - . -

    -
  • -
  • - shared_container_iterator: - an iterator over elements of a container whose lifetime is maintained by - a shared_ptr - stored in the iterator. -
  • -
  • -

    - transform_iterator: - an iterator over elements which are the result of applying some functional - transformation to the elements of an underlying sequence. This component - also replaces the old -

    -
    projection_iterator_adaptor
    -

    - . -

    -
  • -
  • - zip_iterator: - an iterator over tuples of the elements at corresponding positions of heterogeneous - underlying iterators. -
  • -
-

- - Iterator - Utilities -

-

- - Traits -

-
    -
  • - pointee.hpp: - Provides the capability to deduce the referent types of pointers, smart - pointers and iterators in generic code. Used in indirect_iterator. -
  • -
  • - iterator_traits.hpp: - Provides MPL - compatible metafunctions which retrieve an iterator's traits. Also corrects - for the deficiencies of broken implementations of std::iterator_traits. -
  • -
-

- [* |interoperable|_ (PDF__): Provides an MPL compatible metafunction for testing iterator - interoperability ] -

-

- - Testing - and Concept Checking -

-
-
-
- - - -

Last revised: December 22, 2016 at 12:43:11 GMT

-
-
Next
- - diff --git a/libs/iterator/doc/html/iterator/concepts.html b/libs/iterator/doc/html/iterator/concepts.html deleted file mode 100644 index da6d10b00..000000000 --- a/libs/iterator/doc/html/iterator/concepts.html +++ /dev/null @@ -1,336 +0,0 @@ - - - -Iterator Concepts - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
-

-Access -

-

- - Readable - Iterator Concept -

-

- A class or built-in type X - models the Readable Iterator concept for - value type T if, in addition - to X being Assignable and - Copy Constructible, the following expressions are valid and respect the stated - semantics. U is the type - of any specified member of type T. -

-
-

Table 1.1. Readable Iterator Requirements (in addition to Assignable and Copy - Constructible)

-
----- - - - - - - - - - - - - - - - - - - - - - - -
-

- Expression -

-
-

- Return Type -

-
-

- Note/Precondition -

-
-

- iterator_traits<X>::value_type -

-
-

- T -

-
-

- Any non-reference, non cv-qualified type -

-
-

- *a -

-
-

- Convertible to T -

-
-

- pre: a is dereferenceable. - If a == - b then *a - is equivalent to *b. -

-
-

- a->m -

-
-

- U& -

-
-

- pre: (*a).m - is well-defined. Equivalent to (*a).m. -

-
-
-

- - Writable - Iterator Concept -

-

- A class or built-in type X - models the Writable Iterator concept if, - in addition to X being Copy - Constructible, the following expressions are valid and respect the stated - semantics. Writable Iterators have an associated set - of value types. -

-
-

Table 1.2. Writable Iterator Requirements (in addition to Copy Constructible)

-
----- - - - - - - - - - - -
-

- Expression -

-
-

- Return Type -

-
-

- Precondition -

-
-

- *a - = o -

-
- -

- pre: The type of o - is in the set of value types of X -

-
-
-

- - Swappable - Iterator Concept -

-

- A class or built-in type X - models the Swappable Iterator concept if, - in addition to X being Copy - Constructible, the following expressions are valid and respect the stated - semantics. -

-
-

Table 1.3. Swappable Iterator Requirements (in addition to Copy Constructible)

-
----- - - - - - - - - - - -
-

- Expression -

-
-

- Return Type -

-
-

- Postcondition -

-
-

- iter_swap(a, - b) -

-
-

- void -

-
-

- the pointed to values are exchanged -

-
-
-
-

- - Lvalue - Iterator Concept -

-

- The Lvalue Iterator concept adds the requirement - that the return type of operator* type be a reference to the value type of - the iterator. -

-
-

Table 1.4. Lvalue Iterator Requirements

-
----- - - - - - - - - - - -
-

- Expression -

-
-

- Return Type -

-
-

- Note/Assertion -

-
-

- *a -

-
-

- T& -

-
-

- T is cv iterator_traits<X>::value_type - where cv is an optional cv-qualification. - pre: a is dereferenceable. - If a == - b then *a - is equivalent to *b. -

-
-
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/concepts/concepts_traversal.html b/libs/iterator/doc/html/iterator/concepts/concepts_traversal.html deleted file mode 100644 index 096c81126..000000000 --- a/libs/iterator/doc/html/iterator/concepts/concepts_traversal.html +++ /dev/null @@ -1,798 +0,0 @@ - - - -Traversal - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- - Incrementable - Iterator Concept -

-

- A class or built-in type X - models the Incrementable Iterator concept - if, in addition to X being - Assignable and Copy Constructible, the following expressions are valid and - respect the stated semantics. -

-
-

Table 1.5. Incrementable Iterator Requirements (in addition to Assignable, Copy - Constructible)

-
----- - - - - - - - - - - - - - - - - - - - - - - -
-

- Expression -

-
-

- Return Type -

-
-

- Assertion/Semantics -

-
-

- ++r -

-
-

- X& -

-
-

- &r - == &++r -

-
-

- r++ -

-
-

- X -

-
-
{
-  X tmp = r;
-  ++r;
-  return tmp;
-}
-
-
-

- iterator_traversal<X>::type -

-
-

- Convertible to incrementable_traversal_tag -

-
-
-
-

- - Single - Pass Iterator Concept -

-

- A class or built-in type X - models the Single Pass Iterator concept - if the following expressions are valid and respect the stated semantics. -

-
-

Table 1.6. Single Pass Iterator Requirements (in addition to Incrementable Iterator - and Equality Comparable)

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Expression -

-
-

- Return Type -

-
-

- Assertion/Semantics / Pre-/Post-condition -

-
-

- ++r -

-
-

- X& -

-
-

- pre:
r is - dereferenceable;
post:
r - is dereferenceable or
r - is past-the-end -

-
-

- a == - b -

-
-

- convertible to bool -

-
-

- == is an equivalence - relation over its domain -

-
-

- a != - b -

-
-

- convertible to bool -

-
-

- !(a - == b) -

-
-

- iterator_traversal<X>::type -

-
-

- Convertible tosingle_pass_traversal_tag -

-
-
-
-

- - Forward - Traversal Concept -

-

- A class or built-in type X - models the Forward Traversal concept if, - in addition to X meeting - the requirements of Default Constructible and Single Pass Iterator, the following - expressions are valid and respect the stated semantics. -

-
-

Table 1.7. Forward Traversal Iterator Requirements (in addition to Default Constructible - and Single Pass Iterator)

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Expression -

-
-

- Return Type -

-
-

- Assertion/Note -

-
-

- X u; -

-
-

- X& -

-
-

- note: u may have - a singular value. -

-
-

- ++r -

-
-

- X& -

-
-

- r == - s and r - is dereferenceable implies ++r == - ++s. -

-
-

- iterator_traits<X>::difference_type -

-
-

- A signed integral type representing the distance between iterators -

-
-
-

- iterator_traversal<X>::type -

-
-

- Convertible to forward_traversal_tag -

-
-
-
-

- - Bidirectional - Traversal Concept -

-

- A class or built-in type X - models the Bidirectional Traversal concept - if, in addition to X meeting - the requirements of Forward Traversal Iterator, the following expressions - are valid and respect the stated semantics. -

-
-

Table 1.8. Bidirectional Traversal Iterator Requirements (in addition to Forward - Traversal Iterator)

-
----- - - - - - - - - - - - - - - - - - - - - - - -
-

- Expression -

-
-

- Return Type -

-
-

- Assertion/Semantics/Pre-/Post-condition -

-
-

- --r -

-
-

- X& -

-
-

- pre: there exists s - such that r == - ++s.
- post: s is dereferenceable. - --(++r) == r. --r == - --s - implies r == - s. &r == - &--r. -

-
-

- r-- -

-
-

- convertible to const X& -

-
-
{
-  X tmp = r;
-  --r;
-  return tmp;
-}
-
-
-

- iterator_traversal<X>::type -

-
-

- Convertible to bidirectional_traversal_tag -

-
-
-
-

- - Random - Access Traversal Concept -

-

- A class or built-in type X - models the Random Access Traversal concept - if the following expressions are valid and respect the stated semantics. - In the table below, Distance - is iterator_traits<X>::difference_type and n - represents a constant object of type Distance. -

-
-

Table 1.9. Random Access Traversal Iterator Requirements (in addition to Bidirectional - Traversal)

-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Expression -

-
-

- Return Type -

-
-

- Operational Semantics -

-
-

- Assertion/Precondition -

-
-

- r += - n -

-
-

- X& -

-
-
{
-  Distance m = n;
-  if (m >= 0)
-    while (m--)
-      ++r;
-  else
-    while (m++)
-      --r;
-  return r;
-}
-
-
-
-

- a + - n, n - + a -

-
-

- X -

-
-
{
-  X tmp = a;
-  return tmp+= n;
-}
-
-
-
-

- r -= - n -

-
-

- X& -

-
-

- return r - += -n -

-
-
-

- a - - n -

-
-

- X -

-
-
{
-  X tmp = a;
-  return tmp-= n;
-}
-
-
-
-

- b - - a -

-
-

- Distance -

-
-

- a < - b ? - distance(a,b) - : -distance(b,a) -

-
-

- pre: there exists a value n - of Distance such - that a + - n == - b. b - == a - + (b - - a). -

-
-

- a\[n\] -

-
-

- convertible to T -

-
-

- *(a - + n) -

-
-

- pre: a is a Readable Iterator -

-
-

- a\[n\] - = v -

-
-

- convertible to T -

-
-

- *(a - + n) = v -

-
-

- pre: a is a Writable iterator -

-
-

- a < - b -

-
-

- convertible to bool -

-
-

- b - - a > - 0 -

-
-

- < is a total ordering - relation -

-
-

- a > - b -

-
-

- convertible to bool -

-
-

- b < - a -

-
-

- > is a total ordering - relation -

-
-

- a >= - b -

-
-

- convertible to bool -

-
-

- !(a - < b) -

-
-
-

- a <= - b -

-
-

- convertible to bool -

-
-

- !(a - > b) -

-
-
-

- iterator_traversal<X>::type -

-
-

- convertible to random_access_traversal_tag -

-
- -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/generic.html b/libs/iterator/doc/html/iterator/generic.html deleted file mode 100644 index 585a538a4..000000000 --- a/libs/iterator/doc/html/iterator/generic.html +++ /dev/null @@ -1,1546 +0,0 @@ - - - -Generic Iterators - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
- - -

- While the iterator interface is rich, there is a core subset of the interface - that is necessary for all the functionality. We have identified the following - core behaviors for iterators: -

-
    -
  • - dereferencing -
  • -
  • - incrementing -
  • -
  • - decrementing -
  • -
  • - equality comparison -
  • -
  • - random-access motion -
  • -
  • - distance measurement -
  • -
-

- In addition to the behaviors listed above, the core interface elements include - the associated types exposed through iterator traits: value_type, - reference, difference_type, and iterator_category. -

-

- Iterator facade uses the Curiously Recurring Template Pattern (CRTP) [Cop95]_ - so that the user can specify the behavior of iterator_facade - in a derived class. Former designs used policy objects to specify the behavior, - but that approach was discarded for several reasons: -

-

- 1. the creation and eventual copying of the policy object may create overhead - that can be avoided with the current approach. -

-

- 2. The policy object approach does not allow for custom constructors on the - created iterator types, an essential feature if iterator_facade - should be used in other library implementations. -

-

- 3. Without the use of CRTP, the standard requirement that an iterator's - operator++ - returns the iterator type itself would mean that all iterators built with - the library would have to be specializations of iterator_facade<...>, rather than something more descriptive - like indirect_iterator<T*>. - Cumbersome type generator metafunctions would be needed to build new parameterized - iterators, and a separate iterator_adaptor - layer would be impossible. -

-

- - Usage -

-

- The user of iterator_facade - derives his iterator class from a specialization of iterator_facade - and passes the derived iterator class as iterator_facade's - first template parameter. The order of the other template parameters have - been carefully chosen to take advantage of useful defaults. For example, - when defining a constant lvalue iterator, the user can pass a const-qualified - version of the iterator's value_type - as iterator_facade's Value parameter and omit the Reference parameter which follows. -

-

- The derived iterator class must define member functions implementing the - iterator's core behaviors. The following table describes expressions which - are required to be valid depending on the category of the derived iterator - type. These member functions are described briefly below and in more detail - in the iterator facade requirements. -

-
-

Table 1.10. Core Interface

-
---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Expression -

-
-

- Effects -

-
-

- i.dereference() -

-
-

- Access the value referred to -

-
-

- i.equal(j) -

-
-

- Compare for equality with j -

-
-

- i.increment() -

-
-

- Advance by one position -

-
-

- i.decrement() -

-
-

- Retreat by one position -

-
-

- i.advance(n) -

-
-

- Advance by n positions -

-
-

- i.distance_to(j) -

-
-

- Measure the distance to j -

-
-
-

- In addition to implementing the core interface functions, an iterator derived - from iterator_facade typically - defines several constructors. To model any of the standard iterator concepts, - the iterator must at least have a copy constructor. Also, if the iterator - type X is meant to be automatically - interoperate with another iterator type Y - (as with constant and mutable iterators) then there must be an implicit conversion - from X to Y - or from Y to X (but not both), typically implemented - as a conversion constructor. Finally, if the iterator is to model Forward - Traversal Iterator or a more-refined iterator concept, a default constructor - is required. -

-

- - Iterator - Core Access -

-

- iterator_facade and the operator - implementations need to be able to access the core member functions in the - derived class. Making the core member functions public would expose an implementation - detail to the user. The design used here ensures that implementation details - do not appear in the public interface of the derived iterator type. -

-

- Preventing direct access to the core member functions has two advantages. - First, there is no possibility for the user to accidently use a member function - of the iterator when a member of the value_type was intended. This has been - an issue with smart pointer implementations in the past. The second and main - advantage is that library implementers can freely exchange a hand-rolled - iterator implementation for one based on iterator_facade - without fear of breaking code that was accessing the public core member functions - directly. -

-

- In a naive implementation, keeping the derived class' core member functions - private would require it to grant friendship to iterator_facade - and each of the seven operators. In order to reduce the burden of limiting - access, iterator_core_access - is provided, a class that acts as a gateway to the core member functions - in the derived iterator class. The author of the derived class only needs - to grant friendship to iterator_core_access - to make his core member functions available to the library. -

-

- iterator_core_access will - be typically implemented as an empty class containing only private static - member functions which invoke the iterator core member functions. There is, - however, no need to standardize the gateway protocol. Note that even if - iterator_core_access used - public member functions it would not open a safety loophole, as every core - member function preserves the invariants of the iterator. -

-

- - operator\[\] -

-

- The indexing operator for a generalized iterator presents special challenges. - A random access iterator's operator[] is only required to return something convertible - to its value_type. Requiring - that it return an lvalue would rule out currently-legal random-access iterators - which hold the referenced value in a data member (e.g. |counting|_), because - *(p+n) - is a reference into the temporary iterator p+n, which - is destroyed when operator[] - returns. -

-

- .. |counting| replace:: counting_iterator -

-

- Writable iterators built with iterator_facade - implement the semantics required by the preferred resolution to issue 299_ - and adopted by proposal n1550_: the result of p[n] - is an object convertible to the iterator's value_type, - and p[n] = - x is equivalent to *(p + - n) = x (Note: - This result object may be implemented as a proxy containing a copy of p+n). - This approach will work properly for any random-access iterator regardless - of the other details of its implementation. A user who knows more about the - implementation of her iterator is free to implement an operator[] that returns an lvalue in the derived iterator - class; it will hide the one supplied by iterator_facade - from clients of her iterator. -

-

- .. _n1550: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm -

-

- .. _issue 299: - http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299 -

-

- .. _operator arrow: -

-

- - operator-> -

-

- The reference type of a readable - iterator (and today's input iterator) need not in fact be a reference, so - long as it is convertible to the iterator's value_type. - When the value_type is a - class, however, it must still be possible to access members through operator->. - Therefore, an iterator whose reference - type is not in fact a reference must return a proxy containing a copy of - the referenced value from its operator->. -

-

- The return types for iterator_facade's - operator-> - and operator[] - are not explicitly specified. Instead, those types are described in terms - of a set of requirements, which must be satisfied by the iterator_facade - implementation. -

-

- .. [Cop95] [Coplien, 1995] Coplien, J., Curiously Recurring Template Patterns, - C++ Report, February 1995, pp. 24-27. -

-
- -
template <
-    class Derived
-  , class Value
-  , class CategoryOrTraversal
-  , class Reference  = Value&
-  , class Difference = ptrdiff_t
->
-class iterator_facade {
- public:
-    typedef remove_const<Value>::type value_type;
-    typedef Reference reference;
-    typedef Value\* pointer;
-    typedef Difference difference_type;
-    typedef /* see below__ \*/ iterator_category;
-
-    reference operator\*() const;
-    /* see below__ \*/ operator->() const;
-    /* see below__ \*/ operator[](difference_type n) const;
-    Derived& operator++();
-    Derived operator++(int);
-    Derived& operator--();
-    Derived operator--(int);
-    Derived& operator+=(difference_type n);
-    Derived& operator-=(difference_type n);
-    Derived operator-(difference_type n) const;
- protected:
-    typedef iterator_facade iterator_facade\_;
-};
-
-// Comparison operators
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type // exposition
-operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-// Iterator difference
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-/* see below__ \*/
-operator-(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-          iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-// Iterator addition
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
-                   typename Derived::difference_type n);
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (typename Derived::difference_type n,
-                   iterator_facade<Dr,V,TC,R,D> const&);
-
-

- __ iterator category_ -

-

- __ operator arrow_ -

-

- __ brackets_ -

-

- __ minus_ -

-

- .. _iterator category: -

-

- The iterator_category member - of iterator_facade is -

-

- .. parsed-literal:: -

-
*iterator-category*\ (CategoryOrTraversal, value_type, reference)
-
-

- where iterator-category is defined as - follows: -

-

- .. include:: facade_iterator_category.rst -

-

- The enable_if_interoperable - template used above is for exposition purposes. The member operators should - only be in an overload set provided the derived types Dr1 - and Dr2 are interoperable, - meaning that at least one of the types is convertible to the other. The - enable_if_interoperable - approach uses SFINAE to take the operators out of the overload set when - the types are not interoperable. The operators should behave as-if enable_if_interoperable - were defined to be: -

-
template <bool, typename> enable_if_interoperable_impl
-{};
-
-template <typename T> enable_if_interoperable_impl<true,T>
-{ typedef T type; };
-
-template<typename Dr1, typename Dr2, typename T>
-struct enable_if_interoperable
-  : enable_if_interoperable_impl<
-        is_convertible<Dr1,Dr2>::value || is_convertible<Dr2,Dr1>::value
-      , T
-    >
-{};
-
-

- - Requirements -

-

- The following table describes the typical valid expressions on iterator_facade's Derived - parameter, depending on the iterator concept(s) it will model. The operations - in the first column must be made accessible to member functions of class - iterator_core_access. In - addition, static_cast<Derived*>(iterator_facade*) - shall be well-formed. -

-

- In the table below, F is - iterator_facade<X,V,C,R,D>, a - is an object of type X, - b and c - are objects of type const X, n - is an object of F::difference_type, y - is a constant object of a single pass iterator type interoperable with - X, and z - is a constant object of a random access traversal iterator type interoperable - with X. -

-

- .. _core operations: -

-

- .. topic:: iterator_facade - Core Operations -

-
-

Table 1.11. Core Operations

-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Expression -

-
-

- Return Type -

-
-

- Assertion/Note -

-
-

- Used to implement Iterator Concept(s) -

-
-

- c.dereference() -

-
-

- F::reference -

-
- -

- Readable Iterator, Writable Iterator -

-
-

- c.equal(y) -

-
-

- convertible to bool -

-
-

- true iff c and - y refer to the - same position -

-
-

- Single Pass Iterator -

-
-

- a.increment() -

-
-

- unused -

-
- -

- Incrementable Iterator -

-
-

- a.decrement() -

-
-

- unused -

-
- -

- Bidirectional Traversal Iterator -

-
-

- a.advance(n) -

-
-

- unused -

-
- -

- Random Access Traversal Iterator -

-
-

- c.distance_to(z) -

-
-

- convertible to F::difference_type -

-
-

- equivalent to distance(c, X(z)). -

-
-

- Random Access Traversal Iterator -

-
-
-

- - Operations -

-

- The operations in this section are described in terms of operations on - the core interface of Derived - which may be inaccessible (i.e. private). The implementation should access - these operations through member functions of class iterator_core_access. -

-
reference operator*() const;
-
-

- Returns: static_cast<Derived - const*>(this)->dereference() -

-
operator->() const; (see below__)
-
-

- __ operator arrow_ -

-

- Returns: If reference - is a reference type, an object of type pointer - equal to: &static_cast<Derived - const*>(this)->dereference() - Otherwise returns an object of unspecified type such that, (*static_cast<Derived - const*>(this))->m is equivalent to (w = **static_cast<Derived - const*>(this), w.m) for some temporary object w of type value_type. -

-

- .. _brackets: -

-
*unspecified* operator[](difference_type n) const;
-
-

- Returns: an object convertible to value_type. For constant objects v of type value_type, - and n of type difference_type, (*this)[n] = v - is equivalent to *(*this - + n) = v, - and static_cast<value_type const&>((*this)[n]) - is equivalent to static_cast<value_type - const&>(*(*this + n)) -

-
Derived& operator++();
-
-

- Effects: -

-
  static_cast<Derived*>(this)->increment();
-  return *static_cast<Derived*>(this);
-
-Derived operator++(int);
-
-

- Effects: -

-
  Derived tmp(static_cast<Derived const*>(this));
-  ++*this;
-  return tmp;
-
-Derived& operator--();
-
-

- Effects: -

-
    static_cast<Derived*>(this)->decrement();
-    return *static_cast<Derived*>(this);
-
-Derived operator--(int);
-
-

- Effects: -

-
  Derived tmp(static_cast<Derived const*>(this));
-  --*this;
-  return tmp;
-
-
-Derived& operator+=(difference_type n);
-
-

- Effects: -

-
    static_cast<Derived*>(this)->advance(n);
-    return *static_cast<Derived*>(this);
-
-
-Derived& operator-=(difference_type n);
-
-

- Effects: -

-
    static_cast<Derived*>(this)->advance(-n);
-    return *static_cast<Derived*>(this);
-
-
-Derived operator-(difference_type n) const;
-
-

- Effects: -

-
  Derived tmp(static_cast<Derived const*>(this));
-  return tmp -= n;
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
-                   typename Derived::difference_type n);
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (typename Derived::difference_type n,
-                   iterator_facade<Dr,V,TC,R,D> const&);
-
-

- Effects: -

-
  Derived tmp(static_cast<Derived const*>(this));
-  return tmp += n;
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-

- Returns: -

-
  if is_convertible<Dr2,Dr1>::value
-
-  then
-    ((Dr1 const&)lhs).equal((Dr2 const&)rhs).
-
-  Otherwise,
-    ((Dr2 const&)rhs).equal((Dr1 const&)lhs).
-
-
template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-

- Returns: -

-
  if is_convertible<Dr2,Dr1>::value
-
-  then
-    !((Dr1 const&)lhs).equal((Dr2 const&)rhs).
-
-  Otherwise,
-    !((Dr2 const&)rhs).equal((Dr1 const&)lhs).
-
-
template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-

- Returns: -

-
  if is_convertible<Dr2,Dr1>::value
-
-  then
-    ((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) < 0.
-
-  Otherwise,
-    ((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0.
-
-
template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-

- Returns: -

-
  if is_convertible<Dr2,Dr1>::value
-
-  then
-    ((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) <= 0.
-
-  Otherwise,
-    ((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0.
-
-
template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-

- Returns: -

-
  if is_convertible<Dr2,Dr1>::value
-
-  then
-    ((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) > 0.
-
-  Otherwise,
-    ((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0.
-
-
template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-

- Returns: -

-
  if is_convertible<Dr2,Dr1>::value
-
-  then
-    ((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) >= 0.
-
-  Otherwise,
-    ((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0.
-
-

- .. _minus: -

-
template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,difference>::type
-operator -(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-

- Return Type: -

-
  if is_convertible<Dr2,Dr1>::value
-
-   then
-    difference shall be
-    iterator_traits<Dr1>::difference_type.
-
-   Otherwise
-    difference shall be iterator_traits<Dr2>::difference_type
-
-

- Returns: -

-
  if is_convertible<Dr2,Dr1>::value
-
-  then
-    -((Dr1 const&)lhs).distance_to((Dr2 const&)rhs).
-
-  Otherwise,
-    ((Dr2 const&)rhs).distance_to((Dr1 const&)lhs).
-
-
-
- -

- In this section we'll walk through the implementation of a few iterators - using iterator_facade, - based around the simple example of a linked list of polymorphic objects. - This example was inspired by a posting by Keith Macdonald on - the Boost-Users mailing list. -

-

- - The Problem -

-

- Say we've written a polymorphic linked list node base class: -

-
# include <iostream>
-
-struct node_base
-{
-    node_base() : m_next(0) {}
-
-    // Each node manages all of its tail nodes
-    virtual ~node_base() { delete m_next; }
-
-    // Access the rest of the list
-    node_base* next() const { return m_next; }
-
-    // print to the stream
-    virtual void print(std::ostream& s) const = 0;
-
-    // double the value
-    virtual void double_me() = 0;
-
-    void append(node_base* p)
-    {
-        if (m_next)
-            m_next->append(p);
-        else
-            m_next = p;
-    }
-
- private:
-    node_base* m_next;
-};
-
-

- Lists can hold objects of different types by linking together specializations - of the following template: -

-
template <class T>
-struct node : node_base
-{
-    node(T x)
-      : m_value(x)
-    {}
-
-    void print(std::ostream& s) const { s << this->m_value; }
-    void double_me() { m_value += m_value; }
-
- private:
-    T m_value;
-};
-
-

- And we can print any node using the following streaming operator: -

-
inline std::ostream& operator<<(std::ostream& s, node_base const& n)
-{
-    n.print(s);
-    return s;
-}
-
-

- Our first challenge is to build an appropriate iterator over these lists. -

-

- - A - Basic Iterator Using iterator_facade -

-

- We will construct a node_iterator - class using inheritance from iterator_facade - to implement most of the iterator's operations. -

-
# include "node.hpp"
-# include <boost/iterator/iterator_facade.hpp>
-
-class node_iterator
-  : public boost::iterator_facade<...>
-{
-   ...
-};
-
-

- - Template - Arguments for iterator_facade -

-

- iterator_facade has several - template parameters, so we must decide what types to use for the arguments. - The parameters are Derived, - Value, CategoryOrTraversal, - Reference, and Difference. -

-

- - Derived -

-

- Because iterator_facade - is meant to be used with the CRTP [Cop95]_ the first parameter is the iterator - class name itself, node_iterator. -

-

- - Value -

-

- The Value parameter determines - the node_iterator's value_type. In this case, we are iterating - over node_base objects, - so Value will be node_base. -

-

- - CategoryOrTraversal -

-

- Now we have to determine which iterator - traversal concept_ - our node_iterator is going - to model. Singly-linked lists only have forward links, so our iterator - can't can't be a bidirectional - traversal iterator_. - Our iterator should be able to make multiple passes over the same linked - list (unlike, say, an istream_iterator - which consumes the stream it traverses), so it must be a forward traversal - iterator_. Therefore, we'll pass - boost::forward_traversal_tag in this position - _. -

-

- .. iterator_facade - also supports old-style category tags, so we could have passed std::forward_iterator_tag here; either way, - the resulting iterator's iterator_category - will end up being std::forward_iterator_tag. -

-

- - Reference -

-

- The Reference argument - becomes the type returned by node_iterator's - dereference operation, and will also be the same as std::iterator_traits<node_iterator>::reference. - The library's default for this parameter is Value&; since node_base& is a good choice for the iterator's - reference type, we can - omit this argument, or pass use_default. -

-

- - Difference -

-

- The Difference argument - determines how the distance between two node_iterators - will be measured and will also be the same as std::iterator_traits<node_iterator>::difference_type. - The library's default for Difference - is std::ptrdiff_t, an appropriate type for measuring - the distance between any two addresses in memory, and one that works for - almost any iterator, so we can omit this argument, too. -

-

- The declaration of node_iterator - will therefore look something like: -

-
# include "node.hpp"
-# include <boost/iterator/iterator_facade.hpp>
-
-class node_iterator
-  : public boost::iterator_facade<
-        node_iterator
-      , node_base
-      , boost::forward_traversal_tag
-    >
-{
-   ...
-};
-
-

- - Constructors - and Data Members -

-

- Next we need to decide how to represent the iterator's position. This representation - will take the form of data members, so we'll also need to write constructors - to initialize them. The node_iterator's - position is quite naturally represented using a pointer to a node_base. We'll need a constructor to - build an iterator from a node_base*, and a default constructor to satisfy - the forward traversal - iterator_ requirements _. Our node_iterator - then becomes: -

-
# include "node.hpp"
-# include <boost/iterator/iterator_facade.hpp>
-
-class node_iterator
-  : public boost::iterator_facade<
-        node_iterator
-      , node_base
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    node_iterator()
-      : m_node(0)
-    {}
-
-    explicit node_iterator(node_base* p)
-      : m_node(p)
-    {}
-
- private:
-    ...
-    node_base* m_node;
-};
-
-

- .. Technically, the C++ standard places almost no - requirements on a default-constructed iterator, so if we were really concerned - with efficiency, we could've written the default constructor to leave - m_node uninitialized. -

-

- - Implementing - the Core Operations -

-

- The last step is to implement the core - operations_ required by the concepts - we want our iterator to model. Referring to the table__, we can see that - the first three rows are applicable because node_iterator - needs to satisfy the requirements for readable - iterator_, single - pass iterator_, - and incrementable iterator_. -

-

- __ core operations_ -

-

- We therefore need to supply dereference, - equal, and increment members. We don't want these - members to become part of node_iterator's - public interface, so we can make them private and grant friendship to - boost::iterator_core_access, a "back-door" - that iterator_facade uses - to get access to the core operations: -

-
# include "node.hpp"
-# include <boost/iterator/iterator_facade.hpp>
-
-class node_iterator
-  : public boost::iterator_facade<
-        node_iterator
-      , node_base
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    node_iterator()
-      : m_node(0) {}
-
-    explicit node_iterator(node_base* p)
-      : m_node(p) {}
-
- private:
-    friend class boost::iterator_core_access;
-
-    void increment() { m_node = m_node->next(); }
-
-    bool equal(node_iterator const& other) const
-    {
-        return this->m_node == other.m_node;
-    }
-
-    node_base& dereference() const { return *m_node; }
-
-    node_base* m_node;
-};
-
-

- Voila; a complete and conforming readable, forward-traversal iterator! - For a working example of its use, see this program. -

-

- __ ../example/node_iterator1.cpp -

-

- - A - constant node_iterator -

- -

- Now, our node_iterator - gives clients access to both node\ - 's print(std::ostream&) - const member function, but also - its mutating double_me() member. If we wanted to build a constant node_iterator, - we'd only have to make three changes: -

-
class const_node_iterator
-  : public boost::iterator_facade<
-        node_iterator
-      , node_base **const**
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    const_node_iterator()
-      : m_node(0) {}
-
-    explicit const_node_iterator(node_base* p)
-      : m_node(p) {}
-
- private:
-    friend class boost::iterator_core_access;
-
-    void increment() { m_node = m_node->next(); }
-
-    bool equal(const_node_iterator const& other) const
-    {
-        return this->m_node == other.m_node;
-    }
-
-    node_base **const**\ & dereference() const { return \*m_node; }
-
-    node_base **const**\ * m_node;
-};
-
- -

- As a matter of fact, node_iterator - and const_node_iterator - are so similar that it makes sense to factor the common code out into a - template as follows: -

-
template <class Value>
-class node_iter
-  : public boost::iterator_facade<
-        node_iter<Value>
-      , Value
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    node_iter()
-      : m_node(0) {}
-
-    explicit node_iter(Value* p)
-      : m_node(p) {}
-
- private:
-    friend class boost::iterator_core_access;
-
-    bool equal(node_iter<Value> const& other) const
-    {
-        return this->m_node == other.m_node;
-    }
-
-    void increment()
-    { m_node = m_node->next(); }
-
-    Value& dereference() const
-    { return *m_node; }
-
-    Value* m_node;
-};
-typedef node_iter<node_base> node_iterator;
-typedef node_iter<node_base const> node_const_iterator;
-
-

- - Interoperability -

-

- Our const_node_iterator - works perfectly well on its own, but taken together with node_iterator it doesn't quite meet expectations. - For example, we'd like to be able to pass a node_iterator - where a node_const_iterator - was expected, just as you can with std::list<int>'s iterator - and const_iterator. Furthermore, - given a node_iterator and - a node_const_iterator into - the same list, we should be able to compare them for equality. -

-

- This expected ability to use two different iterator types together is known - as |interoperability|_. Achieving interoperability in our case is as simple - as templatizing the equal - function and adding a templatized converting constructor _ - _: -

-
template <class Value>
-class node_iter
-  : public boost::iterator_facade<
-        node_iter<Value>
-      , Value
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    node_iter()
-      : m_node(0) {}
-
-    explicit node_iter(Value* p)
-      : m_node(p) {}
-
-    template <class OtherValue>
-    node_iter(node_iter<OtherValue> const& other)
-      : m_node(other.m_node) {}
-
- private:
-    friend class boost::iterator_core_access;
-    template <class> friend class node_iter;
-
-    template <class OtherValue>
-    bool equal(node_iter<OtherValue> const& other) const
-    {
-        return this->m_node == other.m_node;
-    }
-
-    void increment()
-    { m_node = m_node->next(); }
-
-    Value& dereference() const
-    { return *m_node; }
-
-    Value* m_node;
-};
-typedef impl::node_iterator<node_base> node_iterator;
-typedef impl::node_iterator<node_base const> node_const_iterator;
-
-

- .. |interoperability| replace:: **interoperability** .. _interoperability: - new-iter-concepts.html#interoperable-iterators-lib-interoperable-iterators -

-

- .. If you're using an older compiler and it can't - handle this example, see the example - code__ for workarounds. -

-

- .. If node_iterator - had been a random access - traversal iterator_, - we'd have had to templatize its distance_to - function as well. -

-

- __ ../example/node_iterator2.hpp -

-

- You can see an example program which exercises our interoperable iterators - here. -

-

- - Telling - the Truth -

-

- Now node_iterator and - node_const_iterator behave - exactly as you'd expect... almost. We can compare them and we can convert - in one direction: from node_iterator - to node_const_iterator. - If we try to convert from node_const_iterator - to node_iterator, we'll - get an error when the converting constructor tries to initialize node_iterator's m_node, - a node* - with a node const*. So what's the problem? -

-

- The problem is that boost::|is_convertible|_<node_const_iterator,node_iterator>::value will be true, - but it should be false. |is_convertible|_ - lies because it can only see as far as the declaration - of node_iter's converting - constructor, but can't look inside at the definition - to make sure it will compile. A perfect solution would make node_iter's converting constructor disappear - when the m_node conversion - would fail. -

-

- .. |is_convertible| replace:: is_convertible - .. _is_convertible: ../../type_traits/index.html#relationships -

-

- In fact, that sort of magic is possible using |enable_if|__. By rewriting - the converting constructor as follows, we can remove it from the overload - set when it's not appropriate: -

-
#include <boost/type_traits/is_convertible.hpp>
-#include <boost/utility/enable_if.hpp>
-
-  ...
-
-private:
-  struct enabler {};
-
-public:
-  template <class OtherValue>
-  node_iter(
-      node_iter<OtherValue> const& other
-    , typename boost::enable_if<
-          boost::is_convertible<OtherValue*,Value*>
-        , enabler
-      >::type = enabler()
-  )
-    : m_node(other.m_node) {}
-
-

- .. |enable_if| replace:: boost::enable_if - __ ../../utility/enable_if.html -

-

- - Wrap - Up -

-

- This concludes our iterator_facade - tutorial, but before you stop reading we urge you to take a look at |iterator_adaptor|__. - There's another way to approach writing these iterators which might even - be superior. -

-

- .. |iterator_adaptor| replace:: iterator_adaptor - __ iterator_adaptor.html -

-

- .. _iterator traversal - concept: new-iter-concepts.html#iterator-traversal-concepts-lib-iterator-traversal - .. _readable iterator: - new-iter-concepts.html#readable-iterators-lib-readable-iterators .. _lvalue iterator: - new-iter-concepts.html#lvalue-iterators-lib-lvalue-iterators .. _single pass - iterator: new-iter-concepts.html#single-pass-iterators-lib-single-pass-iterators - .. _incrementable iterator: - new-iter-concepts.html#incrementable-iterators-lib-incrementable-iterators - .. _forward traversal - iterator: new-iter-concepts.html#forward-traversal-iterators-lib-forward-traversal-iterators - .. _bidirectional traversal - iterator: new-iter-concepts.html#bidirectional-traversal-iterators-lib-bidirectional-traversal-iterators - .. _random access - traversal iterator: - new-iter-concepts.html#random-access-traversal-iterators-lib-random-access-traversal-iterators -

-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/generic/adaptor.html b/libs/iterator/doc/html/iterator/generic/adaptor.html deleted file mode 100644 index 5ddd19489..000000000 --- a/libs/iterator/doc/html/iterator/generic/adaptor.html +++ /dev/null @@ -1,278 +0,0 @@ - - - -Iterator Adaptor - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -

- The iterator_adaptor class - template adapts some Base - _ type to create a new iterator. Instantiations of iterator_adaptor are derived from a corresponding - instantiation of iterator_facade - and implement the core behaviors in terms of the Base - type. In essence, iterator_adaptor - merely forwards all operations to an instance of the Base - type, which it stores as a member. -

-

- .. The term "Base" here does not refer to a - base class and is not meant to imply the use of derivation. We have followed - the lead of the standard library, which provides a base() function to access - the underlying iterator object of a reverse_iterator - adaptor. -

-

- The user of iterator_adaptor - creates a class derived from an instantiation of iterator_adaptor - and then selectively redefines some of the core member functions described - in the iterator_facade core - requirements table. The Base - type need not meet the full requirements for an iterator; it need only support - the operations used by the core interface functions of iterator_adaptor - that have not been redefined in the user's derived class. -

-

- Several of the template parameters of iterator_adaptor - default to use_default. This - allows the user to make use of a default parameter even when she wants to - specify a parameter later in the parameter list. Also, the defaults for the - corresponding associated types are somewhat complicated, so metaprogramming - is required to compute them, and use_default - can help to simplify the implementation. Finally, the identity of the use_default type is not left unspecified - because specification helps to highlight that the Reference - template parameter may not always be identical to the iterator's reference type, and will keep users from - making mistakes based on that assumption. -

-
- -

- - Synopsis -

-
template <
-    class Derived
-  , class Base
-  , class Value               = use_default
-  , class CategoryOrTraversal = use_default
-  , class Reference           = use_default
-  , class Difference = use_default
->
-class iterator_adaptor
-  : public iterator_facade<Derived, *V'*, *C'*, *R'*, *D'*> // see details
-{
-    friend class iterator_core_access;
- public:
-    iterator_adaptor();
-    explicit iterator_adaptor(Base const& iter);
-    typedef Base base_type;
-    Base const& base() const;
- protected:
-    typedef iterator_adaptor iterator_adaptor\_;
-    Base const& base_reference() const;
-    Base& base_reference();
- private: // Core iterator interface for iterator_facade.  
-    typename iterator_adaptor::reference dereference() const;
-
-    template <
-    class OtherDerived, class OtherIterator, class V, class C, class R, class D
-    >
-    bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
-
-    void advance(typename iterator_adaptor::difference_type n);
-    void increment();
-    void decrement();
-
-    template <
-        class OtherDerived, class OtherIterator, class V, class C, class R, class D
-    >
-    typename iterator_adaptor::difference_type distance_to(
-        iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
-
- private:
-    Base m_iterator; // exposition only
-};
-
-

- __ base_parameters_ -

-

- .. _requirements: -

-

- - Requirements -

-

- static_cast<Derived*>(iterator_adaptor*) - shall be well-formed. The Base - argument shall be Assignable and Copy Constructible. -

-

- .. _base_parameters: -

-

- - Base - Class Parameters -

-

- The V', C', - R', and D' - parameters of the iterator_facade - used as a base class in the summary of iterator_adaptor - above are defined as follows: -

-
   V' = if (Value is use_default)
-             return iterator_traits<Base>::value_type
-         else
-             return Value
-
-   C' = if (CategoryOrTraversal is use_default)
-             return iterator_traversal<Base>::type
-         else
-             return CategoryOrTraversal
-
-   R' = if (Reference is use_default)
-             if (Value is use_default)
-                 return iterator_traits<Base>::reference
-             else
-                 return Value&
-         else
-             return Reference
-
-   D' = if (Difference is use_default)
-             return iterator_traits<Base>::difference_type
-         else
-             return Difference
-
-

- - Operations -

-

- - Public -

-
iterator_adaptor();
-
-

- Requires: The Base - type must be Default Constructible.
Returns: - An instance of iterator_adaptor - with m_iterator default - constructed. -

-
explicit iterator_adaptor(Base const& iter);
-
-

- Returns: An instance of iterator_adaptor with m_iterator - copy constructed from iter. -

-
Base const& base() const;
-
-

- Returns: m_iterator -

-

- - Protected -

-
Base const& base_reference() const;
-
-

- Returns: A const reference to m_iterator. -

-
Base& base_reference();
-
-

- Returns: A non-const reference to m_iterator. -

-

- - Private -

-
typename iterator_adaptor::reference dereference() const;
-
-

- Returns: *m_iterator -

-
template <
-class OtherDerived, class OtherIterator, class V, class C, class R, class D
->
-bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
-
-

- Returns: m_iterator - == x.base() -

-
void advance(typename iterator_adaptor::difference_type n);
-
-

- Effects: m_iterator - += n; -

-
void increment();
-
-

- Effects: ++m_iterator; -

-
void decrement();
-
-

- Effects: --m_iterator; -

-
template <
-    class OtherDerived, class OtherIterator, class V, class C, class R, class D
->
-typename iterator_adaptor::difference_type distance_to(
-    iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
-
-

- Returns: y.base() - m_iterator -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/generic/adaptor/adaptor_tutorial.html b/libs/iterator/doc/html/iterator/generic/adaptor/adaptor_tutorial.html deleted file mode 100644 index 0a6628eeb..000000000 --- a/libs/iterator/doc/html/iterator/generic/adaptor/adaptor_tutorial.html +++ /dev/null @@ -1,198 +0,0 @@ - - - -Tutorial - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- In this section we'll further refine the node_iter - class template we developed in the |fac_tut|_. If you haven't already read - that material, you should go back now and check it out because we're going - to pick up right where it left off. -

-

- .. |fac_tut| replace:: iterator_facade - tutorial .. _fac_tut: iterator_facade.html#tutorial-example -

- -

- You probably didn't think of it this way, but the node_base* object that underlies node_iterator - is itself an iterator, just like all other pointers. If we examine that - pointer closely from an iterator perspective, we can see that it has much - in common with the node_iterator - we're building. First, they share most of the same associated types (value_type, reference, - pointer, and difference_type). Second, even some of - the core functionality is the same: operator* and operator== on the node_iterator - return the result of invoking the same operations on the underlying pointer, - via the node_iterator's - |dereference_and_equal|_). The only real behavioral difference between - node_base* - and node_iterator can be - observed when they are incremented: node_iterator - follows the m_next pointer, - while node_base* - just applies an address offset. -

-

- .. |dereference_and_equal| replace:: dereference - and equal member functions - .. _dereference_and_equal: iterator_facade.html#implementing-the-core-operations -

-

- It turns out that the pattern of building an iterator on another iterator-like - type (the Base _ type) while modifying just a few aspects of the underlying - type's behavior is an extremely common one, and it's the pattern addressed - by iterator_adaptor. Using - iterator_adaptor is very - much like using iterator_facade, - but because iterator_adaptor tries to mimic as much of the Base type's behavior as possible, we - neither have to supply a Value - argument, nor implement any core behaviors other than increment. - The implementation of node_iter - is thus reduced to: -

-
template <class Value>
-class node_iter
-  : public boost::iterator_adaptor<
-        node_iter<Value>                // Derived
-      , Value*                          // Base
-      , boost::use_default              // Value
-      , boost::forward_traversal_tag    // CategoryOrTraversal
-    >
-{
- private:
-    struct enabler {};  // a private type avoids misuse
-
- public:
-    node_iter()
-      : node_iter::iterator_adaptor_(0) {}
-
-    explicit node_iter(Value* p)
-      : node_iter::iterator_adaptor_(p) {}
-
-    template <class OtherValue>
-    node_iter(
-        node_iter<OtherValue> const& other
-      , typename boost::enable_if<
-            boost::is_convertible<OtherValue*,Value*>
-          , enabler
-        >::type = enabler()
-    )
-      : node_iter::iterator_adaptor_(other.base()) {}
-
- private:
-    friend class boost::iterator_core_access;
-    void increment() { this->base_reference() = this->base()->next(); }
-};
-
-

- Note the use of node_iter::iterator_adaptor_ - here: because iterator_adaptor - defines a nested iterator_adaptor_ - type that refers to itself, that gives us a convenient way to refer to - the complicated base class type of node_iter<Value>. [Note: this technique is known not - to work with Borland C++ 5.6.4 and Metrowerks CodeWarrior versions prior - to 9.0] -

-

- You can see an example program that exercises this version of the node - iterators here. -

-

- In the case of node_iter, - it's not very compelling to pass boost::use_default - as iterator_adaptor 's - Value argument; we could - have just passed node_iter - 's Value along to iterator_adaptor, and that'd even be - shorter! Most iterator class templates built with iterator_adaptor - are parameterized on another iterator type, rather than on its value_type. For example, boost::reverse_iterator takes an iterator type - argument and reverses its direction of traversal, since the original iterator - and the reversed one have all the same associated types, iterator_adaptor 's delegation of default - types to its Base saves - the implementor of boost::reverse_iterator - from writing: -

-
std::iterator_traits<Iterator>::*some-associated-type*
-
-

- at least four times. -

-

- We urge you to review the documentation and implementations of |reverse_iterator|_ - and the other Boost specialized - iterator adaptors__ - to get an idea of the sorts of things you can do with iterator_adaptor. - In particular, have a look at |transform_iterator|, - which is perhaps the most straightforward adaptor, and also |counting_iterator|, - which demonstrates that iterator_adaptor's - Base type needn't be an - iterator. -

-

- .. |reverse_iterator| replace:: reverse_iterator - .. _reverse_iterator: reverse_iterator.html -

-

- .. |counting_iterator| replace:: counting_iterator - .. _counting_iterator: counting_iterator.html -

-

- .. |transform_iterator| replace:: transform_iterator - .. _transform_iterator: transform_iterator.html -

-

- __ index.html#specialized-adaptors -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/history.html b/libs/iterator/doc/html/iterator/history.html deleted file mode 100644 index 1ea24d4e4..000000000 --- a/libs/iterator/doc/html/iterator/history.html +++ /dev/null @@ -1,74 +0,0 @@ - - - -History - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHome -
-
- -

- In 2000 Dave Abrahams was writing an iterator for a container of pointers, - which would access the pointed-to elements when dereferenced. Naturally, being - a library writer, he decided to generalize the idea and the Boost Iterator - Adaptor library was born. Dave was inspired by some writings of Andrei Alexandrescu - and chose a policy based design (though he probably didn't capture Andrei's - idea very well - there was only one policy class for all the iterator's orthogonal - properties). Soon Jeremy Siek realized he would need the library and they worked - together to produce a "Boostified" version, which was reviewed and - accepted into the library. They wrote a paper and made several important revisions - of the code. -

-

- Eventually, several shortcomings of the older library began to make the need - for a rewrite apparent. Dave and Jeremy started working at the Santa Cruz C++ - committee meeting in 2002, and had quickly generated a working prototype. At - the urging of Mat Marcus, they decided to use the GenVoca/CRTP pattern approach, - and moved the policies into the iterator class itself. Thomas Witt expressed - interest and became the voice of strict compile-time checking for the project, - adding uses of the SFINAE technique to eliminate false converting constructors - and operators from the overload set. He also recognized the need for a separate - iterator_facade, and factored - it out of iterator_adaptor. - Finally, after a near-complete rewrite of the prototype, they came up with - the library you see today. -

-

- [Coplien, 1995] Coplien, J., Curiously Recurring Template Patterns, C++ Report, - February 1995, pp. 24-27. -

-
- - - -
-
-
-PrevUpHome -
- - diff --git a/libs/iterator/doc/html/iterator/specialized.html b/libs/iterator/doc/html/iterator/specialized.html deleted file mode 100644 index 353ef3c74..000000000 --- a/libs/iterator/doc/html/iterator/specialized.html +++ /dev/null @@ -1,287 +0,0 @@ - - - -Specialized Adaptors - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
- -

- A counting_iterator adapts - an object by adding an operator* that returns the current value of the object. - All other iterator operations are forwarded to the adapted object. -

-

- - Example -

-

- This example fills an array with numbers and a second array with pointers - into the first array, using counting_iterator - for both tasks. Finally indirect_iterator - is used to print out the numbers into the first array via indirection through - the second array. -

-
int N = 7;
-std::vector<int> numbers;
-typedef std::vector<int>::iterator n_iter;
-std::copy(boost::counting_iterator<int>(0),
-         boost::counting_iterator<int>(N),
-         std::back_inserter(numbers));
-
-std::vector<std::vector<int>::iterator> pointers;
-std::copy(boost::make_counting_iterator(numbers.begin()),
-      boost::make_counting_iterator(numbers.end()),
-      std::back_inserter(pointers));
-
-std::cout << "indirectly printing out the numbers from 0 to "
-      << N << std::endl;
-std::copy(boost::make_indirect_iterator(pointers.begin()),
-      boost::make_indirect_iterator(pointers.end()),
-      std::ostream_iterator<int>(std::cout, " "));
-std::cout << std::endl;
-
-

- The output is: -

-
indirectly printing out the numbers from 0 to 7
-0 1 2 3 4 5 6
-
-

- The source code for this example can be found here. -

-

- - Reference -

-

- - Synopsis -

-
template <
-    class Incrementable
-  , class CategoryOrTraversal = use_default
-  , class Difference = use_default
->
-class counting_iterator
-{
-public:
-    typedef Incrementable value_type;
-    typedef const Incrementable& reference;
-    typedef const Incrementable* pointer;
-    typedef /* see below */ difference_type;
-    typedef /* see below */ iterator_category;
-
-    counting_iterator();
-    counting_iterator(counting_iterator const& rhs);
-    explicit counting_iterator(Incrementable x);
-    Incrementable const& base() const;
-    reference operator*() const;
-    counting_iterator& operator++();
-    counting_iterator& operator--();
-private:
-    Incrementable m_inc; // exposition
-};
-
-

- If the Difference argument - is use_default then difference_type is an unspecified signed - integral type. Otherwise difference_type - is Difference. -

-

- iterator_category is determined - according to the following algorithm: -

-
if (CategoryOrTraversal is not use_default)
-    return CategoryOrTraversal
-else if (numeric_limits<Incrementable>::is_specialized)
-    return |iterator-category|_\ (
-        random_access_traversal_tag, Incrementable, const Incrementable&)
-else
-    return |iterator-category|_\ (
-         iterator_traversal<Incrementable>::type,
-         Incrementable, const Incrementable&)
-
- -

- - Requirements -

-

- The Incrementable argument - shall be Copy Constructible and Assignable. -

-

- If iterator_category is convertible - to forward_iterator_tag or - forward_traversal_tag, the - following must be well-formed: -

-
Incrementable i, j;
-++i;         // pre-increment
-i == j;      // operator equal
-
-

- If iterator_category is convertible - to bidirectional_iterator_tag - or bidirectional_traversal_tag, - the following expression must also be well-formed: -

-
--i
-
-

- If iterator_category is convertible - to random_access_iterator_tag - or random_access_traversal_tag, - the following must must also be valid: -

-
counting_iterator::difference_type n;
-i += n;
-n = i - j;
-i < j;
-
-

- - Concepts -

-

- Specializations of counting_iterator - model Readable Lvalue Iterator. In addition, they model the concepts corresponding - to the iterator tags to which their iterator_category - is convertible. Also, if CategoryOrTraversal - is not use_default then - counting_iterator models - the concept corresponding to the iterator tag CategoryOrTraversal. - Otherwise, if numeric_limits<Incrementable>::is_specialized, - then counting_iterator models - Random Access Traversal Iterator. Otherwise, counting_iterator - models the same iterator traversal concepts modeled by Incrementable. -

-

- counting_iterator<X,C1,D1> - is interoperable with counting_iterator<Y,C2,D2> if and only if X - is interoperable with Y. -

-

- - Operations -

-

- In addition to the operations required by the concepts modeled by counting_iterator, counting_iterator - provides the following operations. -

-
counting_iterator();
-
-

- Requires: Incrementable - is Default Constructible.
Effects: - Default construct the member m_inc. -

-
counting_iterator(counting_iterator const& rhs);
-
-

- Effects: Construct member m_inc from rhs.m_inc. -

-
explicit counting_iterator(Incrementable x);
-
-

- Effects: Construct member m_inc from x. -

-
reference operator*() const;
-
-

- Returns: m_inc -

-
counting_iterator& operator++();
-
-

- Effects: ++m_inc
Returns: - *this -

-
counting_iterator& operator--();
-
-

- Effects: --m_inc
Returns: - *this -

-
Incrementable const& base() const;
-
-

- Returns: m_inc -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/specialized/filter.html b/libs/iterator/doc/html/iterator/specialized/filter.html deleted file mode 100644 index 9b712eacb..000000000 --- a/libs/iterator/doc/html/iterator/specialized/filter.html +++ /dev/null @@ -1,474 +0,0 @@ - - - -Filter Iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- The filter iterator adaptor creates a view of an iterator range in which - some elements of the range are skipped. A predicate function object controls - which elements are skipped. When the predicate is applied to an element, - if it returns true then the - element is retained and if it returns false - then the element is skipped over. When skipping over elements, it is necessary - for the filter adaptor to know when to stop so as to avoid going past the - end of the underlying range. A filter iterator is therefore constructed with - pair of iterators indicating the range of elements in the unfiltered sequence - to be traversed. -

-

- - Example -

-

- This example uses filter_iterator - and then make_filter_iterator - to output only the positive integers from an array of integers. Then make_filter_iterator is is used to output - the integers greater than -2. -

-
struct is_positive_number {
-  bool operator()(int x) { return 0 < x; }
-};
-
-int main()
-{
-  int numbers_[] = { 0, -1, 4, -3, 5, 8, -2 };
-  const int N = sizeof(numbers_)/sizeof(int);
-
-  typedef int* base_iterator;
-  base_iterator numbers(numbers_);
-
-  // Example using filter_iterator
-  typedef boost::filter_iterator<is_positive_number, base_iterator>
-    FilterIter;
-
-  is_positive_number predicate;
-  FilterIter filter_iter_first(predicate, numbers, numbers + N);
-  FilterIter filter_iter_last(predicate, numbers + N, numbers + N);
-
-  std::copy(filter_iter_first, filter_iter_last, std::ostream_iterator<int>(std::cout, " "));
-  std::cout << std::endl;
-
-  // Example using make_filter_iterator()
-  std::copy(boost::make_filter_iterator<is_positive_number>(numbers, numbers + N),
-            boost::make_filter_iterator<is_positive_number>(numbers + N, numbers + N),
-            std::ostream_iterator<int>(std::cout, " "));
-  std::cout << std::endl;
-
-  // Another example using make_filter_iterator()
-  std::copy(
-      boost::make_filter_iterator(
-          std::bind2nd(std::greater<int>(), -2)
-        , numbers, numbers + N)
-
-    , boost::make_filter_iterator(
-          std::bind2nd(std::greater<int>(), -2)
-        , numbers + N, numbers + N)
-
-    , std::ostream_iterator<int>(std::cout, " ")
-  );
-
-  std::cout << std::endl;
-
-  return boost::exit_success;
-}
-
-

- The output is: -

-
4 5 8
-4 5 8
-0 -1 4 5 8
-
-

- The source code for this example can be found here. -

-

- - Reference -

-

- - Synopsis -

-
template <class Predicate, class Iterator>
-class filter_iterator
-{
- public:
-    typedef iterator_traits<Iterator>::value_type value_type;
-    typedef iterator_traits<Iterator>::reference reference;
-    typedef iterator_traits<Iterator>::pointer pointer;
-    typedef iterator_traits<Iterator>::difference_type difference_type;
-    typedef /* see below */ iterator_category;
-
-    filter_iterator();
-    filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
-    filter_iterator(Iterator x, Iterator end = Iterator());
-    template<class OtherIterator>
-    filter_iterator(
-        filter_iterator<Predicate, OtherIterator> const& t
-        , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-        );
-    Predicate predicate() const;
-    Iterator end() const;
-    Iterator const& base() const;
-    reference operator*() const;
-    filter_iterator& operator++();
-private:
-    Predicate m_pred; // exposition only
-    Iterator m_iter;  // exposition only
-    Iterator m_end;   // exposition only
-};
-
-

- If Iterator models Readable - Lvalue Iterator and Bidirectional Traversal Iterator then iterator_category - is convertible to std::bidirectional_iterator_tag. Otherwise, - if Iterator models Readable - Lvalue Iterator and Forward Traversal Iterator then iterator_category - is convertible to std::forward_iterator_tag. Otherwise iterator_category is convertible to std::input_iterator_tag. -

-

- - Requirements -

-

- The Iterator argument shall - meet the requirements of Readable Iterator and Single Pass Iterator or it - shall meet the requirements of Input Iterator. -

-

- The Predicate argument must - be Assignable, Copy Constructible, and the expression p(x) - must be valid where p is - an object of type Predicate, - x is an object of type iterator_traits<Iterator>::value_type, and where the type of p(x) must be convertible to bool. -

-

- - Concepts -

-

- The concepts that filter_iterator - models are dependent on which concepts the Iterator - argument models, as specified in the following tables. -

-
-

Table 1.12. Traversal

-
---- - - - - - - - - - - - - - - - - - - -
-

- If Iterator models -

-
-

- then filter_iterator - models -

-
-

- Single Pass Iterator -

-
-

- Single Pass Iterator -

-
-

- Forward Traversal Iterator -

-
-

- Forward Traversal Iterator -

-
-

- Bidirectional Traversal Iterator -

-
-

- Bidirectional Traversal Iterator -

-
-
-
-

Table 1.13. Access

-
---- - - - - - - - - - - - - - - - - - - -
-

- If Iterator models -

-
-

- then filter_iterator - models -

-
-

- Readable Iterator -

-
-

- Readable Iterator -

-
-

- Writable Iterator -

-
-

- Writable Iterator -

-
-

- Lvalue Iterator -

-
-

- Lvalue Iterator -

-
-
-
-

Table 1.14. C++03

-
---- - - - - - - - - - - - - - - - - - - - - - - -
-

- If Iterator models -

-
-

- then filter_iterator - models -

-
-

- Readable Iterator, Single Pass Iterator -

-
-

- Input Iterator -

-
-

- Readable Lvalue Iterator, Forward Traversal Iterator -

-
-

- Forward Iterator -

-
-

- Writable Lvalue Iterator, Forward Traversal Iterator -

-
-

- Mutable Forward Iterator -

-
-

- Writable Lvalue Iterator, Bidirectional Iterator -

-
-

- Mutable Bidirectional Iterator -

-
-
-

- filter_iterator<P1, X> is interoperable with filter_iterator<P2, Y> - if and only if X is interoperable - with Y. -

-

- - Operations -

-

- In addition to those operations required by the concepts that filter_iterator models, filter_iterator - provides the following operations. -

-
filter_iterator();
-
-

- Requires: Predicate - and Iterator must be Default - Constructible.
Effects: Constructs - a filter_iterator whosem_pred, m_iter, - and m_end members are a default - constructed. -

-
filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
-
-

- Effects: Constructs a filter_iterator - where m_iter is either the - first position in the range [x,end) such that f(*m_iter) == true - or elsem_iter == - end. The member m_pred - is constructed from f and - m_end from end. -

-
filter_iterator(Iterator x, Iterator end = Iterator());
-
-

- Requires: Predicate - must be Default Constructible and Predicate - is a class type (not a function pointer).
Effects: - Constructs a filter_iterator - where m_iter is either the - first position in the range [x,end) such that m_pred(*m_iter) == true - or elsem_iter == - end. The member m_pred - is default constructed. -

-
template <class OtherIterator>
-filter_iterator(
-    filter_iterator<Predicate, OtherIterator> const& t
-    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-    );
-
-

- Requires: OtherIterator - is implicitly convertible to Iterator.
- Effects: Constructs a filter iterator whose - members are copied from t. -

-
Predicate predicate() const;
-
-

- Returns: m_pred -

-
Ierator end() const;
-
-

- Returns: m_end -

-
Iterator const& base() const;
-
-

- Returns: m_iterator -

-
reference operator*() const;
-
-

- Returns: *m_iter -

-
filter_iterator& operator++();
-
-

- Effects: Increments m_iter - and then continues to increment m_iter - until either m_iter == - m_end or m_pred(*m_iter) == true.
- Returns: *this -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/specialized/function_output.html b/libs/iterator/doc/html/iterator/specialized/function_output.html deleted file mode 100644 index 010eee168..000000000 --- a/libs/iterator/doc/html/iterator/specialized/function_output.html +++ /dev/null @@ -1,161 +0,0 @@ - - - -Function Output Iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- The function output iterator adaptor makes it easier to create custom output - iterators. The adaptor takes a unary function and creates a model of Output - Iterator. Each item assigned to the output iterator is passed as an argument - to the unary function. The motivation for this iterator is that creating - a conforming output iterator is non-trivial, particularly because the proper - implementation usually requires a proxy object. -

-

- - Example -

-
struct string_appender
-{
-    string_appender(std::string& s)
-        : m_str(&s)
-    {}
-
-    void operator()(const std::string& x) const
-    {
-        *m_str += x;
-    }
-
-    std::string* m_str;
-};
-
-int main(int, char*[])
-{
-  std::vector<std::string> x;
-  x.push_back("hello");
-  x.push_back(" ");
-  x.push_back("world");
-  x.push_back("!");
-
-  std::string s = "";
-  std::copy(x.begin(), x.end(),
-    boost::make_function_output_iterator(string_appender(s)));
-
-  std::cout << s << std::endl;
-
-  return 0;
-}
-
-

- - Reference -

-

- - Synopsis -

-
template <class UnaryFunction>
-class function_output_iterator {
-public:
-  typedef std::output_iterator_tag iterator_category;
-  typedef void                     value_type;
-  typedef void                     difference_type;
-  typedef void                     pointer;
-  typedef void                     reference;
-
-  explicit function_output_iterator();
-
-  explicit function_output_iterator(const UnaryFunction& f);
-
-  /* see below */ operator*();
-  function_output_iterator& operator++();
-  function_output_iterator& operator++(int);
-private:
-  UnaryFunction m_f;     // exposition only
-};
-
-

- - Requirements -

-

- UnaryFunction must be Assignable - and Copy Constructible. -

-

- - Concepts -

-

- function_output_iterator - is a model of the Writable and Incrementable Iterator concepts. -

-

- - Operations -

-
explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());
-
-

- Effects: Constructs an instance of function_output_iterator with m_f constructed from f. -

-
unspecified_type operator*();
-
-

- Returns: An object r - of unspecified type such that r - = t - is equivalent to m_f(t) for - all t. -

-
function_output_iterator& operator++();
-
-

- Returns: *this. -

-
function_output_iterator& operator++(int);
-
-

- Returns: *this. -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/specialized/indirect.html b/libs/iterator/doc/html/iterator/specialized/indirect.html deleted file mode 100644 index d753ff525..000000000 --- a/libs/iterator/doc/html/iterator/specialized/indirect.html +++ /dev/null @@ -1,323 +0,0 @@ - - - -Indirect Iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- indirect_iterator adapts - an iterator by applying an extra dereference - inside of operator*(). - For example, this iterator adaptor makes it possible to view a container - of pointers (e.g. list<foo*>) - as if it were a container of the pointed-to type (e.g. list<foo>). indirect_iterator - depends on two auxiliary traits, pointee - and indirect_reference, to - provide support for underlying iterators whose value_type - is not an iterator. -

-

- - Example -

-

- This example prints an array of characters, using indirect_iterator - to access the array of characters through an array of pointers. Next indirect_iterator is used with the transform algorithm to copy the characters - (incremented by one) to another array. A constant indirect iterator is used - for the source and a mutable indirect iterator is used for the destination. - The last part of the example prints the original array of characters, but - this time using the make_indirect_iterator - helper function. -

-
char characters[] = "abcdefg";
-const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char
-char* pointers_to_chars[N];                        // at the end.
-for (int i = 0; i < N; ++i)
-  pointers_to_chars[i] = &characters[i];
-
-// Example of using indirect_iterator
-
-boost::indirect_iterator<char**, char>
-  indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N);
-
-std::copy(indirect_first, indirect_last, std::ostream_iterator<char>(std::cout, ","));
-std::cout << std::endl;
-
-
-// Example of making mutable and constant indirect iterators
-
-char mutable_characters[N];
-char* pointers_to_mutable_chars[N];
-for (int j = 0; j < N; ++j)
-  pointers_to_mutable_chars[j] = &mutable_characters[j];
-
-boost::indirect_iterator<char* const*> mutable_indirect_first(pointers_to_mutable_chars),
-  mutable_indirect_last(pointers_to_mutable_chars + N);
-boost::indirect_iterator<char* const*, char const> const_indirect_first(pointers_to_chars),
-  const_indirect_last(pointers_to_chars + N);
-
-std::transform(const_indirect_first, const_indirect_last,
-       mutable_indirect_first, std::bind1st(std::plus<char>(), 1));
-
-std::copy(mutable_indirect_first, mutable_indirect_last,
-      std::ostream_iterator<char>(std::cout, ","));
-std::cout << std::endl;
-
-
-// Example of using make_indirect_iterator()
-
-std::copy(boost::make_indirect_iterator(pointers_to_chars),
-      boost::make_indirect_iterator(pointers_to_chars + N),
-      std::ostream_iterator<char>(std::cout, ","));
-std::cout << std::endl;
-
-

- The output is: -

-
a,b,c,d,e,f,g,
-b,c,d,e,f,g,h,
-a,b,c,d,e,f,g,
-
-

- The source code for this example can be found here. -

-

- - Reference -

-

- - Synopsis -

-
template <
-    class Iterator
-  , class Value = use_default
-  , class CategoryOrTraversal = use_default
-  , class Reference = use_default
-  , class Difference = use_default
->
-class indirect_iterator
-{
- public:
-    typedef /* see below */ value_type;
-    typedef /* see below */ reference;
-    typedef /* see below */ pointer;
-    typedef /* see below */ difference_type;
-    typedef /* see below */ iterator_category;
-
-    indirect_iterator();
-    indirect_iterator(Iterator x);
-
-    template <
-        class Iterator2, class Value2, class Category2
-      , class Reference2, class Difference2
-    >
-    indirect_iterator(
-        indirect_iterator<
-             Iterator2, Value2, Category2, Reference2, Difference2
-        > const& y
-      , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
-    );
-
-    Iterator const& base() const;
-    reference operator*() const;
-    indirect_iterator& operator++();
-    indirect_iterator& operator--();
-private:
-   Iterator m_iterator; // exposition
-};
-
-

- The member types of indirect_iterator - are defined according to the following pseudo-code, where V - is iterator_traits<Iterator>::value_type -

-
  if (Value is use_default) then
-      typedef remove_const<pointee<V>::type>::type value_type;
-  else
-      typedef remove_const<Value>::type value_type;
-
-  if (Reference is use_default) then
-      if (Value is use_default) then
-          typedef indirect_reference<V>::type reference;
-      else
-          typedef Value& reference;
-  else
-      typedef Reference reference;
-
-  if (Value is use_default) then
-      typedef pointee<V>::type* pointer;
-  else
-      typedef Value* pointer;
-
-  if (Difference is use_default)
-      typedef iterator_traits<Iterator>::difference_type difference_type;
-  else
-      typedef Difference difference_type;
-
-  if (CategoryOrTraversal is use_default)
-      typedef iterator-category (
-          iterator_traversal<Iterator>::type,reference,value_type
-      ) iterator_category;
-  else
-      typedef iterator-category (
-          CategoryOrTraversal,reference,value_type
-      ) iterator_category;
-
-

- - Requirements -

-

- The expression *v, - where v is an object of - iterator_traits<Iterator>::value_type, shall be valid expression and - convertible to reference. - Iterator shall model the - traversal concept indicated by iterator_category. - Value, Reference, - and Difference shall be chosen - so that value_type, reference, and difference_type - meet the requirements indicated by iterator_category. -

- -

- - Concepts -

-

- In addition to the concepts indicated by iterator_category - and by iterator_traversal<indirect_iterator>::type, - a specialization of indirect_iterator - models the following concepts, Where v - is an object of iterator_traits<Iterator>::value_type: -

-

- Readable Iterator if reference(*v) - is convertible to value_type. -

-

- Writable Iterator if reference(*v) - = t - is a valid expression (where t - is an object of type indirect_iterator::value_type) -

-

- Lvalue Iterator if reference - is a reference type. -

-

- indirect_iterator<X,V1,C1,R1,D1> is interoperable with indirect_iterator<Y,V2,C2,R2,D2> - if and only if X is interoperable - with Y. -

-

- - Operations -

-

- In addition to the operations required by the concepts described above, specializations - of indirect_iterator provide - the following operations: -

-
indirect_iterator();
-
-

- Requires: Iterator - must be Default Constructible.
Effects: - Constructs an instance of indirect_iterator - with a default-constructed m_iterator. -

-
indirect_iterator(Iterator x);
-
-

- Effects: Constructs an instance of indirect_iterator with m_iterator - copy constructed from x. -

-
template <
-    class Iterator2, class Value2, unsigned Access, class Traversal
-  , class Reference2, class Difference2
->
-indirect_iterator(
-    indirect_iterator<
-         Iterator2, Value2, Access, Traversal, Reference2, Difference2
-    > const& y
-  , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
-);
-
-

- Requires: Iterator2 - is implicitly convertible to Iterator.
- Effects: Constructs an instance of indirect_iterator whose m_iterator - subobject is constructed from y.base(). -

-
Iterator const& base() const;
-
-

- Returns: m_iterator -

-
reference operator*() const;
-
-

- Returns: **m_iterator -

-
indirect_iterator& operator++();
-
-

- Effects: ++m_iterator
Returns: - *this -

-
indirect_iterator& operator--();
-
-

- Effects: --m_iterator
Returns: - *this -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/specialized/permutation.html b/libs/iterator/doc/html/iterator/specialized/permutation.html deleted file mode 100644 index b4ed811be..000000000 --- a/libs/iterator/doc/html/iterator/specialized/permutation.html +++ /dev/null @@ -1,277 +0,0 @@ - - - -Permutation Iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- The permutation iterator adaptor provides a permuted view of a given range. - That is, the view includes every element of the given range but in a potentially - different order. The adaptor takes two arguments: -

-
    -
  • - an iterator to the range V on which the permutation will be applied -
  • -
  • - the reindexing scheme that defines how the elements of V will be permuted. -
  • -
-

- Note that the permutation iterator is not limited to strict permutations - of the given range V. The distance between begin and end of the reindexing - iterators is allowed to be smaller compared to the size of the range V, in - which case the permutation iterator only provides a permutation of a subrange - of V. The indexes neither need to be unique. In this same context, it must - be noted that the past the end permutation iterator is completely defined - by means of the past-the-end iterator to the indices. -

-

- - Example -

-
using namespace boost;
-int i = 0;
-
-typedef std::vector< int > element_range_type;
-typedef std::list< int > index_type;
-
-static const int element_range_size = 10;
-static const int index_size = 4;
-
-element_range_type elements( element_range_size );
-for(element_range_type::iterator el_it = elements.begin() ; el_it != elements.end() ; ++el_it)
-  *el_it = std::distance(elements.begin(), el_it);
-
-index_type indices( index_size );
-for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it )
-  *i_it = element_range_size - index_size + std::distance(indices.begin(), i_it);
-std::reverse( indices.begin(), indices.end() );
-
-typedef permutation_iterator< element_range_type::iterator, index_type::iterator > permutation_type;
-permutation_type begin = make_permutation_iterator( elements.begin(), indices.begin() );
-permutation_type it = begin;
-permutation_type end = make_permutation_iterator( elements.begin(), indices.end() );
-
-std::cout << "The original range is : ";
-std::copy( elements.begin(), elements.end(), std::ostream_iterator< int >( std::cout, " " ) );
-std::cout << "\n";
-
-std::cout << "The reindexing scheme is : ";
-std::copy( indices.begin(), indices.end(), std::ostream_iterator< int >( std::cout, " " ) );
-std::cout << "\n";
-
-std::cout << "The permutated range is : ";
-std::copy( begin, end, std::ostream_iterator< int >( std::cout, " " ) );
-std::cout << "\n";
-
-std::cout << "Elements at even indices in the permutation : ";
-it = begin;
-for(i = 0; i < index_size / 2 ; ++i, it+=2 ) std::cout << *it << " ";
-std::cout << "\n";
-
-std::cout << "Permutation backwards : ";
-it = begin + (index_size);
-assert( it != begin );
-for( ; it-- != begin ; ) std::cout << *it << " ";
-std::cout << "\n";
-
-std::cout << "Iterate backward with stride 2 : ";
-it = begin + (index_size - 1);
-for(i = 0 ; i < index_size / 2 ; ++i, it-=2 ) std::cout << *it << " ";
-std::cout << "\n";
-
-

- The output is: -

-
The original range is : 0 1 2 3 4 5 6 7 8 9
-The reindexing scheme is : 9 8 7 6
-The permutated range is : 9 8 7 6
-Elements at even indices in the permutation : 9 7
-Permutation backwards : 6 7 8 9
-Iterate backward with stride 2 : 6 8
-
-

- The source code for this example can be found here. -

-

- - Reference -

-

- - Synopsis -

-
template< class ElementIterator
-    , class IndexIterator
-    , class ValueT        = use_default
-    , class CategoryT     = use_default
-    , class ReferenceT    = use_default
-    , class DifferenceT   = use_default >
-class permutation_iterator
-{
-public:
-  permutation_iterator();
-  explicit permutation_iterator(ElementIterator x, IndexIterator y);
-
-  template< class OEIter, class OIIter, class V, class C, class R, class D >
-  permutation_iterator(
-  permutation_iterator<OEIter, OIIter, V, C, R, D> const& r
-  , typename enable_if_convertible<OEIter, ElementIterator>::type* = 0
-  , typename enable_if_convertible<OIIter, IndexIterator>::type* = 0
-  );
-  reference operator*() const;
-  permutation_iterator& operator++();
-  ElementIterator const& base() const;
-private:
-  ElementIterator m_elt;      // exposition only
-  IndexIterator m_order;      // exposition only
-};
-
-template <class ElementIterator, class IndexIterator>
-permutation_iterator<ElementIterator, IndexIterator>
-make_permutation_iterator( ElementIterator e, IndexIterator i);
-
-

- - Requirements -

-

- ElementIterator shall model - Random Access Traversal Iterator. IndexIterator - shall model Readable Iterator. The value type of the IndexIterator - must be convertible to the difference type of ElementIterator. -

-

- - Concepts -

-

- permutation_iterator models - the same iterator traversal concepts as IndexIterator - and the same iterator access concepts as ElementIterator. -

-

- If IndexIterator models Single - Pass Iterator and ElementIterator - models Readable Iterator then permutation_iterator - models Input Iterator. -

-

- If IndexIterator models Forward - Traversal Iterator and ElementIterator - models Readable Lvalue Iterator then permutation_iterator - models Forward Iterator. -

-

- If IndexIterator models Bidirectional - Traversal Iterator and ElementIterator - models Readable Lvalue Iterator then permutation_iterator - models Bidirectional Iterator. -

-

- If IndexIterator models Random - Access Traversal Iterator and ElementIterator - models Readable Lvalue Iterator then permutation_iterator - models Random Access Iterator. -

-

- permutation_iterator<E1, X, V1, - C2, R1, D1> is interoperable with permutation_iterator<E2, Y, - V2, C2, R2, D2> - if and only if X is interoperable - with Y and E1 is convertible to E2. -

-

- - Operations -

-

- In addition to those operations required by the concepts that permutation_iterator models, permutation_iterator provides the following - operations. -

-
permutation_iterator();
-
-

- Effects: Default constructs m_elt and m_order. -

-
explicit permutation_iterator(ElementIterator x, IndexIterator y);
-
-

- Effects: Constructs m_elt - from x and m_order from y. -

-
template< class OEIter, class OIIter, class V, class C, class R, class D >
-permutation_iterator(
-permutation_iterator<OEIter, OIIter, V, C, R, D> const& r
-, typename enable_if_convertible<OEIter, ElementIterator>::type* = 0
-, typename enable_if_convertible<OIIter, IndexIterator>::type* = 0
-);
-
-

- Effects: Constructs m_elt - from r.m_elt and m_order - from y.m_order. -

-
reference operator*() const;
-
-

- Returns: *(m_elt + *m_order) -

-
permutation_iterator& operator++();
-
-

- Effects: ++m_order
Returns: - *this -

-
ElementIterator const& base() const;
-
-

- Returns: m_order -

-
template <class ElementIterator, class IndexIterator>
-permutation_iterator<ElementIterator, IndexIterator>
-make_permutation_iterator(ElementIterator e, IndexIterator i);
-
-

- Returns: permutation_iterator<ElementIterator, IndexIterator>(e, i) -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/specialized/reverse.html b/libs/iterator/doc/html/iterator/specialized/reverse.html deleted file mode 100644 index b117279ee..000000000 --- a/libs/iterator/doc/html/iterator/specialized/reverse.html +++ /dev/null @@ -1,286 +0,0 @@ - - - -Reverse Iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- The reverse iterator adaptor iterates through the adapted iterator range - in the opposite direction. -

-

- - Example -

-

- The following example prints an array of characters in reverse order using - reverse_iterator. -

-
char letters_[] = "hello world!";
-const int N = sizeof(letters_)/sizeof(char) - 1;
-typedef char* base_iterator;
-base_iterator letters(letters_);
-std::cout << "original sequence of letters:\t\t\t" << letters_ << std::endl;
-
-boost::reverse_iterator<base_iterator>
-  reverse_letters_first(letters + N),
-  reverse_letters_last(letters);
-
-std::cout << "sequence in reverse order:\t\t\t";
-std::copy(reverse_letters_first, reverse_letters_last,
-          std::ostream_iterator<char>(std::cout));
-std::cout << std::endl;
-
-std::cout << "sequence in double-reversed (normal) order:\t";
-std::copy(boost::make_reverse_iterator(reverse_letters_last),
-          boost::make_reverse_iterator(reverse_letters_first),
-          std::ostream_iterator<char>(std::cout));
-std::cout << std::endl;
-
-

- The output is: -

-
original sequence of letters:                   hello world!
-sequence in reverse order:                      !dlrow olleh
-sequence in double-reversed (normal) order:     hello world!
-
-

- The source code for this example can be found here. -

-

- - Reference -

-

- - Synopsis -

-
template <class Iterator>
-class reverse_iterator
-{
-public:
-  typedef iterator_traits<Iterator>::value_type value_type;
-  typedef iterator_traits<Iterator>::reference reference;
-  typedef iterator_traits<Iterator>::pointer pointer;
-  typedef iterator_traits<Iterator>::difference_type difference_type;
-  typedef /* see below */ iterator_category;
-
-  reverse_iterator() {}
-  explicit reverse_iterator(Iterator x) ;
-
-  template<class OtherIterator>
-  reverse_iterator(
-      reverse_iterator<OtherIterator> const& r
-    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-  );
-  Iterator const& base() const;
-  reference operator*() const;
-  reverse_iterator& operator++();
-  reverse_iterator& operator--();
-private:
-  Iterator m_iterator; // exposition
-};
-
-

- If Iterator models Random - Access Traversal Iterator and Readable Lvalue Iterator, then iterator_category is convertible to random_access_iterator_tag. Otherwise, - if Iterator models Bidirectional - Traversal Iterator and Readable Lvalue Iterator, then iterator_category - is convertible to bidirectional_iterator_tag. - Otherwise, iterator_category - is convertible to input_iterator_tag. -

-

- - Requirements -

-

- Iterator must be a model - of Bidirectional Traversal Iterator. The type iterator_traits<Iterator>::reference - must be the type of *i, - where i is an object of type - Iterator. -

-

- - Concepts -

-

- A specialization of reverse_iterator - models the same iterator traversal and iterator access concepts modeled by - its Iterator argument. In - addition, it may model old iterator concepts specified in the following table: -

-
-

Table 1.15. Categories

-
---- - - - - - - - - - - - - - - - - - - - - - - -
-

- If I models -

-
-

- then reverse_iterator<I> models -

-
-

- Readable Lvalue Iterator, Bidirectional Traversal Iterator -

-
-

- Bidirectional Iterator -

-
-

- Writable Lvalue Iterator, Bidirectional Traversal Iterator -

-
-

- Mutable Bidirectional Iterator -

-
-

- Readable Lvalue Iterator, Random Access Traversal Iterator -

-
-

- Random Access Iterator -

-
-

- Writable Lvalue Iterator, Random Access Traversal Iterator -

-
-

- Mutable Random Access Iterator -

-
-
-

- reverse_iterator<X> is - interoperable with reverse_iterator<Y> - if and only if X is interoperable - with Y. -

-

- - Operations -

-

- In addition to the operations required by the concepts modeled by reverse_iterator, reverse_iterator - provides the following operations. -

-
reverse_iterator();
-
-

- Requires: Iterator - must be Default Constructible.
Effects: - Constructs an instance of reverse_iterator - with m_iterator default constructed. -

-
explicit reverse_iterator(Iterator x);
-
-

- Effects: Constructs an instance of reverse_iterator with m_iterator - copy constructed from x. -

-
template<class OtherIterator>
-reverse_iterator(
-    reverse_iterator<OtherIterator> const& r
-  , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-);
-
-

- Requires: OtherIterator - is implicitly convertible to Iterator.
- Effects: Constructs instance of reverse_iterator whose m_iterator - subobject is constructed from y.base(). -

-
Iterator const& base() const;
-
-

- Returns: m_iterator -

-
reference operator*() const;
-
-

- Effects: Iterator tmp = m_iterator; return - *--tmp; -

-
reverse_iterator& operator++();
-
-

- Effects: --m_iterator
Returns: - *this -

-
reverse_iterator& operator--();
-
-

- Effects: ++m_iterator
Returns: - *this -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/specialized/shared_container.html b/libs/iterator/doc/html/iterator/specialized/shared_container.html deleted file mode 100644 index 8232745f0..000000000 --- a/libs/iterator/doc/html/iterator/specialized/shared_container.html +++ /dev/null @@ -1,221 +0,0 @@ - - - -Shared Container Iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -

- Defined in header boost/shared_container_iterator.hpp. -

-

- The purpose of the shared container iterator is to attach the lifetime of - a container to the lifetime of its iterators. In other words, the container - will not be deleted until after all its iterators are destroyed. The shared - container iterator is typically used to implement functions that return iterators - over a range of objects that only need to exist for the lifetime of the iterators. - By returning a pair of shared iterators from a function, the callee can return - a heap-allocated range of objects whose lifetime is automatically managed. -

-

- The shared container iterator augments an iterator over a shared container. - It maintains a reference count on the shared container. If only shared container - iterators hold references to the container, the container's lifetime will - end when the last shared container iterator over it is destroyed. In any - case, the shared container is guaranteed to persist beyond the lifetime of - all the iterators. In all other ways, the shared container iterator behaves - the same as its base iterator. -

-

- - Synopsis -

-
namespace boost {
-  template <typename Container>
-  class shared_container_iterator;
-
-  template <typename Container>
-  shared_container_iterator<Container>
-  make_shared_container_iterator(typename Container::iterator base,
-    boost::shared_ptr<Container> const& container);
-
-  std::pair<
-    typename shared_container_iterator<Container>,
-    typename shared_container_iterator<Container>
-  >
-  make_shared_container_range(boost::shared_ptr<Container> const& container);
-}
-
-
- -
template <typename Container> class shared_container_iterator;
-
-

- The class template shared_container_iterator - is the shared container iterator type. The Container - template type argument must model the Container - concept. -

-

- - Example -

-

- The following example illustrates how to create an iterator that regulates - the lifetime of a reference counted std::vector. - Though the original shared pointer ints - ceases to exist after set_range() returns, the shared_counter_iterator - objects maintain references to the underlying vector and thereby extend - the container's lifetime. -

-

- shared_iterator_example1.cpp: -

-
#include "shared_container_iterator.hpp"
-#include "boost/shared_ptr.hpp"
-#include <algorithm>
-#include <iostream>
-#include <vector>
-
-typedef boost::shared_container_iterator< std::vector<int> > iterator;
-
-
-void set_range(iterator& i, iterator& end)  {
-
-  boost::shared_ptr< std::vector<int> > ints(new std::vector<int>());
-
-  ints->push_back(0);
-  ints->push_back(1);
-  ints->push_back(2);
-  ints->push_back(3);
-  ints->push_back(4);
-  ints->push_back(5);
-
-  i = iterator(ints->begin(),ints);
-  end = iterator(ints->end(),ints);
-}
-
-
-int main() {
-
-  iterator i,end;
-
-  set_range(i,end);
-
-  std::copy(i,end,std::ostream_iterator<int>(std::cout,","));
-  std::cout.put('\n');
-
-  return 0;
-}
-
-

- The output from this part is: -

-
0,1,2,3,4,5,
-
-
-

Table 1.16. Template Parameters

-
---- - - - - - - - - -
-

- Parameter -

-
-

- Description -

-
-

- Container -

-
-

- The type of the container that we wish to iterate over. It must - be a model of the Container concept. -

-
-
-

- - Concepts -

-

- The shared_container_iterator - type models the same iterator concept as the base iterator (Container::iterator). -

-

- - Operations -

-

- The shared_container_iterator - type implements the member functions and operators required of the Random Access - Iterator concept, though only operations defined for the base iterator - will be valid. In addition it has the following constructor: -

-
shared_container_iterator(Container::iterator const& it,
-                          boost::shared_ptr<Container> const& container)
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/specialized/shared_container/shared_container_generator.html b/libs/iterator/doc/html/iterator/specialized/shared_container/shared_container_generator.html deleted file mode 100644 index cfd722d83..000000000 --- a/libs/iterator/doc/html/iterator/specialized/shared_container/shared_container_generator.html +++ /dev/null @@ -1,109 +0,0 @@ - - - -The Shared Container Iterator Range Generator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
template <typename Container>
-std::pair<
-  shared_container_iterator<Container>,
-  shared_container_iterator<Container>
->
-make_shared_container_range(boost::shared_ptr<Container> const& container);
-Class shared_container_iterator is meant primarily to return, using iterators, a range of values that we can guarantee will be alive as long as the iterators are. This is a convenience function to do just that. It is equivalent to
-std::make_pair(make_shared_container_iterator(container->begin(),container),
-               make_shared_container_iterator(container->end(),container));
-
-

- - Example -

-

- In the following example, a range of values is returned as a pair of shared_container_iterator - objects. -

-

- shared_iterator_example3.cpp: -

-
#include "shared_container_iterator.hpp"
-#include "boost/shared_ptr.hpp"
-#include "boost/tuple/tuple.hpp" // for boost::tie
-#include <algorithm>              // for std::copy
-#include <iostream>
-#include <vector>
-
-
-typedef boost::shared_container_iterator< std::vector<int> > iterator;
-
-std::pair<iterator,iterator>
-return_range() {
-  boost::shared_ptr< std::vector<int> > range(new std::vector<int>());
-  range->push_back(0);
-  range->push_back(1);
-  range->push_back(2);
-  range->push_back(3);
-  range->push_back(4);
-  range->push_back(5);
-  return boost::make_shared_container_range(range);
-}
-
-
-int main() {
-
-
-  iterator i,end;
-
-  boost::tie(i,end) = return_range();
-
-  std::copy(i,end,std::ostream_iterator<int>(std::cout,","));
-  std::cout.put('\n');
-
-  return 0;
-}
-
-

- Though the range object only lives for the duration of the return_range call, the reference counted - std::vector will live until i and end - are both destroyed. The output from this example is the same as the previous - two. -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/specialized/shared_container/shared_container_object_generator.html b/libs/iterator/doc/html/iterator/specialized/shared_container/shared_container_object_generator.html deleted file mode 100644 index 0aa2a7022..000000000 --- a/libs/iterator/doc/html/iterator/specialized/shared_container/shared_container_object_generator.html +++ /dev/null @@ -1,110 +0,0 @@ - - - -The Shared Container Iterator Object Generator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
template <typename Container>
-shared_container_iterator<Container>
-make_shared_container_iterator(Container::iterator base,
-                               boost::shared_ptr<Container> const& container)
-
-

- This function provides an alternative to directly constructing a shared_container_iterator. Using the - object generator, a shared_container_iterator - can be created and passed to a function without explicitly specifying its - type. -

-

- - Example -

-

- This example, similar to the previous, uses make_shared_container_iterator() to create the iterators. -

-

- shared_iterator_example2.cpp: -

-
#include "shared_container_iterator.hpp"
-#include "boost/shared_ptr.hpp"
-#include <algorithm>
-#include <iterator>
-#include <iostream>
-#include <vector>
-
-
-template <typename Iterator>
-void print_range_nl (Iterator begin, Iterator end) {
-  typedef typename std::iterator_traits<Iterator>::value_type val;
-  std::copy(begin,end,std::ostream_iterator<val>(std::cout,","));
-  std::cout.put('\n');
-}
-
-
-int main() {
-
-  typedef boost::shared_ptr< std::vector<int> > ints_t;
-  {
-    ints_t ints(new std::vector<int>());
-
-    ints->push_back(0);
-    ints->push_back(1);
-    ints->push_back(2);
-    ints->push_back(3);
-    ints->push_back(4);
-    ints->push_back(5);
-
-    print_range_nl(boost::make_shared_container_iterator(ints->begin(),ints),
-                   boost::make_shared_container_iterator(ints->end(),ints));
-  }
-
-
-
-  return 0;
-}
-
-

- Observe that the shared_container_iterator - type is never explicitly named. The output from this example is the same - as the previous. -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/specialized/transform.html b/libs/iterator/doc/html/iterator/specialized/transform.html deleted file mode 100644 index 13b51e472..000000000 --- a/libs/iterator/doc/html/iterator/specialized/transform.html +++ /dev/null @@ -1,355 +0,0 @@ - - - -Transform Iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- The transform iterator adapts an iterator by modifying the operator* - to apply a function object to the result of dereferencing the iterator and - returning the result. -

-

- - Example -

-

- This is a simple example of using the transform_iterators class to generate - iterators that multiply (or add to) the value returned by dereferencing the - iterator. It would be cooler to use lambda library in this example. -

-
int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
-const int N = sizeof(x)/sizeof(int);
-
-typedef boost::binder1st< std::multiplies<int> > Function;
-typedef boost::transform_iterator<Function, int*> doubling_iterator;
-
-doubling_iterator i(x, boost::bind1st(std::multiplies<int>(), 2)),
-  i_end(x + N, boost::bind1st(std::multiplies<int>(), 2));
-
-std::cout << "multiplying the array by 2:" << std::endl;
-while (i != i_end)
-  std::cout << *i++ << " ";
-std::cout << std::endl;
-
-std::cout << "adding 4 to each element in the array:" << std::endl;
-std::copy(boost::make_transform_iterator(x, boost::bind1st(std::plus<int>(), 4)),
-     boost::make_transform_iterator(x + N, boost::bind1st(std::plus<int>(), 4)),
-     std::ostream_iterator<int>(std::cout, " "));
-std::cout << std::endl;
-
-

- The output is: -

-
multiplying the array by 2:
-2 4 6 8 10 12 14 16
-adding 4 to each element in the array:
-5 6 7 8 9 10 11 12
-
-

- The source code for this example can be found here. -

-

- - Reference -

-

- - Synopsis -

-
template <class UnaryFunction,
-          class Iterator,
-          class Reference = use_default,
-          class Value = use_default>
-class transform_iterator
-{
-public:
-  typedef /* see below */ value_type;
-  typedef /* see below */ reference;
-  typedef /* see below */ pointer;
-  typedef iterator_traits<Iterator>::difference_type difference_type;
-  typedef /* see below */ iterator_category;
-
-  transform_iterator();
-  transform_iterator(Iterator const& x, UnaryFunction f);
-
-  template<class F2, class I2, class R2, class V2>
-  transform_iterator(
-        transform_iterator<F2, I2, R2, V2> const& t
-      , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
-      , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
-  );
-  UnaryFunction functor() const;
-  Iterator const& base() const;
-  reference operator*() const;
-  transform_iterator& operator++();
-  transform_iterator& operator--();
-private:
-  Iterator m_iterator; // exposition only
-  UnaryFunction m_f;   // exposition only
-};
-
-

- If Reference is use_default then the reference - member of transform_iterator - is
result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type. Otherwise, reference - is Reference. -

-

- If Value is use_default then the value_type - member is remove_cv<remove_reference<reference> - >::type. - Otherwise, value_type is - Value. -

-

- If Iterator models Readable - Lvalue Iterator and if Iterator - models Random Access Traversal Iterator, then iterator_category - is convertible to random_access_iterator_tag. - Otherwise, if Iterator models - Bidirectional Traversal Iterator, then iterator_category - is convertible to bidirectional_iterator_tag. - Otherwise iterator_category - is convertible to forward_iterator_tag. - If Iterator does not model - Readable Lvalue Iterator then iterator_category - is convertible to input_iterator_tag. -

-

- - Requirements -

-

- The type UnaryFunction must - be Assignable, Copy Constructible, and the expression f(*i) - must be valid where f is - an object of type UnaryFunction, - i is an object of type Iterator, and where the type of f(*i) must be result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type. -

-

- The argument Iterator shall - model Readable Iterator. -

-

- - Concepts -

-

- The resulting transform_iterator - models the most refined of the following that is also modeled by Iterator. -

-
    -
  • - Writable Lvalue Iterator if transform_iterator::reference - is a non-const reference. -
  • -
  • - Readable Lvalue Iterator if transform_iterator::reference - is a const reference. -
  • -
  • - Readable Iterator otherwise. -
  • -
-

- The transform_iterator models - the most refined standard traversal concept that is modeled by the Iterator argument. -

-

- If transform_iterator is - a model of Readable Lvalue Iterator then it models the following original - iterator concepts depending on what the Iterator - argument models. -

-
-

Table 1.17. Category

-
---- - - - - - - - - - - - - - - - - - - - - - - -
-

- If Iterator models -

-
-

- then transform_iterator - models -

-
-

- Single Pass Iterator -

-
-

- Input Iterator -

-
-

- Forward Traversal Iterator -

-
-

- Forward Iterator -

-
-

- Bidirectional Traversal Iterator -

-
-

- Bidirectional Iterator -

-
-

- Random Access Traversal Iterator -

-
-

- Random Access Iterator -

-
-
-

- If transform_iterator models - Writable Lvalue Iterator then it is a mutable iterator (as defined in the - old iterator requirements). -

-

- transform_iterator<F1, X, R1, - V1> - is interoperable with transform_iterator<F2, Y, - R2, V2> - if and only if X is interoperable - with Y. -

-

- - Operations -

-

- In addition to the operations required by the concepts - modeled by transform_iterator, - transform_iterator provides - the following operations: -

-
transform_iterator();
-
-

- Returns: An instance of transform_iterator - with m_f and m_iterator default constructed. -

-
transform_iterator(Iterator const& x, UnaryFunction f);
-
-

- Returns: An instance of transform_iterator - with m_f initialized to - f and m_iterator - initialized to x. -

-
template<class F2, class I2, class R2, class V2>
-transform_iterator(
-      transform_iterator<F2, I2, R2, V2> const& t
-    , typename enable_if_convertible<I2, Iterator>::type* = 0	   // exposition only
-    , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
-);
-
-

- Returns: An instance of transform_iterator - with m_f initialized to - t.functor() - and m_iterator initialized - to t.base().
- Requires: OtherIterator - is implicitly convertible to Iterator. -

-
UnaryFunction functor() const;
-
-

- Returns: m_f -

-
Iterator const& base() const;
-
-

- Returns: m_iterator -

-
reference operator*() const;
-
-

- Returns: m_f(*m_iterator) -

-
transform_iterator& operator++();
-
-

- Effects: ++m_iterator
Returns: - *this -

-
transform_iterator& operator--();
-
-

- Effects: --m_iterator
Returns: - *this -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/specialized/zip.html b/libs/iterator/doc/html/iterator/specialized/zip.html deleted file mode 100644 index 6c6990b29..000000000 --- a/libs/iterator/doc/html/iterator/specialized/zip.html +++ /dev/null @@ -1,177 +0,0 @@ - - - -Zip Iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -

- The zip iterator provides the ability to parallel-iterate over several controlled - sequences simultaneously. A zip iterator is constructed from a tuple of iterators. - Moving the zip iterator moves all the iterators in parallel. Dereferencing - the zip iterator returns a tuple that contains the results of dereferencing - the individual iterators. -

-

- The tuple of iterators is now implemented in terms of a Boost fusion sequence. - Because of this the 'tuple' may be any Boost fusion sequence and, for backwards - compatibility through a Boost fusion sequence adapter, a Boost tuple. Because - the 'tuple' may be any boost::fusion sequence the 'tuple' may also be any - type for which a Boost fusion adapter exists. This includes, among others, - a std::tuple and a std::pair. Just remember to include the appropriate Boost - fusion adapter header files for these other Boost fusion adapters. The zip_iterator - header file already includes the Boost fusion adapter header file for Boost - tuple, so you need not include it yourself to use a Boost tuple as your 'tuple'. -

-
- -

- There are two main types of applications of the zip_iterator. - The first one concerns runtime efficiency: If one has several controlled - sequences of the same length that must be somehow processed, e.g., with - the for_each algorithm, - then it is more efficient to perform just one parallel-iteration rather - than several individual iterations. For an example, assume that vect_of_doubles and vect_of_ints - are two vectors of equal length containing doubles and ints, respectively, - and consider the following two iterations: -

-
std::vector<double>::const_iterator beg1 = vect_of_doubles.begin();
-std::vector<double>::const_iterator end1 = vect_of_doubles.end();
-std::vector<int>::const_iterator beg2 = vect_of_ints.begin();
-std::vector<int>::const_iterator end2 = vect_of_ints.end();
-
-std::for_each(beg1, end1, func_0());
-std::for_each(beg2, end2, func_1());
-
-

- These two iterations can now be replaced with a single one as follows: -

-
std::for_each(
-  boost::make_zip_iterator(
-    boost::make_tuple(beg1, beg2)
-    ),
-  boost::make_zip_iterator(
-    boost::make_tuple(end1, end2)
-    ),
-  zip_func()
-  );
-
-

- A non-generic implementation of zip_func - could look as follows: -

-
struct zip_func :
-  public std::unary_function<const boost::tuple<const double&, const int&>&, void>
-{
-  void operator()(const boost::tuple<const double&, const int&>& t) const
-  {
-    m_f0(t.get<0>());
-    m_f1(t.get<1>());
-  }
-
-private:
-  func_0 m_f0;
-  func_1 m_f1;
-};
-
-

- The second important application of the zip_iterator - is as a building block to make combining iterators. A combining iterator - is an iterator that parallel-iterates over several controlled sequences - and, upon dereferencing, returns the result of applying a functor to the - values of the sequences at the respective positions. This can now be achieved - by using the zip_iterator - in conjunction with the transform_iterator. -

-

- Suppose, for example, that you have two vectors of doubles, say vect_1 and vect_2, - and you need to expose to a client a controlled sequence containing the - products of the elements of vect_1 - and vect_2. Rather than - placing these products in a third vector, you can use a combining iterator - that calculates the products on the fly. Let us assume that tuple_multiplies is a functor that works - like std::multiplies, except that it takes its - two arguments packaged in a tuple. Then the two iterators it_begin and it_end - defined below delimit a controlled sequence containing the products of - the elements of vect_1 - and vect_2: -

-
typedef boost::tuple<
-  std::vector<double>::const_iterator,
-  std::vector<double>::const_iterator
-  > the_iterator_tuple;
-
-typedef boost::zip_iterator<
-  the_iterator_tuple
-  > the_zip_iterator;
-
-typedef boost::transform_iterator<
-  tuple_multiplies<double>,
-  the_zip_iterator
-  > the_transform_iterator;
-
-the_transform_iterator it_begin(
-  the_zip_iterator(
-    the_iterator_tuple(
-      vect_1.begin(),
-      vect_2.begin()
-      )
-    ),
-  tuple_multiplies<double>()
-  );
-
-the_transform_iterator it_end(
-  the_zip_iterator(
-    the_iterator_tuple(
-      vect_1.end(),
-      vect_2.end()
-      )
-    ),
-  tuple_multiplies<double>()
-  );
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/specialized/zip/zip_reference.html b/libs/iterator/doc/html/iterator/specialized/zip/zip_reference.html deleted file mode 100644 index a0d175ed7..000000000 --- a/libs/iterator/doc/html/iterator/specialized/zip/zip_reference.html +++ /dev/null @@ -1,213 +0,0 @@ - - - -Reference - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- - Synopsis -

-
template<typename IteratorTuple>
-class zip_iterator
-{
-
-public:
-  typedef /* see below */ reference;
-  typedef reference value_type;
-  typedef value_type* pointer;
-  typedef /* see below */ difference_type;
-  typedef /* see below */ iterator_category;
-
-  zip_iterator();
-  zip_iterator(IteratorTuple iterator_tuple);
-
-  template<typename OtherIteratorTuple>
-  zip_iterator(
-        const zip_iterator<OtherIteratorTuple>& other
-      , typename enable_if_convertible<
-              OtherIteratorTuple
-            , IteratorTuple>::type* = 0     // exposition only
-  );
-
-  const IteratorTuple& get_iterator_tuple() const;
-
-private:
-  IteratorTuple m_iterator_tuple;     // exposition only
-};
-
-template<typename IteratorTuple>
-zip_iterator<IteratorTuple>
-make_zip_iterator(IteratorTuple t);
-
-

- The reference member of - zip_iterator is the type - of the tuple made of the reference types of the iterator types in the - IteratorTuple argument. -

-

- The difference_type member - of zip_iterator is the - difference_type of the - first of the iterator types in the IteratorTuple - argument. -

-

- The iterator_category member - of zip_iterator is convertible - to the minimum of the traversal categories of the iterator types in the - IteratorTuple argument. - For example, if the zip_iterator - holds only vector iterators, then iterator_category - is convertible to boost::random_access_traversal_tag. - If you add a list iterator, then iterator_category - will be convertible to boost::bidirectional_traversal_tag, - but no longer to boost::random_access_traversal_tag. -

-

- - Requirements -

-

- All iterator types in the argument IteratorTuple - shall model Readable Iterator. -

-

- - Concepts -

-

- The resulting zip_iterator - models Readable Iterator. -

-

- The fact that the zip_iterator - models only Readable Iterator does not prevent you from modifying the values - that the individual iterators point to. The tuple returned by the zip_iterator's operator* is a tuple constructed from the reference - types of the individual iterators, not their value types. For example, - if zip_it is a zip_iterator whose first member iterator - is an std::vector<double>::iterator, then the following line will - modify the value which the first member iterator of zip_it - currently points to: -

-
zip_it->get<0>() = 42.0;
-
-

- Consider the set of standard traversal concepts obtained by taking the - most refined standard traversal concept modeled by each individual iterator - type in the IteratorTuple - argument.The zip_iterator - models the least refined standard traversal concept in this set. -

-

- zip_iterator<IteratorTuple1> - is interoperable with zip_iterator<IteratorTuple2> if and only if IteratorTuple1 - is interoperable with IteratorTuple2. -

-

- - Operations -

-

- In addition to the operations required by the concepts modeled by zip_iterator, zip_iterator - provides the following operations. -

-
zip_iterator();
-
-

- Returns: An instance of zip_iterator with m_iterator_tuple - default constructed. -

-
zip_iterator(IteratorTuple iterator_tuple);
-
-

- Returns: An instance of zip_iterator with m_iterator_tuple - initialized to iterator_tuple. -

-
template<typename OtherIteratorTuple>
-zip_iterator(
-      const zip_iterator<OtherIteratorTuple>& other
-    , typename enable_if_convertible<
-            OtherIteratorTuple
-          , IteratorTuple>::type* = 0     // exposition only
-);
-
-

- Returns: An instance of zip_iterator that is a copy of other.
Requires: - OtherIteratorTuple is implicitly - convertible to IteratorTuple. -

-
const IteratorTuple& get_iterator_tuple() const;
-
-

- Returns: m_iterator_tuple -

-
reference operator*() const;
-
-

- Returns: A tuple consisting of the results - of dereferencing all iterators in m_iterator_tuple. -

-
zip_iterator& operator++();
-
-

- Effects: Increments each iterator in - m_iterator_tuple.
- Returns: *this -

-
zip_iterator& operator--();
-
-

- Effects: Decrements each iterator in - m_iterator_tuple.
- Returns: *this -

-
template<typename IteratorTuple>
-zip_iterator<IteratorTuple>
-make_zip_iterator(IteratorTuple t);
-
-

- Returns: An instance of zip_iterator<IteratorTuple> - with m_iterator_tuple initialized - to t. -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/upgrading.html b/libs/iterator/doc/html/iterator/upgrading.html deleted file mode 100644 index d8901efb1..000000000 --- a/libs/iterator/doc/html/iterator/upgrading.html +++ /dev/null @@ -1,72 +0,0 @@ - - - -Upgrading from the old Boost Iterator Adaptor Library - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- If you have been using the old Boost Iterator Adaptor library to implement - iterators, you probably wrote a Policies - class which captures the core operations of your iterator. In the new library - design, you'll move those same core operations into the body of the iterator - class itself. If you were writing a family of iterators, you probably wrote - a type - generator to build the iterator_adaptor - specialization you needed; in the new library design you don't need a type - generator (though may want to keep it around as a compatibility aid for older - code) because, due to the use of the Curiously Recurring Template Pattern (CRTP) - [Cop95]_, you can now define the iterator class yourself and acquire functionality - through inheritance from iterator_facade - or iterator_adaptor. As a result, - you also get much finer control over how your iterator works: you can add additional - constructors, or even override the iterator functionality provided by the library. -

-

- If you're looking for the old projection_iterator - component, its functionality has been merged into transform_iterator: - as long as the function object's result_type - (or the Reference template - argument, if explicitly specified) is a true reference type, transform_iterator - will behave like projection_iterator - used to. -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/utilities.html b/libs/iterator/doc/html/iterator/utilities.html deleted file mode 100644 index 86d6c4958..000000000 --- a/libs/iterator/doc/html/iterator/utilities.html +++ /dev/null @@ -1,233 +0,0 @@ - - - -Utilities - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
- -

- The iterator_archetype class - constructs a minimal implementation of one of the iterator access concepts - and one of the iterator traversal concepts. This is used for doing a compile-time - check to see if a the type requirements of a template are really enough to - cover the implementation of the template. For further information see the - documentation for the |concepts|_ library. -

-

- - Synopsis -

-
namespace iterator_archetypes
-{
-    // Access categories
-
-    typedef /*implementation  defined*/ readable_iterator_t;
-    typedef /*implementation  defined*/ writable_iterator_t;
-    typedef /*implementation  defined*/ readable_writable_iterator_t;
-    typedef /*implementation  defined*/ readable_lvalue_iterator_t;
-    typedef /*implementation  defined*/ writable_lvalue_iterator_t;
-
-}
-
-template <
-    class Value
-  , class AccessCategory
-  , class TraversalCategory
->
-class iterator_archetype
-{
-    typedef /* see below */ value_type;
-    typedef /* see below */ reference;
-    typedef /* see below */ pointer;
-    typedef /* see below */ difference_type;
-    typedef /* see below */ iterator_category;
-};
-
-

- - Access - Category Tags -

-

- The access category types provided correspond to the following standard iterator - access concept combinations: -

-
readable_iterator_t :=
-
-  Readable Iterator
-
-writable_iterator_t :=
-
-  Writeable Iterator
-
-readable_writable_iterator_t :=
-
-  Readable Iterator & Writeable Iterator & Swappable Iterator
-
-readable_lvalue_iterator_t :=
-
-  Readable Iterator & Lvalue Iterator
-
-writeable_lvalue_iterator_t :=
-
-  Readable Iterator & Writeable Iterator & Swappable Iterator & Lvalue Iterator
-
-

- - Traits -

-

- The nested trait types are defined as follows: -

-
if (AccessCategory == readable_iterator_t)
-
-  value_type = Value
-  reference  = Value
-  pointer    = Value*
-
-else if (AccessCategory == writable_iterator_t)
-
-  value_type = void
-  reference  = void
-  pointer    = void
-
-else if (AccessCategory == readable_writable_iterator_t)
-
-  value_type = Value
-
-  reference :=
-
-    A type X that is convertible to Value for which the following
-    expression is valid. Given an object x of type X and v of type
-    Value.
-
-    x = v
-
-  pointer    = Value*
-
-else if (AccessCategory == readable_lvalue_iterator_t)
-
-  value_type = Value
-  reference  = Value const&
-  pointer    = Value const*
-
-else if (AccessCategory == writable_lvalue_iterator_t)
-
-  value_type = Value
-  reference  = Value&
-  pointer    = Value*
-
-if ( TraversalCategory is convertible to forward_traversal_tag )
-
-  difference_type := ptrdiff_t
-
-else
-
-  difference_type := unspecified type
-
-
-iterator_category :=
-
-  A type X satisfying the following two constraints:
-
-     1. X is convertible to X1, and not to any more-derived
-        type, where X1 is defined by:
-
-          if (reference is a reference type
-              && TraversalCategory is convertible to forward_traversal_tag)
-          {
-              if (TraversalCategory is convertible to random_access_traversal_tag)
-                  X1 = random_access_iterator_tag
-              else if (TraversalCategory is convertible to bidirectional_traversal_tag)
-                  X1 = bidirectional_iterator_tag
-              else
-                  X1 = forward_iterator_tag
-          }
-          else
-          {
-              if (TraversalCategory is convertible to single_pass_traversal_tag
-                  && reference != void)
-                  X1 = input_iterator_tag
-              else
-                  X1 = output_iterator_tag
-          }
-
-     2. X is convertible to TraversalCategory
-
-

- - Requirements -

-

- The AccessCategory argument - must be one of the predefined access category tags. The TraversalCategory - must be one of the standard traversal tags. The Value - type must satisfy the requirements of the iterator concept specified by - AccessCategory and TraversalCategory as implied by the nested - traits types. -

-

- - Concepts -

-

- iterator_archetype models - the iterator concepts specified by the AccessCategory - and TraversalCategory arguments. - iterator_archetype does not - model any other access concepts or any more derived traversal concepts. -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/utilities/concept_checking.html b/libs/iterator/doc/html/iterator/utilities/concept_checking.html deleted file mode 100644 index 346ccbd4a..000000000 --- a/libs/iterator/doc/html/iterator/utilities/concept_checking.html +++ /dev/null @@ -1,99 +0,0 @@ - - - -Concept Checking - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- The iterator concept checking classes provide a mechanism for a template - to report better error messages when a user instantiates the template with - a type that does not meet the requirements of the template. For an introduction - to using concept checking classes, see the documentation for the boost::concept_check - library. -

-

- - iterator_concepts.hpp Synopsis -

-
namespace boost_concepts {
-
-    // Iterator Access Concepts
-
-    template <typename Iterator>
-    class ReadableIteratorConcept;
-
-    template <
-        typename Iterator
-      , typename ValueType = std::iterator_traits<Iterator>::value_type
-    >
-    class WritableIteratorConcept;
-
-    template <typename Iterator>
-    class SwappableIteratorConcept;
-
-    template <typename Iterator>
-    class LvalueIteratorConcept;
-
-    // Iterator Traversal Concepts
-
-    template <typename Iterator>
-    class IncrementableIteratorConcept;
-
-    template <typename Iterator>
-    class SinglePassIteratorConcept;
-
-    template <typename Iterator>
-    class ForwardTraversalConcept;
-
-    template <typename Iterator>
-    class BidirectionalTraversalConcept;
-
-    template <typename Iterator>
-    class RandomAccessTraversalConcept;
-
-    // Interoperability
-
-    template <typename Iterator, typename ConstIterator>
-    class InteroperableIteratorConcept;
-
-}
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/utilities/traits.html b/libs/iterator/doc/html/iterator/utilities/traits.html deleted file mode 100644 index 89f3e2f47..000000000 --- a/libs/iterator/doc/html/iterator/utilities/traits.html +++ /dev/null @@ -1,101 +0,0 @@ - - - -Iterator Traits - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- std::iterator_traits provides access to five - associated types of any iterator: its value_type, - reference, pointer, iterator_category, - and difference_type. Unfortunately, - such a "multi-valued" traits template can be difficult to use in - a metaprogramming context. <boost/iterator/iterator_traits.hpp> - provides access to these types using a standard metafunctions_. -

-

- - Synopsis -

-

- Header <boost/iterator/iterator_traits.hpp>: -

-
template <class Iterator>
-struct iterator_value
-{
-    typedef typename
-      std::iterator_traits<Iterator>::value_type
-    type;
-};
-
-template <class Iterator>
-struct iterator_reference
-{
-    typedef typename
-      std::iterator_traits<Iterator>::reference
-    type;
-};
-
-template <class Iterator>
-struct iterator_pointer
-{
-    typedef typename
-      std::iterator_traits<Iterator>::pointer
-    type;
-};
-
-template <class Iterator>
-struct iterator_difference
-{
-    typedef typename
-      detail::iterator_traits<Iterator>::difference_type
-    type;
-};
-
-template <class Iterator>
-struct iterator_category
-{
-    typedef typename
-      detail::iterator_traits<Iterator>::iterator_category
-    type;
-};
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/utilities/utilities.html b/libs/iterator/doc/html/iterator/utilities/utilities.html deleted file mode 100644 index 432d559f3..000000000 --- a/libs/iterator/doc/html/iterator/utilities/utilities.html +++ /dev/null @@ -1,346 +0,0 @@ - - - -Iterator Utilities - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
-

-Traits -

-

- - Overview -

-

- Have you ever wanted to write a generic function that can operate on any - kind of dereferenceable object? If you have, you've probably run into the - problem of how to determine the type that the object "points at": -

-
template <class Dereferenceable>
-void f(Dereferenceable p)
-{
-    *what-goes-here?* value = \*p;
-    ...
-}
-
-

- - pointee -

-

- It turns out to be impossible to come up with a fully-general algorithm - to do determine what-goes-here directly, - but it is possible to require that pointee<Dereferenceable>::type - is correct. Naturally, pointee - has the same difficulty: it can't determine the appropriate ::type - reliably for all Dereferenceables, - but it makes very good guesses (it works for all pointers, standard and - boost smart pointers, and iterators), and when it guesses wrongly, it can - be specialized as necessary: -

-
namespace boost
-{
-  template <class T>
-  struct pointee<third_party_lib::smart_pointer<T> >
-  {
-      typedef T type;
-  };
-}
-
-

- - indirect_reference -

-

- indirect_reference<T>::type is rather more specialized than - pointee, and is meant to - be used to forward the result of dereferencing an object of its argument - type. Most dereferenceable types just return a reference to their pointee, - but some return proxy references or return the pointee by value. When that - information is needed, call on indirect_reference. -

-

- Both of these templates are essential to the correct functioning of indirect_iterator. -

-

- - minimum_category -

-

- minimum_category takes - two iterator categories or two iterator traversal tags and returns the - one that is the weakest (i.e. least advanced). For example: -

-
static_assert(
-    is_same<
-        minimum_category<
-            std::forward_iterator_tag,
-            std::random_access_iterator_tag
-        >::type,
-        std::forward_iterator_tag
-    >::value,
-    "Unexpected minimum_category result"
-);
-
-

- - Iterator - category and traversal tags manipulation -

-

- The library provides several utilities to simplify conversions between - iterator categories and traversal tags: -

-
    -
  • - iterator_category_to_traversal<C>::type - - the metafunction takes an iterator category C - and returns the corresponding traversal tag. -
  • -
  • - iterator_traversal<T>::type - - a shorthand for iterator_category_to_traversal<iterator_category<T>::type>::type. -
  • -
  • - pure_traversal_tag<T>::type - - the metafunction takes a tag T - which derives from one of the iterator traversal tags and returns that - traversal tag. T may - also derive from other tags describing the iterator (e.g. whether this - is a const-iterator or - not), these additional tags are not considered. -
  • -
  • - pure_iterator_traversal<T>::type - - a shorthand for pure_traversal_tag<iterator_traversal<T>::type>::type. -
  • -
-

- - Reference -

-

- - pointee -

-
template <class Dereferenceable>
-struct pointee
-{
-    typedef /* see below */ type;
-};
-
-

- Requires: For an object x of type Dereferenceable, - *x - is well-formed. If ++x - is ill-formed it shall neither be ambiguous nor shall it violate access - control, and Dereferenceable::element_type - shall be an accessible type. Otherwise iterator_traits<Dereferenceable>::value_type - shall be well formed. [Note: These requirements need not apply to explicit - or partial specializations of pointee] -

-

- type is determined according - to the following algorithm, where x - is an object of type Dereferenceable: -

-
if ( ++x is ill-formed )
-{
-    return Dereferenceable::element_type
-}
-else if (*x is a mutable reference to
-         std::iterator_traits<Dereferenceable>::value_type)
-{
-    return iterator_traits<Dereferenceable>::value_type
-}
-else
-{
-    return iterator_traits<Dereferenceable>::value_type const
-}
-
-

- - indirect_reference -

-
template <class Dereferenceable>
-struct indirect_reference
-{
-    typedef /* see below */ type;
-};
-
-

- Requires: For an object x of type Dereferenceable, - *x - is well-formed. If ++x - is ill-formed it shall neither be ambiguous nor shall it violate access - control, and pointee<Dereferenceable>::type& - shall be well-formed. Otherwise iterator_traits<Dereferenceable>::reference - shall be well formed. [Note: These requirements need not apply to explicit - or partial specializations of indirect_reference] -

-

- type is determined according - to the following algorithm, where x - is an object of type Dereferenceable: -

-
if ( ++x is ill-formed )
-    return pointee<Dereferenceable>::type&
-else
-    std::iterator_traits<Dereferenceable>::reference
-
-

- - minimum_category -

-
template <typename C1, typename C2>
-struct minimum_category
-{
-    typedef /* see below */ type;
-};
-
-

- Requires: Both C1 - and C2 shall be standard - iterator categories or iterator traversal tags. -

-

- type is determined according - to the following algorithm, where c1 - is an object of type C1 - and c2 is an object of - type C2: -

-
if (c1 is convertible to c2)
-    return C2;
-else
-    return C1;
-
-
- - - - - -
[Note]Note

- The above definition relies on the fact that the more restricting categories - and traversal tags are convertible to the less restricting ones. -

-

- - iterator_category_to_traversal -

-
template <typename C>
-struct iterator_category_to_traversal
-{
-    typedef /* see below */ type;
-};
-
-

- Requires: C - shall be a standard iterator category or an iterator traversal tag. -

-

- If C is an iterator traversal - tag or convertible to one, type - equivalent to C. Otherwise, - type is defined to the - closest iterator traversal tag matching C. -

-

- - iterator_traversal -

-
template <typename Iterator>
-struct iterator_traversal
-{
-    typedef typename iterator_category_to_traversal<
-        typename iterator_category<Iterator>::type
-    >::type type;
-};
-
-

- Requires: Iterator - shall be an iterator. -

-

- - pure_traversal_tag -

-
template <typename T>
-struct pure_traversal_tag
-{
-    typedef /* see below */ type;
-};
-
-

- Requires: T - shall be convertible to an iterator traversal tag. -

-

- type is defined to be the - most advanced traversal tag Tag - so that T is convertible - to Tag. -

-

- - pure_iterator_traversal -

-
template <typename Iterator>
-struct pure_iterator_traversal
-{
-    typedef typename pure_traversal_tag<
-        typename iterator_traversal<Iterator>::type
-    >::type type;
-};
-
-

- Requires: Iterator - shall be an iterator. -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/iterator/utilities/utilities/utilities_testing.html b/libs/iterator/doc/html/iterator/utilities/utilities/utilities_testing.html deleted file mode 100644 index 64135ac6c..000000000 --- a/libs/iterator/doc/html/iterator/utilities/utilities/utilities_testing.html +++ /dev/null @@ -1,146 +0,0 @@ - - - -Testing and Concept Checking - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- The iterator concept checking classes provide a mechanism for a template - to report better error messages when a user instantiates the template with - a type that does not meet the requirements of the template. -

-

- For an introduction to using concept checking classes, see the documentation - for the boost::concept_check - library. -

-

- - Reference -

-

- - Iterator - Access Concepts -

-
    -
  • - |Readable|_ -
  • -
  • - |Writable|_ -
  • -
  • - |Swappable|_ -
  • -
  • - |Lvalue|_ -
  • -
-

- Iterator Traversal Concepts ........................... -

-
    -
  • - |Incrementable|_ -
  • -
  • - |SinglePass|_ -
  • -
  • - |Forward|_ -
  • -
  • - |Bidir|_ -
  • -
  • - |Random|_ -
  • -
-

- - iterator_concepts.hpp Synopsis -

-
namespace boost_concepts {
-
-    // Iterator Access Concepts
-
-    template <typename Iterator>
-    class ReadableIteratorConcept;
-
-    template <
-        typename Iterator
-      , typename ValueType = std::iterator_traits<Iterator>::value_type
-    >
-    class WritableIteratorConcept;
-
-    template <typename Iterator>
-    class SwappableIteratorConcept;
-
-    template <typename Iterator>
-    class LvalueIteratorConcept;
-
-    // Iterator Traversal Concepts
-
-    template <typename Iterator>
-    class IncrementableIteratorConcept;
-
-    template <typename Iterator>
-    class SinglePassIteratorConcept;
-
-    template <typename Iterator>
-    class ForwardTraversalConcept;
-
-    template <typename Iterator>
-    class BidirectionalTraversalConcept;
-
-    template <typename Iterator>
-    class RandomAccessTraversalConcept;
-
-    // Interoperability
-
-    template <typename Iterator, typename ConstIterator>
-    class InteroperableIteratorConcept;
-
-}
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/iterator/doc/html/standalone_HTML.manifest b/libs/iterator/doc/html/standalone_HTML.manifest deleted file mode 100644 index b0d25ec64..000000000 --- a/libs/iterator/doc/html/standalone_HTML.manifest +++ /dev/null @@ -1,25 +0,0 @@ -index.html -iterator/concepts.html -iterator/concepts/concepts_traversal.html -iterator/generic.html -iterator/generic/adaptor.html -iterator/generic/adaptor/adaptor_tutorial.html -iterator/specialized.html -iterator/specialized/filter.html -iterator/specialized/function_output.html -iterator/specialized/indirect.html -iterator/specialized/permutation.html -iterator/specialized/reverse.html -iterator/specialized/shared_container.html -iterator/specialized/shared_container/shared_container_object_generator.html -iterator/specialized/shared_container/shared_container_generator.html -iterator/specialized/transform.html -iterator/specialized/zip.html -iterator/specialized/zip/zip_reference.html -iterator/utilities.html -iterator/utilities/concept_checking.html -iterator/utilities/traits.html -iterator/utilities/utilities.html -iterator/utilities/utilities/utilities_testing.html -iterator/upgrading.html -iterator/history.html diff --git a/libs/iterator/doc/index.html b/libs/iterator/doc/index.html deleted file mode 100644 index 7e7dd9aae..000000000 --- a/libs/iterator/doc/index.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - -The Boost.Iterator Library Boost - - - - - - - diff --git a/libs/iterator/doc/index.rst b/libs/iterator/doc/index.rst deleted file mode 100644 index 497d9af83..000000000 --- a/libs/iterator/doc/index.rst +++ /dev/null @@ -1,331 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -+++++++++++++++++++++++++++++++++++++++++++++++++ - The Boost.Iterator Library |(logo)|__ -+++++++++++++++++++++++++++++++++++++++++++++++++ - -.. |(logo)| image:: ../../../boost.png - :alt: Boost - -__ ../../../index.htm - - -------------------------------------- - - -:Authors: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com -:organizations: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, `Zephyr Associates, Inc.`_ -:date: $Date$ - -:copyright: Copyright David Abrahams, Jeremy Siek, Thomas Witt 2003. - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Zephyr Associates, Inc.`: http://www.styleadvisor.com - -:Abstract: The Boost Iterator Library contains two parts. The first - is a system of concepts_ which extend the C++ standard - iterator requirements. The second is a framework of - components for building iterators based on these - extended concepts and includes several useful iterator - adaptors. The extended iterator concepts have been - carefully designed so that old-style iterators - can fit in the new concepts and so that new-style - iterators will be compatible with old-style algorithms, - though algorithms may need to be updated if they want to - take full advantage of the new-style iterator - capabilities. Several components of this library have - been accepted into the C++ standard technical report. - The components of the Boost Iterator Library replace the - older Boost Iterator Adaptor Library. - -.. _concepts: http://www.boost.org/more/generic_programming.html#concept - -.. contents:: **Table of Contents** - - -------------------------------------- - - -===================== - New-Style Iterators -===================== - -The iterator categories defined in C++98 are extremely limiting -because they bind together two orthogonal concepts: traversal and -element access. For example, because a random access iterator is -required to return a reference (and not a proxy) when dereferenced, -it is impossible to capture the capabilities of -``vector::iterator`` using the C++98 categories. This is the -infamous "``vector`` is not a container, and its iterators -aren't random access iterators", debacle about which Herb Sutter -wrote two papers for the standards comittee (n1185_ and n1211_), -and a `Guru of the Week`__. New-style iterators go well beyond -patching up ``vector``, though: there are lots of other -iterators already in use which can't be adequately represented by -the existing concepts. For details about the new iterator -concepts, see our - -.. _n1185: http://www.gotw.ca/publications/N1185.pdf -.. _n1211: http://www.gotw.ca/publications/N1211.pdf -__ http://www.gotw.ca/gotw/050.htm - - - `Standard Proposal For New-Style Iterators`__ (PDF__) - -__ new-iter-concepts.html -__ new-iter-concepts.pdf - -============================= - Iterator Facade and Adaptor -============================= - -Writing standard-conforming iterators is tricky, but the need comes -up often. In order to ease the implementation of new iterators, -the Boost.Iterator library provides the |facade| class template, -which implements many useful defaults and compile-time checks -designed to help the iterator author ensure that his iterator is -correct. - -It is also common to define a new iterator that is similar to some -underlying iterator or iterator-like type, but that modifies some -aspect of the underlying type's behavior. For that purpose, the -library supplies the |adaptor| class template, which is specially -designed to take advantage of as much of the underlying type's -behavior as possible. - -The documentation for these two classes can be found at the following -web pages: - -* |facade|_ (PDF__) - -* |adaptor|_ (PDF__) - - -.. |facade| replace:: ``iterator_facade`` -.. _facade: iterator_facade.html -__ iterator_facade.pdf - -.. |adaptor| replace:: ``iterator_adaptor`` -.. _adaptor: iterator_adaptor.html -__ iterator_adaptor.pdf - -Both |facade| and |adaptor| as well as many of the `specialized -adaptors`_ mentioned below have been proposed for standardization, -and accepted into the first C++ technical report; see our - - `Standard Proposal For Iterator Facade and Adaptor`__ (PDF__) - -for more details. - -__ facade-and-adaptor.html -__ facade-and-adaptor.pdf - -====================== - Specialized Adaptors -====================== - -The iterator library supplies a useful suite of standard-conforming -iterator templates based on the Boost `iterator facade and adaptor`_. - -* |counting|_ (PDF__): an iterator over a sequence of consecutive values. - Implements a "lazy sequence" - -* |filter|_ (PDF__): an iterator over the subset of elements of some - sequence which satisfy a given predicate - -* |function_input|_ (PDF__): an input iterator wrapping a generator (nullary - function object); each time the iterator is dereferenced, the function object - is called to get the value to return. - -* |function_output|_ (PDF__): an output iterator wrapping a unary function - object; each time an element is written into the dereferenced - iterator, it is passed as a parameter to the function object. - -* |indirect|_ (PDF__): an iterator over the objects *pointed-to* by the - elements of some sequence. - -* |permutation|_ (PDF__): an iterator over the elements of some random-access - sequence, rearranged according to some sequence of integer indices. - -* |reverse|_ (PDF__): an iterator which traverses the elements of some - bidirectional sequence in reverse. Corrects many of the - shortcomings of C++98's ``std::reverse_iterator``. - -* |shared|_: an iterator over elements of a container whose - lifetime is maintained by a |shared_ptr|_ stored in the iterator. - -* |transform|_ (PDF__): an iterator over elements which are the result of - applying some functional transformation to the elements of an - underlying sequence. This component also replaces the old - ``projection_iterator_adaptor``. - -* |zip|_ (PDF__): an iterator over tuples of the elements at corresponding - positions of heterogeneous underlying iterators. - -.. |counting| replace:: ``counting_iterator`` -.. _counting: counting_iterator.html -__ counting_iterator.pdf - -.. |filter| replace:: ``filter_iterator`` -.. _filter: filter_iterator.html -__ filter_iterator.pdf - -.. |function_input| replace:: ``function_input_iterator`` -.. _function_input: function_input_iterator.html -__ function_input_iterator.pdf - -.. |function_output| replace:: ``function_output_iterator`` -.. _function_output: function_output_iterator.html -__ function_output_iterator.pdf - -.. |indirect| replace:: ``indirect_iterator`` -.. _indirect: indirect_iterator.html -__ indirect_iterator.pdf - -.. |permutation| replace:: ``permutation_iterator`` -.. _permutation: permutation_iterator.html -__ permutation_iterator.pdf - -.. |reverse| replace:: ``reverse_iterator`` -.. _reverse: reverse_iterator.html -__ reverse_iterator.pdf - -.. |shared| replace:: ``shared_container_iterator`` -.. _shared: ../../utility/shared_container_iterator.html - -.. |transform| replace:: ``transform_iterator`` -.. _transform: transform_iterator.html -__ transform_iterator.pdf - -.. |zip| replace:: ``zip_iterator`` -.. _zip: zip_iterator.html -__ zip_iterator.pdf - -.. |shared_ptr| replace:: ``shared_ptr`` -.. _shared_ptr: ../../smart_ptr/shared_ptr.htm - -==================== - Iterator Utilities -==================== - -Traits ------- - -* |pointee|_ (PDF__): Provides the capability to deduce the referent types - of pointers, smart pointers and iterators in generic code. Used - in |indirect|. - -* |iterator_traits|_ (PDF__): Provides MPL_\ -compatible metafunctions which - retrieve an iterator's traits. Also corrects for the deficiencies - of broken implementations of ``std::iterator_traits``. - -.. * |interoperable|_ (PDF__): Provides an MPL_\ -compatible metafunction for - testing iterator interoperability - -.. |pointee| replace:: ``pointee.hpp`` -.. _pointee: pointee.html -__ pointee.pdf - -.. |iterator_traits| replace:: ``iterator_traits.hpp`` -.. _iterator_traits: iterator_traits.html -__ iterator_traits.pdf - -.. |interoperable| replace:: ``interoperable.hpp`` -.. _interoperable: interoperable.html -.. comment! __ interoperable.pdf - -.. _MPL: ../../mpl/doc/index.html - -Testing and Concept Checking ----------------------------- - -* |iterator_concepts|_ (PDF__): Concept checking classes for the new iterator concepts. - -* |iterator_archetypes|_ (PDF__): Concept archetype classes for the new iterators concepts. - -.. |iterator_concepts| replace:: ``iterator_concepts.hpp`` -.. _iterator_concepts: iterator_concepts.html -__ iterator_concepts.pdf - -.. |iterator_archetypes| replace:: ``iterator_archetypes.hpp`` -.. _iterator_archetypes: iterator_archetypes.html -__ iterator_archetypes.pdf - -======================================================= - Upgrading from the old Boost Iterator Adaptor Library -======================================================= - -.. _Upgrading: - -If you have been using the old Boost Iterator Adaptor library to -implement iterators, you probably wrote a ``Policies`` class which -captures the core operations of your iterator. In the new library -design, you'll move those same core operations into the body of the -iterator class itself. If you were writing a family of iterators, -you probably wrote a `type generator`_ to build the -``iterator_adaptor`` specialization you needed; in the new library -design you don't need a type generator (though may want to keep it -around as a compatibility aid for older code) because, due to the -use of the Curiously Recurring Template Pattern (CRTP) [Cop95]_, -you can now define the iterator class yourself and acquire -functionality through inheritance from ``iterator_facade`` or -``iterator_adaptor``. As a result, you also get much finer control -over how your iterator works: you can add additional constructors, -or even override the iterator functionality provided by the -library. - -.. _`type generator`: http://www.boost.org/more/generic_programming.html#type_generator - -If you're looking for the old ``projection_iterator`` component, -its functionality has been merged into ``transform_iterator``: as -long as the function object's ``result_type`` (or the ``Reference`` -template argument, if explicitly specified) is a true reference -type, ``transform_iterator`` will behave like -``projection_iterator`` used to. - -========= - History -========= - -In 2000 Dave Abrahams was writing an iterator for a container of -pointers, which would access the pointed-to elements when -dereferenced. Naturally, being a library writer, he decided to -generalize the idea and the Boost Iterator Adaptor library was born. -Dave was inspired by some writings of Andrei Alexandrescu and chose a -policy based design (though he probably didn't capture Andrei's idea -very well - there was only one policy class for all the iterator's -orthogonal properties). Soon Jeremy Siek realized he would need the -library and they worked together to produce a "Boostified" version, -which was reviewed and accepted into the library. They wrote a paper -and made several important revisions of the code. - -Eventually, several shortcomings of the older library began to make -the need for a rewrite apparent. Dave and Jeremy started working -at the Santa Cruz C++ committee meeting in 2002, and had quickly -generated a working prototype. At the urging of Mat Marcus, they -decided to use the GenVoca/CRTP pattern approach, and moved the -policies into the iterator class itself. Thomas Witt expressed -interest and became the voice of strict compile-time checking for -the project, adding uses of the SFINAE technique to eliminate false -converting constructors and operators from the overload set. He -also recognized the need for a separate ``iterator_facade``, and -factored it out of ``iterator_adaptor``. Finally, after a -near-complete rewrite of the prototype, they came up with the -library you see today. - -.. [Cop95] [Coplien, 1995] Coplien, J., Curiously Recurring Template - Patterns, C++ Report, February 1995, pp. 24-27. - -.. - LocalWords: Abrahams Siek Witt const bool Sutter's WG int UL LI href Lvalue - LocalWords: ReadableIterator WritableIterator SwappableIterator cv pre iter - LocalWords: ConstantLvalueIterator MutableLvalueIterator CopyConstructible TR - LocalWords: ForwardTraversalIterator BidirectionalTraversalIterator lvalue - LocalWords: RandomAccessTraversalIterator dereferenceable Incrementable tmp - LocalWords: incrementable xxx min prev inplace png oldeqnew AccessTag struct - LocalWords: TraversalTag typename lvalues DWA Hmm JGS diff --git a/libs/iterator/doc/indirect_iterator.html b/libs/iterator/doc/indirect_iterator.html deleted file mode 100644 index 61d9c95fc..000000000 --- a/libs/iterator/doc/indirect_iterator.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - - -Indirect Iterator - - - - - - - -
-

Indirect Iterator

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2006-09-11
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
- - - - --- - - - -
abstract: - - -indirect_iterator adapts an iterator by applying an -extra dereference inside of operator*(). For example, this -iterator adaptor makes it possible to view a container of pointers -(e.g. list<foo*>) as if it were a container of the pointed-to type -(e.g. list<foo>). indirect_iterator depends on two -auxiliary traits, pointee and indirect_reference, to -provide support for underlying iterators whose value_type is -not an iterator.
- -
-

indirect_iterator synopsis

- - - -
-template <
-    class Iterator
-  , class Value = use_default
-  , class CategoryOrTraversal = use_default
-  , class Reference = use_default
-  , class Difference = use_default
->
-class indirect_iterator
-{
- public:
-    typedef /* see below */ value_type;
-    typedef /* see below */ reference;
-    typedef /* see below */ pointer;
-    typedef /* see below */ difference_type;
-    typedef /* see below */ iterator_category;
-
-    indirect_iterator();
-    indirect_iterator(Iterator x);
-
-    template <
-        class Iterator2, class Value2, class Category2
-      , class Reference2, class Difference2
-    >
-    indirect_iterator(
-        indirect_iterator<
-             Iterator2, Value2, Category2, Reference2, Difference2
-        > const& y
-      , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
-    );
-
-    Iterator const& base() const;
-    reference operator*() const;
-    indirect_iterator& operator++();
-    indirect_iterator& operator--();
-private:
-   Iterator m_iterator; // exposition
-};
-
-

The member types of indirect_iterator are defined according to -the following pseudo-code, where V is -iterator_traits<Iterator>::value_type

-
-if (Value is use_default) then
-    typedef remove_const<pointee<V>::type>::type value_type;
-else
-    typedef remove_const<Value>::type value_type;
-
-if (Reference is use_default) then
-    if (Value is use_default) then
-        typedef indirect_reference<V>::type reference;
-    else
-        typedef Value& reference;
-else
-    typedef Reference reference;
-
-if (Value is use_default) then
-    typedef pointee<V>::type* pointer;
-else
-    typedef Value* pointer;
-
-if (Difference is use_default)
-    typedef iterator_traits<Iterator>::difference_type difference_type;
-else
-    typedef Difference difference_type;
-
-if (CategoryOrTraversal is use_default)
-    typedef iterator-category (
-        iterator_traversal<Iterator>::type,``reference``,``value_type``
-    ) iterator_category;
-else
-    typedef iterator-category (
-        CategoryOrTraversal,``reference``,``value_type``
-    ) iterator_category;
-
-
-
-

indirect_iterator requirements

-

The expression *v, where v is an object of -iterator_traits<Iterator>::value_type, shall be valid -expression and convertible to reference. Iterator shall -model the traversal concept indicated by iterator_category. -Value, Reference, and Difference shall be chosen so -that value_type, reference, and difference_type meet -the requirements indicated by iterator_category.

-

[Note: there are further requirements on the -iterator_traits<Iterator>::value_type if the Value -parameter is not use_default, as implied by the algorithm for -deducing the default for the value_type member.]

-
-
-

indirect_iterator models

-

In addition to the concepts indicated by iterator_category -and by iterator_traversal<indirect_iterator>::type, a -specialization of indirect_iterator models the following -concepts, Where v is an object of -iterator_traits<Iterator>::value_type:

-
-
    -
  • Readable Iterator if reference(*v) is convertible to -value_type.
  • -
  • Writable Iterator if reference(*v) = t is a valid -expression (where t is an object of type -indirect_iterator::value_type)
  • -
  • Lvalue Iterator if reference is a reference type.
  • -
-
-

indirect_iterator<X,V1,C1,R1,D1> is interoperable with -indirect_iterator<Y,V2,C2,R2,D2> if and only if X is -interoperable with Y.

-
-
-

indirect_iterator operations

-

In addition to the operations required by the concepts described -above, specializations of indirect_iterator provide the -following operations.

-

indirect_iterator();

- --- - - - - - -
Requires:Iterator must be Default Constructible.
Effects:Constructs an instance of indirect_iterator with -a default-constructed m_iterator.
-

indirect_iterator(Iterator x);

- --- - - - -
Effects:Constructs an instance of indirect_iterator with -m_iterator copy constructed from x.
-
-template <
-    class Iterator2, class Value2, unsigned Access, class Traversal
-  , class Reference2, class Difference2
->
-indirect_iterator(
-    indirect_iterator<
-         Iterator2, Value2, Access, Traversal, Reference2, Difference2
-    > const& y
-  , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
-);
-
- --- - - - - - -
Requires:Iterator2 is implicitly convertible to Iterator.
Effects:Constructs an instance of indirect_iterator whose -m_iterator subobject is constructed from y.base().
-

Iterator const& base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Returns:**m_iterator
-

indirect_iterator& operator++();

- --- - - - - - -
Effects:++m_iterator
Returns:*this
-

indirect_iterator& operator--();

- --- - - - - - -
Effects:--m_iterator
Returns:*this
- - - -
-
-

Example

-

This example prints an array of characters, using -indirect_iterator to access the array of characters through an -array of pointers. Next indirect_iterator is used with the -transform algorithm to copy the characters (incremented by one) to -another array. A constant indirect iterator is used for the source and -a mutable indirect iterator is used for the destination. The last part -of the example prints the original array of characters, but this time -using the make_indirect_iterator helper function.

-
-char characters[] = "abcdefg";
-const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char
-char* pointers_to_chars[N];                        // at the end.
-for (int i = 0; i < N; ++i)
-  pointers_to_chars[i] = &characters[i];
-
-// Example of using indirect_iterator
-
-boost::indirect_iterator<char**, char>
-  indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N);
-
-std::copy(indirect_first, indirect_last, std::ostream_iterator<char>(std::cout, ","));
-std::cout << std::endl;
-
-
-// Example of making mutable and constant indirect iterators
-
-char mutable_characters[N];
-char* pointers_to_mutable_chars[N];
-for (int j = 0; j < N; ++j)
-  pointers_to_mutable_chars[j] = &mutable_characters[j];
-
-boost::indirect_iterator<char* const*> mutable_indirect_first(pointers_to_mutable_chars),
-  mutable_indirect_last(pointers_to_mutable_chars + N);
-boost::indirect_iterator<char* const*, char const> const_indirect_first(pointers_to_chars),
-  const_indirect_last(pointers_to_chars + N);
-
-std::transform(const_indirect_first, const_indirect_last,
-               mutable_indirect_first, std::bind1st(std::plus<char>(), 1));
-
-std::copy(mutable_indirect_first, mutable_indirect_last,
-          std::ostream_iterator<char>(std::cout, ","));
-std::cout << std::endl;
-
-
-// Example of using make_indirect_iterator()
-
-std::copy(boost::make_indirect_iterator(pointers_to_chars),
-          boost::make_indirect_iterator(pointers_to_chars + N),
-          std::ostream_iterator<char>(std::cout, ","));
-std::cout << std::endl;
-
-

The output is:

-
-a,b,c,d,e,f,g,
-b,c,d,e,f,g,h,
-a,b,c,d,e,f,g,
-
-

The source code for this example can be found here.

-
-
- - - diff --git a/libs/iterator/doc/indirect_iterator.pdf b/libs/iterator/doc/indirect_iterator.pdf deleted file mode 100644 index 3cdcbd9e7baf329d669f9183b559274aa2880bf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75031 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

rDonfw1RF{^yzHB=g+#ZQhz8O07666fV&T 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 a@Nr0YT$mB>E24pCXd%?RymA`y)c*&VzzLH8 diff --git a/libs/iterator/doc/indirect_iterator.rst b/libs/iterator/doc/indirect_iterator.rst deleted file mode 100644 index 91328e097..000000000 --- a/libs/iterator/doc/indirect_iterator.rst +++ /dev/null @@ -1,34 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -+++++++++++++++++++ - Indirect Iterator -+++++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, University of Hanover `Institute for Transport - Railway Operation and Construction`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de - -:abstract: - - .. include:: indirect_iterator_abstract.rst - -.. contents:: Table of Contents - -``indirect_iterator`` synopsis -.............................. - -.. include:: indirect_iterator_ref.rst -.. include:: indirect_iterator_eg.rst - -.. _iterator-category: iterator_facade.html#iterator-category -.. |iterator-category| replace:: *iterator-category* diff --git a/libs/iterator/doc/indirect_iterator_abstract.rst b/libs/iterator/doc/indirect_iterator_abstract.rst deleted file mode 100644 index 61fe0161c..000000000 --- a/libs/iterator/doc/indirect_iterator_abstract.rst +++ /dev/null @@ -1,15 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -``indirect_iterator`` adapts an iterator by applying an -*extra* dereference inside of ``operator*()``. For example, this -iterator adaptor makes it possible to view a container of pointers -(e.g. ``list``) as if it were a container of the pointed-to type -(e.g. ``list``). ``indirect_iterator`` depends on two -auxiliary traits, ``pointee`` and ``indirect_reference``, to -provide support for underlying iterators whose ``value_type`` is -not an iterator. - - - diff --git a/libs/iterator/doc/indirect_iterator_eg.rst b/libs/iterator/doc/indirect_iterator_eg.rst deleted file mode 100644 index 1cb00c0df..000000000 --- a/libs/iterator/doc/indirect_iterator_eg.rst +++ /dev/null @@ -1,73 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Example -....... - -This example prints an array of characters, using -``indirect_iterator`` to access the array of characters through an -array of pointers. Next ``indirect_iterator`` is used with the -``transform`` algorithm to copy the characters (incremented by one) to -another array. A constant indirect iterator is used for the source and -a mutable indirect iterator is used for the destination. The last part -of the example prints the original array of characters, but this time -using the ``make_indirect_iterator`` helper function. - - -:: - - char characters[] = "abcdefg"; - const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char - char* pointers_to_chars[N]; // at the end. - for (int i = 0; i < N; ++i) - pointers_to_chars[i] = &characters[i]; - - // Example of using indirect_iterator - - boost::indirect_iterator - indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N); - - std::copy(indirect_first, indirect_last, std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - - // Example of making mutable and constant indirect iterators - - char mutable_characters[N]; - char* pointers_to_mutable_chars[N]; - for (int j = 0; j < N; ++j) - pointers_to_mutable_chars[j] = &mutable_characters[j]; - - boost::indirect_iterator mutable_indirect_first(pointers_to_mutable_chars), - mutable_indirect_last(pointers_to_mutable_chars + N); - boost::indirect_iterator const_indirect_first(pointers_to_chars), - const_indirect_last(pointers_to_chars + N); - - std::transform(const_indirect_first, const_indirect_last, - mutable_indirect_first, std::bind1st(std::plus(), 1)); - - std::copy(mutable_indirect_first, mutable_indirect_last, - std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - - // Example of using make_indirect_iterator() - - std::copy(boost::make_indirect_iterator(pointers_to_chars), - boost::make_indirect_iterator(pointers_to_chars + N), - std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - -The output is:: - - a,b,c,d,e,f,g, - b,c,d,e,f,g,h, - a,b,c,d,e,f,g, - - -The source code for this example can be found `here`__. - -__ ../example/indirect_iterator_example.cpp - diff --git a/libs/iterator/doc/indirect_iterator_ref.rst b/libs/iterator/doc/indirect_iterator_ref.rst deleted file mode 100644 index d1430e155..000000000 --- a/libs/iterator/doc/indirect_iterator_ref.rst +++ /dev/null @@ -1,181 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -:: - - template < - class Iterator - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class indirect_iterator - { - public: - typedef /* see below */ value_type; - typedef /* see below */ reference; - typedef /* see below */ pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - - indirect_iterator(); - indirect_iterator(Iterator x); - - template < - class Iterator2, class Value2, class Category2 - , class Reference2, class Difference2 - > - indirect_iterator( - indirect_iterator< - Iterator2, Value2, Category2, Reference2, Difference2 - > const& y - , typename enable_if_convertible::type* = 0 // exposition - ); - - Iterator const& base() const; - reference operator*() const; - indirect_iterator& operator++(); - indirect_iterator& operator--(); - private: - Iterator m_iterator; // exposition - }; - - -The member types of ``indirect_iterator`` are defined according to -the following pseudo-code, where ``V`` is -``iterator_traits::value_type`` - -.. parsed-literal:: - - if (Value is use_default) then - typedef remove_const::type>::type value_type; - else - typedef remove_const::type value_type; - - if (Reference is use_default) then - if (Value is use_default) then - typedef indirect_reference::type reference; - else - typedef Value& reference; - else - typedef Reference reference; - - if (Value is use_default) then - typedef pointee::type\* pointer; - else - typedef Value\* pointer; - - if (Difference is use_default) - typedef iterator_traits::difference_type difference_type; - else - typedef Difference difference_type; - - if (CategoryOrTraversal is use_default) - typedef *iterator-category* ( - iterator_traversal::type,``reference``,``value_type`` - ) iterator_category; - else - typedef *iterator-category* ( - CategoryOrTraversal,``reference``,``value_type`` - ) iterator_category; - - -``indirect_iterator`` requirements -.................................. - -The expression ``*v``, where ``v`` is an object of -``iterator_traits::value_type``, shall be valid -expression and convertible to ``reference``. ``Iterator`` shall -model the traversal concept indicated by ``iterator_category``. -``Value``, ``Reference``, and ``Difference`` shall be chosen so -that ``value_type``, ``reference``, and ``difference_type`` meet -the requirements indicated by ``iterator_category``. - -[Note: there are further requirements on the -``iterator_traits::value_type`` if the ``Value`` -parameter is not ``use_default``, as implied by the algorithm for -deducing the default for the ``value_type`` member.] - -``indirect_iterator`` models -............................ - -In addition to the concepts indicated by ``iterator_category`` -and by ``iterator_traversal::type``, a -specialization of ``indirect_iterator`` models the following -concepts, Where ``v`` is an object of -``iterator_traits::value_type``: - - * Readable Iterator if ``reference(*v)`` is convertible to - ``value_type``. - - * Writable Iterator if ``reference(*v) = t`` is a valid - expression (where ``t`` is an object of type - ``indirect_iterator::value_type``) - - * Lvalue Iterator if ``reference`` is a reference type. - -``indirect_iterator`` is interoperable with -``indirect_iterator`` if and only if ``X`` is -interoperable with ``Y``. - - -``indirect_iterator`` operations -................................ - -In addition to the operations required by the concepts described -above, specializations of ``indirect_iterator`` provide the -following operations. - - -``indirect_iterator();`` - -:Requires: ``Iterator`` must be Default Constructible. -:Effects: Constructs an instance of ``indirect_iterator`` with - a default-constructed ``m_iterator``. - - -``indirect_iterator(Iterator x);`` - -:Effects: Constructs an instance of ``indirect_iterator`` with - ``m_iterator`` copy constructed from ``x``. - -:: - - template < - class Iterator2, class Value2, unsigned Access, class Traversal - , class Reference2, class Difference2 - > - indirect_iterator( - indirect_iterator< - Iterator2, Value2, Access, Traversal, Reference2, Difference2 - > const& y - , typename enable_if_convertible::type* = 0 // exposition - ); - -:Requires: ``Iterator2`` is implicitly convertible to ``Iterator``. -:Effects: Constructs an instance of ``indirect_iterator`` whose - ``m_iterator`` subobject is constructed from ``y.base()``. - - -``Iterator const& base() const;`` - -:Returns: ``m_iterator`` - - -``reference operator*() const;`` - -:Returns: ``**m_iterator`` - - -``indirect_iterator& operator++();`` - -:Effects: ``++m_iterator`` -:Returns: ``*this`` - - -``indirect_iterator& operator--();`` - -:Effects: ``--m_iterator`` -:Returns: ``*this`` diff --git a/libs/iterator/doc/indirect_reference_ref.rst b/libs/iterator/doc/indirect_reference_ref.rst deleted file mode 100644 index f222d7e69..000000000 --- a/libs/iterator/doc/indirect_reference_ref.rst +++ /dev/null @@ -1,29 +0,0 @@ -.. Copyright David Abrahams 2004. 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) - -:: - - template - struct indirect_reference - { - typedef /* see below */ type; - }; - -:Requires: For an object ``x`` of type ``Dereferenceable``, ``*x`` - is well-formed. If ``++x`` is ill-formed it shall neither be - ambiguous nor shall it violate access control, and - ``pointee::type&`` shall be well-formed. - Otherwise ``iterator_traits::reference`` shall - be well formed. [Note: These requirements need not apply to - explicit or partial specializations of ``indirect_reference``] - -``type`` is determined according to the following algorithm, where -``x`` is an object of type ``Dereferenceable``:: - - if ( ++x is ill-formed ) - return ``pointee::type&`` - else - std::iterator_traits::reference - - \ No newline at end of file diff --git a/libs/iterator/doc/interoperability-revisited.rst b/libs/iterator/doc/interoperability-revisited.rst deleted file mode 100644 index 6fb6acf7e..000000000 --- a/libs/iterator/doc/interoperability-revisited.rst +++ /dev/null @@ -1,238 +0,0 @@ -++++++++++++++++++++++++++++ - Interoperability Revisited -++++++++++++++++++++++++++++ - -:date: $Date$ -:copyright: Copyright Thomas Witt 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) - -Problem -======= - -The current iterator_facade specification makes it unneccessarily tedious to -implement interoperable iterators. - -In the following text a simplified example of the current iterator_facade specification is used to -illustrate the problem. - -In the current specification binary operators are implemented in the following way:: - - template - struct Facade - { - }; - - template - struct is_interoperable : - or_< - is_convertible - , is_convertible - > - {}; - - template< - class Derived1 - , class Derived2 - > - enable_if, bool> operator==( - Derived1 const& lhs - , Derived2 const& rhs - ) - { - return static_cast(lhs).equal_to(static_cast - { - bool equal_to(Mutable const&); - }; - - struct Constant : Facade - { - Constant(); - Constant(Constant const&); - Constant(Mutable const&); - - ... - - bool equal_to(Constant const&); - }; - - Constant c; - Mutable m; - - c == m; // ok, dispatched to Constant::equal_to - m == c; // !! error, dispatched to Mutable::equal_to - - Instead the following "slightly" more complicated implementation is necessary - - struct Mutable : Facade - { - template - enable_if || is_convertible, bool>::type equal_to(T const&); - }; - - struct Constant : Tag - { - Constant(); - Constant(Constant const&); - Constant(Mutable const&); - - template - enable_if || is_convertible, bool>::type equal_to(T const&); - }; - -Beside the fact that the code is significantly more complex to understand and to teach there is -a major design problem lurking here. Note that in both types equal_to is a function template with -an unconstrained argument T. This is necessary so that further types can be made interoperable with -Mutable or Constant. Would Mutable be defined as :: - - struct Mutable : Facade - { - bool equal_to(Mutable const&); - bool equal_to(Constant const&); - }; - -Constant and Mutable would still be interoperable but no further interoperable could be added -without changing Mutable. Even if this would be considered acceptable the current specification forces -a two way dependency between interoperable types. Note in the templated equal_to case this dependency -is implicitly created when specializing equal_to. - -Solution -======== - -The two way dependency can be avoided by enabling type conversion in the binary operator -implementation. Note that this is the usual way interoperability betwween types is achieved -for binary operators and one reason why binary operators are usually implemented as non-members. - -A simple implementation of this strategy would look like this :: - - template< - class T1 - , class T2 - > - struct interoperable_base : - if_< - is_convertible< - T2 - , T1 - > - , T1 - , T2> - {}; - - - template< - class Derived1 - , class Derived2 - > - enable_if, bool> operator==( - Derived1 const& lhs - , Derived2 const& rhs - ) - { - typedef interoperable_base< - Derived1 - , Derived2 - >::type Base; - - return static_cast(lhs).equal_to(static_cast - enable_if, bool> operator==( - Derived1 const& lhs - , Derived2 const& rhs - ) - { - return static_cast(lhs).equal_to(static_cast - enable_if, bool> operator==( - Derived1 const& lhs - , Derived2 const& rhs - ) - { - return static_cast(rhs).equal_to(static_cast - { - Constant(); - Constant(Constant const&); - Constant(Mutable const&); - - ... - - bool equal_to(Constant const&); - bool equal_to(Mutable const&); - }; - - c == m; // ok, dispatched to Constant::equal_to(Mutable const&), no conversion - m == c; // ok, dispatched to Constant::equal_to(Mutable const&), no conversion - -This definition of operator== introduces a possible ambiguity when both types are convertible -to each other. I don't think this is a problem as this behaviour is the same with concrete types. -I.e. :: - - struct A {}; - - bool operator==(A, A); - - struct B { B(A); }; - - bool operator==(B, B); - - A a; - B b(a); - - a == b; // error, ambiguous overload - -Effect -====== - -Iterator implementations using iterator_facade look exactly as if they were -"hand-implemented" (I am working on better wording). - -a) Less burden for the user - -b) The definition (standardese) of specialized adpters might be easier - (This has to be proved yet) diff --git a/libs/iterator/doc/issues.rst b/libs/iterator/doc/issues.rst deleted file mode 100644 index a36f5a9ad..000000000 --- a/libs/iterator/doc/issues.rst +++ /dev/null @@ -1,152 +0,0 @@ -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - Problem with ``is_writable`` and ``is_swappable`` in N1550_ -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -.. _N1550: http://www.boost-consulting.com/writing/n1550.html -.. _N1530: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1530.html - -:Author: David Abrahams and Jeremy Siek -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu -:Organization: `Boost Consulting`_, Indiana University Bloomington -:date: $Date$ -:Copyright: Copyright David Abrahams, Jeremy Siek 2003. 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) - -.. _`Boost Consulting`: http://www.boost-consulting.com - -.. contents:: Table of Contents - -============== - Introduction -============== - -The ``is_writable`` and ``is_swappable`` traits classes in N1550_ -provide a mechanism for determining at compile time if an iterator -type is a model of the new Writable Iterator and Swappable Iterator -concepts, analogous to ``iterator_traits::iterator_category`` -for the old iterator concepts. For backward compatibility, -``is_writable`` and ``is_swappable`` not only work with new -iterators, but they also are intended to work for old -iterators (iterators that meet the requirements for one of the -iterator concepts in the current standard). In the case of old -iterators, the writability and swapability is deduced based on the -``iterator_category`` and also the ``reference`` type. The -specification for this deduction gives false positives for forward -iterators that have non-assignable value types. - -To review, the part of the ``is_writable`` trait definition which -applies to old iterators is:: - - if (cat is convertible to output_iterator_tag) - return true; - else if (cat is convertible to forward_iterator_tag - and iterator_traits::reference is a - mutable reference) - return true; - else - return false; - -Suppose the ``value_type`` of the iterator ``It`` has a private -assignment operator:: - - class B { - public: - ... - private: - B& operator=(const B&); - }; - -and suppose the ``reference`` type of the iterator is ``B&``. In -that case, ``is_writable::value`` will be true when in fact -attempting to write into ``B`` will cause an error. - -The same problem applies to ``is_swappable``. - - -==================== - Proposed Resolution -==================== - -1. Remove the ``is_writable`` and ``is_swappable`` traits, and remove the - requirements in the Writable Iterator and Swappable Iterator concepts - that require their models to support these traits. - -2. Change the ``is_readable`` specification to be: - ``is_readable::type`` is ``true_type`` if the - result type of ``X::operator*`` is convertible to - ``iterator_traits::value_type`` and is ``false_type`` - otherwise. Also, ``is_readable`` is required to satisfy - the requirements for the UnaryTypeTrait concept - (defined in the type traits proposal). - - Remove the requirement for support of the ``is_readable`` trait from - the Readable Iterator concept. - - -3. Remove the ``iterator_tag`` class. - -4. Change the specification of ``traversal_category`` to:: - - traversal-category(Iterator) = - let cat = iterator_traits::iterator_category - if (cat is convertible to incrementable_iterator_tag) - return cat; // Iterator is a new iterator - else if (cat is convertible to random_access_iterator_tag) - return random_access_traversal_tag; - else if (cat is convertible to bidirectional_iterator_tag) - return bidirectional_traversal_tag; - else if (cat is convertible to forward_iterator_tag) - return forward_traversal_tag; - else if (cat is convertible to input_iterator_tag) - return single_pass_iterator_tag; - else if (cat is convertible to output_iterator_tag) - return incrementable_iterator_tag; - else - return null_category_tag; - - -========== - Rationale -========== - -1. There are two reasons for removing ``is_writable`` - and ``is_swappable``. The first is that we do not know of - a way to fix the specification so that it gives the correct - answer for all iterators. Second, there was only a weak - motivation for having ``is_writable`` and ``is_swappable`` - there in the first place. The main motivation was simply - uniformity: we have tags for the old iterator categories - so we should have tags for the new iterator categories. - While having tags and the capability to dispatch based - on the traversal categories is often used, we see - less of a need for dispatching based on writability - and swappability, since typically algorithms - that need these capabilities have no alternative if - they are not provided. - -2. We discovered that the ``is_readable`` trait can be implemented - using only the iterator type itself and its ``value_type``. - Therefore we remove the requirement for ``is_readable`` from the - Readable Iterator concept, and change the definition of - ``is_readable`` so that it works for any iterator type. - -3. The purpose of the ``iterator_tag`` class was to - bundle the traversal and access category tags - into the ``iterator_category`` typedef. - With ``is_writable`` and ``is_swappable`` gone, and - ``is_readable`` no longer in need of special hints, - there is no reason for iterators to provide - information about the access capabilities of an iterator. - Thus there is no need for the ``iterator_tag``. The - traversal tag can be directly used for the - ``iterator_category``. If a new iterator is intended to be backward - compatible with old iterator concepts, a tag type - that is convertible to both one of the new traversal tags - and also to an old iterator tag can be created and use - for the ``iterator_category``. - -4. The changes to the specification of ``traversal_category`` are a - direct result of the removal of ``iterator_tag``. - diff --git a/libs/iterator/doc/iterator_adaptor.html b/libs/iterator/doc/iterator_adaptor.html deleted file mode 100644 index e023d82aa..000000000 --- a/libs/iterator/doc/iterator_adaptor.html +++ /dev/null @@ -1,461 +0,0 @@ - - - - - - -Iterator Adaptor - - - - - - - -

-

Iterator Adaptor

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2006-09-11
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
- - - - --- - - - -
abstract:
- - - - - -

Each specialization of the iterator_adaptor class template is derived from -a specialization of iterator_facade. The core interface functions -expected by iterator_facade are implemented in terms of the -iterator_adaptor's Base template parameter. A class derived -from iterator_adaptor typically redefines some of the core -interface functions to adapt the behavior of the Base type. -Whether the derived class models any of the standard iterator concepts -depends on the operations supported by the Base type and which -core interface functions of iterator_facade are redefined in the -Derived class.

- -
-

Overview

- - - - - -

The iterator_adaptor class template adapts some Base1 -type to create a new iterator. Instantiations of iterator_adaptor -are derived from a corresponding instantiation of iterator_facade -and implement the core behaviors in terms of the Base type. In -essence, iterator_adaptor merely forwards all operations to an -instance of the Base type, which it stores as a member.

- - - - - -
[1](1, 2) The term "Base" here does not refer to a base class and is -not meant to imply the use of derivation. We have followed the lead -of the standard library, which provides a base() function to access -the underlying iterator object of a reverse_iterator adaptor.
-

The user of iterator_adaptor creates a class derived from an -instantiation of iterator_adaptor and then selectively -redefines some of the core member functions described in the -iterator_facade core requirements table. The Base type need -not meet the full requirements for an iterator; it need only -support the operations used by the core interface functions of -iterator_adaptor that have not been redefined in the user's -derived class.

-

Several of the template parameters of iterator_adaptor default -to use_default. This allows the -user to make use of a default parameter even when she wants to -specify a parameter later in the parameter list. Also, the -defaults for the corresponding associated types are somewhat -complicated, so metaprogramming is required to compute them, and -use_default can help to simplify the implementation. Finally, -the identity of the use_default type is not left unspecified -because specification helps to highlight that the Reference -template parameter may not always be identical to the iterator's -reference type, and will keep users from making mistakes based on -that assumption.

-
-
-

Reference

- - - - - -
-template <
-    class Derived
-  , class Base
-  , class Value               = use_default
-  , class CategoryOrTraversal = use_default
-  , class Reference           = use_default
-  , class Difference = use_default
->
-class iterator_adaptor
-  : public iterator_facade<Derived, V', C', R', D'> // see details
-{
-    friend class iterator_core_access;
- public:
-    iterator_adaptor();
-    explicit iterator_adaptor(Base const& iter);
-    typedef Base base_type;
-    Base const& base() const;
- protected:
-    typedef iterator_adaptor iterator_adaptor_;
-    Base const& base_reference() const;
-    Base& base_reference();
- private: // Core iterator interface for iterator_facade.
-    typename iterator_adaptor::reference dereference() const;
-
-    template <
-    class OtherDerived, class OtherIterator, class V, class C, class R, class D
-    >
-    bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
-
-    void advance(typename iterator_adaptor::difference_type n);
-    void increment();
-    void decrement();
-
-    template <
-        class OtherDerived, class OtherIterator, class V, class C, class R, class D
-    >
-    typename iterator_adaptor::difference_type distance_to(
-        iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
-
- private:
-    Base m_iterator; // exposition only
-};
-
-
-

iterator_adaptor requirements

-

static_cast<Derived*>(iterator_adaptor*) shall be well-formed. -The Base argument shall be Assignable and Copy Constructible.

-
-
-

iterator_adaptor base class parameters

-

The V', C', R', and D' parameters of the iterator_facade -used as a base class in the summary of iterator_adaptor -above are defined as follows:

-
-V' = if (Value is use_default)
-          return iterator_traits<Base>::value_type
-      else
-          return Value
-
-C' = if (CategoryOrTraversal is use_default)
-          return iterator_traversal<Base>::type
-      else
-          return CategoryOrTraversal
-
-R' = if (Reference is use_default)
-          if (Value is use_default)
-              return iterator_traits<Base>::reference
-          else
-              return Value&
-      else
-          return Reference
-
-D' = if (Difference is use_default)
-          return iterator_traits<Base>::difference_type
-      else
-          return Difference
-
- - - -
-
-

iterator_adaptor public operations

-

iterator_adaptor();

- --- - - - - - -
Requires:The Base type must be Default Constructible.
Returns:An instance of iterator_adaptor with -m_iterator default constructed.
-

explicit iterator_adaptor(Base const& iter);

- --- - - - -
Returns:An instance of iterator_adaptor with -m_iterator copy constructed from iter.
-

Base const& base() const;

- --- - - - -
Returns:m_iterator
-
-
-

iterator_adaptor protected member functions

-

Base const& base_reference() const;

- --- - - - -
Returns:A const reference to m_iterator.
-

Base& base_reference();

- --- - - - -
Returns:A non-const reference to m_iterator.
-
-
-

iterator_adaptor private member functions

-

typename iterator_adaptor::reference dereference() const;

- --- - - - -
Returns:*m_iterator
-
-template <
-class OtherDerived, class OtherIterator, class V, class C, class R, class D
->
-bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
-
- --- - - - -
Returns:m_iterator == x.base()
-

void advance(typename iterator_adaptor::difference_type n);

- --- - - - -
Effects:m_iterator += n;
-

void increment();

- --- - - - -
Effects:++m_iterator;
-

void decrement();

- --- - - - -
Effects:--m_iterator;
-
-template <
-    class OtherDerived, class OtherIterator, class V, class C, class R, class D
->
-typename iterator_adaptor::difference_type distance_to(
-    iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
-
- --- - - - -
Returns:y.base() - m_iterator
-
-
-
-

Tutorial Example

- - - -

In this section we'll further refine the node_iter class -template we developed in the iterator_facade tutorial. If you haven't already -read that material, you should go back now and check it out because -we're going to pick up right where it left off.

- -

You probably didn't think of it this way, but the node_base* -object that underlies node_iterator is itself an iterator, -just like all other pointers. If we examine that pointer closely -from an iterator perspective, we can see that it has much in common -with the node_iterator we're building. First, they share most -of the same associated types (value_type, reference, -pointer, and difference_type). Second, even some of the -core functionality is the same: operator* and operator== on -the node_iterator return the result of invoking the same -operations on the underlying pointer, via the node_iterator's -dereference and equal member functions). The only real behavioral difference -between node_base* and node_iterator can be observed when -they are incremented: node_iterator follows the -m_next pointer, while node_base* just applies an address offset.

-

It turns out that the pattern of building an iterator on another -iterator-like type (the Base1 type) while modifying -just a few aspects of the underlying type's behavior is an -extremely common one, and it's the pattern addressed by -iterator_adaptor. Using iterator_adaptor is very much like -using iterator_facade, but because iterator_adaptor tries to -mimic as much of the Base type's behavior as possible, we -neither have to supply a Value argument, nor implement any core -behaviors other than increment. The implementation of -node_iter is thus reduced to:

-
-template <class Value>
-class node_iter
-  : public boost::iterator_adaptor<
-        node_iter<Value>                // Derived
-      , Value*                          // Base
-      , boost::use_default              // Value
-      , boost::forward_traversal_tag    // CategoryOrTraversal
-    >
-{
- private:
-    struct enabler {};  // a private type avoids misuse
-
- public:
-    node_iter()
-      : node_iter::iterator_adaptor_(0) {}
-
-    explicit node_iter(Value* p)
-      : node_iter::iterator_adaptor_(p) {}
-
-    template <class OtherValue>
-    node_iter(
-        node_iter<OtherValue> const& other
-      , typename boost::enable_if<
-            boost::is_convertible<OtherValue*,Value*>
-          , enabler
-        >::type = enabler()
-    )
-      : node_iter::iterator_adaptor_(other.base()) {}
-
- private:
-    friend class boost::iterator_core_access;
-    void increment() { this->base_reference() = this->base()->next(); }
-};
-
-

Note the use of node_iter::iterator_adaptor_ here: because -iterator_adaptor defines a nested iterator_adaptor_ type -that refers to itself, that gives us a convenient way to refer to -the complicated base class type of node_iter<Value>. [Note: -this technique is known not to work with Borland C++ 5.6.4 and -Metrowerks CodeWarrior versions prior to 9.0]

-

You can see an example program that exercises this version of the -node iterators here.

-

In the case of node_iter, it's not very compelling to pass -boost::use_default as iterator_adaptor's Value -argument; we could have just passed node_iter's Value -along to iterator_adaptor, and that'd even be shorter! Most -iterator class templates built with iterator_adaptor are -parameterized on another iterator type, rather than on its -value_type. For example, boost::reverse_iterator takes an -iterator type argument and reverses its direction of traversal, -since the original iterator and the reversed one have all the same -associated types, iterator_adaptor's delegation of default -types to its Base saves the implementor of -boost::reverse_iterator from writing:

-
-std::iterator_traits<Iterator>::some-associated-type
-
-

at least four times.

-

We urge you to review the documentation and implementations of -reverse_iterator and the other Boost specialized iterator -adaptors to get an idea of the sorts of things you can do with -iterator_adaptor. In particular, have a look at -transform_iterator, which is perhaps the most straightforward -adaptor, and also counting_iterator, which demonstrates that -iterator_adaptor's Base type needn't be an iterator.

-
-
- - - diff --git a/libs/iterator/doc/iterator_adaptor.pdf b/libs/iterator/doc/iterator_adaptor.pdf deleted file mode 100644 index 24582c19e011038f781e81e0f17c6742239aa602..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100117 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 diff --git a/libs/iterator/doc/iterator_adaptor.rst b/libs/iterator/doc/iterator_adaptor.rst deleted file mode 100644 index 4f8ca0178..000000000 --- a/libs/iterator/doc/iterator_adaptor.rst +++ /dev/null @@ -1,41 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -+++++++++++++++++ - Iterator Adaptor -+++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, University of Hanover `Institute for Transport - Railway Operation and Construction`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de - -:abstract: - -.. include:: iterator_adaptor_abstract.rst - -.. contents:: Table of Contents - -Overview -======== - -.. include:: iterator_adaptor_body.rst - - -Reference -========= - -.. include:: iterator_adaptor_ref.rst - -Tutorial Example -================ - -.. include:: iterator_adaptor_tutorial.rst diff --git a/libs/iterator/doc/iterator_adaptor_abstract.rst b/libs/iterator/doc/iterator_adaptor_abstract.rst deleted file mode 100644 index fa887f216..000000000 --- a/libs/iterator/doc/iterator_adaptor_abstract.rst +++ /dev/null @@ -1,19 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -.. Version 1.1 of this ReStructuredText document corresponds to - n1530_, the paper accepted by the LWG. - -.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. - -Each specialization of the ``iterator_adaptor`` class template is derived from -a specialization of ``iterator_facade``. The core interface functions -expected by ``iterator_facade`` are implemented in terms of the -``iterator_adaptor``\ 's ``Base`` template parameter. A class derived -from ``iterator_adaptor`` typically redefines some of the core -interface functions to adapt the behavior of the ``Base`` type. -Whether the derived class models any of the standard iterator concepts -depends on the operations supported by the ``Base`` type and which -core interface functions of ``iterator_facade`` are redefined in the -``Derived`` class. diff --git a/libs/iterator/doc/iterator_adaptor_body.rst b/libs/iterator/doc/iterator_adaptor_body.rst deleted file mode 100644 index ddd7f7b40..000000000 --- a/libs/iterator/doc/iterator_adaptor_body.rst +++ /dev/null @@ -1,43 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -.. Version 1.2 of this ReStructuredText document corresponds to - n1530_, the paper accepted by the LWG for TR1. - -.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. - -The ``iterator_adaptor`` class template adapts some ``Base`` [#base]_ -type to create a new iterator. Instantiations of ``iterator_adaptor`` -are derived from a corresponding instantiation of ``iterator_facade`` -and implement the core behaviors in terms of the ``Base`` type. In -essence, ``iterator_adaptor`` merely forwards all operations to an -instance of the ``Base`` type, which it stores as a member. - -.. [#base] The term "Base" here does not refer to a base class and is - not meant to imply the use of derivation. We have followed the lead - of the standard library, which provides a base() function to access - the underlying iterator object of a ``reverse_iterator`` adaptor. - -The user of ``iterator_adaptor`` creates a class derived from an -instantiation of ``iterator_adaptor`` and then selectively -redefines some of the core member functions described in the -``iterator_facade`` core requirements table. The ``Base`` type need -not meet the full requirements for an iterator; it need only -support the operations used by the core interface functions of -``iterator_adaptor`` that have not been redefined in the user's -derived class. - -Several of the template parameters of ``iterator_adaptor`` default -to ``use_default``. This allows the -user to make use of a default parameter even when she wants to -specify a parameter later in the parameter list. Also, the -defaults for the corresponding associated types are somewhat -complicated, so metaprogramming is required to compute them, and -``use_default`` can help to simplify the implementation. Finally, -the identity of the ``use_default`` type is not left unspecified -because specification helps to highlight that the ``Reference`` -template parameter may not always be identical to the iterator's -``reference`` type, and will keep users from making mistakes based on -that assumption. - diff --git a/libs/iterator/doc/iterator_adaptor_ref.rst b/libs/iterator/doc/iterator_adaptor_ref.rst deleted file mode 100644 index 50c00fcce..000000000 --- a/libs/iterator/doc/iterator_adaptor_ref.rst +++ /dev/null @@ -1,182 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -.. Version 1.4 of this ReStructuredText document corresponds to - n1530_, the paper accepted by the LWG for TR1. - -.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. - -.. parsed-literal:: - - template < - class Derived - , class Base - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class iterator_adaptor - : public iterator_facade // see details__ - { - friend class iterator_core_access; - public: - iterator_adaptor(); - explicit iterator_adaptor(Base const& iter); - typedef Base base_type; - Base const& base() const; - protected: - typedef iterator_adaptor iterator_adaptor\_; - Base const& base_reference() const; - Base& base_reference(); - private: // Core iterator interface for iterator_facade. - typename iterator_adaptor::reference dereference() const; - - template < - class OtherDerived, class OtherIterator, class V, class C, class R, class D - > - bool equal(iterator_adaptor const& x) const; - - void advance(typename iterator_adaptor::difference_type n); - void increment(); - void decrement(); - - template < - class OtherDerived, class OtherIterator, class V, class C, class R, class D - > - typename iterator_adaptor::difference_type distance_to( - iterator_adaptor const& y) const; - - private: - Base m_iterator; // exposition only - }; - -__ base_parameters_ - -.. _requirements: - -``iterator_adaptor`` requirements ---------------------------------- - -``static_cast(iterator_adaptor*)`` shall be well-formed. -The ``Base`` argument shall be Assignable and Copy Constructible. - - -.. _base_parameters: - -``iterator_adaptor`` base class parameters ------------------------------------------- - -The *V'*, *C'*, *R'*, and *D'* parameters of the ``iterator_facade`` -used as a base class in the summary of ``iterator_adaptor`` -above are defined as follows: - -.. parsed-literal:: - - *V'* = if (Value is use_default) - return iterator_traits::value_type - else - return Value - - *C'* = if (CategoryOrTraversal is use_default) - return iterator_traversal::type - else - return CategoryOrTraversal - - *R'* = if (Reference is use_default) - if (Value is use_default) - return iterator_traits::reference - else - return Value& - else - return Reference - - *D'* = if (Difference is use_default) - return iterator_traits::difference_type - else - return Difference - -.. ``iterator_adaptor`` models - --------------------------- - - In order for ``Derived`` to model the iterator concepts corresponding - to ``iterator_traits::iterator_category``, the expressions - involving ``m_iterator`` in the specifications of those private member - functions of ``iterator_adaptor`` that may be called by - ``iterator_facade`` in evaluating any valid - expression involving ``Derived`` in those concepts' requirements. - -.. The above is confusing and needs a rewrite. -JGS -.. That's why it's removed. We're embracing inheritance, remember? - -``iterator_adaptor`` public operations --------------------------------------- - -``iterator_adaptor();`` - -:Requires: The ``Base`` type must be Default Constructible. -:Returns: An instance of ``iterator_adaptor`` with - ``m_iterator`` default constructed. - - -``explicit iterator_adaptor(Base const& iter);`` - -:Returns: An instance of ``iterator_adaptor`` with - ``m_iterator`` copy constructed from ``iter``. - -``Base const& base() const;`` - -:Returns: ``m_iterator`` - -``iterator_adaptor`` protected member functions ------------------------------------------------ - -``Base const& base_reference() const;`` - -:Returns: A const reference to ``m_iterator``. - - -``Base& base_reference();`` - -:Returns: A non-const reference to ``m_iterator``. - - -``iterator_adaptor`` private member functions ---------------------------------------------- - -``typename iterator_adaptor::reference dereference() const;`` - -:Returns: ``*m_iterator`` - -:: - - template < - class OtherDerived, class OtherIterator, class V, class C, class R, class D - > - bool equal(iterator_adaptor const& x) const; - -:Returns: ``m_iterator == x.base()`` - - -``void advance(typename iterator_adaptor::difference_type n);`` - -:Effects: ``m_iterator += n;`` - -``void increment();`` - -:Effects: ``++m_iterator;`` - -``void decrement();`` - -:Effects: ``--m_iterator;`` - -:: - - template < - class OtherDerived, class OtherIterator, class V, class C, class R, class D - > - typename iterator_adaptor::difference_type distance_to( - iterator_adaptor const& y) const; - -:Returns: ``y.base() - m_iterator`` diff --git a/libs/iterator/doc/iterator_adaptor_tutorial.rst b/libs/iterator/doc/iterator_adaptor_tutorial.rst deleted file mode 100644 index 410684687..000000000 --- a/libs/iterator/doc/iterator_adaptor_tutorial.rst +++ /dev/null @@ -1,135 +0,0 @@ -.. Copyright David Abrahams 2004. 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) - -In this section we'll further refine the ``node_iter`` class -template we developed in the |fac_tut|_. If you haven't already -read that material, you should go back now and check it out because -we're going to pick up right where it left off. - -.. |fac_tut| replace:: ``iterator_facade`` tutorial -.. _fac_tut: iterator_facade.html#tutorial-example - -.. sidebar:: ``node_base*`` really *is* an iterator - - It's not really a very interesting iterator, since ``node_base`` - is an abstract class: a pointer to a ``node_base`` just points - at some base subobject of an instance of some other class, and - incrementing a ``node_base*`` moves it past this base subobject - to who-knows-where? The most we can do with that incremented - position is to compare another ``node_base*`` to it. In other - words, the original iterator traverses a one-element array. - -You probably didn't think of it this way, but the ``node_base*`` -object that underlies ``node_iterator`` is itself an iterator, -just like all other pointers. If we examine that pointer closely -from an iterator perspective, we can see that it has much in common -with the ``node_iterator`` we're building. First, they share most -of the same associated types (``value_type``, ``reference``, -``pointer``, and ``difference_type``). Second, even some of the -core functionality is the same: ``operator*`` and ``operator==`` on -the ``node_iterator`` return the result of invoking the same -operations on the underlying pointer, via the ``node_iterator``\ 's -|dereference_and_equal|_). The only real behavioral difference -between ``node_base*`` and ``node_iterator`` can be observed when -they are incremented: ``node_iterator`` follows the -``m_next`` pointer, while ``node_base*`` just applies an address offset. - -.. |dereference_and_equal| replace:: ``dereference`` and ``equal`` member functions -.. _dereference_and_equal: iterator_facade.html#implementing-the-core-operations - -It turns out that the pattern of building an iterator on another -iterator-like type (the ``Base`` [#base]_ type) while modifying -just a few aspects of the underlying type's behavior is an -extremely common one, and it's the pattern addressed by -``iterator_adaptor``. Using ``iterator_adaptor`` is very much like -using ``iterator_facade``, but because iterator_adaptor tries to -mimic as much of the ``Base`` type's behavior as possible, we -neither have to supply a ``Value`` argument, nor implement any core -behaviors other than ``increment``. The implementation of -``node_iter`` is thus reduced to:: - - template - class node_iter - : public boost::iterator_adaptor< - node_iter // Derived - , Value* // Base - , boost::use_default // Value - , boost::forward_traversal_tag // CategoryOrTraversal - > - { - private: - struct enabler {}; // a private type avoids misuse - - public: - node_iter() - : node_iter::iterator_adaptor_(0) {} - - explicit node_iter(Value* p) - : node_iter::iterator_adaptor_(p) {} - - template - node_iter( - node_iter const& other - , typename boost::enable_if< - boost::is_convertible - , enabler - >::type = enabler() - ) - : node_iter::iterator_adaptor_(other.base()) {} - - private: - friend class boost::iterator_core_access; - void increment() { this->base_reference() = this->base()->next(); } - }; - -Note the use of ``node_iter::iterator_adaptor_`` here: because -``iterator_adaptor`` defines a nested ``iterator_adaptor_`` type -that refers to itself, that gives us a convenient way to refer to -the complicated base class type of ``node_iter``. [Note: -this technique is known not to work with Borland C++ 5.6.4 and -Metrowerks CodeWarrior versions prior to 9.0] - -You can see an example program that exercises this version of the -node iterators `here`__. - -__ ../example/node_iterator3.cpp - -In the case of ``node_iter``, it's not very compelling to pass -``boost::use_default`` as ``iterator_adaptor``\ 's ``Value`` -argument; we could have just passed ``node_iter``\ 's ``Value`` -along to ``iterator_adaptor``, and that'd even be shorter! Most -iterator class templates built with ``iterator_adaptor`` are -parameterized on another iterator type, rather than on its -``value_type``. For example, ``boost::reverse_iterator`` takes an -iterator type argument and reverses its direction of traversal, -since the original iterator and the reversed one have all the same -associated types, ``iterator_adaptor``\ 's delegation of default -types to its ``Base`` saves the implementor of -``boost::reverse_iterator`` from writing: - -.. parsed-literal:: - - std::iterator_traits::*some-associated-type* - -at least four times. - -We urge you to review the documentation and implementations of -|reverse_iterator|_ and the other Boost `specialized iterator -adaptors`__ to get an idea of the sorts of things you can do with -``iterator_adaptor``. In particular, have a look at -|transform_iterator|_, which is perhaps the most straightforward -adaptor, and also |counting_iterator|_, which demonstrates that -``iterator_adaptor``\ 's ``Base`` type needn't be an iterator. - -.. |reverse_iterator| replace:: ``reverse_iterator`` -.. _reverse_iterator: reverse_iterator.html - -.. |counting_iterator| replace:: ``counting_iterator`` -.. _counting_iterator: counting_iterator.html - -.. |transform_iterator| replace:: ``transform_iterator`` -.. _transform_iterator: transform_iterator.html - -__ index.html#specialized-adaptors - diff --git a/libs/iterator/doc/iterator_archetypes.html b/libs/iterator/doc/iterator_archetypes.html deleted file mode 100644 index cba66fa69..000000000 --- a/libs/iterator/doc/iterator_archetypes.html +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - -Iterator Archetype - - - - - - - - - - - diff --git a/libs/iterator/doc/iterator_archetypes.pdf b/libs/iterator/doc/iterator_archetypes.pdf deleted file mode 100644 index 8cecde3095478dd62d57cdd95534a8cf43fcfdc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61213 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 - class iterator_archetype - { - typedef /* see below */ value_type; - typedef /* see below */ reference; - typedef /* see below */ pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - }; - -``Access Category Tags`` -........................ - -The access category types provided correspond to the following -standard iterator access concept combinations: - -:: - - readable_iterator_t := - - Readable Iterator - - writable_iterator_t := - - Writeable Iterator - - readable_writable_iterator_t := - - Readable Iterator & Writeable Iterator & Swappable Iterator - - readable_lvalue_iterator_t := - - Readable Iterator & Lvalue Iterator - - writeable_lvalue_iterator_t := - - Readable Iterator & Writeable Iterator & Swappable Iterator & Lvalue Iterator - -``iterator_archetype`` Requirements -................................... - -The ``AccessCategory`` argument must be one of the predefined access -category tags. The ``TraversalCategory`` must be one of the standard -traversal tags. The ``Value`` type must satisfy the requirements of -the iterator concept specified by ``AccessCategory`` and -``TraversalCategory`` as implied by the nested traits types. - -``iterator_archetype`` Models -............................. - -``iterator_archetype`` models the iterator concepts specified by the -``AccessCategory`` and ``TraversalCategory`` -arguments. ``iterator_archetype`` does not model any other access -concepts or any more derived traversal concepts. - -``Traits`` -.......... - -The nested trait types are defined as follows: - -:: - - if (AccessCategory == readable_iterator_t) - - value_type = Value - reference = Value - pointer = Value* - - else if (AccessCategory == writable_iterator_t) - - value_type = void - reference = void - pointer = void - - else if (AccessCategory == readable_writable_iterator_t) - - value_type = Value - - reference := - - A type X that is convertible to Value for which the following - expression is valid. Given an object x of type X and v of type - Value. - - x = v - - pointer = Value* - - else if (AccessCategory == readable_lvalue_iterator_t) - - value_type = Value - reference = Value const& - pointer = Value const* - - else if (AccessCategory == writable_lvalue_iterator_t) - - value_type = Value - reference = Value& - pointer = Value* - - if ( TraversalCategory is convertible to forward_traversal_tag ) - - difference_type := ptrdiff_t - - else - - difference_type := unspecified type - - - iterator_category := - - A type X satisfying the following two constraints: - - 1. X is convertible to X1, and not to any more-derived - type, where X1 is defined by: - - if (reference is a reference type - && TraversalCategory is convertible to forward_traversal_tag) - { - if (TraversalCategory is convertible to random_access_traversal_tag) - X1 = random_access_iterator_tag - else if (TraversalCategory is convertible to bidirectional_traversal_tag) - X1 = bidirectional_iterator_tag - else - X1 = forward_iterator_tag - } - else - { - if (TraversalCategory is convertible to single_pass_traversal_tag - && reference != void) - X1 = input_iterator_tag - else - X1 = output_iterator_tag - } - - 2. X is convertible to TraversalCategory - - diff --git a/libs/iterator/doc/iterator_concepts.html b/libs/iterator/doc/iterator_concepts.html deleted file mode 100644 index 0a488388b..000000000 --- a/libs/iterator/doc/iterator_concepts.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - -Iterator Concepts - - - - - - - -
-

Iterator Concepts

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
Organization:Boost Consulting, Indiana University Open Systems -Lab, Zephyr Associates, Inc.
Date:2006-09-11
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004.
- - - - --- - - - -
abstract:The iterator concept checking classes provide a mechanism for -a template to report better error messages when a user instantiates -the template with a type that does not meet the requirements of -the template.
-

For an introduction to using concept checking classes, see -the documentation for the boost::concept_check library.

-
-

Reference

- - -
-

iterator_concepts.hpp Synopsis

-
-namespace boost_concepts {
-
-    // Iterator Access Concepts
-
-    template <typename Iterator>
-    class ReadableIteratorConcept;
-
-    template <
-        typename Iterator
-      , typename ValueType = std::iterator_traits<Iterator>::value_type
-    >
-    class WritableIteratorConcept;
-
-    template <typename Iterator>
-    class SwappableIteratorConcept;
-
-    template <typename Iterator>
-    class LvalueIteratorConcept;
-
-    // Iterator Traversal Concepts
-
-    template <typename Iterator>
-    class IncrementableIteratorConcept;
-
-    template <typename Iterator>
-    class SinglePassIteratorConcept;
-
-    template <typename Iterator>
-    class ForwardTraversalConcept;
-
-    template <typename Iterator>
-    class BidirectionalTraversalConcept;
-
-    template <typename Iterator>
-    class RandomAccessTraversalConcept;
-
-    // Interoperability
-
-    template <typename Iterator, typename ConstIterator>
-    class InteroperableIteratorConcept;
-
-}
-
-
-
-
- - - diff --git a/libs/iterator/doc/iterator_concepts.pdf b/libs/iterator/doc/iterator_concepts.pdf deleted file mode 100644 index 98e43020541281aae5ddbedb3facecc2042f0c8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66710 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%0D-1U3J&tbp!g{5^O(|&gEB>+TwX< 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 diff --git a/libs/iterator/doc/iterator_concepts.rst b/libs/iterator/doc/iterator_concepts.rst deleted file mode 100644 index 77242a4ea..000000000 --- a/libs/iterator/doc/iterator_concepts.rst +++ /dev/null @@ -1,130 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -++++++++++++++++++ - Iterator Concepts -++++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, `Zephyr Associates, Inc.`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004. - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Zephyr Associates, Inc.`: http://www.styleadvisor.com - -:abstract: The iterator concept checking classes provide a mechanism for - a template to report better error messages when a user instantiates - the template with a type that does not meet the requirements of - the template. - - -For an introduction to using concept checking classes, see -the documentation for the |concepts|_ library. - -.. |concepts| replace:: ``boost::concept_check`` -.. _concepts: ../../concept_check/index.html - - -Reference -========= - -Iterator Access Concepts -........................ - -* |Readable|_ -* |Writable|_ -* |Swappable|_ -* |Lvalue|_ - -.. |Readable| replace:: *Readable Iterator* -.. _Readable: ReadableIterator.html - -.. |Writable| replace:: *Writable Iterator* -.. _Writable: WritableIterator.html - -.. |Swappable| replace:: *Swappable Iterator* -.. _Swappable: SwappableIterator.html - -.. |Lvalue| replace:: *Lvalue Iterator* -.. _Lvalue: LvalueIterator.html - - -Iterator Traversal Concepts -........................... - -* |Incrementable|_ -* |SinglePass|_ -* |Forward|_ -* |Bidir|_ -* |Random|_ - - -.. |Incrementable| replace:: *Incrementable Iterator* -.. _Incrementable: IncrementableIterator.html - -.. |SinglePass| replace:: *Single Pass Iterator* -.. _SinglePass: SinglePassIterator.html - -.. |Forward| replace:: *Forward Traversal* -.. _Forward: ForwardTraversal.html - -.. |Bidir| replace:: *Bidirectional Traversal* -.. _Bidir: BidirectionalTraversal.html - -.. |Random| replace:: *Random Access Traversal* -.. _Random: RandomAccessTraversal.html - - - -``iterator_concepts.hpp`` Synopsis -.................................. - -:: - - namespace boost_concepts { - - // Iterator Access Concepts - - template - class ReadableIteratorConcept; - - template < - typename Iterator - , typename ValueType = std::iterator_traits::value_type - > - class WritableIteratorConcept; - - template - class SwappableIteratorConcept; - - template - class LvalueIteratorConcept; - - // Iterator Traversal Concepts - - template - class IncrementableIteratorConcept; - - template - class SinglePassIteratorConcept; - - template - class ForwardTraversalConcept; - - template - class BidirectionalTraversalConcept; - - template - class RandomAccessTraversalConcept; - - // Interoperability - - template - class InteroperableIteratorConcept; - - } diff --git a/libs/iterator/doc/iterator_facade.html b/libs/iterator/doc/iterator_facade.html deleted file mode 100644 index 21e048d9e..000000000 --- a/libs/iterator/doc/iterator_facade.html +++ /dev/null @@ -1,1348 +0,0 @@ - - - - - - -Iterator Facade - - - - - - - -
-

Iterator Facade

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2006-09-11
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
- - - - --- - - - -
abstract: - - -iterator_facade is a base class template that implements the -interface of standard iterators in terms of a few core functions -and associated types, to be supplied by a derived iterator class.
-
-
-

Overview

- - - - - -

While the iterator interface is rich, there is a core subset of the -interface that is necessary for all the functionality. We have -identified the following core behaviors for iterators:

-
    -
  • dereferencing
  • -
  • incrementing
  • -
  • decrementing
  • -
  • equality comparison
  • -
  • random-access motion
  • -
  • distance measurement
  • -
-

In addition to the behaviors listed above, the core interface elements -include the associated types exposed through iterator traits: -value_type, reference, difference_type, and -iterator_category.

-

Iterator facade uses the Curiously Recurring Template -Pattern (CRTP) [Cop95] so that the user can specify the behavior -of iterator_facade in a derived class. Former designs used -policy objects to specify the behavior, but that approach was -discarded for several reasons:

-
-
    -
  1. the creation and eventual copying of the policy object may create -overhead that can be avoided with the current approach.
  2. -
  3. The policy object approach does not allow for custom constructors -on the created iterator types, an essential feature if -iterator_facade should be used in other library -implementations.
  4. -
  5. Without the use of CRTP, the standard requirement that an -iterator's operator++ returns the iterator type itself -would mean that all iterators built with the library would -have to be specializations of iterator_facade<...>, rather -than something more descriptive like -indirect_iterator<T*>. Cumbersome type generator -metafunctions would be needed to build new parameterized -iterators, and a separate iterator_adaptor layer would be -impossible.
  6. -
-
-
-

Usage

-

The user of iterator_facade derives his iterator class from a -specialization of iterator_facade and passes the derived -iterator class as iterator_facade's first template parameter. -The order of the other template parameters have been carefully -chosen to take advantage of useful defaults. For example, when -defining a constant lvalue iterator, the user can pass a -const-qualified version of the iterator's value_type as -iterator_facade's Value parameter and omit the -Reference parameter which follows.

-

The derived iterator class must define member functions implementing -the iterator's core behaviors. The following table describes -expressions which are required to be valid depending on the category -of the derived iterator type. These member functions are described -briefly below and in more detail in the iterator facade -requirements.

-
- ---- - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionEffects
i.dereference()Access the value referred to
i.equal(j)Compare for equality with j
i.increment()Advance by one position
i.decrement()Retreat by one position
i.advance(n)Advance by n positions
i.distance_to(j)Measure the distance to j
-
- -

In addition to implementing the core interface functions, an iterator -derived from iterator_facade typically defines several -constructors. To model any of the standard iterator concepts, the -iterator must at least have a copy constructor. Also, if the iterator -type X is meant to be automatically interoperate with another -iterator type Y (as with constant and mutable iterators) then -there must be an implicit conversion from X to Y or from Y -to X (but not both), typically implemented as a conversion -constructor. Finally, if the iterator is to model Forward Traversal -Iterator or a more-refined iterator concept, a default constructor is -required.

-
-
-

Iterator Core Access

-

iterator_facade and the operator implementations need to be able -to access the core member functions in the derived class. Making the -core member functions public would expose an implementation detail to -the user. The design used here ensures that implementation details do -not appear in the public interface of the derived iterator type.

-

Preventing direct access to the core member functions has two -advantages. First, there is no possibility for the user to accidently -use a member function of the iterator when a member of the value_type -was intended. This has been an issue with smart pointer -implementations in the past. The second and main advantage is that -library implementers can freely exchange a hand-rolled iterator -implementation for one based on iterator_facade without fear of -breaking code that was accessing the public core member functions -directly.

-

In a naive implementation, keeping the derived class' core member -functions private would require it to grant friendship to -iterator_facade and each of the seven operators. In order to -reduce the burden of limiting access, iterator_core_access is -provided, a class that acts as a gateway to the core member functions -in the derived iterator class. The author of the derived class only -needs to grant friendship to iterator_core_access to make his core -member functions available to the library.

- - -

iterator_core_access will be typically implemented as an empty -class containing only private static member functions which invoke the -iterator core member functions. There is, however, no need to -standardize the gateway protocol. Note that even if -iterator_core_access used public member functions it would not -open a safety loophole, as every core member function preserves the -invariants of the iterator.

-
-
-

operator[]

-

The indexing operator for a generalized iterator presents special -challenges. A random access iterator's operator[] is only -required to return something convertible to its value_type. -Requiring that it return an lvalue would rule out currently-legal -random-access iterators which hold the referenced value in a data -member (e.g. counting_iterator), because *(p+n) is a reference -into the temporary iterator p+n, which is destroyed when -operator[] returns.

-

Writable iterators built with iterator_facade implement the -semantics required by the preferred resolution to issue 299 and -adopted by proposal n1550: the result of p[n] is an object -convertible to the iterator's value_type, and p[n] = x is -equivalent to *(p + n) = x (Note: This result object may be -implemented as a proxy containing a copy of p+n). This approach -will work properly for any random-access iterator regardless of the -other details of its implementation. A user who knows more about -the implementation of her iterator is free to implement an -operator[] that returns an lvalue in the derived iterator -class; it will hide the one supplied by iterator_facade from -clients of her iterator.

-
-
-

operator->

-

The reference type of a readable iterator (and today's input -iterator) need not in fact be a reference, so long as it is -convertible to the iterator's value_type. When the value_type -is a class, however, it must still be possible to access members -through operator->. Therefore, an iterator whose reference -type is not in fact a reference must return a proxy containing a copy -of the referenced value from its operator->.

-

The return types for iterator_facade's operator-> and -operator[] are not explicitly specified. Instead, those types -are described in terms of a set of requirements, which must be -satisfied by the iterator_facade implementation.

- - - - - -
[Cop95](1, 2) [Coplien, 1995] Coplien, J., Curiously Recurring Template -Patterns, C++ Report, February 1995, pp. 24-27.
-
-
-
-

Reference

- - - - - -
-template <
-    class Derived
-  , class Value
-  , class CategoryOrTraversal
-  , class Reference  = Value&
-  , class Difference = ptrdiff_t
->
-class iterator_facade {
- public:
-    typedef remove_const<Value>::type value_type;
-    typedef Reference reference;
-    typedef Value* pointer;
-    typedef Difference difference_type;
-    typedef /* see below */ iterator_category;
-
-    reference operator*() const;
-    /* see below */ operator->() const;
-    /* see below */ operator[](difference_type n) const;
-    Derived& operator++();
-    Derived operator++(int);
-    Derived& operator--();
-    Derived operator--(int);
-    Derived& operator+=(difference_type n);
-    Derived& operator-=(difference_type n);
-    Derived operator-(difference_type n) const;
- protected:
-    typedef iterator_facade iterator_facade_;
-};
-
-// Comparison operators
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type // exposition
-operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-// Iterator difference
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-/* see below */
-operator-(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-          iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
-// Iterator addition
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
-                   typename Derived::difference_type n);
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (typename Derived::difference_type n,
-                   iterator_facade<Dr,V,TC,R,D> const&);
-
-

The iterator_category member of iterator_facade is

-
-iterator-category(CategoryOrTraversal, value_type, reference)
-
-

where iterator-category is defined as follows:

-
-iterator-category(C,R,V) :=
-   if (C is convertible to std::input_iterator_tag
-       || C is convertible to std::output_iterator_tag
-   )
-       return C
-
-   else if (C is not convertible to incrementable_traversal_tag)
-       the program is ill-formed
-
-   else return a type X satisfying the following two constraints:
-
-      1. X is convertible to X1, and not to any more-derived
-         type, where X1 is defined by:
-
-           if (R is a reference type
-               && C is convertible to forward_traversal_tag)
-           {
-               if (C is convertible to random_access_traversal_tag)
-                   X1 = random_access_iterator_tag
-               else if (C is convertible to bidirectional_traversal_tag)
-                   X1 = bidirectional_iterator_tag
-               else
-                   X1 = forward_iterator_tag
-           }
-           else
-           {
-               if (C is convertible to single_pass_traversal_tag
-                   && R is convertible to V)
-                   X1 = input_iterator_tag
-               else
-                   X1 = C
-           }
-
-      2. category-to-traversal(X) is convertible to the most
-         derived traversal tag type to which X is also
-         convertible, and not to any more-derived traversal tag
-         type.
-
-

[Note: the intention is to allow iterator_category to be one of -the five original category tags when convertibility to one of the -traversal tags would add no information]

- - - -

The enable_if_interoperable template used above is for exposition -purposes. The member operators should only be in an overload set -provided the derived types Dr1 and Dr2 are interoperable, -meaning that at least one of the types is convertible to the other. The -enable_if_interoperable approach uses SFINAE to take the operators -out of the overload set when the types are not interoperable. -The operators should behave as-if enable_if_interoperable -were defined to be:

-
-template <bool, typename> enable_if_interoperable_impl
-{};
-
-template <typename T> enable_if_interoperable_impl<true,T>
-{ typedef T type; };
-
-template<typename Dr1, typename Dr2, typename T>
-struct enable_if_interoperable
-  : enable_if_interoperable_impl<
-        is_convertible<Dr1,Dr2>::value || is_convertible<Dr2,Dr1>::value
-      , T
-    >
-{};
-
-
-

iterator_facade Requirements

-

The following table describes the typical valid expressions on -iterator_facade's Derived parameter, depending on the -iterator concept(s) it will model. The operations in the first -column must be made accessible to member functions of class -iterator_core_access. In addition, -static_cast<Derived*>(iterator_facade*) shall be well-formed.

-

In the table below, F is iterator_facade<X,V,C,R,D>, a is an -object of type X, b and c are objects of type const X, -n is an object of F::difference_type, y is a constant -object of a single pass iterator type interoperable with X, and z -is a constant object of a random access traversal iterator type -interoperable with X.

-
-

iterator_facade Core Operations

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionReturn TypeAssertion/NoteUsed to implement Iterator -Concept(s)
c.dereference()F::reference Readable Iterator, Writable -Iterator
c.equal(y)convertible to booltrue iff c and y -refer to the same -position.Single Pass Iterator
a.increment()unused Incrementable Iterator
a.decrement()unused Bidirectional Traversal -Iterator
a.advance(n)unused Random Access Traversal -Iterator
c.distance_to(z)convertible to -F::difference_typeequivalent to -distance(c, X(z)).Random Access Traversal -Iterator
-
-
-
-

iterator_facade operations

-

The operations in this section are described in terms of operations on -the core interface of Derived which may be inaccessible -(i.e. private). The implementation should access these operations -through member functions of class iterator_core_access.

-

reference operator*() const;

- --- - - - -
Returns:static_cast<Derived const*>(this)->dereference()
-

operator->() const; (see below)

- --- - - - -
Returns:

If reference is a reference type, an object -of type pointer equal to:

-
-&static_cast<Derived const*>(this)->dereference()
-
-

Otherwise returns an object of unspecified type such that, -(*static_cast<Derived const*>(this))->m is equivalent to (w = **static_cast<Derived const*>(this), -w.m) for some temporary object w of type value_type.

-
-

unspecified operator[](difference_type n) const;

- --- - - - -
Returns:an object convertible to value_type. For constant -objects v of type value_type, and n of type -difference_type, (*this)[n] = v is equivalent to -*(*this + n) = v, and static_cast<value_type -const&>((*this)[n]) is equivalent to -static_cast<value_type const&>(*(*this + n))
-

Derived& operator++();

- --- - - - -
Effects:
-static_cast<Derived*>(this)->increment();
-return *static_cast<Derived*>(this);
-
-
-

Derived operator++(int);

- --- - - - -
Effects:
-Derived tmp(static_cast<Derived const*>(this));
-++*this;
-return tmp;
-
-
-

Derived& operator--();

- --- - - - -
Effects:
-static_cast<Derived*>(this)->decrement();
-return *static_cast<Derived*>(this);
-
-
-

Derived operator--(int);

- --- - - - -
Effects:
-Derived tmp(static_cast<Derived const*>(this));
---*this;
-return tmp;
-
-
-

Derived& operator+=(difference_type n);

- --- - - - -
Effects:
-static_cast<Derived*>(this)->advance(n);
-return *static_cast<Derived*>(this);
-
-
-

Derived& operator-=(difference_type n);

- --- - - - -
Effects:
-static_cast<Derived*>(this)->advance(-n);
-return *static_cast<Derived*>(this);
-
-
-

Derived operator-(difference_type n) const;

- --- - - - -
Effects:
-Derived tmp(static_cast<Derived const*>(this));
-return tmp -= n;
-
-
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
-                   typename Derived::difference_type n);
-
-template <class Dr, class V, class TC, class R, class D>
-Derived operator+ (typename Derived::difference_type n,
-                   iterator_facade<Dr,V,TC,R,D> const&);
-
- --- - - - -
Effects:
-Derived tmp(static_cast<Derived const*>(this));
-return tmp += n;
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-

((Dr1 const&)lhs).equal((Dr2 const&)rhs).

-
-
Otherwise,
-

((Dr2 const&)rhs).equal((Dr1 const&)lhs).

-
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-

!((Dr1 const&)lhs).equal((Dr2 const&)rhs).

-
-
Otherwise,
-

!((Dr2 const&)rhs).equal((Dr1 const&)lhs).

-
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-

((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) < 0.

-
-
Otherwise,
-

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0.

-
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-

((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) <= 0.

-
-
Otherwise,
-

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0.

-
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-

((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) > 0.

-
-
Otherwise,
-

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0.

-
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,bool>::type
-operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - -
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-

((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) >= 0.

-
-
Otherwise,
-

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0.

-
-
-
-
-template <class Dr1, class V1, class TC1, class R1, class D1,
-          class Dr2, class V2, class TC2, class R2, class D2>
-typename enable_if_interoperable<Dr1,Dr2,difference>::type
-operator -(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
-           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
-
- --- - - - - - -
Return Type:

if is_convertible<Dr2,Dr1>::value

-
-
-
then
-

difference shall be -iterator_traits<Dr1>::difference_type.

-
-
Otherwise
-

difference shall be iterator_traits<Dr2>::difference_type

-
-
-
-
Returns:

if is_convertible<Dr2,Dr1>::value

-
-
then
-

-((Dr1 const&)lhs).distance_to((Dr2 const&)rhs).

-
-
Otherwise,
-

((Dr2 const&)rhs).distance_to((Dr1 const&)lhs).

-
-
-
-
-
-
-

Tutorial Example

- - - -

In this section we'll walk through the implementation of a few -iterators using iterator_facade, based around the simple -example of a linked list of polymorphic objects. This example was -inspired by a posting by Keith Macdonald on the Boost-Users -mailing list.

-
-

The Problem

-

Say we've written a polymorphic linked list node base class:

-
-# include <iostream>
-
-struct node_base
-{
-    node_base() : m_next(0) {}
-
-    // Each node manages all of its tail nodes
-    virtual ~node_base() { delete m_next; }
-
-    // Access the rest of the list
-    node_base* next() const { return m_next; }
-
-    // print to the stream
-    virtual void print(std::ostream& s) const = 0;
-
-    // double the value
-    virtual void double_me() = 0;
-
-    void append(node_base* p)
-    {
-        if (m_next)
-            m_next->append(p);
-        else
-            m_next = p;
-    }
-
- private:
-    node_base* m_next;
-};
-
-

Lists can hold objects of different types by linking together -specializations of the following template:

-
-template <class T>
-struct node : node_base
-{
-    node(T x)
-      : m_value(x)
-    {}
-
-    void print(std::ostream& s) const { s << this->m_value; }
-    void double_me() { m_value += m_value; }
-
- private:
-    T m_value;
-};
-
-

And we can print any node using the following streaming operator:

-
-inline std::ostream& operator<<(std::ostream& s, node_base const& n)
-{
-    n.print(s);
-    return s;
-}
-
-

Our first challenge is to build an appropriate iterator over these -lists.

-
-
-

A Basic Iterator Using iterator_facade

-

We will construct a node_iterator class using inheritance from -iterator_facade to implement most of the iterator's operations.

-
-# include "node.hpp"
-# include <boost/iterator/iterator_facade.hpp>
-
-class node_iterator
-  : public boost::iterator_facade<...>
-{
-   ...
-};
-
-
-

Template Arguments for iterator_facade

-

iterator_facade has several template parameters, so we must decide -what types to use for the arguments. The parameters are Derived, -Value, CategoryOrTraversal, Reference, and Difference.

-
-

Derived

-

Because iterator_facade is meant to be used with the CRTP -[Cop95] the first parameter is the iterator class name itself, -node_iterator.

-
-
-

Value

-

The Value parameter determines the node_iterator's -value_type. In this case, we are iterating over node_base -objects, so Value will be node_base.

-
-
-

CategoryOrTraversal

-

Now we have to determine which iterator traversal concept our -node_iterator is going to model. Singly-linked lists only have -forward links, so our iterator can't can't be a bidirectional -traversal iterator. Our iterator should be able to make multiple -passes over the same linked list (unlike, say, an -istream_iterator which consumes the stream it traverses), so it -must be a forward traversal iterator. Therefore, we'll pass -boost::forward_traversal_tag in this position1.

- - - - - -
[1]iterator_facade also supports old-style category -tags, so we could have passed std::forward_iterator_tag here; -either way, the resulting iterator's iterator_category will -end up being std::forward_iterator_tag.
-
-
-

Reference

-

The Reference argument becomes the type returned by -node_iterator's dereference operation, and will also be the -same as std::iterator_traits<node_iterator>::reference. The -library's default for this parameter is Value&; since -node_base& is a good choice for the iterator's reference -type, we can omit this argument, or pass use_default.

-
-
-

Difference

-

The Difference argument determines how the distance between -two node_iterators will be measured and will also be the -same as std::iterator_traits<node_iterator>::difference_type. -The library's default for Difference is std::ptrdiff_t, an -appropriate type for measuring the distance between any two -addresses in memory, and one that works for almost any iterator, -so we can omit this argument, too.

-

The declaration of node_iterator will therefore look something -like:

-
-# include "node.hpp"
-# include <boost/iterator/iterator_facade.hpp>
-
-class node_iterator
-  : public boost::iterator_facade<
-        node_iterator
-      , node_base
-      , boost::forward_traversal_tag
-    >
-{
-   ...
-};
-
-
-
-
-

Constructors and Data Members

-

Next we need to decide how to represent the iterator's position. -This representation will take the form of data members, so we'll -also need to write constructors to initialize them. The -node_iterator's position is quite naturally represented using -a pointer to a node_base. We'll need a constructor to build an -iterator from a node_base*, and a default constructor to -satisfy the forward traversal iterator requirements2. -Our node_iterator then becomes:

-
-# include "node.hpp"
-# include <boost/iterator/iterator_facade.hpp>
-
-class node_iterator
-  : public boost::iterator_facade<
-        node_iterator
-      , node_base
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    node_iterator()
-      : m_node(0)
-    {}
-
-    explicit node_iterator(node_base* p)
-      : m_node(p)
-    {}
-
- private:
-    ...
-    node_base* m_node;
-};
-
- - - - - -
[2]Technically, the C++ standard places almost no -requirements on a default-constructed iterator, so if we were -really concerned with efficiency, we could've written the -default constructor to leave m_node uninitialized.
-
-
-

Implementing the Core Operations

-

The last step is to implement the core operations required by -the concepts we want our iterator to model. Referring to the -table, we can see that the first three rows are applicable -because node_iterator needs to satisfy the requirements for -readable iterator, single pass iterator, and incrementable -iterator.

-

We therefore need to supply dereference, -equal, and increment members. We don't want these members -to become part of node_iterator's public interface, so we can -make them private and grant friendship to -boost::iterator_core_access, a "back-door" that -iterator_facade uses to get access to the core operations:

-
-# include "node.hpp"
-# include <boost/iterator/iterator_facade.hpp>
-
-class node_iterator
-  : public boost::iterator_facade<
-        node_iterator
-      , node_base
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    node_iterator()
-      : m_node(0) {}
-
-    explicit node_iterator(node_base* p)
-      : m_node(p) {}
-
- private:
-    friend class boost::iterator_core_access;
-
-    void increment() { m_node = m_node->next(); }
-
-    bool equal(node_iterator const& other) const
-    {
-        return this->m_node == other.m_node;
-    }
-
-    node_base& dereference() const { return *m_node; }
-
-    node_base* m_node;
-};
-
-

Voilà; a complete and conforming readable, forward-traversal -iterator! For a working example of its use, see this program.

-
-
-
-

A constant node_iterator

- -

Now, our node_iterator gives clients access to both node's print(std::ostream&) const member function, but also its -mutating double_me() member. If we wanted to build a -constant node_iterator, we'd only have to make three -changes:

-
-class const_node_iterator
-  : public boost::iterator_facade<
-        const_node_iterator
-      , node_base const
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    const_node_iterator()
-      : m_node(0) {}
-
-    explicit const_node_iterator(node_base* p)
-      : m_node(p) {}
-
- private:
-    friend class boost::iterator_core_access;
-
-    void increment() { m_node = m_node->next(); }
-
-    bool equal(const_node_iterator const& other) const
-    {
-        return this->m_node == other.m_node;
-    }
-
-    node_base const& dereference() const { return *m_node; }
-
-    node_base const* m_node;
-};
-
- -

As a matter of fact, node_iterator and const_node_iterator -are so similar that it makes sense to factor the common code out -into a template as follows:

-
-template <class Value>
-class node_iter
-  : public boost::iterator_facade<
-        node_iter<Value>
-      , Value
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    node_iter()
-      : m_node(0) {}
-
-    explicit node_iter(Value* p)
-      : m_node(p) {}
-
- private:
-    friend class boost::iterator_core_access;
-
-    bool equal(node_iter<Value> const& other) const
-    {
-        return this->m_node == other.m_node;
-    }
-
-    void increment()
-    { m_node = m_node->next(); }
-
-    Value& dereference() const
-    { return *m_node; }
-
-    Value* m_node;
-};
-typedef node_iter<node_base> node_iterator;
-typedef node_iter<node_base const> node_const_iterator;
-
-
-
-

Interoperability

-

Our const_node_iterator works perfectly well on its own, but -taken together with node_iterator it doesn't quite meet -expectations. For example, we'd like to be able to pass a -node_iterator where a node_const_iterator was expected, -just as you can with std::list<int>'s iterator and -const_iterator. Furthermore, given a node_iterator and a -node_const_iterator into the same list, we should be able to -compare them for equality.

-

This expected ability to use two different iterator types together -is known as interoperability. Achieving interoperability in -our case is as simple as templatizing the equal function and -adding a templatized converting constructor34:

-
-template <class Value>
-class node_iter
-  : public boost::iterator_facade<
-        node_iter<Value>
-      , Value
-      , boost::forward_traversal_tag
-    >
-{
- public:
-    node_iter()
-      : m_node(0) {}
-
-    explicit node_iter(Value* p)
-      : m_node(p) {}
-
-    template <class OtherValue>
-    node_iter(node_iter<OtherValue> const& other)
-      : m_node(other.m_node) {}
-
- private:
-    friend class boost::iterator_core_access;
-    template <class> friend class node_iter;
-
-    template <class OtherValue>
-    bool equal(node_iter<OtherValue> const& other) const
-    {
-        return this->m_node == other.m_node;
-    }
-
-    void increment()
-    { m_node = m_node->next(); }
-
-    Value& dereference() const
-    { return *m_node; }
-
-    Value* m_node;
-};
-typedef impl::node_iterator<node_base> node_iterator;
-typedef impl::node_iterator<node_base const> node_const_iterator;
-
- - - - - -
[3]If you're using an older compiler and it can't handle -this example, see the example code for workarounds.
- - - - - -
[4]If node_iterator had been a random access -traversal iterator, we'd have had to templatize its -distance_to function as well.
-

You can see an example program which exercises our interoperable -iterators here.

-
-
-

Telling the Truth

-

Now node_iterator and node_const_iterator behave exactly as -you'd expect... almost. We can compare them and we can convert in -one direction: from node_iterator to node_const_iterator. -If we try to convert from node_const_iterator to -node_iterator, we'll get an error when the converting -constructor tries to initialize node_iterator's m_node, a -node* with a node const*. So what's the problem?

-

The problem is that -boost::is_convertible<node_const_iterator,node_iterator>::value -will be true, but it should be false. is_convertible -lies because it can only see as far as the declaration of -node_iter's converting constructor, but can't look inside at -the definition to make sure it will compile. A perfect solution -would make node_iter's converting constructor disappear when -the m_node conversion would fail.

-

In fact, that sort of magic is possible using -boost::enable_if. By rewriting the converting constructor as -follows, we can remove it from the overload set when it's not -appropriate:

-
-#include <boost/type_traits/is_convertible.hpp>
-#include <boost/utility/enable_if.hpp>
-
-  ...
-
-private:
-  struct enabler {};
-
-public:
-  template <class OtherValue>
-  node_iter(
-      node_iter<OtherValue> const& other
-    , typename boost::enable_if<
-          boost::is_convertible<OtherValue*,Value*>
-        , enabler
-      >::type = enabler()
-  )
-    : m_node(other.m_node) {}
-
-
-
-

Wrap Up

-

This concludes our iterator_facade tutorial, but before you -stop reading we urge you to take a look at iterator_adaptor. -There's another way to approach writing these iterators which might -even be superior.

-
-
-
- - - diff --git a/libs/iterator/doc/iterator_facade.pdf b/libs/iterator/doc/iterator_facade.pdf deleted file mode 100644 index 30d46d2633f11ec123ef3fa2cfc74e263596ff85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167634 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

-Z-mm`nHnpu>fO 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, rather - than something more descriptive like - ``indirect_iterator``. Cumbersome type generator - metafunctions would be needed to build new parameterized - iterators, and a separate ``iterator_adaptor`` layer would be - impossible. - -Usage ------ - -The user of ``iterator_facade`` derives his iterator class from a -specialization of ``iterator_facade`` and passes the derived -iterator class as ``iterator_facade``\ 's first template parameter. -The order of the other template parameters have been carefully -chosen to take advantage of useful defaults. For example, when -defining a constant lvalue iterator, the user can pass a -const-qualified version of the iterator's ``value_type`` as -``iterator_facade``\ 's ``Value`` parameter and omit the -``Reference`` parameter which follows. - -The derived iterator class must define member functions implementing -the iterator's core behaviors. The following table describes -expressions which are required to be valid depending on the category -of the derived iterator type. These member functions are described -briefly below and in more detail in the iterator facade -requirements. - - +------------------------+-------------------------------+ - |Expression |Effects | - +========================+===============================+ - |``i.dereference()`` |Access the value referred to | - +------------------------+-------------------------------+ - |``i.equal(j)`` |Compare for equality with ``j``| - +------------------------+-------------------------------+ - |``i.increment()`` |Advance by one position | - +------------------------+-------------------------------+ - |``i.decrement()`` |Retreat by one position | - +------------------------+-------------------------------+ - |``i.advance(n)`` |Advance by ``n`` positions | - +------------------------+-------------------------------+ - |``i.distance_to(j)`` |Measure the distance to ``j`` | - +------------------------+-------------------------------+ - -.. Should we add a comment that a zero overhead implementation of iterator_facade - is possible with proper inlining? - -In addition to implementing the core interface functions, an iterator -derived from ``iterator_facade`` typically defines several -constructors. To model any of the standard iterator concepts, the -iterator must at least have a copy constructor. Also, if the iterator -type ``X`` is meant to be automatically interoperate with another -iterator type ``Y`` (as with constant and mutable iterators) then -there must be an implicit conversion from ``X`` to ``Y`` or from ``Y`` -to ``X`` (but not both), typically implemented as a conversion -constructor. Finally, if the iterator is to model Forward Traversal -Iterator or a more-refined iterator concept, a default constructor is -required. - - - -Iterator Core Access --------------------- - -``iterator_facade`` and the operator implementations need to be able -to access the core member functions in the derived class. Making the -core member functions public would expose an implementation detail to -the user. The design used here ensures that implementation details do -not appear in the public interface of the derived iterator type. - -Preventing direct access to the core member functions has two -advantages. First, there is no possibility for the user to accidently -use a member function of the iterator when a member of the value_type -was intended. This has been an issue with smart pointer -implementations in the past. The second and main advantage is that -library implementers can freely exchange a hand-rolled iterator -implementation for one based on ``iterator_facade`` without fear of -breaking code that was accessing the public core member functions -directly. - -In a naive implementation, keeping the derived class' core member -functions private would require it to grant friendship to -``iterator_facade`` and each of the seven operators. In order to -reduce the burden of limiting access, ``iterator_core_access`` is -provided, a class that acts as a gateway to the core member functions -in the derived iterator class. The author of the derived class only -needs to grant friendship to ``iterator_core_access`` to make his core -member functions available to the library. - -.. This is no long uptodate -thw -.. Yes it is; I made sure of it! -DWA - -``iterator_core_access`` will be typically implemented as an empty -class containing only private static member functions which invoke the -iterator core member functions. There is, however, no need to -standardize the gateway protocol. Note that even if -``iterator_core_access`` used public member functions it would not -open a safety loophole, as every core member function preserves the -invariants of the iterator. - -``operator[]`` --------------- - -The indexing operator for a generalized iterator presents special -challenges. A random access iterator's ``operator[]`` is only -required to return something convertible to its ``value_type``. -Requiring that it return an lvalue would rule out currently-legal -random-access iterators which hold the referenced value in a data -member (e.g. |counting|_), because ``*(p+n)`` is a reference -into the temporary iterator ``p+n``, which is destroyed when -``operator[]`` returns. - -.. |counting| replace:: ``counting_iterator`` - -Writable iterators built with ``iterator_facade`` implement the -semantics required by the preferred resolution to `issue 299`_ and -adopted by proposal n1550_: the result of ``p[n]`` is an object -convertible to the iterator's ``value_type``, and ``p[n] = x`` is -equivalent to ``*(p + n) = x`` (Note: This result object may be -implemented as a proxy containing a copy of ``p+n``). This approach -will work properly for any random-access iterator regardless of the -other details of its implementation. A user who knows more about -the implementation of her iterator is free to implement an -``operator[]`` that returns an lvalue in the derived iterator -class; it will hide the one supplied by ``iterator_facade`` from -clients of her iterator. - -.. _n1550: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm - -.. _`issue 299`: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299 - -.. _`operator arrow`: - - -``operator->`` --------------- - -The ``reference`` type of a readable iterator (and today's input -iterator) need not in fact be a reference, so long as it is -convertible to the iterator's ``value_type``. When the ``value_type`` -is a class, however, it must still be possible to access members -through ``operator->``. Therefore, an iterator whose ``reference`` -type is not in fact a reference must return a proxy containing a copy -of the referenced value from its ``operator->``. - -The return types for ``iterator_facade``\ 's ``operator->`` and -``operator[]`` are not explicitly specified. Instead, those types -are described in terms of a set of requirements, which must be -satisfied by the ``iterator_facade`` implementation. - -.. [Cop95] [Coplien, 1995] Coplien, J., Curiously Recurring Template - Patterns, C++ Report, February 1995, pp. 24-27. - diff --git a/libs/iterator/doc/iterator_facade_ref.rst b/libs/iterator/doc/iterator_facade_ref.rst deleted file mode 100644 index 87c032ac6..000000000 --- a/libs/iterator/doc/iterator_facade_ref.rst +++ /dev/null @@ -1,441 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -.. Version 1.3 of this ReStructuredText document corresponds to - n1530_, the paper accepted by the LWG for TR1. - -.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. - - -.. parsed-literal:: - - template < - class Derived - , class Value - , class CategoryOrTraversal - , class Reference = Value& - , class Difference = ptrdiff_t - > - class iterator_facade { - public: - typedef remove_const::type value_type; - typedef Reference reference; - typedef Value\* pointer; - typedef Difference difference_type; - typedef /* see below__ \*/ iterator_category; - - reference operator\*() const; - /* see below__ \*/ operator->() const; - /* see below__ \*/ operator[](difference_type n) const; - Derived& operator++(); - Derived operator++(int); - Derived& operator--(); - Derived operator--(int); - Derived& operator+=(difference_type n); - Derived& operator-=(difference_type n); - Derived operator-(difference_type n) const; - protected: - typedef iterator_facade iterator_facade\_; - }; - - // Comparison operators - template - typename enable_if_interoperable::type // exposition - operator ==(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator !=(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator <(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator <=(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator >(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator >=(iterator_facade const& lhs, - iterator_facade const& rhs); - - // Iterator difference - template - /* see below__ \*/ - operator-(iterator_facade const& lhs, - iterator_facade const& rhs); - - // Iterator addition - template - Derived operator+ (iterator_facade const&, - typename Derived::difference_type n); - - template - Derived operator+ (typename Derived::difference_type n, - iterator_facade const&); - -__ `iterator category`_ - -__ `operator arrow`_ - -__ brackets_ - -__ minus_ - -.. _`iterator category`: - -The ``iterator_category`` member of ``iterator_facade`` is - -.. parsed-literal:: - - *iterator-category*\ (CategoryOrTraversal, reference, value_type) - -where *iterator-category* is defined as follows: - -.. include:: facade_iterator_category.rst - -The ``enable_if_interoperable`` template used above is for exposition -purposes. The member operators should only be in an overload set -provided the derived types ``Dr1`` and ``Dr2`` are interoperable, -meaning that at least one of the types is convertible to the other. The -``enable_if_interoperable`` approach uses SFINAE to take the operators -out of the overload set when the types are not interoperable. -The operators should behave *as-if* ``enable_if_interoperable`` -were defined to be:: - - template enable_if_interoperable_impl - {}; - - template enable_if_interoperable_impl - { typedef T type; }; - - template - struct enable_if_interoperable - : enable_if_interoperable_impl< - is_convertible::value || is_convertible::value - , T - > - {}; - - -``iterator_facade`` Requirements --------------------------------- - -The following table describes the typical valid expressions on -``iterator_facade``\ 's ``Derived`` parameter, depending on the -iterator concept(s) it will model. The operations in the first -column must be made accessible to member functions of class -``iterator_core_access``. In addition, -``static_cast(iterator_facade*)`` shall be well-formed. - -In the table below, ``F`` is ``iterator_facade``, ``a`` is an -object of type ``X``, ``b`` and ``c`` are objects of type ``const X``, -``n`` is an object of ``F::difference_type``, ``y`` is a constant -object of a single pass iterator type interoperable with ``X``, and ``z`` -is a constant object of a random access traversal iterator type -interoperable with ``X``. - -.. _`core operations`: - -.. topic:: ``iterator_facade`` Core Operations - - +--------------------+----------------------+-------------------------+---------------------------+ - |Expression |Return Type |Assertion/Note |Used to implement Iterator | - | | | |Concept(s) | - +====================+======================+=========================+===========================+ - |``c.dereference()`` |``F::reference`` | |Readable Iterator, Writable| - | | | |Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - |``c.equal(y)`` |convertible to bool |true iff ``c`` and ``y`` |Single Pass Iterator | - | | |refer to the same | | - | | |position. | | - +--------------------+----------------------+-------------------------+---------------------------+ - |``a.increment()`` |unused | |Incrementable Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - |``a.decrement()`` |unused | |Bidirectional Traversal | - | | | |Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - |``a.advance(n)`` |unused | |Random Access Traversal | - | | | |Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - |``c.distance_to(z)``|convertible to |equivalent to |Random Access Traversal | - | |``F::difference_type``|``distance(c, X(z))``. |Iterator | - +--------------------+----------------------+-------------------------+---------------------------+ - - - -``iterator_facade`` operations ------------------------------- - -The operations in this section are described in terms of operations on -the core interface of ``Derived`` which may be inaccessible -(i.e. private). The implementation should access these operations -through member functions of class ``iterator_core_access``. - -``reference operator*() const;`` - -:Returns: ``static_cast(this)->dereference()`` - -``operator->() const;`` (see below__) - -__ `operator arrow`_ - -:Returns: If ``reference`` is a reference type, an object - of type ``pointer`` equal to:: - - &static_cast(this)->dereference() - - Otherwise returns an object of unspecified type such that, - ``(*static_cast(this))->m`` is equivalent to ``(w = **static_cast(this), - w.m)`` for some temporary object ``w`` of type ``value_type``. - -.. _brackets: - -*unspecified* ``operator[](difference_type n) const;`` - -:Returns: an object convertible to ``value_type``. For constant - objects ``v`` of type ``value_type``, and ``n`` of type - ``difference_type``, ``(*this)[n] = v`` is equivalent to - ``*(*this + n) = v``, and ``static_cast((*this)[n])`` is equivalent to - ``static_cast(*(*this + n))`` - - - -``Derived& operator++();`` - -:Effects: - - :: - - static_cast(this)->increment(); - return *static_cast(this); - -``Derived operator++(int);`` - -:Effects: - - :: - - Derived tmp(static_cast(this)); - ++*this; - return tmp; - - -``Derived& operator--();`` - -:Effects: - - :: - - static_cast(this)->decrement(); - return *static_cast(this); - - -``Derived operator--(int);`` - -:Effects: - - :: - - Derived tmp(static_cast(this)); - --*this; - return tmp; - - -``Derived& operator+=(difference_type n);`` - -:Effects: - - :: - - static_cast(this)->advance(n); - return *static_cast(this); - - -``Derived& operator-=(difference_type n);`` - -:Effects: - - :: - - static_cast(this)->advance(-n); - return *static_cast(this); - - -``Derived operator-(difference_type n) const;`` - -:Effects: - - :: - - Derived tmp(static_cast(this)); - return tmp -= n; - -:: - - template - Derived operator+ (iterator_facade const&, - typename Derived::difference_type n); - - template - Derived operator+ (typename Derived::difference_type n, - iterator_facade const&); - -:Effects: - - :: - - Derived tmp(static_cast(this)); - return tmp += n; - - -:: - - template - typename enable_if_interoperable::type - operator ==(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Returns: - if ``is_convertible::value`` - - then - ``((Dr1 const&)lhs).equal((Dr2 const&)rhs)``. - - Otherwise, - ``((Dr2 const&)rhs).equal((Dr1 const&)lhs)``. - -:: - - template - typename enable_if_interoperable::type - operator !=(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Returns: - if ``is_convertible::value`` - - then - ``!((Dr1 const&)lhs).equal((Dr2 const&)rhs)``. - - Otherwise, - ``!((Dr2 const&)rhs).equal((Dr1 const&)lhs)``. - -:: - - template - typename enable_if_interoperable::type - operator <(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Returns: - if ``is_convertible::value`` - - then - ``((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) < 0``. - - Otherwise, - ``((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0``. - -:: - - template - typename enable_if_interoperable::type - operator <=(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Returns: - if ``is_convertible::value`` - - then - ``((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) <= 0``. - - Otherwise, - ``((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0``. - -:: - - template - typename enable_if_interoperable::type - operator >(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Returns: - if ``is_convertible::value`` - - then - ``((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) > 0``. - - Otherwise, - ``((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0``. - - -:: - - template - typename enable_if_interoperable::type - operator >=(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Returns: - if ``is_convertible::value`` - - then - ``((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) >= 0``. - - Otherwise, - ``((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0``. - -.. _minus: - -:: - - template - typename enable_if_interoperable::type - operator -(iterator_facade const& lhs, - iterator_facade const& rhs); - -:Return Type: - if ``is_convertible::value`` - - then - ``difference`` shall be - ``iterator_traits::difference_type``. - - Otherwise - ``difference`` shall be ``iterator_traits::difference_type`` - -:Returns: - if ``is_convertible::value`` - - then - ``-((Dr1 const&)lhs).distance_to((Dr2 const&)rhs)``. - - Otherwise, - ``((Dr2 const&)rhs).distance_to((Dr1 const&)lhs)``. diff --git a/libs/iterator/doc/iterator_facade_tutorial.rst b/libs/iterator/doc/iterator_facade_tutorial.rst deleted file mode 100644 index 75564b772..000000000 --- a/libs/iterator/doc/iterator_facade_tutorial.rst +++ /dev/null @@ -1,523 +0,0 @@ -.. Copyright David Abrahams 2004. 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) - -In this section we'll walk through the implementation of a few -iterators using ``iterator_facade``, based around the simple -example of a linked list of polymorphic objects. This example was -inspired by a `posting`__ by Keith Macdonald on the `Boost-Users`_ -mailing list. - -.. _`Boost-Users`: http://www.boost.org/more/mailing_lists.htm#users - -__ http://thread.gmane.org/gmane.comp.lib.boost.user/5100 - -The Problem ------------ - -Say we've written a polymorphic linked list node base class:: - - # include - - struct node_base - { - node_base() : m_next(0) {} - - // Each node manages all of its tail nodes - virtual ~node_base() { delete m_next; } - - // Access the rest of the list - node_base* next() const { return m_next; } - - // print to the stream - virtual void print(std::ostream& s) const = 0; - - // double the value - virtual void double_me() = 0; - - void append(node_base* p) - { - if (m_next) - m_next->append(p); - else - m_next = p; - } - - private: - node_base* m_next; - }; - -Lists can hold objects of different types by linking together -specializations of the following template:: - - template - struct node : node_base - { - node(T x) - : m_value(x) - {} - - void print(std::ostream& s) const { s << this->m_value; } - void double_me() { m_value += m_value; } - - private: - T m_value; - }; - -And we can print any node using the following streaming operator:: - - inline std::ostream& operator<<(std::ostream& s, node_base const& n) - { - n.print(s); - return s; - } - -Our first challenge is to build an appropriate iterator over these -lists. - -A Basic Iterator Using ``iterator_facade`` ------------------------------------------- - -We will construct a ``node_iterator`` class using inheritance from -``iterator_facade`` to implement most of the iterator's operations. - -:: - - # include "node.hpp" - # include - - class node_iterator - : public boost::iterator_facade<...> - { - ... - }; - - - -Template Arguments for ``iterator_facade`` -.......................................... - -``iterator_facade`` has several template parameters, so we must decide -what types to use for the arguments. The parameters are ``Derived``, -``Value``, ``CategoryOrTraversal``, ``Reference``, and ``Difference``. - - -``Derived`` -''''''''''' - -Because ``iterator_facade`` is meant to be used with the CRTP -[Cop95]_ the first parameter is the iterator class name itself, -``node_iterator``. - -``Value`` -''''''''' - -The ``Value`` parameter determines the ``node_iterator``\ 's -``value_type``. In this case, we are iterating over ``node_base`` -objects, so ``Value`` will be ``node_base``. - - -``CategoryOrTraversal`` -''''''''''''''''''''''' - -Now we have to determine which `iterator traversal concept`_ our -``node_iterator`` is going to model. Singly-linked lists only have -forward links, so our iterator can't can't be a `bidirectional -traversal iterator`_. Our iterator should be able to make multiple -passes over the same linked list (unlike, say, an -``istream_iterator`` which consumes the stream it traverses), so it -must be a `forward traversal iterator`_. Therefore, we'll pass -``boost::forward_traversal_tag`` in this position [#category]_. - -.. [#category] ``iterator_facade`` also supports old-style category - tags, so we could have passed ``std::forward_iterator_tag`` here; - either way, the resulting iterator's ``iterator_category`` will - end up being ``std::forward_iterator_tag``. - -``Reference`` -''''''''''''' - -The ``Reference`` argument becomes the type returned by -``node_iterator``\ 's dereference operation, and will also be the -same as ``std::iterator_traits::reference``. The -library's default for this parameter is ``Value&``; since -``node_base&`` is a good choice for the iterator's ``reference`` -type, we can omit this argument, or pass ``use_default``. - -``Difference`` -'''''''''''''' - -The ``Difference`` argument determines how the distance between -two ``node_iterator``\ s will be measured and will also be the -same as ``std::iterator_traits::difference_type``. -The library's default for ``Difference`` is ``std::ptrdiff_t``, an -appropriate type for measuring the distance between any two -addresses in memory, and one that works for almost any iterator, -so we can omit this argument, too. - -The declaration of ``node_iterator`` will therefore look something -like:: - - # include "node.hpp" - # include - - class node_iterator - : public boost::iterator_facade< - node_iterator - , node_base - , boost::forward_traversal_tag - > - { - ... - }; - -Constructors and Data Members -............................. - -Next we need to decide how to represent the iterator's position. -This representation will take the form of data members, so we'll -also need to write constructors to initialize them. The -``node_iterator``\ 's position is quite naturally represented using -a pointer to a ``node_base``. We'll need a constructor to build an -iterator from a ``node_base*``, and a default constructor to -satisfy the `forward traversal iterator`_ requirements [#default]_. -Our ``node_iterator`` then becomes:: - - # include "node.hpp" - # include - - class node_iterator - : public boost::iterator_facade< - node_iterator - , node_base - , boost::forward_traversal_tag - > - { - public: - node_iterator() - : m_node(0) - {} - - explicit node_iterator(node_base* p) - : m_node(p) - {} - - private: - ... - node_base* m_node; - }; - -.. [#default] Technically, the C++ standard places almost no - requirements on a default-constructed iterator, so if we were - really concerned with efficiency, we could've written the - default constructor to leave ``m_node`` uninitialized. - -Implementing the Core Operations -................................ - -The last step is to implement the `core operations`_ required by -the concepts we want our iterator to model. Referring to the -table__, we can see that the first three rows are applicable -because ``node_iterator`` needs to satisfy the requirements for -`readable iterator`_, `single pass iterator`_, and `incrementable -iterator`_. - -__ `core operations`_ - -We therefore need to supply ``dereference``, -``equal``, and ``increment`` members. We don't want these members -to become part of ``node_iterator``\ 's public interface, so we can -make them private and grant friendship to -``boost::iterator_core_access``, a "back-door" that -``iterator_facade`` uses to get access to the core operations:: - - # include "node.hpp" - # include - - class node_iterator - : public boost::iterator_facade< - node_iterator - , node_base - , boost::forward_traversal_tag - > - { - public: - node_iterator() - : m_node(0) {} - - explicit node_iterator(node_base* p) - : m_node(p) {} - - private: - friend class boost::iterator_core_access; - - void increment() { m_node = m_node->next(); } - - bool equal(node_iterator const& other) const - { - return this->m_node == other.m_node; - } - - node_base& dereference() const { return *m_node; } - - node_base* m_node; - }; - -Voilà; a complete and conforming readable, forward-traversal -iterator! For a working example of its use, see `this program`__. - -__ ../example/node_iterator1.cpp - -A constant ``node_iterator`` ----------------------------- - -.. Sidebar:: Constant and Mutable iterators - - The term **mutable iterator** means an iterator through which - the object it references (its "referent") can be modified. A - **constant iterator** is one which doesn't allow modification of - its referent. - - The words *constant* and *mutable* don't refer to the ability to - modify the iterator itself. For example, an ``int const*`` is a - non-\ ``const`` *constant iterator*, which can be incremented - but doesn't allow modification of its referent, and ``int* - const`` is a ``const`` *mutable iterator*, which cannot be - modified but which allows modification of its referent. - - Confusing? We agree, but those are the standard terms. It - probably doesn't help much that a container's constant iterator - is called ``const_iterator``. - -Now, our ``node_iterator`` gives clients access to both ``node``\ -'s ``print(std::ostream&) const`` member function, but also its -mutating ``double_me()`` member. If we wanted to build a -*constant* ``node_iterator``, we'd only have to make three -changes: - -.. parsed-literal:: - - class const_node_iterator - : public boost::iterator_facade< - const_node_iterator - , node_base **const** - , boost::forward_traversal_tag - > - { - public: - const_node_iterator() - : m_node(0) {} - - explicit const_node_iterator(node_base* p) - : m_node(p) {} - - private: - friend class boost::iterator_core_access; - - void increment() { m_node = m_node->next(); } - - bool equal(const_node_iterator const& other) const - { - return this->m_node == other.m_node; - } - - node_base **const**\ & dereference() const { return \*m_node; } - - node_base **const**\ * m_node; - }; - -.. Sidebar:: ``const`` and an iterator's ``value_type`` - - The C++ standard requires an iterator's ``value_type`` *not* be - ``const``\ -qualified, so ``iterator_facade`` strips the - ``const`` from its ``Value`` parameter in order to produce the - iterator's ``value_type``. Making the ``Value`` argument - ``const`` provides a useful hint to ``iterator_facade`` that the - iterator is a *constant iterator*, and the default ``Reference`` - argument will be correct for all lvalue iterators. - -As a matter of fact, ``node_iterator`` and ``const_node_iterator`` -are so similar that it makes sense to factor the common code out -into a template as follows:: - - template - class node_iter - : public boost::iterator_facade< - node_iter - , Value - , boost::forward_traversal_tag - > - { - public: - node_iter() - : m_node(0) {} - - explicit node_iter(Value* p) - : m_node(p) {} - - private: - friend class boost::iterator_core_access; - - bool equal(node_iter const& other) const - { - return this->m_node == other.m_node; - } - - void increment() - { m_node = m_node->next(); } - - Value& dereference() const - { return *m_node; } - - Value* m_node; - }; - typedef node_iter node_iterator; - typedef node_iter node_const_iterator; - - -Interoperability ----------------- - -Our ``const_node_iterator`` works perfectly well on its own, but -taken together with ``node_iterator`` it doesn't quite meet -expectations. For example, we'd like to be able to pass a -``node_iterator`` where a ``node_const_iterator`` was expected, -just as you can with ``std::list``\ 's ``iterator`` and -``const_iterator``. Furthermore, given a ``node_iterator`` and a -``node_const_iterator`` into the same list, we should be able to -compare them for equality. - -This expected ability to use two different iterator types together -is known as |interoperability|_. Achieving interoperability in -our case is as simple as templatizing the ``equal`` function and -adding a templatized converting constructor [#broken]_ [#random]_:: - - template - class node_iter - : public boost::iterator_facade< - node_iter - , Value - , boost::forward_traversal_tag - > - { - public: - node_iter() - : m_node(0) {} - - explicit node_iter(Value* p) - : m_node(p) {} - - template - node_iter(node_iter const& other) - : m_node(other.m_node) {} - - private: - friend class boost::iterator_core_access; - template friend class node_iter; - - template - bool equal(node_iter const& other) const - { - return this->m_node == other.m_node; - } - - void increment() - { m_node = m_node->next(); } - - Value& dereference() const - { return *m_node; } - - Value* m_node; - }; - typedef impl::node_iterator node_iterator; - typedef impl::node_iterator node_const_iterator; - -.. |interoperability| replace:: **interoperability** -.. _interoperability: new-iter-concepts.html#interoperable-iterators-lib-interoperable-iterators - -.. [#broken] If you're using an older compiler and it can't handle - this example, see the `example code`__ for workarounds. - -.. [#random] If ``node_iterator`` had been a `random access - traversal iterator`_, we'd have had to templatize its - ``distance_to`` function as well. - - -__ ../example/node_iterator2.hpp - -You can see an example program which exercises our interoperable -iterators `here`__. - -__ ../example/node_iterator2.cpp - -Telling the Truth ------------------ - -Now ``node_iterator`` and ``node_const_iterator`` behave exactly as -you'd expect... almost. We can compare them and we can convert in -one direction: from ``node_iterator`` to ``node_const_iterator``. -If we try to convert from ``node_const_iterator`` to -``node_iterator``, we'll get an error when the converting -constructor tries to initialize ``node_iterator``\ 's ``m_node``, a -``node*`` with a ``node const*``. So what's the problem? - -The problem is that -``boost::``\ |is_convertible|_\ ``::value`` -will be ``true``, but it should be ``false``. |is_convertible|_ -lies because it can only see as far as the *declaration* of -``node_iter``\ 's converting constructor, but can't look inside at -the *definition* to make sure it will compile. A perfect solution -would make ``node_iter``\ 's converting constructor disappear when -the ``m_node`` conversion would fail. - -.. |is_convertible| replace:: ``is_convertible`` -.. _is_convertible: ../../type_traits/index.html#relationships - -In fact, that sort of magic is possible using -|enable_if|__. By rewriting the converting constructor as -follows, we can remove it from the overload set when it's not -appropriate:: - - #include - #include - - ... - - private: - struct enabler {}; - - public: - template - node_iter( - node_iter const& other - , typename boost::enable_if< - boost::is_convertible - , enabler - >::type = enabler() - ) - : m_node(other.m_node) {} - -.. |enable_if| replace:: ``boost::enable_if`` -__ ../../utility/enable_if.html - - -Wrap Up -------- - -This concludes our ``iterator_facade`` tutorial, but before you -stop reading we urge you to take a look at |iterator_adaptor|__. -There's another way to approach writing these iterators which might -even be superior. - -.. |iterator_adaptor| replace:: ``iterator_adaptor`` -__ iterator_adaptor.html - -.. _`iterator traversal concept`: new-iter-concepts.html#iterator-traversal-concepts-lib-iterator-traversal -.. _`readable iterator`: new-iter-concepts.html#readable-iterators-lib-readable-iterators -.. _`lvalue iterator`: new-iter-concepts.html#lvalue-iterators-lib-lvalue-iterators -.. _`single pass iterator`: new-iter-concepts.html#single-pass-iterators-lib-single-pass-iterators -.. _`incrementable iterator`: new-iter-concepts.html#incrementable-iterators-lib-incrementable-iterators -.. _`forward traversal iterator`: new-iter-concepts.html#forward-traversal-iterators-lib-forward-traversal-iterators -.. _`bidirectional traversal iterator`: new-iter-concepts.html#bidirectional-traversal-iterators-lib-bidirectional-traversal-iterators -.. _`random access traversal iterator`: new-iter-concepts.html#random-access-traversal-iterators-lib-random-access-traversal-iterators - diff --git a/libs/iterator/doc/iterator_traits.html b/libs/iterator/doc/iterator_traits.html deleted file mode 100644 index ed892416c..000000000 --- a/libs/iterator/doc/iterator_traits.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - -Iterator Traits - - - - - - - -

-

Iterator Traits

- --- - - - - - - - - - - - -
Author:David Abrahams
Contact:dave@boost-consulting.com
Organization:Boost Consulting
Date:$Date$
Copyright:Copyright David Abrahams 2004.
- - - - --- - - - -
abstract:Header <boost/iterator/iterator_traits.hpp> provides -the ability to access an iterator's associated types using -MPL-compatible metafunctions.
-
-

Overview

-

std::iterator_traits provides access to five associated types -of any iterator: its value_type, reference, pointer, -iterator_category, and difference_type. Unfortunately, -such a "multi-valued" traits template can be difficult to use in a -metaprogramming context. <boost/iterator/iterator_traits.hpp> -provides access to these types using a standard metafunctions.

-
-
-

Summary

-

Header <boost/iterator/iterator_traits.hpp>:

-
-template <class Iterator>
-struct iterator_value
-{
-    typedef typename
-      std::iterator_traits<Iterator>::value_type
-    type;
-};
-
-template <class Iterator>
-struct iterator_reference
-{
-    typedef typename
-      std::iterator_traits<Iterator>::reference
-    type;
-};
-
-
-template <class Iterator>
-struct iterator_pointer
-{
-    typedef typename
-      std::iterator_traits<Iterator>::pointer
-    type;
-};
-
-template <class Iterator>
-struct iterator_difference
-{
-    typedef typename
-      detail::iterator_traits<Iterator>::difference_type
-    type;
-};
-
-template <class Iterator>
-struct iterator_category
-{
-    typedef typename
-      detail::iterator_traits<Iterator>::iterator_category
-    type;
-};
-
-
-
- - - diff --git a/libs/iterator/doc/iterator_traits.pdf b/libs/iterator/doc/iterator_traits.pdf deleted file mode 100644 index b5c765a81e404eefe815b9d4dc1ac051af3ba470..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49650 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 HaiaeN8zBeD diff --git a/libs/iterator/doc/iterator_traits.rst b/libs/iterator/doc/iterator_traits.rst deleted file mode 100644 index 664001a22..000000000 --- a/libs/iterator/doc/iterator_traits.rst +++ /dev/null @@ -1,77 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -+++++++++++++++++ - Iterator Traits -+++++++++++++++++ - -:Author: David Abrahams -:Contact: dave@boost-consulting.com -:organization: `Boost Consulting`_ -:date: $Date$ -:copyright: Copyright David Abrahams 2004. - -.. _`Boost Consulting`: http://www.boost-consulting.com - -:abstract: Header ```` provides - the ability to access an iterator's associated types using - MPL-compatible metafunctions_. - -.. _metafunctions: ../../mpl/doc/index.html#metafunctions - -Overview -======== - -``std::iterator_traits`` provides access to five associated types -of any iterator: its ``value_type``, ``reference``, ``pointer``, -``iterator_category``, and ``difference_type``. Unfortunately, -such a "multi-valued" traits template can be difficult to use in a -metaprogramming context. ```` -provides access to these types using a standard metafunctions_. - -Summary -======= - -Header ````:: - - template - struct iterator_value - { - typedef typename - std::iterator_traits::value_type - type; - }; - - template - struct iterator_reference - { - typedef typename - std::iterator_traits::reference - type; - }; - - - template - struct iterator_pointer - { - typedef typename - std::iterator_traits::pointer - type; - }; - - template - struct iterator_difference - { - typedef typename - detail::iterator_traits::difference_type - type; - }; - - template - struct iterator_category - { - typedef typename - detail::iterator_traits::iterator_category - type; - }; diff --git a/libs/iterator/doc/make_counting_iterator.rst b/libs/iterator/doc/make_counting_iterator.rst deleted file mode 100644 index 84770939f..000000000 --- a/libs/iterator/doc/make_counting_iterator.rst +++ /dev/null @@ -1,12 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -:: - - template - counting_iterator make_counting_iterator(Incrementable x); - -:Returns: An instance of ``counting_iterator`` - with ``current`` constructed from ``x``. - diff --git a/libs/iterator/doc/make_filter_iterator.rst b/libs/iterator/doc/make_filter_iterator.rst deleted file mode 100644 index 4374b60a1..000000000 --- a/libs/iterator/doc/make_filter_iterator.rst +++ /dev/null @@ -1,19 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -:: - - template - filter_iterator - make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator()); - -:Returns: filter_iterator(f, x, end) - -:: - - template - filter_iterator - make_filter_iterator(Iterator x, Iterator end = Iterator()); - -:Returns: filter_iterator(x, end) diff --git a/libs/iterator/doc/make_reverse_iterator.rst b/libs/iterator/doc/make_reverse_iterator.rst deleted file mode 100644 index dea136419..000000000 --- a/libs/iterator/doc/make_reverse_iterator.rst +++ /dev/null @@ -1,13 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -:: - - template - reverse_iteratorn - make_reverse_iterator(BidirectionalIterator x); - -:Returns: An instance of ``reverse_iterator`` - with a ``current`` constructed from ``x``. - diff --git a/libs/iterator/doc/make_transform_iterator.rst b/libs/iterator/doc/make_transform_iterator.rst deleted file mode 100644 index 6ac566bf4..000000000 --- a/libs/iterator/doc/make_transform_iterator.rst +++ /dev/null @@ -1,23 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -:: - - template - transform_iterator - make_transform_iterator(Iterator it, UnaryFunction fun); - -:Returns: An instance of ``transform_iterator`` with ``m_f`` - initialized to ``f`` and ``m_iterator`` initialized to ``x``. - - - -:: - - template - transform_iterator - make_transform_iterator(Iterator it); - -:Returns: An instance of ``transform_iterator`` with ``m_f`` - default constructed and ``m_iterator`` initialized to ``x``. diff --git a/libs/iterator/doc/make_zip_iterator.rst b/libs/iterator/doc/make_zip_iterator.rst deleted file mode 100644 index e74b8953f..000000000 --- a/libs/iterator/doc/make_zip_iterator.rst +++ /dev/null @@ -1,12 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -:: - - template - zip_iterator - make_zip_iterator(IteratorTuple t); - -:Returns: An instance of ``zip_iterator`` with ``m_iterator_tuple`` - initialized to ``t``. diff --git a/libs/iterator/doc/new-iter-concepts.html b/libs/iterator/doc/new-iter-concepts.html deleted file mode 100644 index 426bedeb3..000000000 --- a/libs/iterator/doc/new-iter-concepts.html +++ /dev/null @@ -1,1029 +0,0 @@ - - - - - - -New Iterator Concepts - - - - - - - -
-

New Iterator Concepts

- --- - - - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
Organization:Boost Consulting, Indiana University Open Systems -Lab, Zephyr Associates, Inc.
Date:2006-09-11
Number:This is a revised version of n1550=03-0133, which was -accepted for Technical Report 1 by the C++ standard -committee's library working group. This proposal is a -revision of paper n1297, n1477, and n1531.
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt -2003.
- - - - - --- - - - -
Abstract:We propose a new system of iterator concepts that treat -access and positioning independently. This allows the -concepts to more closely match the requirements -of algorithms and provides better categorizations -of iterators that are used in practice.
- -
-

Motivation

-

The standard iterator categories and requirements are flawed because -they use a single hierarchy of concepts to address two orthogonal -issues: iterator traversal and value access. As a result, many -algorithms with requirements expressed in terms of the iterator -categories are too strict. Also, many real-world iterators can not be -accurately categorized. A proxy-based iterator with random-access -traversal, for example, may only legally have a category of "input -iterator", so generic algorithms are unable to take advantage of its -random-access capabilities. The current iterator concept hierarchy is -geared towards iterator traversal (hence the category names), while -requirements that address value access sneak in at various places. The -following table gives a summary of the current value access -requirements in the iterator categories.

- ---- - - - - - - - - - - - - - - - - - - -
Value Access Requirements in Existing Iterator Categories
Output Iterator*i = a
Input Iterator*i is convertible to T
Forward Iterator*i is T& (or const T& once issue 200 -is resolved)
Random Access Iteratori[n] is convertible to T (also i[n] = t -is required for mutable iterators once issue 299 -is resolved)
-

Because iterator traversal and value access are mixed together in a -single hierarchy, many useful iterators can not be appropriately -categorized. For example, vector<bool>::iterator is almost a -random access iterator, but the return type is not bool& (see -issue 96 and Herb Sutter's paper J16/99-0008 = WG21 -N1185). Therefore, the iterators of vector<bool> only meet the -requirements of input iterator and output iterator. This is so -nonintuitive that the C++ standard contradicts itself on this point. -In paragraph 23.2.4/1 it says that a vector is a sequence that -supports random access iterators.

-

Another difficult-to-categorize iterator is the transform iterator, an -adaptor which applies a unary function object to the dereferenced -value of the some underlying iterator (see transform_iterator). -For unary functions such as times, the return type of -operator* clearly needs to be the result_type of the function -object, which is typically not a reference. Because random access -iterators are required to return lvalues from operator*, if you -wrap int* with a transform iterator, you do not get a random -access iterator as might be expected, but an input iterator.

-

A third example is found in the vertex and edge iterators of the -Boost Graph Library. These iterators return vertex and edge -descriptors, which are lightweight handles created on-the-fly. They -must be returned by-value. As a result, their current standard -iterator category is input_iterator_tag, which means that, -strictly speaking, you could not use these iterators with algorithms -like min_element(). As a temporary solution, the concept -Multi-Pass Input Iterator was introduced to describe the vertex and -edge descriptors, but as the design notes for the concept suggest, a -better solution is needed.

-

In short, there are many useful iterators that do not fit into the -current standard iterator categories. As a result, the following bad -things happen:

-
    -
  • Iterators are often mis-categorized.
  • -
  • Algorithm requirements are more strict than necessary, because they -cannot separate the need for random access or bidirectional -traversal from the need for a true reference return type.
  • -
-
-
-

Impact on the Standard

-

This proposal for TR1 is a pure extension. Further, the new iterator -concepts are backward-compatible with the old iterator requirements, -and old iterators are forward-compatible with the new iterator -concepts. That is to say, iterators that satisfy the old requirements -also satisfy appropriate concepts in the new system, and iterators -modeling the new concepts will automatically satisfy the appropriate -old requirements.

- - -
-

Possible (but not proposed) Changes to the Working Paper

-

The extensions in this paper suggest several changes we might make -to the working paper for the next standard. These changes are not -a formal part of this proposal for TR1.

-
-

Changes to Algorithm Requirements

-

The algorithms in the standard library could benefit from the new -iterator concepts because the new concepts provide a more accurate way -to express their type requirements. The result is algorithms that are -usable in more situations and have fewer type requirements.

-

For the next working paper (but not for TR1), the committee should -consider the following changes to the type requirements of algorithms. -These changes are phrased as textual substitutions, listing the -algorithms to which each textual substitution applies.

-

Forward Iterator -> Forward Traversal Iterator and Readable Iterator

-
-find_end, adjacent_find, search, search_n, rotate_copy, -lower_bound, upper_bound, equal_range, binary_search, -min_element, max_element
-

Forward Iterator (1) -> Single Pass Iterator and Readable Iterator, -Forward Iterator (2) -> Forward Traversal Iterator and Readable Iterator

-
-find_first_of
-

Forward Iterator -> Readable Iterator and Writable Iterator

-
-iter_swap
-

Forward Iterator -> Single Pass Iterator and Writable Iterator

-
-fill, generate
-

Forward Iterator -> Forward Traversal Iterator and Swappable Iterator

-
-rotate
-

Forward Iterator (1) -> Swappable Iterator and Single Pass Iterator, -Forward Iterator (2) -> Swappable Iterator and Incrementable Iterator

-
-swap_ranges
-
-
Forward Iterator -> Forward Traversal Iterator and Readable Iterator and Writable Iterator
-
remove, remove_if, unique
-
-

Forward Iterator -> Single Pass Iterator and Readable Iterator and Writable Iterator

-
-replace, replace_if
-
-
Bidirectional Iterator -> Bidirectional Traversal Iterator and Swappable Iterator
-
reverse
-
Bidirectional Iterator -> Bidirectional Traversal Iterator and Readable and Swappable Iterator
-
partition
-
-

Bidirectional Iterator (1) -> Bidirectional Traversal Iterator and Readable Iterator, -Bidirectional Iterator (2) -> Bidirectional Traversal Iterator and Writable Iterator

-
-copy_backwards
-
-
Bidirectional Iterator -> Bidirectional Traversal Iterator and Swappable Iterator and Readable Iterator
-
next_permutation, prev_permutation
-
Bidirectional Iterator -> Bidirectional Traversal Iterator and Readable Iterator and Writable Iterator
-
stable_partition, inplace_merge
-
Bidirectional Iterator -> Bidirectional Traversal Iterator and Readable Iterator
-
reverse_copy
-
Random Access Iterator -> Random Access Traversal Iterator and Readable and Writable Iterator
-
random_shuffle, sort, stable_sort, partial_sort, nth_element, push_heap, pop_heap -make_heap, sort_heap
-
Input Iterator (2) -> Incrementable Iterator and Readable Iterator
-
equal, mismatch
-
Input Iterator (2) -> Incrementable Iterator and Readable Iterator
-
transform
-
-
-
-

Deprecations

-

For the next working paper (but not for TR1), the committee should -consider deprecating the old iterator tags, and -std::iterator_traits, since it will be superceded by individual -traits metafunctions.

-
-
-

vector<bool>

-

For the next working paper (but not for TR1), the committee should -consider reclassifying vector<bool>::iterator as a Random -Access Traversal Iterator and Readable Iterator and Writable -Iterator.

-
-
-
-
-

Design

-

The iterator requirements are to be separated into two groups. One set -of concepts handles the syntax and semantics of value access:

-
    -
  • Readable Iterator
  • -
  • Writable Iterator
  • -
  • Swappable Iterator
  • -
  • Lvalue Iterator
  • -
-

The access concepts describe requirements related to operator* and -operator->, including the value_type, reference, and -pointer associated types.

-

The other set of concepts handles traversal:

-
    -
  • Incrementable Iterator
  • -
  • Single Pass Iterator
  • -
  • Forward Traversal Iterator
  • -
  • Bidirectional Traversal Iterator
  • -
  • Random Access Traversal Iterator
  • -
-

The refinement relationships for the traversal concepts are in the -following diagram.

-traversal.png -

In addition to the iterator movement operators, such as -operator++, the traversal concepts also include requirements on -position comparison such as operator== and operator<. The -reason for the fine grain slicing of the concepts into the -Incrementable and Single Pass is to provide concepts that are exact -matches with the original input and output iterator requirements.

-

This proposal also includes a concept for specifying when an iterator -is interoperable with another iterator, in the sense that int* is -interoperable with int const*.

-
    -
  • Interoperable Iterators
  • -
-

The relationship between the new iterator concepts and the old are -given in the following diagram.

-oldeqnew.png -

Like the old iterator requirements, we provide tags for purposes of -dispatching based on the traversal concepts. The tags are related via -inheritance so that a tag is convertible to another tag if the concept -associated with the first tag is a refinement of the second tag.

-

Our design reuses iterator_traits<Iter>::iterator_category to -indicate an iterator's traversal capability. To specify -capabilities not captured by any old-style iterator category, an -iterator designer can use an iterator_category type that is -convertible to both the the most-derived old iterator category tag -which fits, and the appropriate new iterator traversal tag.

- -

We do not provide tags for the purposes of dispatching based on the -access concepts, in part because we could not find a way to -automatically infer the right access tags for old-style iterators. -An iterator's writability may be dependent on the assignability of -its value_type and there's no known way to detect whether an -arbitrary type is assignable. Fortunately, the need for -dispatching based on access capability is not as great as the need -for dispatching based on traversal capability.

-

A difficult design decision concerned the operator[]. The direct -approach for specifying operator[] would have a return type of -reference; the same as operator*. However, going in this -direction would mean that an iterator satisfying the old Random Access -Iterator requirements would not necessarily be a model of Readable or -Writable Lvalue Iterator. Instead we have chosen a design that -matches the preferred resolution of issue 299: operator[] is -only required to return something convertible to the value_type -(for a Readable Iterator), and is required to support assignment -i[n] = t (for a Writable Iterator).

-
-
-

Proposed Text

-
-

Addition to [lib.iterator.requirements]

-
-

Iterator Value Access Concepts [lib.iterator.value.access]

-

In the tables below, X is an iterator type, a is a constant -object of type X, R is -std::iterator_traits<X>::reference, T is -std::iterator_traits<X>::value_type, and v is a constant -object of type T.

-
-

Readable Iterators [lib.readable.iterators]

-

A class or built-in type X models the Readable Iterator concept -for value type T if, in addition to X being Assignable and -Copy Constructible, the following expressions are valid and respect -the stated semantics. U is the type of any specified member of -type T.

- ----- - - - - - - - - - - - - - - - - - - - - - - -
Readable Iterator Requirements (in addition to Assignable and Copy Constructible)
ExpressionReturn TypeNote/Precondition
iterator_traits<X>::value_typeTAny non-reference, -non-cv-qualified type
*aConvertible to T
-
pre: a is dereferenceable. If a == b then *a
-
is equivalent to *b.
-
-
a->mU&pre: pre: (*a).m is well-defined. Equivalent to (*a).m.
- -
-
-

Writable Iterators [lib.writable.iterators]

-

A class or built-in type X models the Writable Iterator concept -if, in addition to X being Copy Constructible, the following -expressions are valid and respect the stated semantics. Writable -Iterators have an associated set of value types.

- ----- - - - - - - - - - - - - - - -
Writable Iterator Requirements (in addition to Copy Constructible)
ExpressionReturn TypePrecondition
*a = o pre: The type of o -is in the set of -value types of X
-
-
-

Swappable Iterators [lib.swappable.iterators]

-

A class or built-in type X models the Swappable Iterator concept -if, in addition to X being Copy Constructible, the following -expressions are valid and respect the stated semantics.

- ----- - - - - - - - - - - - - - - -
Swappable Iterator Requirements (in addition to Copy Constructible)
ExpressionReturn TypePostcondition
iter_swap(a, b)voidthe pointed to values are -exchanged
-

[Note: An iterator that is a model of the Readable Iterator and -Writable Iterator concepts is also a model of Swappable -Iterator. --end note]

-
-
-

Lvalue Iterators [lib.lvalue.iterators]

-

The Lvalue Iterator concept adds the requirement that the return -type of operator* type be a reference to the value type of the -iterator.

- ----- - - - - - - - - - - - - - - -
Lvalue Iterator Requirements
ExpressionReturn TypeNote/Assertion
*aT&T is cv -iterator_traits<X>::value_type -where cv is an optional -cv-qualification. pre: a is -dereferenceable.
-

If X is a Writable Iterator then a == b if and only if -*a is the same object as *b. If X is a Readable -Iterator then a == b implies *a is the same object as -*b.

-
-
-
-

Iterator Traversal Concepts [lib.iterator.traversal]

-

In the tables below, X is an iterator type, a and b are -constant objects of type X, r and s are mutable objects of -type X, T is std::iterator_traits<X>::value_type, and -v is a constant object of type T.

-
-

Incrementable Iterators [lib.incrementable.iterators]

-

A class or built-in type X models the Incrementable Iterator -concept if, in addition to X being Assignable and Copy -Constructible, the following expressions are valid and respect the -stated semantics.

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - -
Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible)
ExpressionReturn TypeAssertion
++rX&&r == &++r
r++  
*r++  
iterator_traversal<X>::typeConvertible to -incrementable_traversal_tag 
-

If X is a Writable Iterator then X a(r++); is equivalent -to X a(r); ++r; and *r++ = o is equivalent -to *r = o; ++r. -If X is a Readable Iterator then T z(*r++); is equivalent -to T z(*r); ++r;.

- -
-
-

Single Pass Iterators [lib.single.pass.iterators]

-

A class or built-in type X models the Single Pass Iterator -concept if the following expressions are valid and respect the stated -semantics.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality -Comparable)
ExpressionReturn TypeOperational -SemanticsAssertion/ -Pre-/Post-condition
++rX& pre: r is -dereferenceable; post: -r is dereferenceable or -r is past-the-end
a == bconvertible to bool == is an equivalence -relation over its domain
a != bconvertible to bool!(a == b) 
iterator_traits<X>::difference_typeA signed integral type -representing the distance -between iterators  
iterator_traversal<X>::typeConvertible to -single_pass_traversal_tag  
- -
-
-

Forward Traversal Iterators [lib.forward.traversal.iterators]

-

A class or built-in type X models the Forward Traversal Iterator -concept if, in addition to X meeting the requirements of Default -Constructible and Single Pass Iterator, the following expressions are -valid and respect the stated semantics.

- ----- - - - - - - - - - - - - - - - - - - - - - - -
Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator)
ExpressionReturn TypeAssertion/Note
X u;X&note: u may have a -singular value.
++rX&r == s and r is -dereferenceable implies -++r == ++s.
iterator_traversal<X>::typeConvertible to -forward_traversal_tag 
- -
-
-

Bidirectional Traversal Iterators [lib.bidirectional.traversal.iterators]

-

A class or built-in type X models the Bidirectional Traversal -Iterator concept if, in addition to X meeting the requirements of -Forward Traversal Iterator, the following expressions are valid and -respect the stated semantics.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - -
Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal -Iterator)
ExpressionReturn TypeOperational -SemanticsAssertion/ -Pre-/Post-condition
--rX& 

pre: there exists -s such that r -== ++s. post: -s is -dereferenceable.

-

++(--r) == r. ---r == --s -implies r == -s. &r == &--r.

-
r--convertible to const X&
-{
-  X tmp = r;
-  --r;
-  return tmp;
-}
-
-
 
iterator_traversal<X>::typeConvertible to -bidirectional_traversal_tag  
- -
-
-

Random Access Traversal Iterators [lib.random.access.traversal.iterators]

-

A class or built-in type X models the Random Access Traversal -Iterator concept if the following expressions are valid and respect -the stated semantics. In the table below, Distance is -iterator_traits<X>::difference_type and n represents a -constant object of type Distance.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal Iterator)
ExpressionReturn TypeOperational SemanticsAssertion/ -Precondition
r += nX&
-{
-  Distance m = n;
-  if (m >= 0)
-    while (m--)
-      ++r;
-  else
-    while (m++)
-      --r;
-  return r;
-}
-
-
 
a + n, n + aX{ X tmp = a; return tmp -+= n; } 
r -= nX&return r += -n 
a - nX{ X tmp = a; return tmp --= n; } 
b - aDistancea < b ?  distance(a,b) -: -distance(b,a)pre: there exists a -value n of -Distance such that -a + n == b. b -== a + (b - a).
a[n]convertible to T*(a + n)pre: a is a Readable -Iterator
a[n] = vconvertible to T*(a + n) = vpre: a is a Writable -Iterator
a < bconvertible to boolb - a > 0< is a total -ordering relation
a > bconvertible to boolb < a> is a total -ordering relation
a >= bconvertible to bool!(a < b) 
a <= bconvertible to bool!(a > b) 
iterator_traversal<X>::typeConvertible to -random_access_traversal_tag  
- -
-
-

Interoperable Iterators [lib.interoperable.iterators]

-

A class or built-in type X that models Single Pass Iterator is -interoperable with a class or built-in type Y that also models -Single Pass Iterator if the following expressions are valid and -respect the stated semantics. In the tables below, x is an object -of type X, y is an object of type Y, Distance is -iterator_traits<Y>::difference_type, and n represents a -constant object of type Distance.

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionReturn TypeAssertion/Precondition/Postcondition
y = xYpost: y == x
Y(x)Ypost: Y(x) == x
x == yconvertible to bool== is an equivalence relation over its domain.
y == xconvertible to bool== is an equivalence relation over its domain.
x != yconvertible to boolbool(a==b) != bool(a!=b) over its domain.
y != xconvertible to boolbool(a==b) != bool(a!=b) over its domain.
-

If X and Y both model Random Access Traversal Iterator then -the following additional requirements must be met.

- ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ExpressionReturn TypeOperational SemanticsAssertion/ Precondition
x < yconvertible to booly - x > 0< is a total ordering relation
y < xconvertible to boolx - y > 0< is a total ordering relation
x > yconvertible to booly < x> is a total ordering relation
y > xconvertible to boolx < y> is a total ordering relation
x >= yconvertible to bool!(x < y) 
y >= xconvertible to bool!(y < x) 
x <= yconvertible to bool!(x > y) 
y <= xconvertible to bool!(y > x) 
y - xDistancedistance(Y(x),y)pre: there exists a value n of -Distance such that x + n == y. -y == x + (y - x).
x - yDistancedistance(y,Y(x))pre: there exists a value n of -Distance such that y + n == x. -x == y + (x - y).
-
-
-
-
-

Addition to [lib.iterator.synopsis]

-
-// lib.iterator.traits, traits and tags
-template <class Iterator> struct is_readable_iterator;
-template <class Iterator> struct iterator_traversal;
-
-struct incrementable_traversal_tag { };
-struct single_pass_traversal_tag : incrementable_traversal_tag { };
-struct forward_traversal_tag : single_pass_traversal_tag { };
-struct bidirectional_traversal_tag : forward_traversal_tag { };
-struct random_access_traversal_tag : bidirectional_traversal_tag { };
-
-
-
-

Addition to [lib.iterator.traits]

-

The is_readable_iterator class -template satisfies the UnaryTypeTrait requirements.

-

Given an iterator type X, is_readable_iterator<X>::value -yields true if, for an object a of type X, *a is -convertible to iterator_traits<X>::value_type, and false -otherwise.

-

iterator_traversal<X>::type is

-
-category-to-traversal(iterator_traits<X>::iterator_category)
-
-

where category-to-traversal is defined as follows

-
-category-to-traversal(C) =
-    if (C is convertible to incrementable_traversal_tag)
-        return C;
-    else if (C is convertible to random_access_iterator_tag)
-        return random_access_traversal_tag;
-    else if (C is convertible to bidirectional_iterator_tag)
-        return bidirectional_traversal_tag;
-    else if (C is convertible to forward_iterator_tag)
-        return forward_traversal_tag;
-    else if (C is convertible to input_iterator_tag)
-        return single_pass_traversal_tag;
-    else if (C is convertible to output_iterator_tag)
-        return incrementable_traversal_tag;
-    else
-        the program is ill-formed
-
-
-
-
-

Footnotes

-

The UnaryTypeTrait concept is defined in n1519; the LWG is -considering adding the requirement that specializations are derived -from their nested ::type.

- -
-
- - - diff --git a/libs/iterator/doc/new-iter-concepts.pdf b/libs/iterator/doc/new-iter-concepts.pdf deleted file mode 100644 index aa680ec96e1fffcee99b52be9ac8c528d8d1c72c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175676 zcmb?@2Ut_f);3ZFl%{lr04hZwgpdRTM2Zxp_l}eRp#=y zApxtq*&{(ApGC1p?rt=1|(ofw6mQP2m&Gb zDF^mBf0ly;EN*9qcESpB^vpx?K}QuHJznsz(r=GCdIID~OvpF6j#PjgRRB4v;k%6A zR5+^Ss2xH4N44-D)xv*N3;$6q{71DMH6!SoX8cFB@E_H}e&3JMAdf`Ge}jUACdTYbAj5^d)M zTw*}5Lvem-KdfATY`?>nBLPdG9nFxA-yXq-tx^^QmIM0WFbM*JV3SmlrcS^$M39eH zh#$cZf@38>0R0T*$dvbZDpYC_8JQi$Fgu_sGtGB7hC5 z0#5<{fjDf9Q8rHKOJ>F{$SWpjG{%X?6m5rbwsAt)S@4>oZ8@=e{4@n@5B<-oK>6U< z#uWHP6$G3Y3J1*KUr@yggF;$gL1S!qQO>+bGw0tlz}n~kt^v>)0s=6g>A!b|078ft z&IcIXzo3CD%E{>p#>veFX>8_#!k``hq9d?o{XeVm)28@^0OJzi2l2xMdHIEa0RZ!UES;R}FM+|XuCBcQz@)Gv^MBR^DgYP|p8x^`|E`Gul#iDm3b>SiNt3@d zD6C8QpXC>T3h?s75J0>CkY5PO3xo3k8vQ#x@gM97g7tF$vl>4Q3WDGjf(t=F{D3}i zLBNjS{DQo2z>EJEKI#{H`cGP5J^KH*7TB8(z3(?yDSz+M6yRCWPAC^+?9~372RfYl{yia~K)WK~g22=Wm-o-}|38?&es5F=KXyDK z;2;5rATVtK76BCmA}l@_1cV)`e86<@Pb9WSV=yQa8zhg3vl9;xe(=~kqJcD|8IP%@ zu^kYR@i?Imm2pKoS_5+!kG-)y((!kV{;L`JPZ|L&F9=5ff<>P7Xkx9 z903TF7Y^h5d++&cC;TF~v5f`V5#?lQ%j1Z2a7H;IZLtx>@6!KQlkne44;93!0fmDg zLI|K^1o=TwA*==cAHM%r>CKS#j!4r(JO7iQ|J7Xk_ksdJf}j8p=J4|Yu8|KIhEPEP zVA>Ld{v*qA0pcjMBM&em+5Fz1|J7vryPV&>1{4MeB?JWA5Ww}ppg>d#g~NCOFaFQ0 z!3>E(S^UXm{8y9Y-%1FD@$$ieFckua0xb#!3|9cgE5s-8&m{aY;+&8-oqli1|7te; zUCE4>!h>=`IvQh5;Qts~ zhwF>~**8PJdj@{MD1Z=A5U^CN;K2F;3IXO6J|MvQCmQ^a*u~h!8OdX83an5t*Z|!W zY43#jqf);X`K?n9S4;o9QZN{=ARjhH1V$ZPNB{zYLJ_=t{D5}+LU3LfOyHl*IgUV7 zYmD{a-?ckZi>{;t8lJB{)K@vRUa5F;k= z3=hEf3PRwAn8bfp$IkR9c=-$CLj85#@A~{JlQQIoK70^fK0fR?0h|{Ch#mMLfW^Uq zIpv?&7Y2wV0gq*G47lI#J$2-^{xauxRsNOP`-dtJLBQ?8`JjhUCNM$-fyfQ8J$_)V z_)l~(M?1O#LH;j>_D7BWkNn^D`gbP#?_C5zKzSipL{b0-u6mikS{L#XiIn{^;CAzlbvKnNs&0PGM5yFd^GV3>fj`$sxD z0t+;>?e{?7?{xf+rGD2D8-M+aIs(BYKh}jq5ikJNLjX7?46s-Puu}Rb{fGi!RA5a9 z#A<&I68769VhBWM;ZEr1Ql0IdP&UK&_3e@}+NKtK*Q8Gt;& z%8qDLH6#{%1q1s5Ah0?R?*c0PL_-g&`(wjlANLCii`_GTkbtk+nWD`A9|8p0-yVu` z#5hS>8asmE2okWo@wW>IM2G~eg)(!p1d!-MG#mhljWNhWCBV9xI*L~nFG?z?LV%mF zX;MgxsUylB2x@^v#&@~D?H(LH>W{*G7X!d2Q0C@H0KLXS-dKbi%nPig&5-7RIKUPM z2!IoQqyV54SPp~`_$39%RRke~ex?B14Pavs0Ga%_O9;p{1@;|&sT#ru0fCV~8voB? z5CC@q+kwDn5ZE5rbO0XpT@VO>27?_zUcwwl1!0|{9BTU`LEa&))E(KZGTV68m-Fg{?52nKZLVVEmzV{Cx| zVMPE;5o_ukU`enXSP^UtHU%TWc3?Ev9_$FlfStguoJX}uqksoO4|i359SOhA*78U@ z3nxnm2=L*6Z696$^Q{mJkmu+M3JA*o{Q_t#1Yq?*y}-B!fdP@6kWxrsydbglW1N76 zfi20+k@+Y$!G~UNTP`+=BH6E&Wy_I6C7ZPi&qY3F-GQ6)2ALb13lQoQ-euj9dLUsI z%AuDM@sfZ=b;yoY&&4fcVWxU9aY1ZsBX8qo-j}2=n8dL$H}BAu-Loy{*^G^!B?q1_ zzr{fn{v1c^P8ObfhQ-8l9DPc{@bF$XKTECo-FC;h#)lK4tR?;Y z;@N;!9QSkROY}1nas<<>A>Opla4Yb`f*O+V`*Oy8CZ>vk@mY%8kgFfR!ev1Ds%h$0 z(U_95ZxM*#oDojJ0}8=2wUd16wI^3=DOp}E`k%PJaPG=lDBsZQot^=LFnQxR-07GL zp}6va+EkQEMES|W_*T*;>$tIs`w00x-7_BoTjEoQ$2xqN`^5SzamkbpLVcyauBYEN zt9^Kfpsmp;9X`(dUS6ELJNm2jP}qa!DZUCRa*^Y;`^P6ZI1-re71ydj5`Bdkl#cl{ zinFe3o$4&#%f~4$ErIqUgx6ax`%H7c5@a2Gu&}2!xH!pt;vhb@pJi$nhbV^i1fc~< z>|&CUV$EtFyNRs!nQ%82bqbs~dFg(Z&iJ}>)F2$P@q5~@$Z_^!{8JuCQAN4o-{_uZ z9am(Ptj;@?LULuTI>0;ZIX@0;H$Dt!U=D0zNB&?xegKE#BltG-rFdNpB^h3FV^Ub` z`Mo>Wa0YhRMaZtSiKUR>r0?E2j&p5~IMxd#_BDx3%q?P?HaR)_1P8~nTAbo3F5k}% z#eoOu4Vw{dpz!S}ICNv3y>co>k5F8U0*`){%~+uRW#4mF(%Y+xRaGq)YIf3O)?h^s z*wLRi?yj-VHO~~&@3hv`pet2kx_e-4a8AXyR4I)E1c{%dyolGzn`ignZgtN5?+(K6 z&6`wkde!SW!fgC2OP*V76}8)~yk2}u8Zqyfi0l?iYAXp7M#7pdpDW1fosdA9N()L1 z(nN)b(Na4YY3fXJlQ%paUtY>IW>9iu{bKK`9j0}pzq+Pio>eC|X3jf|LjSshy#VwznK zksOr9+Tam-?i&4ghS%tq(eBY|nl{$!JFR|xj%X&{t9MduZMTMK0or3;z2@%0w@;O}AC*(G@t6fx{g_>=vejdbq zDsoa~yn^dMD&a|YCDF5iPvxIngb=|Qr3_rg3`Sqm++b$3HBzArT^1U4J0GRSO9P4T zlc!!b8saL=|N4;HtK#CN@h4~a$VpsOdopFSGYOQmPG^M?Eh8h1r{+xI?CHG{lzK9} z1%&bWnJ>EpDV~KnT{m!sb<5wrR9&8I=9W4_ooqCAU%wm*Wzu@|&cC2=I8pDVj^e#n zL)y6_>L78GuQwv5tame3_|$^GGNO!4=^w^)d9C4fmzGdK=Ya{FZ z3~hBvoP>Oxj^(+1G8y5C+KQ2_rN=TA>$O8;0*TjS`z%Tq`Q%sKGtT5m4*vnYt-I;;Hg{&+7Pf623`}=Sh)s5U^NmhTu-}AiYQOJT=L*mwlRFk?M0s zM*E!;ZN5&){?wzlm6`D!WpBRjbRHfK%3(>;{ ziH4_s{`hrle&piC^M?DFk+0^Z{iQ;i8TU3;sT%9wC2mF0HOdI7;x=aqDs+SmS#OC# zNbGP+E4Hh^7at{fbIkU9(Q^06_IaXWsY~JTB7c`JuG{>kd|!UqZY*_rXkmDIxnEYk zf$i{xxJP|uYji2D=!>?^&BOEW7YU8JPczl}oDNF>iG|(QbbmNeayMO=W!>l_XJpTq zoPJ`Nu1Ehtl-5+gXWy%}_VO3Q?XdUDO!Qp~&w3*(l*(zK{!Uzx8mL&UTDUQ4*iy^Nm2WG6^Ifmj=&a+9bU)0g}w_}7yakEOly{i!O!mada#s~ZW z#V8*99Luy4^N}#RojdA0c6nDgd6qTYdOfY-q&a){xC#cT;7`N_I?jLcvQAv9KP!j1 zF0j;+Q2(S=tG`H9ZUr-!!f4F2?9X*azA_Q`+&?ZNFL3EGjRr`6vvZ#8Dpvl+3<1?gcW_LG}H)Xh2 z)jhW3m$MsUUzEZXyLvyG^zTDczeW_DN{bO#n7%LFCIE4$1Ie!4Y-v%FNWXp`VWGoO zl3zZX>1JHw_hpFT6r3wnz|a<*7v^7Uxu&}sxp{ezq#}1tJFU@~Cx2P*3#CHA%HzOW zg1s4p(HvbeQqgv#?Pk>KbTz4|Z{R1-E_7V~C~h#(ic34Ae`#8J`P73Uqm&0QSrM|( z^1OTa^jve1L*Y;tipLQP^SYn+u3U72>cr%sS4TeCVfLOMEPoU@!BBp%{!s4j*e3M~ zQsI7%E^p5>$zD;BYKG$}FC!II(tFH=UhJ4C8XCNCH)s<4S_?XD$s9jecRRJYN{f2L zYwH@D+V%wMG*P=(Vrtd~{B7A&#w6Q1voRFXc>byY7`C(2++h%>w?LkkSDFbGlBrbT zo*V8Hee$uu#)Xg8ZO?h7k?{*vk=_}X070YC?6-`u)~&(X!+~al6_owHI{f<)X6MA> zzvhm_D~6XxyP3RAEy+c#Y{@;d*|H5-8^{_Kwz!v)bDwroncz*gd#}X6z;%Hy&an?z z)C1?faNTYVYa0@WxblXa=M302pc?^ZR=0H#g~cl5%$D`l*sD)#P9L|bt@LUWehp>{ zy|~~3h9hh0vW!@jMD;#zFSISMX}?ntJ1MJWQ-UA0-7K)jk2e8p#mL@Jut9BK&sw41H&A#IeZ$DF)L!o6dk;-6j(xk<4~#8CY5I#6 zC)Ai8YMr*a6YO$!{HD5V4xRhXzL1ZJ-uB2=PisO#=u`*?4NZ%3i+)F{bfRA^qtKR9 zlWK#p8hw4(hvYT9>ofgosy#)yuyxJn)YXzB}Ey!%Muz4}S*?ndS?6Q&2#`;JV!=03w)71DrW9!yRYx61`diJ%bt;o;sUDe?jg zb%Qm-rNYRROIGoo_gU9Z*Ar~K(mA&KytzwK#GT2&o~ZNuu6~7_T+YhQ$DIh4kC|sB zbG`2tnUzxYidNR-tLqKT$W~aNG&Bw!ul5K{>AoMNAS4nyxv6(u5)~%im%OU``1;yn zQ#22wd>>wW!}gx`Xr`OT80B;7si-{*#%uAZR@&U64}yb6dls27q{AAYRZd1uOY0_( zSRlWqcnPeyE(&OhOU?vV*{t?F~By5pQ~TaTRd|BcP{(>cqGa{> zz_cMPrjzrX+r-=L96g!r(CdK)DiIj%WJ1<%F!=H5xlm@-(jf1+*?t#YNajp?;W>Uf zqG*Z+62+CPpP}T`{r%;rZULoP%Vp}W?ypRBvP@5Nb~m~0lv47fbCZ2yk`a6Q{cGst?YN(8-D2q3+~9m4_u5< z+(M45#eNb=4N7xO(_QcPS0P0EljdztD$2_CuQWV;+-y^=WXLb>1ioUNsx{xl^)xih z+=<2d^82)R_xiX2Rih^chCiIoVRXzzjKu4` z=5r@CHe)X;vgjhACj-2t-Y9ToBsj}6sC!X7f zc0ixoj#A|csOdt93e#B3L2>R49ow6B4f;9UdwyT@rHnUZ+!5GUa>i!%`5vgwFmcc=|t{bP?N(K*bwy27oiZEdsv-8-IpV{}bwh zUBhFco*$@-0Cp|<19jmC7Ng%#7Xj?D9Vq$}b&*%Nt|hMtpe_>HkZ&vMUtkwt8|)ig z^j*3?gQEWcb^#s>w#U*5ZII?p-+nqCLIS{s+YjUe*rWmjoIG1&5ZKbq-VzA_Cjd@{ zLYo0FiH$MF5({4aC=9Ih!A`Dd0GaqD4ahe|+W>4+0HpX)64(R-h=O1VEb;>|SHM?+ zRX7NM?S2&a3kV1f0?UH{MDJ%AplU@BSP8(&KmZr@M>@bK0IPzqq(gO(An>5?C=RfX z57q>MwLrk;)sIAA*92_hXl!bYbUJJZU>oaa9smw~%R6crfCBk5^ALann_xjFFwh(T zTw)FaTLA3@0;3M;uRn@HfL#Ev4G3)e6Lm4k@hw@N@_r0dNw~9sqs=fNFwp0T2RcLhLVq5(P>>M77hrRw@68kL#Y%Cm>0Yt}sW4UMmY7LiXtw%_nJhi{0R zGuQ>}3cd+;1H1oem_V3wg zh<4V5LUgSMTh6RxJ-MKzVnJ18&yROaSm<`laLk*{V^j|&FWF?{z|A!^9nM)<5o;xL zwl=q^^qt0^Cdyx0D!@y-Wj;>&H6ST4GAWAjJ_BfCdT!pz6nPT&mE5ZX*nJ|$@8e+2o` zziMx$y#FCjzA)sGB2J=D6wm161CLg`+0TSz1j#$X7esN+^wqcZzGu8~?1hwxiX(32 zu{xc7bmO*?1IpFICK{fv_Ih0cd z!%oU5a}h_F7EwDeI5@ya?7884pLD!~FyG+?j{7lR!|_J$&Jab=S1O#c^ZPj0*|pMY z;146IYbR|!lQ_K~(!IUUu&os}KQ`!NJ0^xy#0e~q^z-|)NJ8t|H1hTh!|Y~d<4Hr( z_el1@vGYtgf$=Y&#jlA`^XBuk_J2aG?5Eo-uIl+SW^=E{*FKr7Ah^7A^F zkFPuL;nh{!`GCqIlf@`TNjJnO656N8@t-d52G5PF8~T6*qc)h2D}Go(>@P}k^Daz( z=x98)z~e0#`n-sMB-frIl%@RjGPy*bq6+s^X^YMN_)b`UhWn+_Efh^TKP`i@%4RwKUU3 zY|!CT(T(WM)vahR^2j~;BpTMo9r9NfMJ*mwzG7P~X)ga_$}9UJHn_LX>|OmWr5Qh& zEiR`B2BNRl(-flHOeaNkj7LQ-^~J8og-ORHH|3q63P*`^RFh+cZ)zJFTLu{mA~DM0Z?(6b zCBoAmWO^tq?!0A35rcak>EX3M9wO{(Ioq~2;mBIoYu6vPc|L_DCt#~PS_L;F?s3qI z>w!Xd$ZoRVpwzvx{IzsAzq3LTXKvb}>cP?-Em-+Ats-5^!DBCmo|XAKbj6;Hf6F{N zM(4aVUb5~l1(&)U+F3@n{l-;J;LU~jWhr%48_v&M-7f?6QH`wT&?w|kwM;)SHMnP7Go4ERl5SyLNmNF9 zp;yzx4@M2p8WzF-ruU5DkG}v9*Id#(V*xB)D z0uyEDvk=D;>kfvhMJBN@g&P_y-Gv6zf3~AOIaadvVe> zxSM&TjdHwIC=g6h+*;)P-Wgnwd^N_DC*G%JM9QFD7Iaoy!imJHb)Wm0y?EZJM(#@; zh{#oLufcX!sUS?}C3kSPf=}8X2z7hV1BD?>!I6WY{wo+oB6O_^7O z$vMqwxvH+sC6?+ju|BEmp(*@Kzp#IW^VoZh<5@SEE7(#ygIjTN`KbclkS>FpDB9p5Fmn^udQ@porqV{bo6tp z$+`^gaYn=C*qaspZKf+8t!9cBl9|@anBKRTI^$SwK9E=}uN-CxW@NnvX#g2)%*dhG>@nH`_`L*?hQ!Sn;~HG0k!eyE!&uorw^pyhE2NgvQ3 zPvWB8xjejJw~P+6&V2E?Np=bnzL|f?%H!^0y5kBWAYChHo5<~SZTiB+IZ_AlEE-YA zY3V-KpjaTFy9F@5j86PRu_uojJkFs)fg*nG8g+2?H5}{EFxEx)({i54&Rb+=5 z7uA!svdgoOa^YQls{T6?Ycl=t6^xY1JJeI5UNsS-Vp_xkCj7GY-f)vy^j_!lI`x(Q zuG6n!AGkjBmcjUF9kjC~?ac_FlwGQC-`3w0hfxU6-lSR4&PqVXSDUhah*L~^tA$L> zd;5ZDex}Jrw(H7iZ-eQ3?R5gNUd=Wa;+|-6YSw&42+3%sqVEmLjb@bSGM9X&x>`|p zSxBft9Ady5^Q6L*OKiff`pn7O30s%ZSFarSa>;GqRD<1X!y9Z!k8jN6W%rL42%hHO zbGbeujB~c>T*>>7vtHzi1vRl0`s6lw;T^=9)g7+|!w0IMpXv-Y2*`K_GeQ}mn?!Eg zGMe7^I9n{8x-Rc_X=ALoFmdu5!>w+Tz*-60g0Kz!mg zxk2&FNd3#ig{o5zl|}}dr}ooRcN)5+(Q~6;&NSa4ZNEO$K&P`^*&E9WTN93xuyAAY zJ6Q+*!n;Tp?iwy}na{rh$~}jlP;h+iCZ8QIGi?UxfXSUgPd}DU9X6iRwn%*Psd zHAAMuV2lssrl6<1z>^bG9}E_T9)~W)Gt79q?oV*>Hi&nhqZM_|aAVV@H+zK0d!A@` zvprFx7NnmZeSUs4Xvr%oL&)<4j}cSK+H7*R=a&;}kF3q-;PA-A>L;JhcE!HsR824H z+{qbX^NG4AI9MuiyFCyYg>;A^(qzw&B^$`ut!mJZx7=fy%TnOGs6MR@gA;twTr%Y? zEY{W1cQY=1GE@+hcRk2@_ff>M3ahxGy&ZF^k9T8rE9+a=G%opI(A{yZ0ZFl1B>8xa z8uz#v!j#f6o>h&Ud})Z`MoKnY6)lw+w}wX1P^exWyO>OX*3A^@q{wh>TQ1KHjd25? z*63?3n6$QY@H-dvPcFL*HYLnIys;!f9Gh(3kRDnZ+5v8?zNxN_d{GAF+vb9NO`%%9 zywebAC6CWru)&3PZGbN2boa-pnMMV7l%uv5)v`k@m35^@E?1MU2z^@fJr{MRg7Hn+ zN-D!{oSugCUg7wqcYV%XLt-S`TiZ4%RY|!%s|hq{$sMctyOWde_1MSS%I$njSlsHm zn{ZPR2{$`j;~ByHICrw|*fB*|6nfDPpxMxkFeiqGoH%87gxnrcLoZk@i-L-Uy)vyH z?7&-JC5gt1<3i$K&Sc*MJh(A{CE--S; z&#zCM>XxkaJ23W3Sbn2eEv5gaZ0s&W{Bsfp(hI(kd%?K5PZBxELl$_>t}E#GopnO@ z7D%6;K1&n05g+d@*Z-VyTg|rO9@GGREMc*=`mFoeQKYO|V%l(b`Fn%PA`u%eI$4eq zQayh}7&rd|5=9zz2c@;0tg#{Zuxj;0nB^rN2eFzLS0CHs6yJ7u`(B6Ll6R(eQ`?P_ zB!@XRdR=?RyLsY8rMTQ0G~|_r9AVo7%*oqv#Xbzi&rcZnNsGO2Fb~*1DJdEDgu>|# zjfJ2qLztC!j@~OsHVfl8S>n{mq8I}J-xuX-Q;kal%P?@dszRyw=VByT1xQHl?7Lf( zEYCi3XqyvE8je+W6LwT}epm+fyWt?g)|4gJ!Nkp6PQKs2HLzFw=`EectJP=YPHJ1x zj_JPS!+8FDODUby$>eV`O;c@NN+fCSh1|OXV^}SJ7?uGKsS*utF?_T#`-o3;IGlRZ zbSZr&<-`5eU2%i%yW8ejs~A7 zvN|xell&wvUuJ|7>&M`Vf@=iDQCApwW7SF6y4%lrg~y~XNUJ$gBhk7 z^l%k=30>*VY>VAf+Z?W*#bO22_->kxB& zkQpg?5ii=92qnDUTxM~tBK#?>)0mWJO9+v(@Uf&kaw+wS8(r%9E@Tl;L85!tq_*Hx zmBwiDOBbJhqAEYv7pi4#M-Ss>yZmG_(o@(Z#oqf>kM?brCoT`DQdndN+`4+2AO@gnnz4c#>pq|KlcOZlsGS`q=Pe zI}2@9a``NDLe^JVR;w%8xvifcJEkhN=qPESW4NM}zru0dmtfXP%g#dGufHQqY7!N1 z#~INgRi>^Q{Bpg?Z$CR&mziNoVm^HFQTYoT{WyDelZcEWx{|eX*28fl*UI$!d0!J0 zw~p1AW%VtbCcU2|z49h%Lg*8<3*EJ1-OZQOjU@GM^X6hQ_a3#Up>j}jzU+Ox&v9l$ z7Vb6I5@smSB`tj@Mm~wSZ{emvzhp%E@@~c;S)}y9U1hiN%@UHk35?fV3N@=!)jK~^ zcc}K=9l$U6JRd=)?6bjEV|l0QU~efWLM`rAiyB_DAKB(sYg9ockm%SaTsKRelamaFIWV=WObi0i9~ ziDC>RT`$fMqfx%r?ii=g9fnz(h_$Q9JuHTVEXPC!mWiC)Vo#1eqaTX3$}N~_<>+yF z%u@&tzOom(g!tED|-2pOW1X-q73f_ny&r zE$)1tKI;BDc=mNUUCNoA(ej!}-Oq`gd;Qn!dI_J4N3ds^Du(j)_^Ujjqc^^$Uk|K{ zw=c7fW~n}|b|t1Mh1IUi3gF4Ul3k)78lo`gU%xmmDQRF5p2_yi<`_3C5qMqH+@%b0 zLw7>AcN6bIn-oW^b6bNVw{9O^Tswa6!e9mXBXp9%`+*e8?H#GTQuqBrXJKUH{c{UK zv?G%*PgA93tUO1BUs!2=!p*HIPlD=+m*{1)AzO&kR5I6l4&I%Akm>X#t-AGf-&-DL zavF_xyyUa4F_I@7#L`_D>q6cYH=k&_lQN{qK}XA6|5$;GqZ*;6K#9g)6j3eBq<}<=i)mUGX%m4?Ut*tL&~f2pASHBK$9W?sr6wFG88S zqQp)byAW1YySO2jV)cq0_(i4A$tNpEvk5;9pDvE3Id`s?fuU=4QPG?|&-cu>A+Z64 zy~k?ojq@LQM~de1D3(bzAUSX^yrwZ#jaVehc$ z319Q*fSS934VXFvE)C5VW^PG^DTsnL>YA$>-_A)+3Y0wJlr4J+TE98CvFh$v=a5lT z_x>P3QV^Mwyv`Io=!U`Fh;|TVe_ku{`L<}fl^ca;V|VaKo+A-SMf&nB0>f4-rF)iC zjD?)VtP!U8fi^nrnpV=yCG_Imb{$_WgwAy=$52pdUfgfg>WKT?C_}wnKr^Ujms_7> zxSLa4%pC3Cx4ryD{Xr{Vj7(pA>=P5yQKt7)yLK8JbyAdiccfO%ZFaL$C|5Q&*rDGu za93R!RKSD=41R9TNn`5mA(>rx?+k5;c-KVB?N5-Fc}LJ`<18UKwZjmlZ$IGR^?KN0 zY(uCevhPM$DbJOx7qcR0xe(K`9Odic174N00^kdxDJ|NnZ_aeoEX#%Pqwg->xr6X@ zOL|Go^^(N2O>$E&If&2ELsE*lFFfmGOSOw5sytJ>Ek&T;cv^K)-zUh`fMH~Jh*6D- z&x7Ro2k0PifWnkB8BJz9sX^ga=Clu_F*Z3kXu5D>1$d*fNb2?2Lbg_U>D>#gpI%T8 znO9CV_oh&*u{`Y;ODo&?{G`1oaAf-!%@|RlCA+e3w-xWJDa*dQ(aznw5^q*RPNVxF zUW@UbLM$qwu0>a>&z^cX6mLkZYxmsEf3kS>osQcc-_U+im2Un-@55(TSBlX?8mJxC zs81_vK}^Qp&S%~{+ofnEJ5c|~xqN@TwcX3mi=DOH`_1`cm#PEkqti-iXR9Bx z<0o|3jJ?ph=%iLAzU3BsYH7cH=7kl+HoCH_ztEQ#`7kuK$VPbL*u&$!rcG=wcAgU2 zWzjrrof0=<#h27IRc%Hn+T;t}2x6s;YbTQNGjk``dUd=qgR0>oOXzI*BV61bJb&>7 z*~wQ!!qR+o$6Ox;($f3Yzq-WZZfqCDUe|SI?~4kDNj}+vt_RT*_V8Ld@tHE0yV>_> z+KCYK8@bN(3N9b%McO(xB0Hu*s$*Y2SR;b-(JsfhXopU4a0?xO*wY+GEPl-F?#8{E z+ms`k!lje}jA_+eJ#D)i=!Wd(n9p97bn0c1F;Z34>DVQkf{i)K#+jG|I75q=Cy4f;>x(d`z zJeA%%9;?eQKO5mXv4i7q=TkdRy2xeXU0LDv&M@AGgBn>$$7hMH<_!bG&SyyyvC^sD ztx&$+PUU&)p12x@AmJ$=Pyf48F$s1~hRhSWH9mAo1)GC$gK8|j!q@375_*m~-148y zqm8(zx{NPw7jKeZ%NMwxOA#mLR1I=J`(>-JdxqB_fME6lbMTy8 zi%8=B+l7j4ol`^eg+T+Isy?YQ+m2J*FO$SM3Jd}`PjmZ0#kkJg1g z9!9$ENNAr~f5R-T-I7EaRj<@&7w9wR-eg70G12V`?kL`*rGd|{5Xi?y<(JM(x_vn5 zl;PmFotf1b!3?5O3#_L2^4cKrwLQBRb>U8-#_|)D#Ir;_D2vm0k>dw_IZOW3AEX1E zp4LpAnt$~^!)HS9KovsMBt1HhQpVx;5No5YMekvx;O^rzI zYiy~0Q1EoZoO)dR!-8B#aqSCDB(#A*EetimKb9y+avJoEV~1}OkNI*tlAbMQY(wk9 zhSVg;T9SbEimc2v>emD2E7rzntEkvk)Imf`iI?9D$Lq5`3byheuFTxAJDxgO;`K0? z+vVbwASD*oSN*{v+YPi!K^H#^`-|Z`J1u-C;q%Jf(@mRgRa|NEh`lx9dWEoJXw+#f zUGMh}M7S7Ta5zz5;(P^%K#z8DpK;{IZbc{g4V|^M%q2#k`m@I zpEC4GW99nW+ru3bnQG;)>tC$s4B2YU`*zlYDx&gwtIE8!#f@*Yz@HTCJ&pbnEQ&9q zXC)RG$8yA3wCePqTS;ww@rnhZ!1Taw0e6*=xq*N-p}2?^U|TzdX25|4F4Er4z$H zoSkxR+v2lw59GuL+ZRfl8Uc_rN*Z?56uqEnc9KWnRndD-C9C;|YF^XVM9RWA`^3a? zsqvhOuH7iou$hbizwI2br<|)#I6?U+Lt3brb(N>wP|^JBDSW@0zVV3orn>~`dLCm# zcBr%KpI*S#WG{ug8J>ZX&Q7M0JvW%wy>zYSQUCjJoRs;kWM9 zweac9o#EREC*Ha;h(4z+DdWwJPXQ0BDSS4Hgp5Y&@G7~Hew~GXIVLy8b7iJb_*%0Y zk=-%=yC14+o~?FrOA6_4G%??JNYBew;ycc*1fqVBFN%yW^IVh^QS=lH)Y-0!dZo!7 zqsY}FJnBdDSTdA?aE-xze3wr2hW@$s^7FSN3>}JJD-J|(d{MsCsKaYV70B|&L1V{j zG{|Wo^yUNQ8zgT^r!%VVoHv?DeoIQZl)K}n{7~Akpj8HPY(9ResFH(7I9spOH{|lI zy>({AnY+Xvvd!c?o+k0fUHE`6nK?3dQ#*9Uhu`K)cPX+)ha-aQQu|q^afoqWW3#8$ zhrnHXYh#ti?!@$*qb&8J`RDWWq0-S~Ofp*+t)=@ooWI5fC2!tE4ZgeJVnG=?ubEqa z9W>k54n4!9NzYIa$jHIc-B>_#8Bc+!OkSZHE;eW`pWhNa^ZJr%M{)@H>KQeag_i0S z_qI1;w+9C&=EOQsw|$pxfgLP+G=#QQ3*T)kAUnm<-IZALaT)n5X)4%g6jZ|}8~R?} zPGF{$OW&KKn>Z zf-ohB`I5Po{<*6UMN$hfnMy^vl2<&>ulmEeK z&(nDJk%ZmTaT2M~_n8VVTX=l{RebipD3NM(ec&Zig*Uh0iO@~1y{$x?4x1u+KSOv9 z`x(-&x#eO-^d!QwUj>@^UXZ~%57AgZK$CFBXpR+_=si}EvH_7yxk?@>Clj1e&Pbswf zr-Rne^nn+_ms2|zK78QBlO7XQjn@WS_8L*qQjce><+bJCWpB;jRgF?EaJc+NYoOJ% zp`i#dk*cmA&C1g}ENNCbJ&d+|!KC@JwpiyO>zJ4iY&2Ur%4W+=YzCu+mR7D@CyP3n zo(YzV2w}8fof&@5{)Fy4d2evtU_)A$@h$rxSt}~hw@F?3t2}9$Y+Bhh?)0;IR|pmr zRjtZDJuzR2|GLWVnH`=Px&@IBzh_gZ=lQl|^_^OHm|3yvCIJBfF9Y??vjAF$#z!*^ zg|3taTSmsH@{KJS2%7e?H1%G@RtTT{`R-2}AC}%m+;HF(qMv^dzyGQ~OX6}?u7_l0 z_R>!N%VXWO#EmHb6bE>d0fzR%i6$Y|Q+94zZDj({BS8*I>M2XBv{$bfhicY9(%DBS z#TeM+9)K0P&+7&}8tbCxe$Yf>!xlExNY+8rMYP~i9DLs3ZWzuP3AU6~(0wo`toh!< zWaa7(K3!&wIv4KAPWP%M&1Z&A1LSur4cJ?EMjEm}C027#NOsrnY)(CB znm${lWm-NpklA{wb;GH7LQIO3|(2x3`G1*3@_NS$9`6GF0X~>r18y zpt-!S%Dq5_&b?ci4z3d-j$Ioi1@24(ZE1ISYMtJ`QPZGIx{Bu{*1Jev++PsU=Fy+t z9uZYd{L1r7A|#l8GH>syq}gK}V77rVZcZAOurBe}V&#|TTTr8@ z6Lig<`tiaK&1aIeDTh+g{F4uGYW0=q3~WoL1XE^$OKyftZl0M%Qgt2wki3(nKx82Q zjz*6z=(FM{jRkd%j`z>O+{t46G8`@M;h$=oz$2FCW1{n3G(7&A&h3p7&%fU86l)S+ z)KHcex%+vos#m9clfZ1dy~kbSnt#&dD9wz$D+v1hg#NSwGpL{YJX|b1R@if`le9X? zr>AXNh3i6;i_H29+SYLuhV9(a+xY&nL4Ca`r3n?S`mM|54Hlv}E#vB?8XoFam&u3= z`i85L%XL8A<>Y+j9?Dd&M{`OqehCbnxLYF6G>wN=jk&4pN^fvOL9d8K)9|!j()jDq z(XF(yQ_Ue!>OOv>&&oDcamp{n$LXitBN3|o?EQsV*f2dcZM(eVxupnw21Q)7;Kz4a zd|FZ$xexT-Zb@UNUbc+N8fB&hUYjhxb(I&6A{H*7G=s8HPcl;vOWo928H-{cxWr!Q zW=lEPY$rWx%hs(+^`4H-R++e2!|SVq^1fjPWJ)a?Q6L>HETR%0*~`&Ll7hA}I=E`a z>Z+-_qsB~2G8lA?5play;9mLm^OhcBuN=(wl>7cfmJ8t}g9#@7rhqMzS0z-Zi$-p$ zkqdrnx=JkUnVv$Jo7I?%Y5yL0!~KSC@$Jw<%0^7?kssI*&% z)&@g1Wu;_%Jw>7K9YcM*DzyA0H&kwxCI9u_R!ZKBNCsIYnR=OHHM;Szp%#gO<5$;T zcHOL}m|ee)LicWxPsA1}QX(|E>3$-S z=harTjc_IQ*JXnsDVgW@Z3(N|Pw~jyEVkyE$W?yK z>y>^sVu@>IG?LsbZo@ratqWGe^~Yb+lg9>GK;Dl(d)zKwkd>r~6EbUFL3J{P4qovo zapijPBe{EBBdKb}XNN(#aho~^$1onr&n~vM)eQ`ieX7ABKQ}@CCu;KH zi{#&_ct_{O{s(F@K0Fe3*Nb^-uWC z0MXXo#u@V;Sk7Q~;D7+&opC#W<%?xFgPklLkyyqraE2>ZSQp?o1_jV}F-R9INBZd9 zYOoz}K<{_@GmvGAI$}b@e|e1@INbyc9K2?10~}ZQQxSkW3O0873yw5c26T90D+qiI z;OqXp0XXFjU`K-${xc&QtnpVYXh0&}A7tl4BJ_`DKDzoZdC*`h5ZLOPR*9mJz_!VG2+e_8VLBpMJ3Av7e(_u(e}r zLjXj01i<-50H*~bfUblC>~!qmX9$3ej?DwkodtNy*kK3<4i*yvP8vA81Gp1g61W#2 zUt_g9ydPT^@Bz*+I67DW4iKKdi+S{D>|+lF25u1mh8*@*>^E@e?T>V9$-`@)7VK|q z!yPsvR#~7t3`mCpTyH4$lwY7(zNcYDz~*5;*gAhwt+8YM`_TSpM+^LcYW+t?@|R3& zIPi}C&!YtZZZX!eeJ5J;103=rqBS3I9x-t6Cm-K8eD6}EI^+A2^*~97Xp@w(%Iiy$O<2;mhXZh` zZ#0doE6>#jm6g?7iX%H*Jve8|2%L8kLgQ!RZU#WwtOXe|Y%PtqPnguqDEn;Y+m#MaiAqIMSz9d`u4RW`kaA``LhYFLsfb zcv$GMCl{m)`sB>jKt~TAZ}spop7Q;Fq`d=>BwO34+s3q~?P=TYp7yk-ZQHhO+qP}n zwr$%wz4!k1hjadO?|=Ur6&1B|A#-I_zAK_K@_nA^i7r4RT~NknijlX?>CbsILJPzF zvnLXO7>1hq2IeP3ZE)I@=GA0C^AA5(o_3y^h5=8$Gyp-NuScV5xe=%Va>1v%A0z?x z78k&tEDgZX?QPy;4Z)S|=xqT$=65nhm)SYqAm3yuY!f?Gyw2Et63#cF=}#f-o<}K+ zg3-J`=?opB!&K3@KJS*{wer!s?$r1=)DOydNgOJW)b{2`#S-^^juPrRu$`44zu^?Nw)x%m(AwI874+#o5L*}mS3i~2fQ_`Q(}8j$9i zPbl6BtdAbgiEd2@oBcafA2qg5{~wCfo_Is?r?`56%{E^4qVDqxLh<&8;iOWm}?hXmyZNWqE6fdAku<;`_ z?qG`^x7z2}#t6eodp1F-IpCrh)~{=y)v9zy+SoPa-sQe9#149o^N3St5!G$*%7Mlo z^4iw(b!pDOkrVa3-7b>Z?Y`7b`BA-9^3i*clso0nQevsQbD|AS4A1uAUkBNEZQUQMA>? zc=aOeLk=J@^{T)<64}>aPGYR2Nx-+b>GL_Sjur$t|DxTqNsty;t7H#g$@c@Ykd+)g zDI7s9cK=%Xx8(tlp$w(m!hTvsxqA9ud>X%DyOU64yuxIelu2{YF@8r^1AWL1!o==5 zMATbX`X+VymRQ5FjUW!7c!U-UEYA*`@rzovZ>JNDCx_nxxnbKj!5)h-9oVPx?g*7ak z9`wyYIng)2yt4+ahQt&Ty)_o(ms)ZrwCmLOUkb|2OqUpQJq30%u;Dd~6fYjgwf6A^&Q7fwID7hG!mj+*Z`3Qa{_51ptY@l{mdK?uit5Hes*GwRsmo7%qpt09WX%-q=D|LSghBGL}bBZ z#+qHMAfSW3u2?gaQEOL! zGo`8)mdQb@TvRX}e=GKr{RQcg@nKbk&aiPKZwG8Ih_v%`hYcv3@ij6&xydijaRVO}VII1Z67;xte|qt!{OBH4j22n7TX80dpd$zygEzHpaZZeL zWU+fwz9rTy6#P(=|L`7Z+j!JwFzD|Me>5tkUtHXFQmIt>7g9IBEhXOMq)yIVNb8;m zUxuiN*aqD#?Nssaq9ar0WAxfk0_P-dnadW!XCY+J&%<;121O<^8DNQ_iS2%u;!+8- z^*pk&m}HW>NW$zx(DJA`TV3%y^k&f}miBC(ik0f70d|T(Dm=Ev~rHHy1FW93+ zPm*NbnFKes7v=4KZ^ny7d*KXlc6eW@EoX|lFYQ5SfuPvEJWp)WO1>g+Jo_FZRFkq_ z8P=mTdExTzCrjhKQfhG~D)#tP9M~`j%>>z&?jX3KuUqcL1qE;HVLRNn z#Xjze-^hLynF8|z#^0g3cO$k=L$wRy5Ip<>7%Nv#D{{VJH;SKT2?ukm)mXa{OJ@cK z*#&$I@!xGyGR|q`kr^MX@QpzqLRvYNOI0>0&b^e+n%P?|g%lS6S(&{wTsMR8MmK+s zdii1%5b&KLzLIrdkmXS|ycjWVG#A`snTpx1O?)Tpy)D&}<`Mv#F^xdQTr7FXt!tCS zL>$#!xyYA@kkF&LjjVW>`6&(@Ib83a7rznD@I5V!JrX%=fSM^%>6-DnD%k<**7DLN zr6AO}y;6>jqV-&UMAQ)2KrTb994`*3J-RkK{Ipgtf%mL})$C@xmD(yq7Me9~tFr!b zvh(=HsUU2*#4@F36Ex}swryFv9zvdcIy_072^dO8zEwT)q2j`DK_VIcTXT{MUT2SL zTG0$cv`mkes__t?iP=(2j?)X%u=^&Yf9HW{%^m7ixQV%A_);7HBdq99o{cFIDe5WT zx=d?M?#X$yQzFDpp*$mF)DjLALatfs_seTF67)50ldyU-4Ynx1At#*G3vS?hF^kNM&$6Oew`#{E&2 zp}DlKWe3-&zd_*-kz|4ExhD7WWb^A9KC##NK3V>Jb_k#V>bl#u?HAR2EHw`g+Vct% z@BZP5?MKWj$}cyJ?=}zCE|)y`lp)L?{EmfgZeB0pcUwW@dx@m5)+9R2c`Zgq(Bhfh z?*~GzDL;Yx1t})rW$7bLxZ-SvCua2a#P&QqTs*2mu$2%J0(N>2#P8Fy@}|2RK?Ie@ z&~l{lY+X22>MQy0e0H1}r);2olN|F?((=RnI zED5%?QxTY&AUaY@How2)%V)Nxl85QA(HN}Vb<+_aJ(Tv;M0nJ}py+0BUl%fN;B zlQlgb$1xopmG}%=ri07H>cK~Fez9!En1q&roDY4(xHTjFLZlL z@jIY13A_m+$Bzs-fmd#&f19M(w48`7EbNzwuOJ>v4&Zb}XEN&IWd{#F|eN8?~*QNqw`qA5V~w(Gj^jXS5bF~cW0&C4(3LDk;*5t zJf&0`c7%F7rTxTh@?j~x@Au&GGUdJMn z4D-Q;W5&S%W-InY9Zg*tAdp?f=N>**yFy$pRmf3}orJfk>8SHHpPkXxSxCTde!7R6 zwKf~NiQsz1{~h6k!etQs32tg-%PSW;9w|lU+*S)5xT>Ig0}WvEI*f}4d(FJ9P)8$H z;x1Ugy->(c@!nvuCCs^m8+9{Z0Z--RtnLZ~PaB^BpyG^>5WTr$H+OG~OzE@J(>$LP z5kjCwL(-R30IX&evWv-7MdfDy=9JPrJ`my^@7sFUq_Pp_cI-mUazV?Ln6T_|C_`s- zp2kBh5*Hz2l*hbxU4uCJjB{hhd0@S;r|HI3-zQt24FN=vF>0Uh4+U~=yq0<}5QJOd zRoF|y=>lc%?zj3B#Mu8q3+X`8D?MQ{BM8Smru1CK|>Ctr(Wk#Mt1KFvI? z3f&7n=jmDCoi{`#q&m8e#Mv%}6X6&^2wo04b|tk#%6si*Np(B>&-mG1rxO#WUn{vr zS`hbv^HP0pyObtbgh1qKLzua=8A%(vSA(dv4hp;@WX%g+4w4lRsDzxGa*5xN*}6HP z&3!{3iX$BK!f{Cz%NwkWKpDq&uoPRv71?Ia1UIyl05_<6!z5U53kT{#cJU)s zhemg|K$fCqZfUHGewUC>qb$>f;buYo&?2f2-cx#0D&RUu^6V#i?Mt5{?SKpp)U_ZE z@E{epTR2X%DD?+JoA0OEa-i`{adlYD|LpLJV$kd>EJO0C+NP&T%IZ6YlD-WPMI2UN zzIvS^%aWdqwIieUt+aD~*ZKMSV8AqU;08_1>lDTONtXjOH2+Q>6AD>CSZAAqAt z1;5%-#s?~#VHEypP1|rHU`cdrwp8whu>s(yDvYnc7mIg8g0uT#p$u7Sf#!VG8Q`X` z{?1TltwP*ZMiW0CQYD(8wrd3>AA+8wMjHvGs+dP7iR}uN01(@_R9_T#bEHGHS}mE- z;N|fR>;S4=cw+o9uR_9vdQRs+Olap#YPX!?H7*Fb&>2NVU74F*tP{BcXRe>PiLBR2 zN~X|J@9i^yv2{M}L~PsJ?btiuTP_o9aPbL^c;--mQaIv*L}Ogr3|=(RB;ytnxA{SO zg&_8t+td+Z7>ow0ysshCTghpKCk3cl$$QhLZ* z2vZnSUpH=}H(+s6p|@KYk*F0~AYDCQ0Wz!rKFtSBk0?q=_L|r5+a7D@40d|xPbU#Q z%@3iUcvA}aw{iw!BObDgwpXRj$0Nc7HBbSoxpQPTDp5u9`PWu*Abz+?EG!>QXxd>2 ziKW&0Y%ZDab9g#BN~+|VU8su)1+D75S5U}vHBnnXqjQ3zRWobnFK7FL@EFCmU7a@)tPkGJ93wk`=dJrHuyT-gLclXu96<&2@5^*sDBHI zv>Sfx-RSd3X-Z>}6RrHhO1;0vW1CYVymJ{q4Rbwy7F;wOd%To*UJ)vxHA zK;6|zupE_q!@CuG^Ju8U*A`Y$5Q(4E$k|Q7t>m5>$75VneXDTvi&AKqWR%ek8(Uf3 zW`ex8zV|;S4E+UB!Xw7@omnb=k!r=yfN)qtyRP*_i}^|7z;IB$-~ zH!B?`htsa5+nt6v4?t!KF6TgF{3i?rOI(h_^*O#p4cITwiN{QlG z##K5X%F4HIR6ph7cr4CmBYCUh1i1@1^h&kiF+1|*>6{_N$+K!rc$GbE|1_|e+6F$?{%c{ zKi`5CI96xW$ZcaUY6^?6z$Hm77VC*5a4p$a300yp$~rG0IZx*X%l&N5V9Vs1I;}+z z_}&d4nR5$8zU^91r!4YoNXLc^K~G%)TN2>{Da5-$;cK#lWPP5R%kTK3D|xT(n@Jc>W&X!+5q4NGNUy(K=!3U}i1IN?KqV zkSM#2oAxSA>q&!RBCfMOfcUrw=?;?hc%{zMTA9L*n7p#d7i8 zAxw6558TW7HpnO1E_0C#5#MxC>POyU=4w~b6wwQ$^;nj*y*`7H2QRJDh;I$~aW+b6Phln_@CrcTTw=qp6#&D3#1N=pgnh18WDtI~(cuv|838&) z+GTZ)GDuq}ytQBAqQAh1^}fpZ)oc#7n2{4IHmkapU;pG5UApp#LD65gc&hKx?w|7B?|r59KLR8OmCy1i4X3hU?Z;Am7r!q;sPuiKb$`j;w_)e^ zM$gdRdnMAIjNgC3?B4R`A7j;vC!Chd`qehLJ1F?+4ZdMn=5}JgyK*qMTJt)~9@xR5 zdrhg>L88&9Sz6+YvB$b)np0(HhI1ZJvP#=ljm>;5&K^W)2+c8k9|mFHf6+p&<#E=R1xI_|(NX?30oeniwAs$oW+-p%N&7)?eZS?c>S$IV=$jlGwg}ClBDYml(cFkka{q)ESU5` zKFE&hajk7py1mV`se1D$90Bi2>eo&!a+%Si8}gcU_vO=gWvBCFx*6E0Cz zpOUC1`+&h8sOqI2t0P#k$5NsFHj7kQ|5V+V<*-im^wah@ohV;}c)VDI&wRtR52FhQ z;N9mNo4|4PVH9+E3_5Bu^uIbk9t~BVKR(cS8+Rh1O4!1?7FNXAw%XSZV{rHYDd|q2z-|TOC(`> zan|5k^7iY&*FH2DZq0%%h14C=gfUYum8Fv&r-dgQ`RBAm4OVfev%Yivd~YBN$H61} zWAAXg?uwXl&Tn#pENFR!_$A}(CsJcDt+blqe8)_kBEU^Ec7xW9GUYu~E_ z^0^eJS9?dFn&VGC3AH+BR^ZZOgJH}(AR26T@ns|WnEGUB)B?vBq^3mo)nnW30GfNi z2x>hXP1_RqP(D4ejXfJ*v>Zyu1*Ji3wyiGc+pXC@(`F@s=#y|7^Z^tFA+gq|!n>Y7 z7S$`pV!$tYm$q`2d>aK@TaZJ?{|!SYBu%cQ=Fhx*!tk91$1q8YZF;$#myFc(2Nm-v z)|K1==poQz#c#pII_ZnhrEp0c-xoQc^)$NoC{na>ojmAgm@%NUY6xw)PBs?7)*IUF zh!<9JaKSQV?H0C^+YV)jIb|${ea4xEbTFWZZHm~EtCF5uh`URDcc3Z_U>)X@0hFd< zroKH1ELRz@Q1|k^?w3^z`B7twGij{EBR+~wWtdZ6FhS$rNum};)HsP$XTHaTd$8&E z9>`%65}i5`F^6hi1M+H(rb^r@CMlKTP73gtB1^xP`Cds+X<7?>!BeBrFy;;GMp({B zO!@VGx$|oDg0HBG5?aA6KGnO0NG0NDi-xD$>ZP0xx9KR^%xnq2JoiT|2$Z!>)A`m_ zQywCsIJNjcNPcYZjKtMsQoV5Z_VEZhHVUCc!%0JQ99E!Y&-f6m(FeS?lOqsT;@v6J zn!59&^~-8)mslJ2NQP=%o1@03uSjXg%WUWs?pC1;E>|T;3x*rGTjQhVDyAAex2?NY z@m_w5e=A38Jy>TT1vfI8;?q*%wZ93rWX2>?`*^hS49o=TSeGIc{z4|Pab3- zEA}!jMuP|T4hzn{*H)3~ppO3H8 zDN@yI757d;k5W;ghVaLZLoS40mg~OFuM`2)@@8f% zS|;23el+)b#;2GmbmY9C14XxyWtO8T*g1C0VYnZrRNUnRHim#pAl({OG$4CEl*?`k z))S6A^af+*D-cO}K$F!kP>wBu6s7{dpMVD@$K+yGG4TmQAu`xDj7{_e~Pl2R&$Zuf_oFa1HQLIyItxM;3~EVu z8<7pxls7_%wk%l&g;Th0?plCPUJ2+H+!Z4odTserae;FUU56l!dKDO&SwG*f&Pd@Q zG$XA;Yk*CNXlj5|+xs~JEMkKaaLDc~^B!2Q-ebtq0tUdcmx>X>V2@nFEH;QJpx)2aXa(Rla6BY zN8QaXP!C;U=jVSG;4HI$H#ayGFmX;=X%fUNXiVMmd~K~3(Z{VB)Xf=&>JmDN5e*gLHFydvb(#y<Sr(ua>M z6qL-eE_d<XOyUbuf8k1T7Z9hu1s# zQ{-RO`RXw+OdP+i1RZ;h696xn`&SAhm!C6#<&eWHp&`VN5)VxIneyQ~-3Cyo%~l9M zbqK1bgSEW8r2p8FlP5W+4jQN}C(Czzat=3GXk4sx*iAW0uA9_e*hzMLbXVYyvm;gTp5MTu#lpoGX+bh>cz-tA4+>n*eQxr!(i__^9 z?djHqk3tw`SBH}#%_A1Q&5|RyzzfpwqW1zlJ(-j6mrb36#c0-+KomE~3dj-S93i3( z>Z1C+tZQ#f-nqBRAjNfYr>CUOkT>5(=i$5qb#nGa1o6Os!wZoCjtnT|wT?Ztf1^Hpe>@4=-JJcA_XYmaeuDDXqKfcwxgh!U#o4R#7`tOHSE&{hp}FGXEm69ap?i zM>An~#dAaHK15hJo*BM`2R*9-sl1Hw9- z<61e>F)vvi=@(d$9xBE2)E6nZPJ(;)n`=!o!Db<^ z2c2pr4>OM|@9`hykdi%{K!6Df=cbmFk2_^^cSe>l$0&Vni#9mJ-s_BJC7_r4!>!@J zjPY$VgxCbef6x%GEz#;X_@vqALNA%i0W1>^9w0TU!Ra8`q;N0uDSu_{Ry6Y(+&(xY z5QOEn`I(MZ#8<1H^DWSv;9XIzy`?@60a(iyc}H9rR^i$QXw{9v`Z{+(J<(AR>-r1V zNQ+Kq>~=6zioYF$^~H_r8$ClwtZmk|btaiH%Twn73wh41$S~MSNvP}Zi+p!;kUD3? z<7wi77&WG;PfJK4Mo5ezv{QHYN;HlmUd9sL!To+ztmU>>`Fgef?Pta@JO03$u$}0S z9O?G4z=xd7-`UZjaP^z9dEdHl<@qhJR6e5J)6)<;?l@Je;OBQ{9Z5arhqqm$=!LYFlM@30uy=_}s?d)wn#=k(gQZ0>^C?t^iYb$l5^=&o`0 zOEf)-?L~qslN~*_)=;oh&tm(qoK#knUY{(ubcBVJbOjT}c8b6Lln{PQ&=SiJWQbkT z0ZvxS55AiNKg|1|(=BDm^Yh&T6rqZq7|H`c60cy{UU6ZID^R@nqgB89#pY;M-&09r zGqZp~2iRDpAAe++;iE7cvF-{C#Bl-!yHf>!tbB-y2u%D0<>$6b*%e+=(BGI@E#22a z+eBX&DcBU9A~BV<4!8}6j}b=nW3U{c+a_9(y)@J#tcyIQ$}jplom)V zV6tMe#%&O)(ihutT6^mkD4wqbF3a*fHGX!d7_okI8=`g&Ex^EK(f*Px_8z{8QU#D9 zlD|Vhqc)HKgPlY=SE;7vv$!T=P>3!~y0em1nvb7>lBgU;l5ZRf8}qkZ-qbr=3FXkw z!e{A^Ryh8>i~_q$x%A@4+thjgkUUh}12(<2@Z$ovB!v8%_{7lSUg> zZo~7n_%9h*EVP1Mf)5mB!iO00I}Avati3yXl@qxOGc27%FdD(uTPu~1AdA=x1S*`P zq4^cgtSq`8IkFE*cs(7Ug{Ll7+j$*t=P)zSW%|vl{_MND8ApRv`@RqQTd5+e!YYMzd_tQl`I3b^)bxt$4!UuJ)k3 zJe24yw<1IWiyTX|UL{v0AsuEb&>1LXJ-6S|MDLk+|8A0za<7WUHkmR&r99*OMWeuL#Gk`{;n*&jSqykXC+mz#P&&GOTi14@>_22Rcac+H^kYG}P?*H$ zZn3R~Z$_*RkvADUMV$)UvHe+ip*R4xAGB>hyn9-ZFpvRtgZ?_ z_kyQk?8fXExLsP4kO;Xl?w#!@O5#dzI%rE?c#aoF;rVK7y^i`qW;dZsLb7SsyWI|} zK}Z=iCv%83DcOy{^ki|kM9c?nm~E&j8w_fJ+@-TJ)J?l>0d06v`+RU+2nGIlNWou# zNt=ssyPZ8j0;v)k-)r9ghFu*5j9Ubv>u1~S{I8NZnoFTc&`akZe#vk2`PeKA5Q{Nc z$VpSkmTmz&WOBA0paA_P~uk@ZN+ri z=H4sxf%$W)pvtwo87lqi15INgKpaqMdZCG)^f?#?`{X9!{oyc6L>1a*vo>A9zA!(y z0WfFN8miKj-2zu+0tE}ACf2E{Z-BS@ireCbe#F&f#-u?v{b zZec^Bjh=vQTbW|PL~<(1lc<@vqLO;C@7?kBZa1hQR`+MXD|AmOMid*po|?bnM0R<)XML`Qvnc_=OY_xh<}VvZ(rBwPI#FWEYvRiS zl4Ic~e?!!Ubj@NC#O$Z=X?wB_)JpAR_PWqoDA{`yrY5NzOhoT~*5tZ!%{{XrkGJ|s zc#22;crt-EFR7I3Z>BbCTZsZZY)$k;(QBzL;;BW=iysz{3vk~Ta3^w0T1eR+hjZ?A zp;>WfyYv>dW&p<_S(Sr_-yK zZM{w)5lu+p>z{f7hO-iXXssN+ER0ECOpdQfk|ybqj@A&c(SOaW{pg380h2&B-QU04 zuzKD+!6*RosTh1119Ri2)o{6trX9K&o*U$Kl2T(BwY^h-B=s57xDZq;>9d&DE&rp*Z8YbRQ&>F8NeMDLleNiMC!#nw9nBPDBN4%1GU6)fcLf>uJ zCZphb1^_l;?dzE3f~^#o@`siaW2SORM~n~S4@V$ zxcnK4btnl}E6tmSoO@!7F^wcTZgImia;AV`IK!ltW2hw~a`1;lfiA}adhgP9eSPNK zPq#(9qN*GI)V#1op9aX0GxufA2o=X@JEJNWribbJqB%EhVF;gAi+w2$p>1n!L-aI( zrubW6x?|l1X#RN@pW~_-5~8&soidtyU)D}p6JnyhWECC#6Ljj_w>!pt?Ed!=kCd10 z=h*;yPYR#Aa{gFjbLwF`rH4#r28eS3Jk}4$%#0Rim4Ud0`T`#AIe%16x~8k}g&o9{ z0Z}>9+7SD*fn51un`yRo1dN9|A|2nsMV>U5G5`7jHq#yQoFkho{Aa`9-LhHS?VoTq zahmD=t${V)t?^}%aXW}sj|>;+$dBEoG^#qAZ3hF=ma#kre+Z47l57g6&5_LAj6$P+ zPW%ds&JFk=Dj_(ZMW-1fdYmkR{*i4$GGImqDC8tOKc2WnePo&-z^?p0c6^msJh~nT zL`p;2$83&B${4}YZJh1XE&gY$at{Y6zM;% zSH`rpcS_SJklYn1t|fx| zO8s}O$y91jJ2__E4|6CHuxn;{!!6&qvTDwU;|{7aU382P22* zCBLXitqof<%eL`e%D?^8MDtJ)Ke33_rkz23xiE2?3~&(c@I}8|#CsCG?yW&%^RV#% zQkeM6r-}?Dv@MrVahXTwd|2)nUpSm%uH8E>O`)Y`_JL-ZOr(mu)*V~@@IoBTe$BUX z<=EgoVP+pEY62rekOqyEyUV*n6!wFEeiW2T3+GSGIj1j6&m2@1S1ew;)0^5!r}hC& z8fGHjxL9dA9c&4qX>}i{Jk^}pIoUF3VxE2{de%0{h(gb)#pj$uonRD(+5jilf+7pU zxX2ft1{-B*S=&0;L5X*}PM-=09F zm8Pd4t|)@?@z4_vAO+~Sr$5Q zF5QdUXv9EW+493iy^Cx?K((aKUigC9SglZBH;1Z305RH}syaK!QuQu@y+wXMe;VYn zUE{`#@248OLok?2*01B#GZ%;Lxy}T|3QzkQ@{w^uwG8EA*ZmmwUKGu_ION$X7FDhD zVUQ>aM5JELYL+n}$JK+SZBKN$Y=3;vZ!A&ViGvupsl}`~HkzF~N_`Z(E;i&U!zaC? z^(&10@I>sWsD83~HlUT!yrOngmTU1pmyz|r+FGCGjkq5!PgWgxjXkT+cQ-wZC8q}i z`*bR*o zA{R=8iNGI@E#OkYa^lPkp&n^xXL^8U8s^6y&t7@m!g+S-Nq7?Ty|Alb_c}<7GaWOL z-gk?08$#WLJPx&Ko$I3Rq^K4myHwH0RNwJ0h==DS_$Q1v zv)6!QfFK=2A&p~g+|?X_+;y(lSTH=?=IIBbY_NCoE^*+)Y#gb;7IX-MWOAT|A)5_50SZy_K93_9KzjE|i9CkrtvE@x)t;1;Y^$*Ta)X zXP0F$#Tv%?XhX9uZ=aq2Qic-GIXb6BbdsXr07Zh?#;OiB&GS&-P&vW=K{KoOiqF@{ z=HVlHBFiEBbjxb6O1C1li2uqH&dkbz!Xy!g9eltM;WQHQ4J4QzcY38Y+nM!gVlRfU zhr(K+&iLs-?X-kVi%J-agvxu$==W(dE8_7B6pZx(anmx~l77dWzKe`*1Q~gzxkquy zfb=}PU&1AsHaSQ{1d#bIp{DY+-!;*r0C-w%hNVO)_`A&!8n{Mn*>-hvd(sCk*VgAJ z;0HIIS2XfeSNHJ3N>}&yk52#z^Z@SvlTYzS*81PM!~Z=##UDxe|G}qV_;Squ8=vA! zQU4Eh-dA4ypI!e=ou?=wCnWX7r;wBTFVuNoIpcry|B}4_L!I~Kr2pS%_ul|ieC5v5 z=sW3}X`BD}gGceVUyk9+@}_P6rN^_?w$S^^r2kjT|J}7m^JN75^6A-rF%tgU7>ch+ z|MQq%#F(%Jv%xwp30x3x3=GV%REm-u_q%wHP2 zKOKBu8T9|G{6Fn`e>wHO6m$RV!}_%oxgTFNi9fV@fA8%Nv!2oq8s#rz+`lUS=Zd{A zz=geq-q#nZYiXnZmE`|#`}}{j@BI&`6Mv@G>;K8Rp!;&*{qv0Iz6cF}wf)5u`O=#G ztMT8}e1Bexe_ZIQU$BI~6nuYz8U8H)QS<-y{-gJQzW#3`{_6F2>)&Jk*#5ix_vc@A z|K9Uo<$tw(At3(Sv;2Gf|KHEQj`>fV#GjG*_cHM}PT~)r9KW`e@Lx2QFYv{`nfvJf zFlhdpx$i&Y{{K5qg7J$c@r9CM`NM_y#l-lpVG@4@{l9|zzeY#=9nybB^jCC#*)#u3 zso$Rri9d-j|BBr|L-!wSh<^m`7wF-yxc$@nC-UX`lcSNRQKC`)4;sXO03iMqH2)J8 z#J@t}-!A-r_W?5f?>@jkEB^lV{t1X+X8BsF|JwTU0WvUrN&o(9A0Pwm7wJRL*zC_$ z>WkrFr~gY|*HTaakA?alB37rB^Ei1m%&~mjWiaXa~SZqAKu=Np^*Y>J1DF=~6CV`C|XEWU2 zVrW0gOLBYrA-8l6_u_i8a$^GksMgNAC+JZwc(ef$qu^P1W z7*|0d=~$W`!fM4CyqLxS@XSC$R5#XGffcDVtpcWN(Unp10GLZ%QLDtnf4s1P*#^%(*p#8X#Twdwj-{jBW3Bnvh^18-l zP6nWjUC=UwN790+>)w(A?sWj}X?xqOy5H>H|H<=%397KO=QCI4({!z87zgBi5xOci zG>`)xND5RH7;oZ}Qy%w8(zb-h)D^Dq6Gz^z5nx$WgniY=3t+-i^ufaBVS~pM#?_I6 z!;7O2_z4dE$n1R+M=Sm{5EvHOT>#q|Cc%^G9@iHG z6*!Dl`+na?+|T{xtM2cEST!l} zcuoAs3V*eXKh-?p#(ZxagMr!xqiAnW-L*t$h=&^LJ#XxS+NuKLU{iimcmlw3kV56i zy0r|(ZTN-)@fL^-2oQ)l)H8n32vmCp?C14~@&xkv4F>2lqL&0j6~wOQQ!*Ym0U6@x zVHJ^^5-+P1{7mknyvwHg{S>1Ic4iZU5?K*0YgJS6wh^M1=si^nR_}uta0#ftQv@DG z=9Hy-BglVI66 ztmluh*j-!*2GAE^?Fx@fMe3#b9jlM8a@SW&{3z~|;^_xZ62%ZMgzf$Vc#m51r#G!4 z&L3@ue^lLLHfvY3eSY;g`eXAJ{G-&c>+^^Zm1VPYZ!`RDQ!+dbX=ybv9JOm;yce9q zNDY8jVxsYrZhQn7s5R%}(`i6^a=vqU0Oz3r(0hZ2A}rszDqc8<--dsQgnRj|SVqsl ziEMR1seYw`<~*r8)cPtb2SH!);2y&_u!fN@&3(^Zv{Fc>aj1bMW!FX%SY224z~kIC z<+AXZF&0CupqTGbt?1H6(n=N6pi=UAYu<1{h?}U5`e?EZjdgflD{h*NM?K%?l=-IY zR03`rl{QKY_&6YNVd_@Ocsswz!(|Y&~?vZy*MmaP*7FK85*o@G}bb!8LbCD~l4Ww%x#olI0xj@mOP@yB!+*-q=UG*Yu zWyYfTBA{oS%OY2mJ~9>yx`Z}I0?*#6GPF8GCriQ<7Np$_J=@maCik)P#l?E#T({?K-6twIz~z})~-_;_m`23Q_^o{-*O`) zX&SAa1m@H;yu$Y;dC5xHCVwNms zW@ct)28)?~%je#?XXegZ|NS>_{ne|xtFkhyA~GW*qpNH0*k9nZlVZk@Vyf{0@|EZG zV{8fclkm~Ok7SE-o6VYDkvfNY`LbhUNhv(m`iH{7J82SL8po^3k z)gX`l3g&gd_^bP~UX{w+D#9{@LPF)7(8u!udM0Kxoq*WFsq!F;#CL>@y5?ANm4hWq9y;4(h6TC z7`PeCR`UoEuJik(c`D*9QMW`+Tn!RRhu%7yCwFSJ?sV!6Mi4(bnEGH(C16X_VQMF& zDrzZ%rETs$0?Kf3^$RHC_F7M@vU(7jz$&uRXOR z#6G(bxSF2!Dz-y&*q@H5VXeq7dVOZ4$#**aTfaGexeJdCIn&2FZa&8A@2#112Nfg9 zTH6Jy6kImmYsNxtGC?~JKnc9!zy7+C%9W5U+n#WmFkLgWMiPX4yUr6{;Tg=)}!KF1&rjEZjQI4V_5oNmhn~S@2TuZ)VYZ<*9Wl=wg3X7!%hdajTm9jj+No` z7Xg@=vJOuCSZ{j2LRC~3O^4>f&uisS>zB{sUl!a}qZC$=rQ=(`$oF=`v8ruO!F98d zDfLZTDC1u&07DEXx!8@R>}I}F#zkGRJuF4ddufqUeIHjfdAVhD;h2R~KGLNdHNkd9 z5*gqIiAs7CCJgB|qj1~C3dmB(y|_BubPnMD%1d)Sskmf5@I}fjAx8X)(tO-y@~D}O ze4HkFxQpd(H}|j!b?>C>Ay!TJ6|9_vC724^6WiW;(0`9P%)a0FC%wK1nJM#^5AM|h z-^o1FPy^Xd1{KDp(g-~-b3X^~Cr6Lc57wAO{T!z+XG$?_3Ye3{RE@G6ZddKqPcuK7 zW*!Lm>c_l&vW!<{=v(tZjNGEcND1F`2j8>r?8b;x+0X$-3s zGs>>%X$Mh>;t07rjJ=AG;QrE+(b{daSQ!v_OtV&snZ^6sg5G-H7^J^>jOfd5fRZ}7 zrsK=yrg;3R1+*rVOlmipAc=j$It`-Z1Mk*__m z!9*bi&C2EvkyjYEbvqyHN!n=*?0tEoY(yrZG&$GaDbUZov9D8|LJHo6+`iP$oIgkWE&dNj7taWIRcAm}(<|})H3En#KT<7FCS7|#K2YL&i5qC+}%hH$Da~-(GGZk1Q>`1!{B?*ba z0;YHeMr8uyQwk48R-!?p$TiZ_ytUis8Z0?T@6Za={T}UZfo@fm>Kd|#e3!^&75m!3 z9$CY${!=gh*W(h+NWsv>akCN**w!#l1HH)`sSj6!i5ewXO9riAr2C-_1qrx_jTTLf zKH%p7jbQX8I1O>^zUjSbwKy%J@|NdXa_DPM|0qj}ya+7w>*9-^a=7)rLg$5J?23ti zd)F)wNf`;DzF((CkpVr1loEq9jEU*(3eY~*L134u+s{xfXWVeQfi3NXX=1V{yK0L_ z#ejXdi|}sGXh>5n&NbF`GZ6@c)Jm2y8pzIdhZXZ=Q=7Km;e=x-WB8{Ec3gvnE>o@wYD@CUMlg_o^&q+yg)NajOh7PE?tdBvgL4 zd9>Cfw2#BJjlw)iTx8LpXdiXOpS~;}OK=A8P-UC5*hb7vh^sw{;Urz6DY_Rf9bLJR zk|kpw(`=m-j0Eu978a5lepXahw2Dry)wsE}yR7)Z;lH_N3wsjod9v(iZg$3K>G?z~2{6%3l_4|}0`39(P$EvD z^U~D-f_4MySD4@)sDHwJAMN1-6l5fl$%_N4|x5F4<+ZVB|%9~BKGl1 zxCYjEA9}3>YXv-_d}bQ;?8%cfFjSpH+*I^&a+xk_f|4^1N}Ch$PEb9#77|CHLRvrB z@Kl&kA^u!XLZUr%JrW(+G#^h&eMm&6Ap#3VQ>@9?MdH7w7c#F$E;_V8IjdLhSIt8P zr$?qS^@Y7Pr&KD_yl^g@X%Uh~v6^p{ok!)!JM|{CelFnYUiHimy}JGw?Kq3v?l^pT zc^&v@wkTJ$hQszv0lo6FH6a7KEzF}-X7XMDDRv1==B_YHNhKr<(}0y_wyL#U#K^K} zSNn4~N(?gP;S5R)$e~o%4-ltuUG0#a#JV0hGK2jN-8$rbX&Tv!!ru{W5UQnOd%enT z6AuXquX=K*ZlkZ6bX78gXn?I98+%*AT=-MsmmFmQX3htV-7 zU@v4FAok)Rx&b{t=nX0SZ7qYb&!AjOO#43@pn{;2mv70WNuQk{4W_$-P6!HM=K2p% zVDv;MzdAcGE01$8ilat}Yl}~(9r`4cc4^(R$3O{p&013_-F{(y)s1Tp5qOePX&y6Y z%8T(&YFN7t?i~(8Uti6F2d5_U*e0{P+dWPHsWvmgPaE=>IdIBcZS5pM6XIdl3=W13 zy6MY!SUvId`$BhAP(WCzj{bZzva6V0Vl04L?73 ztC#n64r|A}EUcvcbFao^m=QeVhaba4&JKd1?YnQjp|lE~t8XtgL=hN?!3U?d{w^_4 z>4^)SqMh`cumQfW$j-NXrH#l@=dyzAS~B77TxQ6Jk79i58}H>AOs64nWQO` z+bgfW^{s9*@_YQ){*56yTT5Ck)hrt&I;`PZtleHJv2j;yNrvcagUralWMz}fxX`vK zr?NVBH0Q#nV30BzPawayqWZy-Vqxb9WGiPkzGLl|Va1=Gx09e-RO{us=cHyw8>3kk z9)9eOBV}tk3EDbcGxtrUj+fR+5f45mlTIytN5sY9)0U2OptABsbb)nQt#m=5_v2%< zsL7j*buTMRD4R0vxGBItNUSj|Ek1p@`2N<_m#8$~XD^wj)moznoy?S{i%#H<)yjsS zi%w%PLp*2+h@_3zm`*M#06&$;Xv__F8$A11FVFh|&Gp+O1e8g6E%zfRB#G0tdBM>3 zfD&9srRW_d^}Y^#tLH^7ZF2TOaT<&0FBi*kwB~wOu4-Wc7rz|zP$d@`E<7WaMrNlk zamGrmGK1TL?Ab!?X={xaIG$t--YT3h!z!9_mW`$oLN#8jX3k2KMFt#$d&ls4QbMQ0 z!)*CY@*JMd{7=#M#mcKq*zHkO&4%^^C;JtB`J^ENshZ(=*Vp9dOyOoW*uVFK(_(hK z?@UstZW?vx7cZ*)9rvmRYpo#V7HxKXjyXkw>>L%nlIQeOn_`>6Pcd0K7++7{q<-$~=foUt6 zU8u@_i`nG$#$ql#r%>9mF;11ZGi(fkjGqU=cguRkKAMS4DPG#ZF2~hNHmRO8%u}~< zv|V%8ZZAz3c|FJ%yGsbxdpKonHiJ`GZoQj|$JGH7XHPly3e{N?_8B2(U%M*CZb(hC zbRP{KoOO^Jrg|X$h6tOK7KhK{(CGK=x>wp|LtI$(DBTJpKG{f{JngS?n>K@HZR*hr z$``(C`ZzEg{K6}^VFB-l(VynUEjaUvC7vpUAa92Ywj~H57x$3(>5n`i&>aW<;sw_j zAe$SAI%f0xBy#Ymts`G;^ZIHve*uC{(d;tx-2-xU+uQrw5)q6;VBn*@)DiLQBni2LT@x zG~e?H;=%4aL(-{Ku;n#AT}y2a`Zp{>=1`bnPhT#-VzolbJ1uv+maE~%W`z{7ORa5z z<`%Vu*E$*7ow`6<2VI>H68oaX@|ovFwCu%um{+l>Rd>paU#zBgjSe$SdJDWRtHa+q z(@Fi%TcgzOfVc=;y7fit{=oElPtn2qHVfiv3(n~Vk}_jb4$W0AEBqO?$!;$i}$1Xg7plYJ?i;pp$T?VqM6S1 zwar$twtq-S9V(3IH2LzBJvP0HN~KLw20}KnMhi1)B5?`aV(gT(G076yM{4d)kKfpx zCP(xB<>t_YK zp^dTP#!wi#&h+_0(+K^;k;1}ZoHgUp>%1q4)fL(EO9Kg74uYG~gW3GE7FiyK+5y-_ zCfk7&u6tmvyx2gM6_yTOIyHNRqr3TWRcfwZQ{emXHH}S+LlLl-gJqrBr8ACZg=L}l~vBo)kHvb@*gQ>IZ;z9i}aBEU=w0YVBgMovG z=h$6*W`lntr*yXlH{!!zox3&}M=cih z$eX^4Z0Pw!jY~cuZWB91@}UQ;In)R#2(5e))$=kg?!nv8)s^M!_URW2|8;48wDy^4 zxBZRO0Y&OG46t@-TVt*e2X=FeSw3EyG%t>B)V{~q{D}Lc$uW5DS6Q6WMgBoJ=@%y< z%pGfM+BV<-)u&cHOm_ZNqobzL23zT<2dZ}D%teBqJK*C?06L8`vqL!c zgJR~cScxgMzeqEF5z01>74X1C)_1 zX_b0jM3dzZ^`;nP_$I-gxXa21y*=0?jcor2nO;;$K~zYxtx5Z;`~*g1Gz69t|5!NR0(_QgLWsQZRr&Z2;}gp- z?*3xQ-W~)@p@6aM$o_rN0_q)CvXw<=_5!1kxyNuyi`G1|oEYn9R^mp$jvZ%5vZWODfOSs>j! zZ8q^C2$ds8~-jNNvuf+{nm+?$-QR4Os`!>?MFCC2fR=Eg&) zqkeE+wy?O#(&O*9+gSelb!d9yjOnr>1e8#p5o_g~$Avhmr8+qq{FXB=EknZceec-o zXYxYoidi1lo(O|;wMc2RM2T++Sqodf7S7darf~Ivc=~^H=76}_`CJy&akwpgM)eVD zDO5B1`AXnI@$NfMARy2|?;gxv;hZ=zR4k&}ZqlD;K;$J z2#Ri@Z)-&k4*N9hgkYJEl3SEjWi ze;=tDIAj2GO@x$Nqqn}%UYf)vS*R`=F7PZ1dSAFFW=^d{_GSCuWYS^b>}Rao|w$;1;5cP)cS6Paj8 zpA^|e+@5<@{7lNm&>`~7@}X+(AMw}cGGv*7#5ql`RQ8E#awiL&eJ7b1l&543IV=uj z1-ewjV=+T!-1|>^@BlmeYTRqv#kz*F+qCD$P^{Pn{ibylKfD5V10|fYTM;@BDVy&? z)9?iRLMilEg~er#JIfAGmo^x#POYVK57? z*!OTq79Vjw>p79}_6acl_!8nF^EKE0vpH8^di|-{zHw|j3$%<*9gbRtd`!{l5^=+Jp%bfITaR;kY<5T>ziVA z6oY4K&haW-MFUubK$7Olew-Ok09HFm;BPqPf0fs1qmjawQ2gplrA2oAT+@$yvbz|LGpINB)bq615@aFrZ{KgbXr}^&Qr#Q_LYrIr< zB?v~Ks66Kg)>E;@Z9iy|F{Qd$7I)n;>pomwaOhS(okIE?d9)-a{ZWd`<0V56MLg}q z6nfIMnonA~jDkY40qr+`(_yyrWeK|4F|Vyh3>?XDzV~gR6D8@0D?QGko35B~39P3C zeED9P?HtFhq6ypp7M)0~kygKSSXCE){|5h7qgLw|U1S+K9x)EyMbqE0QFy@^?QE90 zR;;$^NUr7-HT?ZCE^H1j3fMzza|}p|3zSNjBJlNGXN9HlEL%Og+fHzp2TQ>$CqFz8%#cik&rS5i7eSAbBqvA+)5-3q@6eL) zEg;w+q|ALhS4LT@f!;z{Zz4*BkxJ+1of~N@mViTOML+7cdJba3;Hu|reedJ zi)!tp6yA2(0D}l)W5FZlRWn$X)#d5&;hnnlOY5?j{{o|K+|a6gB#iJ~GDHc@QCVT> zMTXR%(neHmj;N*?Y?8adBJew>}-;3Q!3ZV~HJOvDIV`r>KmcFjgeIGvXhBlLai{gFa5%%Q# z9LxETZyg|d8!9bzVm|^$F-`le^FoF||IDLY{IO9QJhi0Y3v?n|ubA|{yq zXZJ^S1iv$q?uw7YB@npOUqjEO*o*cGeM_=zcGsTNzqQAw~u2n z*MZ@c33byzYUwLf&Cq?leS8uk`Rv0;wPIIco%0}kZ_h=6f*D(6u#M4r>AaurAR7tj zuC^4@_Ic4uQKC~fhKr=_w+^kC8LQvYrxl4%#f}GvvP41I<4Ecm^W+EV8S4pjdRwwH zpCOMtisy2D#^||>j-Z)wbuG?ja$4Xhy`aRh0>P*iJ-@Se-%uT2&NsLL8g%4oQ3 z?o!h&UL6O3CXz_2WE32m5Tl4X-j_C75-PK%Dmoma7dr1y^4+j(e%a=ZY3HTB(7$5? z6>A1I7(8R6%+A;Kqbz)qAJXz|5gpg>LJwHTCdUJHL6y4&LnfCA_RQt!F7QOK#VZ$H$SdCb5|>J1+g zL++~#e@43Dz-)o6uKc?-dK z8`Bz={D-d_09*a)yW@I4EtaqNv2-1}rcyc}z8RG5Yr>BlwtZ8sM44RS7%#4?5cf?K z(ZxFPFU1dqV!8aWKIfg^tL<-3I(dEj>zXOA{sKk7rXjh7W^q|p)h1imLS&h9b+3%y)^ zoE?>lGz0{02-WW`kJYENJakxFkFU-DR3un*HVkVQVq_uS9E&`AN+{5_MGybH#KKjN z!}**e`fZKR$EQqsnOVa-8e#kgA?eRcsKl#^O~=?6Pv6)VkEwAzt|Lk<-qD53!`OOE z(OBJr7yV*a6W001q-3rWkBL)5TtbXGSRq@KcJ1*#F^&+G)?p4TyY?6J^0>}?VavP5 zv$ehjMJhv=c`L3~ac-5@cw>4788k**YOulAzLj6fR?hk!uL=4=_)#X`!{##iOEk0` z&M)hd?NKR#2@sTd9w)TXA;S9_pw;55>|NsC*mKAi>%Lwjj^&NrN@+HTV90*iw|mmu z+qp!>^5L{rAW32SVo!%l9-B@r$%4#2WJRLjD#aVy7KvM}&vzb;MGkSV( z7Y(PKP~-@5;D1WyPaxQWkfTr(aihXYbo9qo`r|lx4F}M*u=eh4PCqkKH~YDw`UV?R z2e?+oyl&EVy~yFDiUv)+&Py|ZoLbIndy!QtU5P zlGXlfW9jmRH6btAvC^B*2l9mH5)=|SZN7;^rXu$-8Qn9SK%}X9gi*VP$fC?z>I&Oy z=MmHV53B5i*V0vHx{plU+avrNLr45d<{Ig;mBQx~{7jJr))$H=bQfV%YrLcInM#X1 z^-}|_v%wr05M=U49|Hq^n3)+6+3MhHbTV2N(+&T?YRu~p6IUm7cGK|}jB0d3rit{r zh>&dIIJoL*((FPkdloYv*``4y^SbFJhR!1BG1nrg^&1VzejDBrrZmH}9ee9W>U%>v ze-i+qM4kZKLUgS9!K(X=^d%!R{NEl<2j*n^*W=&+-2;gKcwiBjG7Xp`@o!HfruM2@ z*kRRwd@a+mS*MV8hhFnOu1RCJOtT@CR1>x^O5OpN%rIbyDTq=~*q=AD>DanO+z6#i z!if~Tv_x9)aJ*a8h~iEQ4(R5dWF2KZlh}6eFJa17(agBmLwWT|GN`GOz&hUG-?c1m zFz8Fpuf?$&!lF=s7SBrB;$trTgmau*%ljM}T0O31JPX~QOWV}w>_)m-cRj_d@_TD^ z(P{L7<>e)|;;Yq|7MC~Lc>Rm($MuqcpEuT6YaDo7eW5Jf>jqv}BrMX&c*&vVW3TSf zOvey*LPveJ<1I?I8>&o$N9a%l6Zv zwPdU_d>bKm4IDyOWdzT~ix67qR8*5B#Oit`rS9od)RlfgBv#AQ&6WcR6mbnDY|)}7 zo_^uWQ9|fx?x#`-s$are@w-UIGE`Vh_fAKdYqFQ$iRj0fQxsF|{hZ|`5XzF!9}Pm1 z{EinQb30V4#QelJ5YK*mA~tHfx&aZ+N)S2S#yD7IM=%s9<#FcD~yf6@>3z=IaSDfiQ5+8zyc~s4yo9#=VydOYC=NM!pqjOmq zddQ|OjkE5z%b(@fY$@FK!7>D?d@Wns{wHm~o2PR>ns(;QG(lP>f9o$XYCW@S#Gj3k z85k;yz4T7|jkf(BYeEQfWG)xE-b*%Xk>UZC6a@Jk+e4#z5toy;HcZCQU*3xPSEL0k zL!BVnT++ZfJ=b*aq0jQ&Dd7znVmRZN8wcZ(mDF$IBJmL0kW+S z5;wSfbCIAez{w^>Fn^zEO~m`_w>x`B(dLV(pjUw&vQ9_hBJephxsgxtQl#}Z^bb79 z&R)R;bR$%=BTT8hl$oSSl++WH3NOoF;th>yJ`Gw<`n>HAun1o*e54fv7cPP=-QM(t z0Z)U}ps3-JcoUKw#~t!k=Pw1ds+a0`O=xYZ&`*2a_EqYLDDPM9dvdKmVoClhtYKk`UoG2?TN9D0eK2w=6V^$1xj>VMKQ0wr4WT!yOO@LQK!GLN z@T+yr`G)jsGEd(NvIhw7a+AymEa^%GJPtt)Eouh$}YLz1ays+*-u-}7V$WN;qYUaFlKQ!lg~I#ch@x(&kV|fv#k(2j8N2! z@-ymq4ja2PSxIP~)f+Gi#7c|@Y@Yx@TyVe}iK;-SF9ZiYi?tOOQ@ z6jf|m1~%BiH8smkQ8XP-7IfF}@iJYI9A$itxfB?`v8Onnhj6j#h>ki#mY-QcfWZSe zIbZ~|gX%br2?-27nJF>Wdsn;Sg9pd_4ST4r3I*S7{eVsJXu$2fvV2?{_t(4M`4*#+ zh%K5!`y1ds zm3RjyDUUPz=_`poAPq_nucBNC<*c3p#4?zcZP++J^>lGpIs6gTPjoIYp?XL*3(1GOJ>2TyRBUc2`lYDxsEQcy~b%iy>IU~%n z6sS+}8j<^fy0hea!BPmrkg%})4N^Szbyl=e8A07oHe;q5jxFNDqjk&EW#QuDfYUSrx^MbW^D~BW7INo1rYb_$| z6=z|F=xIicrJ3|Hufgq-}S@HL>T~y(X_KNKPW7cwdZVI!~!qQ?Py!|ItCH>$yEbL`^_2dHcXZmc({eg zi%tiORhGrJiAih>{edUh(0v=C~^01xGOCtVUdMqYleW3Ij-?a=!QUXK1){ zkaPJ!txp-jrg5cX;%!(^Yis(Xw`3h8tU1Q;>RCx2S{NlAI;Jv(uL%`ie-e8<-O%62 za1TuwS~{4Phw3o1eIbhDw9x-N$PW6Nn@;8hhXC3c&Pt*jNJMYe<6Xxno|ol%X)t%x zk0Kmi6Bsy9ZSDe3e1 z+>&g}$-`Z>7U&^8q}IO&xbI1Z{|U_b3wcL26n(K*m?$b@3=x>87x53 zK;J}%&&nBi`uCCW%X8{J^fU~NKm;N^6C(}XyBaLO4SL%Dq44&$Iwto2Ci=T6{Es`Hjg^Lh4mjd0^o%rY zv@C4ziGpcZX@Lk!76t|yVESwN|E+#Ew6d}X8mz&;3HffQ|DS~fX43|~{+R9`>tJA_ zrD0?RB4L?mf&B}#Yz8(u8U|VhVCri+VE4Y`0{>UW@sBapdpC+drlKeZG(q48KAEw- zy)`=kpkwKvYhp*EZ|2}&1pEYuDe%()3&9G_*{Nz;xdX^fXLNz;xq`tZX!FbihQ< z|353r#`a$n{o`!@=OYUAG{B71jQGIGLPO68#40neu+Y%5FaoofGqBRo(E?MP|NpBg z8}olv^xa4Oj}>JE8YmkrZ~z&A{)~|Y=o%P--jFvNF`t`^Wn9XL|lu zCI5aC>3`eD|J&4L1ggZuLJxH9Y&48OS^)+o1{xMdMn>ShC*axz^p^j3mHg*8N;;U^ zo5<+c*@;?OJJ^f-<$8xMBiiY_0U<4c=F4fQ*0;kX*pP*&e9#zZTO!=l;*u z^e)EVmhJc62ZF@^N#TIc{3oh;#}?b#+4CFg*y1z3=d1?;wEyhT(E}_0gGvJE{r?E~ zFDeN|2`OD0OXZ0vC;>+?tc{nI|LY`0G0fYivK;E1Mqr6_$+k) zs`l^v4lKaaO5(Es=^Oro$^qC)2A}nBt=`!mfWeRgKG3=Rs~WJOGX6X7!#^ATpVK`6 zPo)DSTL3az-~;r5{1y0gw14XaI$)RsFv15I;{!~9NB*WY9WAgWkU_&7A7FtGu*3&g z0lNzyV1o~^1=3>R1MGn`68Hc|d^)FPpkLhzpnVN>%RNJ_o_@lwt_$3bnnxU30VJq@2`4HK-c)b#Rio8Pn~}peJ^JO z&enJL@~+jNW5BZaSe^0D`#*>o{@D3HC*41Z8Q2*A6EOoT^WTUW=-vKeePHp)XW)RdwREJ0P5b+QhCORq#_rvEehT5MYa>e<0F#~>E z`o;-~9wJ7^{Vp@QUAt?&S-b1Md%1p2H)~UWvr9YXh%ietE7j4Po7;`94^Z<~+@K|n z1S$VPEF&x5DZ_(I)-fzS(3c+sqDDwyoft!cLIr~w6@?5k)Vu%&`QQzf9mCfZL)hhK z&Lh~6^9@YbED*w$!uBPa_(Pl%2oXNM_-C1E6cZ>%o_P=zKJO-LWQZ{PeaIpHES@xO zLsoEyjxp^X@d_qD)(?;gOfWvM(vCXh&jjmu5i{D%)|m@hI%XLCUP!GFM5&YcKT?fj z)p=?J%~;`&5NkdxBVU?yPO56x#J=I>zpAMBLc-2g+27|pXB1y+Z6_ci7d*AoZy-j{ zh|q!+z|?;r(teX*0(mo#0!4fQd|}EZK?REmT;%KId2Q!IHbM)+T2RIEfmj5!pvoHC z;NI3wyy2$K{CO%3?*53WdL#sU_clAu4OL4`K%1N1yuEJlHt-q?=}G76fQ-ztVdtso z=?Q92_;`25GVK*a-pyle1`XdzARyqK0PUCejlk6?QxxKW0K~7Oq|=h80&9s54*(w_ zAPt)Rvj@%?Tp0OvQcA}YKO=_(4BpqrBFYQ?1r6<9`MUh}1qWR)a1y~!?F|P74fJyG zjgSsMV+()+bxHmrscTFUuSE>8BmX3L;F9bW%gQeQgptMI;1x|9C4GjGwg2T=@*uX; z$iD(&(Kq_-f(eDstN-oFZ2~K1{1PMURP}`r1|RRh3S~pst?CtFQf^}%xm5cJD_e5u zCE$R`=Q+Sw@o62I8tw&QvI((W2BZ}33AlB>E`z)pwT^7jeaIrP%mb{2HP%khlr*r8 zd^)ttBGBym05@5Wkg;qPRJZy1_4RH{S>{Kx%Xttqs0)N3#OpaRDC(!pyT?d@C^)dz z#wagMii4{wt2*yYX{^sDA3l7PisNkKO^C(Rem_nE+9kAyLs~2v|F6Y#4u5W5baag)FN~>4H;q{P3!X~3IB0~aGgomxr zOVd-rpM0S3nGl=fSPT=(!>o?G<4KU#bM)nq)7cm9!G+mVXrz{{&S9M)^wZ6$v(uK~ z_SL}Jr%N%dX`c$gpYW1#vI2*BvsYj8QN8ykUg`&lu%VEmNDHcj`U|U~Yp}Pgzuwn$ z2^M8V_68B?IAqu*-q2AH4KI2;78_M#o=}C=MtpIr?*Du;qiDqy&=Rwh{6_2kExQaR zQN&*QN1EZbBbyOD#_^~g!A<6%lOFGoavq+$OxRd-e7#qj%pmYin+d7Gq#=%m=V%V| zosDkwS4%m9OkbJnEDfpL*eQl7jYB~=FoP=Er@cGDA-Y`EgQxA`<^G~y5Zh~*Pq^8h z{TYa2GlX%1hvR!mLpN*@=x(dQ58xKF1`CZF^b0=Mq>uR}0Uva-iaEfT7jd?2&q68L z9?^mzu*cwi@C=Plq^fsA@$L4UGtLuD1wl}4ZXP}S4iA1AENH0dYMI7kIzr&&pKelW z>P6>zW%NMT6KH-Qjx<8Umq7qCVcz!4y{;Wcw?Siw)nngoJxoZQdH|gdU~blvH^ecV zu`lVKb^f+!PQ+EDJ7+eS7N5K6N%};Rw=aV>A^nOkuXb2lapbi3ddQ`6()*zqmtIpf zJ+wZsm?h{zke#d>j&$4~4@O=SjcP2HS8-auE_Q(a+P&#~)Q-pAm)tD-O6VgP3{S?h zYoh1d0b+KE|5x%g|M*VuoSF0I?@1h>f>t4i0|(ij*OSuC7 zV635)Uf#nkwguS$C(om)izorlt0fyaqG*Kj+PwOtADC2Bo4Tz0w{dNq6 zE(;4YzHx+|$DqXt_NQ*~#~X#m=ORsugnkTjTKJY6&Pmwt%z* z@@qLdt(!3g^Gi{8xoP4EzmM0-D7a-vZRtwqsKkgLCEU28LeUZx&El4r?za|?M51HM zUO7>e+~_;w;*pe`$lKL>;=CGJ>7cc)R!_mx_KVOD&3;8pHH;p|=hMm@;O}kKIW2P* z%4^wu_j55XkKi~{2IO&Bv3=cXEm@A^CWTi4hZI68@hX{j9SFnH2s$%)lFu%42bhh` zZODWj{!VF``oIfU%Q)m=laER3ySG)rTYwx-0>_)@`pKlGzp;lt_{}VJ_U`BSnwe@% zQ}^FlYDIID!o3Ik3Nn&?X;QvPT)aa_=L+lMT$^cUT1oFA=C458DjPAp2fFzg~SY zy;42GP{^nFhW86biYh_=Ap^^8F-j3fUQMwt!WkgRXf_UwyQ%phgwz1RKtNusNNxR0 zanfts(AVBj)l>gPtI)Iv6e88W7>l(HFbOk(b1hSMgVj4>4?0Ex#L({M>-j?H3G z#jjpx?`qNf_(;ufEmyBpBz<2o8SU#VPk7(Rs7om~Z0>LK%w`8xUIstkn$D-2Ch}yB zUQeohjQ(;)a=6w3QeKyT>voYfin?FY5BGFx%jF!fc+YEVN7Qo0xi!nwoo<#MyxPIF zi#a!y>g^(vC_hBga@!cmC4lAm8%n2^A!O#zN2Cxl@fkk5^h-uw5j{5@i6}Cz28a7J zPbwnYX@pCbWDphJNcDYA;sj zooqt(SsENj$NegBb?srF+!lH+=mcx=YR~%W(6CBBSkWM6k(GB4&q=jqd}@aFO|w{| z-jkAJ_?Ct<7*Vo*?B`W>Zxu}kXPBv20`KH95&A^j2iS~Xn7`TKKR=%i&A-;`p>0&& zv23fV$o5R<(U(^thUO<|boyWL{`9F{<~SDS<~u5Lb$8pj(;wTWSU`+wZZukp`w<{G zTQib@=qt_MlxNRI5^Ieh)M`%r)8N}$*zXm${n4K|bne^Wuxeu|5)@NX1xr&&9z}Ff zS3O_n%PE8KwNc9fu4lN!0C#P>CN!n&rwNYReB~q`6tFNggoTsF5g8x(wjx}> za1+aN+mp~AS(P%XDJ}B2A>5}(X_l)=VEo-42doYz)PrSs3#ab5T}mjSfj#(DUtZ*KJB* zXu$Lh4Tf)eqHTg7c75_M!LBU1RG2Kh@NFq<*T4=ej!WlM<(my0x6 zwJw06r2%3zxe5+-$2R9z^#&<6X;qk*{TlH`?g);`$B|a@)zEgYsme`cQMcw619n)| z*O*t_BjdQ&n98;=Hz!!RJtC0TNx`p<9UKDplP#k>MKp;!YY66cfpa`P3v15bIqGt% zWL{@gI>ePH^0(O`c7ExJ_U=p!NY4b-c!aSkGGorhRjwTdn!so+B{oe1Ccc2Aa*L~u z2)rqLJg|#feyYnaFqi7xA!#J}41A2+VJWs( z`fUY2np-@vJ~L)O>cXLqTa*)RWj6joGw3VSth2(r(EY-X+cTNnB}BD(e!<_A`syF4 zt!xqatr!Px(D3klpTT<=Gd22ztzOeGTKTiCtzAX zDx#cj%h83|GTDK889p+_$nDRBByMI5M|)i&&yVyEinM97UpvG-&2_(PG`L)W#viKS zT>UsrcXu#<5rhab(L5-4anzPmbx>ibo8#&Y;WL;|9q1KRtq&4zKSD~qD)BtU{TXT{ zF4a3t2ew7hegBBNuFvul^pZqidmz^s4BhtsVeB5D8{HRnftOR;c00ALncB8H_0+a) z+qOBirnZf#ZR=+C{`SE>=id9RtaRmVUM6pn)jq#Ge~nn{j1%NaqL+jp5^HncVUeI# z>b9$1>pqyTm9T~$NJ$IIYMY--bsj;eUFB_A9@33 zfJe`Spk#~qT|*51P5yB#kh#1s0|`XN$qptP`@qn&IS+7-6-gMRR0Y+R?+M4tWL4u; zP?)`Bj1-vH5H722Nm~1keX^uSpCDLXRcu+z^1v@ zZ1+i7{NkaLGad7hat~~YyuDv;vVment1rq!8lgEz&Hkt7P6%)4%hP`au)K#@dcv}nS9&$;D& zK}daz!yEUf+29yMj_eQV7-NbxXJr^S6RGtx{$*~CQaj9k@AEU9w705g3C?e4EJ4nS zE)dEPWZz297tmWQR(_p8Xs|xAol(ONrt62>_HX6W2S zx^EEEQIE3G>X^%n0_)vMIHzU+hp`B~hU`YVi?NRAcVH@m1tV?4ZO}AQsAGxW5uws> zMUdk3j2jdRyp2ikIz#W^#ky#8C}=H+lvScu;$=8s>Z!UIQ7e8QiE`TM1+^S}^R2_! zjBm_j3HqxD!5eiDqp>Yy@>lluyc_|?e3Go3d=J^1hRzp5bw!HaxtWz2=vN2)9c!#e z!M*!E*J>H#;4Cw{Myj}DIu+MVZ#7A4am7MSp(&2kQTw$jO_gRxLytXuI zzVYeWd-A)^I6-mF>1GAhqHz5pG@RXa$Fg0iqt7-GxIvX$5n^;OKwpBV3GZYkhK1su zM!wUwIX+CA$j(kdavH>1N91GC-`lbe2K!-vldg+2l(}^s30H{XhW*Ui=;!-{d#RAQ zbo+EIY|n;`LlHTSFrV5W8#Igp@fn9CoEn``QEo=|`4c+Q#2lHs&*Hf}eTO{$(J79oq1 zV*m(h*jiLjLh6Iej)elar2q`6hLkJ)r!OR5&r6|Xe|B{3K4i!Odk00P@iY7FG}G_X z53k>s*D7V+Yb}-b+J+TBs$_gomPEUWz>3TA*;a2rFeRWmhK!bLJk8^$1a!I=w*DX@ z%f5TxxbKg%Y#p^;evAsAxvW!J68aIbJmwFf39a30J=59hgn>PpM18i&h&;|d3V{c{ zL5vy63+J=?SlZQfv|*`g1XkIW(PHGZs-ix$UUJEthc1m`7AyxERcdsw2`ao&R`gXO6(lfkZKouHpl2IWk#@(qS}-%8 zaVt}I`|Iru>bGfI!2`SPfT@%q{m{-cXv@^YPi|1UPcwpZ~mxGd3^SJW&l18|c zbDvIJ*al7}M@p^G#M*XRJes`84O)W5yqDI7(>CpzW*XJ}dcB+_r&KNnz9yUZ=r^OO ze$#}!C~{fdXfa#c;5B9yFcZoJi|#hb2mB4KCs+P1GJMUrB^B(R+@2XTx*jhVA>nW8 zw9yn&skck=GuL@F$*1Dvd25~ZzBtT|Q5n8@Hi5FOFq}}!x$TDwQ8xDIt?i@nNYb3c z^06T`v#jjdy5G=}=dKF5)M~Vv71SO#W~r9_cHU#`r-eRQ#O@I><*%?eO>h`9 zm>I!E>7kjQJ36-aI`*7Oq@o!)Tc+Z_&pn@iwSj04Ij89~R-tKfg2R>~XX+m96QmRC zb`J7=5i1gzHy_iCmkZd3`HZ_-PQJ)c+mw6^l*6UiDfuZbDNu)RF=4)lKzZvSVd|Q3 zUzGsqM`CG)=-0E9Bs35g1fKwj2C;7-zSa`!G&b~V#;|3fD&^%f4=@JVqlvFepHLOn zVpUNaJ?)?$*$_xEmFq`ubWJeAVyMv`BMM(`GNI^yW|(mK`nSc0_g)6BUpRSimBZ!U*b7(?>i`v z$mYaQvVvQy&fiH&^pv7H1O%tup-y8&1p1< zo4|vFPooTkZ&;7|mc9}dcLYX37-*&tX3$OOt=qmVbKl!0PcvE>WfdxfH6UaKg|XSQ zX^#)dgDV(mt7u+sX_jPjikzx&W>c8RdM9_nG>?$-M8v$j3hjE@N}>VDTCa;_8K$ff z_9m9rt<6|*NDnIQkY;i@b%;=L_@W9qjpujO)YFOet?=T@`X}$MU-^8d|8`(A+811> zUi}8TE|n8Ae|u>VfS?Z)AwUQ;!Gs=DF6%V=@HX zU-s@1|4sNQ>=g|UCg-(P$R)qx0h~8zm56TB*ERm@3;d6+Dr~Bq{3V3LrzyjRmK+Vj zASnoH5&OY}iQB@H4m1U$Aj7(oIP;XT7`~0ny3CB^fE!M0Nnl8nuemv94;C~QqIDuq zY2(DmIOp8C1FSY(%y=``bs!ekYK37i-Hl#R5=>8t^nJaR!EUdw5h%hV*NU4X3ktSt z{wYpIce);|m4Hzxs8NL6%|PaNm= zw;WS@v2v2Y(h-ou3%3n3cIGkGSuf}~K^wADn0#1Y4~YHb0Ga=1umM6%6-yOF-%B;hSc1kdEpoO>#~+FgtN^m6{0YNuG({+Elv5WIv#b26E@ zQ~Qu0Z*4k{k10|Yb*XQJ?v3_y4>kO%uc2SI48Nwi@VX>i;HIJYvPZit!SND_S_qaV zs2zojKn*&zn;3Sd3U4-eF6rLOk(bNMg%eZ07#%CNW=#SjsRJir!q9b)+QF|ir2P?1 z=;)p=d+g06lpIUEahs0^!WN`S@E!CfJ!fsiKd+SBb@&X5iAJkzXHJvcT2}UwW@H^V zxv3ap!&Dw;@;PcbP>DA7g=hqog)!sy;CB`Je{%-_ z@$olzATF;gt|0$=2n+H5GK2*ny8k`@Ki$C}+xqvt``@?&K!k7VYGZ0-Mac3mN%}vB zlK`Z{|48)zbO!VSgui*gUok)6QThL?0>G-J0K)QLmI6Ql8A5;q{Kt9#;`8s$01(G3 z{O_p2e~1Bk0Brf+fdC*-{^xEm0x-(oxB$KLZ#VicvoHZL#Q%c}{P9%&ekL>l zc;`0{`R^BiV*0mx*a3cqo#A)*{`9G7p8>ed#Q8_e z&(8Sg9Dt1rxwkaWHcHvBux?{k{U00+0w6 z2F~9;5D-iMxfI(Uycggk0RcSVHS+sF|2P@{I`{r>H~^4$|8_IKwJ+`8aKPVA^?$_y zv;f$~00{UM9gHkh0NUnXfB-W=zoI%DS8jI zY>FG?D#UCTf9b3>a-h=E1)>+rtpy)=6=oj1aom`B#qah#Rd?LCR(0I-aYB)Fw4xUm zB*udaO+f7rK>Y#<1u9T(K>NA|gowf3jEYW@&w~5y{F9^Ka7x=(As|A1eS9C>{$EGG zj!1gx2|x0eyN*rrC4-L;8s@tyh(b?BKwAL1>}?F zeOMZ{K=2C`sPQ9)5UAu~^VXrxXW#o!yyq7J6o2JT7gYZnsp%btAJCT}-ABXjXL=7i zy&DWZbwC7|{R|BFVTkwMOQAi;|JZQ#Wl8t3;N%vA?}+OoP*&iw>r#B^j^5+AcvbhY z!R4XrayV!Zu#&zTglnE7w-5i1n;HpmPS+`@#j>%Ti-cF>OigUU;-ct6@w+8et}HB?_pf5GrWy`zGCpytcb zy#vg%dM|YJyyNQQt(G9Z{c-6{S&N^rFkJ^2i<6>LNxvWCEdWKWGFI0Zvzj}K@kb7w3hUrP7N z96P$d`SOmpRt&?vlQ?us%qqw|#{*=3rIo(TzFJc{k}`6)zWXA(5ZS!IQnFS@)nc#v zT+y+~xxLN@KD6S?raeFCwtcwSte2ZM<3YSy+mI zb+VyUvyz41WW4N>>zkrS#6${>L77V%!q6{lIf}7*WMUEU^akQ#{b$Ol#Si>%a~otm z8!W$0aV4Q7!tq9;S%rc>8cmjy9T^-XYNWJMNIm@K0$*_o63}^IzJnLYh>ccEw;LRCj{!eDh|2jWAMSO4;xuZ{j!>zPC> zS#iYujR6?l4?G5!(JN;cv61{zL4D#7^)y<_FP1@WKP{}nFUj@ZYN*YLQAQ#?VZK zwD?;)W@FOZP&Mi)P|1tFG^)~Hz1rlm>aW5)9LAdnQ>rI9rh0#N!z*%4day2q8qb~_ zv868j>UHcTIp&T;dYPIDew~d=X+9qYiWJXfyuMhM;>=5Bt%x<5Y+)W z&|?UD9VNYO2lf5T+O|#2bt~-Lt!IEjLv{16sbrR;Bvq6Lk_$bHNM2gaHT{d$Em}*q zBE%`?0(8D(;N0U+t_Ks#(hpLFQPq$VCT9wkHq2rn_j@_wOrEE5!*xG9y=ERE2bY&U zdRz8f?dN-}37}uFW(wz2>!+@u6LSdQgG8=}`%PAxrekuG+o(DcBJBn!xHp6QDK2&= zi8pIW4}<(3qs~ES_GmJW>zzf;mDN|mp9Sj^LKBM6*fs8o^c?l5yxeR+$ zg(eDnH4+A+SL65QlhMC50sp8mtpU6I}rna$(ruBh&}hG>?mh%rJnSx4Ve4th(Vyv6)ocYa%X9g2)czCgPt+n#vvvgUZ4k!{T!&9`aV>nlGt+^g1Kg>UiQ z_9NAwZ7Y)a#ZvMM!!(fBdPk796FKglOC5=|-8SP3%fboUkyuy#T}N~u{k}Yl!jhr| zNSwDoUAu0=Q>g4ZUX2M{yNk)iEBOM$RQyrE*7qFQ=3n zX`J+V<)ON~t;aooCE89!1^(vrjL&0v-Z|t_H>q#J;g0;m72RrY2vN;H`bX?d}6p%KhP3&nBU%>71YnllUt3BiK7$+9&uWU%)X4i z(Q%~RkFsdps(mt>M*)m?y35r(HGmF`Qi?FYTz&Nkwpu0%>T!Y;)8h(?3*&Q-yN8Bt zJb)nJyEtCwJn*Fqys}EH^<(Ucfi#C4a&-p$q*m3?DgiC#o&LHKoaQkJjl-+)nk;H4 zI4zz{>+eB45EHt7Jp_+FYYK~m>iOvZN$$KXUT0H&2WWL95qn}!i9ygk4&H25FjZ?q z9&}}2hEcW)@u!u@k{5}h);H&zRjG!W7JhCw{%d>k^S<#o)tvuC{KLD7jB6`#mEBs@f9 zrqVV4Xc2NPJT`pV36elAt})8shNOlTQ>?N8s`Yh76y8x#T~N4C;SrMUFAJlq-tj`>l%lh#^6qN z2pDY&+#VVbMhXD(4d@%-ewY0s7`6wz@BlW7sePxC7!CdHJ>!Q5GcNx@MU<}W%{3%9 zKl!C<)u8p1izc5n^2TYwy~iW(=c{*K^)+jVbkSL7BX^TfHD*{k2ythS%yDpHKFSr} zD1*+-O|r_*EGQ6Hm>{ruEmW7qtW`L>rRho=SEc003NB%ARwp`!clK<6LMo*8d$<(^ zDOOej)PlrR9#(o6+ZH^-90s7-UlE3u)Th;DAyov9eNEIVL~* zVEcm7Mt&UW=1aWN0TJUjmOYM;)60n}+y;w^vnud4oH~)*j_f@z6n8?6z-S_d+8jN| z?=caPc`GwUkWq-<&AVk|vg$`g*U!UgXR+O+?u4J*ZS%qwC=sN8UlL^pB^lZ7lqmjz zVaqqj)Az{j3eDeTK7+JX!_=g|h(ricRQXeqXyf!a#OB`z+zoRcK5BWd1|N4+!`m zs&&tkxcZFz;@Y}A;1GK~ZG1Cjv8<}$#)MNMn^qGP&Zf*vP*IhOEAluOGGr9e%<;sR z((Q9ftKgVvOOJ?oECDGsWPK)mSM`MglW zG96mJ{?T|jO+Hty8Fa4Fk0S}sUs2Ns$M8dj9X@}Sv9u_kV|hb8DK?_JFpm^hl5&Ri z$2hI~ncVdyg;BGUQ2{(M@oSmVBAhXgA)s2w7z)j;d^N;HpawXIxGTj{r#ly9Zlt33?Aw>v&ZWaPM#my6?8Xkkszhc%XBT%5x$QRhVD-q3*APf%1Z8u zBZr1G7VfQ6M8Syc{dC&JHkjz%Xjn9R_bD7dnArNJV)5OV+2h$n%b z(pKVcokMdbK#1x|H*Ox9ypt~RaDj9{w}+7E73au#8AMs@UGagA0@_5X@g8JKi%Py% z;7UuwukDiIe8;Y=8X0B}FvpRL(j1`$iJlPZi3Sm=Um9udAWp)%Kw7Gj zQ67IxFJB$xvDW?tXLzyK(&uH>2#u6mc^h1ISHttlOx>|H>vp#Hyd4n$2yf@Pt&Lk#i?gH*lp?$NoY4I+5PMS>>(1 zjX^S6(y7qsFoo^m$l|Y@B3uEltUkD?%0HeB;&|?L>G1unrg9R~*FCfzN9>_=7KJDO zLXcYpY1NZIgSni9lT|UyOz{h>Bjji;p9gQ~9*{RIS{b-fGGsrc?KPp;F6U7DW5fyN zWgSOBVXb{)KNiY7PpZXm&Ipxt!GZzq&3AK`h@^Eb_$*^&315VAI7J2LX0>;DHH2ER z2F_@&YL(g3kvij=k?Nof_12m^j!@Bdra@bU+7>;mg4MHb(L1`Wc_Z&^eLWrROe!?( zC6lBic7pL6Nn4mfDLw0$_;c%2diX~;BuW%Kb`)UqCj}m+U9Roh_u%5L;*05T$OW>y z)Gq#62+n)&`*{`R6foy7an8{9qORQ54x%h{>?xX-;rYlj;j7yh^nzh@e!@AS6Yh0Ak9Ca|WAK$r8oO)gOjGP2UpO6)vvLRD0}s zkw$;nc!rh9k~A zeV{^A17WT)^a?T9GL8=Ord?TmStcIkeoNm;4xYc7?Q69Sf#K@CszMv5cV6bSP5^1z zY>fY60)dt;S`BT%>szHtCoGxr1Kc^=wR@4f^V?6YXW&h7gw*Rx;u#)o*5!^%vEwUt z&sVeu*<{YAXlQd+?w$Rw&+~93apCuRg3EiWQP^*Z2fq@_VhL7v+t0erBXL*9A00v$ zKT+v+v^mt4fP#b@hvMdR)0+imv1NoF=COaRx`J1G0-^47h^Su)$)~u-GOH@4O>=MMS8jL_atisdQ>FTV zYEMaZg7hl3Z zJ4JyP!N_vE4ST50Zi&gDv7IP67^2lOBK9;4AR0PtM`$#YTx9%SiBI**k3~*r=ptZ! z6;}vf9AWE;GF9B@Z+AzYj;9UH)2BCEXJG}fNEtaEs`?h!KF$Qw#tH6xiHouiHk&ovMn)JoIJXRUOFW? z5%SWetO_1ioL@tOs`ImUTJ2RElVrF;>qt2&CzihUxnu?8UqD|4ZR?MPsFtyW&TJq2 zG?hNep&8Y)&t*$o9|4*whZQGx8ivPhs?Q^dPdW4Q?W0w7v!9RFTMID3d4#WjPDwcK zEvII`^KZVber=GE7ZM?r9`i}(_T7o}J%%&0dr5J3>7$}4Ty+Q`3UdqU?#>!B@d*$g z{nQb|{++M~s(EQM$4}iTHK>un9t9i~nh#$u&shlx zqVg(of)vzyWqt3MRI)trh%~b)HqUEj+$F|?~o+7y<#H6E}q2QwTbYDLb;xa=Rr7W3b0A04bd^633mU&t6H@JooIH7uxwV`ETFzs_BzAztix71!&WopHDx(WJZgoy2D91AYVt zRmdGH4#rU_NrF|pS#vs#k5`Xf9T?=*rAALgH0Ju3NO>rTwih6Wt{Mo*ON)HHmWN0U z)6aD#w6nXP<_co)xI;gZYSD7)RHp&KpSl zGB{W}s>|)9nIuf!k!-Sn14UYzD0Z`KbO<-iDI*rlURw8$WutG8Wn9;*beN6qUrm z$q9J*>wvUwpk}S?qD=8re&B3zkQvTmgsfS)<11wLuGQO;7l>)uiv5~R+K&>R-i<8S zg5wCRpB7w$1EYk~L+N+cbvAGzB&gpaMd%;bBFHtO-W7bk6Q5Kei>q4#`_(nqC)tza zx?}^DomCQcP0Qq4uW>JiC3Z*=YT2Zt&;3W}+bMGgZAyzQc`SQ^JJVM!NKSmB78dt} z1LFr8Q<$TVB=JX+_ivn6R_93ob*p^QPray3X~LA9U&H9mLQOcb6#2NWjGB*vDrNB7 zINma@wj*li%!f7Ze=f#&6|_QB3;ak*LJblgDsU&DM9eYwzdA2KVP1e8`O%A%A2azD zp)wW9!t&x;OhR3U6gtSe>t1}=U3vLnE(^DECly57C@mxM9g6mIbEwCx(Z)BDDWgJ{pES)A!YRYnuX= zvBkIo0bDFAvGm;BJgu*GOc41lBail@4kC$ss+<14G@nE{9riqc??$3T*p>lK3iv9x#-@S8Dryhs_H0+7h4oPM zI@WGuyet0kYb5UhUbV!>}i7#fWFW+v@NLlKpa0%h7`f{I|V&;*`k8gG%rn{{fg zLHsuH)uDwE$nYTZCYmCjXn_NETy9s|b<$Csa|Gi%G=5sTumNELkAM~6YdJ_ zk*D>}9~z(iK)>d@K+$Vl?akTE^zb^FK2&Cd4Y`oyYHvRn)zzkoLQt|)uM%40q3j+s z?h1=8XEDmkWV&c>a>JG`}# zS1lfiTDkCKfWb21LvyT`O|rjcz+b`Z0~>O~J$~IeeDpR^QIxQD^0BTyUP&vHU4Tpt z*(B%<4?^v>Glqx3#8<#9feM)OPPpDR$0r))%0Kp2w2!PjyYUpB1rIT9K8HpXmOs+2 zmUP43SvJm@8TR%+;bev=Wkh&C|t23 z=oEAyu_}+9_FeI|%SBs<)7@kO=nW0mx*3Yxk&u?yPgpcTGoFvJe63mMny|&59)!)s zw8)QlbfzX>+D2cxP-EKEuzE4I4oC*HOelhVso- znDyJOA#Y4OGEt8H>ko#}u2ek6@Wn40S+2eQRV`{OLl@AKm)h_ipqt_>-b~&z;%AK# zZnV`&c=lq4k;-hoCQ9D41Su=|zr0U9x-vE{VOOn0U9EPLX&kO62IaNvjp@5$EQ%gb zg|s4Ugs{}BLK!Lw7PT^;k(uj;%! zpExl^$*C-G1DTy6rasJDiuN&p=C?v~u)wuXYAX6168PBjeuQ7&sa=GIgMm;`It_E- zvH({(;#sy>To7^jNiY6*R`ceh@K>HawE75!th+Nn{nX%Jbf0Wp$KW7fNY*5j)eQp=sAi_`wgU`Rz|JAurZP2q!p)Lp5kAlkOF zCwq)4d*Hm&`pb6d>aENDz9wUblFWCq@vackTN}%(mR$Fr3h?}-pTfk;vo+O?hAy~8 zrPM_-nV?xeI3`0-dvEl-W_N6!^X(V#SPQcAL#=^MG&gOuJ5tDNngf~Mf!c_kwQcCw z7pWj==N`Sl&cl!B=m|>9NDAj8bpn00h^nZ}pLuhfd|gD(mNR};bHjv=VvB3^_TJd1 zPj)$k#uzx*zjm{4vIfYPkM>6C+A11CcL5 zHNxhBPO!{3t#GnE{LCYhFDY#KK+skD=<5DJ0jI$u+_zz;5VddNUHAYA6HlS}Pb&Aj z&gU->^uMEW|54Gy_-|AWF!4VPJpe}bHz_BfF0Cf51dwuy>i%% zIYxk#`{rn20Vo*(fUAG7wSVo2`D4%igkQhgSpLbQe(%9wkH-J-C_sV9zjvqnKX}yN zj_*Hs6f@w#`O`;n0B-%GK;`c~3gE?PIROle5zr-nb{u^roZ2W)0niQ2`Ar~B_hGiujM<=PLS?8D=6m0I{ zqF7ku80MI_6qFt5B&2DE$0qH?X~Y{97#bQ_lx%3ERT)^685o+Gm};0<4-}MbCg@9O zMx-V`%TL)XfKf83+Kfrlj!4OjDP95=78?goi_J*MN6g61NYzj%E#69r&qoBCk*`2Z z(8$nGN=nNcG%_uTiA&YWi%Ce!N*ydju!}X((dhK!6yhjs03ugT(olkRNbvhK6`KbA zg`#NpU{8svprFY1=w%P|Oai<$06R*6eXWv(VvwE@!;ps~fngWLp4px%m+IOcMnX~{ z9M$7SQ6c<#Dlw>70QVq0ElxcxobE(DE+szoG$lDJzAVSwG|xoO0y=hx#%Z)dOd4v4 zMtnj}Omd7;20XlYzc7az9MeND_|RSWS>!RuRB#841}i2dRTWu5J*G_0M-FZuhxoBu zj%uVrE`)80nSlX}3QPc#8hxB;v3>V7VXWN&oJ5g1us<)aUxH2#8su6Etqcy0=|(|; z8dZVXhi+kUbd(i58otBg{7{$;rDTM*bW+hAoO`NDC)ny#hZ93>ZSEiI`}v@mql zewIx>-Sn>{vo9kEotC6$rYhiAaM8;#b{Gzq2SzvDe%?;B;8kuh4L7XTm0e2~ z?lo_6qE$m@%`uiGnJb~XG4eXmGtkomBXp#7;DKqRzpTxu^E~um~ENmi~Q4P z1ezB;#Sg8~=qWH8zYNh=jJ$oqcf>9kCk&3M?=#2abq|fkceB{_=ObysdEm$3+>PHh zb+_L&NTl7)x0PS%L?iimOL%u)Y^v1nDE0=Mg3;(pl&fl6O+z(2DNQr74+0cHYnT2XA5wpG z%>MN*_TQl8UnNX{iY(6G()urTnK6!QZcQqB)#m*(48bPI!sMBC76o|5S4^y*S?!Vt zBlpMMT2{|Vhs%Q)Nj@$)=&%k2+(;s^y=#n!W}qHCv0FcS@S8!|3qx61Ew?M59Ij-Jpz-TKHn>t)ZI zw||+}AqEEqB)olJZ_IGC+*}6k`qBD$YhQn?z8U7^c(+gNCtOl~5^k+RucM>eOGE$K z#eTj?@?&FDyJ|rJ+N0IE+3xNajG3=m`h33`McfRV*jUB<~Ojs%cojA+(D4xn5ui57E8u zTtyPjv{>w4Xj>=a&NKD37kj`@@q(0w@pU|5mtV5PH+qFBe7Yi$mCHz!z^;WpUhRw$ zD2fiZE@Gkea#nH+fK)S5gJe_-fdmpuj_~*O6dHSpgYOGj<5+PIw_{&+-d%3q_R7G? z5wghGRiJU1j?S^aY*rb$V7lEc?0A{c%EDOOx?`P(M8G|`fHE8>lmJEObSwo>?68GQ zN*BaJq^Mjz;D3LecypBv3czSX`UHvclXk*B+iDAK>SsRKR(C1F`y?iYo25FW&yMls zD6WXdUNJnXYj-i{9HN<{V1S-``md{`^XIG?+Z{%?lja*ArS&c-Tu^-53Af5v(ew`8 zZ_J(f&?XRRLgR_G<#IQOA@(`lPV-+9dHLX_^1zm?`|A2C{lD9=2lu@&oS4WDXb8ip zTBEhrVjr<1f*A`XG}IvP1QtT%^8Tv7hz&xz6BNoN9xu|@YuI6m7n`p^hGU*NgnaYN z;DlZafrP_}mV0DIR)SZSYVeWd%LN&*vy?&@;8O7V@`*@x1I7Im>I2Hh6#jG>&RL#o z?YlV?wL_iqXB^XHkoVFgdA4&JkQw4jB6ld+bc&Dv5Fo zbd_~tY%fX>EhMq6yuru6-3)L+r+WOFQ)<<5Dy3qv6veTknZqae>{FdgHd)<(wIOd| z4LM=t!iQf$)hIw(o17h7W|lJ(&=ky>D`-WM=+cAWB_$;wrci=e_nn)VIWy`e>N2Qb zNAWd;JmR6avWI1r67RmIT1O7S54C&V?jf%ty|OGZohD?{il@CbLPVek&}0N5(ZA}@ zS=?X4Y1fBjn}V==s_}VI{Z*kkP+lhypnM=mO*_oIN91jT)C|Vkjt? z{C(aKZI9?Wx_ujZ-ct97YTh*_Rs-%eENw7m_Mh=oA9wG6Sz~y6UULWqLEeL)dl`b( z2TB%raV>LMSypaKKo|b1)g%kWoM$#j)TM^J;iQ`1q*v`Qx;yK4H}e6dr@f#USYEn5 zNmxu6kBUXQ+=s9BI?(d~v)d`=-jHhD*6ZXEfxnRVdQIO98r(r=rIA>arj^ZYFctt( zrzGP`>P$**jW2h^eD+4gwP}fP){;qkgnc>T`ZV|r^cRVST3acFT%@5$Ga*l%{z_b* z&_c-RJ7F#SL_?Y^7ax;RUI&D$^tI-&Yte8*{ja7bOSaI0*wOlMPAu+Yb>%$m{o znM;z5XjW$+Bfi7Ey)duE zq~oS)MC0zePkdgIrg?ydh?vArsp2tM0Rro)Y{dg_seP`-8tj-d?4>MmxK0VP%P#p?41bUwzCvN;EOBP;X^wt zro8)aO(s2^9zveo12cRSbhA_?y7)&gL8lLFEAZy?d$Ur(vXjrp6qrW^&!vVcZw^0B zop)<+$`Wt)gXo09^S<-RON8fX7svMniW)RIs5!zA_7$B`SPQHYvIS7FL_SFV+PL4< z?V77z@5+w#Mma8u)0)r?zu|0YZ>rAB;mv&OZF}1end_rL0ISB^X?h^0mQ)HiPo}dK zYY@1O=N08ipt027Wev-KG=tL_zHUSF%fkze*br@u{krF`=8hDWw>N;oY-vp)U%`ZR zxX3cT`+A_J%6|-*(`g}%Z-YCqqAm(m)N-T(E#io*DRwZ)1=&>uDq*cG#eKp@%lX{o zrw%d5pN=BVINCuWkl76(fY?I>IeJOdw0QOY@Kr~LMD;@i(~D;B*o0D3(30Km1Hbrb zq+{!>*t07tZo@~^+Aw*QZL7U@M+pE=O1snE`y>}JtnhoT-m*E^xf1Xy1Ld0#z3-Cp zIAm;b29vo)27wuvDBs zQr@u!j-y(w1gbz!n(D*$G2`?gRAH#vVz?H{6VUf(wX4|I6v^ht{T3aPe*o&KvtfiUwi|u^g1h)A&>i&oWt#c#S5DkFtlh8d1+=y{f`lvl~Sp zaM846MbfStnkZds#>#anFHwr4Rw<`W1mK$g;&(cz91@I~zxTrDCpX>xq8U%|8fTSy zgt)Csp38ZbeBF_ro4Kw_s;ys}YH-E#brRosPHgIe)FPv`ITknof&P6@b<^cSV3hkd zi3=x`M;4EHBezDEg1=y)MYQx+m6_Gy6N=^P1O`b5*G}_)A+g^H4<3{k%Su6G(x6wQU%of^ku-L#Y}qnI*3- znx3pSURxWd&{^)Nd0vTJgg>v`*jynOIrpr{p3vSJa#cC|A#4Z(PUqIXoH=p?d&YaY z5L3IO_rfg=O`n&pMi#csA{;`Ac-%Pl%BR#Gp>nEvvqG8DVw^FVrhhOZ%6#5(8bZ*& z0MZwf1|G$WxWY+s(ROOv9^+}#4FfiBUL?v16zyjaVA5G>Ib(zcg}{t|luq4TJKJ{Y zBKciv1)NNjHbGqlvq|wE?G?(-gVLpjkFbH}_fHV|1CLfL35Zlo~!TNOnCQ`pvl3L%#K??PK@kS z+ua$itXLrdv4+>EGOW-pX_|)Y?W%)yP^E##aU-E(qtlLQdJbJ5ImKT$q`{-B9l#6+ z>kowX`x|Gsl`=@)ddom6bBSG;2{}=DC-0&hAav6gBgig--ku`Xj%CbP;!_C}9H!K7 z$TcVN6bl#c;Kj$utn)P!Bkj^4M(fLo=PxmNBEs_aVX1HN(hHo@(vC=EO2$a71x(NA z2_f#>Z_Mc*e$}1Z7`gZEz%SWdJUC!XN=CVmIaOc6B1=mq&Ve{{zOb{t_L+=ax=ss+CTiQW!9@Mt{}1=FT`W{nJ;Q;|CbO=a^`JYsqT zMd*iddye}!cqwdG>u`P=fmornaV4A@o5eEdo%vAYnZ9dpzJ^asWqZ2~y9NIGoiWv0 zc{I9+u`zgYE=~7G{E9OdyxCnVRloqQ>@8CA?t^qvz$nBV zuP~%#hr^}@7wK4153%!#v0TAEHoMRqNZ#5lfY$awX zd_ko!sF-R7;ROTVwFR<$P;#2c=C1-|3`S#U!&WI4?MBfXuazGo%v1|VEgs9EW?G{x zX6*0~_qXVVA*PT0!Mo|OzQRjvc47=mWBD|0B-p$UKP3hKYWgTCOl=wO_LUR5a~`by zSZ3%we8;iCjlJfv=`+Uo?gr8z>-=&B!Sw2}x8?U2Re|d6R>|-W;g7M+M!BG%>8G%d z6(nm3?nAsw?=cXxcD=0hN+8A1gw+0np|-hy_) zc2(x7vSkR_ive+KmJGq$q$Dm;jj%&_D0n?#aSw3+klvNE{Z?rWa8H`SO zhGnLqqU2o{j-Pg%o%zg+XJ`23(k_rgPbjThQ}PJfVsdYjq1U3TR^o{~V(eqa$_z8$ zvVCg344Et#zl@WEGzf;b6Fg-VwxzlVqDkJLY_AtynFw9z?@SNz!linzPXOs~(K6kn zI5tcHq0l88;8~;i9C8+|5ZhE?pAbh5N*v}JY<9x5y~9TxN&8Y5_l?6j_XSn~sXdB@^qW z_R!g}ddCiG&$S2|Panv($E9y=I~+s@Y9&1t&yHyMFjfivWMQ8VKmK$%aw~`_;3C@> z>uAdLlqs&1ZdgV0wwMBhM_eJ`xn7iVC*B9w;osc;HInn>OyZnu| z`dj~nzcyX?OD~4M_FMo`x`EpLzd27tfqqJV>%Rb`Oaq1c|DgE)_x=mN-Q&*z{8!E$ zpzq4>PyJgR1U9C>)Is?5#~;oeprycXpZt6K1qmfF4H+fCxg+!M${_rf9sk!d2){k* z9|!keICp@0`1B_BMtVToi(ehB{;hZCx1s&IvnJp?`PIAXkL35?hVbVT|Gy-^|Kkh( zi+AU5$?xpIH2p{C4v?V#d+s{}u&n>NI{qIo`B(1_$M62Mzo)JLcHz$#`nz}MZ+YrW zK-UH4|K#3b z0)#1hp8lvNd*`@gb8|?vy*LGhzOl&cG6FzC&;?X(A)JKNWQ>Xq)QB{g0%NBp~@g6L;*4pCeJS)NFnvi>m*6Rj&&%68&?>x4>8k; z_YN^BAc<2(2wL?>KQCZF71)PXXc3Dv5=KbYOt{*^fVOtIf|63oV-iN@aiJ7DNyD&I zVi!lf!G`H2GC+OYxigC z+?HhkQYul{f+huv?e+39)qK2hP*OTA&Y)CQdV|OH0f`3WB?ve>J!Dkd2Q{yvK&7)r z|7NG(^}fwo?)bEyp0()Z%082(ezzWM0Cb%Nu6Gxv-xaPXC)=rxF~?`;+MXv>iO7!dcDZqV?)`!N&kMqOB574SO_p4Sywl9why3=>Yj8InBBlEogBCyNtfX=G6* z?1<{F`z2D37v@b^LoL>|sGz0Ay{B+nxt;gujtbwc@?ty}mgj$57I&ZPG7BUj*4`% zl^xFFXiuNDH|WAn%Ti0spqOrPm~XJq`SGKZ4T{+}iD8{Q!^SNBm#?HQIdaBgN9q1A zxa1cCRp~RWl5+66QOU?ogr}C(dw`((3~!V zH}U2<{xHTlk;|YwHx25#jh94a`;T9n>1O3N@TUne)3-#iDmP#o{>vv!6;AV4up9&NCoq z7Pp4e?=t#Z!DTvD#C$k4&vh`yr^;Lxn5p?6Wq)w1h2zbw@~|HodU+3@#E4xCxq3FR z_0QLwbhWP$7ZjZ(cJqf731=={UQNaYB)gIgPNLL9oG+p%tp|iOEG%ZVtc{f0jT|4noW(B{ zgy~m&$$xCn^KT#s=kLX@{tiKYyYS~L{T+h*iU=~YHgPol1wokp21x#~Wey`N`+pH( z0zeQBWi#BwB4rY}eDS)Qnkh^sW5WS;t5Yd!y}X#dbeoZl5zgrpf1(`2f*JFjIV;DU z;3>(xN5vr{Rz*iWt8c8x7G*^;)XP?g^+hH}FUyB&_Pao?$%3AX^NHqkOOu~o=r$#i-&vs*##HEGVyH`Z`&N8L5rQrwLi zRNj#6o5kE**etl~u8<&fKY_*C-47P?5kiqtB;H{J#)xlGh=b^Y_>#Wxv4Y7qI}lYO z?z$>~z`f(zn#2TC)zW0^cdm{a;*sYR29cMffFOQL?vLseLUQ()y_IIGcY<+v*3Q*) zaWX6G2nt3a3;te`=tpaw+^17+>0sepd!#-+2M(=N@eZ2~;8NDl<*}ikRd(Q5c?n7*K>)P27 zZKsts@_aJt&P%XrbpD>%zxc$S%Me9MBr9VHi#MQ2BX|Hu6fZ=ScZpBrxPq=^dox^( zcAM8QR8(ac9u{SzG;2r^j=Sj3&o$O0lxYDU)YoxfwBMWk-tjV6RYjeIcugp;W^6Dr z&99W1>k8Xxw;JILHkFSC7f!cgG2gT}jg~X{y76*LY|0_Adp(WsD5@gmCUX4E{7cB> z1W@Yr_N>i46(w!yqEe{^iScCAM3{o^e!G+Pd6kp><*ql5L((yk1uN*xqwuwPy7*K; z^B9p!1cCcqJNCCJvij#ms)mns3>((-t zarn88zbaXShnBBFc7K_fjWT1Cn5Cescklzefo$(#%sM*v<9&aO6d`7hvJ&pLixgLu~F7f2mwXFmZS$c=8!$P8=HCpf-|GZtk$ChcV zELMDRtO@!11tNo=5`~5a&9P0V6;rQVc_gO!7bnzJFjaROZ5{ktzEW8l>zIE}KQ^C^bsA-qKv%Mt zI(BzZ@5^vO{hBh`aJ)Eep0-z`vyQG|HhLZPL_)>QGT6Z}B40(=JE@%VMpql!m~Ntk z_frY3#2v@Ujj3DF?%t*a*Sn3pU2Sw6Zc>2+FJbwGVSuTEam1nhf^{5T2U;QRqy1cn7m)^FVGCY&stJdke6_#z~wY%?bqXU1LDmQ zijN9+aaZP4?hIYo?QvM=PBKk@GZrxTX*+cEG;|FgO-`LN5E~@QltKL@oRK%c#@^rI4iCE&HG4^BBfpEg1w0-Y*gG9kp#k4nZH(>UI*R z6Qg#n$EHN8Qz{TttP{Y{^viGi;-yb8M2&_;*|_ZPGCLx`463YTQ;IlW&-I?@&$Ez_ z^yNP&1_*!XV|oGex>m0I7u4|^5A&x=`gaEIpV2~0%s`d8zgWBJCz`7^%N!^^Lzefrq*a}QT>QMTE+BQE;m0Ii=k1?alATv z(C(Z>AWK-^5$Ho;T@mN={+my6?~pJ`N{tqM0=bl^L`vceU3D}2rsm}$m6bGBHHRO< zr5nd#QB$+&w+v*Y!A*o9{FUcJUMB~SuV3Z&NT#$}avoe9eEf<$*ows$|1hh* z+u@=VDTXNQJ z4X58dg|;r;FT2+&M;t}2fU5s~l`(AwQX(iu`9)(_@U|Adp#x2XbEV47b)kuM<7FgD zMBxteIjF0?x6{HgJ6X4CmT$b+UZoBZqs7t=2wDnlrGg1nxTSLOyJ$L%d;7`wm@opp zW)k}?(i`sEQ1uj+A^}PJ!!Mq;4OZaGK0%%gpNkfy_lN_ZRhGZo(Yih@M&7g;pyk|Q z=ScZ(T`6Z5iFjPqSLV>ZyQ`8@c`*)WKa0d0H(-W~yD<>JJ?0+;bxeM|!E#(mzzLDT zCWVkQ>6esZTYAs6^5)V#*cnQa-TGRCT-H^9-bBe@k8i{5I>ZoB=1sg)osd%IYP=oG z!DMlXw))~o<)H>1#FmyDC3$E?X0tLk+=pixaRqy|e4jSi#xdVHH+hTp#rx(bGrP-u z>f4te^wEfg<@Sera}8PLtNY`(^{F=IsPTdYcLzw6j|3H{gRDB)J(jmP?E3KE(%DB9 zue;UNK1g*v%J^!CaPN3}S!WdY=Qq=KA=wB?3{RK0OcZveqi@zIc<|qwT&smd565NT zRFTbHB+CRXRp@^USeFDYEJ3_kY0tvFbLi0zi}jcGlFzi+l6I}#bKZO`1DSunQ? zs~>8a{Z|ZDhbq|XwnLGYt9Q?*>?DEt2>bkbM$`mMTi9h~hIA)av(YV){=)sD?~_+B ziHuGjV+6ftu))S^7<;=54wcUQOxi1# z7fGnxO9Y`^WOk$=E^`i7e)9lw);&_!%a3WGIdkDQ=+F*ZUSkOvy1vAEd7nCtK33<; zZk~y*as+I~8U~ui?BfN}sklP;7bkoF<%t?*C6W`~G6%jpBW z9;xVtg-kKr8ohfK;qZ^br$;h7$XnFPV)b>@cA0Pb^YTsFYTxDhiFXIa|P<(w^9W#Ncm+vEAD z8AEVED2=cLn5-f*sAIWn@+%6OW3FNDCbh01wYa$vj_qbnJx^&?=F7IL6lKhqSG_xU;AHMT=w z%iEIJVQrMUkrq!A1Z%JIZDf9Ppg@w)zRpVj8Hw(eVq-}Vx_(d=BJ`tNKJGKml+cT7^Jt%+>6 zR|(laX=bf@yN{1@l5U;OV&K2@yJ5<&rMU{i^e0}LYqGQn8di%QIDa`esZGq<*A%hQ z2`sl@v5O=nvda`w;U+x~DC8$3V;A4G^E`_-P1urB>BTXX53rC3{Pc)Ls}#s`5P7b; z1}7Mz{ThL$gEnlOjV@#xT%Lv;aIM@K)}dQYCCD%3pg~a~8Ox|TVo0PajRHGe!B^kU zG>RgPNhCQap;~x_t57JsoqMiG0AaoAsB8px_YSj)>5M`;D^NxQS20I{K{n9XRXGhF zYnqPdY>-msQ_?jl_mPCEqTp>@rsbtTuSnmlb5M>$Fd=rJcvbWBd}!6irn-5#onn}J%OX`3 zjTR6vKzs)WmluHsr_kdWu1a{Y`qhW<=R09-GG8JkSxLS+NVsXHn=U2Y@-32j8;{h2 z5=39=;wK}{tiI1l*nWfvnsiV*5#Y1nS!$nobtf;^I_GN7O?oO_HXJ>3!9eZ?_NB=T z;-RQ6Z0cU`QQh~?j%FhzWsA`&%#td@>^^vu5M}>#LGHfXq9`pYy86y5x>TE;Pcgl3 z=OMPFZk}G-hGuzIMEmLcGnbLq5Zf38W&prE?aruEB9{$ zjF4AgsDPHc0vvoMmi1-&R;Ga`oFu~e$Pkx3nlT_l%`*0hySJR`G0b+{nZ8ccURj# zwn_g#wm|3nYYNl<3`SYl{t1j~+N=npc>{s{{a_oN4g@3tV4K89D7BG2paKa;mVz^u z^^wzs_qVv?qy0CobI_r#CGu@mUe04FHth~6%)^iHv{ZM|=pT_3W~(O($t5K|*0#u~ zXnpU<%8Nh>gDPQJAze$1Rq3JV4MRb^cplvSmL;ta_mNR0J>BL9UXm8tM}=IKvhcW? zQQh9j+oXPmfytD%<_?=_hDUG#WRyI>gR_FM%O)TH!|=Hu=Rsa_fCr4G1!r> zHdA&HjyhF#hIXv5jb-jeJ~!I0BW#A}b@nH{hbe+77t0`|lbRM}XbwgpQAuhs)6Td0+umo&<@F92 zDWm%*1X{Zv$2S}PV}2^m5tLYlWl%@Viiz+F=CZ-01@8ug@L}WI5z3+F3?G8KjiO2mC6rf$9%ojYT~@6I$-)PIM% z?Be#wvBy~Xku}c^M!19%a%wD3I7>TUtTnC5A$FbosgLu`N6z<{|mhX#|H& z2a)yomFP!}u;FNq{039UF>u?{gAnPa)i}LowtOm_QBU^Fnp+MPD))Sq<2_08{}(NeKs( znI$6nlNj!eHYps_dT}a|9CX&f8wlceu|qLb;$GylTjB|tu)<#t^l4(uTd^A`z&7${ zbCd(RXXxNf1_KF|CBaeSg(nuAUphB9m)sjh8|O}9wfp$CvAbkc9&^0yX?f?9!DaH4 ztKkv7*ooLsR;IbGCRzEPX8hH`HJS4?hzKd<$1F7ud6VziTlqk@^gsgUKYZnG zEP*PsP(5Z#pAijO{xNEmTpFCwGoetAX-6IDeQA@Sgk5>-^8TsC6EUTn%S?XhLK(A5bOoeM(x z?1@-%sXsRJh(<_>0Hy9$GMTdJ`BNxCUQ~miYJY%?peIU8zUxY^iry(*)eeM6q)&sT ztpZAWk!Xb=j`wklugJRvzgI2G{VSKp;bKQ$QRcJP?o18)wr^e;U*=_h=G)x5z07mp zO;K(6$=k$a7sIg-1>#zHpL6)=;qW7}aT9rFmC0*42(b-mTv_)RNRSP?Yd$W@I&hN? zd5VuW2JGzO7-Ek06=KNi)-+y0Hlogr;{4`Y2+cR9$1i3fvI70RGFJ}Rf{FwQQbeB} zI!M?>R9AxdZ}&DTkWfC_5NA>%PMY*MjQc_Lu}E`j-(FI(W+lSJYm`*2vgTEAeO^i~ zPk(Nsa8=X=VO2AQHz>3!CGl?a{4@ei_HpijiVrG5eMt2k63rg}NrLGdmTZy=8?=o-GlS_c z7AsBnSA**N%R?~G*TPgp%)KoSog@87Qtb;%bTQW_=xixXZW zio`D$voxL18ae5SRG3&`3}ij$k4!6|eCjQo*WreNgp|l1;jcAE7$tD1h&erK!3)|7 zZz*DtRYP-d>sKMPqb&~5nZa#N&tI~}Vy)~E`((fa6^sfsZb(wQ0+Lx+npW>_w+<@O zl!ws4ajbd8HLy*kt!_(KbM=Niy}dv?dD>!Y&R0YcDaf=AuvM{u%|d=_9pp#JMiewfp|td~ zy8tiR=_Druw$7ux_Z-14f-!?H2)~Ovb|~PMu#T#A4-Ij{>njJ=TEDxJm6`G`pUlVn zY%Qn+zPgY`y%M99+!^eZ>M#;(=3dGba(CU)ttGGme%u(Dd0u?>)mJ!8T#AD#Wrzk~ z!5V-CYXBC^+MuoYTcBiB+K)!L`<7J^WwIWgZiHiyN@a*y;A6AE$7X?#eKlx%JwwdL z@I`-@18b51ItDDPF|e>Zz`||=3)@Fh5DJmvbhtoR<1!9wY6TT1Z*BBeMDWtUzxj11 z&e)EWo&C!lnbe(+01B6`-C9!p>h|GJo=a{}t@~J*0~M{{%Z38UERy2;kDc zKlk6_&cB9o{UeT4m(w>lGWZ>-N?0)x{?;J`@NP<2{c@oF?&<^(?!OQD0zRc@Vk88h z;=h34e|2vD@eCjX-AUik&DMzU_wW4?(FNqn15r!jMrJ0aK;AqDC*WB%b99h5vKO+k zvbC}P)eHn^=^x&6ts#Np8(GDlRe5QDi#VRhQ)w2y&C?@h}g&b?kxNHF9KX73MTH z3r)%q?!|G%;_4W8SSxxy9^;H>yPRHWTjzJ3(=j=zn{!*g_Fk{!^zdmIEtID~g9#MO z`QyLFIB^My#YVd=8!OfMa&78^JcItIwyP;AgoHG9n@nbtDEAst?;?al4MIBRR`y|D~#kDKGQHjj?im&XFB zBx7S^Yk zHlyBZ8HF4lA74FmsLo=3?yHK${zT5gd5TG9&hF2C0-M>dDs|?wgl?@$d7_c{yzW3v zR&?i`p?A33r>AR$GB{MvPfss*{rsXLBE0w8abUYC%qARO7u$m@r_)7pDNIIv5m;OH zE1-}F0YO2c!or^Cosf+{BiUU!-fJ|6^XqG)QCmsi)`Eh9o12>yU|?Vqmpj8rQb}~$ z>gwvs$}`PQNBjGxLB=84EzTw30*Z<#_{e?T*1f&G@jr)K&f3ERk7mEU4Jzln5Ur59b=PT%; zlf)~OOJaxZC~Ga|tp{Vt(11B1KZ39Pq#oB8OQim0%Hh+eA43V$q55+~ta0Qr*sSL9 zwZPQBo^N!|_J01J&SVtEfRAgs5J!>8W|d0w2DCq#pyRClv0SH363dS)%KbUSerE`e z$JMqg0O(L@x78Op52VEVItglReJR&&LGhY;sp`k~kJFACerUQ~^XRzW#WDYMvAw;0 zcXu~1AkGB)NVkwyAc(^WZv2Vt1M(f(#h&n71l-%U2po1ie6#%ZtI9XU{go!>N8H@qnG&UKf!3!kSo#n1eVO%|4c4BL zrii#4w#N%q%6#YFK_{5NQHU2+KO*3;Szhf=)&@W(((BS`@-fkyt?o2h){0M~70PBv z4k&%%7JH1s<5o15mjEmEmCfLS&e~cT=X;Fs>_n=rT|f#74z97E89r7>V=*I6BgT}Y zB0A)MK9ECOfJma%MAr%Q;D6XBF=wEUpc)OKw`VCYmCxylArgWz+;G^!UJ2oFm#~ zWP#B>#3^GLCY42e3UA~dN?)z1q6wxZ4u1aEUG4xu&K;ANEutUIa7hZEDvY$K1$IS2 zjeAAXFGKIJnKtxgyo&yiMRysW=1Mip!7Tib)<1v#9P2HotPa}der@mI5a&}#K@&Qh zME`hq_rvJkN=i>6zo_W({(i&A#^wxIxUT{fn~RH! zfwQ@>)3D|)MQcDtqgf9ZMn^%hP-mgG-tJW*Athxok?s4jPttWOlHE`#BO!sT0m2uH z**Mu|U1jBjf{H4(Yj-qlxz@~JX1I(SCR`8L?0uuYFyA)wqWKOda{QM%m(**FBVRnG zFVvgtjkL7Ve_d(!bOS{2EW%vhRDsk^lto}*mFXmLFk}VVT=&!crN`}QnR6xE?nnyB z>xQyA=HtzYW}AE6lE5!n9;PX%r?(OIj(UNz&Sw3k?RG8BMD6|&5Tf_H+>{g)m^`kP zMDPkI?f1KBCO$pieL>aAwMwEB*YRyt(qdvNf!FSMeLe$rb({~M&;3r4P3zCTQJ2`1 zl)&>b!|lU2Xm5^h6^MSi^ApiUNKg?B3>}7 zHyn(0*c+3m`KDG;OAy0G)?uQJ*j>gw{U7t2!NhKsCh=_=M zo{w~`Zg2z+Jb?oT{3s|W&{?3dht`;kZzAh*<9l5xAfq5V73PUWqjUjcIEkA95X4k^ zFHe`_-3|6!2xMVa&PJ6a&Kwq=DeP}bQ-EVx4Y@y8hU17wK%lFo<@s~77m%wkS^4?- zj%RBbAk>E$E^A+EbUaR2lURY3Qcyr1S*bCRV`p#hdc64(Z&!ZKpg?0KOiT`30i8mZ8;7T>bv;&d|tc1H5Up`-fhdcD&i)ObM_i2_fkC*}N?lLRcdjTf;nB z_V!Gn-*;}J?~LHnIUNdh+T5i-9Li<#Z~}t!aQ2%NR7xKw$^#88Ka`BnppQ#enuJBZQ^o=Eh0PCU6fL z)ZiauJ#0^dq!|qy2Tr`m+iQ%sh;cneLTlAVQl@h`oigU0oS!)dz|o%QhqAQls)QJB zx3u!^d_e9Wn)Wi6EA_gw1^lmq2)_9ZQ&)3_dTewBN~Zk=npS9kECth60jE`5S{j$( z)90nmt{-3L#u3^izIP1_3{Y6~17~msTUEr;vXnvqKn;>*dJ@|^J8m8x;YpOq>oVCu zkhM&za-npJ$8mNxypT9pZ56@|hzhA3@xL(z;VF(uy(Z)M&_uEt2+pJ=v(f}f% zpnxOj@6y`D(M1qa%wFl~N&G=y#r1;M~h* z@-zVe7&s)wT20lq^S+>vUscN<0O?~88I12ffZ0%4IRT;*6&}9T690(&3qvM&dij^w z>c74`TR9`MDO?W@4_{tfR4>}(A|N7SuqOXPf@^Kd1q(}n#!m$Rf{lHCRnDvifPDcV z#wlk8p!;{!sw@bhg@DEs*p1h|8Be!s8>NHk_Y4aUPgy8d$lG=#=l8s`y?ibfh_bM(x+2aw5t-lkUhYPjMc!m;Iu{EGYq zeIQ-k;0x;6<=*(&WFBO#9MYmBlBUH{?EwIAEu9abt3idt#{=@Eo(Z(bo1;KB%jL58 zMDguTUx6KdGG9S3*4tajqWoQ~R7W9YZ9(x|Hd z=wA*T(_tj}Hlp0&u#2BR881q(k{?Fd*I5v@wzj6Hrt*&!N2~zp&cL5f`?1Aht`r&p z;bjI))GnF-lM*|y=fp#^$ya0eR4a63Hp$l@;jyx+4HXTI^s5(L@7#GiBUlUGv0N!~EMO|o9J~$Vf7(FQ>cR|8C&q52 zdn{`8dG&7gdkqX<-?wF1N*fJ7&9k-{034hW&1tR@Sg2?rO&!J~5~qFu*ME=Rwql zprN71=2f@zK7W2ggM^AIlv$kuynD>~k4}HeO3>i8$Z$N9DptWYOutOPgo=hehtfK{ z0N1PJx+0d);yF4xvVaQbytS!WKN_a2My*+Na#_?6Sh5^Xt~b=Yd>Vvmy!ax99~u!6 zk6-Ne!xz$Yy1_=b-f9~bYknzA6cd0tLMYe`Fu)^%VOh}od}{2T?_a=OgTK*!Oq?04 zGU$J~uJB2*XatKZ0Qc`?d+1>L(=uiKzEegOrjD;wRhXY&j7Jl(vZ95Ei0HQN+x68I zfG2HjZC;+92n2kkbCsmtcN@VMJHstaO$l_`T$Gd&@cI&l#>R=XnySjHAfTWsDC@C+ zMdx39^A#Tyt=xY;X|pka^ebDrqJ7fsRS56bei=v zq@>%K9;cJ@pc-)S*eo$g5PXlvH3U9SKbsu(y1KfQ`4=Sz#>U9K3x0_?H*5ri`Cx*w zfZSZ-JX}1yHiLcyO74}&!b&(|5)$opS#3QsK-;Z!?iryqKmunyv0oDnT@*NdfK8AM zfIC4UA;8+5L6{R27ast&@~_`cmg+{MnW#ltA$qEb-5(hDXx-<;1j+V*I za(@Bn-jjadhHx9DFVBy1=^P69%Om6C7_%76fXKaG^EgvTX3*=}156d_AZj|g#H0^R z$FHgzgbhw7OROfWm9O6Mx{-cHS5n;Rq~PCS zfYP_$5x*2Ln9mgJ-bQo-7LLeGr_pNz3}jOoaInKc)U)`!s8mZSb`bgQe#kDeF*8pi zO*Gad1MuSBsSlWLYXE0kIS-a@^+!wXw0k`=F)_8jzIc3Oa)_Yx<3Rw?IQCXs)*I;f z%OCca9K>{KYVy2D=jB?`}60)S{t`9`$IoM0+k9jr@bK{ z?}OoSMB$(3OO%SNmg|9cygEMzlvU0N`cC~)t=Z+xvJFn~t{c~_KfQ1V6oZh)W!!tY zLf&-wLTRkIh?AmR!(arwueu#C`;&RUet-gay`yRDCT8$>Tr>0YYA;URNcJStcw(le z6p8&_PfiXF-D!sAJl7>H%laujf8 zrf?FrK?dTCqICh=-TX=}4KV(io{@kvvPbXptXsw`>^A1;(n0|-;jT}G`)|sJ2;GL z!8CVralvpyYNyAcA`kK+Yyj@Ee5`26P{~5h^$Y*-G&voq)_g#pk*vLWK;9Wj;C4MH z6sR(vr3&UDlhhD>r2!@Su(+gBuBGv?UTqYv$B69I&sJ%F-$pjJdGak-tP z`<`jR>{V6g{1N#~%QtZJR9qprV>*&;t*y&Fdy;t|L8`TMWjwEbB zP;0aTnuDyy>`}m=vN7w9ifYXE5tNpO4E`it@76%t!0K|ka(-^RHNhj7^vu90Cnpyx z4ge^!L3a<2IGKpEu2h!rSm{ihg0`u#8iyF6X|Jd;Rs2(Uf0|GJ>&mQhkDBHZ( z{Cv_IwE+BU!Bu1YUo4Wi_iF44y2sbW8WWsg1VJ5yXK`M>u#gZ2_wMMCbZ>QWsYIGD z*jr`@bNC*Zd<6tE8*v05u?@lH2h|`UYkF%@U@1Jk^ z*{$jo@|7D2=Ny@wcf>9?4|=O7dS=ApuM-k{Ss%@+1}c=reI@&oC_N<}NoAFa{A6Vt zd32iY{poB=t$pMlS z_&e1nLS7vL*nDvx(C_Z=2P5HOsPzD&7yu`LJZS`~Ju4FqxQ9eWk|hF~;B(Tw)S{>K8+LETsfRq3$=Ag zGI;z8(Ekno-`|3Ih5P>EeNUYM!fXtw1CU1fru9!;S{>fn_&P6V3R+q`o_FWVPe(Z_ z;GHnAu)Msy?`2Z2+VLtnUYdi0`>zhBeY9;B7Z>TkHNC-;{iCDDNuqh|xy#H|1S&JQ zUARn>S!~uk0cuN;&whKr4;=R9bd?%0G>Np<39vpRA|le$akb)-lPMC$h_wNNcyN4N zx85?PmB0;v!V#!2QH1PzmU}Ulv60 z)!ESzb%PGlyeki26Oob%$7g84Se2<)5fc&;^6_Q%>V8wDbyFNH5LW|iFnxV}F6ZO@ zot<|W81sPMK0iN4z~kZ=H=oEBSiqWYYH7hawLX9%9f|@fz_#NN(MW~+ zE=X1}*`ex=?n;`5gRg&6qc7pK+YErJk0+g~Gaki;DOI!&SfPg(sa(Po|EFinFX%I1;?>yWq+D>pi&Nj94d%n1YW z*v2B`N>3ssJ$4)E72`944noVTCeS9kj&6UdU z(=L@$R;Jm2GQ)rZ)+;KwaJ?te{E2k3sSCt)=&2YM&1!9Ns85uREWNiASgt>pZS3~sSlw(77Z83e+WE3 zT>C%R0HhtAcC#UE6F{+sqtj;cxSSC*YmoN z2)O%RqdN6&0Pq6zEk=nqU|X0?d>bb%k; zgF?V@IPN1s-kz-^ejNi)sms~gs%j%(XWIY_tDB=9@FZK>G)RD<+R*iRepe{`eD~7; z5e{Azpf>e2Hvlsn0iUP%BX(aEz)QOR+|-Z)pwE1s7$PU1+r@UNMoqo-s`)5hV?Y@?k1Q-^{=LjlZ0+%_|8?5o>`pq16N1B{ZQq!H!)_A+7e@!?b zivjb~b=~*^+v1P~fcYTcFpW1NrQQcq1q+kFNbrP(qDj4=^6j^Zc6WU3{iQl;7|U=0!1_b5$o&P* zc^PT}Q{g+hUF8wrhzuj5?qaHp2QYnFR?ipqHCF?G*1$!?VWR;o5vQZMUks8Vf zq-bDllg&;RvfNIG@r|c=&iZ!WdP0r z2XZqsos2Gk>p@ySa;K+Gud~Bo3IU*;UfImes>?d~ED9(JJWcp_lPy_CU0m)a9l#I@ zMYC!9e|)_KRF?a;H7=dfNJ@7|BPHFSG}0}NQVJ+74bt6U0MaQ4(kVz7w6vtsNQ(dU zviH6B{O|a_Z;W%sVeGScc-~*EHP@VTt@mhLiPo>XEyCWg#s=gb>|rLIH|llc=fZX) zxu*9}*k0UPA!zO09C~k=F0c1UA5#k2(=BH)C}0;4A8k!| z{hX9(t@S;17j!({{(gbb#@>5w04=qqI+-c#at8Pjzn-q~GH1Jb>0QiQ#r)zoN zO7G)v)+XF4rdu=r@H8a?(lnpydOyGm9)ZbF zlLww;NOL>ZgEtIXh4P)OqAn_QkQiU9QjKfY+I|vr_^gXB4}#&|z`^P#Vw%`5NmJMA zIN=IWBPujs@pj^+#eyZ3L?*&J^!F4Z2!iAnKpTNT5kIDsCw00)jK}*8_%^Cb9@O5E zksWWk>|=h{^6Ny(p|9qs@0aSk07+lLT|NGso8aagCMtC#Zl@-rEURrgoeZ)z6ZSwB z)1RO(nT906(eZMRrnx*)fU&QZS`xszF_6R>9wg0svcuDMktph68*#&IBBe@3q4CCp)oZPXP%$UoReC|0 zQqcD7_#tpVmN(%X27QZP%~H-^xHZAa~Hw*Fw2GBM^yN9z5_?o z5D-2<1qe&RXTED_X^m1#Oam^2_)h5&c z!x9aN=u@?Py4i5HD0A;v7`3Q7=o@*XI`xiv*aVmQMG?BN69PZO-jv*HV=D_gtX@jn`f<++x+H{RY2eQ`lp$q|m8WGDw)i+IS2^(mt{Zm>*$-*wv zbp+`^tarKex1K%%LIl!{H}FcKIApR45#rgR4`)SuRD&6yupT@zdvm9vo`Q&+;N)JW zXU7zgQyYj`^65!WuT4?kzw`7EQ=8+9K1h=xwG`v;KqLeEM&Sy0TowfD?)Mkmc1ca| zaS(QB{*6XtpDXF{?UhPWHuKwJOVnbwj$pLC#SkK&S?RKlHJqgIUtMzf%+zw>n%=$l zB{-NXLSDqn2y>^LO5Snb`7FKVVpe zGtbAy&eZuaS)|>&`SBJ@VxMkg5x8FJ<`{~}gh_bNfFuK{B(9vfI4|BY2J<*w!0ukM z{3>d{o|dz{6e@mNI-6D@d~VC9ugFKKCh>Ze&$uKoj&pg;B?ZGT$R@tS4Fg##ab;;p z<^7KWOF$wD9@)n=orYQQ(x*IoYVQ}Oi8#}iTX$){rd*Tp4kpGHGOD%;&EQND7&B|6 zxWP)i5YN}i**Eu&qQ)_%)5AO>-A3c9+$Ttatf``Ex>{YB3v-~O$T#DLws#cL1Dg7= z2C^z9#XgTR;Q$T>WEx1K$wU33SX42=TB(@G*OLaA1vi1>n8nFSJ_#LU&ZueKTQZ_L z9B5gK>ydfy+KJkl!g*i2)0_cQ_v18UBAO50QcG%k5PiIe@(DpIn+p!6@3l=PQ+52bM0|hTb>@hP4ETkjF8=> z8Qu|c!^62Iy%r9ShbynfHL$j4o2*4ffE>15zj4^RN)9?Id*x-J1wSokH&5{dSgwOlaD8sZwjf^<&&`CEmlI4vzL1G3BVE#YB}aYlS%(@JI==~7Gv)Vp=2)3!r> zD(}m5M{O9o84Fwi6@1|FiOS2Pt#||08Mq)TD}dKYdCanl!}U6^MXvJR##|{>h%QTH zMR&7=z)Og^{}okf54*sm$sMc&&nXfIaqxB7WCOwYg4O5B?2Hsdn=my;OHAMe$Q@6? ztz5WxI-4%%*f$s>UZ$~u+ve4vN1XFdExcQ1Eo_gh2qcH>-hP#1u0TRdRZbcjoW$-a z4TdZLOg!eBL%?bqUsM0v%J#2|1o1x#m;^@A^PA0<2+?*oM$_vKZ-Em;W#7F^B>=eaO#&CR9OTWi~?%<Nvv*s}139tDZvC8XP%OZ-+pRkJ1<(Ra z1ZJT1LIQcv521j8Li|aYp#xIwThr!-$3f;PMGPi|kLD34wPBU+rudVgL}nZe2xo~Y z^D8F+R>%J!gUEr%1qeGGct30hn?R_VYx3x$o^SSwV+$Mml+Gt7#jM%#IWYafDUUPf zV{e0t8)9i9ZdRukFG^v1dS!rg{`BNNkT40P0z+2|fnw+j$#6*Wc`(4#!9qvi`-Dnm zN!hi#=jZ3&n@j)xIW-Ui&M@<8D+SO@-oAJL5yizwKp=ASZobdqx)xaCpbF6-(Q)83 za{zF%G8$m%*S+JjHv^#=hzEsX3D<={XZ3hKYsIN;>{l9j{=h|!qxq9Y?J5nO9q*XG zRwbQbhUH;NwqU8Y>Ph@jB+~1O$za=dZAt?XVUU8%&x+JD+yPrcF(p7%$z%FnH#IB^ zq}E%X3cSDVfzb`Vb)@0wlLVJP6+xq0WQM`^w^A|+L{tG3&NVngG|0=jlxDbazW_6> zJI2*|=4apn@)4zk_bxDMDgn5h&(?ChkdY_2Qp%Bd-|3cUXOvplBdmnqo8L`oxYAr-!ls!IrHfUV z?LUW!s1|H51qZJL_B|j@sU)$aH1QYWe%*rKwj0h?$rjlIeH)qU9PMkdmRv&~qziqB z3_nP37UD9!cn*nAF@j(b&K*Rz7bNV7Kjrf^TXN}|OY};|5&NA3ZFd1-Khf{mi%)Uw zmTHDb#qZpjo>#cgQgB75r2G7|`uX(@wG;W!HkVWzi^9bZZ z5K8tBQ3t@wji|8`bq-%bu!zx7D<+3dS?+7InaO=EH}(S1U-|I767+AUiCYotP+7vm zzO?#1^Lr<=#|2d)dSsi&W4!g$UqTIm?GrPj?c{t`?cKLb8tLLBuOq6ybCb+`TXCfV z?{Z#;&rCI0_g~k;X{P11kcPknx$Zj73plo5Kl1hSW0a4$mIoBX%hL;)0&hNp24}+p z*-%|PYz56m-_x45w!fUyC*VP1x|f}PLbPZO)+j0{+y4N8@YsfwM}gkl)Cu1FTI<dY;8E9;wi9m>OuUh8U;nZKY`I&5*!*&PS$~hiC*e`p{BijF#)U`coZQ5 z*%>y}0i6H}mdS^wLO2m|i!SMi-Z_3zDIkAPtU{}i`biwN=n99gs zmo!3lks0uVd_IC6xH#G4%Y)V3y!iYa10PlxB2_#8gO79>T!uAuj^7*s)TQy5>xXJd z-&-kHM!JwU57T99LFx!4NP>liKcrux{Q&mIU=+kpJ%02!nmg0LW`Nkusaq_qIh@Y7 z4BIaW1oyoE`Q6Zir&eH}i5EQmC;~he^%h<(cIfSs)vQOr_;?|Rlfkriu)lP!9wXrL zE44A%1NH(STP(F`4e%+zJLrRDgHqU8xhnOpHc2JcN(tBy&jIlEoA2iUB!6o_5>-?P zD+vY4N;^0kt$L!gMSw*VB5q4|d48!-_RB{S z`Rxy|60@j_JUuLaXhwVa1`YEzQqY(31O|mf+2Giz6U72e2{^rFY{m^`AL(^nA$@^~ z2Vx%&oDeJ`regi_X%KB)b!u!rET!~<$opdfic|2;JxS$+&$I+-k4xuG%t!jK;7LN8 zd;}rw%WE|_#4T}>XZGMng*6_#8*27=k|7onJq_4(KL2@{cl(xks|18Q$kuirli2|s z0Tp(>Kga_ja>dTLW49KY8E2W<2c!9SJ_(HgX`tW(w`LNzv9P(hdFP)%BoxSEuW()< z{>{!i;}xdosyq6-s>@Ke0S|~s({PQ!L>>iYUy(*0uu>c6RFrNcQLd4Ye3sXB@px_m zM`Z-wPWYewwGoX&cFlZgh~oFljhK0=IR%&4NEWXFotPYlLt=>miXbS;cfq9{O~NjF z2*Fwdibkl@-u&|pW)9BNbtPbujgbQin1)Tfvcqv!x~4^4S|K?!cPxgH0b? zQfH^9Acwy7|8oX>C>XEnu$35NWeJ~DL9~U8QcB%P3{XbG|KcQ5$f@1&bu=v8pQ?avz+GzOa1&cfbxQw^6=!(F;FF! z=b-T0Lezst!YM^qR!B>D_U8y!IT)&r>vb@Gq?gszE+cW_z$oFC6a?uEFeClZW- zPXqr*;Rho8gL8Huo$uvGnMDL_|0lGrfx-t7y3}>C6AaKs@L#7^j10v3cf)P72dJ%w zhdn~~5s@vRfMqkNq8nR-Pqi~$zXf45LKRjAJ2dSCG89~xB6m&iI4D>k+_wVQgoMv{ zw(>Eh6c!S)3WENHC(AA(0r{bv#PZ^!3?ct4_&&3ut08v3Tzs30vgT@!1fBT zu?1C&5dI){X^XPu-UOz1_MaFCML8|h&XD!r!Eyt8-Riwph?Cq$J?Lfn^Dn^)VFm5OOfPN{rua z!{3Jzs|3!mceyK~EMrtGrY7OR{Wnk*<@sldJ>I;(CqVo89k^n)L^%Gpi~)%b-ca#x zAuI*_faj)%541dFMa{o16BRiw#-{)W-`S5Xl~Be0{N9|V7?yv>Y@F6;5&|RC;^oW` zWgHI8eL*$gdBZncO)li9%ZPzM>@_5h;Ap`<`@VLu0|E^0QKI$NvVW9>{R3cSVY6FZ z7lV&3kWkR6#XQ;QcCEAXHzoYeJmCtsgo2;}UhPM@(=?Q|aFz%>y9dwYZ~)lO);p!u z+gx6p3V$*I2|$g{IIP!!1@h`sL$Tk%Ig0rfzjgl-JlnrT4w z#9xsw$u0i3Nb=RuK@ZZb+$ast7CyJ*t`yjl-iwAE`TSL6fiBBB#&yw!Vs1G3d{o|MMzjS0YA z4{qj2^iJ0LV`KVI0OSGBCUIUsTUpIGde;jA7brP$ z=@lrjxjF_&Mp4(sZnK9-TmUZ5O-Ze$TN${96-+7l5n-A#ow>W&1}_Xm>Z=fIqlfE- zE{)}`z3m|dk1PT8h zm+v(e{r8>@2T2cG0d_<3Tl1c*vV>}bX%ryO&BbWJ2&EWVNOYp`1;{!im%Cl~_BiVJ zlGpO!B-Ge2XHUV?VkiXgDELDXWuBvdI2aZO{cBbIGn=Iq^n}ry^&gq(GbzVgfDLb) z2p9F4;7@zVmK82ZXIdP-T&$?55A8bxw6G2f;2NTK08(_-;de4_bQ=%LN2GQH{ePGm z1A^TA8y!g9U}0}?@#%$gr-o53J+)3)5xFY!8#4gFM=Z2WL1|mk1RM`P6#{xD67qF{ zIGL>cYx*q&ZYzFed}gnkI8;^U9DGs^G@Y;ZBEB0+Sq2MR6cHU=TwL_4Mo@xr?2XDS z$?d^_@?UK}2P_yN(-7w3dz2Y-&f5JpE=wOu9-@hLcR)n};XU$YF_cj;H}5cu8T1Ug z?wXr0WMGC}b9r)8(=*Ho%Z8daGvM;HD1vNf#n7R^5;wlS`|*kWwXyi0xTk{+8*eTl ztouU(bm#6yxVNcA!e^f1*tv*|C?_yjrmVLc13(4$l$JMqFbMi&2Y__0WjY**E~Peg z>kG7h0lRx0gjWiF8~d4t^1G%bnhb>4_|Fp3vzSy8AzNU4Q_|9UxH9F82D%m9H-4$| zu+_4>M(MP>sUI^c9)6nkCwGRtD(1C46v&W~KO5_oxQHU;G_DRI^+?)+ACuOa&{Tnv ze+HM+Vpg>Mmt4h)tb9m-oEn8yK}|RN*DUF{5gC<`R>0HyNg9%i*KmleNmk>KJp!?) z@k0*G#vNQ3l3g;q(9u{~*6apTUtlgdXO$q_k1X7wTKSKuasQDXv?qc1g%vQ|@)~EU zmDcY6wa(5GvklNv&B_osd>1v9!5HRD;x%(=TM>$b1PYW*Cc#m(PSs>Kt$Ys>km`(> zeqWyNEN3>NMPV?raALiUgT!9QF;VRrE0TccCoBbkLWPW+f5NQm+XnI*dSV^`4Qq;+ zI*F>(bicw$jc4K}dP)24a3^}4r zQEav$Yub^~JWx}mkPmRFY$!GsAC-t}zDaP#B+cMw^BMtbmTtpfhjO*b-&h5Wf}sMHvfEG#|rmT{UyK#i}K`A_u?a9UQEAd*8l0Y zN;GsMf%5I~H;m=(&b!_8s4v5#QGx=b`+S^V8U6E?`FxS$9rLL z4PybdWb@s;e^)buZy1rG%vY?#^+@%Ig3?ubAl12reZpPq%bLnNjx3Qxy^S^lL`|q# zn5=c5479(|{zV>;W~_Gdz~e(6493ZjEsGn)HD_j9&aP%hu4D3)InrXmGVSXWT{1wD z>9`n5V#OyEEjH7^OzM`!zbS?)(6P24=ZXnya2d32>moHSlSIzneMIbBqtf|eDL3US|ug{MX?z0q1z_a(GL^b-RXj^67 z^}Hb#OJq2Gj2;QBceSN3R`hKhaim&6R-agGxchn9@wsw-^}abKdIHWzc|0rI70f;Y zshMTo!@hJZhnt}aQ6zl$cLr9Wim**$wGFNYMS+^C*PA_K7Ys7x(@z`nnH}U9zANYGw%8d8L5m7o2?=#PqQ9VKpTO#2$62v^+ z4hU*vHe|uSDdb49m_;V+xBpSm~@~n zbo-E2p8&v}wQ@3FQPrIpk$)+4l2SY6*p82n`&fTAv~!?NOqbP4pJ+UN3I^s^ zcDB<^I587lF|S2mWd8650X_oxI5?JY`!&H|>8G*$*3&0Q-O)I~Wly)QHLWdCR#pVFzj5rAZOYUWZx%`R`*n4o^Wl));sTgW z6QjwX^Jks(b9=^QceGlN_44D;_o&RSp6F!UDP5z=;S^5^EA3vRRjq>#Fg7kbv%7a2 z#HthH{%bKey|`<&ziNo@RWF_GzB_T9-VvL9<9_uyAf9!zvE0kHXQ5ar$1)yttJ42N zsF31-deDnz7^s(tZ*C3H$hD z4L@lpb4h-ZtCRs~Oo9CJH(=*C=5@5K7%3@f>gwkdc;0Vf2%nq1)n&i$S2cH>f*wTz z)LU@u#j9Eo$BQsmYp2@-H*MnFbqT9suWUGLTTf_*nQJ}sy7U{hmL3JNP9zGLRz1j+W^=adgoCZ>s4)a`A9c3+dDt-0d33sR~x3+Ktv z`%em^#3Wjn><0^qG9L8{c$H3DgrOR${2d5XW?+iMG`4dCJ4B)4v{ zCdBvzQV0GDDtyKLPJ<*VD=#Qa)22|0#hV09g)&(DX}%X5R9k^+JeCbr_n-|93hO}q zff@SAt<5-#pi%O4auZYAp68BPCA3oNe+&pXLPYy7o&a=QPyk!~ir~z%^on{zyC6U# zEO(e`Ur`ievjm>!YWJN+SgQ?1#bm5q*caB#pl?t!e8erskrPVj`RgM@wHrACpY z!Opp=HDEa0RG%+cQX`1AJ@FoK=Sf~4`jEZ-qoW?4CT!}QpciuFnylT?x(Y4pk#?^` zy_HUQR_+SS>;hQFCtle9SDebX-Ryg99S8(dyNmu?T@{wXoGzCSCAGp^Tm-?u(Ofz09i(-Z%Q6GBetCFH}B?% zeWNsfQ6Rc?I~jk?)>b|TflDHon`r*NrXhJ=inwJo1YwY_jivOOJ=S6e6d$ze_LF11 z{FTrFn6O8qu-A4!iI?!}G1>4lG%|3W2mYQpj6(0~4mNr|;o;IiMkSHAfO_#__B&-Sd zpHv^+MadA{^>4iM)mF_0YEb7^&0QiJ3>&kCxRc!KIC|k3g2U-rW2hOYfj!RKv>^SD zK@k6;p8eB`aY9U3qcdKEpD^#-l5fk$qloDs-OiTs3o_s-$MuKYx!2) zBkhrLY}zG1mCmo*G}xgSUxC&JqH1*w_5cWiM(CWjVZ}M#ZBUq0X(9EMkKKos6?`a{RH^WPuEk|V_a_Vl)St$T{_X+uD<2Hcu#%=Kh6YIQm2At36 z-XEC6DYs@z>!AELvC_9nyOWz;j$OqSj_BM59RLHh;$9voAkYbfhI-4p*=0s}BIR$n zTK+RL*qjFI+ME1O0q*VN8D7J-i@mQjGbSw?vvrSFaYW9`Jh7^&Ieh7;8!BbIKV;+I z=rx_E$hrc5E+FWHkvyf+PxmyKNE)9`_+ex_{Up{Is_2;G8lWL){8?}y!zwI0{ZQYk z?eSKsQ)$^?f%SuRsT)CPpCHpfpTd*!pT{I$KmM&jJ=1{=D*iPIUul210aA)mWxtZm z%NsRe@YeA~sExl4Ex#R%eotd^-rg?ozAnSD_}ARPOBLDv9xz+ZEe|1J+Kk(pns=%K z*}gLM0`^L-x(x9;HaFdQ(rnhQ{kESeCAs^1Z?C#S170pAuvV|(!2rEC>_bPdrDuFE ztldCoj7<3j&pYqUnqBPrn_0i|N8lx|W15)y0GvYMG7zTxJRGXACu}akF-X4&MyjL)~jokX*LKm z+AHM*=Z?_n?7{u!hK~(gqO1g~5oB=B`dn=ef{Q9Hc6)&P9K%E3?`zJ)v0pVcabNYd&1+irB16asp zM^G-C&tFY>wKw(pL!k^4Pk{B<`2h!*VQt2Yh^|mH?T433ii@E;8EU^qh#5fkLml@ND!Ri#vQUOba630tR`L+Cf?<+oE=`|} zBp7DjfL)L@NhO{xs5QP!6V=O~PL{6U(c(trz99u#VNBSsG> zf{FwH544lcV1C=7Vty?)3D9!#q>1kkz{H*5P!aeXn(N?n)+ZK!;tZFKDf-GT$WEbe#>3U-fEH0V3fX!2S)!3y+F(5%c_yxjoOHG6IpCTg*nAk=f> zhhUQvx>84BIEvio;ORP}0!;&%{DEZlFW^W30-SD8k_SL9p!zdj-2&Gh(1}WQOZGt} z1a5brH4kulrG9y)sv<017~V||939ZkZ-XkMEdu1mOamkA%PK0|NXAk>zz|vu&1fOH zAbS-1l3-&kU$1V4B4t<#^?;$<`uY zY4!m;3zhJ*Y#>yWB<$Mqz}!8)<{|6u@{0!>=93NO!G!g4i2pJ#5A6@vFz8&g4 z$%|dNtJjhIbNB@|@}FOToJi|;m~i#}hz3`$}dbJktYJO)MMORxxa?8XUDE@!823jP+#q%2R3*F!gfGYN#Fn*+Ce zd+tMXxhq_qc^G}6Gb3kxgU5_IIM&-Rz}^yWDPX9Y)EFT8#@fKoz6CGfLL}h*Pt$|w z38+O00sWK~D?4RUjR+MU#5r<59e$uZ74fJgeNP@ZZ2Z#!K>h}|2tt!0|9^K*@SiP2 z!FEBlG;rYEWCfC-AiwV6Vv`k^U?yYhZ9v;lY=E35xV7|tI@(|f)KnNqKw5*2=-mQh zd&E9YW`pB{N9O0+dFF2K4*$X^-smO@NdCTh$2w4jMT`3feSth_+_zsfH(PKKe z+P}4RNhZi3+wdOo|KEj+7)cSNt!N5?Rq)tI#HDfC>-DEb@6}w6A|K+8+i(X}rm|@v z>vRf0#Q*!^_FR16wj+;Kq{RZ*{hXwMm<;_9Hc4}5eG}qbk1yDiwPDtdsIcc@&obJ% z3M=TBT0og6kn+=O3)+tc=CS#JYxu@36U@aR_xw}fDE~sZB%})fIVT&;CBRx?$<4rr z0uvbU)SQoDNl5JKpZqeC9Rah?Yl5sZ2p&Hafpj|CZr&L>MQ^m1or55(j%D@`^pRCo zujIelt@dMupgWH8I{nei0R>kDtFLa>U^`J-nWU=2a0bM-U5<2`)(P)vknXf)pZSC8 z0l?MJ=>#Mg*Wp<$e_7Q%WmM#ZbP{*c{gA&4ndDxJQnNiAi}@=DVD9cvUtpD|D7`2@ zG6#VK{z1<@_QO$}HE+wEiVK27Y9ML4IGumheIx#=EXv#lgCKwh4o_+d8UE~lxB{N0 z)oCygd?Ab|^)|{@0k@bL`H$b|p0jVRL455>UO9og6oHtTG|tt_;&I>4_4iFi4oDWE z2$vJ7QQx2s56Z<%nz_FNw;=>3I1@1q&hxF`Yb9O14we3qQtZwjm;VBMDT4G~rLF8` z%#$&{X&p#sx?hb{!1z_Z*bD}feVv~@--rkkPJBwAG<^&=v-nv@oAqNY>^fD1eTeYc zgUuo`C<=0TErSQPo^OU8zt0483yfoWUc-~=O}CruMJvF`_wwBit&30`BP`{8zMsT1 z_M{(aY$&i@p_9U1QR&9RoZFAgfdAZJbk9$Kf-StgYwi@$5+KWx2xdW;sg_&NG5&AE z2|7Y~G|7TarwZnHHv%dD3y^gVAOnH->VcqE3J?m`@<3%p(%cb~bFRe%1Dz8VN)W4^ zefNt4bEx_Vt`7`D5bgpW&OVQh)W#{o=rGaA3@yo@ke1Vd%?C|D5S}2fSMsUdkcuYD zTMP0Rbmv@@zne>}|H5O^xCOm!D?kLI#&e~c^R<` zFah2w%5Da&87;_w`6mZ$a-Lc|Z&3$E+5YV#Vl*Nq<@SILv@-l!_g|q~-fmbfuAAsL z`UX~u>T`ylnkao__n}}nU{0HF@kv6-R8qwhNbYSPIz_Y~Ytkp{Y*UR3tJD8^$8k+R zj^Ovs{0PEawhpe<#}tyNq{%}$XA9HE|4J?~LUxIYDrb*+;aG5vV$7D*hb#&_Ln|bQ zpni~#?=5kH&Z>OxQvj`$|IaCZQzto1gX^Ie(Xwt;&|&`+#FY(_O%eb;%lJK&+6=dn zXA)#t)KYOj@%>(MjJ#l$t9B$y6Z!F+r}K#`&TOV;=rh*qHgrJq+Hdyxi-xOCH@Hx- z-lNXe*8H$*c0V+slj=uNIef-!#vdG~Ky?sRZY+a`VVx_|5=taOvXJ?2wG>jPL@pTb zxa1U*BK+jL0M%mK0f-jEfbct%!bvtP!_QBMnHI7C@^iOINfcp6tW779oiY|jR3&4- zcI^<=zrw-)^eo^et9Rxhamct3;5Lb~H)KCq>c)yh#v~vWI(li!V%Ht_f)&z0EL?ql}vY zdWw88p?@U8y3lS4XwovNN=MRw?>BQV&TE;zvi-C(QC9GSe8!m``M!9s;)81}8HPN@ zQmD@D2=hj~gD=zf?CuOFxTi=khMKCGp?~ObxDp!*uItVf$YB&j02zF-lB6LL_-Mw~ z)J)6~2B17Br@{25T*i|l4o+s*Ve#qiC1ARnDac0Uw)xy?zTlSahQDmBZw$}!kEc9a zwYm%>G`&UoF(@nQSIUYr>Tv{v3RhQb6^j#d zMCg|)##d2y-ME_XQap1rDx5{5s&-5(^>yuEdVzvGA=PaYal{YbF}6m%EH`@R{l;{( z#l|MI6^#WTKGek3Hv1^Pg&so_HRcd{zTZ&j^iLnrT&$>}8j@=fg>eO;=SgFn;?yQ? zBm=C>e-_3F3hTWU9uF1*`V*Qb#~|DY5Uh)e3Zb~{t1j_8RlZPAMSXg!JHinS`Lol( z4DN?+63*Rs#p^J&qsomsZDrY&hy?wTOC$4@KOP+xi=8|bq2%xlJe@6bX`_&6quOW2 zF6+4CF1cz%O`5ie4+MDRMS9U)1jw@;+^Jhozji7+!+fMw0Y`5_ z!etD<^y0NYzqo9g~rQJ8(z_8Mi@? z33x41BavGO9wO{H>r8&hD)ieZ@(ScvJ^c!} zy%L%h8C-O`lxUZ zk~oo;+8+W1t0d8I!SHJ2%s$FUS>OZ?W{`)O0G+RG4?p|>vHn>(~PTjX|Nb^8a) zHr zr`Rv0JPPrxyX8C*jpMdC4}w1>qC;IXwtL6N@sX1#_M;q5MC~riOY|Jw+Hk)Tq}m%$ zD{Sw>5TUF1n`qzF7{Lz?HbDr$0buxz3C^zdSi5I(on~kXXJRin+XJV_sy)-!*EfW5 zO0c7zW=*+C)lBi@8D?&h8)o890^>#R_*6&)NhhJd`u)mlZ}Hs3#oqq<_L`@O2<8L&xQPwA_U6JTzbgLn5tpg+R zr}u6W&xCJ3GcYF(AyB_OpccwxoI({vrth)|jyKD|Wxwk6Smd-h8CA(3=xS0yjzuRL zXC_rJ;g6Hoyipm-hB=>Tn1x|e%y7N&FHeXrP>wgfY;4qi>_4RcRZzlz#CntzCnwd& z!xzhi(n?Pq#5x98l6sK8dd>HE#Yjk%=^k_7% zE@2fN$>$PsUIKoS|A;yi>^>hOMb!?&e~&U!(z0taWnd!aB0(*V^=AA$j1W4s08%yP zgE%v)6Q&V@Pprrf<%N4niVm&Gd91-G=MtV>;wH9A>Yh7DV=B0)8I^p@(58YAUz*y~ z+q}myRGGSRL_Ju-uwMRlZmXyV_sr*^z{k-3pSu*lk=#PmYwp>-A$Eb& z*r8_;9~zAqyf&bI*K0QUAy=QRalVHSRAiTsWo?A%Q>G(g6W$xD@sm)e*vzBa@dTHa zK7!U}poE4rzWi52E&XwW+bB7mxf0uzUTnETqt)afC_`X<^$0yVDGzL?sd+YHESB_) zNtNiz)_#6|ktqmzs{RItZp3A0N&geALC6_ID%CH6A?4LBzOJ3(gM$7Z(8{ZD?|Z0L zC$%cK87|27-%w!3MJ4)XT#$VKFOr{HK=4R_AtKom#e)$gMHGn*(WYXpbYLI%>%~Jm zmvKWDgK!Cn9`)T{$vXIkVF}VqB zaw2%C5WxkdzeMrJOd(EnN%K};Xb_i{)V2Tch+GCrI2UZ`hqp8^?78unz%aI6AYt$E z@Ai6>{v+1x1%W3eHBw2yZ1@=ko#W=aOrklJM5}#$9}+6v8TCKi@|)oeGTv1Q`G;TH zukPtft}AsWMv^f)ttyjgMLzfYHP1+@f|c2c$>>sM_cW+2ChG>-X|qMGUM0-F2U{J# zQ+Sl@WZ97bfh+fguwOzYq3N^54;6(ohxcg$Rg?l@(+?T?|1q_!G~om%PEKKu+yW3`x@K%Uuv zooc@!rL;Qz51wp`N4Ud5E&0n1wRuA6y%rhQNOHcy$9!GjK+xO*M5j zgtcwmV}@&-C+Lt^`)T~FL-?2_*X%>+f3x&ey4G`$dn4ke_;0Xw4}Csc*G7!+ zT^-uk+1WAi{Qh3vN4oeHA?+657HAUPdTwajf|JFvX7C7UNVY`O6MR{2vo+9Wp{u2%;kWHe;%=rd0&YR(8|Kl}^ ze>_)=nEniwWCr4H?*21VOAmN8f&Y?3jMNE8iCp=S4WpkEYNT*{1D_#-QmlG}o2ln_ zE-jk(YTe<3q2r{B-&{2nwqzCcy-Spb|FA@`pBSII&JFs(ei+NNFk)LMUHmYUPYuVX zrL=bYzSI8mwbl5p*LNNi1VuQm4UA=SnJcG@@R0|e3o%MJFMIOY9`1fiiBY}dD^n!P z$B0)7_Pm7dDbpq^;7M&}i)p)29LGTK1+D@N$DtC;?Ji?S*9M7x6g12GHk#O*5}IAd z5Juap%GG!SmU;@<#in^wz8+`2ollZ<`a;6-9|DQ0}5ezV_E9kL)B6HbG^f zw)H~Ql)#bCE9X^vi=BU?#*1EG+MiqeJbxtq#kF?|6Q5u$TK{`3)_|K~bxEji9m@c6 zz5k034`M+=hLklj1=-uT{G`hqouxnOK);#j8y~RAGPJe7>Hhz{k4%4{p~@|d&*7Fw-Gt%1 z@jv6=TF~_xAkY5(uZ8(u65<`=HYOwcs?7M|wDV>k7F{a%V6|?2aT;&pk0>U8Br-!N zO=#qL>-|I1!V3ksMVAmqS~lBHmor?%HeNF{ZQtGltLtFU@p<6n*GVexrum>Pe~OE` zyL4H?RPdEiFfQVpZ3OE(p)_J>^uMA>lx8=yMY<$;L(h&H@TALzPlWW?%x=HBo25UO z1EG_im)6i$388GhXQE@6CFByHD7A7NxTGiE>xr-kDNiz(3{VQ ze*w^f>?G99w&$|&>mmrlE2uECpLsJtSt*q!!QOE@SiNhg@C!J*(UISzQAG%~0-AmH z_l$y3u@2>Up^Hd8oj1sUag~wt3)r{uPoR;RxdRD025TM`!iSJxgiD^T@k)BVrA~H{ z0vv1fqwQjtB+G{@dGc!0lZz z`vjm@fKU2LI~W6<`XB#%6agK`({s*=rJ8K0P$yFhJ0nC5OeCNH_u+-Fl!NzAeu+U# z@|BPQ^ZD0Ztu4s0_==Ixd?C-evVpLg2jS@Ob>|vx#eh{ zR#3Ex5Kq4a$%7a?JBX*>fx-d00B<9nZZg~A^980FBGiXCsI8xDepP{=QOQ6hfP9sU zP#{^8(SI+_419ZCcF- zWB9je1EJKw@hoEo#a}f?tiJyVpdgSoBMBLM;Sk7`UJ|?ng1s(8|AX>_8K6uig8D(z z0=E0gP{^Zp3X;(Uj3T~c%`C6ZsMrYHhYQS(eF5L22ktc1 z#P=v&HE&eW27t=xU~Miqvl|Z|3MkD@Aaikh&g5c17HDw%wu#2c`rYeuEu7>wE^F{g z_k#s0??Wz}Qs^BXF-qhyZ$)IcJy_Je3`BE-EuV?(BJ9B3MIfi4kwkV{uDG-N6*zR3 zq3w|S`7JG5m>df<_$ybiT)vSl8^L`IHZboZAhkam)c_9!l4AcJSS1ixV_H~8%8Ru@ zmA(&zdg8xTAS1$@lHqAG{5#A%bOxh$&mMzF;)Jbu?4SX$H^OaPbyrG}4k^gE3R1u# zu>3x~XH8E)bPVBr8Ds*T>JDhj>H(6Tf&yz{l>3vCeH z5=^lktsjOD$R|c09S6$~-*PiN7}Yk%2xkE|wf+_OI6(ib9<7BhLO9V@JaOYFXfmx|&s_>^E;+!9kS&dsI*j1beW5$UTT-S9rUK1+f`r)Mx?FZ$=Eq20p6sPU zL5yVg@_)81+~tPxUVp%*lAc#b9K`E8qWu?=-yR1f#fPA)XN$PG_PcY}ylw-t-$*h$ zF%pa*5_833bzV?$^RiEzN^iMx51oGk7- zMTK@*;_M6Mv3wa6f1+DWjJk^u1;DRju|Rh%9*JpW9&XIC)-jCF`gjL|xN2>IqUWql zH;d#`3svYhVOZ(7Q|6Yc`Ox28>GYB29@#I@1hSG{)d%mkHZT#)cCw?|xqzA_*C6l9 z_5DNzJ(g%1g|>>&G!Ug)_%U#?5$jW1;jb4^`*jGKn{KEo-s{W2g;6}b&lz@6WwM#x zTFKMb{xG;9L_WO0<)#`FWPM1X)5V&@JdA;Ta!aR3FD*Nh_^W}qvDFXn3YV&CNh>eJ zIHDhW@&I}0v%jGrN;qFiCd2KB<;3p1FlNZ=bh~%G!xV3I-zIV*KLmDPStnA*8!;T5 zH#6SOfu`vfjN)ZL?Ja9N2E8!=gjQ*2IZgJVk_OCK2=RE{t;)3p=8UL9F0}3~EcqfI4wi%*5w}jm zrDSrH7hQet**jp!L2Y-5I|QBXcjp~`XPEzfUx9tfB z_DH?Woman124B!Id9uQ^kcb2|NHmHcH?q6sav^-TFCI+ziiP7B`1eLzlIpmpiZF+5 z^&X5`6w{4=lonUZo))s~ME%-zQMZ|><6+V_Jw?RX*JY6H;#woQ9equX*|d-X+zjT_ zn3Ii_m6Zlwa4E)q8wC|>76do4B%(=>4-;?Rn{dtDC8!lA5|ir-ZC{p!yc;(>iUW-4 zKstLqm=d6K5!nF~A1w7k&Au=^!ub>83#q`qKWd?wIgNTo&deKodlCXtP>-vTczG1A9~);RxjcAzsMW^BSJyT=KA1#PdIyfBMK zrkwqP(M2NagMJSP(<^N-41{iay7Tr!?3ajHf3axyM@-2Z0a+P+kEms0i{$GT%)(~= z=FaUVnL2-xmASeHJ$h|TR+xLw;W1CalnD4lTuiGh; zJP+^Uvw89qU>7w^L`W33n&$UlW*K5mTy3rqnPu-#Zp645G?#UZdVp4=f$@50(D!W9bTIx)C@$g%UJt}+Gw7**FzZkz+_B|=ygH% zsxi#wWnQ$!y*0q@MRtR7=}e22A=G40FHz2o8#zICwtiP*CB`MQWhMg8>Y7aAiV>xH zPPfqB5KxSawNFwTRdG42ZfJFXA-b8(eD9ZRI2POLRR~z7cA7{v5Y4Tcc+I$Z|84M%;m2D8tE4_ri~MbSQRm{pPgI!_l2-k1X;jk1ZTz!3u)&IA{qybSkk@ z+F%_PHA-iE&eIcM^ZxL5Yh_R_1Ip%AFnJ}WCr>g2X7qd9F^(u8N{t#LWG3hFmsqve zMz? zv(3!8V$fltg+h`lEt3;E>y`Es0SrWM7wwHgv>?ki>dQ0oJ8g=HY*vl(FxdL4NXjWt zyfPVyi#0acgiq$%k^vq-p*+0uK-c4k1V2Nw9k6##Vt!cY0)mtQlY&+F>dRLn&A;Dg zC`+Qv`fF6KZtNt+ipaJLcF45|DD(mZs(zOW0$~w_biA*iH(zyJq+nB&WQB;ZKlR0K zij`giyWfGY1TgR7^D;3(zn=d%<-(+Z=zoGV@I{?>R8LbfK2sah8v^Z_05)6N{M)hx zJW@Sd_9;vAb<*&Bzy{u8xn2mX*^9|att$*>>v&s+iZZ%39 z&Z6~=XF#-_<~y<{6EDbkW;e(w0x%}|TXk@;MPbvl9B^mz5N|cKko+P@b+f&mEh!yf zxtUMpk#uAOX;RU7Vezsca(h2)9XJN9cgXz50U&{*2mRD{cZ`v$ zyD=JKI1{kC-#9nb`r5z?sXK*mcS6^dNf_mA=%cIv8~zD?4n_Y?41hP=0i0BkDM#T z)eO6O|6-vLNAEN{h8kvt09U4zF9KcwBvo_R z2BGvjRjNkIFzq-oq(c}Vs~HD+Ca~yY?if;%Y?Bqx#&iRF5gjj0#wb#7 z=+e@cdaHf$s3)321JfA5DZ;^#EP#%{4kTu4B)9;!=6h6d)dLAOdeSNvi-12uueD_& z2>S~zsufGLG{3k?_Ssm}0hU--05sAsx7<1(To#TNZ5Z8mRfB-ff|JNnwr;bMchZwn zFecZQ=n@KZUj^!>!L!^5*mgd6-w<-~efb^vGOoOoBC7=;4%8dcSj2$aY%8;NHBk z<;WG;g=^Y(fgaX-v(xq%!K#373_z{0buFs{FGh{_5Qos>eqqRzrE4f$HP*AL7vOv&7hQhnZnufet z4WxGCV2YR>fZ+;+Y&8cgwE|gxFH98@!z=0)*bbmW&Q7%S-~$Z;2RuR$8U&rxu-Q6d)Z8aVRWGLja|D z_(?vtQzh6s}jKsFMN zoG1M}b@U*3L(BO7wIc5C=3G^M#(Do7pQsm+3G9rm~iqq+C1vml$plckf8QpxG6f9x-a>44T(+ zLp{VVFz@>d&W^8Gp@1tY>?1Wt!g2?=*k+B#1=#U4NYwnTtzP#kNJ*_7J2ONpwnAuo z$_YG81?Wtm-tNht+XDmKoq5jF9RN?Y;#`K=8u3sO*wV~PkL8q~G_lpo24Vu)P5|TA zl~C^R;DAOu)Ro}v$#7yASLQa??*UK-3;>r1|4Atg3dh_n{dzn$_$JjPPgFgi6H0$N zQA>nN+YiFmuv!5gYW4*6>EpvCHX;$Zt-)7jO{#oX8)(JQA^ zdo6yI13hq~hr&@WSaD~Hvivfr;1C`2%_$Km<$PaA;{K~aOV?e`$emYC{m$w7S%nQD z|IU?Tw`B{NMs@iYGL5;06u>3ZZY^Jf!_e~h_N`uaPY*O9ojYA>?F7Y*dyUsyE}a__ z#muKx?JmDHZ2NCEweKh9Kl@?HjTS9bSG()tWv?B7+%|E&>1Sy>G{m+gmvDAQ8}DJD zURxolzVGthQgn893KKx@cKziBcRy9*i|S<2N$z`LjO5q`+3#xxJAy@9hj8zq3$?qh;`?l7=KJagYppKUz>w#}wXADhjvh7l zZyd|IzrI$AxKxn`DTmA0BZk4vLF+43ChH9!bk%f5@+5bJK9X};?;6LMu$1W$eJ8+O zXxY%=tN5}a%_4Z&fq)rnaLa7SAj#2}`i@r>p;%C*UqqlO-aih*d*Frp;rnVu77nvF zmG&lyh{f%988pvrM&DM``QXU7(8y-ooYYDOiF%7_yVNnnps1hcxTyY=WuE6Bp(%QiO#RS zak3b1sqlSJ@9|1G``Cc=FZ$MWla8Pw#`<4ug!w$f57hkV}3!_83MONluW&HZUEe zLP?K}G)gI;<$eLaA!8=X2D?(L*)Q#dDDmp4c33w`bQodjiYaYdgB8dmTAmL{&WM|e zJ8QKgDr){BkbUWG>aS1W949+oad+mbT}iM{N@O=J(^QHoHCnk@Sp-BTFuouCbH>!yxX$Gu zT@c@;rQ5G@$xkcFVuJlys;xbvuEOlBky4KeoNbca)f%ns&s)#D^x`0w`d)LC_1nb|pc+U~FYs`N>nE$q@3P(|!R`Z}GcT+~7QrmgHF z3cgpk#-t)qaOI?eW@z%PXnC6i&rr3>`{&0Gy(38>^==>Y&mdJfsFdarb+19titzHC z`5b}`>}ArEDbDQbH#f7zYN@(T+KESr%*yd88{6MU8C0WnOotv(E?*9CcB?-gAa3bM ze)c%QlG@i1>JnK=nXujViaMMTObgwA>^s4TH>7H{8gV8Qdxhvrrqp)6Fr&T`cTrKT z8kou#u>)DS9{Y^i*5;A-s%xxJnDY&3O)OHMISq%cJUILW{rZ`6;1jnLLhN_p-ZvJ$rVIVjJ=-H?OgFiL=XsZ? zrupXldnp+cb&ieXK}PZOC5LZnq9pBa~V)yeO~PA@z+^OYoSf7dWSqhca17 z(VM5)7Z>BO_4Bq>3#<0tg!WLqVHgM;FhBQe{7E)>HSPEh)-1NatXXfooy8KN42W44xZ0mXtRU9E$!F^JTViewFefiB7l@0U7tF%S z!U|$z3%Qwf9>dR_5Ho0Qh-MOG%v*i;`pO%pkfXuCy0aRZyJ;0=9eXueRJizC{0+tA%>MMVE90(JK12oi=)KjRWGeAR~9a_QP7Hv(%2= z^Tne~^jxvTL_I$^2UpaBDv@HtU+v{6WPlg0a>%zH)_a9hR26!z-UW6C@+EPD%WH3NKDX zwt5HeTr>QAS7$_Uy*PKhjoizBmdm9QOl8+21>>-Uzs3uXD2|y z>xE}tzyEqn`g$MXb3(?)8}A#hnVOY%3y}|A>1GrPf$>gj)qFahS)4u634T%hrpp`D z7$a4$b6wEt_gA}6*t+Fk@sL8x{g9?e=MaXI&Fa~pT<&$8KkrW>L$9;Gc+NWXfXS^a zQD4S8As!H9e&&Nb<&}^0c?e=XuWOTvKfl>R^+E^nb?A{tTrE?)yJq+4it(AN#$a7l zr2J?IwhGde!Ux_FY-5I`bTn?jVH(}SFHUCZuYckS$Qj_8R;e0o6mYGQR~Qw9BN!!pUY38oXtg-xIMHkCtW=T1fc3~p2-U1tvU5dp)ZXw* z2RBONFywYPCifjidA?`77D^9%oPf2+cD_Lfj#c0B57JSvGwjI z@i7*CQl9-+3M{d?A5No&;SolGM$eiPez}o#j>#mb09#uep(uOSqR%V4DIV_&4@q|A zrBmoEyw>-(WTb5q8qVwQ4-uZ%#-9`12OkmWWTfVC5XH5TPxqP}eo8h%e?UVd)^a6Q z-m#M~+j8c`zeh+6U(+P#lLz-bGBLDkEf{v$>~k-L7n=1euMSs%XY*oiuHLg;FoV8+ zrpgI5;*L>L%Z8z<$W7`*{%+OLc9RW{I7zlH$J$-Azt=3!N-fj0dMVG~)Zsva(H*p*VOd>f)mxPm(L>%OoLl%>(ls5EhB)n~ z+Hw=YB7ZybPS-}P?U-E%oAB|}Sa8mK0Bt3e623etc(>@Z?m5Pz(PlUgfK7{$dm7ewHYYa^k3CTS{`! zcB+f>cOVITE%8>XLPTXTT|g5aLNJ_DvK6ZHH_#k9WgIl%F)B0o{i%zKx zy1ESwlJ{!Ad9+wGQmxREjoZW167zI;7`alG^|&&@hUG0wWJ;u%wT4vu;4di55g&%t zadSp*c*}AtZ}tF-v&}KmM+V=;Xm^wsYO#oEFVoO}P(l(*OJxxGB^9U0cXE7tcDN6l zeoZ>YZ|>QzpO?0u@??HHlEN=brVmkL-H}JRmo&=rwODwG4I-ahlUT)^A10p=ia}?T zWDvMDYlosT)NY6NLy+$;WO&A(i7U_3%9J4riS22(5X0 z;dNWk9Fjy)r5#(7w~<09)$`kK60%h2N2bXdQz(yI`&N{!0qSk|FgKN45-HJx?i!u3 z4PURhCVtyka&EkfJ1-fp>4{q3+T7Ki4r5txUUIrauL^}=Zf`6v8M9FDFNC;}q|D$g zdb;UzfHVFzG`uWlnJ#WT)s@QCegP!zYG|LJ;0YFC!x^w8##n!SRrymbKHnb`tsLT- z&A)e7hvL}48wn>g&Ve-9r2wskonZsC#^EyIm{dPT=E=MwC(4)Tn0b&0IzL>k0X%in~q5NAYLkorl zQ+^G&4XN>YW^NYvTS@FjEI?%TzC`qs6ew#IOKN`d8=!{^V5GK`-56imyS+SIy z;VOFVLTIN~v?IiN*HxW7At%RqJ!76dZF;pk?hat`8Ks3ev`D)Z{jOf`gKJcRP>iV7 zBzA>}4HzS#l;H)dNPUNiG-ou;Y<$E-Ok_U<%FB#7<-PnjoHLLv-+&6Bfhug)isjA6 zL1t?5HtN!gcd3>VW2dG+WROYbYbqiRVX;XZU*5!gErL@C(TWq%8IIuTvhmnKWVzR< z!CIK4L|o362umptQG;6Lr%|(>fszT1fdp^fz{))1STEH6SpD@(-NI7eAL|~d(>EEl zK~rX=hmItAB%3khS%&=u&rtspC7Z*WI5u<$1f;JFt)Gj+4Rt;ns5!^Hs9P^rJp>fF zP>Udx5UbtV#4qGwO&ZurJMGJzD0iV1`mx5GFYqMQ$~{j~TR2ROUob)%G7uA)k$aLG ztP&xno%Zw6J^V7lGg7zC5H!MT0?p+Hp)_1+&rMnTi;w52ZbbBE6}9j62KDMyD( zy4JxcmB?2n~?NnCa>|li0|840S#n zb!nS}JE|yGofm?6=FXgHCDDoRb~rfBK;F(tSEu<3`odDQkDoMmWLCc6tskL6+pqVI zxx3pp8$`FQj|EowXrhLK{l!f0h`>U0%eB~HAw!)Y;Z^B^6UrbZHf3kdXT0SZ@3&C- zHPV)*AD~w;>0$^see}Q7WS)ShyPfo9YJG3~qy{c!vkto4LuV%%(Zj5rd->#d+A+&C zArH(|?V6V@D;`NEt;+9%*NBdZ&o2b3dzLL_r{EY6<6!G>W6e;HRHZPX4ajfOyRb~x z5O*a%gyN3nvG`p=TrtDd-dU#jxQ3yGoS`jjLE6k`uJ8pf7M(*n{ZDR?!_8}9{6|U6YfoEW&N-?CfC}QuA$ik;kf`w3#|q7B8Dcc^WseS| zsir?2kiVe*{J!a{upOjZsP1ZWq8J*#c$i>Xal4NoVB-N12!=BgEc+IYItd%Bi1G4y!WYNlrmO4qEH&5N`X0jVBm{ zg=WZINv@=PE{vd9&beJJQ!0rDqAHMkv=y`XV zuj*;@21>PpVzmUygARh&ud?o2F^|^=nh?jeJ|*e$Mr^#K&N!>Y_ftlrg{ZLR*(jA zzIkbP`pKb2@2j+>EiaR+`g|QJcn~RCe*$rE|F)t5MBl(z$`Wx8?{?Gac!vNm@5hTL;e*lTF{zpjUw`hO2+5c%sG5`oNNG4$Hn#=ZTcUG``?a)KQrckEiRx@4pw$RS}s;FFOan0_Y4K|vH;K? z2R9p-hn?pSzW5KJy#LX-{WGus*V3}Gv4MHHfcwwR4QAs6MgS`>515OK4Zt5cc)%>Y zZ2#OW`|pRs@2AiIURoY*FgFJ~Cx{Igz-$0g%f`h8=49mtq-EyKsEEf!kcHrwvMY@*Byc3LO4n*=05^)?0;^*5^88Ywu4S0eCa2s6=0vZq)$8tY$u`ICHBra*mm%y6`fd zQwmcy*CxhY!geU@CL3#6um4xzKC7AyMJm^2>Gg@6vt0E;r?xRDP?-P6F40kMr3TBmgC`ROZG2C&mnZF_|O@RhL-<$*%tlDVZe&$+~wiMR?HhlS!m77E=BB+r7}uom04l% zpo4xP4WFh%lv@`K2fYJ+YDv#i;d_*HQ$Spgxt9(_P&7ta*eJSTr*04I8ypkIEL0?M z<1LE5>_LkmsKtxpL;C*MEYg@C7hVVQIa$n3RRQ;Q@@VGsYszy)0` zFQbv4goQqdb-EjOJv2+&Fq8MmVNC+sBf{CpmY>?L3fj(?pMJzO>AgHLX0y>m?HkD; zvxmtJbdfy5;J-jU`9OUBH3ZQAwC6iRnNwH}yj)!=DyUL;Gtc$%J9&QWuis#TIhcM@ z;yP2qSe=N{`5 z3H0`H&#rwu?&w+eSUwB9n~KuRr<#c^2l#>u0pk?MD58eJwU|uI`N)#us#2}rbH<*0 z53^)!j8w~QHO^K?K=yXL)}cseJoWvb37lt9A(3l!tRDp!#U~~UnolST_2|GhK*35?yA+A6w+%vJ}k7_vsAQMg9^X_RzOx#Y4k52^BR zr@wP<<~3K&e{iif70)G^t)Qy#Ns((VK)9DPr%S}$j%m`9RFFX^P2ygb6GOo|^VwRm z3=O-IZVI|6+LOwP7H%2vD$f`m3f+iM&4F%t(Y{4LnReVj8oDhc_%DQvcuN` z+LsxT`{GMaOM94G6~s1;}ApfQI9%9{dI0g~W*Q<|c=KY_a$G-jt=| zB*P!v?ETQVDUm^k%|B$|e0%W~pHb$-KhPop(jqizB>{3{J&+(lGqh+UpW z3T)ITWzY1pp-<&u2_qjb!yrNz)+r&+%WETbqTu zg=r?7VdnPjG{anr{6yW=Ar%fCePt)HYp6_!UcP{0MCSv-qk={r4zf~qVU5p{GLVx5 zeQ2S&PAz(swx`y#LO6mu<|9{6pep1#R_oIwgK1y97@Wl?FGqYb=iNZLt$5{3m1xw+ z=AvCsZZvsMd#IRYjNUcyM{a% zZ}G&_^L~9nWJsPt0lL@6=5su65v|>c@CFH>@X$$lp=;S=1R>X{z}7m=G6V;&agIhT zHwSZ0OBgIqBxTyA2xIXc2igbuids(ucAy;)=XWt1PC||~q1?Ev+ZraO35z(4#~X;_ z+6HAZD+!|t3EbxfKF&PG;r5p8yjsvkF{>niI;m{6OVPAaLW^k#!-YmZs2A06Uw)KL zV>4#JX-AQZNdfVA;n0zX&3C6v0xphkeUi1o9UKKX#C81{LOfT~IXqBlPvwU{1Zx=Z zHVKcM-AZ|H-C;ay!mbqQI6u`Q;%_k;mbXYyZDG4%3qKcfm=~~fI6u6#QcvPw1WPi& z5VI^ae3c>5aovV>QB(ZUP(oecS|Ub2)WwC{6cFy$A8;f4@QBQ;UzLs}`9Wz7x8y{% zB0DHSp=#$)&UJVmMa^%&m5`3lSqVDQPAvHSB5tR%-bb`#VKPlh==;JY3dyX&GA%JSr~C%w94>K^sD}UcW3Ks?|Ia6kU}fu zd0iF{Zu@i8`A#Cf(%fcG#MDLq!AAdq`u88W6HH>|+jQT0Z^d2=a9`8bPad<~`rfm1 zQN2D2F_PdrlFD3kmC6DVJ*-iEAf%{OL66eZ%^AP*sT48@V?~e2k;bid%9%MS?=Ddo z4szFrND1jpPR#5h5HSCkwtW_`t%qR9 zuiIT#nIG7g*&5^VfYvg%wdFuitpaU@)jtJM~INXApid04fEOiuP@ zSx(gF-c?lRC2X>)5YRZLKseOBXdo?QMx2;&@2m+_MC3tc&aUC+cIPvvsi2o8G}D?{ zCyf8h?zmO#UjLc0hDY*3GBW575=HiO-z7dwnJw$Bour?JrL+Fn)B@?qUntbgRCr4M zb0BV-%$m;m&A9k2O?*CXANf*dwD$>dIqbcK+>}=xA*&5Y36`I^85)Ts_E04Dx*Ug; zs|g|q`u>GFo=+~eDedQrPszB}@jj=?(px1`TQs~7{DHGV9g`Fs&UXYgR8&j|Lxq)T zQFKgKQjqogGE5Z<;cau9w_O*fi{T?k)aXNeu_j^|#pToCgH-G2ufn&-ow$|3B^vZ& zuiZ@>gg4(srl#gcD&}WS_ps}n2rvc9?c+#&e(s^5?dRIuh^k;%87SWn6vD$?O)Tx5FV(T@A`!P^FY7US7hFEtBD zrzCoqTlj(EgN(+*<;;oXTA_}$%B|t^fx16;)29_zIwuRhIG&$V^w}Ygcf~F$wH9mj zN*xR03Q9@w;Tc3YKW&2b<4(YNhC8u1ZVlw$v4*Cmb3T~JWTo6N?eSAV(#XuaEF`;A zm6rW6fgQ*C?b1UgV$a@Z3RJQtqM z`EV?_LP3dfQ3%H5`-#c?Av61e6H(XAU9az-=F7VBJ=}_Hsd%7WZBC!U!~K%kP^lM# z=NLMoN`Ema8GiS1(oC0eV2>tSy#93Wq9#teS!AW7!TeR}zNkNkr-Ay(H%Xp4s@RCQ zY%hsGhWJ5k!VN}7_5fJ);Vy8LMJ#2uv#_W$>8yPYRZ$Q`3HLw;@|dZ?ljv08@pSS@ zadruo&)P{r!ksTFUS%6~D)w7CaxpMUh=E=TyO8_R#t1@k+g!C|@DCwBS>Lf~qSxO* zd}g(*ZW`rpGep;>yiXpL+lVbi2V*Y_0-7{5qsCv)4+h7H;QyIOG3vv79*v zd(NXLvy$3;=@Mfjj^u~XbN-1{9ShMI=@n9kT!}XH(y!o{hlrFEA1SG)cN81!1A@_^ zR4{_u%CbKcDb4$8@^VXPl~Mvl`PLMh#5y{1Irge(qHl~^ zg1cz>(jCw%rt5qQ11DZHV0q@alaI|Cm&)5egK4~9DU`4*$G3z$Z_nF_KTYPT= zZzVXCZb|rBTX-R-+(6>qo*eivT)i=0!WfKtF9F!%k2?zZsyNe4eedLtm3j7tPexHu zS{phUy5rMutldMg?k_AV9GoB>Y(^p2ab1aWmaiBD3LE+=pnXqaKLlNF@w4Y#eYA3c zA=sOY;jkg}?m>%|XOi1RTh4^AK}IEHR!1H$wrGZ%LeiYtu5f+0Nw04dNo&`Urgf@t zF{m`eJj>6@@?}WiO0Xw#M@Jx8c9u!>h*2xSNsMq;9L*fAy|pakudf}J=Ou{7Tj8Uj z!cd#@uqT-qn}fw2ya;DFy^m=GDU2iXieplH>DqP?Q1C84VtV+?vbLR!s|qbvWt>T) zHqGe#GN4;|D0a>{X~XLAenM2nCrpJ{`sVsojJQ!AvqbGj;}8F)as4FgIgSRQQ+UT; zvbzQc#ga)WjWCwVH}SSbTov>ZMw+ncmERkz0ex7{_>~L^zrtsfAd{ltP`Y`_FuJ(k6sKNPDsE z%y=1AjkSb>fLw>v_D?5EFTc<$rC1jzdwV=WwoHF(>RdI){7t5+Nl@oNxpbzlFL7i} z)ZIuvwSs7$*u7X(yz%snADjUpwlzm8rnS#6%e~BvoF_CZSH8Lb2sN_)XHet+OM&_e zkBapV^7zm3sQ!&P#rih}&|j!Mf3EYdw(q|ZivDV4|CLen7mNFUY-RryLydBl5!9zya&VC0CCd)*{>>GxW^t;kIhKT12Ul~$w z0n!Vl2Bmk6sG?>kaneE`g@u>}dW2u&LEp1pRqQ5pKG_f_l@ ziGyJpa%!#ATJFvWNK*!R1H_HDy7xQF{_E9~RlKv+S^j|rtgUrR?I*gPnHr6F9rL*z z4NLZ`QyoqRBlEtVTcP>$@j7d@Mn15gJe{L89b|t!Zhu9&$v;_Jo+5Bu;XHO1OdX$W zdcR1p^^6T(j~IHocU)aeIUbtuIr#CygzR(f@Q~@S@k90Y$#_rm;GkgW{l#Q=TT~^6 z)N3)6k7^UdRSu#AYAgj=i&FtQ;uetBbg&hNPPlnToMuLe=t35wkgsK z=ufwCCR=qbv=`a$wHGP8CNHV|IuyT0tHjrjxkpHc>S`(Q+`8;9qxBB#ymj{SsrNL; z*r;h78_Ez4<+E&NbaEWa5VClVYAX9}JlA|)v$x_C@u}h~#~Y*PmrThJ#7W7MErg^p zrr5RT~`|JaVouUH5sMel8I#xy^ z6T59Suicn4#xd!K=Z!fKDC+xIZzq=cj9RB)^RB5kmZ^6MdYnZ~Cnyjz4qvkmyW2_U zfuc2lS)(*rIr8lQrTS!|u~8VogfOp7K621>*qmH2a_Sd2-&tOV$eXkcwz#J7My`#T zu6)tI2*gq|I`?ftU`}{s4|pN2w#)T zCMIHp9O!SH@HiO0pPqy_S&ErKRcEL04)#LOy)_t=X57K7YRwR1jBsSvFe{h?UhD{ZTCHG=^fBgGih07sf=VTa{ zryxE_G;RjGccsa;xl2_a(cC&YAzxC!F^fMe6ogI#w`IEc}jd}p+}^$G%SKvv=ATIWu+f!3-Q7@qSL3} z)1SLa{nF*{a?dZ|sguJ?Dzn1PD;J&I(C4_)=`x8Jt61j-uYM9`JVbtwRU9-lq-ntv z9Tz{__oydD*(>`VDjlILTCKjINjZ2TVapey3<(V}rWdCi$nz>cDLk%JsP9A06Pr-; zSYXTpN129W1r<&nJr{}$+q=!nO2sXLBSY8wde1S4Ce0$G^O)@ki zR|;Btb2%kVl)9J>{~#FO|H~`fv0Fu#=lro-H#69+%O95aM~xLdVZ8zY2Gq*>RQYr$ zRh0FH)S7C9CPz`&NYW_SRQ;JO179Q!B8pl@dtd__%2`)@?mh}eR*gFeI(Xrh+sx~2 z4257IW1hEnt))!bAvS#;mu(s&JY_ud*{*CJ~TF3vTA-s4ITac`ufXxi1w}Nk=t=D8&x1E!k@HamX1Y%HoRoe6h8unLQFB% zxW~g{iQ3cgPNaE&h0ffAPvJPKE=JZKLr7RafTF)V@nJNm8y|;NXxSr(dLP5sDnfVh zOtScTohn*(d}5@W%ijaTs1DDW`px<;3`?>>>rm*_k`GK65eVoE18Q?=-_N|w&4}R6 z{cTIngMfr`bo^{tXg7DJk+nK4uIzKARI>R$4zio?N!>VGyGiO-O!b@2_0fd_>C#~9 zgjoy7WgPp_%Z&LA7kHl+W*MF$PIzz3KA4AO56bV)q&^?^Wl#>lhEOG?RKlYQj8W4LkaRU9M>WU8P$>3&U-=>?}mvkrH?jkpY7=N(zq4(&2DH24lV zrs%a9j;BJrO}aw0x2Dk-fmuRpoJgGhpBFgGLb{j1NGZC z!Zuj_7#cBT<(c!9_|gldPGT6UV(BLmihg6Q(O1@=BvSLztspf&_y+}j+yDFw>+++D z?69=?VVX;?XY@vAdd02r@^yOXTZl&|pNIZ{z;Am3zT3Xa&Sz$KpWg?oEYfKuNC>q(dwvdX0IVats@J&lu-H(Hn0}gaqw;ZY}kfLGo^Ej%qOUjDa}f#22(}U zRAvXmyID7xuExnf$?glctFQ4)g67|_$k=4kB`8M2`4Q%4BrFdyxY+1A1e512(0`cM zeJMkY`l+-hQ}Q-h%zh4wpu|R9Z5!c@xl9e{!7q%ZW zoa4iZaIy}>ZHhOfaRTJc?_Q&+5ec>_p6V;ByX$_}umE`|qq=bhTVuQe87~%F4#JDS ziQa#u=gK2tsxP#RtFJ5SC+9}vPbT!~;HPB0oNA9_0(DZAeJ0sbTdEOCX{NJ<%XjPu z%Z6_CpXKpPu!$C8zTRdsuF>Ve1fgLy0w}LhFpTmZT+bGu6XY^;!C^;HDtN&knfl?} zZ1EFKs?VkSTp3mS&T9GEt>XN{>j^-sH1sm#%QP3`5^i}aiYY;9DdmPkkA~3#%V34g zt1Sb>S;SXKk$Pv}em1p9&}b}mLc z`LNXZqk%U@qjs4=21mh_tEVS_8-AlWzn@&KQ1SYT(fEu_<1C!naE0szGzET>pSw?& zu_PLcYg2PvCxz4)X=Oh9k(N^@XZl78DV)VFjm{!pN`89t)uu@-t$da+6uoUoM;9TJ zP4$czZ=gzXxQi;c4y|Qvr5%xSq3?d0vS{3J zO_Hk*f-4kpJ0(opd1uz|y#kWyUFi3#QMMy+365GsKcA&VHc5h@BF|=!HL|kx!x&i*P!fE)}p2G>o5N)UtsF54CQ!rL#9j;(6rvVQN& zx(ff+i+PpWeRwx1sf;M^NRolbk&sOfq9{QKF{<0PX2QP# z%ddkhCaW#Jl)JBpJcOL^enwTw`4|5dhADM1jzm>B-**lxw2jyS3%gIh5}?8(w=9O; zU!-_=@-el)EDsK0uCfo#)p$bvjPAV4HDBW+){_a?H`XG3T(IQv3;H#T8?NZ_YI=C8 zG@RVDbWC2?Km13vi(Wx2R*BhHb#aVp7PjF_;+i`@RT70%LQV?2Jwqnu&cm^>;ExsJ zQbtx=%Bf9qQRND@G&HiM8a+yBZN4O6TyulTHDm5XJ-5Le%UMVPR$gTtvCK9Yv*I_k znK3cnXYyWR?Axf#<3n|cSs;c@df{z-=>N5_AI-Y3qohJN7eb>=?Y8ju-{sRmjSc zE6WiwGNBL&?Kd@gI7jB9E|7hLMam8~iDcCf{`#p4GY%t7BIfjCMzB?;bqw8Gor{+& zr2xvliI?R6hbf# zT4$r)S-N&cIhZbEbP7O%t(DH*)|XGjJT0y6B8?pAObXk%*wQrsVm8u$B@u0Q3>S6a2ULf1#1E{UaI);3Wo5`sXad|JSVi zH~SE9=l{OOU+lv_BK+Mx{QpfO;RKisEP&MPY&>929u7_rCkNp2=H>*B0HHP9Mha2b{3A`F;rZCQ7#a^#L5bEk>Y7uHn!E7c=!Zx*?vEr^ClYxA}?>WOlTMz442CJ}` z-R2~jn-8a_$aY>Y17n^CGb~2*6m4JG?b5|#&tP%Q2`Ae<12>Gnz*ysxxR(W+ZROSs zXwizf&nh6BO1`sD@EmyPSU~>e5dSgJSi{zAn8VCP*SQvc7Sb-9PxwudjGGuGs&cp* zTl&$J%?<85msqJ9qQYMY{gW^-qLE?<1FvpUD(K%(@{y<1#i-cAi9L5sxjU6X95(fT zfq{Vg3IX<(-Z?;J#)V)8r=Ju)pk9+qFQy1h=b#%v4!f-HHU!4PnbP0KD zH0Aa?5XC}Kg=`<^aQl)HwE0GUcMmvxK3N#S zS{Q+t<SU@w^eTL7kB9nQq zs)!FIKL_%_j(Q7=RM8x&&}^70{-NIGIB7ZT%T2*|ERqj=7j7=ACxp(dLJ?5v$h_5>FY|Ar@#45 z&WVIH$0C40y|LwXct=idqTmERmcWjM8sUSK)T)=78Ii)rrrr8^2JWdX>T+jy9QSpX z^B+H(BggJZZQjw+%M=oszaAQ~WS`eL7>Xq#ll!c}{doX8NcEvnjL(5TCBVQ+p(=3E ztRBas7V=1%)XgOMt~qwrOV%fYU-WBgN>k@ms8yQ}N$+^oy6(2QZw0K+2;hC zk?At^{YNVq=nz+O#)7aqUhqdbtXTKR*~L*1+a#~%79lotV%I!e9Ok8p5!%&aum`c+ zxMBf2Ho8MCKjVct(x#}Cl&Gt+hU>aJDiW2QvXrIl`;vXhT8cxVYBGQl1-*X8`0gqC&IDE6MG}h zo1DQV4C|=9IJUKUlSc-|=+%L_9{Ta$d`vgl3r)#tI=wp7`Xf=_Rk1)R-7D0MM`25J z-z$Mjb8X(4LX=s}ryLQ@gX^T(=$k9aOR=^G*DLxvQrjd2f zV6bNzk6#|CWmmx`(WJPdL|=lJ-cu+Ya-W@6E)s_{>GLKn(&G}uy9 zW)5-KW#37TwYgv_6sn%SU|_l#!x(s_l<>KyucA^+9$TvV-D>Qp?&cHg;wbOoz9)&jcX;!w znc~DNhUV+AxGSq9?c)3{VozQ3S(|Y3s$Hvl!t&M^Q^7mKv@~xX4C9eH*>;zwq`o?4 zNly3%gD>aBj{6i?99AgmgqA*Ee)t87Ec!e2YbqZ?C($BlIc;@$2j-5T*{>x}x)`MTSX zUAOl2);Vh)KRc#dwvy~!5$~Tgtw?%fQLs@tz9chmS8Akrv)1KB(Fc^y)M3lU*PUPA z->Wke*Lvzs%DV>*Gu)8}R9xalPq`;w2);Zh*y;Zq^QrZ!dd*D#qKWd3$vtA+ZM$*T zVuQuW-NEld!cc8BY2$}Q8`Fdw+fzaN?F zvPCnvncWbtbzmY(y!38;M{AsY-;Q6>{Hl3)^QA8yKkTTMb$a(W^|0vi^|lIfhpWb? zKbs5NWs2*D9Xk}c0cXXd^7a0Dtu(Lce!eQrU?FeQW1-UyZo2Cwo0m>@qFXyvZmj=l zR(9gP%b?|xXIl5oE}QX9WveVQaM&--o4&xHzbWmEkOt<`+N?sWk1MTq#5?QlGM3D+ zJ`|vOEj{nSyR9Zpdz^wTt6JYHKHIW`r`~h_8!7FFCvRGXtGehHmoAOaDdp;Iw6@)) zxv0tgmZSd^p|s!IcCvrfBj2ye33`mEPhAoA->j)t}SIUADYv^9B2zrrrEcC#`OwuS*r2yfIX*5}owk)9TQew86f4 zdonO}8kPEmH7(+E)_xXuKmEz_5U-c6tCZKnBB^6dTRWdl5rw1jG(U@&Tsrmm-H8`z z=j0u(uJoArI4vF(u8cY#t;u^u>9&2Hw>V)ed`+duZuzbb7h64!L&5uYeOnnVSj!)` zui6yWDV==tC%J2mSx>m6t38OjsqDBYt5ncQIXJJ}yr9)&HPOjp z1zzTePEMqWX8XvC!gD8ERk)uAN=MuY$W=JZzqrI_`2Iql-EloD9?xUHaj5X32gi!L zeM2S76Dlt@E7ydIStkrcjV#x>b2V>~a5Yz=&K>m7GcmGr{lY`|ZuKIvL;ca@z~N&> zeFe6K#@onRK~vVtiNeeIU)_|v`63Pb2%@& zPRLCKE6N%g#|3fuanvSwb)?p$4wP%@94pR@uqJm}%Y4QLMISWKm0wt|TA%dc#?4Dn zN)Zy9G#8ahxW_a)CX8|%2z<6)VCmuExgFQj3{EX68?q?j^m%%cE7@pE=XM?!$;}`5 zq`$|ct?ti!?|p`S!g}TByTQ?75XZ-=CzEvm$89TZ?~^`X%H}di=(+oT#$A-VZ8|UM zyqNAGZmS}J0h{|}$CcA#B;-7w1-(g~7+9aKZ1{@Xy;rwWJp!=Gr zja>7~{%N20_pKSS)FUNe3B<75D@)zC{hw~l0Oum$Yy1Dx5fK@1X9nY~8CY3xIR*(V zr9kL6v`UsmVaZsqYzAjTFd%##NB+x#j^y`IxJMC&k*%*3Ph3?Qd0}F5S&4_^Zs%}SxUI-=olT3_ zul9f)C%S|l$JsP{`VhFo?5raplA(pmW_5xc+X>-rpir5!oeO?gRT!uI(_7n_OxlNPHOP^&OXu7{Or(#>ve~A_b$RF!m%Gb2Csfq958k-xrHhIFOSGMd-+1{QOD#YhgaBZ;Jg#8Zj zN6!-Jx9kU!J97lz3HbDo?j|E3(mX^C$d&%bxObX1QpaQMg*z-M!-Mc=}i7d$aLzTOk8QGX-x_-S|Z z$;S8_95$Mm?XCL*vL{k~)UQb_vUE{Ye8IC^T8?YM$o_p7%Wew}1l69%>^_=*P}3#v zUZ;?*Z~iJ(%W-a*@P0M^SBGv@tXVMAsnp(Xb3PSs6ux?o@8W5h zFZfan-|NhIA?4aeiY*%oLUNxjU);Ov*2T7>ZJ3MdEsswI_Hftm^$t8ayyE%C2%`sH zVc*u>f9K--vR=-{K4|@^vCXSvM^4{vFbVL>=`1sCH?xkq_?c*)(Xy>KmtFC5Q-goE zlaCSMspDKn!MLaTL<`YI!40;zg&Vi`zpcn}PUd{};iGg|$t5G7(JLF}&i3vMaJy=L z^hmI8lz+(rTZgM}D=nvDJ+z0et~EW;KiPg(Vk0Tw)BM|>w+wrebgHiD=i zEbP0qxGh%$B)rA4TR(40`&=YERP8<*Ne*(1N$mMKNATwJJ;dG!d!wFBag87Hiww2$ ztTR$K=q**8`{?Ism7v`meDAguJUfor;J4yNp{PPth4oR1DhG1m@`ekN0&3sqFH16( z8&!24dRKHe{q*Xrl3fQHSC(YNFVKy9&}3_P#Kg#ce$N7)Be?H;b`x{o-9IMzCF*XH z8<+i~wLj-x&~h}$d04gf>$aS>GbMLjpFQyZ^hrP}cF%UBmb@Ozy{|_zYWV*mnkBZ_~@XGeqp5S`b|DE zhhNOm=e;^~TXI6{n(x^#JFa~;6{9Ur+Z-$V-*)^wlOqzgJXylx$x26*UstT_8LL_! zx$>1q>hy03?MZQooB1~0A}uyQW_@yJ;{71Lp9V{hzxj?@xwPWGkCsAmt-8BfX0OxD z%cYkcgt@N8n*L~baNv};%b_K?s%2+kCqP9$MG%w6^gSL8Kv_Q`D9nXt**LXg6ep&sLFQC(B z#7uL zxIIk>GK0G_TSCLtdM6xK0(IO#BRXnci)#tX9Q9=Y*3cw;x^j+PM}p|TxK165-M z?ZJ!H7L2<}TzozE{@m)1!)oei3_Xs-`~iI{DJBy1h~Ca-0$!WW@!0BTwATI?5~Suj(aj zelg@5o1oq0u*SI4DaT{ZP3}1w6ZS%>5tIFnP4KqwCA8k41UUrLYq=ViM~SNYWiIT|`ZWDhHfuT0by8;8 zHmixJp?r>uz6#&JoU&SrQ=(_h!^l^2By`BSmAl$_cCXRI##Opi$;Jg;u25Mr zrmhs!g@gpHkoZu~5x3J3pL|G4ZhCr{YaF7OIlG!0Z!FGFa;s4hPUd$~86R^X2D~?# zBP1ZDS$mUcr<7+`Q~C3=>DvnXwXZG)-%auCTXo23^4F;~FBM8+tKa|hk7}PfAZOUzql>eRbd`Q;iE@++#qYhiQ8bLyYh9}UGxSU6f;bb| z4aIC`rw6$)4%xkNag$kJ`*w34aml%H&i|UUxaf%q!v{f^I^v(NnZE#Q7g3$avCc-X zVq-#R$cvCYSB`Eo-@VL0d7S}|Z>fZs;8DYL2Wz$Es>z{df#pQyE0?z1^AsIh-L#kLt4S}dDfzl=-tEo83Q?wu zI<7^S&bxBtmgC->btOE*0xRR^=<#L<2sMdyugl`8MQ_`YAt6>4ze8gGsw{q0Px<@^ z6hs>{%AI+jdde zWLJ>S^grlJ+K=6s!1i)o?)ls6RbpL$u5^dmHBdoi;nikX*Kbftk_q0@51PZ zg(v4r^frQ89FGCDI4&(F*wqO7F}Glp==xOjsmR9eBER|ErljpyZWROhGwyef>4>}E zJjfl>2#f~z#nUN1y})RA_5ww4Z^?f5q4Bow$nsw!=N6jAB)8`&&mGF|f3l-$%iV@l zzt&}DQR2t1w$(bx?Yak^l9FBb@wVpz!*!wxKixIPhm8lj-rd}^vwW(G%sIs8;TgDO zXSwc=!zNnw(;D9{lT7qD%?n&n;RN|Ne2azl}DnPLtJO#FFSwTbD&GoRYq028f$6&e<3n5_8P8*mood_Qpvs3pm4?GL1efSr`x_9nC|J`W-2r1!Goc#TV)Ph!SQIgc0MbvZ>d-9pW@C*4!EQ8A^-j4yWp4=U$QTa zFFax2xTEk&mqpRA!l1WIVrlIcwVU%Q*JhU47DWlkIcoY|TiISKYgdS$e7#TL{jYoN z2J1}8hi&(V<(~SYF%h@c|ITgaW5Zo?LCx>|yWg(WZ4tk4aGgPqUFx{Y!v@()nfsR{ zIa}6l-KM7+q{s27drQS|c!^80xzp70<128rcscE>sgrxE`$x31#QI!!B%Eru8*fos zYV7$#nm1*tao3Im{ertTb6++Z-0b;4RWK&`VacJ9&dW1~F;8ZS;%8!#>p~S=<5GV; z#_iJzdbZ~I%i-~l#4Ehs7YtnH2My0ZdBRY6Oa3?Q=B=FSlfoZYBI3smT ztW7)h%nz6K;kpa=tQr(J7_)gty}*_j^*1x38v>UV+}WvYPuOZ1*1JDTx?aS&(Dil6 z)y|UXNpGLJrE5(eZ!TCJA8kId&!S9HrL&(DHsZNxL)Ellf7-6pI7F=)RJv77xu03bi6ld z>so4HRPeR20$9|i}o6n{fwEBM=LoUy;(0)68 zwMJc=!nfqXekHUO&%8VbC(Zxot#{hxj0{`vl%kkx^DnlC;mdPbf(+OmhR*5Zz%N4serXz@c~?9^7sT0>J;Y-TMFI>YSoMx~%_ruO$%+oDGy12yo%$|FS%%FrgPq z6&EU;;g(N`h~Y%5xPXhe?Okj^xwJ3~ReN_2Ph~rEcc4aaLAN>W2Z+_+L>t;$dD?-C zO2Hv{3NE&rdstJ1LhJ3=sjH>ASy^-U-n|$ZPofcY8N*Ee6N|If$47Fev3Q zSCL*BaJPoNjg2+9Bo(?^6}sXSEe$STwX(JWbwZ)-{M_uUUBDd(zsY1G3T=)8XZB|k zlF2BvB?@hYLW3JzZBS@ikPn5n2NxzVWP|QEK|7()&fo?UhC-n0P0+3=v>WAOlUbG^ z;sAvPH<){%(4OE6D3V?)3^;#)_69Ui=qwGyY@q!>jEn4V8q?*Y6eU6mFh=1iJMB;> z{r~zOYDv)l|MVYJ1Nt{sfBVgWp3-#ox>`yr)7wV3NBapO z1NtT8_`(eu%HA8 zaNDW(?t<2nk_A10KmblHa5V-n1K`qmTMrb-4FMav6IP6dBD6W$5^aUHM%$om(ROHi zv=iDH?TU6oyQ4kOo@j5hpE#8_2!F5!Fs7bPVKiopzD5me7h6v|;6{{@0di4)0kPhYHaNafIV%~L!BZ=Hc9VKqtYm|UX~USwmX@gzKeM)!35E6x z?VU3d>#M(b2vm#v)xPVGCd}~>^jmaX_(Evd<^GVE$kcrN$~lTk%M5n!7F6I-RqVV~ zEHg(>FeE!miQV~tA)EiIknHTu7xfLVo?sKaz_;j>x7S9t7jm+}5qsI4wKuKfI&RLs zVs$xJ-|l+$2O9x+@UsWSO;VSYfFQ;3w;n3RTQ z*L2e7n|nM~^Q+$y@e^Wy(mrxv$y9QdX+?Tu$VLv1P{pk6{Sz&Tqua9k%sWUN{GU0+ z#ICc+D6CVpxZ<+xOhPD|SV+}|*d1)UGvwwUxkZ{Y#;G`1r^y!n=r7^Tkg|jQH&@?P zY?k0}rVV9r#it;uTdiyL)C%mj@2}ZaVw*Gch%{;z0EFJ&6kV8Fstm>MS_^`wwf)_HR@n6m7iM_PpDq?|K#QK@K%P)yrn` zw}=lp1;|xxPoHhv6YKnVa^8ah&ojB`o7duBj=I!+Eb1*aJn}Aa(eRg-LC(?oiHVo9 ze{dLBu31;Qwyk~1$ig5D_SxCUWe0ZIdOdTzci~vx6fV&AppVLW!-%!$A^DDksi~jk zMT(!gBB~dBm&`9xSi!%74;Q@Lc>6<_bFoXqQ$mIBMZCDA@RC9igzvrg<$6X0x6>q*3Z3vi~7W9n& z{mqWWs!>|rpReeDLQ8RcTy|cv?Mpy=>!F%r6TRB{2WhMtHBN@zW8KnwN4YL$C7ZV?Xp7o;TpUxa?OE~2Y`#IuwZ6mUJ(syu zh15ALGdP#KZFU#;8N@ic=_;y!v8@cm3|G*c)>8|GK>#wv4-6gg9S57SX;<#Pj)a&Ta z(r<2-znsqYyu*m9_`c>LMt?hL`GEUO)9uM+fzwl~A7elIj=o%1IlVaZXnf$WLOYeJ zmg@&5%mPhr?yIv&iwck(G&8A|&v|{pSL~8M|KU*Ciw2=`(#>XvHyD-=>({@H74ipX zuXTD~CcKoNyY|cBupcWl?kVYcoHS~+-YDc+RzEsVMXl98b^H4i%fd6~h)RA}trKF} z7Hm@2oDQ&gkSG+Y9DQl-`+UzD*C6gmu?FGeS{k@RMR~%H{MNV&wv@dbO{-Eo_LY6@ zg@?kr7tun?&RZ_M*Oqqj=jrut3k&-f4l78$x9pcLEc5nReD_v#0T=oD=U91iz_;Tj z9dQ9VWo+(WZz%JICuDqcS>Wz!WP0ZPDZTq=KlL87*^n!km) z@a5X9ojzhSX@t|E76qB3v0JfyqKf>7l1IPxl`YlkI5(CUXQkeU3w_e~Ys;?-&$f5* zhuqTVwn!3qpCE@?+~!Yudb1$-bDuf;jW|m`jO>Hyu~+^2Imoby;;8rLj(b0RWb7~9jg7+t^<#)W>x@p^pgSKT#bV=QwRykfl?TA1#Gdro8 zGfL9Z&5g^*M?7P+iw!ewH`y&P-8Zqy{?Io5mv+g)tH zN6ZfArVpPTea_J>>iCV*Rt_JY2je2I zRXGd-7jAXfsO;&Z5&a~5!H*A{+I!YuJw?`$YIG&m7L#!LHkzr%T1BzbAqDH+mO8f8 zuWosjd)jsUWMj7NZmbzb>hYn|0pfNYPq_rSHC5P?_FwebH-GEP^WS6+Rs9q$9q1%~ ze<>P&P2{!QxyqDK$yYkA=Uo--S2r{?M_J!ddY)7ref@5UzEd8bde;uc4;L?NDwZnq z*L<%v6t1pU+A?2`XG~J`l5+9S1FCKr4R=yLw!S^F(qWI{qjU}Z)aRkyt1H~aJ1$tA z82s>6T}#mL)~J5Kn|{8R;XA|69Q5a_(Q62L;?efNtJTNBL09ZWf(Qzq;ba{xvf*m{ zqbCNd9d*twz3G@)N?!B5X47ConQzcXwpG?|g$7O6v?->ax|#Oo%Un%Cy$uU&&ps;o zl`E9DQ+ch_Duer&ON~#y?KQn~C1<9hNHk|jG01d}6juhrL{ zvwAXcQ){=_u}6(_%$9mQBd4uS4nHFhpl+)zVC++nygE6S6a8}j=fjb=6`ITMYd^7F z=T7FSSuw4U-##bVq+z1t?StJ@B#DZzz%CqDZ>x2VLXN(>t)sFU9JB*JjT+@qbUED08zW>YHPgUe4H>l?7X@V044Ubv;?kQ=&cqkqD~7-6|Kp_RVs zIZs>PEmTxUa#-o1_mf&+&58l>QHO*Ht6ZDnG1>3&kvF*pcWHZ6<|ZDw z_o7npsmfpFS=ET1l z*xH6YlOJ~~`h~LcrUdNhYvm)Z&&_I6UcchMyS(^b#eG52q%P+`@n?d|X^n-_v0e|i z+xhzFopTu4_2snaYZUo(?tcA-C1R~8B@@d;l>7^maMCaK_>pjjCZ{)(hOLi1zs7b#(@Sia!_RDgo6w5A zMQEOh`#!EQJ^8{lw(SEt8?T&Sh5q^Ld!#{MMAU-$;=|h$ z5-y&qJi7Bi_7$R@epHoIBF-kkB;Cnq%w^NnCHG^8lpbR-b#5u-L@)3Hkyf z7sc-g<789Pvnyj?E6#k}8RqA9@tm}8x_bM=l&evwk=K|ot;!NZ|2Ct+#Rt9=hZx*Q zPtp3yqZpOiGErKkp-qmo_*qO!EYrC!SZQ5_-Js(fGHz9zZI1@80eesnwJZe;ow-*XrCoolfY zCPnM^9Z@dEsV#0PYaC2)>5Y_sk6xN>?SF6ZY^DqCdq4!Ob70MBM zujkg+i0ps3pS_sx_Lq^>l|31rQN$7Rqz@MYdmYQzw+RY=auo^RXx=dT|Dw!T&ct>2A2Yh!|Zx;BJqeQ6RoUFdUzXXsVEXqaAy zH#-M@+#>me*rVu6Lx~^a^?AoCR2mJ8T^IY;)bpMai#zj^T`x1gt>IA0dfTnvP5cED zHwQ}B-S}>17`=h`>AG6ql_RM&%`0n7yY&+y4pcW*CwJY}+kmcb6RzP~`hzGlw*U5M zK!5pAr^nU?&G?nM11qm(T=5Fj(d|8A@3T64Tw>HG^SHJ8I`fC|{p+s37ERLTEzwv} z`So_9@}updk8zG;(FG!5<#ETg%sJ;A*YvHrr+rz(%j$ghN$xedmVz7a$GCVGI{qLT zbm#0ouj^WP&b&%ouBCAGciWby4ok+j42`O4WdxRfXu^dqyvz)N1wiu!MDO7#11 z#=x3uvd4DK>$7q@=N)`7(>}R9=uFOw#J9oCy5EkUH@I$ETX@>4FVI#mlU+ik&`Qf~ zi*!b8P|*wrr}`?sOB&%X^EREWBX0ioP1fK&-#wA4T}DnH`Sa%q`z2g)^W4^(^sK!Z z^CP*^=caI`0Y0l#_CdjIp$C=R7FLcA(!9(x-)G;Q=r-!95_cwAxX;V8KRQwz5!IIN zv0KDFqJ0<_>=aV^k!ba}k0WX44dta0KjP;Eym(RL+jF^I>iOr>YaOfBuX8M!7#c-u zizIDdA?Fz8^6hz4ZJ0Bsd@mxJ5huR-3z@#OR#Si_v?M4mEN0C{%Vl8kAr2 zCONx#s^NOaoC5FW;*r2Li}t_gIp>(7nNgn}bRpBE^~s{9T=2X{uAivvbvxSu*Kr-8 z9JzA*{2B97<>|th_t+TW)&bzwEsexBCNY>WJHM_E5d&aKk z+}|DbUp$|G{m9UZsEunjKQpL)`s(|qZ~fZj+a+7JYN#!)emEzxYosWR$GU#k;hyB4 zx%dc9a>0kp)G$eFv0z}Amf>>m z60Z*N0GGyvc`@CZZ;CStRu6tZx!(Uqfs~}ywYO*cd<2Y|{jJB}By?{+n@Hqx7rr|8 zV(z6PJN6%8Z-lvveW#Y#dMo@e&+@|BKfR&#+WdL_=9rsZ7HT9bGv}NS&e|Gyxg$47 zhnwXpL$7U7_czH_+3F@5;B#Jdu5eMqL0gex<2Fn05AV=o-4Y@XWSW1dk%X_Fm(6M- zW)|Ol(PzSb?$F5c{Vj8>+|`#@?TgBFd|mrdJ*%HMODxMj{I zGw^i&QmMuzp`V}Zn_t$Xw<51BXr*|ZZQOSUVm<%mh1=Cf`hLD^^H5kf<-J44erBPb z!03yG8F}S;oMAoJbt7E{W>jK3Oe~}`?hwzrE>=>%aU~-&L@g*O=0RX;T)C=VZg3LdB*0mieD;5#B$lA3LJs zNHn|myfa6^foOK*GttFl&iTzB;^!;0hZf3pmXCgE`&oN(Tk){G%==KEDU&b$^=lqQ z$`~zw8udQ&2b*3#2jP`pica{M54h5Hw#(HbSC_2KIsVL~X!!i%yk1w!4;wWJ&F8~E z*iD{Fv3%dvk;SuTx8+aUeKP#m?6jqXD35anZW{)zcBFS;uG*V!Nm6Rl-(_H zQoX)X)QV^CAyRzUtN7ZCl)0S)$6m{gA0Ha4NH}+0Z^`xG*ROqtGat8Ce<*Gx%h(38 zP2N5|n81o>G}k3q!25#HJgx8<{K%V& z6{~!U{3`8IidMa1d&QrrT_|bH*5NphToIm?l+2-@-%RRhl%=YAzN<)K^Q))o@^7BfS-r**CEwSp6S8xUEKdmaeJy>vj$|5XU z)U14ee!c(8y=M6KJn|NHeeO`qWfcDY9mvme+M6u7&| zpXg_@V_AG?nsD>c=j;heKI=24=PIVv&Gj8p*q|3voH=FV+B)|~;rRzPa zKj0IM&19bre}i9Er^Z2A`LM6~WZ}V_H?0=A*+Vj08t3fCJ8n-}al)_Wm5lah#fp0^ z^2TAix7L0Cp7Xi)$oIXr1yQ+kKPfdXnpz%ATCxA3@WK4xymplhuRpc-`kD|!8{R1M zY?QgCFs*p#nK}Ay^cCEtz|KdudsHnY5^6^7CW?pX)M_c;UMcG^vWMsNvo%3ObsE1W zdJmi~diRNiMMWMI*7ovrvUjoefSlrB8wv#4LYoZW@GrCvg~EX7Rmv}AS1)L1f$=;q zB_Vz5VXwU>@YamPA2VuFb3R0PT`~ly$Oe*Ju=7O)~95J*op0hu1rU{ z+MwvCiN$BPJ19))WisBcO}%E_)kew^>`Fjy`$@}C!ghfUpybr@=o#sirR~2#m8FRZ zudI%{HP~dLtAti{#Kszqem+!8(-pkAXAZsH$53a8H@#@aIy=uMhF6v;wwtC|>OKfX zv$PQIKU9{sn@OuIP3zRgm6f4!p)~I7FKXjTVVGK%zRM!E+u02~C5Uo$L3!F)qxN{3 zyI7gKTQSJTI7~CjXHUr};SGQwqLf+ST|JPm@NVem9S{Xtf0Q=qA`;;D#Z zz!ZfMq&?pqXtQy6Nk`Pu&3TJw18hXHqa|)iJO45Mzhe|R5pWdNpy$!r5 zz|h;k1~fx&lfp7K2&FuVEZ~(zH&+j9D-`s+;_r5#)Pi0~#&&R{rI+#q>EV(wf|D*8 zO{0$krYV6{JH7dgqd{f;RND@X9eFi(WaJHbLbGG?>sU zN2?AE4Fno;Xo?1x;xj0k_GTq`2^2DGQnE~nrXx~J$;!$e>dPokSCp}ny@fRW(FtjH z>qB1l?$*wbr7`_2A*DvFn!udKNy^hz3NV^|y+VqSku-+MWKjg5GowilZV;e@jzGg7 zTzaa>qT`C%GibPC=ou776g2%=NDn_3S2quPCIO*B>2+dk!aoW~X95?FZZaV((1oKJ zVW??o5M(VJt!Wv>p~LtuZRY82ZqM9Wbg;tl_(x%=Ea0Lr!kR7$ty@E)&;UCt3hfiM zW#~Ypp_EJmEzLeNn**lNmq70uV!LTCp`Z-RoxH43N|qpm!vh*SEv?<4=X05W>kXxm zHm9Uv1TG!(a8=L|FGa}+-js!yLxU`ZIWv|SlSs=lVVNQ(9XB)`foC4*SOyP0Q2q+n z5f#hyu1nJq2-#ui$>9AB$}d_^X3`O*1PaJ!b+p&r+#8(mF?aftf zi%&-buwI^I;Dir8#Pg4N3 zYcVQ--WSF8fDkJ%i_|d(eE}xE2j!Er8~DUpczV}@cLr)kDJUaMbe3P>f;09pn&710 zGaV9arbBOQn&32pNEMufnCVa$QJ}8s>h1&PXQ#qmp>`AoB!DNjsUwxxc6%!@R8tNH zf^PpuwOBAF`zPhl`xzV|Oicc$qJK;UR}_78gNmaoiUtTsQMBH}T2VBt&}Kz6bIGVE zdVdtt12cP9XZis0M@6|)lF`PHe^L~^Kf)D7WkMfM{)DA}Oa)gIW6z~4iUt&*C^Brq z$lS%i+hov4!l)X0j|Juw46?4^Y$$7U%J7k;MWGZ-M>^90!pIlak?dK2gNaO;G0<7l zL{>x(OKj03+7uxqj=KGHN5qaAE1afTghDs5Dh> zIKpU6Kr>SmVZp0(FuYN7)8YHq+A`OQ%8H(m3Jh8Bs2r^cWM%$Pmsd)PPzPE8(blV3NU!aIxrU|BWtL>KmAl7g3h_3??`qZw_M9A-^F_ zOzK)dmijs-%~>f+x%(ctE@^84M)wJoC#6YsTs=JOArGU8n1z=o3OFfHbPtJ%I0}R- zyV!ylc(CM$++BvQ?v7x(2D~HVeJMcc@)>{ZzW%{*%3?CYOSe!)wTBk%4Cutny{47ko0zUZ@nh9P0K~(76s- z+Wnu5$0DdSdP3+}0F+W}hpVL&aQ3=;ii2Df!-^97qho~8jRmErXyIR`2jB-eD2Vt= z4!R!+N=t#vzer2vOaaYbQiI7S@C!kFDUJM(DXCm3Lp)0CAE)w^G4>x*L8Vj1r2p4A z0y7I<(WH#cD6xO+vrt;f*!(Zj0x*KqG(<4=BZy3Ect$ccJ*|DI?sX_7tr2Ja?SMpU zsabb0l#JFUvozo$22`5%|FYJk=>0F>AucqH|0UHwaiM6Lx;=yvW4+%23Zm|c{V4%O zBI<4#NW$8OLaE0ezCi`h)c%JQf6GmkfYv&HSaQ(vGpurckMU6Hw5I$&T!adz0p!1Drr;91P6I|upm&-R^}qT#p&HO&^nYbRsRwn-3nd1hEm2et zCxSw$`(pnxJw?mZ-4T@7?_EcT4GlQIi4-(aH?&YiZFc7{SALIhfkDFhNk zpkbFnAVUNi9RF`qF^BenrQ&djfCIAndQ@ktxvttC5 zMfGm{zs8XQBC5}x)idm%JX%w+T0DcVw01*${gWdAl7QB<|2hw~j#x8Q~lQd1y;0F~m2D^65(@#8;}FLy{qmw1!50 zq_i`VOf8Ap%;2oGhP^Xb!N3-6$ol=M1`s#q1tDa~=?lUgfG@RvXrq1mQAC_H4!ZGy zNW@4Jp_;pRIXS_yL&+JlV`%tiVt^;gN)y4o5v&+MlKoE%Ae1vPpj?-!hhnM$7E6*Q zkic|-g$R)8`JWg-Bg;QB0DD~01Pm}~ENTGtvj2$z1Z^e;v~I$z12S0}gyxZ0)PU&< z69@&E|H=UB@QgK}4U0?_AYf&sWk_IPL#lx3CJ(3r|201xht%y3W)OhKIi!i;1B>F} zDEyDv;TU9<9bDB3UNZr+a2CbGA^2bOBM?aQ1~91~FC!z32k&RFssI9k|CPbNLLi<9 z9zr1igN;-HQ-tXs5%@O-a0Jp8HcTqO5OC5&Fa=^!KHLue$Lw(YK{ug5Qxc})aWVvH z@bC(&;^6@NuleB!#IUl0e=+0~XFFpD{?7~$7-Xpd0(h*23|5OQS^$B;|H=S?L6&0? zURD~!oUv+z*$`4_e}aO+|H=T4L6)sZz(K<)3k@)Zo>I$a0ir)=hhvZxgo)sBA2JSD zcVq)lk~2c!zvhQy5ULNX2Y}8eO#s(Dvnn2L1X&~SFANX}WM#zuRs%Q!St{T!6@UYf z)gbnl@|i+Pq4sAr4E!xW9DcL~6q615TYk6=WI37p8v{53S>pe13=n3J)jZ^H4B!}q zZjJgcD5N-q7&`&0HYAW`q`@vDt3FKe2K_Jj;TUAu1_aQHNi4@vif@Ur{QsDr;z?r4 z&r*RH+VyZqD>561Icr4!D}#T9LOiGe0T0$^ENXy6A;c19iT=g_fkKw!z+Y;BK;eI7 z0JnuKOev0tmBx{P)0Bk<5SEZ-`F|b>DQ+<)6tHA~1#hvDz*TcBY5+HdEMbTvf+;a{ zi5QZ>Y>?wDj9AqG_`{$%H7gxZ`Yp2vECy2|&;bb#wz62%0Et5u3?UfW#pS24GuT8jEMSFrl~`nUu)N9^=8w zhhT$^Mfq?XvKmkcp#B&F*c4`wA7Knx6^{id0^W9(AV9#7l`$fKAssw8!Ab(AXgCiYCBcaREL3wYq%Ac4s(tNd^j zvYJ-m!K0nvno3q6qIjGcggEfRFNO?u^pF)`dRF>R3*^7$ z|5q@Co~9yUK-E}O;9tS;Zw!zyWP#(qG5A-8@NWzlamWxRIlJ?tYVXOk$AhKxbvka8 zygco|mD6H7%)RZcP)Zi==62@J9+D_EaG|ubA8L=iwWB0zubr#2xd+P7-V>Zzrk!FD z)3WxN4LqJbkq18S@v?9L+xI9j@ONdf{SVz}Ev8|<*V+i>1A%XyeXQMaC<7U3FuMbp z)UEwMAT9`voGl0(_uXOcX$^#t1HtJ8864Q#2AhX?yp#-1R7OS=Drv8Zk+dq<_OdW{ zae)flYiI9)0{_wqmP8qVBZknqVK9lsVen*GYE`6UrDZ|Tv7xnvtTGDN6lolYH+FP0 z2N!%>o1>sphtxda1LKJ~Umz!^4D?_)r_Agh6ah@m@hBVAZyM-F&>xh`ERAx*IE+RK z3xUz_(2N#FBSKR|7>x`C6)@AlJ=~zX!)RD2%m7BiLyI>U4Z1=eP9sB+8qDcHlrQL` zFdD^j!Dx6Wf)hpq)*C@1A?pk_#z7}y&I@*W5p@B!81xlbI0;0d2uZC zhr=T4hhw2Xuu?{pivx~ycwN9Vc8GHEIB4u*mII9Q!0y0kB*^*0Oe4r3+l_#MR<^Ko zSZD(WM#DqFCNLTi*}lL50B>_JHbUWQOnJd|@=$a;GYvzTo5E0-ch3+w>13}YJ z7!!;}iOq%4z+eDR#{w@Peib^*z?2tD2KQAVXp|@(SUM6EG{r;%>p^Jo2%{08C|M>N zaAYC$hsTnj4ISomIPi`Ox}CkHEto zkW+v;9YzKU;)KzVc9I18ARKFe#)2Onio#~*2ck;g7$RZ8OQ48!IE2k1VewGJ5{w@a z3jSfH;XzM=(}*O5{UZ^Pc8ElxEL52Ik!2vaGjkbauWn2I`V4r5LI!Sk0gV!B%$yf=U|634>A=nmybK}{ju&vt6hJR59SF68&n>`Yh;rb`bKu?9w zkuabt2u$L^@gsQq;=vFF>(d}37CMQ*BnR-GL0bfH8lt~}Csv?SMX+>0I0TJ|zz~>q z!sij7E{J&vph52!!^=R}SSTHQ4vfKrcuIu4AT|=-Mj#!cjllCK@OcE_hnOQlG(=y( zV{!2D4Wt9o!R5dbpvY2Y{eg~zOh<&z;Q&7pw3>wF1r`-agH9AMrvuH4zy_Gw!uvTM zM>#bH%S#F6gwb&D@d(`Rg-6&c;MPLe7eIrraX?-c@`7O>fdd>FVJGn*HVdH_Fhzoo z3&2STUoU`b`zS{cm}SFbp^a=94fIw74dh19py(KQULte|1jdhq>TmmJMp1E8Ci@pz*Gl=?uFcXBl1U$085um4xV6uTtDP;Y?tOk(|jQmI% zQh!7lr2dG&xWn@jWs!D+NI5satOFtzK7RrCx8acTg8fZIorx^)Oe7%fB#{Um%7B$i zg0H(lxnwBP9+r-b#4ZW!)WXw|z}s>N8V0E=5(d7W#()(G5?7#lNPd)naHjf!jV^?) z01ZB01KW}^2>U_+hpge)05n9o1aQz5nT`@=&s-OJ*{7lIhRjQXuRnlZ5bJ3SC>8E!fM|&M8Uc)Da9n}NV8mDpXz;Zk;0I=Q zFuVX7V(bAX0?`KvEXFcGL+S-fK#V1^nfYYGBEf@_s&jwy8D5egU z4onabG~^r;cySSPU;-Xc5qZHNfTSVTOaP@&z$&aRWW@S|fF~p7Dg@x{MwClH&N~Sp zSR0{J0_CJObGe|SBh!Hu7rcH19AaE004EAE9Uif+0K+t5jE9D9gbu(u57FNUU;shX zg@m;C1hD9Yrz0ZQumrF)K&C^^(SZvJF+Tt_#5x{KH=yJ6%sM4v5o0m|IEWB(uo&Zk z3Xrymi14Xm2*9O)XZa#sEBl+GyJAO*G4#5yK_QYzkBTcttlHcXgzS1EecpQ z=mzcGE;g=!3hGMv1?^2LfOQB4V`XV>VPS>G0bhoVm8`4::iterator`` is almost a -random access iterator, but the return type is not ``bool&`` (see -`issue 96`_ and Herb Sutter's paper J16/99-0008 = WG21 -N1185). Therefore, the iterators of ``vector`` only meet the -requirements of input iterator and output iterator. This is so -nonintuitive that the C++ standard contradicts itself on this point. -In paragraph 23.2.4/1 it says that a ``vector`` is a sequence that -supports random access iterators. - -.. _issue 96: http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#96 - -Another difficult-to-categorize iterator is the transform iterator, an -adaptor which applies a unary function object to the dereferenced -value of the some underlying iterator (see `transform_iterator`_). -For unary functions such as ``times``, the return type of -``operator*`` clearly needs to be the ``result_type`` of the function -object, which is typically not a reference. Because random access -iterators are required to return lvalues from ``operator*``, if you -wrap ``int*`` with a transform iterator, you do not get a random -access iterator as might be expected, but an input iterator. - -.. _`transform_iterator`: http://www.boost.org/libs/utility/transform_iterator.htm - -A third example is found in the vertex and edge iterators of the -`Boost Graph Library`_. These iterators return vertex and edge -descriptors, which are lightweight handles created on-the-fly. They -must be returned by-value. As a result, their current standard -iterator category is ``input_iterator_tag``, which means that, -strictly speaking, you could not use these iterators with algorithms -like ``min_element()``. As a temporary solution, the concept -`Multi-Pass Input Iterator`_ was introduced to describe the vertex and -edge descriptors, but as the design notes for the concept suggest, a -better solution is needed. - -.. _Boost Graph Library: http://www.boost.org/libs/graph/doc/table_of_contents.html -.. _Multi-Pass Input Iterator: http://www.boost.org/libs/utility/MultiPassInputIterator.html - -In short, there are many useful iterators that do not fit into the -current standard iterator categories. As a result, the following bad -things happen: - -- Iterators are often mis-categorized. - -- Algorithm requirements are more strict than necessary, because they - cannot separate the need for random access or bidirectional - traversal from the need for a true reference return type. - - -======================== - Impact on the Standard -======================== - -This proposal for TR1 is a pure extension. Further, the new iterator -concepts are backward-compatible with the old iterator requirements, -and old iterators are forward-compatible with the new iterator -concepts. That is to say, iterators that satisfy the old requirements -also satisfy appropriate concepts in the new system, and iterators -modeling the new concepts will automatically satisfy the appropriate -old requirements. - -.. I think we need to say something about the resolution to allow - convertibility to any of the old-style tags as a TR issue (hope it - made it). -DWA - -.. Hmm, not sure I understand. Are you talking about whether a - standards conforming input iterator is allowed to have - a tag that is not input_iterator_tag but that - is convertible to input_iterator_tag? -JGS - -Possible (but not proposed) Changes to the Working Paper -======================================================== - -The extensions in this paper suggest several changes we might make -to the working paper for the next standard. These changes are not -a formal part of this proposal for TR1. - -Changes to Algorithm Requirements -+++++++++++++++++++++++++++++++++ - -The algorithms in the standard library could benefit from the new -iterator concepts because the new concepts provide a more accurate way -to express their type requirements. The result is algorithms that are -usable in more situations and have fewer type requirements. - -For the next working paper (but not for TR1), the committee should -consider the following changes to the type requirements of algorithms. -These changes are phrased as textual substitutions, listing the -algorithms to which each textual substitution applies. - -Forward Iterator -> Forward Traversal Iterator and Readable Iterator - - ``find_end, adjacent_find, search, search_n, rotate_copy, - lower_bound, upper_bound, equal_range, binary_search, - min_element, max_element`` - -Forward Iterator (1) -> Single Pass Iterator and Readable Iterator, -Forward Iterator (2) -> Forward Traversal Iterator and Readable Iterator - - ``find_first_of`` - -Forward Iterator -> Readable Iterator and Writable Iterator - - ``iter_swap`` - -Forward Iterator -> Single Pass Iterator and Writable Iterator - - ``fill, generate`` - -Forward Iterator -> Forward Traversal Iterator and Swappable Iterator - - ``rotate`` - -Forward Iterator (1) -> Swappable Iterator and Single Pass Iterator, -Forward Iterator (2) -> Swappable Iterator and Incrementable Iterator - - ``swap_ranges`` - -Forward Iterator -> Forward Traversal Iterator and Readable Iterator and Writable Iterator - ``remove, remove_if, unique`` - -Forward Iterator -> Single Pass Iterator and Readable Iterator and Writable Iterator - - ``replace, replace_if`` - -Bidirectional Iterator -> Bidirectional Traversal Iterator and Swappable Iterator - ``reverse`` - -Bidirectional Iterator -> Bidirectional Traversal Iterator and Readable and Swappable Iterator - ``partition`` - -Bidirectional Iterator (1) -> Bidirectional Traversal Iterator and Readable Iterator, -Bidirectional Iterator (2) -> Bidirectional Traversal Iterator and Writable Iterator - - ``copy_backwards`` - -Bidirectional Iterator -> Bidirectional Traversal Iterator and Swappable Iterator and Readable Iterator - ``next_permutation, prev_permutation`` - -Bidirectional Iterator -> Bidirectional Traversal Iterator and Readable Iterator and Writable Iterator - ``stable_partition, inplace_merge`` - -Bidirectional Iterator -> Bidirectional Traversal Iterator and Readable Iterator - ``reverse_copy`` - -Random Access Iterator -> Random Access Traversal Iterator and Readable and Writable Iterator - ``random_shuffle, sort, stable_sort, partial_sort, nth_element, push_heap, pop_heap - make_heap, sort_heap`` - -Input Iterator (2) -> Incrementable Iterator and Readable Iterator - ``equal, mismatch`` - -Input Iterator (2) -> Incrementable Iterator and Readable Iterator - ``transform`` - -Deprecations -++++++++++++ - -For the next working paper (but not for TR1), the committee should -consider deprecating the old iterator tags, and -std::iterator_traits, since it will be superceded by individual -traits metafunctions. - -``vector`` -++++++++++++++++ - -For the next working paper (but not for TR1), the committee should -consider reclassifying ``vector::iterator`` as a Random -Access Traversal Iterator and Readable Iterator and Writable -Iterator. - -======== - Design -======== - -The iterator requirements are to be separated into two groups. One set -of concepts handles the syntax and semantics of value access: - -- Readable Iterator -- Writable Iterator -- Swappable Iterator -- Lvalue Iterator - -The access concepts describe requirements related to ``operator*`` and -``operator->``, including the ``value_type``, ``reference``, and -``pointer`` associated types. - -The other set of concepts handles traversal: - -- Incrementable Iterator -- Single Pass Iterator -- Forward Traversal Iterator -- Bidirectional Traversal Iterator -- Random Access Traversal Iterator - -The refinement relationships for the traversal concepts are in the -following diagram. - -.. image:: traversal.png - -In addition to the iterator movement operators, such as -``operator++``, the traversal concepts also include requirements on -position comparison such as ``operator==`` and ``operator<``. The -reason for the fine grain slicing of the concepts into the -Incrementable and Single Pass is to provide concepts that are exact -matches with the original input and output iterator requirements. - -This proposal also includes a concept for specifying when an iterator -is interoperable with another iterator, in the sense that ``int*`` is -interoperable with ``int const*``. - -- Interoperable Iterators - - -The relationship between the new iterator concepts and the old are -given in the following diagram. - -.. image:: oldeqnew.png - -Like the old iterator requirements, we provide tags for purposes of -dispatching based on the traversal concepts. The tags are related via -inheritance so that a tag is convertible to another tag if the concept -associated with the first tag is a refinement of the second tag. - -Our design reuses ``iterator_traits::iterator_category`` to -indicate an iterator's traversal capability. To specify -capabilities not captured by any old-style iterator category, an -iterator designer can use an ``iterator_category`` type that is -convertible to both the the most-derived old iterator category tag -which fits, and the appropriate new iterator traversal tag. - -.. dwa2003/1/2: Note that we are not *requiring* convertibility to - a new-style traversal tag in order to meet new concepts. - Old-style iterators still fit, after all. - -We do not provide tags for the purposes of dispatching based on the -access concepts, in part because we could not find a way to -automatically infer the right access tags for old-style iterators. -An iterator's writability may be dependent on the assignability of -its ``value_type`` and there's no known way to detect whether an -arbitrary type is assignable. Fortunately, the need for -dispatching based on access capability is not as great as the need -for dispatching based on traversal capability. - -A difficult design decision concerned the ``operator[]``. The direct -approach for specifying ``operator[]`` would have a return type of -``reference``; the same as ``operator*``. However, going in this -direction would mean that an iterator satisfying the old Random Access -Iterator requirements would not necessarily be a model of Readable or -Writable Lvalue Iterator. Instead we have chosen a design that -matches the preferred resolution of `issue 299`_: ``operator[]`` is -only required to return something convertible to the ``value_type`` -(for a Readable Iterator), and is required to support assignment -``i[n] = t`` (for a Writable Iterator). - - -=============== - Proposed Text -=============== - -Addition to [lib.iterator.requirements] -======================================= - -Iterator Value Access Concepts [lib.iterator.value.access] -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -In the tables below, ``X`` is an iterator type, ``a`` is a constant -object of type ``X``, ``R`` is -``std::iterator_traits::reference``, ``T`` is -``std::iterator_traits::value_type``, and ``v`` is a constant -object of type ``T``. - -.. _Readable Iterator: - -Readable Iterators [lib.readable.iterators] -------------------------------------------- - -A class or built-in type ``X`` models the *Readable Iterator* concept -for value type ``T`` if, in addition to ``X`` being Assignable and -Copy Constructible, the following expressions are valid and respect -the stated semantics. ``U`` is the type of any specified member of -type ``T``. - -+-----------------------------------------------------------------------------------------------------------------------------+ -|Readable Iterator Requirements (in addition to Assignable and Copy Constructible) | -+-----------------------------------+------------------------+----------------------------------------------------------------+ -|Expression |Return Type |Note/Precondition | -+===================================+========================+================================================================+ -|``iterator_traits::value_type`` |``T`` |Any non-reference, | -| | |non-cv-qualified type | -+-----------------------------------+------------------------+----------------------------------------------------------------+ -|``*a`` | Convertible to ``T`` |pre: ``a`` is dereferenceable. If ``a == b`` then ``*a`` | -| | | is equivalent to ``*b``. | -+-----------------------------------+------------------------+----------------------------------------------------------------+ -|``a->m`` |``U&`` |pre: ``pre: (*a).m`` is well-defined. Equivalent to ``(*a).m``. | -+-----------------------------------+------------------------+----------------------------------------------------------------+ - -.. We won't say anything about iterator_traits::reference until the DR is resolved. -JGS - -.. _Writable Iterator: - -Writable Iterators [lib.writable.iterators] -------------------------------------------- - -A class or built-in type ``X`` models the *Writable Iterator* concept -if, in addition to ``X`` being Copy Constructible, the following -expressions are valid and respect the stated semantics. Writable -Iterators have an associated *set of value types*. - -+---------------------------------------------------------------------+ -|Writable Iterator Requirements (in addition to Copy Constructible) | -+-------------------------+--------------+----------------------------+ -|Expression |Return Type |Precondition | -+=========================+==============+============================+ -|``*a = o`` | | pre: The type of ``o`` | -| | | is in the set of | -| | | value types of ``X`` | -+-------------------------+--------------+----------------------------+ - -Swappable Iterators [lib.swappable.iterators] ---------------------------------------------- - -A class or built-in type ``X`` models the *Swappable Iterator* concept -if, in addition to ``X`` being Copy Constructible, the following -expressions are valid and respect the stated semantics. - -+---------------------------------------------------------------------+ -|Swappable Iterator Requirements (in addition to Copy Constructible) | -+-------------------------+-------------+-----------------------------+ -|Expression |Return Type |Postcondition | -+=========================+=============+=============================+ -|``iter_swap(a, b)`` |``void`` |the pointed to values are | -| | |exchanged | -+-------------------------+-------------+-----------------------------+ - -[*Note:* An iterator that is a model of the `Readable Iterator`_ and -`Writable Iterator`_ concepts is also a model of *Swappable -Iterator*. *--end note*] - - -Lvalue Iterators [lib.lvalue.iterators] ---------------------------------------- - -The *Lvalue Iterator* concept adds the requirement that the return -type of ``operator*`` type be a reference to the value type of the -iterator. - -+-------------------------------------------------------------+ -| Lvalue Iterator Requirements | -+-------------+-----------+-----------------------------------+ -|Expression |Return Type|Note/Assertion | -+=============+===========+===================================+ -|``*a`` | ``T&`` |``T`` is *cv* | -| | |``iterator_traits::value_type`` | -| | |where *cv* is an optional | -| | |cv-qualification. pre: ``a`` is | -| | |dereferenceable. | -+-------------+-----------+-----------------------------------+ - -If ``X`` is a `Writable Iterator`_ then ``a == b`` if and only if -``*a`` is the same object as ``*b``. If ``X`` is a `Readable -Iterator`_ then ``a == b`` implies ``*a`` is the same object as -``*b``. - - -Iterator Traversal Concepts [lib.iterator.traversal] -++++++++++++++++++++++++++++++++++++++++++++++++++++ - -In the tables below, ``X`` is an iterator type, ``a`` and ``b`` are -constant objects of type ``X``, ``r`` and ``s`` are mutable objects of -type ``X``, ``T`` is ``std::iterator_traits::value_type``, and -``v`` is a constant object of type ``T``. - -Incrementable Iterators [lib.incrementable.iterators] ------------------------------------------------------ - -A class or built-in type ``X`` models the *Incrementable Iterator* -concept if, in addition to ``X`` being Assignable and Copy -Constructible, the following expressions are valid and respect the -stated semantics. - -+------------------------------------------------------------------------------------+ -|Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible) | -| | -+--------------------------------+-------------------------------+-------------------+ -|Expression |Return Type |Assertion | -+================================+===============================+===================+ -|``++r`` |``X&`` |``&r == &++r`` | -+--------------------------------+-------------------------------+-------------------+ -|``r++`` | | | -+--------------------------------+-------------------------------+-------------------+ -|``*r++`` | | | -+--------------------------------+-------------------------------+-------------------+ -|``iterator_traversal::type`` |Convertible to | | -| |``incrementable_traversal_tag``| | -+--------------------------------+-------------------------------+-------------------+ - - -If ``X`` is a `Writable Iterator`_ then ``X a(r++);`` is equivalent -to ``X a(r); ++r;`` and ``*r++ = o`` is equivalent -to ``*r = o; ++r``. -If ``X`` is a `Readable Iterator`_ then ``T z(*r++);`` is equivalent -to ``T z(*r); ++r;``. - -.. TR1: incrementable_iterator_tag changed to - incrementable_traversal_tag for consistency. - -Single Pass Iterators [lib.single.pass.iterators] -------------------------------------------------- - -A class or built-in type ``X`` models the *Single Pass Iterator* -concept if the following expressions are valid and respect the stated -semantics. - - -+----------------------------------------------------------------------------------------------------------------+ -|Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality Comparable) | -| | -+----------------------------------------+-----------------------------+-------------+---------------------------+ -|Expression |Return Type | Operational |Assertion/ | -| | | Semantics |Pre-/Post-condition | -+========================================+=============================+=============+===========================+ -|``++r`` |``X&`` | |pre: ``r`` is | -| | | |dereferenceable; post: | -| | | |``r`` is dereferenceable or| -| | | |``r`` is past-the-end | -+----------------------------------------+-----------------------------+-------------+---------------------------+ -|``a == b`` |convertible to ``bool`` | |``==`` is an equivalence | -| | | |relation over its domain | -+----------------------------------------+-----------------------------+-------------+---------------------------+ -|``a != b`` |convertible to ``bool`` |``!(a == b)``| | -+----------------------------------------+-----------------------------+-------------+---------------------------+ -|``iterator_traits::difference_type`` |A signed integral type | | | -| |representing the distance | | | -| |between iterators | | | -+----------------------------------------+-----------------------------+-------------+---------------------------+ -|``iterator_traversal::type`` |Convertible to | | | -| |``single_pass_traversal_tag``| | | -+----------------------------------------+-----------------------------+-------------+---------------------------+ - -.. TR1: single_pass_iterator_tag changed to - single_pass_traversal_tag for consistency - - -Forward Traversal Iterators [lib.forward.traversal.iterators] -------------------------------------------------------------- - -A class or built-in type ``X`` models the *Forward Traversal Iterator* -concept if, in addition to ``X`` meeting the requirements of Default -Constructible and Single Pass Iterator, the following expressions are -valid and respect the stated semantics. - -+--------------------------------------------------------------------------------------------------------+ -|Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator) | -+---------------------------------------+-----------------------------------+----------------------------+ -|Expression |Return Type |Assertion/Note | -+=======================================+===================================+============================+ -|``X u;`` |``X&`` |note: ``u`` may have a | -| | |singular value. | -+---------------------------------------+-----------------------------------+----------------------------+ -|``++r`` |``X&`` |``r == s`` and ``r`` is | -| | |dereferenceable implies | -| | |``++r == ++s.`` | -+---------------------------------------+-----------------------------------+----------------------------+ -|``iterator_traversal::type`` |Convertible to | | -| |``forward_traversal_tag`` | | -+---------------------------------------+-----------------------------------+----------------------------+ - - - -.. TR1: forward_traversal_iterator_tag changed to - forward_traversal_tag for consistency - - -Bidirectional Traversal Iterators [lib.bidirectional.traversal.iterators] -------------------------------------------------------------------------- - -A class or built-in type ``X`` models the *Bidirectional Traversal -Iterator* concept if, in addition to ``X`` meeting the requirements of -Forward Traversal Iterator, the following expressions are valid and -respect the stated semantics. - -+-----------------------------------------------------------------------------------------------------+ -|Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal | -|Iterator) | -+--------------------------------+-------------------------------+--------------+---------------------+ -|Expression |Return Type | Operational |Assertion/ | -| | | Semantics |Pre-/Post-condition | -+================================+===============================+==============+=====================+ -|``--r`` |``X&`` | |pre: there exists | -| | | |``s`` such that ``r | -| | | |== ++s``. post: | -| | | |``s`` is | -| | | |dereferenceable. | -| | | | | -| | | |``++(--r) == r``. | -| | | |``--r == --s`` | -| | | |implies ``r == | -| | | |s``. ``&r == &--r``. | -+--------------------------------+-------------------------------+--------------+---------------------+ -|``r--`` |convertible to ``const X&`` |:: | | -| | | | | -| | | { | | -| | | X tmp = r; | | -| | | --r; | | -| | | return tmp;| | -| | | } | | -+--------------------------------+-------------------------------+--------------+---------------------+ -|``iterator_traversal::type`` |Convertible to | | | -| |``bidirectional_traversal_tag``| | | -| | | | | -+--------------------------------+-------------------------------+--------------+---------------------+ - -.. TR1: bidirectional_traversal_iterator_tag changed to - bidirectional_traversal_tag for consistency - -Random Access Traversal Iterators [lib.random.access.traversal.iterators] -------------------------------------------------------------------------- - -A class or built-in type ``X`` models the *Random Access Traversal -Iterator* concept if the following expressions are valid and respect -the stated semantics. In the table below, ``Distance`` is -``iterator_traits::difference_type`` and ``n`` represents a -constant object of type ``Distance``. - -+------------------------------------------------------------------------------------------------------------------+ -|Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal Iterator) | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|Expression |Return Type |Operational Semantics |Assertion/ | -| | | |Precondition | -+===============================+=================================+=========================+======================+ -|``r += n`` |``X&`` |:: | | -| | | | | -| | | { | | -| | | Distance m = n; | | -| | | if (m >= 0) | | -| | | while (m--) | | -| | | ++r; | | -| | | else | | -| | | while (m++) | | -| | | --r; | | -| | | return r; | | -| | | } | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a + n``, ``n + a`` |``X`` |``{ X tmp = a; return tmp| | -| | |+= n; }`` | | -| | | | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``r -= n`` |``X&`` |``return r += -n`` | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a - n`` |``X`` |``{ X tmp = a; return tmp| | -| | |-= n; }`` | | -| | | | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``b - a`` |``Distance`` |``a < b ? distance(a,b) |pre: there exists a | -| | |: -distance(b,a)`` |value ``n`` of | -| | | |``Distance`` such that| -| | | |``a + n == b``. ``b | -| | | |== a + (b - a)``. | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a[n]`` |convertible to T |``*(a + n)`` |pre: a is a `Readable | -| | | |Iterator`_ | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a[n] = v`` |convertible to T |``*(a + n) = v`` |pre: a is a `Writable | -| | | |Iterator`_ | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a < b`` |convertible to ``bool`` |``b - a > 0`` |``<`` is a total | -| | | |ordering relation | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a > b`` |convertible to ``bool`` |``b < a`` |``>`` is a total | -| | | |ordering relation | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a >= b`` |convertible to ``bool`` |``!(a < b)`` | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``a <= b`` |convertible to ``bool`` |``!(a > b)`` | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ -|``iterator_traversal::type``|Convertible to | | | -| |``random_access_traversal_tag`` | | | -+-------------------------------+---------------------------------+-------------------------+----------------------+ - -.. TR1: random_access_traversal_iterator_tag changed to - random_access_traversal_tag for consistency - - -Interoperable Iterators [lib.interoperable.iterators] ------------------------------------------------------ - -A class or built-in type ``X`` that models Single Pass Iterator is -*interoperable with* a class or built-in type ``Y`` that also models -Single Pass Iterator if the following expressions are valid and -respect the stated semantics. In the tables below, ``x`` is an object -of type ``X``, ``y`` is an object of type ``Y``, ``Distance`` is -``iterator_traits::difference_type``, and ``n`` represents a -constant object of type ``Distance``. - -+-----------+-----------------------+---------------------------------------------------+ -|Expression |Return Type |Assertion/Precondition/Postcondition | -+===========+=======================+===================================================+ -|``y = x`` |``Y`` |post: ``y == x`` | -+-----------+-----------------------+---------------------------------------------------+ -|``Y(x)`` |``Y`` |post: ``Y(x) == x`` | -+-----------+-----------------------+---------------------------------------------------+ -|``x == y`` |convertible to ``bool``|``==`` is an equivalence relation over its domain. | -+-----------+-----------------------+---------------------------------------------------+ -|``y == x`` |convertible to ``bool``|``==`` is an equivalence relation over its domain. | -+-----------+-----------------------+---------------------------------------------------+ -|``x != y`` |convertible to ``bool``|``bool(a==b) != bool(a!=b)`` over its domain. | -+-----------+-----------------------+---------------------------------------------------+ -|``y != x`` |convertible to ``bool``|``bool(a==b) != bool(a!=b)`` over its domain. | -+-----------+-----------------------+---------------------------------------------------+ - -If ``X`` and ``Y`` both model Random Access Traversal Iterator then -the following additional requirements must be met. - -+-----------+-----------------------+---------------------+--------------------------------------+ -|Expression |Return Type |Operational Semantics|Assertion/ Precondition | -+===========+=======================+=====================+======================================+ -|``x < y`` |convertible to ``bool``|``y - x > 0`` |``<`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y < x`` |convertible to ``bool``|``x - y > 0`` |``<`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x > y`` |convertible to ``bool``|``y < x`` |``>`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y > x`` |convertible to ``bool``|``x < y`` |``>`` is a total ordering relation | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x >= y`` |convertible to ``bool``|``!(x < y)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y >= x`` |convertible to ``bool``|``!(y < x)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x <= y`` |convertible to ``bool``|``!(x > y)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y <= x`` |convertible to ``bool``|``!(y > x)`` | | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``y - x`` |``Distance`` |``distance(Y(x),y)`` |pre: there exists a value ``n`` of | -| | | |``Distance`` such that ``x + n == y``.| -| | | |``y == x + (y - x)``. | -+-----------+-----------------------+---------------------+--------------------------------------+ -|``x - y`` |``Distance`` |``distance(y,Y(x))`` |pre: there exists a value ``n`` of | -| | | |``Distance`` such that ``y + n == x``.| -| | | |``x == y + (x - y)``. | -+-----------+-----------------------+---------------------+--------------------------------------+ - - - -Addition to [lib.iterator.synopsis] -=================================== - - -:: - - // lib.iterator.traits, traits and tags - template struct is_readable_iterator; - template struct iterator_traversal; - - struct incrementable_traversal_tag { }; - struct single_pass_traversal_tag : incrementable_traversal_tag { }; - struct forward_traversal_tag : single_pass_traversal_tag { }; - struct bidirectional_traversal_tag : forward_traversal_tag { }; - struct random_access_traversal_tag : bidirectional_traversal_tag { }; - -Addition to [lib.iterator.traits] -================================= - -The ``is_readable_iterator`` class -template satisfies the UnaryTypeTrait_ requirements. - -Given an iterator type ``X``, ``is_readable_iterator::value`` -yields ``true`` if, for an object ``a`` of type ``X``, ``*a`` is -convertible to ``iterator_traits::value_type``, and ``false`` -otherwise. - -``iterator_traversal::type`` is - -.. parsed-literal:: - - *category-to-traversal*\ (iterator_traits::iterator_category) - -where *category-to-traversal* is defined as follows - -.. _`category-to-traversal`: - -.. parsed-literal:: - - *category-to-traversal*\ (C) = - if (C is convertible to incrementable_traversal_tag) - return C; - else if (C is convertible to random_access_iterator_tag) - return random_access_traversal_tag; - else if (C is convertible to bidirectional_iterator_tag) - return bidirectional_traversal_tag; - else if (C is convertible to forward_iterator_tag) - return forward_traversal_tag; - else if (C is convertible to input_iterator_tag) - return single_pass_traversal_tag; - else if (C is convertible to output_iterator_tag) - return incrementable_traversal_tag; - else - *the program is ill-formed* - - -=========== - Footnotes -=========== - -.. _UnaryTypeTrait: n1519_ - -The UnaryTypeTrait concept is defined in n1519_; the LWG is -considering adding the requirement that specializations are derived -from their nested ``::type``. - -.. _n1519: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1519.htm - -.. - LocalWords: Abrahams Siek Witt const bool Sutter's WG int UL LI href Lvalue - LocalWords: ReadableIterator WritableIterator SwappableIterator cv pre iter - LocalWords: ConstantLvalueIterator MutableLvalueIterator CopyConstructible TR - LocalWords: ForwardTraversalIterator BidirectionalTraversalIterator lvalue - LocalWords: RandomAccessTraversalIterator dereferenceable Incrementable tmp - LocalWords: incrementable xxx min prev inplace png oldeqnew AccessTag struct - LocalWords: TraversalTag typename lvalues DWA Hmm JGS mis enum diff --git a/libs/iterator/doc/oldeqnew.png b/libs/iterator/doc/oldeqnew.png deleted file mode 100644 index 30cd1598cb0b5f4cc54a8c600b7d55de7de270d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33786 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 z zKR>hWs987ag|w($5Sv)0ikiu{Um^!-+&-?q$!_A;=Wzi6UjS!Cq8GSF>ZHu;n1F4O zSPsES2(<}Gh}*9Jv;s9%c@ob(ms~rFdTy8fmz_Y#C-?8$%39b@n`Ra8zMI=o3IzI$ z<5$gl+-<|KupIh7g9Z&k7~v<0_EYpU)F-K{u2o;ydiXql!k^AY>CwxVga@Q|4$tMb zr|#T2Atj>!h`E@PIX49B2qNHP5o1=6%>ah`X{c$vw7qBqRs`bM<|S5ANPj}`#cE}AONBRby+ zc6Q7f;!-~vSEt`oIVYmr+D|=_r;D?sy;tr~vnog)o{r)# zBT{-?HU4fjvi9H&<~?rVx&~fNyX$9DSRtc;KkzqTOI{h=-n^Xkmw7MN`k^+8o_Ttz z38M=Kw;rw=N;|j@ei`SA$y~0Z6>OLE*Xy)@vZJHC@ciQHu9|X|d*4uMyA{hObWsg$ z^0i*_w)oy@#6gr~AEbG4?H;uwO26m+SD^o+eP_{{UzkaI@IYf^KVU2=ff8O28ZY;C zu5@f_YC3e}2=2Q_w(u@5C%9e>cB%G{iDh3cV2X4(%m#^;J{li6|o9;ah(7 z;4E1inIV?@rZMsg(?f|m_N;+I{#%=wGrMgox>Zzk_}Hescl55C zuhpHOqsG|*UG0DVd1^@88vIOYtFQ9)#Yf(I`SO;MwY}T)Ja{dosh?k6e!d-{8Q{UR zD4{51=>b)Rdwr=Op;;i7^(_4vS6EK^WwezJ^w_ftW7_4DBx(n6@@IORN{Hf#aW~ZT zbo&{45*3>zM|!L7v*%{Rr1<)pM!5m{fu<0C zGv>|vf#@9)J9VzPtZla*!#s;oK-;!NsrckyzYZ}Q-_Yw`#aONGjVs;oz9q5Nj-Zlp zwnmjpCE7Zm)K=fFI|Syd5pMnn!d}!_zA}vX&C)>8&Bt_W(Y3Z0C&3oR4n`X5_e7|g z#}_p#>n8){>t+?6kwn^uIow$y46#(O%W)l*)9tP1YLR6&;RX6wd1kh%XNlj7Xnh2aiyhw|Pw+^bp2Z?--o`T0|fkM&k!yZ)yR>gLrQyyn&84QOM?% zRypHivH$fq&QZr(@<7zo7JlWQ*VV`<*oD}X{qyd3ia#_f)9An7&G*p%em8?AdWesZ zjd(Hs^9zahWx)-%4?dI*Yf7QyBnCIhJrLffy9XmL(N?p28 zF<*{ZM?yk^($3h~mw%;N{jJv@HSiCJOPtr$29W$7|EfbGrj-4YuDVE?$nzqKZN(o14o8S?Xz0;mC~P%XHw9uK=t6r z{t#?KYFxN*JP zGcr204L3Dy+BGsB(>p@!gCNCNUKkS-n$uyIZ|~p`8BIneCg4?PklGF_4O`ePFB7ac zq9_=k$Fm-(PELSk`Z8-B{%bs{-&e}FZX4@_!#}2Ii78A;Wxm&g09svLoDMf5wY?q8 zzw!+Z2fb9C*S*D$@@Rj^kYEqvoZCNmP?%(dG zvd*66O}Qy41hO%*Bh{`y>J?BFqgD5i*;u;|+N<{tdPDoU=>2k4DMykkiGS z465a3tNJyg7gCQfpG@nGM#UuruoqZ>1D!&N>0s1Al;n;fa+$g52l5Xh^UtANHKf-g zEG^If`Dfns>*FC{hi^ES58$D@VYd7+KK^e<9IyuT@MWev3IRT#Q;QuM4^?Hd*_jq?x5S(4DE1;dYaAMh^!@pT0H)>c174|*AI2pnYJFXgJ_g-s z-av?5=oM9@DQqC=D80n_9G;S*w||{Ghc>C?(IappB;>s-eM5k8sFu?6frXf0Uj8+8 zT(pXJ*_BqE75lf;%WuSi70Nzg2GG3kPkM?aNTWuP`z6fUCM1Z@*k(!$o>`6$`uoSr ztyH*8#mUbpC*T6G*DzJauIKT@8KKI8exE)boJ^mwpO1gQ(}6UWUqPsVzsG(^N}%=+ z^Qpr(#QVjC?n3c{2Xs6{w_@yvr(s5#mDNq~ZLX)IwipeHTV511OJG?+bh*YX=FH-o zniOd?qu8smXB2ufs5T_h3~LRZpDhT!0RiHyt@lEYC>0%Xm6HEPoRB~aEgxUKQrFd; zcC^=a_UYjMv@WY2AZ)SZnSRKWRs^&fo|1%4WKA*}y?XXUdx+kI-WlCaS!pSAP8p+T zLz(X9W}va*pvMm%uV8TsHCkvip1YK{SOm~^rj40)PO@~tgQY{3+>syyWuky1c0`5S zT5|vXcSdsf%$(2IV1Du8o?kc7og^f86+$bsV`B+~Q`l1?C6qTbLkrLZVD{*`J3xOS zyHN1+qf(_58f=U@P7v=R)yhW}Q=nqBO+psHdKp(50yAfp5WHL&qw#`Ox>e1P4lc8U z{H$!~jz?VMDV0lLB8!Q%36k6jC5IgU*MB1*h}BejO{e@NU_E2l@ZqOt4{Bm!!5s38 zzR=~%d*&+4^a5-Eok9PMVuu>{5QyYlgl@Wd-Za>MvU$>??8WmtBhSMTE2VcOkZP4SJH*c5&kMDPWzF-Y{gB4|wg3n9J zxIveEIg4CjoCG9R!4@UvW0_mYBw_KKx8l0slmm;wOf-DGT}bM$Pn|T@@9>@8(05?wcYCN#3}jsfNHP;ga+5 z0Lt(xQsSy92CdBHoZu96hcDOm+qGjy-@${qB}zh?w`IwNjN_xIPZ&~`6nF)Q?lrKF z9fmsGPm4H;Y=%&#m)4kYl34uKUC_6(S`Q+H^2yv&aN|a9#dZ2gY|#N>oCR_~wsF#t zU?56l!hi3m)p5Vqnqh}Z5TYlunNNvjV0wC(Y5e7`JFq+FT^0?1x$p4J6a=mk)f~d5 zAhWBYkb_o!#aS2`NDU!0B_)NbhO!8?N-}JZm+VY0!WsPwegNLgY$PGuWmZAk2vR3*0#4Eo3`Prs*9dY>h@yEA!8c4B zFXH^bnr`2@liF4F$aBUd>A|DQIC)YJ#{mc^4Y;kGAD>3i$$Y%y(0~$kxOE^2lpg)N z88c@NGB!St;WY0N@0*$=W}N@Ledi=kFJvsW)ve+-IR~Vv`~Y24zJEWtOv=8osETQy zc0M%J5MM+{kVIyX$?QzgHA2+lTv+uEnR>;U!~fCp_KS<&-@{&|?SD;sMN zy*=Q7bI9gmi*d=9XoZGCJi{HrAl+Lf2w;Y!tsF$Q3$DsWRFwF~d6E&V%rGUe?gZa@FV_w@K= zgM3lWHB|aEhNg^#b!yA-wzLhHdbIN~^xdCEy!*EaC|P_n#tXT*(r-j#{<&R#jGsMQ zJNQCUaxw>hLC$(MBozq)7H3QiO9@P(i1gdjr-FdoBYa&TsoHm+Qa<~P0Et;Kx_RHl*w(jok+lt6kR z@fl{=*k#z>N6e3Vq~h^5+^2LT5_vLWfj!{wBQC_|r=_|6L`RA7RkVIWM z(?Uq$bOsv7Rr+cY+W+<#;`WNU%W`2RMMi9_+EAZ;)g(wnW>NxI(5ZqKK-o8Wt|v!= za1Ra0>Z_@tu?Q2=z7r=*(A3hJG2_tjWn9y;b>DRS>{m=F**Wg`vbj?WBSs%l$;!JT zu4IsxpHZsu>SK^451rVqGL+lpPbW|%I>K!>XpE3MDGNTE|p*%1=^s)AjIP z#wC{uCvW{0qyTyqcc^@C^x|_Mv6%aU2SnC{d2o@v)VfhnATKA!=DLYCHer{lL}%ky zBaUa0ySRxPX$6E~SH$HXq`8cztM&*WlJ2q+pk>9U_wN7y3(3RdAU+9RuAhtGNUGL0&$Z5m}XJrhyl*I%}Rz z^6fSjEV>^3?aY(Ru4kTnpmXh}E$+;MpF?4e;TaI(?yXxS8LY|lu9%}PGh&vIr5x_3 zAj7BwuvM~LQ}2;2_l2J5z5uli17=o2Xpp)P@D$X+#=-n7(td-kjmn08B=LbTNyGW| zxXvsPwVS#QBYy(fzySj~Q|T%x<(VEkb4Fvhvh*+Hh88{Q?K+kWFIcN7XgI+|7kF+fN=;YFk1(gUMnwy#~5$yP_z6~rI6PN8} zeQbBRRN9}|HWf?wlp#3k(Byq(K~d94r9_VUE;zk_iOfsc9 zU0;=Ohm9$^f|7?1ha@>zyb^m&P@r@K@FIaYLZM0@I55ycQpL)o&L<+B8VrtNNxK@6 z_@}W~7vF{;qfJ0G_>!sKbwqPm11Yi7snIAwb&ft!N$kh%HgEiEjx12saC>Tc0eS3m7} z&mesnJ|*;+WQFXNZ{u((oRbQ+rYLqFD2Q_+jt&l^SvdvJjLxfQXeQ-~@J&STSndYH z>vuRT0#&gHFyHX>eUx$!e-P#?C)5uE9iI6g5@WmbBSAQ#Lh{81vy(vZ;CNgul27;? zq^_kUdZc@M@4=Z~2>kjX35^9SL_IzGi~IDbXl=cjx8eedJ23yy6pEQgO;2YvMaby& zEf#2?jcEFYz>GLGLDRzVH3whmSV1Z>JACMslc*oJ?GU+4Vtn8I6|6uoG%%nI+hHz6 zCWqXlo%$dBmX09&jYJ@#Q|75ll~@F8h~2ADKZBbRXQ(51&7uJaGa{w>KeyjYQa`J%;n(;=5c})md;|x^yIn z1Y3fpxQQ&=g6HQW4uvP+DWxFHeuAKehtfV-i|G}doD81b!>y;ob_bX@|Iff}DOQ$HG_W*+*f%hklKW zU}|Ree_HBaD-7>SjgsD4>22*^N`5>+dD zpMC9AvwN1tz7u8p#Uc$pnteO;F0r9gYFJnEyQd2zx6bH5*657!6AeV@tAZZ{q3OL& z3r+?om#~e}(5U?ILHVU=b{%d}N5=q_@zdC_sb8`6SF4#UOu1ot4Cip|)NA3bxDhd{ zE;=MR)?62~=!h2Fbv-FV1=QYX0gauI^R4X$S4k z3@!al-YYE{%5?y+t>FSDuF>1+E{oc*f$@VcV_yHSI`4+#{2&%4yEg;?eKPlGhz2rP zaNJhFBbvZ4YisSom(i1XMoSj=5UimsFn;ERWA%vj%-bjqi%wp^_a7ET)g%|v3hzmjAPNbwf z$5%%bySViFGoyItF52oBE&!At>`6%}ztPovd`x_NJSC%gbk#Y#j>uhV=NUh-G;HJt z!?({y6&CcA?!E8Q`c^{S?jjFVi{`_J$4M+P+Qr0#`yOZ;5P(tfpfBTKw74Tw6BD-R zw%$3<1x9p-kOP8(4AXS4yB!&`w6ycbrT?cl*Sd8=R6!;D5cxIlZe=ICXMbT{_dNho z65+@5*dD5E^B}LBj}gncns@KQPWII3^|oaD`nrsrhIXF=CLSHfzyi5yTM;S>X1NT` z*_SEOO`&zwWUv3%-hcmrMutf4%l`A7M)SaHS~vwa;JQMZ7oVBs%f*Fp-&S2Mc-z1S zDUVKC$0i&3_2(yq8ffw2c9r%Wb5wx5C;p;p{Zvzv%$|&Q@0#}xVKMpS?6l8H%jZw-BkY+Q^gG zF0gh=!0?bDIZ15!5^5*HS>$C>?Na*C8zTfzI%2AdUl2_IU=n-?cA_{P)8 zEcawc(UnFJB0J3(CnPIyjd?gNCDUNFnEg%d*o8WwI?6yx*<-4ql{R36UDm)cor(os z6qpoi2S)A=56&)B>c9Tl+o>*AFPon~Ilr=B^RfX$vZi?)R`FC)ROCpq%mg4k*6)>_ zqyUyUjYXy}Bu;ydzqpONU3MqD!iyNqeLYFQa$KA}bL*TCR%x1k|_3+e( ziC0i-%|C`7Jw=r2s97}@`JECr&aaIsl#AJNYo5G!4m=Ae8K3F2pk)5C49`BXp(`_F z=^&ZfYX&B1O>$WrAHyq=ms0@r)yLwktNR}16yUh79u4-RMxrthXLt4uBrq_tO<(!* z)3Y~UywEXHAKZxPAN>sM&uJVyd;0WBds`5bGkXrrSoe+}K^gY+@ni6NCA(4Uag76# zfySVB3pb`0%4H=esp=)sC1T5aT#7+ezr^eA$l2#jn)D8JvPGQFlhd!M3|L(4vvILt zKf?MfxATyJ}aLldO!eG)+=%S<)G0)`k zsD!?fVkAU-gX#3=u;1`D7IC}!X^33 zU7r%}AY|#uuwDueSG0K|akh3XVjz4xy%zNdP7@y`Deso>yPMi0iwM*f3t2kV(!8>F z*$)mE;(`2&20r^3b3xc68IgYQVD#gn>P;r=c4>`1Zo-LGP^;h!GrtmI1Q5-)T4%8=DUTDhEp?5i>9n-|yC8H#5mRZi@`^4|>WT>Jt%;-I6-KXFj( e@cy5`*rHeET#=UVo$^@VYtr~>b|-9I!~Y+Bkc24! diff --git a/libs/iterator/doc/permutation_iter_abstract.rst b/libs/iterator/doc/permutation_iter_abstract.rst deleted file mode 100644 index 787c51a57..000000000 --- a/libs/iterator/doc/permutation_iter_abstract.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -The permutation iterator adaptor provides a permuted view of a given -range. That is, the view includes every element of the given range but -in a potentially different order. - diff --git a/libs/iterator/doc/permutation_iterator.html b/libs/iterator/doc/permutation_iterator.html deleted file mode 100644 index ce27429db..000000000 --- a/libs/iterator/doc/permutation_iterator.html +++ /dev/null @@ -1,311 +0,0 @@ - - - - - - -Permutation Iterator - - - - - - - -
-

Permutation Iterator

- --- - - - - - - - - - - - -
Author:Toon Knapen, David Abrahams, Roland Richter, Jeremy Siek
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu
Organization:Boost Consulting, Indiana University Open Systems -Lab
Date:2006-09-11
Copyright:Copyright Toon Knapen, David Abrahams, Roland Richter, and Jeremy Siek 2003.
- - - - --- - - - -
abstract: - - -The permutation iterator adaptor provides a permuted view of a given -range. That is, the view includes every element of the given range but -in a potentially different order.
-
-
-

Introduction

- - - -

The adaptor takes two arguments:

-
-
    -
  • an iterator to the range V on which the permutation -will be applied
  • -
  • the reindexing scheme that defines how the -elements of V will be permuted.
  • -
-
-

Note that the permutation iterator is not limited to strict -permutations of the given range V. The distance between begin and end -of the reindexing iterators is allowed to be smaller compared to the -size of the range V, in which case the permutation iterator only -provides a permutation of a subrange of V. The indexes neither need -to be unique. In this same context, it must be noted that the past the -end permutation iterator is completely defined by means of the -past-the-end iterator to the indices.

-
-
-

Reference

- - - -
-template< class ElementIterator
-        , class IndexIterator
-        , class ValueT        = use_default
-        , class CategoryT     = use_default
-        , class ReferenceT    = use_default
-        , class DifferenceT   = use_default >
-class permutation_iterator
-{
-public:
-  permutation_iterator();
-  explicit permutation_iterator(ElementIterator x, IndexIterator y);
-
-  template< class OEIter, class OIIter, class V, class C, class R, class D >
-  permutation_iterator(
-      permutation_iterator<OEIter, OIIter, V, C, R, D> const& r
-      , typename enable_if_convertible<OEIter, ElementIterator>::type* = 0
-      , typename enable_if_convertible<OIIter, IndexIterator>::type* = 0
-      );
-  reference operator*() const;
-  permutation_iterator& operator++();
-  ElementIterator const& base() const;
-private:
-  ElementIterator m_elt;      // exposition only
-  IndexIterator m_order;      // exposition only
-};
-
-template <class ElementIterator, class IndexIterator>
-permutation_iterator<ElementIterator, IndexIterator>
-make_permutation_iterator( ElementIterator e, IndexIterator i);
-
-
-

permutation_iterator requirements

-

ElementIterator shall model Random Access Traversal Iterator. -IndexIterator shall model Readable Iterator. The value type of -the IndexIterator must be convertible to the difference type of -ElementIterator.

-
-
-

permutation_iterator models

-

permutation_iterator models the same iterator traversal concepts -as IndexIterator and the same iterator access concepts as -ElementIterator.

-

If IndexIterator models Single Pass Iterator and -ElementIterator models Readable Iterator then -permutation_iterator models Input Iterator.

-

If IndexIterator models Forward Traversal Iterator and -ElementIterator models Readable Lvalue Iterator then -permutation_iterator models Forward Iterator.

-

If IndexIterator models Bidirectional Traversal Iterator and -ElementIterator models Readable Lvalue Iterator then -permutation_iterator models Bidirectional Iterator.

-

If IndexIterator models Random Access Traversal Iterator and -ElementIterator models Readable Lvalue Iterator then -permutation_iterator models Random Access Iterator.

-

permutation_iterator<E1, X, V1, C2, R1, D1> is interoperable -with permutation_iterator<E2, Y, V2, C2, R2, D2> if and only if -X is interoperable with Y and E1 is convertible -to E2.

-
-
-

permutation_iterator operations

-

In addition to those operations required by the concepts that -permutation_iterator models, permutation_iterator provides the -following operations.

-

permutation_iterator();

- --- - - - -
Effects:Default constructs m_elt and m_order.
-

explicit permutation_iterator(ElementIterator x, IndexIterator y);

- --- - - - -
Effects:Constructs m_elt from x and m_order from y.
-
-template< class OEIter, class OIIter, class V, class C, class R, class D >
-permutation_iterator(
-    permutation_iterator<OEIter, OIIter, V, C, R, D> const& r
-    , typename enable_if_convertible<OEIter, ElementIterator>::type* = 0
-    , typename enable_if_convertible<OIIter, IndexIterator>::type* = 0
-    );
-
- --- - - - -
Effects:Constructs m_elt from r.m_elt and -m_order from y.m_order.
-

reference operator*() const;

- --- - - - -
Returns:*(m_elt + *m_order)
-

permutation_iterator& operator++();

- --- - - - - - -
Effects:++m_order
Returns:*this
-

ElementIterator const& base() const;

- --- - - - -
Returns:m_order
-
-template <class ElementIterator, class IndexIterator>
-permutation_iterator<ElementIterator, IndexIterator>
-make_permutation_iterator(ElementIterator e, IndexIterator i);
-
- --- - - - -
Returns:permutation_iterator<ElementIterator, IndexIterator>(e, i)
-
-
-
-

Example

- - - -
-using namespace boost;
-int i = 0;
-
-typedef std::vector< int > element_range_type;
-typedef std::list< int > index_type;
-
-static const int element_range_size = 10;
-static const int index_size = 4;
-
-element_range_type elements( element_range_size );
-for(element_range_type::iterator el_it = elements.begin() ; el_it != elements.end() ; ++el_it)
-  *el_it = std::distance(elements.begin(), el_it);
-
-index_type indices( index_size );
-for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it )
-  *i_it = element_range_size - index_size + std::distance(indices.begin(), i_it);
-std::reverse( indices.begin(), indices.end() );
-
-typedef permutation_iterator< element_range_type::iterator, index_type::iterator > permutation_type;
-permutation_type begin = make_permutation_iterator( elements.begin(), indices.begin() );
-permutation_type it = begin;
-permutation_type end = make_permutation_iterator( elements.begin(), indices.end() );
-
-std::cout << "The original range is : ";
-std::copy( elements.begin(), elements.end(), std::ostream_iterator< int >( std::cout, " " ) );
-std::cout << "\n";
-
-std::cout << "The reindexing scheme is : ";
-std::copy( indices.begin(), indices.end(), std::ostream_iterator< int >( std::cout, " " ) );
-std::cout << "\n";
-
-std::cout << "The permutated range is : ";
-std::copy( begin, end, std::ostream_iterator< int >( std::cout, " " ) );
-std::cout << "\n";
-
-std::cout << "Elements at even indices in the permutation : ";
-it = begin;
-for(i = 0; i < index_size / 2 ; ++i, it+=2 ) std::cout << *it << " ";
-std::cout << "\n";
-
-std::cout << "Permutation backwards : ";
-it = begin + (index_size);
-assert( it != begin );
-for( ; it-- != begin ; ) std::cout << *it << " ";
-std::cout << "\n";
-
-std::cout << "Iterate backward with stride 2 : ";
-it = begin + (index_size - 1);
-for(i = 0 ; i < index_size / 2 ; ++i, it-=2 ) std::cout << *it << " ";
-std::cout << "\n";
-
-

The output is:

-
-The original range is : 0 1 2 3 4 5 6 7 8 9
-The reindexing scheme is : 9 8 7 6
-The permutated range is : 9 8 7 6
-Elements at even indices in the permutation : 9 7
-Permutation backwards : 6 7 8 9
-Iterate backward with stride 2 : 6 8
-
-

The source code for this example can be found here.

-
-
- - - diff --git a/libs/iterator/doc/permutation_iterator.pdf b/libs/iterator/doc/permutation_iterator.pdf deleted file mode 100644 index 3f69d1d34a2af5a77e0dbe0364aac291ce3e764b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66744 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 O8)?zA=dh7(7XJswOC5dy diff --git a/libs/iterator/doc/permutation_iterator.rst b/libs/iterator/doc/permutation_iterator.rst deleted file mode 100644 index 0c8070cfa..000000000 --- a/libs/iterator/doc/permutation_iterator.rst +++ /dev/null @@ -1,41 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -++++++++++++++++++++++ - Permutation Iterator -++++++++++++++++++++++ - -:Author: Toon Knapen, David Abrahams, Roland Richter, Jeremy Siek -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_ -:date: $Date$ -:copyright: Copyright Toon Knapen, David Abrahams, Roland Richter, and Jeremy Siek 2003. - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu - -:abstract: - - .. include:: permutation_iter_abstract.rst - -.. contents:: Table of Contents - - -Introduction -============ - -.. include:: permutation_iterator_body.rst - - -Reference -========= - -.. include:: permutation_iterator_ref.rst - - -Example -======= - -.. include:: permutation_iterator_eg.rst diff --git a/libs/iterator/doc/permutation_iterator_body.rst b/libs/iterator/doc/permutation_iterator_body.rst deleted file mode 100644 index 8b1333c1d..000000000 --- a/libs/iterator/doc/permutation_iterator_body.rst +++ /dev/null @@ -1,19 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -The adaptor takes two arguments: - - * an iterator to the range V on which the permutation - will be applied - * the reindexing scheme that defines how the - elements of V will be permuted. - -Note that the permutation iterator is not limited to strict -permutations of the given range V. The distance between begin and end -of the reindexing iterators is allowed to be smaller compared to the -size of the range V, in which case the permutation iterator only -provides a permutation of a subrange of V. The indexes neither need -to be unique. In this same context, it must be noted that the past the -end permutation iterator is completely defined by means of the -past-the-end iterator to the indices. diff --git a/libs/iterator/doc/permutation_iterator_eg.rst b/libs/iterator/doc/permutation_iterator_eg.rst deleted file mode 100644 index eddf0a111..000000000 --- a/libs/iterator/doc/permutation_iterator_eg.rst +++ /dev/null @@ -1,71 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -:: - - using namespace boost; - int i = 0; - - typedef std::vector< int > element_range_type; - typedef std::list< int > index_type; - - static const int element_range_size = 10; - static const int index_size = 4; - - element_range_type elements( element_range_size ); - for(element_range_type::iterator el_it = elements.begin() ; el_it != elements.end() ; ++el_it) - *el_it = std::distance(elements.begin(), el_it); - - index_type indices( index_size ); - for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it ) - *i_it = element_range_size - index_size + std::distance(indices.begin(), i_it); - std::reverse( indices.begin(), indices.end() ); - - typedef permutation_iterator< element_range_type::iterator, index_type::iterator > permutation_type; - permutation_type begin = make_permutation_iterator( elements.begin(), indices.begin() ); - permutation_type it = begin; - permutation_type end = make_permutation_iterator( elements.begin(), indices.end() ); - - std::cout << "The original range is : "; - std::copy( elements.begin(), elements.end(), std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "The reindexing scheme is : "; - std::copy( indices.begin(), indices.end(), std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "The permutated range is : "; - std::copy( begin, end, std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "Elements at even indices in the permutation : "; - it = begin; - for(i = 0; i < index_size / 2 ; ++i, it+=2 ) std::cout << *it << " "; - std::cout << "\n"; - - std::cout << "Permutation backwards : "; - it = begin + (index_size); - assert( it != begin ); - for( ; it-- != begin ; ) std::cout << *it << " "; - std::cout << "\n"; - - std::cout << "Iterate backward with stride 2 : "; - it = begin + (index_size - 1); - for(i = 0 ; i < index_size / 2 ; ++i, it-=2 ) std::cout << *it << " "; - std::cout << "\n"; - - -The output is:: - - The original range is : 0 1 2 3 4 5 6 7 8 9 - The reindexing scheme is : 9 8 7 6 - The permutated range is : 9 8 7 6 - Elements at even indices in the permutation : 9 7 - Permutation backwards : 6 7 8 9 - Iterate backward with stride 2 : 6 8 - - -The source code for this example can be found `here`__. - -__ ../example/permutation_iter_example.cpp diff --git a/libs/iterator/doc/permutation_iterator_ref.rst b/libs/iterator/doc/permutation_iterator_ref.rst deleted file mode 100644 index d51864fc9..000000000 --- a/libs/iterator/doc/permutation_iterator_ref.rst +++ /dev/null @@ -1,130 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -.. parsed-literal:: - - template< class ElementIterator - , class IndexIterator - , class ValueT = use_default - , class CategoryT = use_default - , class ReferenceT = use_default - , class DifferenceT = use_default > - class permutation_iterator - { - public: - permutation_iterator(); - explicit permutation_iterator(ElementIterator x, IndexIterator y); - - template< class OEIter, class OIIter, class V, class C, class R, class D > - permutation_iterator( - permutation_iterator const& r - , typename enable_if_convertible::type* = 0 - , typename enable_if_convertible::type* = 0 - ); - reference operator*() const; - permutation_iterator& operator++(); - ElementIterator const& base() const; - private: - ElementIterator m_elt; // exposition only - IndexIterator m_order; // exposition only - }; - - template - permutation_iterator - make_permutation_iterator( ElementIterator e, IndexIterator i); - - - -``permutation_iterator`` requirements -------------------------------------- - -``ElementIterator`` shall model Random Access Traversal Iterator. -``IndexIterator`` shall model Readable Iterator. The value type of -the ``IndexIterator`` must be convertible to the difference type of -``ElementIterator``. - - -``permutation_iterator`` models -------------------------------- - -``permutation_iterator`` models the same iterator traversal concepts -as ``IndexIterator`` and the same iterator access concepts as -``ElementIterator``. - -If ``IndexIterator`` models Single Pass Iterator and -``ElementIterator`` models Readable Iterator then -``permutation_iterator`` models Input Iterator. - -If ``IndexIterator`` models Forward Traversal Iterator and -``ElementIterator`` models Readable Lvalue Iterator then -``permutation_iterator`` models Forward Iterator. - -If ``IndexIterator`` models Bidirectional Traversal Iterator and -``ElementIterator`` models Readable Lvalue Iterator then -``permutation_iterator`` models Bidirectional Iterator. - -If ``IndexIterator`` models Random Access Traversal Iterator and -``ElementIterator`` models Readable Lvalue Iterator then -``permutation_iterator`` models Random Access Iterator. - -``permutation_iterator`` is interoperable -with ``permutation_iterator`` if and only if -``X`` is interoperable with ``Y`` and ``E1`` is convertible -to ``E2``. - - -``permutation_iterator`` operations ------------------------------------ - -In addition to those operations required by the concepts that -``permutation_iterator`` models, ``permutation_iterator`` provides the -following operations. - -``permutation_iterator();`` - -:Effects: Default constructs ``m_elt`` and ``m_order``. - - -``explicit permutation_iterator(ElementIterator x, IndexIterator y);`` - -:Effects: Constructs ``m_elt`` from ``x`` and ``m_order`` from ``y``. - - -:: - - template< class OEIter, class OIIter, class V, class C, class R, class D > - permutation_iterator( - permutation_iterator const& r - , typename enable_if_convertible::type* = 0 - , typename enable_if_convertible::type* = 0 - ); - -:Effects: Constructs ``m_elt`` from ``r.m_elt`` and - ``m_order`` from ``y.m_order``. - - -``reference operator*() const;`` - -:Returns: ``*(m_elt + *m_order)`` - - -``permutation_iterator& operator++();`` - -:Effects: ``++m_order`` -:Returns: ``*this`` - - -``ElementIterator const& base() const;`` - -:Returns: ``m_order`` - - -:: - - template - permutation_iterator - make_permutation_iterator(ElementIterator e, IndexIterator i); - -:Returns: ``permutation_iterator(e, i)`` - diff --git a/libs/iterator/doc/pointee.html b/libs/iterator/doc/pointee.html deleted file mode 100644 index 1ce5d164c..000000000 --- a/libs/iterator/doc/pointee.html +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - -pointee and indirect_reference - - - - - - - - - - - diff --git a/libs/iterator/doc/pointee.pdf b/libs/iterator/doc/pointee.pdf deleted file mode 100644 index 53f9f6db8b403253bb39f3d4ddf488a3ac7a6b1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62356 zcmb@t1yr0%vo4GUcb6m#E(r|o?(VKZ26rcD5?q4?*WgYF?(P!Y9fAZ8Zg(I%duN~X z-Fwe}*FUpn-s$S6 zQ$(PGfhoulzywxMLIlb?J6W0AfXl3`zXWmy*5DHRU)7JgvbM(H=BkdM-@4#db|4!; zBPVlP8vrN!Q#(FBM39Z~Y8Hhk3 zTL)v1!(T%%Ja#Do07`=A^CV&fFg}WuKt@jBG9w2AJtq@*ZP^|zVCQ53Ff%aGGjcL; z0@zrY=-C-L*dDc&oeiCywoJy{#u7YVz(1S#Ytg|f;0;j%j{^PzP+J?ATRGWs85_8O z1PpC$9i8ZmY;7E!t(?qlOzDkmt!W+?^`CWp-01%wr^3Vuo)ZfbfQglZo|%o613Wnf zdUiHu*8i8Om^nGwaRGs@uCDa|gPA<;^Y596fw%5yp~P4?0l#(+D8|YHVEk)q#W(U^WSm~0P}A-I|Beb!N)TNUPYjSgRPM==y5-RU~dBeRX}b| z;JN;@z>m#-oAt~09*z5BUmt~xh(J*rBU@we9s!?%?PoY-Zp9b}B@mjKN<8 zMn*P7pt`xSlbIuc^T`UJkbxuUX~IBJDIswQ$ydU%N{rw(k1`REqmhHTos+EtfbsFz zKN==afW`nI z_+l^t55xRV9U}uP0B8=DvHc+f8v?We0Br$4I{+i&pW2Kp03g^B+?YcqSOYhw<_I*ZZjstoit405F5k#IJAN z-#6CNGW}i_K}Vy<3xSQ31?qhsV`{k7JQmnGo8?13cs znl(2Pv@x{;0T{rW?gX+{1F(XdYy8z03o}^!xKl#E?j|~BW&quz!JI6t0Cw={1z!PT zRtBcvTL^3d_&7WsHfo>&&uEzl0=0Cb}H)svVxc(AAG{khvug5UF! z0oj;3nK1%5IKaLBDm?lu)88d#u#rr^s{qW5j|FhQPT?SiMBGGa9^$&zdB868UD_5!9Q}L<$ZDJsLQU>z96LsC(Q##h>n2m zPL5mvxt;ksst^J*z*iviEjhYu8wNtpH*5uHfx;p($QM9$0Z2%IDhu``3wA6(K_GHl zkYZJ5L>YphNqAng&^LlxqTOH=2Eso#1#Xdm5TE5`IjNx?z#kFX>Bz0sq2U9v#(U$B z8z_bb=;WBKYYf;c&$mO!1Xkt)!ro!MY$!E$ZhpF*X+XjYM2$o>KTp@hm2f=<{e#};k@(duvH4}1&0Su}CHz)=ZO!!)K$&dTaOfFF3 zwt?Q!To66Cq7pDrzD7QR?e?N>cNf#^ZW9Lw()}3-CZjYPIiI!w?q2#ucc=&yLM*ZTr-~H**=Ic(6!6#Y z@q0&+NVg`tmc}3Q?>rpbTBh7{Lf|g_Fy@Acm$*v(@ zQVXWKe$Q_hTC)aLl=Dr6=32L6YfdMeTP!f0X@>PAWhPf=B8mUGrF zr*YO;jn#tp%Y1LY+6x1FGFEH{Bexp~2vYC@^0w+bF3jVqJ);It%&r`J9=hZ8lbam)_3`$z(4Bm1VO9o_?BQ9NHl#Q#0_nGewtLyCBdrRDYNz86VibKz!?-B)Yj zturw)Pgc3+KvDefXnTi&Y`HKkRt{UoFDGrqq|tGoPryjN4fn{pwc|u7C#&4{D(}+c6h4eyNAQg_@sW>N;Ocs70%2iiZ93y=OKfXD%e04D5!i5|%6w^A z70FqM2>;#kn_dQu%i9|&T!74 zs?>a^mP?A_PEuk`W41=XA5Ub$u^>(Kr6w^>(rJiQ6Njb|UTBig^i`GPx2tK-pK3xB z3hHKO;jc(!8Yr$Oy?E4(*=%HBtzaqjN!8G0c3a}aw&+4gh`!V$= zKk%z9s8XUVev%WDv1_dS#_Nk4rorzPMK|N8>cwDWo9(Go9k46aSO5buv{r1RJ$=V4 zAiErLo5anGAwOc?qmgVoShhgz7&*#!a+T(GR432fT=nd_#b=~@a(|Z8_|Cu7b@ukF zzI>}j<<2v*WtavheO`rHZ{^OBAK!>L_u6Bzy?Sb+0*%6zrv%?J>9c2-h#H6*$m~mi z(Bt#JrPLg=G!i%`>nYr^(N?S!)au*p-7GGoQdPOROoWoz?9E{pr?ARl^9Q{UbN+m1_bS@G}E}2YK%J=JmC_B-6&e+WyK1YVB!Y{t zL*r#HDzd1R(7hD&yS?oFksl#0FnW^cr_x~4#}!&_@y#@m&4ECZ+O*s@Z3)?ASSayU zFMI}H+2AHlewWReE3sl*W zw}gXyWX!5Bmylx_tk;bC++JpT(bUwY@|3Wu9qsgQBc-^Wr5>wn2JdP$P*i$jL}cXZ z#m3EnG#@_Sff7loaRTH|wuAyHR z)e&JL*I=aB)mGHp6If11(J7PUl{_(pzHM6E-6yBuIu_pC*(l&#jE~orsE>6Z8Pb4I zFc!v<=*_TvUy$(G&?7IOFo_JXO=&doI6~Yki zd=D>w^itI8wtlD6p(DEJ1Ww?rdo>_$G$0p~zNhKz8kI2(j#VzSr-vEjvepOks*Wg+ z=n`M95}VSbT;@9NFe)vl>#k~A7h*YUy0E4qPo(4OG?eMbQnO?bQXZqoy}2GR1ay-Y zhLVzWz8+MEi^IO?3~WzF5>{r-K{^O*_Gn0$upp~hBO!fb;vQ2%FJj&P&GyjWHrhr9 zDSgv1FL&5_moe2mPzeh4S;)*XhYHUS4brntPWgiJQ;RGpL3B6 z-iOUW=rmT`6AJq~+Y3CtK`)u|YHr#InX1s1qJ+X0ay*mWzQKm-V(XN*tnZqxkMHvM z6!?5HoulJ(To!cXo7{*Mi#$S`CFg+|nhZvWHC4pd z?~1TwR;<6NrpMXn967G;dM`y=wGDK|oN~{pbi`29t`P~ zA0BN?jb;RvHKQ8P6PHQFD;ndR4V{;j0joy#5My6*DZVrW*kd!7ye;c2cy|~%)YI^q zZ#kH-x|d4fyU@ayi}FDWZGloRx4h~p?78K|+@IdItPhqjB-j+Drp`RQ!uwX6J@&$g z1MbgVESPo*mNhJOv|TKbHd2Sn5nox_%EgtX)d_?us$QiAU_pMlhAqR?y9$bcN4e}S zPPg`|F%owy2;F;Q-I1WJDw#jne4_nBpE5nyR;g0Q8iZ_(Zjv4dzn6+%IdI!&5hw~5 ziB!)_lX}??vdO2mP-2vZ2zr*hAe|Y=&moqFCj^r#Tu0ccEO46uHID9zQllc`=_G2M zL8N~Za=^zi@8zk3ca!;+mt=aI0qOeHu$?8}s;_7?2VWv!OQDyYIekB$yRuwv)t4|( z1;!QiSicJ5z`A&t+2@vAy|Twc@|%Ugd8wS4Zm~|_iQPL1B|Iznom6EPccuZ1U0RnH zqD@8eq^c)-p~-?1zkIMx*efb$OjNWhVU#^7>+YC{GrOo!1x%PGctgi{EnfY!gNyr(Cq&lp9Ae5BXXeQV+;;- z21k{D1pbUn;BMUkz_;ME${%L@8J#~Z_2Wu`GkuJY;rTyr4)F9C!1g}|p^xd5|NiD+ zd)z3n4%>gO|J{NWyq;{#ze9S~rvwfwJL{9|&rzRr{*tpXu!GZjEa0R8_yf-GJ=Xo| z@3H1FIq*+H;LjA<|1Kc_PRjg|5CDhKk0Jf9gus6}T>mj6z{m)0@^?yr<*)XCrv$+J z_mmR=Cqr1kiGioQ;D1O8Je@9}AW#@60+a_Tfs+J=;4}dUXbLp@J568@P82u-oq*0j zci`K9B@BM$N&h(IezXmkt48URgXx&p1EI3jPcVrk21#<<&u&QmID zE>hAj?(0W%E$=iA6O6pqlZ}SYc=le-lX(fcbM(VzzISlJgMn^Sf)J&9hE=wQrDRm3BvO996u{VA``}Vu=?Zs5eR7{j z4*AhlDC5N&1yf(#iN%+zev`g}Q4n6(gOIBS&@jDZQ4mf1rnQhi(QV+rQbD1TKl=b_ z2baLz3TyCvMF#PDJSM4<4iRu1$*|C|sV|%c|CMM8+xL6CtRBP^`SZ=NpOCE>)!6`R z>}o=&y-lBvsg}?pH$c>!LLUF7kMk~nccvVwM7objMv4y40*09{E@FfL_k%|v;~Mc6 zwnFa%_2(^AQLfgF)cud}zN7p?s5Z2yOYoOuaIOiwt+*jh!nYx0DXR}Qkn^?rumZ4L zNre`>w+{>B`X3@QP=^m-`RIN6?i24q+kBX-xy|5gee2Mxo8DNFp5IR=Z?@nly98ve zpboo07%e>9Xw`_u{H{l@nL^Yc{{0XL%;AAE+1KuU>eY>HM4`L`3AZrcsfevfy zofuilqK}v94D=bW+PU>5KTJCjBw1>rNL#k>3uU4X>2%ufXz>^)tF$vs;p3$pVO3H7 zGCk|0q1UWBSIv`2De7wHy@JY_RjvFeoIG39C;5F(wBZwx?5 z51e!eF5gkitNYZ9?sY#I%0=^TWly13x#xSQ>}{n-zFK7R_p8n_tg>SJ;Wr|RiZ)@u z+=V{sW-I2tXK*Yd)6(!lom?I9mD98igwjNOmhTD^7?y`{FM+DqO-)IWbR3_wcQuFO z9fUBHe+MnV5i76H zi0@O9rx#pZ&^EoFX+_|z$#2F{|HH14{$8*(HqGqVBYlCr?)F~Msf_=m$&kzME*+FUPBkv%np z$+I)nIC4n3d&%-8l~wZ;3GuqNv9w)Yc*seHI3?QiI3hW%yrJ>226~Qx;>#C+Gkdjif_u90O8;|yPSiINW;KTON%c!|8y9jec!>+)I(@b=93!sV9k zl;p566I3LoZM+@oXk8Af8LLA$vFs>sCd;C`3 zcTczvP0s>tB({{deC%gHl-5ThimxgqMG2o9NnWQi*r%&l9rY;}PRAM4r>kpZB53JG z(C$vuu_lpz$AeiF$kZcOj>Kr+=?-&Z@h@O@K39^}Y#QlvZ%&g3HF;r}a!$5|7kzRkEyu$Mg><@T_@o* zH@8-5Gn$1Yk3ZK~&jG9B_%>RyCsaFxx~_}7=uSgKH%-obhr7$peedm|Z+nCGRdpK` zuCX00+LxQ;rrGDgI)wgRga)_`&uTY^FxMK6Im55C`mdnzImVVbKVELJC`H?b^@XO! zSe~*;>NuqVvBC%1#1)|7@qYA2P20*bC*jBqeTyZC1GIV17K`Lp`#nxWpMCSvg{yd7!6x z>Y5%7tJy>0Q~;x;oTA38yg;*o^IB2=h3*wsh;rE&G0ms<*ZHET))}%NRdFn;$ol7( z9ADcf^?W!Dzf6hpl77XK|7pPJlZuI})7m*SAKX5g9b0(7rQJe12UFP4EHFe8fsn!C zG8kgrj~*KFdwSdAzD$Eq65-n(_uWbs%z5&&G;e%@KECum2NAjK;7{8v$p}TttP9R= zuaE;9Tt%ImlIxlBnxsmqN)x}7F@9|=G88;eoBJ5=K3_uslbK;f=0-7qpQY}n^NQT% zu$Z1P#k6E7l7N*GF)i*0XVJ`Bh;KzMnkCOHBXK0D$Zzxp@U;+ClQ^FQ&*{WYxz#uz zskR_S%b#?z_K-U@kJnvF8WFN$|Bjfaj&@DFlDBh6AHLt&aD|>80ip5gPPkInRpn0E zKf6OG?$UjSonL#elP(rX?ECX?#xm5^YYQwM@n@nj7x$$1G9MWIUT(T1>-yxOF@aX- z?uAB>u~ziC33(Lw4?Lvzrx4!AUWK-+mmMGk)V!kAg>kxbiYB*V7Z^J6n6=xKzgVzg zN%Xd#8Wv5Nn~izh9cqbz*jPn)$2-73khDaW4GL0qvn8V%~(c)UJQ2>+~$} zwuAoJya|>VzxlKA+3LkWj^!1g!0VRrGW=}A+c8>O-)k8*WL%3fK5jLJd|jE)Ss9%w z(gev<5Ll9 zNY7JWu6vp+I7;%6k{S3MUJncSofngS^^0QrL1f0bu|pWs2r*8d(Hy2%33Gm3&+SVw z2Q1fUpN}w=lYLOTGC1@01SPg^p5oV=7A`QJ+SE+}J=trJ`dL*AJo>b{%=PGjIul=0 zmHj={uQCK@$6d;OqB-~3=RQZQ)<{82wNAa5iT`9O-tdareL@|p_E2FHHPLJT82fk@ z9>#T}SkQ$sadm8*cG-$aMYoB7=Ci{m-FLCk2&QB@@n5=KgEo0Xt=w*5tNGQ3YdpH= zLSNFKcSoMYs>r&wxgKLT&%~=vMwJ`Zs^~>2Od_hRuObrr@Hy-BNUx#jnT(Xw57d_` zy|&LWm(=te*UIj)y?gs*GIxL|ySw~3RYEk-wPCmCtDnx~i>*dZ5`LaV44x8D$)sTH zfv}CLet&}|;CLW7pQ2^E|DzCPxnnh<8`FIz&Ti;@BDtn2lD@vVrH$3h_G@o8Q4gsP z=*G~@??0Q7_)Ji#aQ1a?Lw@;~_ zl@PE=bRV}8{aUgy*ueuW{IRQtJSq&SUS!PRxq*6FL7; zu1aHKGBKfkNL7LTRRzvBu+{C5bqPUiQULHYMYyx^uSjn8}hn zkVIaz3lps+r7H!f7M>^TI%BqLa$V12r(_&2QCgpCL6}%0Nb$S3899k7 z3b}q?-8S~Qkq$1ZTsUilWOF&#XKkf_H#U3k?a8Qp4Ku%8pgN;=XF3;+2@>-Q3W9&w^^` zT5MfhyWKaX-jBxmAT5^4Vp4>XqpySzMxN|Dqm{dn@>)bIXiuWE`-)kbZYialr} zlVGhphHd($R;l(7d$Hq{wveO0jWzeEW#El`pngN%vVI0)29&*SPMu_%G%Jo!D*WqnkKo_hV>0aeP_8Q4|&xV|n zY!06F;xHr#Q`1L}#J@&xImc>1%vXq(l&>MKxY_hOI;i%x>z$N~zg+LWhUuHhd$-Ut z+%?4FF?PC3A!OTvbEFp`Fw`|IPl7?$shRo_Pydo-1D+rVrbr@1NlM<6w*t!`C^HwWo@^zIzJPKQcUBT0@4}_OI?|c#;OBxB3aN&3_19e|8&v@JuvdMC;145o zVGjayDSR9_?b~)6_v>aR4iko(?>zc1`wB)a-ZRKm7>GwQ!`H>d9#S+5zzuwz%0$#6SR6r*+ig&POa3RPKY5rUx_FNufHp> z#aud5%hfQgKdD%fLXQ?#g^oQ$9eNy*+mlOx&@YqCDTN!ooan|h`D#>jy!xx1V`D4= zZcZ4%ks*GkLN$=M&nnHn7Y|W%A`iPvUrXVwGR5$u_}9dvcQ_H$RlM|wKWvH8rfJv- z`H6zMGMmIp>*7>>i2}+bXpW+7v@*#*PAEZtJ%=@PTP@RWRE^7(e=!qzoXp?dD7c_3 zUgFq6i-5YC>y%mYoG?cAd>+h{LsKI!*wa_1>*II9q9|tzcb#pmdg~Pr$T}&yfkL(M z+qRc5aX|R;U~p0Q6K-R2^=K)q373@%qm?qi`(w zXi08C*Tb+`Jl?mH%tDk$y-{qnL#SLxX%fmA(iaHd-wrUlT%L1TvV8TvZ>m0c?uGSj zaxS*Q`rt~XCc6oVwQF|UqGnNUR*8QSJ$a8W;ht{;6A7cI~#h3P|Rh`-R1if_^eHGf#JtPL~d1mLG7YVP;w0uqw zY39A-WpsjzR#GAf8!!FUKHGoFM|?#>^Ij)0KWHkZdd+HS@P;QW*_<^KvmGrfUGc|s zdv+-qu%?xho`BQ^hl9C`6X;|}d434NldgacmzbrLUOp4wSjgvg z$`zFn_?c=cH0;?>?7cBH{&P|O_tZaMF9w;&s}w||)<~~JBfUz_kq1zIzJy(GmeV@v>ZDshc6Nf0dT@nfeZ{7E^Y%yKTvF*(wQVwh=zyC9 z1q6S`s;#$qOW`Emy_Cm^>K|{87%%9o)I3OfblGQM?-X#+g#Ic1VLcYUv5MvfL4^~z zv6U6!x>#U?Z|SK=i0o-UIpU-qigctVzx%;F(b&3ht2!w$!IH3_%0WB1m%p#;b7f(+ zKyQEVnzFb4O^_B`jpbsG*;1q*YV659XkX@CMc%V6fdYh&qRt=I_xdxeU4)m#36#4O z4Yhu5R85}~31UY~dJozHz8TwVvT$=U=ROyeIjt%SPR$OVcK0hwPVp`;&8;^b(1hZL z*}dt~78(X_39?ia#jw~{Y?4>;8&AVqGSbzMB4w>e!}4Z&#dp3!R7qqS$ro|HOX5le zE!p+h*laH}q>=*|@@n54vrYuwaV0IrwFzZYYOrhwq+-7|Y1M`3)HsP0U;CmmdA;7% zn+KfyqxV6s+cKU2ILg&PfPnM`W6q(`dPKZT)ZhdzZvf>c&4sh3Okw>)Hu>CFq*WRC==__4Uc27P}5Q%^mXK}bF8`TFjq zd)Upw%r4VmKSA}#DH8tldM$W>jgi!>t#gQ+W=%h$#H4ixy4-2X2TEqo97_6@4TD6{ zI$M?9alNcxx(aZv>+H3~OYGJb4o-(HlQg4ul>owrd9^GIpUf5mj)?E22PwnJN zX-o@^`zjS{8c{{QHayPu?DiE)TlYTYvO7mJ^I7u>Oy8U5DB2ClMXX+&8txj2o;m<^ z&E|J!7p3`WzVFJ%!`~xJ<=E0|DZCZTi>v}z?7J8zsy$n}4(*h1Q7h|K&cjQqn(`8R%Q=WymLm}B*nesclKMNbL z(p%clj=z^=Dw^f4^0y)su~w6pjo^W-)DXw{DX~?uBf2_j)*#s=e>k(=nHQWBydBOP zG=lKc>J1&hr^=CC*q8R@g-PM0*pVq&7|=)*pFlY>|AM;Ag~^liq)$;p-+xPdEN4e@ z0tY?ayFf569_BiDBIM)~D&2iDTS>X#PoaB{yqA%U+lL!%{|@KBIX=<*fd*h>1pz>z|AbJ2 z0Y@3*;GuhL&tzm^irsQ=rRKe5rjsmj3L_$SZ;0JH=EtpGslf2hg- z1^NWK0D!Ilpxgfy@_amwzaUQzFqii?Ncn$$vV!5--)|;%Fxi}g^Xc;_dn$u_dVGTa zw*c1sPoH1X-}=A%Vgc^~JGdP?m{82l0Dgj*?(9#nDjVygZI5zhFaiFTJ|~!D{iF$Q z!3N%$U(&}mkH5h1@uLBc??+P}jre8KqvXjX@M&TJpIO$wp3IL_>_>CK<)=wJmce~I z{(fAVNBQsiM>#Vm6ZixE8w7arPjz6~-1s*J|Gz_J|4q~W3swDv z%KrO~_>Z708|NRGEHjv*|0hkGiS;)o%K-kv1}7NI{?9~h@E!5*JK>Kz;GZktj~n2Z z$N%N2Er6ClE1>mXjPrk>WEY?-(Cxnh%3yZDzc1P+ z!S5~m8&GCv059`zKpBjKGe7>@;R#>!<-DV<-<}(vPPSt7qP$sKGlUI-LTS@) z^;xhgUa%UJ*nlwjSd!dSSCB~NtCX;tPLArE!8*FM(Ax?NFj_H#{R%tHz*G)J{Vr_q zU4+d~2*FpceAoEpIUum#p$d4IW-#(%Vqvw;Ec9Z$foEZ@5j4CMmu&BbfmyjME3b&z ze?aDh-ha`m1kvwft_0Z{-3=gm#qP^E3KJ}d3zLQd?{eiMyvH9J%B88!drSETR!ZA9HtYF6 zOl}SfAIKj<6Ym*nxzD#sA?U>HJQ7=jSC${Ha!-jJgJT0-ebcjP?G=>xf=Fdfaq05pT1)5L&Uu}Q*Av)@7&yqydO&In=KPd z*soVuhH(5yY0r#rsX7tf*ul+xxQA(F0uZgVB%)ZYZl9Q@pzySOPUJl*LpC`Q5|lgl zfqK2-TX(8Y@CFAi<5Zv0D&=8Y>)pM`jOM*L)aYtD*%cMMUR+zc=$8+B@b@G~7Jm2W zaK3_iJ?MiA4u$Q zs(i5UYK;QUVZ}ZP^gL9>tRQ_~26jHYd~Z6D zCs6v*X>f%Z^8U?j-kuHwy$gNWL!9}BF&bZK#6$f~8~fZtc`)bYJv5Z=J28pS76CCH zNZeo)!LB9JI%SITiH}0L;rzyy4JLC@cX(MOC5U3#Kk}z7CWxh#N0$%V4=@{e*17$v z+-bu?)2`<3B$7N9ou`&%?QOf&TV$f_=PT}bw~5|hsn|&s4L}W^-UGlW$BWl;3yAx?=ONu*H_Bn$LcoujE)}G#CdFao)kYb z*yIXoV(aHIBOb}CbJZKv(;K+YY=*d9bQZ{6y!Y!_jc-^cc59k5rQWId7DV&D!E-?n zv=?dThvv;^T6`fda`>I|+)pAX?3BRTF`26miL+r?tId`dmyoxTr_bNB`!qpEL386f z9L&YEus}Pnx?HkKG1_c*4YT}&M$ZokRcl&VjcC^)-0Yd8JDLJz`~#W8vT>Con5HPc z*^{0ocMgQ?ZTPo19DqdI&%9djio6~J1f-wOQ9Psgds~O|siHsaDtA_!0zxorXRt#Y zK9?BQ(QM`nbSi zI-`dKzLWa+g6z=dna(#4&8UkRyW!!666XmTW019{D%r~eo-$DfDjg&FseUb1YcGO& zjo|L1oE>{wwaV}C#-=y7UCd#Z=tBV=G zFw5B@A>03gl%u>R2QWNM_qCWNk~1@mJN3<8*XhkgtVGL~e2&1~jAw_BiMXdF$1unl z2CO@iOG-KO2%gAU%(l~X>l?Y?*m02^m_9zC3pB?YN=yAKPzF5) zzNX%=BBLRb+jGG6H|+=N0aHFE`4YE(B&8;@PRI*HZz1ar7b;D2AI8PK0RXCe^O2>d zMhmegZ6&r&2S3c-Pl?Ti>3*VWPk&)m;G#7_kbKbr)B84&F1Ku>bGNH@SEzSDHu})p zkXTCkr4P>bSNeAndL9OB#?qr~OfF={NG&Y5VAb4(2s*Gt@ zAJ@u1dg(qu*>7r^l(|ht1?3Qx)$G%xg};)yAwf-#W=CE$ABTp$&q_X2a&D8QHu>iA z_V&t6O#wa?`872Wug!H=ewmr_yK+!c(WYYqDBe(>+AyhDJkk4Kn6wl-cdHmmpFQ_Cm$h z`(SxY$4fXW4-hx@bu~|GX`*F|!*pa$83(qYxAW)V7qg9{xm|p7Ds*%`F&tW1_Ia(b zGKDS9Jz129`rsXf&H7Mfq#x-r-}_UUu7Qf)kV+clo#oQWEFqa^RMqQ2B3$)lF% z7gG27dE2|XvCKNba_u7f*II%(cEj!x&0*hnS0%0C``Sh>A*59YA)aj)u&HkA9}0;h za*QHKcD!K}+Rmmz+fpB*MU0X`9J%9L8Z$%ae*G3X!?I0!OOWlm(GMeA(JZCi`7lzN zg-Z?0(+h3B1BMjY{mWH@bp|_strxZBfLM?(0e^%W>?YvwoC{9q>+uh$eUSKYs z=FWj*6X5%je)PpF#YDixo>$ZIir*zd!Bj)DOsD}#G9873s;s9IzAEpSlAfF?Y>N)d zxGIxNET7SlqPdzfmP2}jH|pl~5~&|67H(ZXbAgClTw23;xkku~UQFBzHj_DeijBIS zQ2T^40#V)Fhz=RfNF2}7I`s&*J%)imG#*qv-#p(P z2!%F3kEENeHF*^?e+Y6V*;Q3t8S}qyeUR~ZUrtH*)a9=LC z)oyhLS(Ch1$PhBa4qpYXkQN#GCP9b1%gZ)dyC-ojhqGQ*$Ov2~kP> zo7^eB95YEdOga^}q+JST=LHdVbw+R>-wU&j@HeS?b~$1nFY-ah$c%g`M|DsB*( z?2{z^=;})B7g_sp4_}yliMjgYhs-L8@r96`>jSHAXsJu|Zr+z)J_820@R5$TXbOA# zZC)p@YTilt;H#J~mazM1UFHMqUyr|Pf{Bs44#mMK^s*dW zOxo2&D3wQkH5Q1cx8d6sV;#<(U;M+6Z%JKfSB-R-BeS79$FFi`GA3>mmZI(X1s!ZD zRoG7wM{CJtDJOOc8J9e$8`+)aXVPCgOv<#sd>MhunUqnjL)^+bI#4%=Atp2o>ctlB zVzZH6igS~2VqUTw%~=e?gOn%x@X76UdOBa7$PxF z;Sd`jpICMdGZ)uuEIn3K69}VvqfZj!7wSfmIf~}v9A$Dl%rwv2ijPX36RVlIv1Gy& zdrr-E$z0CsjAx~KMkgnjldMFolfi|Xl?lK6M6TB7k$ihXkSu%!=>W=A>qAU(Eykvo zX|oV3{ z8e}N#Dx6Wzpv8Ap3{)fbM%zrr5L5~9FK4k%%05BQnQxf=g4p>+p#r-E6p>;VetGgX zH^aVK%pRLU*ZyXhBq}RPbxK4*Sj?I+*?_QNf5Co}EX!RG1IHsB=whY9q@)rS|E0uB zeSa0PzABZCklS{;9BzSQfb86sFOYr{NqfAREpzKVX}W8288jFCq)HI6Rnag4GVKVT zfFCzSu?9a&;b_3vHzRe8{>%}lR%Z@8H9t#wFER7FBL5IFVxdj{{Ln#JW?aa7ZySmw zt~1liE!IttybW%f&TeqsR2lAjQ8*c;yi&_W1zA+c-rV(oggo|(A4c>vnO~b)$0@Dv zKjG%1N}!~=B^Ss^lul8P`Ol|G&Y-ZGHbme{2k*1pH)g%(*l+@HVH!~#EvaD$`*ybr zSx?Wi39=gZ%2ngV8KF4hDf}ulUyK)cK1T=KG7mj=LXnZ zFj&vVd6)RYW%0A|j1v3J@|*@;``U*SQCsM!lDW(uhq@O-Mm`k*X8q#3CG){UW!g(y zqBsoYidk+3wLOd{)AVUxje$oGFXSj?jqWwj6363$on~8K^(lLdd8AA`UWS_Gvsmvh zRB&R6mf0ibcUKvZ$~Hg-U&N?nGFcz@(}8mb$d=f=VNhpyYoL}M3J4NAZ^mpmgtE5@ z8TLY@I){>8a%=HGqk-%M-un_ylokoME5_&@@4Ee^y0C+aBiCwck`!g+^J+of@v}o7 z)T@bZ5}6(b2ELS@1dh|O*bSUGglJg2?5^4|X#ICoMzYwuohjMImcZ?KsbR!`~NL~L2>+d}kkgOeh@ zj$neUSA)6bmqGN+zCLrn<6VQrUV2sAgqsP*nkY)qszMUw5K#eBLEo&%kJ)@hq(~Z- zS(Ew&LSZq#LOAtrS{=tRb!@RlCVb+sB%TwzydfpDe-W zLvx`37N{^X5()_k*AS-hL^yw*g;H-BFT|fk6AsZ|Wg7DB&+~F-70tKJT5Oh-2C5}` z$=p;75Fr^Lzm1g8z7i5eLv;%tZMVq5c6TM29!1VQ{gQ zn2eXYB4W$d%`>;|0WY<-y1&u>Ac=4DTQ^E{iNG81JXe~4&`(`@dvj&?^1EJ+X$~vP z>uH*(q$}(R0ZYN-nc3Co!Vjk@##~nXt!n!C27_SD5OU60#8?dvX0%r zP%Ww#jg=p=1$04?Z>jarqu4aTR@A-_w8hj5*+t{@f@uqu1UPqC>4%M(kNXucP`Xvx9*wWNPU_P4Q>VN>}HD5)e|OM)y377c-St zX`@B?B0oR>y!9etch|8PQHu5%<#Br!oKe-BQj3p^OzH>pJPi4JR{TU5?IDSwICu5I zAD^qokn;pwpp;xcyht6zW$e};6{gX5|0#uFR=8cQ@5<|G&JT%Otnd;M#*|@a3=Uru z>hsSZ)P*g=*`yJ`=@)sWHZ332)|9f-h)3^LdtBBFyo?~BLy+XR9Akf+u*p@Ore#}} zYI0CcW>-eLtXdIk9Hfl`=xPs?)o&@9`FqOz7|v&=s!^R2Z#av)?+T(+o*perWQ(w@XPgFYm^2z3R%Xb z8}8T(z5QmDyGnUu>Fiav@|G0X^KUe`)qXGLWGbh4kK1~Ej2Eii(_H> zU+3PfXDQBp5iey@FrW*h`o^^$q9hZ>0n+RrTU$cQtn@DR##kGN3?__Zh2%cxH8R)1 zrB+{SBN;13BX?-A#t8O}BH=gnS8v%DQWrb3?RS-|-Z`1v->2X_cJ{0md+tPgwL$Zx zf@S%c(CtEYv*&HhC$)SGj4~QW1F_27N6R{P)8JwfsmwwlM~oZ{MJ{ z!Kv#O8RC-%39){E<92zn!#h!OQbHR0We?Rw+#HS~Il)_#V9aYpPFz5f#s{4UjrHNs zEvU>cwX#{^V@8H0?cSU}nH3SGZzzTLYnn89i3>wC#I|ph_2ZJXO%-2Xtlq`9b7mS2Go2n7%N5Dxl}9F$-6Tp z6L6Zph&OVB5_pCYj?#;pM4|~kE|eg2Dk9qbN>X>|$zi>EO`3o)2)S>8(HNQ4BpA?~ zIO?8-jS44$PV@K_eQw;*J!5MAc_R7sN~JRGDjK$5k8vde)hs=!bm@Z6JJCank& zO#ePtCeWoD9Y7jyOxfUul!6D_lMoSiBR<^xkwqw^g6%bRsI&b0?3jF+(e2#hCim`h zC}QQt_^KZ!ZRk;hz5ZdGeiOL#f?%S}mez9)5&@)Av!>`;C9rXT)K`9@lT1QGM#RXPpFMbI-th2;mgceST%9)Q zq81-9Sf58orpqB#)sT&gk8So7$MZFjQak@h16wk@|0PNAJs4@yO4%}xZqqZ`$|%u- zAtdRmY%4){t~btO_}iv|-V2&0*n~RHNM9hv;!9a9BlGFRvlHlqXAHpuZwIA~rzW=77y9iz48^_dpK_e*%MqxX>6K#7%Wn*bDO zIky~)V*#kK`lgf$J)>Dsm{cB#>{4l` z4CtI%bSF84XOoR@23#nWDKsM2wyFC1pBcWWT zU|qp-UwSf+2;aBK&*NSXIPsYwszasp%1f><;N3L3^R!E1pj|%#&!f4ZPBo{1JSd~V zT4@&FSjtg&$*3u*n4|#Ym3Ebd0WB!));44`UbXVv;rNu637j1s?rz{*3-_^r`dacZ zi2il(Lu?v1$W!d8I2T3H+jJ1n+AA^38GPz;snDta30kYyXNO)%l?|iE3p~sAi5crQ z6z2)d6*a}|P5C8|RV?)-yk|#X2%4IvgN~4v(>aLrZ5u>hu0E=9*H_M>7U33DCV~Fu zp*EL>lh9<TYgGy_H?sXWB4vw27`=Ve`m5>|8saWPl?Q-p}tV%g|xKWJJZW09! zJ++4`4o@5ILSsgKs+4=a>mm4Co?E!_-^ssUgN}}^QspHh-*!ACd9bquKAliEd2AOv zSq%uh8Y2$kyadNt8#j{jAka>{Xg9BW=iT0K$;5y^tfzuQT~9N0$_Lo%B;7 zt;m8THnH^0imrlo#EB5X|kckeWwfj8scSfXCxz8*o%b*7f~ zw5GU&gGQbTH{m2HnwWw;@qD*_tQ4455W;xv4~|>ZxLWCYBQ6TSIXSg`Z3JH)Z@_cl zB?P~R<=b?9*G&0p@_6(y*2ogiX!FoSU^K2^>`XtG6PdH5u_dDMmLs#RujpB+Hc^Vu zq>Xn#>B0l?Hr`|4ru-Uyl$J(-Likb*9tk~NnTZ)iEpDKzI}m}BzWSc%Yq2mW42WK~ z>w-@F#TI+8L|Y*HYLvSb*m1sNXiN)V-ked5{kIeOymA|v(A)Yub90dt&ED$sQa%3i z{B5h3uShuB(cD~}LX4Kv292ra8tjzG{;@=*mr)0})^vgbNY)~-zIII=JcbexI2WIK zCQCCfD_MDvU@;_w{au+4F9qe@I+Z1zU=!2xFDOwtCo2{Lm=t#UrcC$Da`N~o6hVLV zDmL;CKnbZMcNROER@HM0WA)K8fx>X~x9bIxsxBg)hDGC0X>7!z!+5;OXZ|RZ!3YUj zm=Zb-J2&`rFn{J}6WjPqNWF_W=cXy6qIqUFlI#7^Ds~z(3ertxO^wfMb*A0sa|UY( zVO;GJw1=!z|2@LxYr5cvY5QsQtRNG4qr5p?Xs!9(zD$`rJ-;h87-7}0)HFm$bvVu8 zT;xn2)$&?_F-y44hVM%cPU5W$Q9rd!=&b{mhZx_9$~~CkkgkI_&7{f@s(gNPkyU@4vl=xQ9_?`JlRu*VmaF@z)aRtX zJ>UO~#$QdtNmXche!tBO?ph$~a&lQFSCU;goftdpq$+5>C&xPdJv*lx$wK%|6{0986<#I6=kw@wV@J9xyuc^(`&7N&u4DhV}G(ie`Y} zOL*Vlq@M1*M$Wb_@EM3rgq9m2eg*zr&+OvlP&g8!q~KdH-n^w%M=8SGp7a`hrMUdb!5K(}(L?eplf%Qx_wp;aa{IJq>W{`kn_#CO z2=1c_mC`E-UDdIL6*QKF$RpLMFM9|%#24I<;E<-2pW6`_Rq(ttmJZtJ(|Gu>VK=Qw zJgJc(*K67mx++B5^$Gwkw zoaoWl=6T+Usl3y)T^#w5W%j;}4+fa+Rs&tqRD+e@19wYzNUIt8d27Ken_6mMUHLhO z=tDv1baf(U2D-kJuUgF9(i+h`Sbi9+xFiVpP>tc@zE?kT^gzkM?SsEk6AOn$po~;A)WL!fr*s#3#WD0QVy%Av!#$Zt%gB9h_m7CSC*(x#eCbR44shP$5gUrF&pr9 zmZ5K7Z@Ff+IUEC0w1kLqX3Tr;5G-OX9zrN<#M&xj)=vD9>)+uMV4FB;I>-qf}E4qOzW99z|5^16U;FSX-SSwKKtc*i7k#ujO#@=R#6 zA;3svz(W^UN_{KHyxn2Us7E+K4ma7ajEl=SbQ?_5I9Phm({Yi0z0UVe@FZDD9S`0z zXsrLT+xa?+X{F-H%GIdBi=vG*MrH^yDTsXyCqX`1` z81`l>$``#@q2VHFC0wwxx)O*V$t53SLR=4&|57l|MCm*<16RW>xLS5kWD+t%P^*on zu?GHQ?|!-Dyz+HzElGAR>1y=oF2KX)09#e42+#FSOkV~IV?tB6A&Zz=>r0DS&W37$ zZ_7k#1IXaQCzee+*7$*wkb&ZP^f;m)1ddCB<==1TG!D0FExtIKq9Y9~ereOBhE8H( zHnD`1$b5zAK7n>%lj3}lKwu!v3b0>P>*w!S+RQj^&E0TlPM9fmw&3o~&m(22gYcOf z;JGdp76@kyoYjx$8=j*&XP!@P7lUwmPc_lFy2+;=E;tSqkv?^SR+oy8#5@ zY2d)O2kOama%s$YDhC}%v#~DUF!#l0=-zIG4YJ0%^aA$^bWbq0a6$?T}ht*@zPzr10o zFN0)WSDh+i{7{TeU3WspxUqZo3P$ltIV$GERCfePd&W&MK?N|*MjQFYbNiVH*9q>a zMK%46wb|gW%I}p#V$Z8h#2EIc=|7H7NAAMtadDcw<*_g*RRl$}EZ4-=)ZG210q z?-?pdWh(GVMdN1#-LpOL-!>Ov%S`q14}|KbX>n0A?CGvo?@rW+2Y|d=esi6q&@Q?7 z;#2X3YM8j40$;aq=yFWF%MOT3@syKYU<$qZ!nRboHuclhr)|txyzU=k{POjN(bxRn z)^QOIVlK2}!p0!enUrx}u26%#1*rpM-`tLwx@GOadj>kki$%U5^J;9XtY9#%i9;=W zTJ~6fq}7w(wQrqqO5wpALA1xl+6t#G8%N*~@1tNdiJhNnjg8IiP5ROJB-lSXezCYa zbn@UBh8k12!hBY@U(QnZ78f<0uQ=mYkr@#K%cZ9VFn{JH+q3 z)nmy#wF#^D$xHH&0<{Da2CABTgE{aQk~>Zq`@B?_UX0H|e%2rNJl*=q>3(Gf_u_%^ z<-F%aO1GuojBr&+f(Q(xbS^gY({F40!YKXKu^HQMx9?L@h67y;{gSPbTw*{1)-wT! z*h0WXx`9mi4SYtxTe+N+^;WNT+HQ_e8eK9@qsy$Kmn+s_6fXlJa|MD9>AZg6Wpx}- z5~CAIO_DybCSQb5G2VT$0v&#(-jzUzaX_UlrVe{gq3cecGNZ{ZWd0S1NzAQGcy-(N zY;0=@dm33t(l8B|v&P{II9KXL<}(WEvm%#76h^JNjm%DYhfh1xw+j+#jYOcb>JcYb zDoxQF7Bs7A&pL7OD=7_*Y8Na~U>zk#)>BKeF!+t>rLEJ2u0-VS@-Z5Dwia_TSVcbS zuw@skVeVOHilQDm0|<_{US0#$x3+t)u2Oqm>7B`Ftxj-^l(6}U9L0Ep-cW9VYLYJ$ zB;YYGN8qChtvBr2M1n$D)9C?$?fRzuoa(%in*vzl9qZ>)&ij72)ON*HsaDO0WzJ*I zNY=Q8lHeaTG@>v&Gfa&f){uuXbj9i)l)4QH;lI$2k_(BKW!x`wG(0@iP;6Z(4IjB= z@QHF-9P|-k*ON-Y^$PK7i9ku^d+B`tYI)A%aZoABo;&;P#FCtN$Gsl{x_yq)6J6c^ zL%H;sA9=IF*q~jEVQVwLRM}v}Su3M8}*@DRC%j5;}{ayVVh+7?kAqO>O(4dJTAp<(EJN_btM@Ha3a#@tPnhszYLsT~J ztuyVVd#*mjUk<+p(v-ji=x*S4whYx}OtDI4JUbdeWk5v&aXZ*nB5t;K_lmlV4#O9HtzC^ecS|}BMDkP> zk@M@M^6YZM1`R_y69UfI3tjnB`Z4QpU!1#m`i4CoQx=8Gb=YGPJ*oq#9pAOd8DMlDu_Tay0+|hm<|lf& zX>|CwKSzL+*WcV~0tNNB6cFQaHpdYh7$V-|SPi`jO4jrVvXHjcwx&lfMFi%nU+V>0 zn$?`%%S1-)Sz3)DC%ToUo{06}T)~7GM`<0{$>??YS=a^rhDmesi%6i{7A^D=S`~ty zi9U^ond546+pz>b@#Oa|S*aZvVejY0t=%64(f*OlL~W>GZY-ye^`EvUszOl+A$_AR zG7pzH51>P_a=LRo8$NYoAW?+a$~a%|C*m`O>i|pjROTrMmSZQy-!h|e!pgXcH0wh! zJ1aN3z_EM}v+%UT?Q)Ori?tFncM$Jeai6+|r(uV&S>bfA>AVtZuixLbbK-%LmHHAoxUZOS@eAPrOdxX2MvT+b=J97R!q*J=5G~?n;-&VoEr;Ri{Vydi{l=F@TeroVts5>-MM0UW7)P zf(UfUe#z*47gKvaLkhA9)a#j4C?0?^)6J0vy;iCGC@ z-JVbBp@nJ%%CZKD{po@2!a-ND?uKg@n8qC|L7Yn)J=aY+gicz`lCG;HKqbyT^teQgF?=kkr`5g=J0OYu!i zcT0G78OupQ-C3yT!{L!3+%e&k*vt(*@D42x&CcKdwz_eNJI8oVTHYJ-_{B*KW)BPt zpWF#{P?Hn%m_m{%B7PGd5f>YqzmSy$czXPYy^5X@?Gu=^jtM*m_daYQZy@MGl4c>0 zXCzXZDu6I_|DxP=geI_HM!6GV5l?rjoe^YkCsObAx{bdJ)pzm1qE4`Q03LPJl`VrQ zt~sps93c%xhj<@Vh*%7K)*I@K>oYu_hz+eq)-HCh&Tlq>4iTc5&$jD+8}={kSuADr4u#aK`u>Wm3fft%UywdO zPSb69OgDUCRF=6!7fC|v?mwH=9jTmNqUEr=pe&y2jgs^mi(h{VAsu)R;S+oJ@q3p= zp|1nRT;lStggvE+dxOVZeFEh5|ADalO*Qj}+TnkNumnI9|Dkzf`z4L|%lQFt^j`=| z#{Y(}l#!KD`z-o9!jkcKsmk9FmW=;ISpN22|Jl0#1;X-wMWF=9-2R08j$`S@rMi$=~kLuP$l;JYIhF{}*lY56a{3I;MZy{!%0X zG)n-+Clf$#^lP8#HyY{hby9Wmr-OP-tu`Uy^fATPOepOxlS7`PD;?Q%$3aL)<8Z z!8^wx+P|{1ARRH=9*(&r*329NT@a7Hmc?1X^aBJsc7Cp|AXqIkVUT5bk>Aq?L0Nbp z^l2U-Sa#p3>BYI3#RY%z52Pq~ACnHnbAd)kDRqR!z71g&BH5`j>P8eH^4rM3Vkd*L z%i9XY4)_9z5F`D#yoKlc2J{o846xqjqX7N~ZbVU#3BPP1MxoaVBFQ>%F#b2(fmyFN zsmB0CzGw>mGy{3CAFAIKhKN7tfWgZTZ%StMY>s0nh`pN{i1)>ZvJ=&jL4yA14hi+%|IUwKBU`uy z;R~L;3vS&n!1(3?omp#z@kMkwPbNc^|9$B|c?MUKcs3KA*C*+;mW!Z^;;qkHujW67roF0AJ%X4P#2VbdG>N9+l97Gb~X8O6a0;7$U$<0SN zLkk~2^_vREfQAykHy9K$G46UY>)<$=`q{_OHf4{dWHns%IltT}q@td*DhB@uJaN~5 z4p((c_0T&7$y_GBGX}00(S<$cO-0zKZF;H3;ymG<&VAj5i z5FTGI=#t2!xXV_>T$Kg_=_OT9SEQ7;X!L?K8nltg*6l_%P$0e=+v$06B59snFkiFO zT?m6N+Qjb&1L+plRa_#p4@*k_Vw_*AEuGYFEKW#1!O^5$Tc^5r0bi@uQHuOlyWdAM z>dJ(3)L0wfG9@vJdGIf4UJ5ifbGLL}UO7l8MB{`DB8RbII zv6xu^TW_@=f&$fG=2k$@#p0sa;R{)#U{ac#_;X6G-*?~8N3l#2+99m*n@L@*H2cXS zP&GSz&mu6!D@V}W$vpyf%$qIZ(USsl2Pqq4e0FiLnDmoz4;ZT^_x|(8$)?Pt*!YX; z^+#TnJhD09u$*C6by_4eZ{sWFBhF#$`;QZj_spqbRniZDr*F)nwcp*|wx@L!rvksY zoK@m$wj0T6ZhdQ8fUM%tfg%f5BZgj>ZgrftESWO#n=`5N$zRUG)5U`6v(YYd zz~L+7)UYEX~i(qP&{>((!%z z6J+a#oc?a=D)^kbFIQ3FoM{HE*R>B~fxTl@t`4rt#UgkCRgM*j%jF>>I*4%0 z2LMZXWWd=pvdR_YG=0_?unKOrnVpuKJ#XXQ;QEM^&>d(qHKguj_fwlc_e_`2JIZ;5 zE#jh*p18R33gzLod5ontt|}zKqkBJjI@IG{>vPlO!ggP1P9ZK-vKIsecb!q8B}eW~ zbeD`c5cu$nMt(OmO~cz+53a`A=fL=CPt!Zs(#`RK9$D+zK67xO5?M0>2ODWh?rHA=P3c*I7g=a*1x)k=nw z>oOq{oebj07rf{cUK#UrMB48VoRw|O4mq7QFm_+={O9F@t5HcOlbot(W9Fr^*^=sX zF3P(P5_Y&EX}_*{Tb`DiJF7*%E<*~n=Sp*u4)TmOlFk}(V1#?DW3iOFWJ_{Dnrq2V zVq0d&X>a=Ie77>1F&UGnoh$k+>YIvL&sPu&xD%ezipRg-kqNB$0B(ezWJ_`iI{31%fb|vyxC_s~vTSz;64PqzY`;Lqylcy**ovm+WW&$ut#u;nbFe?Y1bDh_$Jwy6sA%sS8e_BaUzQ+FC z?yUO$K*`n8px0Ab_hagfYQZDkRXgkArdcX1eUz_>5L4&p?or~iG*=O>*Y?aE^JMFW zvMAb>g;_bj3QenI_M%5f?dlH~lG2N0882%kUc2 zRrDHtH zon~4s*3MpjYh0E`oJd|YEn3O5O^bKkKpP!6T=Y_o+AvBujmfk`KHhkPJ%zJM-mESz>vVkEog{F_H(AS{iLOK(sZePpK$DdkU(C zVU%>v0drK%fts|&0CbN2;iwCu8V>UFy-{HKq!x=93X4q{6yA`|x5V7H#ba=tf4x{O1mcY+|KpZs85c8H`3G>P1{s+fx*Ng*(3VNCWfT$H4z8G7>2RY z6R7cGiuzM&HYsE$YD)e**k{0Rs7PYBTZW|dGRGC=BN$sQ=HmG(LStS*)bQhd3*-?H zIEMkVBZU^tkZ-7#qwVStoU-`*_ptf@8WjT|L;NFbX8MJw|1)f61c2!O2%G;KDn?dV zO-fA#5H>3+{)_Vi)35OE@2r^L-s_J5==Y%he-Sn_0b*4>D*(F1LC@L{fVlW8US$Tv zuK&(~p#!uZz8_`iWu*w`5W9Gw4S;w8mI zad!2tTEP7Rhv4T%1-=%)dlIFX?+3qFek6ogN~I!+3!EY%oI*ClBOIah87>I1?&asq z_XUUZK@Yxly9Cdno9fnmPalWzB!=Fed>i6iL-=~IvYuQqAVdK~4BznR+S*WhexWa_ zsu(!|pTXdO347=diSUt#K@i+7`B8FrKZ1u!01E{geHWI)^Mvz-8XL!gb9NL2Zc%c5 zgNg?xZ}tD7%Y~1U3nIknrzyvA>WkouI0gqJ=nf5>h>zgArNf2r;WGj-=soB%^mat( zhtnQsF<+V?M3{cGr_qFub3h+spHeI@w(j^Ov+>!1jiA20HcR7v7%Aj|fx7y*6o7ph z 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

TCeR_YFe45^j7!yrd$&4y%A2`hbwi zo7Lx4j?MI^YTB>c4-Vuxyr1M(6eG!F_x$SjKcEv5e`ku=NYFA^q?cdce)=?25#rjX zMzT6mi2*sjkd!LoW-CtKw`gMijpW4aA@0^DsV%%K&b@Ejr?{Uc&zjojJ~DDT1!*nR zi80Tb{Qs#3Rz5y!zCyeWdBR3`lcW#u{t9(}e>kNvG0Cbz6p#0tbhpoYY|6uF@>1cl z+gvEzSIA3+8<{hwwDcAMIWBvtZ{J4!7f|i zk!0yBcr~27uW-G6yjy24R>NQ|!s5qydU3m7ZnoHS>%UiX@d7ypm-Xizz8pU|Thn%b z5|o1Uelz{E+m28Vk?g;)5s4}O|B@1eQfqJO%jQblt@cZSzrSy`AP_h8^+)WMsD^Oz z{Pr3l;_1zN(V*tJmPXeCo;&>KW-ex5#M`%fYwx+E}AGXOK%kg=E#pLuz=e&3oJ!)X9xAHQgl~lfq7i7Sz>{foMAoOkAa0? zh$YQ*$YSX)$Im7|Qjbom%Jy)eRbURP!7)At&eAOw!}gp-lF<@#Fy#^p3dw{E+FzFGLxUU} zsTbLNz&x1VdyEz15i~L-7qSG+^xg*;4XbCE4SJkymSgXO24=|H)tXX$;o zz(&R|jf`J{Rx;X(t&<*K0J1qxVMM;j?GkHokH>yn - void f(Dereferenceable p) - { - *what-goes-here?* value = \*p; - ... - } - - -``pointee`` ------------ - -It turns out to be impossible to come up with a fully-general -algorithm to do determine *what-goes-here* directly, but it is -possible to require that ``pointee::type`` is -correct. Naturally, ``pointee`` has the same difficulty: it can't -determine the appropriate ``::type`` reliably for all -``Dereferenceable``\ s, but it makes very good guesses (it works -for all pointers, standard and boost smart pointers, and -iterators), and when it guesses wrongly, it can be specialized as -necessary:: - - namespace boost - { - template - struct pointee > - { - typedef T type; - }; - } - -``indirect_reference`` ----------------------- - -``indirect_reference::type`` is rather more specialized than -``pointee``, and is meant to be used to forward the result of -dereferencing an object of its argument type. Most dereferenceable -types just return a reference to their pointee, but some return -proxy references or return the pointee by value. When that -information is needed, call on ``indirect_reference``. - -Both of these templates are essential to the correct functioning of -|indirect_iterator|_. - -.. |indirect_iterator| replace:: ``indirect_iterator`` -.. _indirect_iterator: indirect_iterator.html - -Reference -========= - -``pointee`` ------------ - -.. include:: pointee_ref.rst - -``indirect_reference`` ----------------------- - -.. include:: indirect_reference_ref.rst - diff --git a/libs/iterator/doc/pointee_ref.rst b/libs/iterator/doc/pointee_ref.rst deleted file mode 100644 index 19aed2491..000000000 --- a/libs/iterator/doc/pointee_ref.rst +++ /dev/null @@ -1,38 +0,0 @@ -.. Copyright David Abrahams 2004. 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) - -:: - - template - struct pointee - { - typedef /* see below */ type; - }; - -:Requires: For an object ``x`` of type ``Dereferenceable``, ``*x`` - is well-formed. If ``++x`` is ill-formed it shall neither be - ambiguous nor shall it violate access control, and - ``Dereferenceable::element_type`` shall be an accessible type. - Otherwise ``iterator_traits::value_type`` shall - be well formed. [Note: These requirements need not apply to - explicit or partial specializations of ``pointee``] - -``type`` is determined according to the following algorithm, where -``x`` is an object of type ``Dereferenceable``:: - - if ( ++x is ill-formed ) - { - return ``Dereferenceable::element_type`` - } - else if (``*x`` is a mutable reference to - std::iterator_traits::value_type) - { - return iterator_traits::value_type - } - else - { - return iterator_traits::value_type const - } - - \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/adaptor.qbk b/libs/iterator/doc/quickbook/adaptor.qbk deleted file mode 100644 index d791ce00f..000000000 --- a/libs/iterator/doc/quickbook/adaptor.qbk +++ /dev/null @@ -1,333 +0,0 @@ - -[section:adaptor Iterator Adaptor] - -The `iterator_adaptor` class template adapts some `Base` [#base]_ -type to create a new iterator. Instantiations of `iterator_adaptor` -are derived from a corresponding instantiation of `iterator_facade` -and implement the core behaviors in terms of the `Base` type. In -essence, `iterator_adaptor` merely forwards all operations to an -instance of the `Base` type, which it stores as a member. - -.. [#base] The term "Base" here does not refer to a base class and is - not meant to imply the use of derivation. We have followed the lead - of the standard library, which provides a base() function to access - the underlying iterator object of a `reverse_iterator` adaptor. - -The user of `iterator_adaptor` creates a class derived from an -instantiation of `iterator_adaptor` and then selectively -redefines some of the core member functions described in the -`iterator_facade` core requirements table. The `Base` type need -not meet the full requirements for an iterator; it need only -support the operations used by the core interface functions of -`iterator_adaptor` that have not been redefined in the user's -derived class. - -Several of the template parameters of `iterator_adaptor` default -to `use_default`. This allows the -user to make use of a default parameter even when she wants to -specify a parameter later in the parameter list. Also, the -defaults for the corresponding associated types are somewhat -complicated, so metaprogramming is required to compute them, and -`use_default` can help to simplify the implementation. Finally, -the identity of the `use_default` type is not left unspecified -because specification helps to highlight that the `Reference` -template parameter may not always be identical to the iterator's -`reference` type, and will keep users from making mistakes based on -that assumption. - -[section:adaptor_reference Reference] - -[h2 Synopsis] - - template < - class Derived - , class Base - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class iterator_adaptor - : public iterator_facade // see details - { - friend class iterator_core_access; - public: - iterator_adaptor(); - explicit iterator_adaptor(Base const& iter); - typedef Base base_type; - Base const& base() const; - protected: - typedef iterator_adaptor iterator_adaptor\_; - Base const& base_reference() const; - Base& base_reference(); - private: // Core iterator interface for iterator_facade. - typename iterator_adaptor::reference dereference() const; - - template < - class OtherDerived, class OtherIterator, class V, class C, class R, class D - > - bool equal(iterator_adaptor const& x) const; - - void advance(typename iterator_adaptor::difference_type n); - void increment(); - void decrement(); - - template < - class OtherDerived, class OtherIterator, class V, class C, class R, class D - > - typename iterator_adaptor::difference_type distance_to( - iterator_adaptor const& y) const; - - private: - Base m_iterator; // exposition only - }; - -__ base_parameters_ - -.. _requirements: - -[h2 Requirements] - -`static_cast(iterator_adaptor*)` shall be well-formed. -The `Base` argument shall be Assignable and Copy Constructible. - - -.. _base_parameters: - -[h2 Base Class Parameters] - -The *V'*, *C'*, *R'*, and *D'* parameters of the `iterator_facade` -used as a base class in the summary of `iterator_adaptor` -above are defined as follows: - -[pre - *V'* = if (Value is use_default) - return iterator_traits::value_type - else - return Value - - *C'* = if (CategoryOrTraversal is use_default) - return iterator_traversal::type - else - return CategoryOrTraversal - - *R'* = if (Reference is use_default) - if (Value is use_default) - return iterator_traits::reference - else - return Value& - else - return Reference - - *D'* = if (Difference is use_default) - return iterator_traits::difference_type - else - return Difference -] - -[h2 Operations] - -[h3 Public] - - - iterator_adaptor(); - -[*Requires:] The `Base` type must be Default Constructible.[br] -[*Returns:] An instance of `iterator_adaptor` with - `m_iterator` default constructed. - - - explicit iterator_adaptor(Base const& iter); - -[*Returns:] An instance of `iterator_adaptor` with - `m_iterator` copy constructed from `iter`. - - Base const& base() const; - -[*Returns:] `m_iterator` - - -[h3 Protected] - - Base const& base_reference() const; - -[*Returns:] A const reference to `m_iterator`. - - - Base& base_reference(); - -[*Returns:] A non-const reference to `m_iterator`. - -[h3 Private] - - typename iterator_adaptor::reference dereference() const; - -[*Returns:] `*m_iterator` - - - template < - class OtherDerived, class OtherIterator, class V, class C, class R, class D - > - bool equal(iterator_adaptor const& x) const; - -[*Returns:] `m_iterator == x.base()` - - - void advance(typename iterator_adaptor::difference_type n); - -[*Effects:] `m_iterator += n;` - - void increment(); - -[*Effects:] `++m_iterator;` - - void decrement(); - -[*Effects:] `--m_iterator;` - - - template < - class OtherDerived, class OtherIterator, class V, class C, class R, class D - > - typename iterator_adaptor::difference_type distance_to( - iterator_adaptor const& y) const; - -[*Returns:] `y.base() - m_iterator` - -[endsect] - -[section:adaptor_tutorial Tutorial] - -In this section we'll further refine the `node_iter` class -template we developed in the |fac_tut|_. If you haven't already -read that material, you should go back now and check it out because -we're going to pick up right where it left off. - -.. |fac_tut| replace:: `iterator_facade` tutorial -.. _fac_tut: iterator_facade.html#tutorial-example - -[blurb [*`node_base*` really *is* an iterator][br][br] - It's not really a very interesting iterator, since `node_base` - is an abstract class: a pointer to a `node_base` just points - at some base subobject of an instance of some other class, and - incrementing a `node_base*` moves it past this base subobject - to who-knows-where? The most we can do with that incremented - position is to compare another `node_base*` to it. In other - words, the original iterator traverses a one-element array. -] - -You probably didn't think of it this way, but the `node_base*` -object that underlies `node_iterator` is itself an iterator, -just like all other pointers. If we examine that pointer closely -from an iterator perspective, we can see that it has much in common -with the `node_iterator` we're building. First, they share most -of the same associated types (`value_type`, `reference`, -`pointer`, and `difference_type`). Second, even some of the -core functionality is the same: `operator*` and `operator==` on -the `node_iterator` return the result of invoking the same -operations on the underlying pointer, via the `node_iterator`\ 's -|dereference_and_equal|_). The only real behavioral difference -between `node_base*` and `node_iterator` can be observed when -they are incremented: `node_iterator` follows the -`m_next` pointer, while `node_base*` just applies an address offset. - -.. |dereference_and_equal| replace:: `dereference` and `equal` member functions -.. _dereference_and_equal: iterator_facade.html#implementing-the-core-operations - -It turns out that the pattern of building an iterator on another -iterator-like type (the `Base` [#base]_ type) while modifying -just a few aspects of the underlying type's behavior is an -extremely common one, and it's the pattern addressed by -`iterator_adaptor`. Using `iterator_adaptor` is very much like -using `iterator_facade`, but because iterator_adaptor tries to -mimic as much of the `Base` type's behavior as possible, we -neither have to supply a `Value` argument, nor implement any core -behaviors other than `increment`. The implementation of -`node_iter` is thus reduced to: - - template - class node_iter - : public boost::iterator_adaptor< - node_iter // Derived - , Value* // Base - , boost::use_default // Value - , boost::forward_traversal_tag // CategoryOrTraversal - > - { - private: - struct enabler {}; // a private type avoids misuse - - public: - node_iter() - : node_iter::iterator_adaptor_(0) {} - - explicit node_iter(Value* p) - : node_iter::iterator_adaptor_(p) {} - - template - node_iter( - node_iter const& other - , typename boost::enable_if< - boost::is_convertible - , enabler - >::type = enabler() - ) - : node_iter::iterator_adaptor_(other.base()) {} - - private: - friend class boost::iterator_core_access; - void increment() { this->base_reference() = this->base()->next(); } - }; - -Note the use of `node_iter::iterator_adaptor_` here: because -`iterator_adaptor` defines a nested `iterator_adaptor_` type -that refers to itself, that gives us a convenient way to refer to -the complicated base class type of `node_iter`. [Note: -this technique is known not to work with Borland C++ 5.6.4 and -Metrowerks CodeWarrior versions prior to 9.0] - -You can see an example program that exercises this version of the -node iterators -[@../example/node_iterator3.cpp `here`]. - - -In the case of `node_iter`, it's not very compelling to pass -`boost::use_default` as `iterator_adaptor` 's `Value` -argument; we could have just passed `node_iter` 's `Value` -along to `iterator_adaptor`, and that'd even be shorter! Most -iterator class templates built with `iterator_adaptor` are -parameterized on another iterator type, rather than on its -`value_type`. For example, `boost::reverse_iterator` takes an -iterator type argument and reverses its direction of traversal, -since the original iterator and the reversed one have all the same -associated types, `iterator_adaptor` 's delegation of default -types to its `Base` saves the implementor of -`boost::reverse_iterator` from writing: - - std::iterator_traits::*some-associated-type* - -at least four times. - -We urge you to review the documentation and implementations of -|reverse_iterator|_ and the other Boost `specialized iterator -adaptors`__ to get an idea of the sorts of things you can do with -`iterator_adaptor`. In particular, have a look at -|transform_iterator|_, which is perhaps the most straightforward -adaptor, and also |counting_iterator|_, which demonstrates that -`iterator_adaptor`\ 's `Base` type needn't be an iterator. - -.. |reverse_iterator| replace:: `reverse_iterator` -.. _reverse_iterator: reverse_iterator.html - -.. |counting_iterator| replace:: `counting_iterator` -.. _counting_iterator: counting_iterator.html - -.. |transform_iterator| replace:: `transform_iterator` -.. _transform_iterator: transform_iterator.html - -__ index.html#specialized-adaptors - - -[endsect] - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/archetypes.qbk b/libs/iterator/doc/quickbook/archetypes.qbk deleted file mode 100644 index 71821f3eb..000000000 --- a/libs/iterator/doc/quickbook/archetypes.qbk +++ /dev/null @@ -1,160 +0,0 @@ - -[section:archetypes Iterator Archetypes] - -The `iterator_archetype` class constructs a minimal implementation of -one of the iterator access concepts and one of the iterator traversal concepts. -This is used for doing a compile-time check to see if a the type requirements -of a template are really enough to cover the implementation of the template. -For further information see the documentation for the |concepts|_ library. - -[h2 Synopsis] - - namespace iterator_archetypes - { - // Access categories - - typedef /*implementation defined*/ readable_iterator_t; - typedef /*implementation defined*/ writable_iterator_t; - typedef /*implementation defined*/ readable_writable_iterator_t; - typedef /*implementation defined*/ readable_lvalue_iterator_t; - typedef /*implementation defined*/ writable_lvalue_iterator_t; - - } - - template < - class Value - , class AccessCategory - , class TraversalCategory - > - class iterator_archetype - { - typedef /* see below */ value_type; - typedef /* see below */ reference; - typedef /* see below */ pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - }; - -[h3 Access Category Tags] - -The access category types provided correspond to the following -standard iterator access concept combinations: - - readable_iterator_t := - - Readable Iterator - - writable_iterator_t := - - Writeable Iterator - - readable_writable_iterator_t := - - Readable Iterator & Writeable Iterator & Swappable Iterator - - readable_lvalue_iterator_t := - - Readable Iterator & Lvalue Iterator - - writeable_lvalue_iterator_t := - - Readable Iterator & Writeable Iterator & Swappable Iterator & Lvalue Iterator - -[h3 Traits] - -The nested trait types are defined as follows: - - - if (AccessCategory == readable_iterator_t) - - value_type = Value - reference = Value - pointer = Value* - - else if (AccessCategory == writable_iterator_t) - - value_type = void - reference = void - pointer = void - - else if (AccessCategory == readable_writable_iterator_t) - - value_type = Value - - reference := - - A type X that is convertible to Value for which the following - expression is valid. Given an object x of type X and v of type - Value. - - x = v - - pointer = Value* - - else if (AccessCategory == readable_lvalue_iterator_t) - - value_type = Value - reference = Value const& - pointer = Value const* - - else if (AccessCategory == writable_lvalue_iterator_t) - - value_type = Value - reference = Value& - pointer = Value* - - if ( TraversalCategory is convertible to forward_traversal_tag ) - - difference_type := ptrdiff_t - - else - - difference_type := unspecified type - - - iterator_category := - - A type X satisfying the following two constraints: - - 1. X is convertible to X1, and not to any more-derived - type, where X1 is defined by: - - if (reference is a reference type - && TraversalCategory is convertible to forward_traversal_tag) - { - if (TraversalCategory is convertible to random_access_traversal_tag) - X1 = random_access_iterator_tag - else if (TraversalCategory is convertible to bidirectional_traversal_tag) - X1 = bidirectional_iterator_tag - else - X1 = forward_iterator_tag - } - else - { - if (TraversalCategory is convertible to single_pass_traversal_tag - && reference != void) - X1 = input_iterator_tag - else - X1 = output_iterator_tag - } - - 2. X is convertible to TraversalCategory - - -[h2 Requirements] - -The `AccessCategory` argument must be one of the predefined access -category tags. The `TraversalCategory` must be one of the standard -traversal tags. The `Value` type must satisfy the requirements of -the iterator concept specified by `AccessCategory` and -`TraversalCategory` as implied by the nested traits types. - -[h2 Concepts] - -`iterator_archetype` models the iterator concepts specified by the -`AccessCategory` and `TraversalCategory` -arguments. `iterator_archetype` does not model any other access -concepts or any more derived traversal concepts. - - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/concept_checking.qbk b/libs/iterator/doc/quickbook/concept_checking.qbk deleted file mode 100644 index c6300202f..000000000 --- a/libs/iterator/doc/quickbook/concept_checking.qbk +++ /dev/null @@ -1,54 +0,0 @@ -[section:concept_checking Concept Checking] - -The iterator concept checking classes provide a mechanism for a -template to report better error messages when a user instantiates the -template with a type that does not meet the requirements of the -template. For an introduction to using concept checking classes, see -the documentation for the boost::concept_check library. - -[h2 `iterator_concepts.hpp` Synopsis] - - namespace boost_concepts { - - // Iterator Access Concepts - - template - class ReadableIteratorConcept; - - template < - typename Iterator - , typename ValueType = std::iterator_traits::value_type - > - class WritableIteratorConcept; - - template - class SwappableIteratorConcept; - - template - class LvalueIteratorConcept; - - // Iterator Traversal Concepts - - template - class IncrementableIteratorConcept; - - template - class SinglePassIteratorConcept; - - template - class ForwardTraversalConcept; - - template - class BidirectionalTraversalConcept; - - template - class RandomAccessTraversalConcept; - - // Interoperability - - template - class InteroperableIteratorConcept; - - } - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/concepts.qbk b/libs/iterator/doc/quickbook/concepts.qbk deleted file mode 100644 index 679d1a807..000000000 --- a/libs/iterator/doc/quickbook/concepts.qbk +++ /dev/null @@ -1,362 +0,0 @@ - -[section:concepts Iterator Concepts] - -[section:concepts_access Access] - -[h2 Readable Iterator Concept] - -A class or built-in type `X` models the *Readable Iterator* concept -for value type `T` if, in addition to `X` being Assignable and -Copy Constructible, the following expressions are valid and respect -the stated semantics. `U` is the type of any specified member of -type `T`. - -[table Readable Iterator Requirements (in addition to Assignable and Copy Constructible) - [ - [Expression] - [Return Type] - [Note/Precondition] - ] - [ - [`iterator_traits::value_type`] - [`T`] - [Any non-reference, non cv-qualified type] - ] - [ - [`*a`] - [ Convertible to `T`] - [pre: `a` is dereferenceable. If `a == b` then `*a` is equivalent to `*b`.] - ] - [ - [`a->m`] - [`U&`] - [pre: `(*a).m` is well-defined. Equivalent to `(*a).m`.] - ] -] - -[h2 Writable Iterator Concept ] - - -A class or built-in type `X` models the *Writable Iterator* concept -if, in addition to `X` being Copy Constructible, the following -expressions are valid and respect the stated semantics. Writable -Iterators have an associated *set of value types*. - -[table Writable Iterator Requirements (in addition to Copy Constructible) - [ - [Expression] - [Return Type] - [Precondition] - ] - [ - [`*a = o` ] - [] - [pre: The type of `o` is in the set of value types of `X`] - ] -] - -[h2 Swappable Iterator Concept] - -A class or built-in type `X` models the *Swappable Iterator* concept -if, in addition to `X` being Copy Constructible, the following -expressions are valid and respect the stated semantics. - -[table Swappable Iterator Requirements (in addition to Copy Constructible) - [ - [Expression] - [Return Type] - [Postcondition] - ] - [ - [`iter_swap(a, b)`] - [`void`] - [the pointed to values are exchanged] - ] -] - -[blurb *Note:* An iterator that is a model of the *Readable* and *Writable Iterator* concepts - is also a model of *Swappable Iterator*. *--end note*] - -[h2 Lvalue Iterator Concept] - -The *Lvalue Iterator* concept adds the requirement that the return -type of `operator*` type be a reference to the value type of the -iterator. - -[table Lvalue Iterator Requirements - [ - [Expression] - [Return Type] - [Note/Assertion] - ] - [ - [`*a` ] - [`T&` ] - [ - `T` is *cv* `iterator_traits::value_type` where *cv* is an optional cv-qualification. - pre: `a` is dereferenceable. If `a == b` then `*a` is equivalent to `*b`. - ] - ] -] - -[endsect] - -[section:concepts_traversal Traversal] - -[h2 Incrementable Iterator Concept] - - -A class or built-in type `X` models the *Incrementable Iterator* -concept if, in addition to `X` being Assignable and Copy -Constructible, the following expressions are valid and respect the -stated semantics. - - -[table Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible) - [ - [Expression ] - [Return Type] - [Assertion/Semantics ] - ] - [ - [`++r` ] - [`X&` ] - [`&r == &++r`] - ] - [ - [`r++` ] - [`X` ] - [`` - { - X tmp = r; - ++r; - return tmp; - } - ``] - ] - [ - [`iterator_traversal::type`] - [Convertible to `incrementable_traversal_tag`] - [] - ] -] - -[h2 Single Pass Iterator Concept] - -A class or built-in type `X` models the *Single Pass Iterator* -concept if the following expressions are valid and respect the stated -semantics. - -[table Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality Comparable) - [ - [Expression] - [Return Type] - [Assertion/Semantics / Pre-/Post-condition] - ] - [ - [`++r`] - [`X&`] - [pre:[br]`r` is dereferenceable;[br]post:[br]`r` is dereferenceable or[br]`r` is past-the-end] - ] - [ - [`a == b`] - [convertible to `bool`] - [`==` is an equivalence relation over its domain] - ] - [ - [`a != b`] - [convertible to `bool`] - [`!(a == b)`] - ] - [ - [`iterator_traversal::type`] - [Convertible to`single_pass_traversal_tag`] - [] - ] -] - - -[h2 Forward Traversal Concept] - -A class or built-in type `X` models the *Forward Traversal* -concept if, in addition to `X` meeting the requirements of Default -Constructible and Single Pass Iterator, the following expressions are -valid and respect the stated semantics. - -[table Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator) - [ - [Expression] - [Return Type] - [Assertion/Note] - ] - [ - [`X u;`] - [`X&`] - [note: `u` may have a singular value.] - ] - [ - [`++r`] - [`X&`] - [`r == s` and `r` is dereferenceable implies `++r == ++s.`] - ] - [ - [`iterator_traits::difference_type`] - [A signed integral type representing the distance between iterators] - [] - ] - [ - [`iterator_traversal::type`] - [Convertible to `forward_traversal_tag`] - [] - ] -] - -[h2 Bidirectional Traversal Concept] - -A class or built-in type `X` models the *Bidirectional Traversal* -concept if, in addition to `X` meeting the requirements of Forward -Traversal Iterator, the following expressions are valid and respect -the stated semantics. - -[table Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal Iterator) - [ - [Expression] - [Return Type] - [Assertion/Semantics/Pre-/Post-condition] - ] - [ - [`--r`] - [`X&`] - [pre: there exists `s` such that `r == ++s`.[br] post: `s` is dereferenceable. `--(++r) == r`. `--r == --s` implies `r == s`. `&r == &--r`.] - ] - [ - [`r--`] - [convertible to `const X&`] - [`` - { - X tmp = r; - --r; - return tmp; - } - ``] - ] - [ - [`iterator_traversal::type`] - [Convertible to `bidirectional_traversal_tag`] - [] - ] -] - -[h2 Random Access Traversal Concept] - -A class or built-in type `X` models the *Random Access Traversal* -concept if the following expressions are valid and respect the stated -semantics. In the table below, `Distance` is -`iterator_traits::difference_type` and `n` represents a -constant object of type `Distance`. - -[table Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal) - [ - [Expression] - [Return Type] - [Operational Semantics] - [Assertion/Precondition] - ] - [ - [`r += n`] - [ `X&`] - [`` - { - Distance m = n; - if (m >= 0) - while (m--) - ++r; - else - while (m++) - --r; - return r; - } - ``] - [ ] - ] - [ - [`a + n`, `n + a`] - [`X`] - [`` - { - X tmp = a; - return tmp+= n; - } - ``] - [] - ] - [ - [`r -= n`] - [`X&`] - [`return r += -n`] - [] - ] - [ - [`a - n`] - [`X`] - [`` - { - X tmp = a; - return tmp-= n; - } - ``] - [] - ] - [ - [`b - a`] - [`Distance`] - [`a < b ? distance(a,b) : -distance(b,a)`] - [pre: there exists a value `n` of `Distance` such that `a + n == b`. `b == a + (b - a)`.] - ] - [ - [`a\[n\]`] - [convertible to T] - [`*(a + n)`] - [pre: a is a *Readable Iterator*] - ] - [ - [`a\[n\] = v`] - [convertible to T] - [`*(a + n) = v`] - [pre: a is a *Writable iterator*] - ] - [ - [`a < b`] - [convertible to `bool`] - [`b - a > 0`] - [`<` is a total ordering relation] - ] - [ - [`a > b`] - [convertible to `bool`] - [`b < a`] - [`>` is a total ordering relation] - ] - [ - [`a >= b`] - [convertible to `bool`] - [`!(a < b)`] - [] - ] - [ - [`a <= b`] - [convertible to `bool`] - [`!(a > b)`] - [] - ] - [ - [`iterator_traversal::type`] - [convertible to `random_access_traversal_tag`] - [] - [] - ] -] - -[endsect] - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/counting_iterator.qbk b/libs/iterator/doc/quickbook/counting_iterator.qbk deleted file mode 100644 index c33d06562..000000000 --- a/libs/iterator/doc/quickbook/counting_iterator.qbk +++ /dev/null @@ -1,192 +0,0 @@ - -[section:counting Counting Iterator] - -A `counting_iterator` adapts an object by adding an `operator*` that -returns the current value of the object. All other iterator operations -are forwarded to the adapted object. - - -[h2 Example] - - -This example fills an array with numbers and a second array with -pointers into the first array, using `counting_iterator` for both -tasks. Finally `indirect_iterator` is used to print out the numbers -into the first array via indirection through the second array. - - int N = 7; - std::vector numbers; - typedef std::vector::iterator n_iter; - std::copy(boost::counting_iterator(0), - boost::counting_iterator(N), - std::back_inserter(numbers)); - - std::vector::iterator> pointers; - std::copy(boost::make_counting_iterator(numbers.begin()), - boost::make_counting_iterator(numbers.end()), - std::back_inserter(pointers)); - - std::cout << "indirectly printing out the numbers from 0 to " - << N << std::endl; - std::copy(boost::make_indirect_iterator(pointers.begin()), - boost::make_indirect_iterator(pointers.end()), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - -The output is: - - indirectly printing out the numbers from 0 to 7 - 0 1 2 3 4 5 6 - -The source code for this example can be found [@../example/counting_iterator_example.cpp here]. - -[h2 Reference] - - -[h3 Synopsis] - - template < - class Incrementable - , class CategoryOrTraversal = use_default - , class Difference = use_default - > - class counting_iterator - { - public: - typedef Incrementable value_type; - typedef const Incrementable& reference; - typedef const Incrementable* pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - - counting_iterator(); - counting_iterator(counting_iterator const& rhs); - explicit counting_iterator(Incrementable x); - Incrementable const& base() const; - reference operator*() const; - counting_iterator& operator++(); - counting_iterator& operator--(); - private: - Incrementable m_inc; // exposition - }; - - -If the `Difference` argument is `use_default` then -`difference_type` is an unspecified signed integral -type. Otherwise `difference_type` is `Difference`. - -`iterator_category` is determined according to the following -algorithm: - - if (CategoryOrTraversal is not use_default) - return CategoryOrTraversal - else if (numeric_limits::is_specialized) - return |iterator-category|_\ ( - random_access_traversal_tag, Incrementable, const Incrementable&) - else - return |iterator-category|_\ ( - iterator_traversal::type, - Incrementable, const Incrementable&) - -[blurb *Note:* implementers are encouraged to provide an implementation of - `operator-` and a `difference_type` that avoids overflows in - the cases where `std::numeric_limits::is_specialized` - is true.] - -[h3 Requirements] - - -The `Incrementable` argument shall be Copy Constructible and Assignable. - -If `iterator_category` is convertible to `forward_iterator_tag` -or `forward_traversal_tag`, the following must be well-formed: - - Incrementable i, j; - ++i; // pre-increment - i == j; // operator equal - - -If `iterator_category` is convertible to -`bidirectional_iterator_tag` or `bidirectional_traversal_tag`, -the following expression must also be well-formed: - - --i - -If `iterator_category` is convertible to -`random_access_iterator_tag` or `random_access_traversal_tag`, -the following must must also be valid: - - counting_iterator::difference_type n; - i += n; - n = i - j; - i < j; - - -[h3 Concepts] - - -Specializations of `counting_iterator` model Readable Lvalue -Iterator. In addition, they model the concepts corresponding to the -iterator tags to which their `iterator_category` is convertible. -Also, if `CategoryOrTraversal` is not `use_default` then -`counting_iterator` models the concept corresponding to the iterator -tag `CategoryOrTraversal`. Otherwise, if -`numeric_limits::is_specialized`, then -`counting_iterator` models Random Access Traversal Iterator. -Otherwise, `counting_iterator` models the same iterator traversal -concepts modeled by `Incrementable`. - -`counting_iterator` is interoperable with -`counting_iterator` if and only if `X` is -interoperable with `Y`. - - -[h3 Operations] - - -In addition to the operations required by the concepts modeled by -`counting_iterator`, `counting_iterator` provides the following -operations. - - - counting_iterator(); - -[*Requires: ] `Incrementable` is Default Constructible.[br] -[*Effects: ] Default construct the member `m_inc`. - - - counting_iterator(counting_iterator const& rhs); - -[*Effects: ] Construct member `m_inc` from `rhs.m_inc`. - - - - explicit counting_iterator(Incrementable x); - -[*Effects: ] Construct member `m_inc` from `x`. - - - reference operator*() const; - -[*Returns: ] `m_inc` - - - counting_iterator& operator++(); - -[*Effects: ] `++m_inc`[br] -[*Returns: ] `*this` - - - counting_iterator& operator--(); - -[*Effects: ] `--m_inc`[br] -[*Returns: ] `*this` - - - Incrementable const& base() const; - -[*Returns: ] `m_inc` - - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/facade.qbk b/libs/iterator/doc/quickbook/facade.qbk deleted file mode 100644 index ac7104f8f..000000000 --- a/libs/iterator/doc/quickbook/facade.qbk +++ /dev/null @@ -1,637 +0,0 @@ - -[section:facade Iterator Facade] - -While the iterator interface is rich, there is a core subset of the -interface that is necessary for all the functionality. We have -identified the following core behaviors for iterators: - -* dereferencing -* incrementing -* decrementing -* equality comparison -* random-access motion -* distance measurement - -In addition to the behaviors listed above, the core interface elements -include the associated types exposed through iterator traits: -`value_type`, `reference`, `difference_type`, and -`iterator_category`. - -Iterator facade uses the Curiously Recurring Template -Pattern (CRTP) [Cop95]_ so that the user can specify the behavior -of `iterator_facade` in a derived class. Former designs used -policy objects to specify the behavior, but that approach was -discarded for several reasons: - -1. the creation and eventual copying of the policy object may create - overhead that can be avoided with the current approach. - -2. The policy object approach does not allow for custom constructors - on the created iterator types, an essential feature if - `iterator_facade` should be used in other library - implementations. - -3. Without the use of CRTP, the standard requirement that an - iterator's `operator++` returns the iterator type itself - would mean that all iterators built with the library would - have to be specializations of `iterator_facade<...>`, rather - than something more descriptive like - `indirect_iterator`. Cumbersome type generator - metafunctions would be needed to build new parameterized - iterators, and a separate `iterator_adaptor` layer would be - impossible. - -[h2 Usage] - -The user of `iterator_facade` derives his iterator class from a -specialization of `iterator_facade` and passes the derived -iterator class as `iterator_facade`\ 's first template parameter. -The order of the other template parameters have been carefully -chosen to take advantage of useful defaults. For example, when -defining a constant lvalue iterator, the user can pass a -const-qualified version of the iterator's `value_type` as -`iterator_facade`\ 's `Value` parameter and omit the -`Reference` parameter which follows. - -The derived iterator class must define member functions implementing -the iterator's core behaviors. The following table describes -expressions which are required to be valid depending on the category -of the derived iterator type. These member functions are described -briefly below and in more detail in the iterator facade -requirements. - -[table Core Interface - [ - [Expression] - [Effects] - ] - [ - [`i.dereference()`] - [Access the value referred to] - ] - [ - [`i.equal(j)`] - [Compare for equality with `j`] - ] - [ - [`i.increment()`] - [Advance by one position] - ] - [ - [`i.decrement()`] - [Retreat by one position] - ] - [ - [`i.advance(n)`] - [Advance by `n` positions] - ] - [ - [`i.distance_to(j)`] - [Measure the distance to `j`] - ] -] - -[/ .. Should we add a comment that a zero overhead implementation of iterator_facade is possible with proper inlining?] - -In addition to implementing the core interface functions, an iterator -derived from `iterator_facade` typically defines several -constructors. To model any of the standard iterator concepts, the -iterator must at least have a copy constructor. Also, if the iterator -type `X` is meant to be automatically interoperate with another -iterator type `Y` (as with constant and mutable iterators) then -there must be an implicit conversion from `X` to `Y` or from `Y` -to `X` (but not both), typically implemented as a conversion -constructor. Finally, if the iterator is to model Forward Traversal -Iterator or a more-refined iterator concept, a default constructor is -required. - -[h2 Iterator Core Access] - -`iterator_facade` and the operator implementations need to be able -to access the core member functions in the derived class. Making the -core member functions public would expose an implementation detail to -the user. The design used here ensures that implementation details do -not appear in the public interface of the derived iterator type. - -Preventing direct access to the core member functions has two -advantages. First, there is no possibility for the user to accidently -use a member function of the iterator when a member of the value_type -was intended. This has been an issue with smart pointer -implementations in the past. The second and main advantage is that -library implementers can freely exchange a hand-rolled iterator -implementation for one based on `iterator_facade` without fear of -breaking code that was accessing the public core member functions -directly. - -In a naive implementation, keeping the derived class' core member -functions private would require it to grant friendship to -`iterator_facade` and each of the seven operators. In order to -reduce the burden of limiting access, `iterator_core_access` is -provided, a class that acts as a gateway to the core member functions -in the derived iterator class. The author of the derived class only -needs to grant friendship to `iterator_core_access` to make his core -member functions available to the library. - - -`iterator_core_access` will be typically implemented as an empty -class containing only private static member functions which invoke the -iterator core member functions. There is, however, no need to -standardize the gateway protocol. Note that even if -`iterator_core_access` used public member functions it would not -open a safety loophole, as every core member function preserves the -invariants of the iterator. - -[h2 `operator\[\]`] - -The indexing operator for a generalized iterator presents special -challenges. A random access iterator's `operator[]` is only -required to return something convertible to its `value_type`. -Requiring that it return an lvalue would rule out currently-legal -random-access iterators which hold the referenced value in a data -member (e.g. |counting|_), because `*(p+n)` is a reference -into the temporary iterator `p+n`, which is destroyed when -`operator[]` returns. - -.. |counting| replace:: `counting_iterator` - -Writable iterators built with `iterator_facade` implement the -semantics required by the preferred resolution to `issue 299`_ and -adopted by proposal n1550_: the result of `p[n]` is an object -convertible to the iterator's `value_type`, and `p[n] = x` is -equivalent to `*(p + n) = x` (Note: This result object may be -implemented as a proxy containing a copy of `p+n`). This approach -will work properly for any random-access iterator regardless of the -other details of its implementation. A user who knows more about -the implementation of her iterator is free to implement an -`operator[]` that returns an lvalue in the derived iterator -class; it will hide the one supplied by `iterator_facade` from -clients of her iterator. - -.. _n1550: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm - -.. _`issue 299`: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299 - -.. _`operator arrow`: - -[h2 `operator->`] - -The `reference` type of a readable iterator (and today's input -iterator) need not in fact be a reference, so long as it is -convertible to the iterator's `value_type`. When the `value_type` -is a class, however, it must still be possible to access members -through `operator->`. Therefore, an iterator whose `reference` -type is not in fact a reference must return a proxy containing a copy -of the referenced value from its `operator->`. - -The return types for `iterator_facade`\ 's `operator->` and -`operator[]` are not explicitly specified. Instead, those types -are described in terms of a set of requirements, which must be -satisfied by the `iterator_facade` implementation. - -.. [Cop95] [Coplien, 1995] Coplien, J., Curiously Recurring Template - Patterns, C++ Report, February 1995, pp. 24-27. - -[section:facade_reference Reference] - - template < - class Derived - , class Value - , class CategoryOrTraversal - , class Reference = Value& - , class Difference = ptrdiff_t - > - class iterator_facade { - public: - typedef remove_const::type value_type; - typedef Reference reference; - typedef Value\* pointer; - typedef Difference difference_type; - typedef /* see below__ \*/ iterator_category; - - reference operator\*() const; - /* see below__ \*/ operator->() const; - /* see below__ \*/ operator[](difference_type n) const; - Derived& operator++(); - Derived operator++(int); - Derived& operator--(); - Derived operator--(int); - Derived& operator+=(difference_type n); - Derived& operator-=(difference_type n); - Derived operator-(difference_type n) const; - protected: - typedef iterator_facade iterator_facade\_; - }; - - // Comparison operators - template - typename enable_if_interoperable::type // exposition - operator ==(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator !=(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator <(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator <=(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator >(iterator_facade const& lhs, - iterator_facade const& rhs); - - template - typename enable_if_interoperable::type - operator >=(iterator_facade const& lhs, - iterator_facade const& rhs); - - // Iterator difference - template - /* see below__ \*/ - operator-(iterator_facade const& lhs, - iterator_facade const& rhs); - - // Iterator addition - template - Derived operator+ (iterator_facade const&, - typename Derived::difference_type n); - - template - Derived operator+ (typename Derived::difference_type n, - iterator_facade const&); - -__ `iterator category`_ - -__ `operator arrow`_ - -__ brackets_ - -__ minus_ - -.. _`iterator category`: - -The `iterator_category` member of `iterator_facade` is - -.. parsed-literal:: - - *iterator-category*\ (CategoryOrTraversal, value_type, reference) - -where *iterator-category* is defined as follows: - -.. include:: facade_iterator_category.rst - -The `enable_if_interoperable` template used above is for exposition -purposes. The member operators should only be in an overload set -provided the derived types `Dr1` and `Dr2` are interoperable, -meaning that at least one of the types is convertible to the other. The -`enable_if_interoperable` approach uses SFINAE to take the operators -out of the overload set when the types are not interoperable. -The operators should behave *as-if* `enable_if_interoperable` -were defined to be: - - template enable_if_interoperable_impl - {}; - - template enable_if_interoperable_impl - { typedef T type; }; - - template - struct enable_if_interoperable - : enable_if_interoperable_impl< - is_convertible::value || is_convertible::value - , T - > - {}; - - -[h2 Requirements] - -The following table describes the typical valid expressions on -`iterator_facade`\ 's `Derived` parameter, depending on the -iterator concept(s) it will model. The operations in the first -column must be made accessible to member functions of class -`iterator_core_access`. In addition, -`static_cast(iterator_facade*)` shall be well-formed. - -In the table below, `F` is `iterator_facade`, `a` is an -object of type `X`, `b` and `c` are objects of type `const X`, -`n` is an object of `F::difference_type`, `y` is a constant -object of a single pass iterator type interoperable with `X`, and `z` -is a constant object of a random access traversal iterator type -interoperable with `X`. - -.. _`core operations`: - -.. topic:: `iterator_facade` Core Operations - -[table Core Operations - [ - [Expression] - [Return Type] - [Assertion/Note] - [Used to implement Iterator Concept(s)] - ] - [ - [`c.dereference()`] - [`F::reference`] - [] - [Readable Iterator, Writable Iterator] - ] - [ - [`c.equal(y)`] - [convertible to bool] - [true iff `c` and `y` refer to the same position] - [Single Pass Iterator] - ] - [ - [`a.increment()`] - [unused] - [] - [Incrementable Iterator] - ] - [ - [`a.decrement()`] - [unused] - [] - [Bidirectional Traversal Iterator] - ] - [ - [`a.advance(n)`] - [unused] - [] - [Random Access Traversal Iterator] - ] - [ - [`c.distance_to(z)`] - [convertible to `F::difference_type`] - [equivalent to `distance(c, X(z))`.] - [Random Access Traversal Iterator] - ] -] - -[h2 Operations] - -The operations in this section are described in terms of operations on -the core interface of `Derived` which may be inaccessible -(i.e. private). The implementation should access these operations -through member functions of class `iterator_core_access`. - - reference operator*() const; - -[*Returns:] `static_cast(this)->dereference()` - - operator->() const; (see below__) - -__ `operator arrow`_ - -[*Returns:] If `reference` is a reference type, an object of type `pointer` equal to: `&static_cast(this)->dereference()` -Otherwise returns an object of unspecified type such that, -`(*static_cast(this))->m` is equivalent to `(w = **static_cast(this), -w.m)` for some temporary object `w` of type `value_type`. - -.. _brackets: - - *unspecified* operator[](difference_type n) const; - -[*Returns:] an object convertible to `value_type`. For constant - objects `v` of type `value_type`, and `n` of type - `difference_type`, `(*this)[n] = v` is equivalent to - `*(*this + n) = v`, and `static_cast((*this)[n])` is equivalent to - `static_cast(*(*this + n))` - - Derived& operator++(); - -[*Effects:] - - static_cast(this)->increment(); - return *static_cast(this); - - Derived operator++(int); - -[*Effects:] - - Derived tmp(static_cast(this)); - ++*this; - return tmp; - - Derived& operator--(); - -[*Effects:] - - static_cast(this)->decrement(); - return *static_cast(this); - - Derived operator--(int); - -[*Effects:] - - Derived tmp(static_cast(this)); - --*this; - return tmp; - - - Derived& operator+=(difference_type n); - -[*Effects:] - - static_cast(this)->advance(n); - return *static_cast(this); - - - Derived& operator-=(difference_type n); - -[*Effects:] - - static_cast(this)->advance(-n); - return *static_cast(this); - - - Derived operator-(difference_type n) const; - -[*Effects:] - - Derived tmp(static_cast(this)); - return tmp -= n; - - template - Derived operator+ (iterator_facade const&, - typename Derived::difference_type n); - - template - Derived operator+ (typename Derived::difference_type n, - iterator_facade const&); - -[*Effects:] - - Derived tmp(static_cast(this)); - return tmp += n; - - template - typename enable_if_interoperable::type - operator ==(iterator_facade const& lhs, - iterator_facade const& rhs); - -[*Returns:] - -[pre - if `is_convertible::value` - - then - `((Dr1 const&)lhs).equal((Dr2 const&)rhs)`. - - Otherwise, - `((Dr2 const&)rhs).equal((Dr1 const&)lhs)`. -] - - - template - typename enable_if_interoperable::type - operator !=(iterator_facade const& lhs, - iterator_facade const& rhs); - -[*Returns:] - -[pre - if `is_convertible::value` - - then - `!((Dr1 const&)lhs).equal((Dr2 const&)rhs)`. - - Otherwise, - `!((Dr2 const&)rhs).equal((Dr1 const&)lhs)`. -] - - - template - typename enable_if_interoperable::type - operator <(iterator_facade const& lhs, - iterator_facade const& rhs); - -[*Returns:] - -[pre - if `is_convertible::value` - - then - `((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) < 0`. - - Otherwise, - `((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0`. -] - - - template - typename enable_if_interoperable::type - operator <=(iterator_facade const& lhs, - iterator_facade const& rhs); - -[*Returns:] - -[pre - if `is_convertible::value` - - then - `((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) <= 0`. - - Otherwise, - `((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0`. -] - - - template - typename enable_if_interoperable::type - operator >(iterator_facade const& lhs, - iterator_facade const& rhs); - -[*Returns:] - -[pre - if `is_convertible::value` - - then - `((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) > 0`. - - Otherwise, - `((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0`. -] - - - template - typename enable_if_interoperable::type - operator >=(iterator_facade const& lhs, - iterator_facade const& rhs); - -[*Returns:] - -[pre - if `is_convertible::value` - - then - `((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) >= 0`. - - Otherwise, - `((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0`. -] - -.. _minus: - - - template - typename enable_if_interoperable::type - operator -(iterator_facade const& lhs, - iterator_facade const& rhs); - -[*Return Type:] - -[pre - if `is_convertible::value` - - then - `difference` shall be - `iterator_traits::difference_type`. - - Otherwise - `difference` shall be `iterator_traits::difference_type` -] - -[*Returns:] - -[pre - if `is_convertible::value` - - then - `-((Dr1 const&)lhs).distance_to((Dr2 const&)rhs)`. - - Otherwise, - `((Dr2 const&)rhs).distance_to((Dr1 const&)lhs)`. -] - - -[endsect] - -[include facade_tutorial.qbk] - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/facade_tutorial.qbk b/libs/iterator/doc/quickbook/facade_tutorial.qbk deleted file mode 100644 index 756c11e77..000000000 --- a/libs/iterator/doc/quickbook/facade_tutorial.qbk +++ /dev/null @@ -1,507 +0,0 @@ - -[section:facade_tutorial Tutorial] - -In this section we'll walk through the implementation of a few -iterators using `iterator_facade`, based around the simple -example of a linked list of polymorphic objects. This example was -inspired by a -[@http://thread.gmane.org/gmane.comp.lib.boost.user/5100 `posting`] -by Keith Macdonald on the -[@http://www.boost.org/more/mailing_lists.htm#users `Boost-Users`] -mailing list. - - -[h2 The Problem] - - -Say we've written a polymorphic linked list node base class: - - # include - - struct node_base - { - node_base() : m_next(0) {} - - // Each node manages all of its tail nodes - virtual ~node_base() { delete m_next; } - - // Access the rest of the list - node_base* next() const { return m_next; } - - // print to the stream - virtual void print(std::ostream& s) const = 0; - - // double the value - virtual void double_me() = 0; - - void append(node_base* p) - { - if (m_next) - m_next->append(p); - else - m_next = p; - } - - private: - node_base* m_next; - }; - -Lists can hold objects of different types by linking together -specializations of the following template: - - template - struct node : node_base - { - node(T x) - : m_value(x) - {} - - void print(std::ostream& s) const { s << this->m_value; } - void double_me() { m_value += m_value; } - - private: - T m_value; - }; - -And we can print any node using the following streaming operator: - - inline std::ostream& operator<<(std::ostream& s, node_base const& n) - { - n.print(s); - return s; - } - -Our first challenge is to build an appropriate iterator over these -lists. - -[h2 A Basic Iterator Using `iterator_facade`] - -We will construct a `node_iterator` class using inheritance from -`iterator_facade` to implement most of the iterator's operations. - - - # include "node.hpp" - # include - - class node_iterator - : public boost::iterator_facade<...> - { - ... - }; - - - -[h2 Template Arguments for `iterator_facade`] - -`iterator_facade` has several template parameters, so we must decide -what types to use for the arguments. The parameters are `Derived`, -`Value`, `CategoryOrTraversal`, `Reference`, and `Difference`. - - -[h3 `Derived`] - -Because `iterator_facade` is meant to be used with the CRTP -[Cop95]_ the first parameter is the iterator class name itself, -`node_iterator`. - -[h3 `Value`] - -The `Value` parameter determines the `node_iterator`\ 's -`value_type`. In this case, we are iterating over `node_base` -objects, so `Value` will be `node_base`. - - -[h3 `CategoryOrTraversal`] - -Now we have to determine which `iterator traversal concept`_ our -`node_iterator` is going to model. Singly-linked lists only have -forward links, so our iterator can't can't be a `bidirectional -traversal iterator`_. Our iterator should be able to make multiple -passes over the same linked list (unlike, say, an -`istream_iterator` which consumes the stream it traverses), so it -must be a `forward traversal iterator`_. Therefore, we'll pass -`boost::forward_traversal_tag` in this position [#category]_. - -.. [#category] `iterator_facade` also supports old-style category - tags, so we could have passed `std::forward_iterator_tag` here; - either way, the resulting iterator's `iterator_category` will - end up being `std::forward_iterator_tag`. - -[h3 `Reference`] - -The `Reference` argument becomes the type returned by -`node_iterator`\ 's dereference operation, and will also be the -same as `std::iterator_traits::reference`. The -library's default for this parameter is `Value&`; since -`node_base&` is a good choice for the iterator's `reference` -type, we can omit this argument, or pass `use_default`. - -[h3 `Difference`] - -The `Difference` argument determines how the distance between -two `node_iterator`\ s will be measured and will also be the -same as `std::iterator_traits::difference_type`. -The library's default for `Difference` is `std::ptrdiff_t`, an -appropriate type for measuring the distance between any two -addresses in memory, and one that works for almost any iterator, -so we can omit this argument, too. - -The declaration of `node_iterator` will therefore look something -like: - - # include "node.hpp" - # include - - class node_iterator - : public boost::iterator_facade< - node_iterator - , node_base - , boost::forward_traversal_tag - > - { - ... - }; - - -[h2 Constructors and Data Members] - -Next we need to decide how to represent the iterator's position. -This representation will take the form of data members, so we'll -also need to write constructors to initialize them. The -`node_iterator`\ 's position is quite naturally represented using -a pointer to a `node_base`. We'll need a constructor to build an -iterator from a `node_base*`, and a default constructor to -satisfy the `forward traversal iterator`_ requirements [#default]_. -Our `node_iterator` then becomes: - - # include "node.hpp" - # include - - class node_iterator - : public boost::iterator_facade< - node_iterator - , node_base - , boost::forward_traversal_tag - > - { - public: - node_iterator() - : m_node(0) - {} - - explicit node_iterator(node_base* p) - : m_node(p) - {} - - private: - ... - node_base* m_node; - }; - -.. [#default] Technically, the C++ standard places almost no - requirements on a default-constructed iterator, so if we were - really concerned with efficiency, we could've written the - default constructor to leave `m_node` uninitialized. - -[h2 Implementing the Core Operations] - -The last step is to implement the `core operations`_ required by -the concepts we want our iterator to model. Referring to the -table__, we can see that the first three rows are applicable -because `node_iterator` needs to satisfy the requirements for -`readable iterator`_, `single pass iterator`_, and `incrementable -iterator`_. - -__ `core operations`_ - -We therefore need to supply `dereference`, -`equal`, and `increment` members. We don't want these members -to become part of `node_iterator`\ 's public interface, so we can -make them private and grant friendship to -`boost::iterator_core_access`, a "back-door" that -`iterator_facade` uses to get access to the core operations: - - # include "node.hpp" - # include - - class node_iterator - : public boost::iterator_facade< - node_iterator - , node_base - , boost::forward_traversal_tag - > - { - public: - node_iterator() - : m_node(0) {} - - explicit node_iterator(node_base* p) - : m_node(p) {} - - private: - friend class boost::iterator_core_access; - - void increment() { m_node = m_node->next(); } - - bool equal(node_iterator const& other) const - { - return this->m_node == other.m_node; - } - - node_base& dereference() const { return *m_node; } - - node_base* m_node; - }; - -Voila; a complete and conforming readable, forward-traversal -iterator! For a working example of its use, see -[@../example/node_iterator1.cpp `this program`]. - -__ ../example/node_iterator1.cpp - -[h2 A constant `node_iterator`] - -[blurb *Constant and Mutable iterators*[br][br] -The term **mutable iterator** means an iterator through which -the object it references (its "referent") can be modified. A -**constant iterator** is one which doesn't allow modification of -its referent.[br][br] -The words *constant* and *mutable* don't refer to the ability to -modify the iterator itself. For example, an `int const*` is a -non-\ `const` *constant iterator*, which can be incremented -but doesn't allow modification of its referent, and `int* -const` is a `const` *mutable iterator*, which cannot be -modified but which allows modification of its referent.[br][br] -Confusing? We agree, but those are the standard terms. It -probably doesn't help much that a container's constant iterator -is called `const_iterator`. -] - -Now, our `node_iterator` gives clients access to both `node`\ -'s `print(std::ostream&) const` member function, but also its -mutating `double_me()` member. If we wanted to build a -*constant* `node_iterator`, we'd only have to make three -changes: - - class const_node_iterator - : public boost::iterator_facade< - node_iterator - , node_base **const** - , boost::forward_traversal_tag - > - { - public: - const_node_iterator() - : m_node(0) {} - - explicit const_node_iterator(node_base* p) - : m_node(p) {} - - private: - friend class boost::iterator_core_access; - - void increment() { m_node = m_node->next(); } - - bool equal(const_node_iterator const& other) const - { - return this->m_node == other.m_node; - } - - node_base **const**\ & dereference() const { return \*m_node; } - - node_base **const**\ * m_node; - }; - -[blurb `const` and an iterator's `value_type`[br][br] -The C++ standard requires an iterator's `value_type` *not* be -`const`\ -qualified, so `iterator_facade` strips the -`const` from its `Value` parameter in order to produce the -iterator's `value_type`. Making the `Value` argument -`const` provides a useful hint to `iterator_facade` that the -iterator is a *constant iterator*, and the default `Reference` -argument will be correct for all lvalue iterators. -] - -As a matter of fact, `node_iterator` and `const_node_iterator` -are so similar that it makes sense to factor the common code out -into a template as follows: - - template - class node_iter - : public boost::iterator_facade< - node_iter - , Value - , boost::forward_traversal_tag - > - { - public: - node_iter() - : m_node(0) {} - - explicit node_iter(Value* p) - : m_node(p) {} - - private: - friend class boost::iterator_core_access; - - bool equal(node_iter const& other) const - { - return this->m_node == other.m_node; - } - - void increment() - { m_node = m_node->next(); } - - Value& dereference() const - { return *m_node; } - - Value* m_node; - }; - typedef node_iter node_iterator; - typedef node_iter node_const_iterator; - - -[h2 Interoperability] - -Our `const_node_iterator` works perfectly well on its own, but -taken together with `node_iterator` it doesn't quite meet -expectations. For example, we'd like to be able to pass a -`node_iterator` where a `node_const_iterator` was expected, -just as you can with `std::list`\ 's `iterator` and -`const_iterator`. Furthermore, given a `node_iterator` and a -`node_const_iterator` into the same list, we should be able to -compare them for equality. - -This expected ability to use two different iterator types together -is known as |interoperability|_. Achieving interoperability in -our case is as simple as templatizing the `equal` function and -adding a templatized converting constructor [#broken]_ [#random]_: - - template - class node_iter - : public boost::iterator_facade< - node_iter - , Value - , boost::forward_traversal_tag - > - { - public: - node_iter() - : m_node(0) {} - - explicit node_iter(Value* p) - : m_node(p) {} - - template - node_iter(node_iter const& other) - : m_node(other.m_node) {} - - private: - friend class boost::iterator_core_access; - template friend class node_iter; - - template - bool equal(node_iter const& other) const - { - return this->m_node == other.m_node; - } - - void increment() - { m_node = m_node->next(); } - - Value& dereference() const - { return *m_node; } - - Value* m_node; - }; - typedef impl::node_iterator node_iterator; - typedef impl::node_iterator node_const_iterator; - -.. |interoperability| replace:: **interoperability** -.. _interoperability: new-iter-concepts.html#interoperable-iterators-lib-interoperable-iterators - -.. [#broken] If you're using an older compiler and it can't handle - this example, see the `example code`__ for workarounds. - -.. [#random] If `node_iterator` had been a `random access - traversal iterator`_, we'd have had to templatize its - `distance_to` function as well. - - -__ ../example/node_iterator2.hpp - -You can see an example program which exercises our interoperable -iterators -[@../example/node_iterator2.cpp `here`]. - - -[h2 Telling the Truth] - -Now `node_iterator` and `node_const_iterator` behave exactly as -you'd expect... almost. We can compare them and we can convert in -one direction: from `node_iterator` to `node_const_iterator`. -If we try to convert from `node_const_iterator` to -`node_iterator`, we'll get an error when the converting -constructor tries to initialize `node_iterator`\ 's `m_node`, a -`node*` with a `node const*`. So what's the problem? - -The problem is that -`boost::`\ |is_convertible|_\ `::value` -will be `true`, but it should be `false`. |is_convertible|_ -lies because it can only see as far as the *declaration* of -`node_iter`\ 's converting constructor, but can't look inside at -the *definition* to make sure it will compile. A perfect solution -would make `node_iter`\ 's converting constructor disappear when -the `m_node` conversion would fail. - -.. |is_convertible| replace:: `is_convertible` -.. _is_convertible: ../../type_traits/index.html#relationships - -In fact, that sort of magic is possible using -|enable_if|__. By rewriting the converting constructor as -follows, we can remove it from the overload set when it's not -appropriate: - - #include - #include - - ... - - private: - struct enabler {}; - - public: - template - node_iter( - node_iter const& other - , typename boost::enable_if< - boost::is_convertible - , enabler - >::type = enabler() - ) - : m_node(other.m_node) {} - -.. |enable_if| replace:: `boost::enable_if` -__ ../../utility/enable_if.html - - -[h2 Wrap Up] - -This concludes our `iterator_facade` tutorial, but before you -stop reading we urge you to take a look at |iterator_adaptor|__. -There's another way to approach writing these iterators which might -even be superior. - -.. |iterator_adaptor| replace:: `iterator_adaptor` -__ iterator_adaptor.html - -.. _`iterator traversal concept`: new-iter-concepts.html#iterator-traversal-concepts-lib-iterator-traversal -.. _`readable iterator`: new-iter-concepts.html#readable-iterators-lib-readable-iterators -.. _`lvalue iterator`: new-iter-concepts.html#lvalue-iterators-lib-lvalue-iterators -.. _`single pass iterator`: new-iter-concepts.html#single-pass-iterators-lib-single-pass-iterators -.. _`incrementable iterator`: new-iter-concepts.html#incrementable-iterators-lib-incrementable-iterators -.. _`forward traversal iterator`: new-iter-concepts.html#forward-traversal-iterators-lib-forward-traversal-iterators -.. _`bidirectional traversal iterator`: new-iter-concepts.html#bidirectional-traversal-iterators-lib-bidirectional-traversal-iterators -.. _`random access traversal iterator`: new-iter-concepts.html#random-access-traversal-iterators-lib-random-access-traversal-iterators - -[endsect] diff --git a/libs/iterator/doc/quickbook/filter_iterator.qbk b/libs/iterator/doc/quickbook/filter_iterator.qbk deleted file mode 100644 index 5076353b3..000000000 --- a/libs/iterator/doc/quickbook/filter_iterator.qbk +++ /dev/null @@ -1,242 +0,0 @@ - -[section:filter Filter Iterator] - -The filter iterator adaptor creates a view of an iterator range in -which some elements of the range are skipped. A predicate function -object controls which elements are skipped. When the predicate is -applied to an element, if it returns `true` then the element is -retained and if it returns `false` then the element is skipped -over. When skipping over elements, it is necessary for the filter -adaptor to know when to stop so as to avoid going past the end of the -underlying range. A filter iterator is therefore constructed with pair -of iterators indicating the range of elements in the unfiltered -sequence to be traversed. - -[h2 Example] - -This example uses `filter_iterator` and then -`make_filter_iterator` to output only the positive integers from an -array of integers. Then `make_filter_iterator` is is used to output -the integers greater than `-2`. - - - struct is_positive_number { - bool operator()(int x) { return 0 < x; } - }; - - int main() - { - int numbers_[] = { 0, -1, 4, -3, 5, 8, -2 }; - const int N = sizeof(numbers_)/sizeof(int); - - typedef int* base_iterator; - base_iterator numbers(numbers_); - - // Example using filter_iterator - typedef boost::filter_iterator - FilterIter; - - is_positive_number predicate; - FilterIter filter_iter_first(predicate, numbers, numbers + N); - FilterIter filter_iter_last(predicate, numbers + N, numbers + N); - - std::copy(filter_iter_first, filter_iter_last, std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - // Example using make_filter_iterator() - std::copy(boost::make_filter_iterator(numbers, numbers + N), - boost::make_filter_iterator(numbers + N, numbers + N), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - // Another example using make_filter_iterator() - std::copy( - boost::make_filter_iterator( - std::bind2nd(std::greater(), -2) - , numbers, numbers + N) - - , boost::make_filter_iterator( - std::bind2nd(std::greater(), -2) - , numbers + N, numbers + N) - - , std::ostream_iterator(std::cout, " ") - ); - - std::cout << std::endl; - - return boost::exit_success; - } - - -The output is: - - 4 5 8 - 4 5 8 - 0 -1 4 5 8 - - -The source code for this example can be found [@../example/filter_iterator_example.cpp here]. - -[h2 Reference] - - -[h3 Synopsis] - - template - class filter_iterator - { - public: - typedef iterator_traits::value_type value_type; - typedef iterator_traits::reference reference; - typedef iterator_traits::pointer pointer; - typedef iterator_traits::difference_type difference_type; - typedef /* see below */ iterator_category; - - filter_iterator(); - filter_iterator(Predicate f, Iterator x, Iterator end = Iterator()); - filter_iterator(Iterator x, Iterator end = Iterator()); - template - filter_iterator( - filter_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition - ); - Predicate predicate() const; - Iterator end() const; - Iterator const& base() const; - reference operator*() const; - filter_iterator& operator++(); - private: - Predicate m_pred; // exposition only - Iterator m_iter; // exposition only - Iterator m_end; // exposition only - }; - - -If `Iterator` models Readable Lvalue Iterator and Bidirectional Traversal -Iterator then `iterator_category` is convertible to -`std::bidirectional_iterator_tag`. -Otherwise, if `Iterator` models Readable Lvalue Iterator and Forward Traversal -Iterator then `iterator_category` is convertible to -`std::forward_iterator_tag`. -Otherwise `iterator_category` is -convertible to `std::input_iterator_tag`. - - -[h3 Requirements] - -The `Iterator` argument shall meet the requirements of Readable -Iterator and Single Pass Iterator or it shall meet the requirements of -Input Iterator. - - -The `Predicate` argument must be Assignable, Copy Constructible, and -the expression `p(x)` must be valid where `p` is an object of type -`Predicate`, `x` is an object of type -`iterator_traits::value_type`, and where the type of -`p(x)` must be convertible to `bool`. - - -[h3 Concepts] - -The concepts that `filter_iterator` models are dependent on which -concepts the `Iterator` argument models, as specified in the -following tables. - -[table Traversal - [[If `Iterator` models ][then `filter_iterator` models ]] - [[Single Pass Iterator ][Single Pass Iterator ]] - [[Forward Traversal Iterator ][Forward Traversal Iterator ]] - [[Bidirectional Traversal Iterator ][Bidirectional Traversal Iterator]] -] - -[table Access - [[If `Iterator` models ][then `filter_iterator` models ]] - [[Readable Iterator][Readable Iterator]] - [[Writable Iterator][Writable Iterator]] - [[Lvalue Iterator ][Lvalue Iterator ]] -] - -[table C++03 - [[If `Iterator` models ][then `filter_iterator` models ]] - [[Readable Iterator, Single Pass Iterator ][Input Iterator ]] - [[Readable Lvalue Iterator, Forward Traversal Iterator][Forward Iterator ]] - [[Writable Lvalue Iterator, Forward Traversal Iterator][Mutable Forward Iterator ]] - [[Writable Lvalue Iterator, Bidirectional Iterator ][Mutable Bidirectional Iterator]] -] - -`filter_iterator` is interoperable with `filter_iterator` -if and only if `X` is interoperable with `Y`. - - -[h3 Operations] - - -In addition to those operations required by the concepts that -`filter_iterator` models, `filter_iterator` provides the following -operations. - - - filter_iterator(); - -[*Requires: ]`Predicate` and `Iterator` must be Default Constructible.[br] -[*Effects: ] Constructs a `filter_iterator` whose`m_pred`, `m_iter`, and `m_end` - members are a default constructed. - - - filter_iterator(Predicate f, Iterator x, Iterator end = Iterator()); - -[*Effects: ] Constructs a `filter_iterator` where `m_iter` is either - the first position in the range `[x,end)` such that `f(*m_iter) == true` - or else`m_iter == end`. The member `m_pred` is constructed from - `f` and `m_end` from `end`. - - - - filter_iterator(Iterator x, Iterator end = Iterator()); - -[*Requires: ] `Predicate` must be Default Constructible and - `Predicate` is a class type (not a function pointer).[br] -[*Effects: ] Constructs a `filter_iterator` where `m_iter` is either - the first position in the range `[x,end)` such that `m_pred(*m_iter) == true` - or else`m_iter == end`. The member `m_pred` is default constructed. - - - template - filter_iterator( - filter_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition - ); - -[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.[br] -[*Effects: ] Constructs a filter iterator whose members are copied from `t`. - - - Predicate predicate() const; - -[*Returns: ] `m_pred` - - - Ierator end() const; - -[*Returns: ] `m_end` - - - Iterator const& base() const; - -[*Returns: ] `m_iterator` - - - reference operator*() const; - -[*Returns: ] `*m_iter` - - - filter_iterator& operator++(); - -[*Effects: ] Increments `m_iter` and then continues to - increment `m_iter` until either `m_iter == m_end` - or `m_pred(*m_iter) == true`.[br] -[*Returns: ] `*this` - - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/function_output_iterator.qbk b/libs/iterator/doc/quickbook/function_output_iterator.qbk deleted file mode 100644 index 0baba0d70..000000000 --- a/libs/iterator/doc/quickbook/function_output_iterator.qbk +++ /dev/null @@ -1,100 +0,0 @@ - -[section:function_output Function Output Iterator] - -The function output iterator adaptor makes it easier to create custom -output iterators. The adaptor takes a unary function and creates a -model of Output Iterator. Each item assigned to the output iterator is -passed as an argument to the unary function. The motivation for this -iterator is that creating a conforming output iterator is non-trivial, -particularly because the proper implementation usually requires a -proxy object. - -[h2 Example] - - struct string_appender - { - string_appender(std::string& s) - : m_str(&s) - {} - - void operator()(const std::string& x) const - { - *m_str += x; - } - - std::string* m_str; - }; - - int main(int, char*[]) - { - std::vector x; - x.push_back("hello"); - x.push_back(" "); - x.push_back("world"); - x.push_back("!"); - - std::string s = ""; - std::copy(x.begin(), x.end(), - boost::make_function_output_iterator(string_appender(s))); - - std::cout << s << std::endl; - - return 0; - } - -[h2 Reference] - -[h3 Synopsis] - - template - class function_output_iterator { - public: - typedef std::output_iterator_tag iterator_category; - typedef void value_type; - typedef void difference_type; - typedef void pointer; - typedef void reference; - - explicit function_output_iterator(); - - explicit function_output_iterator(const UnaryFunction& f); - - /* see below */ operator*(); - function_output_iterator& operator++(); - function_output_iterator& operator++(int); - private: - UnaryFunction m_f; // exposition only - }; - -[h3 Requirements] - -`UnaryFunction` must be Assignable and Copy Constructible. - -[h3 Concepts] - -`function_output_iterator` is a model of the Writable and -Incrementable Iterator concepts. - -[h3 Operations] - - explicit function_output_iterator(const UnaryFunction& f = UnaryFunction()); - -[*Effects: ] Constructs an instance of `function_output_iterator` - with `m_f` constructed from `f`. - - unspecified_type operator*(); - -[*Returns: ] An object `r` of unspecified type such that `r = t` - is equivalent to `m_f(t)` for all `t`. - - - function_output_iterator& operator++(); - -[*Returns: ] `*this`. - - - function_output_iterator& operator++(int); - -[*Returns: ] `*this`. - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/indirect_iterator.qbk b/libs/iterator/doc/quickbook/indirect_iterator.qbk deleted file mode 100644 index 2556aa25f..000000000 --- a/libs/iterator/doc/quickbook/indirect_iterator.qbk +++ /dev/null @@ -1,254 +0,0 @@ - -[section:indirect Indirect Iterator] - -`indirect_iterator` adapts an iterator by applying an -*extra* dereference inside of `operator*()`. For example, this -iterator adaptor makes it possible to view a container of pointers -(e.g. `list`) as if it were a container of the pointed-to type -(e.g. `list`). `indirect_iterator` depends on two -auxiliary traits, `pointee` and `indirect_reference`, to -provide support for underlying iterators whose `value_type` is -not an iterator. - -[h2 Example] - -This example prints an array of characters, using -`indirect_iterator` to access the array of characters through an -array of pointers. Next `indirect_iterator` is used with the -`transform` algorithm to copy the characters (incremented by one) to -another array. A constant indirect iterator is used for the source and -a mutable indirect iterator is used for the destination. The last part -of the example prints the original array of characters, but this time -using the `make_indirect_iterator` helper function. - - - char characters[] = "abcdefg"; - const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char - char* pointers_to_chars[N]; // at the end. - for (int i = 0; i < N; ++i) - pointers_to_chars[i] = &characters[i]; - - // Example of using indirect_iterator - - boost::indirect_iterator - indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N); - - std::copy(indirect_first, indirect_last, std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - - // Example of making mutable and constant indirect iterators - - char mutable_characters[N]; - char* pointers_to_mutable_chars[N]; - for (int j = 0; j < N; ++j) - pointers_to_mutable_chars[j] = &mutable_characters[j]; - - boost::indirect_iterator mutable_indirect_first(pointers_to_mutable_chars), - mutable_indirect_last(pointers_to_mutable_chars + N); - boost::indirect_iterator const_indirect_first(pointers_to_chars), - const_indirect_last(pointers_to_chars + N); - - std::transform(const_indirect_first, const_indirect_last, - mutable_indirect_first, std::bind1st(std::plus(), 1)); - - std::copy(mutable_indirect_first, mutable_indirect_last, - std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - - // Example of using make_indirect_iterator() - - std::copy(boost::make_indirect_iterator(pointers_to_chars), - boost::make_indirect_iterator(pointers_to_chars + N), - std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - -The output is: - - a,b,c,d,e,f,g, - b,c,d,e,f,g,h, - a,b,c,d,e,f,g, - - -The source code for this example can be found -[@../example/indirect_iterator_example.cpp here]. - - -[h2 Reference] - -[h3 Synopsis] - - template < - class Iterator - , class Value = use_default - , class CategoryOrTraversal = use_default - , class Reference = use_default - , class Difference = use_default - > - class indirect_iterator - { - public: - typedef /* see below */ value_type; - typedef /* see below */ reference; - typedef /* see below */ pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - - indirect_iterator(); - indirect_iterator(Iterator x); - - template < - class Iterator2, class Value2, class Category2 - , class Reference2, class Difference2 - > - indirect_iterator( - indirect_iterator< - Iterator2, Value2, Category2, Reference2, Difference2 - > const& y - , typename enable_if_convertible::type* = 0 // exposition - ); - - Iterator const& base() const; - reference operator*() const; - indirect_iterator& operator++(); - indirect_iterator& operator--(); - private: - Iterator m_iterator; // exposition - }; - - -The member types of `indirect_iterator` are defined according to -the following pseudo-code, where `V` is -`iterator_traits::value_type` - -[pre - if (Value is use_default) then - typedef remove_const::type>::type value_type; - else - typedef remove_const::type value_type; - - if (Reference is use_default) then - if (Value is use_default) then - typedef indirect_reference::type reference; - else - typedef Value& reference; - else - typedef Reference reference; - - if (Value is use_default) then - typedef pointee::type\* pointer; - else - typedef Value\* pointer; - - if (Difference is use_default) - typedef iterator_traits::difference_type difference_type; - else - typedef Difference difference_type; - - if (CategoryOrTraversal is use_default) - typedef *iterator-category* ( - iterator_traversal::type,`reference`,`value_type` - ) iterator_category; - else - typedef *iterator-category* ( - CategoryOrTraversal,`reference`,`value_type` - ) iterator_category; -] - - -[h3 Requirements] - -The expression `*v`, where `v` is an object of -`iterator_traits::value_type`, shall be valid -expression and convertible to `reference`. `Iterator` shall -model the traversal concept indicated by `iterator_category`. -`Value`, `Reference`, and `Difference` shall be chosen so -that `value_type`, `reference`, and `difference_type` meet -the requirements indicated by `iterator_category`. - -[blurb Note: there are further requirements on the -`iterator_traits::value_type` if the `Value` -parameter is not `use_default`, as implied by the algorithm for -deducing the default for the `value_type` member.] - -[h3 Concepts] - -In addition to the concepts indicated by `iterator_category` -and by `iterator_traversal::type`, a -specialization of `indirect_iterator` models the following -concepts, Where `v` is an object of -`iterator_traits::value_type`: - -Readable Iterator if `reference(*v)` is convertible to -`value_type`. - -Writable Iterator if `reference(*v) = t` is a valid -expression (where `t` is an object of type -`indirect_iterator::value_type`) - -Lvalue Iterator if `reference` is a reference type. - -`indirect_iterator` is interoperable with -`indirect_iterator` if and only if `X` is -interoperable with `Y`. - -[h3 Operations] - -In addition to the operations required by the concepts described -above, specializations of `indirect_iterator` provide the -following operations: - - - indirect_iterator(); - -[*Requires: ] `Iterator` must be Default Constructible.[br] -[*Effects: ] Constructs an instance of `indirect_iterator` with - a default-constructed `m_iterator`. - - - indirect_iterator(Iterator x); - -[*Effects: ] Constructs an instance of `indirect_iterator` with - `m_iterator` copy constructed from `x`. - - - template < - class Iterator2, class Value2, unsigned Access, class Traversal - , class Reference2, class Difference2 - > - indirect_iterator( - indirect_iterator< - Iterator2, Value2, Access, Traversal, Reference2, Difference2 - > const& y - , typename enable_if_convertible::type* = 0 // exposition - ); - -[*Requires: ] `Iterator2` is implicitly convertible to `Iterator`.[br] -[*Effects: ] Constructs an instance of `indirect_iterator` whose - `m_iterator` subobject is constructed from `y.base()`. - - - Iterator const& base() const; - -[*Returns: ] `m_iterator` - - - reference operator*() const; - -[*Returns: ] `**m_iterator` - - - indirect_iterator& operator++(); - -[*Effects: ] `++m_iterator`[br] -[*Returns: ] `*this` - - - indirect_iterator& operator--(); - -[*Effects: ] `--m_iterator`[br] -[*Returns: ] `*this` - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/iterator.qbk b/libs/iterator/doc/quickbook/iterator.qbk deleted file mode 100644 index 0ec20b2cb..000000000 --- a/libs/iterator/doc/quickbook/iterator.qbk +++ /dev/null @@ -1,269 +0,0 @@ - -[library Boost.Iterator - [/ version 1.0.1] - [quickbook 1.6] - [authors [Abrahams, David], [Siek, Jeremy], [Witt, Thomas]] - [copyright 2003 2005 David Abrahams Jeremy Siek Thomas Witt] - [category iterator] - [id iterator] - [dirname iterator] - [purpose - ] - [license - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at - - http://www.boost.org/LICENSE_1_0.txt - ) - ] -] - -[/ QuickBook Document version 1.0 ] - -[/ Images ] - -[def _note_ [$images/note.png]] -[def _alert_ [$images/caution.png]] -[def _detail_ [$images/note.png]] -[def _tip_ [$images/tip.png]] - -[/ Links ] - -[def _iterator_ [@../../libs/iterator/doc/index.html Boost.Iterator]] - -[section:intro Introduction] - -[def _concepts_ [@http://www.boost.org/more/generic_programming.html#concept concepts]] - -The Boost Iterator Library contains two parts. The first -is a system of _concepts_ which extend the C++ standard -iterator requirements. The second is a framework of -components for building iterators based on these -extended concepts and includes several useful iterator -adaptors. The extended iterator concepts have been -carefully designed so that old-style iterators -can fit in the new concepts and so that new-style -iterators will be compatible with old-style algorithms, -though algorithms may need to be updated if they want to -take full advantage of the new-style iterator -capabilities. Several components of this library have -been accepted into the C++ standard technical report. -The components of the Boost Iterator Library replace the -older Boost Iterator Adaptor Library. - - -[h2 New-Style Iterators] - -[def _N1185_ [@http://www.gotw.ca/publications/N1185.pdf N1185]] -[def _N1211_ [@http://www.gotw.ca/publications/N1211.pdf N1211]] -[def _GOTW_50_ [@http://www.gotw.ca/gotw/050.htm Guru of the Week]] - -The iterator categories defined in C++98 are extremely limiting -because they bind together two orthogonal concepts: traversal and -element access. For example, because a random access iterator is -required to return a reference (and not a proxy) when dereferenced, -it is impossible to capture the capabilities of -`vector::iterator` using the C++98 categories. This is the -infamous "`vector` is not a container, and its iterators -aren't random access iterators", debacle about which Herb Sutter -wrote two papers for the standards comittee (_N1185_ and _N1211_), -and a _GOTW_50_. New-style iterators go well beyond -patching up `vector`, though: there are lots of other -iterators already in use which can't be adequately represented by -the existing concepts. For details about the new iterator -concepts, see our [@./new-iter-concepts.html Standard Proposal for New-Style Iterators]. - -[h2 Iterator Facade and Adaptor] - -[def _facade_ [@./iterator_facade.html facade]] -[def _adaptor_ [@./iterator_adaptor.html adaptor]] - -Writing standard-conforming iterators is tricky, but the need comes -up often. In order to ease the implementation of new iterators, -the Boost.Iterator library provides the _facade_ class template, -which implements many useful defaults and compile-time checks -designed to help the iterator author ensure that his iterator is -correct. - -It is also common to define a new iterator that is similar to some -underlying iterator or iterator-like type, but that modifies some -aspect of the underlying type's behavior. For that purpose, the -library supplies the _adaptor_ class template, which is specially -designed to take advantage of as much of the underlying type's -behavior as possible. - -Both _facade_ and _adaptor_ as well as many of the `specialized -adaptors`_ mentioned below have been proposed for standardization -([@./facade-and-adaptor.html Standard Proposal For Iterator Facade and Adaptor]). - -[h2 Specialized Adaptors] - -The iterator library supplies a useful suite of standard-conforming -iterator templates based on the Boost [link -iterator.intro.iterator_facade_and_adaptor iterator facade and adaptor] -templates. - -[def _counting_ [@./counting_iterator.html `counting_iterator`]] -[def _filter_ [@./filter_iterator.html `filter_iterator`]] -[def _function_ [@./function_output_iterator.html `function_output_iterator`]] -[def _indirect_ [@./indirect_iterator.html `indirect_iterator`]] -[def _permutation_ [@./permutation_iterator.html `permutation_iterator`]] -[def _reverse_ [@./reverse_iterator.html `reverse_iterator`]] -[def _shared_ [@./shared_container_iterator.html `shared_container_iterator`]] -[def _transform_ [@./transform_iterator.html `transform_iterator`]] -[def _zip_ [@./zip_iterator.html `zip_iterator`]] - -[def _shared_ptr_ [@../../smart_ptr/shared_ptr.htm `shared_ptr`]] - -* _counting_: an iterator over a sequence of consecutive values. - Implements a "lazy sequence" - -* _filter_: an iterator over the subset of elements of some - sequence which satisfy a given predicate - -* _function_: an output iterator wrapping a unary function - object; each time an element is written into the dereferenced - iterator, it is passed as a parameter to the function object. - -* _indirect_: an iterator over the objects *pointed-to* by the - elements of some sequence. - -* _permutation_: an iterator over the elements of some random-access - sequence, rearranged according to some sequence of integer indices. - -* _reverse_: an iterator which traverses the elements of some - bidirectional sequence in reverse. Corrects many of the - shortcomings of C++98's ``std::reverse_iterator``. - -* _shared_: an iterator over elements of a container whose - lifetime is maintained by a _shared_ptr_ stored in the iterator. - -* _transform_: an iterator over elements which are the result of - applying some functional transformation to the elements of an - underlying sequence. This component also replaces the old - ``projection_iterator_adaptor``. - -* _zip_: an iterator over tuples of the elements at corresponding - positions of heterogeneous underlying iterators. - -[h2 Iterator Utilities] - -[h3 Traits] - -[def _pointee_ [@./pointee.html `pointee.hpp`]] -[def _iterator_traits_ [@./iterator_traits.html `iterator_traits.hpp`]] -[def _interoperable_ [@./interoperable.html `interoperable.hpp`]] -[def _MPL_ [@../../mpl/doc/index.html [*MPL]]] - -* _pointee_: Provides the capability to deduce the referent types - of pointers, smart pointers and iterators in generic code. Used - in _indirect_. - -* _iterator_traits_: Provides _MPL_ compatible metafunctions which - retrieve an iterator's traits. Also corrects for the deficiencies - of broken implementations of `std::iterator_traits`. - -[\ * |interoperable|_ (PDF__): Provides an _MPL_ compatible metafunction for - testing iterator interoperability -] - -[h3 Testing and Concept Checking] - -[def _iterator_concepts_ [@./iterator_concepts.html `iterator_concepts.hpp`]] -[def _iterator_archetypes_ [@./iterator_archetypes.html `iterator_archetypes.hpp`]] - -* _iterator_concepts_: Concept checking classes for the new iterator concepts. - -* _iterator_archetypes_: Concept archetype classes for the new iterators concepts. - -[endsect] - -[include concepts.qbk] - -[section:generic Generic Iterators] - -[include facade.qbk] - -[include adaptor.qbk] - -[endsect] - -[include specialized_adaptors.qbk] - -[section:utilities Utilities] - -[include archetypes.qbk] - -[include concept_checking.qbk] - -[include traits.qbk] - -[include utilities.qbk] - -[endsect] - -[section:upgrading Upgrading from the old Boost Iterator Adaptor Library] - -[def _type_generator_ [@http://www.boost.org/more/generic_programming.html#type_generator type generator]] - -If you have been using the old Boost Iterator Adaptor library to -implement iterators, you probably wrote a `Policies` class which -captures the core operations of your iterator. In the new library -design, you'll move those same core operations into the body of the -iterator class itself. If you were writing a family of iterators, -you probably wrote a _type_generator_ to build the -`iterator_adaptor` specialization you needed; in the new library -design you don't need a type generator (though may want to keep it -around as a compatibility aid for older code) because, due to the -use of the Curiously Recurring Template Pattern (CRTP) [Cop95]_, -you can now define the iterator class yourself and acquire -functionality through inheritance from `iterator_facade` or -`iterator_adaptor`. As a result, you also get much finer control -over how your iterator works: you can add additional constructors, -or even override the iterator functionality provided by the -library. - - -If you're looking for the old `projection_iterator` component, -its functionality has been merged into _transform_iterator_: as -long as the function object's `result_type` (or the `Reference` -template argument, if explicitly specified) is a true reference -type, _transform_iterator_ will behave like -`projection_iterator` used to. - -[endsect] - -[section:history History] - -In 2000 Dave Abrahams was writing an iterator for a container of -pointers, which would access the pointed-to elements when -dereferenced. Naturally, being a library writer, he decided to -generalize the idea and the Boost Iterator Adaptor library was born. -Dave was inspired by some writings of Andrei Alexandrescu and chose a -policy based design (though he probably didn't capture Andrei's idea -very well - there was only one policy class for all the iterator's -orthogonal properties). Soon Jeremy Siek realized he would need the -library and they worked together to produce a "Boostified" version, -which was reviewed and accepted into the library. They wrote a paper -and made several important revisions of the code. - -Eventually, several shortcomings of the older library began to make -the need for a rewrite apparent. Dave and Jeremy started working -at the Santa Cruz C++ committee meeting in 2002, and had quickly -generated a working prototype. At the urging of Mat Marcus, they -decided to use the GenVoca/CRTP pattern approach, and moved the -policies into the iterator class itself. Thomas Witt expressed -interest and became the voice of strict compile-time checking for -the project, adding uses of the SFINAE technique to eliminate false -converting constructors and operators from the overload set. He -also recognized the need for a separate `iterator_facade`, and -factored it out of `iterator_adaptor`. Finally, after a -near-complete rewrite of the prototype, they came up with the -library you see today. - -[:\[Coplien, 1995\] Coplien, J., Curiously Recurring Template - Patterns, C++ Report, February 1995, pp. 24-27.] - -[endsect] - - \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/permutation_iterator.qbk b/libs/iterator/doc/quickbook/permutation_iterator.qbk deleted file mode 100644 index 81352b6e0..000000000 --- a/libs/iterator/doc/quickbook/permutation_iterator.qbk +++ /dev/null @@ -1,207 +0,0 @@ - -[section:permutation Permutation Iterator] - -The permutation iterator adaptor provides a permuted view of a given -range. That is, the view includes every element of the given range but -in a potentially different order. The adaptor takes two arguments: - -* an iterator to the range V on which the permutation - will be applied -* the reindexing scheme that defines how the - elements of V will be permuted. - -Note that the permutation iterator is not limited to strict -permutations of the given range V. The distance between begin and end -of the reindexing iterators is allowed to be smaller compared to the -size of the range V, in which case the permutation iterator only -provides a permutation of a subrange of V. The indexes neither need -to be unique. In this same context, it must be noted that the past the -end permutation iterator is completely defined by means of the -past-the-end iterator to the indices. - -[h2 Example] - - using namespace boost; - int i = 0; - - typedef std::vector< int > element_range_type; - typedef std::list< int > index_type; - - static const int element_range_size = 10; - static const int index_size = 4; - - element_range_type elements( element_range_size ); - for(element_range_type::iterator el_it = elements.begin() ; el_it != elements.end() ; ++el_it) - *el_it = std::distance(elements.begin(), el_it); - - index_type indices( index_size ); - for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it ) - *i_it = element_range_size - index_size + std::distance(indices.begin(), i_it); - std::reverse( indices.begin(), indices.end() ); - - typedef permutation_iterator< element_range_type::iterator, index_type::iterator > permutation_type; - permutation_type begin = make_permutation_iterator( elements.begin(), indices.begin() ); - permutation_type it = begin; - permutation_type end = make_permutation_iterator( elements.begin(), indices.end() ); - - std::cout << "The original range is : "; - std::copy( elements.begin(), elements.end(), std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "The reindexing scheme is : "; - std::copy( indices.begin(), indices.end(), std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "The permutated range is : "; - std::copy( begin, end, std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "Elements at even indices in the permutation : "; - it = begin; - for(i = 0; i < index_size / 2 ; ++i, it+=2 ) std::cout << *it << " "; - std::cout << "\n"; - - std::cout << "Permutation backwards : "; - it = begin + (index_size); - assert( it != begin ); - for( ; it-- != begin ; ) std::cout << *it << " "; - std::cout << "\n"; - - std::cout << "Iterate backward with stride 2 : "; - it = begin + (index_size - 1); - for(i = 0 ; i < index_size / 2 ; ++i, it-=2 ) std::cout << *it << " "; - std::cout << "\n"; - - -The output is: - - The original range is : 0 1 2 3 4 5 6 7 8 9 - The reindexing scheme is : 9 8 7 6 - The permutated range is : 9 8 7 6 - Elements at even indices in the permutation : 9 7 - Permutation backwards : 6 7 8 9 - Iterate backward with stride 2 : 6 8 - - -The source code for this example can be found -[@../example/permutation_iter_example.cpp here]. - -[h2 Reference] - -[h3 Synopsis] - - template< class ElementIterator - , class IndexIterator - , class ValueT = use_default - , class CategoryT = use_default - , class ReferenceT = use_default - , class DifferenceT = use_default > - class permutation_iterator - { - public: - permutation_iterator(); - explicit permutation_iterator(ElementIterator x, IndexIterator y); - - template< class OEIter, class OIIter, class V, class C, class R, class D > - permutation_iterator( - permutation_iterator const& r - , typename enable_if_convertible::type* = 0 - , typename enable_if_convertible::type* = 0 - ); - reference operator*() const; - permutation_iterator& operator++(); - ElementIterator const& base() const; - private: - ElementIterator m_elt; // exposition only - IndexIterator m_order; // exposition only - }; - - template - permutation_iterator - make_permutation_iterator( ElementIterator e, IndexIterator i); - - -[h3 Requirements] - -`ElementIterator` shall model Random Access Traversal Iterator. -`IndexIterator` shall model Readable Iterator. The value type of -the `IndexIterator` must be convertible to the difference type of -`ElementIterator`. - -[h3 Concepts] - -`permutation_iterator` models the same iterator traversal concepts -as `IndexIterator` and the same iterator access concepts as -`ElementIterator`. - -If `IndexIterator` models Single Pass Iterator and -`ElementIterator` models Readable Iterator then -`permutation_iterator` models Input Iterator. - -If `IndexIterator` models Forward Traversal Iterator and -`ElementIterator` models Readable Lvalue Iterator then -`permutation_iterator` models Forward Iterator. - -If `IndexIterator` models Bidirectional Traversal Iterator and -`ElementIterator` models Readable Lvalue Iterator then -`permutation_iterator` models Bidirectional Iterator. - -If `IndexIterator` models Random Access Traversal Iterator and -`ElementIterator` models Readable Lvalue Iterator then -`permutation_iterator` models Random Access Iterator. - -`permutation_iterator` is interoperable -with `permutation_iterator` if and only if -`X` is interoperable with `Y` and `E1` is convertible -to `E2`. - -[h3 Operations] - -In addition to those operations required by the concepts that -`permutation_iterator` models, `permutation_iterator` provides the -following operations. - - permutation_iterator(); - -[*Effects: ] Default constructs `m_elt` and `m_order`. - - - explicit permutation_iterator(ElementIterator x, IndexIterator y); - -[*Effects: ] Constructs `m_elt` from `x` and `m_order` from `y`. - - - template< class OEIter, class OIIter, class V, class C, class R, class D > - permutation_iterator( - permutation_iterator const& r - , typename enable_if_convertible::type* = 0 - , typename enable_if_convertible::type* = 0 - ); - -[*Effects: ] Constructs `m_elt` from `r.m_elt` and - `m_order` from `y.m_order`. - - - reference operator*() const; - -[*Returns: ] `*(m_elt + *m_order)` - - - permutation_iterator& operator++(); - -[*Effects: ] `++m_order`[br] -[*Returns: ] `*this` - - - ElementIterator const& base() const; - -[*Returns: ] `m_order` - - - template - permutation_iterator - make_permutation_iterator(ElementIterator e, IndexIterator i); - -[*Returns: ] `permutation_iterator(e, i)` - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/reverse_iterator.qbk b/libs/iterator/doc/quickbook/reverse_iterator.qbk deleted file mode 100644 index 2599105f8..000000000 --- a/libs/iterator/doc/quickbook/reverse_iterator.qbk +++ /dev/null @@ -1,160 +0,0 @@ - -[section:reverse Reverse Iterator] - -The reverse iterator adaptor iterates through the adapted iterator -range in the opposite direction. - -[h2 Example] - -The following example prints an array of characters in reverse order -using `reverse_iterator`. - - - char letters_[] = "hello world!"; - const int N = sizeof(letters_)/sizeof(char) - 1; - typedef char* base_iterator; - base_iterator letters(letters_); - std::cout << "original sequence of letters:\t\t\t" << letters_ << std::endl; - - boost::reverse_iterator - reverse_letters_first(letters + N), - reverse_letters_last(letters); - - std::cout << "sequence in reverse order:\t\t\t"; - std::copy(reverse_letters_first, reverse_letters_last, - std::ostream_iterator(std::cout)); - std::cout << std::endl; - - std::cout << "sequence in double-reversed (normal) order:\t"; - std::copy(boost::make_reverse_iterator(reverse_letters_last), - boost::make_reverse_iterator(reverse_letters_first), - std::ostream_iterator(std::cout)); - std::cout << std::endl; - - - -The output is: - - original sequence of letters: hello world! - sequence in reverse order: !dlrow olleh - sequence in double-reversed (normal) order: hello world! - - -The source code for this example can be found -[@../example/reverse_iterator_example.cpp here]. - -[h2 Reference] - -[h3 Synopsis] - - template - class reverse_iterator - { - public: - typedef iterator_traits::value_type value_type; - typedef iterator_traits::reference reference; - typedef iterator_traits::pointer pointer; - typedef iterator_traits::difference_type difference_type; - typedef /* see below */ iterator_category; - - reverse_iterator() {} - explicit reverse_iterator(Iterator x) ; - - template - reverse_iterator( - reverse_iterator const& r - , typename enable_if_convertible::type* = 0 // exposition - ); - Iterator const& base() const; - reference operator*() const; - reverse_iterator& operator++(); - reverse_iterator& operator--(); - private: - Iterator m_iterator; // exposition - }; - - -If `Iterator` models Random Access Traversal Iterator and Readable -Lvalue Iterator, then `iterator_category` is convertible to -`random_access_iterator_tag`. Otherwise, if -`Iterator` models Bidirectional Traversal Iterator and Readable -Lvalue Iterator, then `iterator_category` is convertible to -`bidirectional_iterator_tag`. Otherwise, `iterator_category` is -convertible to `input_iterator_tag`. - -[h3 Requirements] - -`Iterator` must be a model of Bidirectional Traversal Iterator. The -type `iterator_traits::reference` must be the type of -`*i`, where `i` is an object of type `Iterator`. - -[h3 Concepts] - -A specialization of `reverse_iterator` models the same iterator -traversal and iterator access concepts modeled by its `Iterator` -argument. In addition, it may model old iterator concepts -specified in the following table: - -[table Categories - [[If `I` models ][then `reverse_iterator` models]] - [[Readable Lvalue Iterator, Bidirectional Traversal Iterator][Bidirectional Iterator]] - [[Writable Lvalue Iterator, Bidirectional Traversal Iterator][Mutable Bidirectional Iterator]] - [[Readable Lvalue Iterator, Random Access Traversal Iterator][Random Access Iterator]] - [[Writable Lvalue Iterator, Random Access Traversal Iterator][Mutable Random Access Iterator]] -] - -`reverse_iterator` is interoperable with -`reverse_iterator` if and only if `X` is interoperable with -`Y`. - -[h3 Operations] - -In addition to the operations required by the concepts modeled by -`reverse_iterator`, `reverse_iterator` provides the following -operations. - - reverse_iterator(); - -[*Requires: ] `Iterator` must be Default Constructible.[br] -[*Effects: ] Constructs an instance of `reverse_iterator` with `m_iterator` - default constructed. - - explicit reverse_iterator(Iterator x); - -[*Effects: ] Constructs an instance of `reverse_iterator` with - `m_iterator` copy constructed from `x`. - - - template - reverse_iterator( - reverse_iterator const& r - , typename enable_if_convertible::type* = 0 // exposition - ); - -[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.[br] -[*Effects: ] Constructs instance of `reverse_iterator` whose - `m_iterator` subobject is constructed from `y.base()`. - - - - Iterator const& base() const; - -[*Returns: ] `m_iterator` - - - reference operator*() const; - -[*Effects: ] Iterator tmp = m_iterator; return *--tmp; - - - reverse_iterator& operator++(); - -[*Effects: ] `--m_iterator`[br] -[*Returns: ] `*this` - - reverse_iterator& operator--(); - -[*Effects: ] `++m_iterator`[br] -[*Returns: ] `*this` - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/shared_container_iterator.qbk b/libs/iterator/doc/quickbook/shared_container_iterator.qbk deleted file mode 100644 index faf23013c..000000000 --- a/libs/iterator/doc/quickbook/shared_container_iterator.qbk +++ /dev/null @@ -1,248 +0,0 @@ - -[section:shared_container Shared Container Iterator] - -Defined in header [@../../../boost/shared_container_iterator.hpp `boost/shared_container_iterator.hpp`]. - -The purpose of the shared container iterator is to attach the lifetime -of a container to the lifetime of its iterators. In other words, the -container will not be deleted until after all its iterators are -destroyed. The shared container iterator is typically used to -implement functions that return iterators over a range of objects that -only need to exist for the lifetime of the iterators. By returning a -pair of shared iterators from a function, the callee can return a -heap-allocated range of objects whose lifetime is automatically -managed. - -The shared container iterator augments an iterator over a shared -container. It maintains a reference count on the shared container. If -only shared container iterators hold references to the container, the -container's lifetime will end when the last shared container iterator -over it is destroyed. In any case, the shared container is guaranteed -to persist beyond the lifetime of all the iterators. In all other -ways, the shared container iterator behaves the same as its base -iterator. - -[h2 Synopsis] - - namespace boost { - template - class shared_container_iterator; - - template - shared_container_iterator - make_shared_container_iterator(typename Container::iterator base, - boost::shared_ptr const& container); - - std::pair< - typename shared_container_iterator, - typename shared_container_iterator - > - make_shared_container_range(boost::shared_ptr const& container); - } - -[section:shared_container_type The Shared Container Iterator Type] - - template class shared_container_iterator; - -The class template `shared_container_iterator` is the shared container -iterator type. The `Container` template type argument must model the -[@http://www.sgi.com/tech/stl/Container.html Container] concept. - -[h2 Example] - -The following example illustrates how to create an iterator that -regulates the lifetime of a reference counted `std::vector`. Though the -original shared pointer `ints` ceases to exist after `set_range()` -returns, the `shared_counter_iterator` objects maintain references to -the underlying vector and thereby extend the container's lifetime. - -[@../../../libs/utility/shared_iterator_example1.cpp `shared_iterator_example1.cpp`]: - - #include "shared_container_iterator.hpp" - #include "boost/shared_ptr.hpp" - #include - #include - #include - - typedef boost::shared_container_iterator< std::vector > iterator; - - - void set_range(iterator& i, iterator& end) { - - boost::shared_ptr< std::vector > ints(new std::vector()); - - ints->push_back(0); - ints->push_back(1); - ints->push_back(2); - ints->push_back(3); - ints->push_back(4); - ints->push_back(5); - - i = iterator(ints->begin(),ints); - end = iterator(ints->end(),ints); - } - - - int main() { - - iterator i,end; - - set_range(i,end); - - std::copy(i,end,std::ostream_iterator(std::cout,",")); - std::cout.put('\n'); - - return 0; - } - -The output from this part is: - - 0,1,2,3,4,5, - -[table Template Parameters - [[Parameter][Description]] - [[Container][The type of the container that we wish to iterate over. It must be a model of the Container concept.]] -] - -[h2 Concepts] - -The `shared_container_iterator` type models the same iterator concept -as the base iterator (`Container::iterator`). - -[h2 Operations] - -The `shared_container_iterator` type implements the member functions -and operators required of the -[@http://www.sgi.com/tech/stl/RandomAccessIterator.html Random Access -Iterator] concept, though only operations defined for the base -iterator will be valid. In addition it has the following constructor: - - shared_container_iterator(Container::iterator const& it, - boost::shared_ptr const& container) - -[endsect] - -[section:shared_container_object_generator The Shared Container Iterator Object Generator] - - template - shared_container_iterator - make_shared_container_iterator(Container::iterator base, - boost::shared_ptr const& container) - -This function provides an alternative to directly constructing a -`shared_container_iterator`. Using the object generator, a -`shared_container_iterator` can be created and passed to a function without -explicitly specifying its type. - -[h2 Example] - -This example, similar to the previous, -uses `make_shared_container_iterator()` to create the iterators. - -[@../../../libs/utility/shared_iterator_example2.cpp `shared_iterator_example2.cpp`]: - - #include "shared_container_iterator.hpp" - #include "boost/shared_ptr.hpp" - #include - #include - #include - #include - - - template - void print_range_nl (Iterator begin, Iterator end) { - typedef typename std::iterator_traits::value_type val; - std::copy(begin,end,std::ostream_iterator(std::cout,",")); - std::cout.put('\n'); - } - - - int main() { - - typedef boost::shared_ptr< std::vector > ints_t; - { - ints_t ints(new std::vector()); - - ints->push_back(0); - ints->push_back(1); - ints->push_back(2); - ints->push_back(3); - ints->push_back(4); - ints->push_back(5); - - print_range_nl(boost::make_shared_container_iterator(ints->begin(),ints), - boost::make_shared_container_iterator(ints->end(),ints)); - } - - - - return 0; - } - -Observe that the `shared_container_iterator` type is never explicitly -named. The output from this example is the same as the previous. - -[endsect] - -[section:shared_container_generator The Shared Container Iterator Range Generator] - - template - std::pair< - shared_container_iterator, - shared_container_iterator - > - make_shared_container_range(boost::shared_ptr const& container); - Class shared_container_iterator is meant primarily to return, using iterators, a range of values that we can guarantee will be alive as long as the iterators are. This is a convenience function to do just that. It is equivalent to - std::make_pair(make_shared_container_iterator(container->begin(),container), - make_shared_container_iterator(container->end(),container)); - -[h2 Example] - -In the following example, a range of values is returned as a pair of shared_container_iterator objects. - -[@../../../libs/utility/shared_iterator_example3.cpp `shared_iterator_example3.cpp`]: - - #include "shared_container_iterator.hpp" - #include "boost/shared_ptr.hpp" - #include "boost/tuple/tuple.hpp" // for boost::tie - #include // for std::copy - #include - #include - - - typedef boost::shared_container_iterator< std::vector > iterator; - - std::pair - return_range() { - boost::shared_ptr< std::vector > range(new std::vector()); - range->push_back(0); - range->push_back(1); - range->push_back(2); - range->push_back(3); - range->push_back(4); - range->push_back(5); - return boost::make_shared_container_range(range); - } - - - int main() { - - - iterator i,end; - - boost::tie(i,end) = return_range(); - - std::copy(i,end,std::ostream_iterator(std::cout,",")); - std::cout.put('\n'); - - return 0; - } - -Though the range object only lives for the duration of the -`return_range` call, the reference counted `std::vector` will live -until `i` and `end` are both destroyed. The output from this example is -the same as the previous two. - -[endsect] - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/specialized_adaptors.qbk b/libs/iterator/doc/quickbook/specialized_adaptors.qbk deleted file mode 100644 index 2b8b868d3..000000000 --- a/libs/iterator/doc/quickbook/specialized_adaptors.qbk +++ /dev/null @@ -1,22 +0,0 @@ - -[section:specialized Specialized Adaptors] - -[include ./counting_iterator.qbk] - -[include ./filter_iterator.qbk] - -[include ./function_output_iterator.qbk] - -[include ./indirect_iterator.qbk] - -[include ./permutation_iterator.qbk] - -[include ./reverse_iterator.qbk] - -[include ./shared_container_iterator.qbk] - -[include ./transform_iterator.qbk] - -[include ./zip_iterator.qbk] - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/quickbook/traits.qbk b/libs/iterator/doc/quickbook/traits.qbk deleted file mode 100644 index 90bc9e1e2..000000000 --- a/libs/iterator/doc/quickbook/traits.qbk +++ /dev/null @@ -1,55 +0,0 @@ - -[section:traits Iterator Traits] - -`std::iterator_traits` provides access to five associated types -of any iterator: its `value_type`, `reference`, `pointer`, -`iterator_category`, and `difference_type`. Unfortunately, -such a "multi-valued" traits template can be difficult to use in a -metaprogramming context. `` -provides access to these types using a standard metafunctions_. - -[h2 Synopsis] - -Header ``: - - template - struct iterator_value - { - typedef typename - std::iterator_traits::value_type - type; - }; - - template - struct iterator_reference - { - typedef typename - std::iterator_traits::reference - type; - }; - - template - struct iterator_pointer - { - typedef typename - std::iterator_traits::pointer - type; - }; - - template - struct iterator_difference - { - typedef typename - detail::iterator_traits::difference_type - type; - }; - - template - struct iterator_category - { - typedef typename - detail::iterator_traits::iterator_category - type; - }; - -[endsect] diff --git a/libs/iterator/doc/quickbook/transform_iterator.qbk b/libs/iterator/doc/quickbook/transform_iterator.qbk deleted file mode 100644 index adf30b8d1..000000000 --- a/libs/iterator/doc/quickbook/transform_iterator.qbk +++ /dev/null @@ -1,216 +0,0 @@ - -[section:transform Transform Iterator] - -The transform iterator adapts an iterator by modifying the -`operator*` to apply a function object to the result of -dereferencing the iterator and returning the result. - - -[h2 Example] - - -This is a simple example of using the transform_iterators class to -generate iterators that multiply (or add to) the value returned by -dereferencing the iterator. It would be cooler to use lambda library -in this example. - - int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; - const int N = sizeof(x)/sizeof(int); - - typedef boost::binder1st< std::multiplies > Function; - typedef boost::transform_iterator doubling_iterator; - - doubling_iterator i(x, boost::bind1st(std::multiplies(), 2)), - i_end(x + N, boost::bind1st(std::multiplies(), 2)); - - std::cout << "multiplying the array by 2:" << std::endl; - while (i != i_end) - std::cout << *i++ << " "; - std::cout << std::endl; - - std::cout << "adding 4 to each element in the array:" << std::endl; - std::copy(boost::make_transform_iterator(x, boost::bind1st(std::plus(), 4)), - boost::make_transform_iterator(x + N, boost::bind1st(std::plus(), 4)), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - -The output is: - - multiplying the array by 2: - 2 4 6 8 10 12 14 16 - adding 4 to each element in the array: - 5 6 7 8 9 10 11 12 - - -The source code for this example can be found -[@../example/transform_iterator_example.cpp here]. - -[h2 Reference] - - -[h3 Synopsis] - - template - class transform_iterator - { - public: - typedef /* see below */ value_type; - typedef /* see below */ reference; - typedef /* see below */ pointer; - typedef iterator_traits::difference_type difference_type; - typedef /* see below */ iterator_category; - - transform_iterator(); - transform_iterator(Iterator const& x, UnaryFunction f); - - template - transform_iterator( - transform_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition only - , typename enable_if_convertible::type* = 0 // exposition only - ); - UnaryFunction functor() const; - Iterator const& base() const; - reference operator*() const; - transform_iterator& operator++(); - transform_iterator& operator--(); - private: - Iterator m_iterator; // exposition only - UnaryFunction m_f; // exposition only - }; - - -If `Reference` is `use_default` then the `reference` member of -`transform_iterator` is[br] -`result_of::reference)>::type`. -Otherwise, `reference` is `Reference`. - - -If `Value` is `use_default` then the `value_type` member is -`remove_cv >::type`. Otherwise, -`value_type` is `Value`. - - -If `Iterator` models Readable Lvalue Iterator and if `Iterator` -models Random Access Traversal Iterator, then `iterator_category` is -convertible to `random_access_iterator_tag`. Otherwise, if -`Iterator` models Bidirectional Traversal Iterator, then -`iterator_category` is convertible to -`bidirectional_iterator_tag`. Otherwise `iterator_category` is -convertible to `forward_iterator_tag`. If `Iterator` does not -model Readable Lvalue Iterator then `iterator_category` is -convertible to `input_iterator_tag`. - - -[h3 Requirements] - - -The type `UnaryFunction` must be Assignable, Copy Constructible, and -the expression `f(*i)` must be valid where `f` is an object of -type `UnaryFunction`, `i` is an object of type `Iterator`, and -where the type of `f(*i)` must be -`result_of::reference)>::type`. - - -The argument `Iterator` shall model Readable Iterator. - - -[h3 Concepts] - - -The resulting `transform_iterator` models the most refined of the -following that is also modeled by `Iterator`. - - -* Writable Lvalue Iterator if `transform_iterator::reference` is a non-const reference. - -* Readable Lvalue Iterator if `transform_iterator::reference` is a const reference. - -* Readable Iterator otherwise. - - -The `transform_iterator` models the most refined standard traversal -concept that is modeled by the `Iterator` argument. - - -If `transform_iterator` is a model of Readable Lvalue Iterator then -it models the following original iterator concepts depending on what -the `Iterator` argument models. - - -[table Category - [[If `Iterator` models][then `transform_iterator` models]] - [[Single Pass Iterator][Input Iterator]] - [[Forward Traversal Iterator][Forward Iterator]] - [[Bidirectional Traversal Iterator][Bidirectional Iterator]] - [[Random Access Traversal Iterator][Random Access Iterator]] -] - -If `transform_iterator` models Writable Lvalue Iterator then it is a -mutable iterator (as defined in the old iterator requirements). - - -`transform_iterator` is interoperable with -`transform_iterator` if and only if `X` is -interoperable with `Y`. - -[h3 Operations] - -In addition to the operations required by the [link iterator.specialized.transform.concepts concepts] modeled by -`transform_iterator`, `transform_iterator` provides the following -operations: - - transform_iterator(); - -[*Returns: ] An instance of `transform_iterator` with `m_f` - and `m_iterator` default constructed. - - transform_iterator(Iterator const& x, UnaryFunction f); - -[*Returns: ] An instance of `transform_iterator` with `m_f` - initialized to `f` and `m_iterator` initialized to `x`. - - template - transform_iterator( - transform_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition only - , typename enable_if_convertible::type* = 0 // exposition only - ); - -[*Returns: ] An instance of `transform_iterator` with `m_f` - initialized to `t.functor()` and `m_iterator` initialized to - `t.base()`.[br] -[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`. - - - UnaryFunction functor() const; - -[*Returns: ] `m_f` - - - Iterator const& base() const; - -[*Returns: ] `m_iterator` - - - reference operator*() const; - -[*Returns: ] `m_f(*m_iterator)` - - - transform_iterator& operator++(); - -[*Effects: ] `++m_iterator`[br] -[*Returns: ] `*this` - - - transform_iterator& operator--(); - -[*Effects: ] `--m_iterator`[br] -[*Returns: ] `*this` - -[endsect] diff --git a/libs/iterator/doc/quickbook/utilities.qbk b/libs/iterator/doc/quickbook/utilities.qbk deleted file mode 100644 index d21984237..000000000 --- a/libs/iterator/doc/quickbook/utilities.qbk +++ /dev/null @@ -1,324 +0,0 @@ - -[section:utilities Iterator Utilities] - -[section:utilities_traits Traits] - -[h2 Overview] - -Have you ever wanted to write a generic function that can operate -on any kind of dereferenceable object? If you have, you've -probably run into the problem of how to determine the type that the -object "points at": - - template - void f(Dereferenceable p) - { - *what-goes-here?* value = \*p; - ... - } - - -[h2 `pointee`] - -It turns out to be impossible to come up with a fully-general -algorithm to do determine *what-goes-here* directly, but it is -possible to require that `pointee::type` is -correct. Naturally, `pointee` has the same difficulty: it can't -determine the appropriate `::type` reliably for all -`Dereferenceable`\ s, but it makes very good guesses (it works -for all pointers, standard and boost smart pointers, and -iterators), and when it guesses wrongly, it can be specialized as -necessary: - - namespace boost - { - template - struct pointee > - { - typedef T type; - }; - } - -[h2 `indirect_reference`] - -`indirect_reference::type` is rather more specialized than -`pointee`, and is meant to be used to forward the result of -dereferencing an object of its argument type. Most dereferenceable -types just return a reference to their pointee, but some return -proxy references or return the pointee by value. When that -information is needed, call on `indirect_reference`. - -Both of these templates are essential to the correct functioning of -[link iterator.specialized.indirect `indirect_iterator`]. - -[h2 `minimum_category`] - -`minimum_category` takes two iterator categories or two iterator traversal tags -and returns the one that is the weakest (i.e. least advanced). For example: - - static_assert( - is_same< - minimum_category< - std::forward_iterator_tag, - std::random_access_iterator_tag - >::type, - std::forward_iterator_tag - >::value, - "Unexpected minimum_category result" - ); - -[h2 Iterator category and traversal tags manipulation] - -The library provides several utilities to simplify conversions between iterator categories -and traversal tags: - -* `iterator_category_to_traversal::type` - the metafunction takes an iterator category `C` and returns -the corresponding traversal tag. -* `iterator_traversal::type` - a shorthand for `iterator_category_to_traversal::type>::type`. -* `pure_traversal_tag::type` - the metafunction takes a tag `T` which derives from one of the iterator traversal tags -and returns that traversal tag. `T` may also derive from other tags describing the iterator (e.g. whether this is a `const`-iterator -or not), these additional tags are not considered. -* `pure_iterator_traversal::type` - a shorthand for `pure_traversal_tag::type>::type`. - -[h2 Reference] - -[h3 `pointee`] - - template - struct pointee - { - typedef /* see below */ type; - }; - -[*Requires:] For an object `x` of type `Dereferenceable`, `*x` - is well-formed. If `++x` is ill-formed it shall neither be - ambiguous nor shall it violate access control, and - `Dereferenceable::element_type` shall be an accessible type. - Otherwise `iterator_traits::value_type` shall - be well formed. \[Note: These requirements need not apply to - explicit or partial specializations of `pointee`\] - -`type` is determined according to the following algorithm, where -`x` is an object of type `Dereferenceable`: - - if ( ++x is ill-formed ) - { - return Dereferenceable::element_type - } - else if (*x is a mutable reference to - std::iterator_traits::value_type) - { - return iterator_traits::value_type - } - else - { - return iterator_traits::value_type const - } - -[h3 `indirect_reference`] - - template - struct indirect_reference - { - typedef /* see below */ type; - }; - -[*Requires:] For an object `x` of type `Dereferenceable`, `*x` - is well-formed. If `++x` is ill-formed it shall neither be - ambiguous nor shall it violate access control, and - `pointee::type&` shall be well-formed. - Otherwise `iterator_traits::reference` shall - be well formed. \[Note: These requirements need not apply to - explicit or partial specializations of `indirect_reference`\] - -`type` is determined according to the following algorithm, where -`x` is an object of type `Dereferenceable`: - - if ( ++x is ill-formed ) - return pointee::type& - else - std::iterator_traits::reference - -[h3 `minimum_category`] - - template - struct minimum_category - { - typedef /* see below */ type; - }; - -[*Requires:] Both `C1` and `C2` shall be standard iterator categories or - iterator traversal tags. - -`type` is determined according to the following algorithm, where `c1` is an -object of type `C1` and `c2` is an object of type `C2`: - - if (c1 is convertible to c2) - return C2; - else - return C1; - -[note The above definition relies on the fact that the more restricting categories -and traversal tags are convertible to the less restricting ones.] - -[h3 `iterator_category_to_traversal`] - - template - struct iterator_category_to_traversal - { - typedef /* see below */ type; - }; - -[*Requires:] `C` shall be a standard iterator category or an - iterator traversal tag. - -If `C` is an iterator traversal tag or convertible to one, `type` equivalent to `C`. -Otherwise, `type` is defined to the closest iterator traversal tag matching `C`. - -[h3 `iterator_traversal`] - - template - struct iterator_traversal - { - typedef typename iterator_category_to_traversal< - typename iterator_category::type - >::type type; - }; - -[*Requires:] `Iterator` shall be an iterator. - -[h3 `pure_traversal_tag`] - - template - struct pure_traversal_tag - { - typedef /* see below */ type; - }; - -[*Requires:] `T` shall be convertible to an iterator traversal tag. - -`type` is defined to be the most advanced traversal tag `Tag` so that `T` is convertible to `Tag`. - -[h3 `pure_iterator_traversal`] - - template - struct pure_iterator_traversal - { - typedef typename pure_traversal_tag< - typename iterator_traversal::type - >::type type; - }; - -[*Requires:] `Iterator` shall be an iterator. - -[endsect] - -[section:utilities_testing Testing and Concept Checking] - -The iterator concept checking classes provide a mechanism for a -template to report better error messages when a user instantiates -the template with a type that does not meet the requirements of the -template. - -For an introduction to using concept checking classes, see -the documentation for the -[@../../concept_check/index.html `boost::concept_check`] library. - - -[h2 Reference] - -[h3 Iterator Access Concepts] - -* |Readable|_ -* |Writable|_ -* |Swappable|_ -* |Lvalue|_ - -[/ .. |Readable| replace:: *Readable Iterator* ] -[/ .. _Readable: ReadableIterator.html ] -[/ ] -[/ .. |Writable| replace:: *Writable Iterator* ] -[/ .. _Writable: WritableIterator.html ] -[/ ] -[/ .. |Swappable| replace:: *Swappable Iterator* ] -[/ .. _Swappable: SwappableIterator.html ] -[/ ] -[/ .. |Lvalue| replace:: *Lvalue Iterator* ] -[/ .. _Lvalue: LvalueIterator.html ] - - -Iterator Traversal Concepts -........................... - -* |Incrementable|_ -* |SinglePass|_ -* |Forward|_ -* |Bidir|_ -* |Random|_ - - -[/ .. |Incrementable| replace:: *Incrementable Iterator* ] -[/ .. _Incrementable: IncrementableIterator.html ] -[/ ] -[/ .. |SinglePass| replace:: *Single Pass Iterator* ] -[/ .. _SinglePass: SinglePassIterator.html ] -[/ ] -[/ .. |Forward| replace:: *Forward Traversal* ] -[/ .. _Forward: ForwardTraversal.html ] -[/ ] -[/ .. |Bidir| replace:: *Bidirectional Traversal* ] -[/ .. _Bidir: BidirectionalTraversal.html ] -[/ ] -[/ .. |Random| replace:: *Random Access Traversal* ] -[/ .. _Random: RandomAccessTraversal.html ] - - - -[h3 `iterator_concepts.hpp` Synopsis] - - namespace boost_concepts { - - // Iterator Access Concepts - - template - class ReadableIteratorConcept; - - template < - typename Iterator - , typename ValueType = std::iterator_traits::value_type - > - class WritableIteratorConcept; - - template - class SwappableIteratorConcept; - - template - class LvalueIteratorConcept; - - // Iterator Traversal Concepts - - template - class IncrementableIteratorConcept; - - template - class SinglePassIteratorConcept; - - template - class ForwardTraversalConcept; - - template - class BidirectionalTraversalConcept; - - template - class RandomAccessTraversalConcept; - - // Interoperability - - template - class InteroperableIteratorConcept; - - } - -[endsect] - -[endsect] diff --git a/libs/iterator/doc/quickbook/zip_iterator.qbk b/libs/iterator/doc/quickbook/zip_iterator.qbk deleted file mode 100644 index 63955387b..000000000 --- a/libs/iterator/doc/quickbook/zip_iterator.qbk +++ /dev/null @@ -1,266 +0,0 @@ - -[section:zip Zip Iterator] - -The zip iterator provides the ability to parallel-iterate -over several controlled sequences simultaneously. A zip -iterator is constructed from a tuple of iterators. Moving -the zip iterator moves all the iterators in parallel. -Dereferencing the zip iterator returns a tuple that contains -the results of dereferencing the individual iterators. - -The tuple of iterators is now implemented in terms of a Boost fusion sequence. -Because of this the 'tuple' may be any Boost fusion sequence and, for backwards -compatibility through a Boost fusion sequence adapter, a Boost tuple. Because the -'tuple' may be any boost::fusion sequence the 'tuple' may also be any type for which a -Boost fusion adapter exists. This includes, among others, a std::tuple and a std::pair. -Just remember to include the appropriate Boost fusion adapter header files for these -other Boost fusion adapters. The zip_iterator header file already includes the -Boost fusion adapter header file for Boost tuple, so you need not include it yourself -to use a Boost tuple as your 'tuple'. - -[section:zip_example Example] - -There are two main types of applications of the `zip_iterator`. The first -one concerns runtime efficiency: If one has several controlled sequences -of the same length that must be somehow processed, e.g., with the -`for_each` algorithm, then it is more efficient to perform just -one parallel-iteration rather than several individual iterations. For an -example, assume that `vect_of_doubles` and `vect_of_ints` -are two vectors of equal length containing doubles and ints, respectively, -and consider the following two iterations: - - std::vector::const_iterator beg1 = vect_of_doubles.begin(); - std::vector::const_iterator end1 = vect_of_doubles.end(); - std::vector::const_iterator beg2 = vect_of_ints.begin(); - std::vector::const_iterator end2 = vect_of_ints.end(); - - std::for_each(beg1, end1, func_0()); - std::for_each(beg2, end2, func_1()); - -These two iterations can now be replaced with a single one as follows: - - - std::for_each( - boost::make_zip_iterator( - boost::make_tuple(beg1, beg2) - ), - boost::make_zip_iterator( - boost::make_tuple(end1, end2) - ), - zip_func() - ); - -A non-generic implementation of `zip_func` could look as follows: - - - struct zip_func : - public std::unary_function&, void> - { - void operator()(const boost::tuple& t) const - { - m_f0(t.get<0>()); - m_f1(t.get<1>()); - } - - private: - func_0 m_f0; - func_1 m_f1; - }; - -The second important application of the `zip_iterator` is as a building block -to make combining iterators. A combining iterator is an iterator -that parallel-iterates over several controlled sequences and, upon -dereferencing, returns the result of applying a functor to the values of the -sequences at the respective positions. This can now be achieved by using the -`zip_iterator` in conjunction with the `transform_iterator`. - -Suppose, for example, that you have two vectors of doubles, say -`vect_1` and `vect_2`, and you need to expose to a client -a controlled sequence containing the products of the elements of -`vect_1` and `vect_2`. Rather than placing these products -in a third vector, you can use a combining iterator that calculates the -products on the fly. Let us assume that `tuple_multiplies` is a -functor that works like `std::multiplies`, except that it takes -its two arguments packaged in a tuple. Then the two iterators -`it_begin` and `it_end` defined below delimit a controlled -sequence containing the products of the elements of `vect_1` and -`vect_2`: - - typedef boost::tuple< - std::vector::const_iterator, - std::vector::const_iterator - > the_iterator_tuple; - - typedef boost::zip_iterator< - the_iterator_tuple - > the_zip_iterator; - - typedef boost::transform_iterator< - tuple_multiplies, - the_zip_iterator - > the_transform_iterator; - - the_transform_iterator it_begin( - the_zip_iterator( - the_iterator_tuple( - vect_1.begin(), - vect_2.begin() - ) - ), - tuple_multiplies() - ); - - the_transform_iterator it_end( - the_zip_iterator( - the_iterator_tuple( - vect_1.end(), - vect_2.end() - ) - ), - tuple_multiplies() - ); - -[endsect] - -[section:zip_reference Reference] - -[h2 Synopsis] - - template - class zip_iterator - { - - public: - typedef /* see below */ reference; - typedef reference value_type; - typedef value_type* pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - - zip_iterator(); - zip_iterator(IteratorTuple iterator_tuple); - - template - zip_iterator( - const zip_iterator& other - , typename enable_if_convertible< - OtherIteratorTuple - , IteratorTuple>::type* = 0 // exposition only - ); - - const IteratorTuple& get_iterator_tuple() const; - - private: - IteratorTuple m_iterator_tuple; // exposition only - }; - - template - zip_iterator - make_zip_iterator(IteratorTuple t); - -The `reference` member of `zip_iterator` is the type of the tuple -made of the reference types of the iterator types in the `IteratorTuple` -argument. - -The `difference_type` member of `zip_iterator` is the `difference_type` -of the first of the iterator types in the `IteratorTuple` argument. - -The `iterator_category` member of `zip_iterator` is convertible to the -minimum of the traversal categories of the iterator types in the `IteratorTuple` -argument. For example, if the `zip_iterator` holds only vector -iterators, then `iterator_category` is convertible to -`boost::random_access_traversal_tag`. If you add a list iterator, then -`iterator_category` will be convertible to `boost::bidirectional_traversal_tag`, -but no longer to `boost::random_access_traversal_tag`. - -[h2 Requirements] - -All iterator types in the argument `IteratorTuple` shall model Readable Iterator. - -[h2 Concepts] - -The resulting `zip_iterator` models Readable Iterator. - -The fact that the `zip_iterator` models only Readable Iterator does not -prevent you from modifying the values that the individual iterators point -to. The tuple returned by the `zip_iterator`'s `operator*` is a tuple -constructed from the reference types of the individual iterators, not -their value types. For example, if `zip_it` is a `zip_iterator` whose -first member iterator is an `std::vector::iterator`, then the -following line will modify the value which the first member iterator of -`zip_it` currently points to: - - zip_it->get<0>() = 42.0; - - -Consider the set of standard traversal concepts obtained by taking -the most refined standard traversal concept modeled by each individual -iterator type in the `IteratorTuple` argument.The `zip_iterator` -models the least refined standard traversal concept in this set. - -`zip_iterator` is interoperable with -`zip_iterator` if and only if `IteratorTuple1` -is interoperable with `IteratorTuple2`. - -[h2 Operations] - -In addition to the operations required by the concepts modeled by -`zip_iterator`, `zip_iterator` provides the following -operations. - - zip_iterator(); - -[*Returns:] An instance of `zip_iterator` with `m_iterator_tuple` - default constructed. - - - zip_iterator(IteratorTuple iterator_tuple); - -[*Returns:] An instance of `zip_iterator` with `m_iterator_tuple` - initialized to `iterator_tuple`. - - - template - zip_iterator( - const zip_iterator& other - , typename enable_if_convertible< - OtherIteratorTuple - , IteratorTuple>::type* = 0 // exposition only - ); - -[*Returns:] An instance of `zip_iterator` that is a copy of `other`.[br] -[*Requires:] `OtherIteratorTuple` is implicitly convertible to `IteratorTuple`. - - - const IteratorTuple& get_iterator_tuple() const; - -[*Returns:] `m_iterator_tuple` - - - reference operator*() const; - -[*Returns:] A tuple consisting of the results of dereferencing all iterators in - `m_iterator_tuple`. - - - zip_iterator& operator++(); - -[*Effects:] Increments each iterator in `m_iterator_tuple`.[br] -[*Returns:] `*this` - - - zip_iterator& operator--(); - -[*Effects:] Decrements each iterator in `m_iterator_tuple`.[br] -[*Returns:] `*this` - - template - zip_iterator - make_zip_iterator(IteratorTuple t); - -[*Returns:] An instance of `zip_iterator` with `m_iterator_tuple` - initialized to `t`. - -[endsect] - -[endsect] \ No newline at end of file diff --git a/libs/iterator/doc/ref_problem.rst b/libs/iterator/doc/ref_problem.rst deleted file mode 100644 index 8dead8942..000000000 --- a/libs/iterator/doc/ref_problem.rst +++ /dev/null @@ -1,63 +0,0 @@ -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - Problem with ``reference`` and old/new iterator category correspondance -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -.. _N1550: http://www.boost-consulting.com/writing/n1550.html -.. _N1530: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1530.html - -:Author: David Abrahams and Jeremy Siek -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu -:Organization: `Boost Consulting`_, Indiana University Bloomington -:date: $Date$ -:Copyright: Copyright David Abrahams, Jeremy Siek 2003. 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) - -.. _`Boost Consulting`: http://www.boost-consulting.com - -============== - Introduction -============== - -The new iterator categories are intended to correspond to the old -iterator categories, as specified in a diagram in N1550_. For example, -an iterator categorized as a mutable Forward Iterator under the old -scheme is now a Writable, Lvalue, and Foward Traversal iterator. -However, there is a problem with this correspondance, the new iterator -categories place requirements on the ``iterator_traits::reference`` -type whereas the standard iterator requirements say nothing about the -``reference`` type . In particular, the new Readable Iterator -requirements say that the return type of ``*a`` must be -``iterator_traits::reference`` and the Lvalue Iterator requirements -says that ``iterator_traits::reference`` must be ``T&`` or ``const -T&``. - - -==================== - Proposed Resolution -==================== - -Change the standard requirements to match the requirements of the new -iterators. (more details to come) - - -========== - Rationale -========== - -The lack of specification in the standard of the ``reference`` type is -certainly a defect. Without specification, it is entirely useless in a -generic function. The current practice in the community is generally -to assume there are requirements on the ``reference`` type, such as -those proposed in the new iterator categories. - -There is some danger in *adding* requirements to existing concepts. -This will mean that some existing iterator types will no longer meet -the iterator requirements. However, we feel that the impact of this is -small enough to warrant going ahead with this change. - -An alternative solution would be to leave the standard requirements as -is, and to remove the requirements for the ``reference`` type in the -new iterator concepts. We are not in favor of this approach because it -extends what we see as a defect further into the future. diff --git a/libs/iterator/doc/reverse_iterator.html b/libs/iterator/doc/reverse_iterator.html deleted file mode 100644 index f635c1d1f..000000000 --- a/libs/iterator/doc/reverse_iterator.html +++ /dev/null @@ -1,297 +0,0 @@ - - - - - - -Reverse Iterator - - - - - - - -

-

Reverse Iterator

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2006-09-11
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
- - - - --- - - - -
abstract: - - -The reverse iterator adaptor iterates through the adapted iterator -range in the opposite direction.
-
-
-

reverse_iterator synopsis

- - - -
-template <class Iterator>
-class reverse_iterator
-{
-public:
-  typedef iterator_traits<Iterator>::value_type value_type;
-  typedef iterator_traits<Iterator>::reference reference;
-  typedef iterator_traits<Iterator>::pointer pointer;
-  typedef iterator_traits<Iterator>::difference_type difference_type;
-  typedef /* see below */ iterator_category;
-
-  reverse_iterator() {}
-  explicit reverse_iterator(Iterator x) ;
-
-  template<class OtherIterator>
-  reverse_iterator(
-      reverse_iterator<OtherIterator> const& r
-    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-  );
-  Iterator const& base() const;
-  reference operator*() const;
-  reverse_iterator& operator++();
-  reverse_iterator& operator--();
-private:
-  Iterator m_iterator; // exposition
-};
-
-

If Iterator models Random Access Traversal Iterator and Readable -Lvalue Iterator, then iterator_category is convertible to -random_access_iterator_tag. Otherwise, if -Iterator models Bidirectional Traversal Iterator and Readable -Lvalue Iterator, then iterator_category is convertible to -bidirectional_iterator_tag. Otherwise, iterator_category is -convertible to input_iterator_tag.

-
-
-

reverse_iterator requirements

-

Iterator must be a model of Bidirectional Traversal Iterator. The -type iterator_traits<Iterator>::reference must be the type of -*i, where i is an object of type Iterator.

-
-
-

reverse_iterator models

-

A specialization of reverse_iterator models the same iterator -traversal and iterator access concepts modeled by its Iterator -argument. In addition, it may model old iterator concepts -specified in the following table:

- ---- - - - - - - - - - - - - - - - - - - - -
If I modelsthen reverse_iterator<I> models
Readable Lvalue Iterator, -Bidirectional Traversal IteratorBidirectional Iterator
Writable Lvalue Iterator, -Bidirectional Traversal IteratorMutable Bidirectional Iterator
Readable Lvalue Iterator, -Random Access Traversal IteratorRandom Access Iterator
Writable Lvalue Iterator, -Random Access Traversal IteratorMutable Random Access Iterator
-

reverse_iterator<X> is interoperable with -reverse_iterator<Y> if and only if X is interoperable with -Y.

-
-
-

reverse_iterator operations

-

In addition to the operations required by the concepts modeled by -reverse_iterator, reverse_iterator provides the following -operations.

-

reverse_iterator();

- --- - - - - - -
Requires:Iterator must be Default Constructible.
Effects:Constructs an instance of reverse_iterator with m_iterator -default constructed.
-

explicit reverse_iterator(Iterator x);

- --- - - - -
Effects:Constructs an instance of reverse_iterator with -m_iterator copy constructed from x.
-
-template<class OtherIterator>
-reverse_iterator(
-    reverse_iterator<OtherIterator> const& r
-  , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
-);
-
- --- - - - - - -
Requires:OtherIterator is implicitly convertible to Iterator.
Effects:Constructs instance of reverse_iterator whose -m_iterator subobject is constructed from y.base().
-

Iterator const& base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Effects:
-
-Iterator tmp = m_iterator;
-return *--tmp;
-
-

reverse_iterator& operator++();

- --- - - - - - -
Effects:--m_iterator
Returns:*this
-

reverse_iterator& operator--();

- --- - - - - - -
Effects:++m_iterator
Returns:*this
- - - -
-template <class BidirectionalIterator>
-reverse_iterator<BidirectionalIterator>n
-make_reverse_iterator(BidirectionalIterator x);
-
- --- - - - -
Returns:An instance of reverse_iterator<BidirectionalIterator> -with a current constructed from x.
- - - -
-
-

Example

-

The following example prints an array of characters in reverse order -using reverse_iterator.

-
-char letters_[] = "hello world!";
-const int N = sizeof(letters_)/sizeof(char) - 1;
-typedef char* base_iterator;
-base_iterator letters(letters_);
-std::cout << "original sequence of letters:\t\t\t" << letters_ << std::endl;
-
-boost::reverse_iterator<base_iterator>
-  reverse_letters_first(letters + N),
-  reverse_letters_last(letters);
-
-std::cout << "sequence in reverse order:\t\t\t";
-std::copy(reverse_letters_first, reverse_letters_last,
-          std::ostream_iterator<char>(std::cout));
-std::cout << std::endl;
-
-std::cout << "sequence in double-reversed (normal) order:\t";
-std::copy(boost::make_reverse_iterator(reverse_letters_last),
-          boost::make_reverse_iterator(reverse_letters_first),
-          std::ostream_iterator<char>(std::cout));
-std::cout << std::endl;
-
-

The output is:

-
-original sequence of letters:                   hello world!
-sequence in reverse order:                      !dlrow olleh
-sequence in double-reversed (normal) order:     hello world!
-
-

The source code for this example can be found here.

-
-
- - - diff --git a/libs/iterator/doc/reverse_iterator.pdf b/libs/iterator/doc/reverse_iterator.pdf deleted file mode 100644 index 8cfd92566619f5008db054ac29244e11a4630c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61924 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 - reverse_letters_first(letters + N), - reverse_letters_last(letters); - - std::cout << "sequence in reverse order:\t\t\t"; - std::copy(reverse_letters_first, reverse_letters_last, - std::ostream_iterator(std::cout)); - std::cout << std::endl; - - std::cout << "sequence in double-reversed (normal) order:\t"; - std::copy(boost::make_reverse_iterator(reverse_letters_last), - boost::make_reverse_iterator(reverse_letters_first), - std::ostream_iterator(std::cout)); - std::cout << std::endl; - - - -The output is:: - - original sequence of letters: hello world! - sequence in reverse order: !dlrow olleh - sequence in double-reversed (normal) order: hello world! - - -The source code for this example can be found `here`__. - -__ ../example/reverse_iterator_example.cpp diff --git a/libs/iterator/doc/reverse_iterator_ref.rst b/libs/iterator/doc/reverse_iterator_ref.rst deleted file mode 100644 index b239b2665..000000000 --- a/libs/iterator/doc/reverse_iterator_ref.rst +++ /dev/null @@ -1,141 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -:: - - template - class reverse_iterator - { - public: - typedef iterator_traits::value_type value_type; - typedef iterator_traits::reference reference; - typedef iterator_traits::pointer pointer; - typedef iterator_traits::difference_type difference_type; - typedef /* see below */ iterator_category; - - reverse_iterator() {} - explicit reverse_iterator(Iterator x) ; - - template - reverse_iterator( - reverse_iterator const& r - , typename enable_if_convertible::type* = 0 // exposition - ); - Iterator const& base() const; - reference operator*() const; - reverse_iterator& operator++(); - reverse_iterator& operator--(); - private: - Iterator m_iterator; // exposition - }; - - -If ``Iterator`` models Random Access Traversal Iterator and Readable -Lvalue Iterator, then ``iterator_category`` is convertible to -``random_access_iterator_tag``. Otherwise, if -``Iterator`` models Bidirectional Traversal Iterator and Readable -Lvalue Iterator, then ``iterator_category`` is convertible to -``bidirectional_iterator_tag``. Otherwise, ``iterator_category`` is -convertible to ``input_iterator_tag``. - - - -``reverse_iterator`` requirements -................................. - -``Iterator`` must be a model of Bidirectional Traversal Iterator. The -type ``iterator_traits::reference`` must be the type of -``*i``, where ``i`` is an object of type ``Iterator``. - - - -``reverse_iterator`` models -........................... - -A specialization of ``reverse_iterator`` models the same iterator -traversal and iterator access concepts modeled by its ``Iterator`` -argument. In addition, it may model old iterator concepts -specified in the following table: - -+---------------------------------------+-----------------------------------+ -| If ``I`` models |then ``reverse_iterator`` models| -+=======================================+===================================+ -| Readable Lvalue Iterator, | Bidirectional Iterator | -| Bidirectional Traversal Iterator | | -+---------------------------------------+-----------------------------------+ -| Writable Lvalue Iterator, | Mutable Bidirectional Iterator | -| Bidirectional Traversal Iterator | | -+---------------------------------------+-----------------------------------+ -| Readable Lvalue Iterator, | Random Access Iterator | -| Random Access Traversal Iterator | | -+---------------------------------------+-----------------------------------+ -| Writable Lvalue Iterator, | Mutable Random Access Iterator | -| Random Access Traversal Iterator | | -+---------------------------------------+-----------------------------------+ - - -``reverse_iterator`` is interoperable with -``reverse_iterator`` if and only if ``X`` is interoperable with -``Y``. - -``reverse_iterator`` operations -............................... - -In addition to the operations required by the concepts modeled by -``reverse_iterator``, ``reverse_iterator`` provides the following -operations. - - - -``reverse_iterator();`` - -:Requires: ``Iterator`` must be Default Constructible. -:Effects: Constructs an instance of ``reverse_iterator`` with ``m_iterator`` - default constructed. - -``explicit reverse_iterator(Iterator x);`` - -:Effects: Constructs an instance of ``reverse_iterator`` with - ``m_iterator`` copy constructed from ``x``. - - -:: - - template - reverse_iterator( - reverse_iterator const& r - , typename enable_if_convertible::type* = 0 // exposition - ); - -:Requires: ``OtherIterator`` is implicitly convertible to ``Iterator``. -:Effects: Constructs instance of ``reverse_iterator`` whose - ``m_iterator`` subobject is constructed from ``y.base()``. - - - -``Iterator const& base() const;`` - -:Returns: ``m_iterator`` - - -``reference operator*() const;`` - -:Effects: - -:: - - Iterator tmp = m_iterator; - return *--tmp; - - -``reverse_iterator& operator++();`` - -:Effects: ``--m_iterator`` -:Returns: ``*this`` - - -``reverse_iterator& operator--();`` - -:Effects: ``++m_iterator`` -:Returns: ``*this`` diff --git a/libs/iterator/doc/rst2html b/libs/iterator/doc/rst2html deleted file mode 100644 index 9b5f63f5f..000000000 --- a/libs/iterator/doc/rst2html +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# Copyright David Abrahams 2006. Distributed under the Boost -# Software License, Version 1.0. (See accompanying -# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -PYTHONPATH="c:/src/docutils;c:/src/docutils/extras" -export PYTHONPATH -rst2html.py -gs --link-stylesheet --traceback --trim-footnote-reference-space --footnote-references=superscript --stylesheet=../../../rst.css $1 `echo $1 | sed 's/\(.*\)\..*/\1.html/'` - - - diff --git a/libs/iterator/doc/rst2latex b/libs/iterator/doc/rst2latex deleted file mode 100644 index f3c1d0e32..000000000 --- a/libs/iterator/doc/rst2latex +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh -# Copyright David Abrahams 2006. Distributed under the Boost -# Software License, Version 1.0. (See accompanying -# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -PYTHONPATH="c:/src/docutils;c:/src/docutils/extras" -export PYTHONPATH -python c:/src/docutils/tools/rst2latex.py --documentoptions pdftex --stylesheet=docutils.sty $1 `echo $1 | sed 's/\(.*\)\..*/\1.tex/'` diff --git a/libs/iterator/doc/scanrst.py b/libs/iterator/doc/scanrst.py deleted file mode 100644 index 484d87926..000000000 --- a/libs/iterator/doc/scanrst.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright David Abrahams 2004. 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 script accepts a list of .rst files to be processed and -# generates Makefile dependencies for .html and .rst files to stdout. -import os,sys -import re - -include = re.compile(r' *\.\. +(include|image):: +(.*)', re.MULTILINE) - -def deps(path, found): - dir = os.path.split(path)[0] - for m in re.findall(include, open(path).read()): - - dependency = os.path.normpath(os.path.join(dir,m[1])) - if dependency not in found: - found[dependency] = 1 - - if m[0] == 'include': - deps(dependency, found) - - return found - -for file in sys.argv[1:]: - found = deps(file, {}) - if found: - base = os.path.splitext(os.path.basename(file))[0] - print '%s.tex %s.html: %s' % (base, base, ' '.join(found.keys())) diff --git a/libs/iterator/doc/sources.py b/libs/iterator/doc/sources.py deleted file mode 100644 index 86249cc88..000000000 --- a/libs/iterator/doc/sources.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright David Abrahams 2004. 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) - -sources = [ -'counting_iterator.rst', -'facade-and-adaptor.rst', -'filter_iterator.rst', -'function_input_iterator.rst', -'function_output_iterator.rst', -'index.rst', -'indirect_iterator.rst', -'pointee.rst', -'iterator_adaptor.rst', -'iterator_facade.rst', -'new-iter-concepts.rst', -'permutation_iterator.rst', -'reverse_iterator.rst', -'transform_iterator.rst', -'zip_iterator.rst', -'iterator_archetypes.rst', -'iterator_concepts.rst', -'iterator_traits.rst' - ] - diff --git a/libs/iterator/doc/syscmd.py b/libs/iterator/doc/syscmd.py deleted file mode 100644 index e6a8dcaa4..000000000 --- a/libs/iterator/doc/syscmd.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright David Abrahams 2004. 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) - -import os -import sys - -def syscmd(s): - print 'executing: ', repr(s) - sys.stdout.flush() - err = os.system(s) - if err: - raise SystemError, 'command: %s returned %s' % ( - repr(s), err) diff --git a/libs/iterator/doc/transform_iterator.html b/libs/iterator/doc/transform_iterator.html deleted file mode 100644 index 228173797..000000000 --- a/libs/iterator/doc/transform_iterator.html +++ /dev/null @@ -1,346 +0,0 @@ - - - - - - -Transform Iterator - - - - - - - -
-

Transform Iterator

- --- - - - - - - - - - - - -
Author:David Abrahams, Jeremy Siek, Thomas Witt
Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
Date:2006-09-11
Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
- - - - --- - - - -
abstract: - - -The transform iterator adapts an iterator by modifying the -operator* to apply a function object to the result of -dereferencing the iterator and returning the result.
- -
-

transform_iterator synopsis

- - - - -
-template <class UnaryFunction,
-          class Iterator,
-          class Reference = use_default,
-          class Value = use_default>
-class transform_iterator
-{
-public:
-  typedef /* see below */ value_type;
-  typedef /* see below */ reference;
-  typedef /* see below */ pointer;
-  typedef iterator_traits<Iterator>::difference_type difference_type;
-  typedef /* see below */ iterator_category;
-
-  transform_iterator();
-  transform_iterator(Iterator const& x, UnaryFunction f);
-
-  template<class F2, class I2, class R2, class V2>
-  transform_iterator(
-        transform_iterator<F2, I2, R2, V2> const& t
-      , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
-      , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
-  );
-  UnaryFunction functor() const;
-  Iterator const& base() const;
-  reference operator*() const;
-  transform_iterator& operator++();
-  transform_iterator& operator--();
-private:
-  Iterator m_iterator; // exposition only
-  UnaryFunction m_f;   // exposition only
-};
-
-

If Reference is use_default then the reference member of -transform_iterator is -result_of<const UnaryFunction(iterator_traits<Iterator>::reference)>::type. -Otherwise, reference is Reference.

-

If Value is use_default then the value_type member is -remove_cv<remove_reference<reference> >::type. Otherwise, -value_type is Value.

-

If Iterator models Readable Lvalue Iterator and if Iterator -models Random Access Traversal Iterator, then iterator_category is -convertible to random_access_iterator_tag. Otherwise, if -Iterator models Bidirectional Traversal Iterator, then -iterator_category is convertible to -bidirectional_iterator_tag. Otherwise iterator_category is -convertible to forward_iterator_tag. If Iterator does not -model Readable Lvalue Iterator then iterator_category is -convertible to input_iterator_tag.

-
-
-

transform_iterator requirements

-

The type UnaryFunction must be Assignable, Copy Constructible, and -the expression f(*i) must be valid where f is a const object of -type UnaryFunction, i is an object of type Iterator, and -where the type of f(*i) must be -result_of<const UnaryFunction(iterator_traits<Iterator>::reference)>::type.

-

The argument Iterator shall model Readable Iterator.

-
-
-

transform_iterator models

-

The resulting transform_iterator models the most refined of the -following that is also modeled by Iterator.

-
-
    -
  • Writable Lvalue Iterator if transform_iterator::reference is a non-const reference.
  • -
  • Readable Lvalue Iterator if transform_iterator::reference is a const reference.
  • -
  • Readable Iterator otherwise.
  • -
-
-

The transform_iterator models the most refined standard traversal -concept that is modeled by the Iterator argument.

-

If transform_iterator is a model of Readable Lvalue Iterator then -it models the following original iterator concepts depending on what -the Iterator argument models.

- ---- - - - - - - - - - - - - - - - - - - - -
If Iterator modelsthen transform_iterator models
Single Pass IteratorInput Iterator
Forward Traversal IteratorForward Iterator
Bidirectional Traversal IteratorBidirectional Iterator
Random Access Traversal IteratorRandom Access Iterator
-

If transform_iterator models Writable Lvalue Iterator then it is a -mutable iterator (as defined in the old iterator requirements).

-

transform_iterator<F1, X, R1, V1> is interoperable with -transform_iterator<F2, Y, R2, V2> if and only if X is -interoperable with Y.

-
-
-

transform_iterator operations

-

In addition to the operations required by the concepts modeled by -transform_iterator, transform_iterator provides the following -operations.

-

transform_iterator();

- --- - - - -
Returns:An instance of transform_iterator with m_f -and m_iterator default constructed.
-

transform_iterator(Iterator const& x, UnaryFunction f);

- --- - - - -
Returns:An instance of transform_iterator with m_f -initialized to f and m_iterator initialized to x.
-
-template<class F2, class I2, class R2, class V2>
-transform_iterator(
-      transform_iterator<F2, I2, R2, V2> const& t
-    , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
-    , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
-);
-
- --- - - - - - -
Returns:An instance of transform_iterator with m_f -initialized to t.functor() and m_iterator initialized to -t.base().
Requires:OtherIterator is implicitly convertible to Iterator.
-

UnaryFunction functor() const;

- --- - - - -
Returns:m_f
-

Iterator const& base() const;

- --- - - - -
Returns:m_iterator
-

reference operator*() const;

- --- - - - -
Returns:m_f(*m_iterator)
-

transform_iterator& operator++();

- --- - - - - - -
Effects:++m_iterator
Returns:*this
-

transform_iterator& operator--();

- --- - - - - - -
Effects:--m_iterator
Returns:*this
- - - -
-template <class UnaryFunction, class Iterator>
-transform_iterator<UnaryFunction, Iterator>
-make_transform_iterator(Iterator it, UnaryFunction fun);
-
- --- - - - -
Returns:An instance of transform_iterator<UnaryFunction, Iterator> with m_f -initialized to f and m_iterator initialized to x.
-
-template <class UnaryFunction, class Iterator>
-transform_iterator<UnaryFunction, Iterator>
-make_transform_iterator(Iterator it);
-
- --- - - - -
Returns:An instance of transform_iterator<UnaryFunction, Iterator> with m_f -default constructed and m_iterator initialized to x.
- - - -
-
-

Example

-

This is a simple example of using the transform_iterators class to -generate iterators that multiply (or add to) the value returned by -dereferencing the iterator. It would be cooler to use lambda library -in this example.

-
-int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
-const int N = sizeof(x)/sizeof(int);
-
-typedef boost::binder1st< std::multiplies<int> > Function;
-typedef boost::transform_iterator<Function, int*> doubling_iterator;
-
-doubling_iterator i(x, boost::bind1st(std::multiplies<int>(), 2)),
-  i_end(x + N, boost::bind1st(std::multiplies<int>(), 2));
-
-std::cout << "multiplying the array by 2:" << std::endl;
-while (i != i_end)
-  std::cout << *i++ << " ";
-std::cout << std::endl;
-
-std::cout << "adding 4 to each element in the array:" << std::endl;
-std::copy(boost::make_transform_iterator(x, boost::bind1st(std::plus<int>(), 4)),
-          boost::make_transform_iterator(x + N, boost::bind1st(std::plus<int>(), 4)),
-          std::ostream_iterator<int>(std::cout, " "));
-std::cout << std::endl;
-
-

The output is:

-
-multiplying the array by 2:
-2 4 6 8 10 12 14 16
-adding 4 to each element in the array:
-5 6 7 8 9 10 11 12
-
-

The source code for this example can be found here.

-
-
- - - diff --git a/libs/iterator/doc/transform_iterator.pdf b/libs/iterator/doc/transform_iterator.pdf deleted file mode 100644 index 2af10ab194957cb7230202e014295c1ca9c20e0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67596 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 diff --git a/libs/iterator/doc/transform_iterator.rst b/libs/iterator/doc/transform_iterator.rst deleted file mode 100644 index 4f81cca98..000000000 --- a/libs/iterator/doc/transform_iterator.rst +++ /dev/null @@ -1,32 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -++++++++++++++++++++ - Transform Iterator -++++++++++++++++++++ - -:Author: David Abrahams, Jeremy Siek, Thomas Witt -:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de -:organization: `Boost Consulting`_, Indiana University `Open Systems - Lab`_, University of Hanover `Institute for Transport - Railway Operation and Construction`_ -:date: $Date$ -:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Open Systems Lab`: http://www.osl.iu.edu -.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de - -:abstract: - - .. include:: transform_iterator_abstract.rst - -.. contents:: Table of Contents - -``transform_iterator`` synopsis -............................... - -.. include:: transform_iterator_ref.rst -.. include:: make_transform_iterator.rst -.. include:: transform_iterator_eg.rst diff --git a/libs/iterator/doc/transform_iterator_abstract.rst b/libs/iterator/doc/transform_iterator_abstract.rst deleted file mode 100644 index 5fdcf5305..000000000 --- a/libs/iterator/doc/transform_iterator_abstract.rst +++ /dev/null @@ -1,7 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -The transform iterator adapts an iterator by modifying the -``operator*`` to apply a function object to the result of -dereferencing the iterator and returning the result. diff --git a/libs/iterator/doc/transform_iterator_eg.rst b/libs/iterator/doc/transform_iterator_eg.rst deleted file mode 100644 index 1406d2b52..000000000 --- a/libs/iterator/doc/transform_iterator_eg.rst +++ /dev/null @@ -1,46 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Example -....... - -This is a simple example of using the transform_iterators class to -generate iterators that multiply (or add to) the value returned by -dereferencing the iterator. It would be cooler to use lambda library -in this example. - -:: - - int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; - const int N = sizeof(x)/sizeof(int); - - typedef boost::binder1st< std::multiplies > Function; - typedef boost::transform_iterator doubling_iterator; - - doubling_iterator i(x, boost::bind1st(std::multiplies(), 2)), - i_end(x + N, boost::bind1st(std::multiplies(), 2)); - - std::cout << "multiplying the array by 2:" << std::endl; - while (i != i_end) - std::cout << *i++ << " "; - std::cout << std::endl; - - std::cout << "adding 4 to each element in the array:" << std::endl; - std::copy(boost::make_transform_iterator(x, boost::bind1st(std::plus(), 4)), - boost::make_transform_iterator(x + N, boost::bind1st(std::plus(), 4)), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - -The output is:: - - multiplying the array by 2: - 2 4 6 8 10 12 14 16 - adding 4 to each element in the array: - 5 6 7 8 9 10 11 12 - - -The source code for this example can be found `here`__. - -__ ../example/transform_iterator_example.cpp diff --git a/libs/iterator/doc/transform_iterator_ref.rst b/libs/iterator/doc/transform_iterator_ref.rst deleted file mode 100644 index 70becc5dc..000000000 --- a/libs/iterator/doc/transform_iterator_ref.rst +++ /dev/null @@ -1,175 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -.. Version 1.3 of this document was accepted for TR1 - -:: - - template - class transform_iterator - { - public: - typedef /* see below */ value_type; - typedef /* see below */ reference; - typedef /* see below */ pointer; - typedef iterator_traits::difference_type difference_type; - typedef /* see below */ iterator_category; - - transform_iterator(); - transform_iterator(Iterator const& x, UnaryFunction f); - - template - transform_iterator( - transform_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition only - , typename enable_if_convertible::type* = 0 // exposition only - ); - UnaryFunction functor() const; - Iterator const& base() const; - reference operator*() const; - transform_iterator& operator++(); - transform_iterator& operator--(); - private: - Iterator m_iterator; // exposition only - UnaryFunction m_f; // exposition only - }; - - -If ``Reference`` is ``use_default`` then the ``reference`` member of -``transform_iterator`` is -``result_of::reference)>::type``. -Otherwise, ``reference`` is ``Reference``. - -If ``Value`` is ``use_default`` then the ``value_type`` member is -``remove_cv >::type``. Otherwise, -``value_type`` is ``Value``. - - -If ``Iterator`` models Readable Lvalue Iterator and if ``Iterator`` -models Random Access Traversal Iterator, then ``iterator_category`` is -convertible to ``random_access_iterator_tag``. Otherwise, if -``Iterator`` models Bidirectional Traversal Iterator, then -``iterator_category`` is convertible to -``bidirectional_iterator_tag``. Otherwise ``iterator_category`` is -convertible to ``forward_iterator_tag``. If ``Iterator`` does not -model Readable Lvalue Iterator then ``iterator_category`` is -convertible to ``input_iterator_tag``. - - -``transform_iterator`` requirements -................................... - -The type ``UnaryFunction`` must be Assignable, Copy Constructible, and -the expression ``f(*i)`` must be valid where ``f`` is a const object of -type ``UnaryFunction``, ``i`` is an object of type ``Iterator``, and -where the type of ``f(*i)`` must be -``result_of::reference)>::type``. - -The argument ``Iterator`` shall model Readable Iterator. - - -``transform_iterator`` models -............................. - -The resulting ``transform_iterator`` models the most refined of the -following that is also modeled by ``Iterator``. - - * Writable Lvalue Iterator if ``transform_iterator::reference`` is a non-const reference. - - * Readable Lvalue Iterator if ``transform_iterator::reference`` is a const reference. - - * Readable Iterator otherwise. - -The ``transform_iterator`` models the most refined standard traversal -concept that is modeled by the ``Iterator`` argument. - -If ``transform_iterator`` is a model of Readable Lvalue Iterator then -it models the following original iterator concepts depending on what -the ``Iterator`` argument models. - -+-----------------------------------+---------------------------------------+ -| If ``Iterator`` models | then ``transform_iterator`` models | -+===================================+=======================================+ -| Single Pass Iterator | Input Iterator | -+-----------------------------------+---------------------------------------+ -| Forward Traversal Iterator | Forward Iterator | -+-----------------------------------+---------------------------------------+ -| Bidirectional Traversal Iterator | Bidirectional Iterator | -+-----------------------------------+---------------------------------------+ -| Random Access Traversal Iterator | Random Access Iterator | -+-----------------------------------+---------------------------------------+ - -If ``transform_iterator`` models Writable Lvalue Iterator then it is a -mutable iterator (as defined in the old iterator requirements). - -``transform_iterator`` is interoperable with -``transform_iterator`` if and only if ``X`` is -interoperable with ``Y``. - - - -``transform_iterator`` operations -................................. - -In addition to the operations required by the concepts modeled by -``transform_iterator``, ``transform_iterator`` provides the following -operations. - - -``transform_iterator();`` - -:Returns: An instance of ``transform_iterator`` with ``m_f`` - and ``m_iterator`` default constructed. - - -``transform_iterator(Iterator const& x, UnaryFunction f);`` - -:Returns: An instance of ``transform_iterator`` with ``m_f`` - initialized to ``f`` and ``m_iterator`` initialized to ``x``. - - -:: - - template - transform_iterator( - transform_iterator const& t - , typename enable_if_convertible::type* = 0 // exposition only - , typename enable_if_convertible::type* = 0 // exposition only - ); - -:Returns: An instance of ``transform_iterator`` with ``m_f`` - initialized to ``t.functor()`` and ``m_iterator`` initialized to - ``t.base()``. -:Requires: ``OtherIterator`` is implicitly convertible to ``Iterator``. - - -``UnaryFunction functor() const;`` - -:Returns: ``m_f`` - - -``Iterator const& base() const;`` - -:Returns: ``m_iterator`` - - -``reference operator*() const;`` - -:Returns: ``m_f(*m_iterator)`` - - -``transform_iterator& operator++();`` - -:Effects: ``++m_iterator`` -:Returns: ``*this`` - - -``transform_iterator& operator--();`` - -:Effects: ``--m_iterator`` -:Returns: ``*this`` - diff --git a/libs/iterator/doc/traversal.png b/libs/iterator/doc/traversal.png deleted file mode 100644 index a9bbe981a1c3b6492afdbb0786018aec326433c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9112 zcmZ{K2RxSV+xJC6D7TDk8QE0!mOCq(ls&R#%bpEnkF4yUB&jIbJ0W{h_MT-coBKWV z|2@z9e4h97-k<7@x?JaZUdQoW#~r4jrf`vfngBtNi+2=dwcz~~{I12vhCl03H_zU1 ztYuVX5aeU4@cHl+1i6abk(JT*N?*(HymeP+szn_?2qnbB@s#?Nip+)EI5>vxWLM}! zoEr%BOT(Y(m;T(bVHg$rX_L*1>cgiP|L4BU7cH{OA=vjX5PX&miNry(Fdozfrk8u~ zphm?=N7H&t_D)^bH;yZ&e7hxCgr{N=#CAU~CwCoN;4OAkXV5KXe#YKb6?_3c(*OA- zZfqysC0a#wbsbM~f0Bsiz~B9IEivWxBmHbIQ&Li5V>dnQe7xa*ReNqEwORZuoUONU zbQHRIb7gI9ZEq+|*y;P=;O`5pY;5IaWpyY0#?eohcH-I8Go}2+tU6zom6d({`ZXyj zDIp;tGLp#q+2P?~P*6~3r;1;{w}i2(s;ZovoQum%wBl9N>o;dF4|n&O-I0-zjEoGp zzp&$YtWxg1d-uY^!uHlD;@LiY_@JVs)ZWq2Slxc&;pW!V(n3tdhr@6!PSJ6qDls8} zB{`{aCX!xKjEn2n{??qkySqs1f~%yYBncXcO-oCA`SPtF$6G8)%5>?#$#36q5i@gh z*b1z;#ypooYL%yAC}`O=xf&!+P7iv{0DlX_zfjT?UZ zo72;#tns1`2idbVh9@W0nBrJfQ^{y)?M+Q@xc}5h)dg5uUPCIXs>H;^aB*>~ zs;W{`Qc6oo+}zzY*%Q{+9pe-QTxMlWOs4Yh=4s^*8k9Tc@62Npk)0hEB`qxxqMXco zk%%ZkDHqvnW6L_;Y$P@-@@fht+3!qBPVPw;B}JCq4$BE>bsi6ql9F2L$=X<7XN_;WbLWmoab@K}FyR$fS64$rL&OxG zBaM*#m$hUbgEGenv3r>+mL)@yX~ztPyuvqbpqy66%GH&X2^j}_d*Qg}W@mM|zkhnr zh(hn~?&jy`mzI`Z4zuV;;$gYWaqZf|Oyl#Le_#07a5B_UNhv9!fv0{nG&DiIjn9d5 zUcEx0Vc`PQUH$#8-RYua1lPE^i5Lg_`ebtY4q^2bhU;<63Me$Qd?Y(BZzjLBn!mrl zu`zu_Gbb;vhqLobVJCXDqOx+wmoHxi2NN1+rjNRXr~LQ>j`!svC>Vp3l$EW!Qgbs0 zI2CGjsN^{lsVOPv7ZxrAqX~kU$Oy1*aZ}vQAB4(=hZV3l;aRZ&4Msyvt)->)MlB

)uMijb**qppUA?DBG9c6Qhkub^OJgDHE` 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 diff --git a/libs/iterator/doc/zip_iterator.html b/libs/iterator/doc/zip_iterator.html deleted file mode 100644 index a85ba1313..000000000 --- a/libs/iterator/doc/zip_iterator.html +++ /dev/null @@ -1,367 +0,0 @@ - - - - - - -Zip Iterator - - - - - - - -

-

Zip Iterator

- --- - - - - - - - - - - - -
Author:David Abrahams, Thomas Becker
Contact:dave@boost-consulting.com, thomas@styleadvisor.com
Organization:Boost Consulting, Zephyr Associates, Inc.
Date:2006-09-11
Copyright:Copyright David Abrahams and Thomas Becker 2003.
- - - - --- - - - -
abstract: - - -The zip iterator provides the ability to parallel-iterate -over several controlled sequences simultaneously. A zip -iterator is constructed from a tuple of iterators. Moving -the zip iterator moves all the iterators in parallel. -Dereferencing the zip iterator returns a tuple that contains -the results of dereferencing the individual iterators.
- -
-

zip_iterator synopsis

- - - -
-template<typename IteratorTuple>
-class zip_iterator
-{
-
-public:
-  typedef /* see below */ reference;
-  typedef reference value_type;
-  typedef value_type* pointer;
-  typedef /* see below */ difference_type;
-  typedef /* see below */ iterator_category;
-
-  zip_iterator();
-  zip_iterator(IteratorTuple iterator_tuple);
-
-  template<typename OtherIteratorTuple>
-  zip_iterator(
-        const zip_iterator<OtherIteratorTuple>& other
-      , typename enable_if_convertible<
-              OtherIteratorTuple
-            , IteratorTuple>::type* = 0     // exposition only
-  );
-
-  const IteratorTuple& get_iterator_tuple() const;
-
-private:
-  IteratorTuple m_iterator_tuple;     // exposition only
-};
-
-template<typename IteratorTuple>
-zip_iterator<IteratorTuple>
-make_zip_iterator(IteratorTuple t);
-
-

The reference member of zip_iterator is the type of the tuple -made of the reference types of the iterator types in the IteratorTuple -argument.

-

The difference_type member of zip_iterator is the difference_type -of the first of the iterator types in the IteratorTuple argument.

-

The iterator_category member of zip_iterator is convertible to the -minimum of the traversal categories of the iterator types in the IteratorTuple -argument. For example, if the zip_iterator holds only vector -iterators, then iterator_category is convertible to -boost::random_access_traversal_tag. If you add a list iterator, then -iterator_category will be convertible to boost::bidirectional_traversal_tag, -but no longer to boost::random_access_traversal_tag.

-
-
-

zip_iterator requirements

-

All iterator types in the argument IteratorTuple shall model Readable Iterator.

-
-
-

zip_iterator models

-

The resulting zip_iterator models Readable Iterator.

-

The fact that the zip_iterator models only Readable Iterator does not -prevent you from modifying the values that the individual iterators point -to. The tuple returned by the zip_iterator's operator* is a tuple -constructed from the reference types of the individual iterators, not -their value types. For example, if zip_it is a zip_iterator whose -first member iterator is an std::vector<double>::iterator, then the -following line will modify the value which the first member iterator of -zip_it currently points to:

-
-zip_it->get<0>() = 42.0;
-
-

Consider the set of standard traversal concepts obtained by taking -the most refined standard traversal concept modeled by each individual -iterator type in the IteratorTuple argument.The zip_iterator -models the least refined standard traversal concept in this set.

-

zip_iterator<IteratorTuple1> is interoperable with -zip_iterator<IteratorTuple2> if and only if IteratorTuple1 -is interoperable with IteratorTuple2.

-
-
-

zip_iterator operations

-

In addition to the operations required by the concepts modeled by -zip_iterator, zip_iterator provides the following -operations.

-

zip_iterator();

- --- - - - -
Returns:An instance of zip_iterator with m_iterator_tuple -default constructed.
-

zip_iterator(IteratorTuple iterator_tuple);

- --- - - - -
Returns:An instance of zip_iterator with m_iterator_tuple -initialized to iterator_tuple.
-
-template<typename OtherIteratorTuple>
-zip_iterator(
-      const zip_iterator<OtherIteratorTuple>& other
-    , typename enable_if_convertible<
-            OtherIteratorTuple
-          , IteratorTuple>::type* = 0     // exposition only
-);
-
- --- - - - - - -
Returns:An instance of zip_iterator that is a copy of other.
Requires:OtherIteratorTuple is implicitly convertible to IteratorTuple.
-

const IteratorTuple& get_iterator_tuple() const;

- --- - - - -
Returns:m_iterator_tuple
-

reference operator*() const;

- --- - - - -
Returns:A tuple consisting of the results of dereferencing all iterators in -m_iterator_tuple.
-

zip_iterator& operator++();

- --- - - - - - -
Effects:Increments each iterator in m_iterator_tuple.
Returns:*this
-

zip_iterator& operator--();

- --- - - - - - -
Effects:Decrements each iterator in m_iterator_tuple.
Returns:*this
-
-template<typename IteratorTuple>
-zip_iterator<IteratorTuple>
-make_zip_iterator(IteratorTuple t);
-
- --- - - - -
Returns:An instance of zip_iterator<IteratorTuple> with m_iterator_tuple -initialized to t.
- - - -
-template<typename IteratorTuple>
-zip_iterator<IteratorTuple>
-make_zip_iterator(IteratorTuple t);
-
- --- - - - -
Returns:An instance of zip_iterator<IteratorTuple> with m_iterator_tuple -initialized to t.
- - - -
-
-

Examples

-

There are two main types of applications of the zip_iterator. The first -one concerns runtime efficiency: If one has several controlled sequences -of the same length that must be somehow processed, e.g., with the -for_each algorithm, then it is more efficient to perform just -one parallel-iteration rather than several individual iterations. For an -example, assume that vect_of_doubles and vect_of_ints -are two vectors of equal length containing doubles and ints, respectively, -and consider the following two iterations:

-
-std::vector<double>::const_iterator beg1 = vect_of_doubles.begin();
-std::vector<double>::const_iterator end1 = vect_of_doubles.end();
-std::vector<int>::const_iterator beg2 = vect_of_ints.begin();
-std::vector<int>::const_iterator end2 = vect_of_ints.end();
-
-std::for_each(beg1, end1, func_0());
-std::for_each(beg2, end2, func_1());
-
-

These two iterations can now be replaced with a single one as follows:

-
-std::for_each(
-  boost::make_zip_iterator(
-    boost::make_tuple(beg1, beg2)
-    ),
-  boost::make_zip_iterator(
-    boost::make_tuple(end1, end2)
-    ),
-  zip_func()
-  );
-
-

A non-generic implementation of zip_func could look as follows:

-
-struct zip_func :
-  public std::unary_function<const boost::tuple<const double&, const int&>&, void>
-{
-  void operator()(const boost::tuple<const double&, const int&>& t) const
-  {
-    m_f0(t.get<0>());
-    m_f1(t.get<1>());
-  }
-
-private:
-  func_0 m_f0;
-  func_1 m_f1;
-};
-
-

The second important application of the zip_iterator is as a building block -to make combining iterators. A combining iterator is an iterator -that parallel-iterates over several controlled sequences and, upon -dereferencing, returns the result of applying a functor to the values of the -sequences at the respective positions. This can now be achieved by using the -zip_iterator in conjunction with the transform_iterator.

-

Suppose, for example, that you have two vectors of doubles, say -vect_1 and vect_2, and you need to expose to a client -a controlled sequence containing the products of the elements of -vect_1 and vect_2. Rather than placing these products -in a third vector, you can use a combining iterator that calculates the -products on the fly. Let us assume that tuple_multiplies is a -functor that works like std::multiplies, except that it takes -its two arguments packaged in a tuple. Then the two iterators -it_begin and it_end defined below delimit a controlled -sequence containing the products of the elements of vect_1 and -vect_2:

-
-typedef boost::tuple<
-  std::vector<double>::const_iterator,
-  std::vector<double>::const_iterator
-  > the_iterator_tuple;
-
-typedef boost::zip_iterator<
-  the_iterator_tuple
-  > the_zip_iterator;
-
-typedef boost::transform_iterator<
-  tuple_multiplies<double>,
-  the_zip_iterator
-  > the_transform_iterator;
-
-the_transform_iterator it_begin(
-  the_zip_iterator(
-    the_iterator_tuple(
-      vect_1.begin(),
-      vect_2.begin()
-      )
-    ),
-  tuple_multiplies<double>()
-  );
-
-the_transform_iterator it_end(
-  the_zip_iterator(
-    the_iterator_tuple(
-      vect_1.end(),
-      vect_2.end()
-      )
-    ),
-  tuple_multiplies<double>()
-  );
-
-
-
- - - diff --git a/libs/iterator/doc/zip_iterator.pdf b/libs/iterator/doc/zip_iterator.pdf deleted file mode 100644 index c5a6f21cfe23aeb2ce534098232cdeaa2a6a2561..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62372 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 AYybcN diff --git a/libs/iterator/doc/zip_iterator.rst b/libs/iterator/doc/zip_iterator.rst deleted file mode 100644 index 4e360c34c..000000000 --- a/libs/iterator/doc/zip_iterator.rst +++ /dev/null @@ -1,29 +0,0 @@ -.. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -+++++++++++++ - Zip Iterator -+++++++++++++ - -:Author: David Abrahams, Thomas Becker -:Contact: dave@boost-consulting.com, thomas@styleadvisor.com -:organization: `Boost Consulting`_, `Zephyr Associates, Inc.`_ -:date: $Date$ -:copyright: Copyright David Abrahams and Thomas Becker 2003. - -.. _`Boost Consulting`: http://www.boost-consulting.com -.. _`Zephyr Associates, Inc.`: http://www.styleadvisor.com - -:abstract: - - .. include:: zip_iterator_abstract.rst - -.. contents:: Table of Contents - -``zip_iterator`` synopsis -............................... - -.. include:: zip_iterator_ref.rst -.. include:: make_zip_iterator.rst -.. include:: zip_iterator_eg.rst diff --git a/libs/iterator/doc/zip_iterator_abstract.rst b/libs/iterator/doc/zip_iterator_abstract.rst deleted file mode 100644 index 524c2b1a7..000000000 --- a/libs/iterator/doc/zip_iterator_abstract.rst +++ /dev/null @@ -1,20 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -The zip iterator provides the ability to parallel-iterate -over several controlled sequences simultaneously. A zip -iterator is constructed from a tuple of iterators. Moving -the zip iterator moves all the iterators in parallel. -Dereferencing the zip iterator returns a tuple that contains -the results of dereferencing the individual iterators. - -The tuple of iterators is now implemented in terms of a Boost fusion sequence. -Because of this the 'tuple' may be any Boost fusion sequence and, for backwards -compatibility through a Boost fusion sequence adapter, a Boost tuple. Because the -'tuple' may be any boost::fusion sequence the 'tuple' may also be any type for which a -Boost fusion adapter exists. This includes, among others, a std::tuple and a std::pair. -Just remember to include the appropriate Boost fusion adapter header files for these -other Boost fusion adapters. The zip_iterator header file already includes the -Boost fusion adapter header file for Boost tuple, so you need not include it yourself -to use a Boost tuple as your 'tuple'. diff --git a/libs/iterator/doc/zip_iterator_eg.rst b/libs/iterator/doc/zip_iterator_eg.rst deleted file mode 100644 index e999f15ec..000000000 --- a/libs/iterator/doc/zip_iterator_eg.rst +++ /dev/null @@ -1,116 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Examples -........ - -There are two main types of applications of the ``zip_iterator``. The first -one concerns runtime efficiency: If one has several controlled sequences -of the same length that must be somehow processed, e.g., with the -``for_each`` algorithm, then it is more efficient to perform just -one parallel-iteration rather than several individual iterations. For an -example, assume that ``vect_of_doubles`` and ``vect_of_ints`` -are two vectors of equal length containing doubles and ints, respectively, -and consider the following two iterations: - -:: - - - std::vector::const_iterator beg1 = vect_of_doubles.begin(); - std::vector::const_iterator end1 = vect_of_doubles.end(); - std::vector::const_iterator beg2 = vect_of_ints.begin(); - std::vector::const_iterator end2 = vect_of_ints.end(); - - std::for_each(beg1, end1, func_0()); - std::for_each(beg2, end2, func_1()); - -These two iterations can now be replaced with a single one as follows: - -:: - - - std::for_each( - boost::make_zip_iterator( - boost::make_tuple(beg1, beg2) - ), - boost::make_zip_iterator( - boost::make_tuple(end1, end2) - ), - zip_func() - ); - -A non-generic implementation of ``zip_func`` could look as follows: - -:: - - - struct zip_func : - public std::unary_function&, void> - { - void operator()(const boost::tuple& t) const - { - m_f0(t.get<0>()); - m_f1(t.get<1>()); - } - - private: - func_0 m_f0; - func_1 m_f1; - }; - -The second important application of the ``zip_iterator`` is as a building block -to make combining iterators. A combining iterator is an iterator -that parallel-iterates over several controlled sequences and, upon -dereferencing, returns the result of applying a functor to the values of the -sequences at the respective positions. This can now be achieved by using the -``zip_iterator`` in conjunction with the ``transform_iterator``. - -Suppose, for example, that you have two vectors of doubles, say -``vect_1`` and ``vect_2``, and you need to expose to a client -a controlled sequence containing the products of the elements of -``vect_1`` and ``vect_2``. Rather than placing these products -in a third vector, you can use a combining iterator that calculates the -products on the fly. Let us assume that ``tuple_multiplies`` is a -functor that works like ``std::multiplies``, except that it takes -its two arguments packaged in a tuple. Then the two iterators -``it_begin`` and ``it_end`` defined below delimit a controlled -sequence containing the products of the elements of ``vect_1`` and -``vect_2``: - -:: - - - typedef boost::tuple< - std::vector::const_iterator, - std::vector::const_iterator - > the_iterator_tuple; - - typedef boost::zip_iterator< - the_iterator_tuple - > the_zip_iterator; - - typedef boost::transform_iterator< - tuple_multiplies, - the_zip_iterator - > the_transform_iterator; - - the_transform_iterator it_begin( - the_zip_iterator( - the_iterator_tuple( - vect_1.begin(), - vect_2.begin() - ) - ), - tuple_multiplies() - ); - - the_transform_iterator it_end( - the_zip_iterator( - the_iterator_tuple( - vect_1.end(), - vect_2.end() - ) - ), - tuple_multiplies() - ); diff --git a/libs/iterator/doc/zip_iterator_ref.rst b/libs/iterator/doc/zip_iterator_ref.rst deleted file mode 100644 index f81ccd21a..000000000 --- a/libs/iterator/doc/zip_iterator_ref.rst +++ /dev/null @@ -1,155 +0,0 @@ -.. Copyright David Abrahams 2006. Distributed under the Boost -.. Software License, Version 1.0. (See accompanying -.. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -:: - - template - class zip_iterator - { - - public: - typedef /* see below */ reference; - typedef reference value_type; - typedef value_type* pointer; - typedef /* see below */ difference_type; - typedef /* see below */ iterator_category; - - zip_iterator(); - zip_iterator(IteratorTuple iterator_tuple); - - template - zip_iterator( - const zip_iterator& other - , typename enable_if_convertible< - OtherIteratorTuple - , IteratorTuple>::type* = 0 // exposition only - ); - - const IteratorTuple& get_iterator_tuple() const; - - private: - IteratorTuple m_iterator_tuple; // exposition only - }; - - template - zip_iterator - make_zip_iterator(IteratorTuple t); - - -The ``reference`` member of ``zip_iterator`` is the type of the tuple -made of the reference types of the iterator types in the ``IteratorTuple`` -argument. - -The ``difference_type`` member of ``zip_iterator`` is the ``difference_type`` -of the first of the iterator types in the ``IteratorTuple`` argument. - -The ``iterator_category`` member of ``zip_iterator`` is convertible to the -minimum of the traversal categories of the iterator types in the ``IteratorTuple`` -argument. For example, if the ``zip_iterator`` holds only vector -iterators, then ``iterator_category`` is convertible to -``boost::random_access_traversal_tag``. If you add a list iterator, then -``iterator_category`` will be convertible to ``boost::bidirectional_traversal_tag``, -but no longer to ``boost::random_access_traversal_tag``. - - -``zip_iterator`` requirements -................................... - -All iterator types in the argument ``IteratorTuple`` shall model Readable Iterator. - - -``zip_iterator`` models -............................. - -The resulting ``zip_iterator`` models Readable Iterator. - -The fact that the ``zip_iterator`` models only Readable Iterator does not -prevent you from modifying the values that the individual iterators point -to. The tuple returned by the ``zip_iterator``'s ``operator*`` is a tuple -constructed from the reference types of the individual iterators, not -their value types. For example, if ``zip_it`` is a ``zip_iterator`` whose -first member iterator is an ``std::vector::iterator``, then the -following line will modify the value which the first member iterator of -``zip_it`` currently points to: - -:: - - zip_it->get<0>() = 42.0; - - -Consider the set of standard traversal concepts obtained by taking -the most refined standard traversal concept modeled by each individual -iterator type in the ``IteratorTuple`` argument.The ``zip_iterator`` -models the least refined standard traversal concept in this set. - -``zip_iterator`` is interoperable with -``zip_iterator`` if and only if ``IteratorTuple1`` -is interoperable with ``IteratorTuple2``. - - - -``zip_iterator`` operations -................................. - -In addition to the operations required by the concepts modeled by -``zip_iterator``, ``zip_iterator`` provides the following -operations. - - -``zip_iterator();`` - -:Returns: An instance of ``zip_iterator`` with ``m_iterator_tuple`` - default constructed. - - -``zip_iterator(IteratorTuple iterator_tuple);`` - -:Returns: An instance of ``zip_iterator`` with ``m_iterator_tuple`` - initialized to ``iterator_tuple``. - - -:: - - template - zip_iterator( - const zip_iterator& other - , typename enable_if_convertible< - OtherIteratorTuple - , IteratorTuple>::type* = 0 // exposition only - ); - -:Returns: An instance of ``zip_iterator`` that is a copy of ``other``. -:Requires: ``OtherIteratorTuple`` is implicitly convertible to ``IteratorTuple``. - - -``const IteratorTuple& get_iterator_tuple() const;`` - -:Returns: ``m_iterator_tuple`` - - -``reference operator*() const;`` - -:Returns: A tuple consisting of the results of dereferencing all iterators in - ``m_iterator_tuple``. - - -``zip_iterator& operator++();`` - -:Effects: Increments each iterator in ``m_iterator_tuple``. -:Returns: ``*this`` - - -``zip_iterator& operator--();`` - -:Effects: Decrements each iterator in ``m_iterator_tuple``. -:Returns: ``*this`` - -:: - - template - zip_iterator - make_zip_iterator(IteratorTuple t); - -:Returns: An instance of ``zip_iterator`` with ``m_iterator_tuple`` - initialized to ``t``. diff --git a/libs/iterator/example/counting_iterator_example.cpp b/libs/iterator/example/counting_iterator_example.cpp deleted file mode 100644 index c7d8add91..000000000 --- a/libs/iterator/example/counting_iterator_example.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// (C) Copyright Jeremy Siek 2000-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) - - -#include -#include -#include -#include -#include -#include -#include -#include - -int main(int, char*[]) -{ - // Example of using counting_iterator - std::cout << "counting from 0 to 4:" << std::endl; - boost::counting_iterator first(0), last(4); - std::copy(first, last, std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - // Example of using counting iterator to create an array of pointers. - int N = 7; - std::vector numbers; - typedef std::vector::iterator n_iter; - // Fill "numbers" array with [0,N) - std::copy( - boost::counting_iterator(0) - , boost::counting_iterator(N) - , std::back_inserter(numbers)); - - std::vector::iterator> pointers; - - // Use counting iterator to fill in the array of pointers. - // causes an ICE with MSVC6 - std::copy(boost::make_counting_iterator(numbers.begin()), - boost::make_counting_iterator(numbers.end()), - std::back_inserter(pointers)); - - // Use indirect iterator to print out numbers by accessing - // them through the array of pointers. - std::cout << "indirectly printing out the numbers from 0 to " - << N << std::endl; - std::copy(boost::make_indirect_iterator(pointers.begin()), - boost::make_indirect_iterator(pointers.end()), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - return boost::exit_success; -} diff --git a/libs/iterator/example/filter_iterator_example.cpp b/libs/iterator/example/filter_iterator_example.cpp deleted file mode 100644 index 8880c8d52..000000000 --- a/libs/iterator/example/filter_iterator_example.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// (C) Copyright Jeremy Siek 1999-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) - -#include -#include -#include -#include -#include -#include // for exit_success - -struct is_positive_number { - bool operator()(int x) { return 0 < x; } -}; - -int main() -{ - int numbers_[] = { 0, -1, 4, -3, 5, 8, -2 }; - const int N = sizeof(numbers_)/sizeof(int); - - typedef int* base_iterator; - base_iterator numbers(numbers_); - - // Example using make_filter_iterator() - std::copy(boost::make_filter_iterator(numbers, numbers + N), - boost::make_filter_iterator(numbers + N, numbers + N), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - // Example using filter_iterator - typedef boost::filter_iterator - FilterIter; - - is_positive_number predicate; - FilterIter filter_iter_first(predicate, numbers, numbers + N); - FilterIter filter_iter_last(predicate, numbers + N, numbers + N); - - std::copy(filter_iter_first, filter_iter_last, std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - // Another example using make_filter_iterator() - std::copy( - boost::make_filter_iterator( - std::bind2nd(std::greater(), -2) - , numbers, numbers + N) - - , boost::make_filter_iterator( - std::bind2nd(std::greater(), -2) - , numbers + N, numbers + N) - - , std::ostream_iterator(std::cout, " ") - ); - - std::cout << std::endl; - - return boost::exit_success; -} diff --git a/libs/iterator/example/func_output_iter_example.cpp b/libs/iterator/example/func_output_iter_example.cpp deleted file mode 100644 index 9c0631988..000000000 --- a/libs/iterator/example/func_output_iter_example.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// (C) Copyright Jeremy Siek 2001-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) - -// Revision History: - -// 27 Feb 2001 Jeremy Siek -// Initial checkin. - -#include -#include -#include - -#include - -struct string_appender -{ - string_appender(std::string& s) - : m_str(&s) - {} - - void operator()(const std::string& x) const - { - *m_str += x; - } - - std::string* m_str; -}; - -int main(int, char*[]) -{ - std::vector x; - x.push_back("hello"); - x.push_back(" "); - x.push_back("world"); - x.push_back("!"); - - std::string s = ""; - std::copy(x.begin(), x.end(), - boost::make_function_output_iterator(string_appender(s))); - - std::cout << s << std::endl; - - return 0; -} diff --git a/libs/iterator/example/indirect_iterator_example.cpp b/libs/iterator/example/indirect_iterator_example.cpp deleted file mode 100644 index abbf46c3a..000000000 --- a/libs/iterator/example/indirect_iterator_example.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// (C) Copyright Jeremy Siek 2000-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) - -#include -#include -#include -#include -#include -#include -#include - -int main(int, char*[]) -{ - char characters[] = "abcdefg"; - const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char - char* pointers_to_chars[N]; // at the end. - for (int i = 0; i < N; ++i) - pointers_to_chars[i] = &characters[i]; - - // Example of using indirect_iterator - - boost::indirect_iterator - indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N); - - std::copy(indirect_first, indirect_last, std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - - // Example of making mutable and constant indirect iterators - - char mutable_characters[N]; - char* pointers_to_mutable_chars[N]; - for (int j = 0; j < N; ++j) - pointers_to_mutable_chars[j] = &mutable_characters[j]; - - boost::indirect_iterator mutable_indirect_first(pointers_to_mutable_chars), - mutable_indirect_last(pointers_to_mutable_chars + N); - boost::indirect_iterator const_indirect_first(pointers_to_chars), - const_indirect_last(pointers_to_chars + N); - - std::transform(const_indirect_first, const_indirect_last, - mutable_indirect_first, std::bind1st(std::plus(), 1)); - - std::copy(mutable_indirect_first, mutable_indirect_last, - std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - - // Example of using make_indirect_iterator() - - std::copy(boost::make_indirect_iterator(pointers_to_chars), - boost::make_indirect_iterator(pointers_to_chars + N), - std::ostream_iterator(std::cout, ",")); - std::cout << std::endl; - - return 0; -} diff --git a/libs/iterator/example/node.hpp b/libs/iterator/example/node.hpp deleted file mode 100644 index c3ed3152e..000000000 --- a/libs/iterator/example/node.hpp +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright David Abrahams 2004. 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 NODE_DWA2004110_HPP -# define NODE_DWA2004110_HPP - -# include - -// Polymorphic list node base class - -struct node_base -{ - node_base() : m_next(0) {} - - virtual ~node_base() - { - delete m_next; - } - - node_base* next() const - { - return m_next; - } - - virtual void print(std::ostream& s) const = 0; - virtual void double_me() = 0; - - void append(node_base* p) - { - if (m_next) - m_next->append(p); - else - m_next = p; - } - - private: - node_base* m_next; -}; - -inline std::ostream& operator<<(std::ostream& s, node_base const& n) -{ - n.print(s); - return s; -} - -template -struct node : node_base -{ - node(T x) - : m_value(x) - {} - - void print(std::ostream& s) const { s << this->m_value; } - void double_me() { m_value += m_value; } - - private: - T m_value; -}; - -#endif // NODE_DWA2004110_HPP diff --git a/libs/iterator/example/node_iterator1.cpp b/libs/iterator/example/node_iterator1.cpp deleted file mode 100644 index 6411b039b..000000000 --- a/libs/iterator/example/node_iterator1.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright David Abrahams 2004. 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) - -#include "node_iterator1.hpp" -#include -#include -#include -#include -#include - -int main() -{ - std::auto_ptr > nodes(new node(42)); - nodes->append(new node(" is greater than ")); - nodes->append(new node(13)); - - std::copy( - node_iterator(nodes.get()), node_iterator() - , std::ostream_iterator(std::cout, " ") - ); - std::cout << std::endl; - - std::for_each( - node_iterator(nodes.get()), node_iterator() - , std::mem_fun_ref(&node_base::double_me) - ); - - std::copy( - node_iterator(nodes.get()), node_iterator() - , std::ostream_iterator(std::cout, "/") - ); - std::cout << std::endl; -} diff --git a/libs/iterator/example/node_iterator1.hpp b/libs/iterator/example/node_iterator1.hpp deleted file mode 100644 index 5e068b4b8..000000000 --- a/libs/iterator/example/node_iterator1.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright David Abrahams 2004. 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 NODE_ITERATOR1_DWA2004110_HPP -# define NODE_ITERATOR1_DWA2004110_HPP - -# include "node.hpp" -# include - -class node_iterator - : public boost::iterator_facade< - node_iterator - , node_base - , boost::forward_traversal_tag - > -{ - public: - node_iterator() - : m_node(0) - {} - - explicit node_iterator(node_base* p) - : m_node(p) - {} - - private: - friend class boost::iterator_core_access; - - void increment() - { m_node = m_node->next(); } - - bool equal(node_iterator const& other) const - { return this->m_node == other.m_node; } - - node_base& dereference() const - { return *m_node; } - - node_base* m_node; -}; - - -#endif // NODE_ITERATOR1_DWA2004110_HPP diff --git a/libs/iterator/example/node_iterator2.cpp b/libs/iterator/example/node_iterator2.cpp deleted file mode 100644 index 62211b212..000000000 --- a/libs/iterator/example/node_iterator2.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright David Abrahams 2004. 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) - -#include "node_iterator2.hpp" -#include -#include -#include -#include -#include -#include - -int main() -{ - std::auto_ptr > nodes(new node(42)); - nodes->append(new node(" is greater than ")); - nodes->append(new node(13)); - - // Check interoperability - assert(node_iterator(nodes.get()) == node_const_iterator(nodes.get())); - assert(node_const_iterator(nodes.get()) == node_iterator(nodes.get())); - - assert(node_iterator(nodes.get()) != node_const_iterator()); - assert(node_const_iterator(nodes.get()) != node_iterator()); - - std::copy( - node_iterator(nodes.get()), node_iterator() - , std::ostream_iterator(std::cout, " ") - ); - std::cout << std::endl; - - std::for_each( - node_iterator(nodes.get()), node_iterator() - , boost::mem_fn(&node_base::double_me) - ); - - std::copy( - node_const_iterator(nodes.get()), node_const_iterator() - , std::ostream_iterator(std::cout, "/") - ); - std::cout << std::endl; - return 0; -} diff --git a/libs/iterator/example/node_iterator2.hpp b/libs/iterator/example/node_iterator2.hpp deleted file mode 100644 index 6aa0a4cd9..000000000 --- a/libs/iterator/example/node_iterator2.hpp +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright David Abrahams 2004. 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 NODE_ITERATOR2_DWA2004110_HPP -# define NODE_ITERATOR2_DWA2004110_HPP - -# include "node.hpp" -# include - -# ifndef BOOST_NO_SFINAE -# include -# include -# endif - -template -class node_iter - : public boost::iterator_facade< - node_iter - , Value - , boost::forward_traversal_tag - > -{ - private: - struct enabler {}; // a private type avoids misuse - - public: - node_iter() - : m_node(0) {} - - explicit node_iter(Value* p) - : m_node(p) {} - - template - node_iter( - node_iter const& other -# ifndef BOOST_NO_SFINAE - , typename boost::enable_if< - boost::is_convertible - , enabler - >::type = enabler() -# endif - ) - : m_node(other.m_node) {} - - -# if !BOOST_WORKAROUND(__GNUC__, == 2) - private: // GCC2 can't grant friendship to template member functions - friend class boost::iterator_core_access; -# endif - - template - bool equal(node_iter const& other) const - { - return this->m_node == other.m_node; - } - - void increment() { m_node = m_node->next(); } - - Value& dereference() const { return *m_node; } - -# ifdef BOOST_NO_MEMBER_TEMPLATE_FRIENDS - public: -# else - private: - template friend class node_iter; -# endif - Value* m_node; -}; - -typedef node_iter node_iterator; -typedef node_iter node_const_iterator; - -#endif // NODE_ITERATOR2_DWA2004110_HPP diff --git a/libs/iterator/example/node_iterator3.cpp b/libs/iterator/example/node_iterator3.cpp deleted file mode 100644 index 331cc93a5..000000000 --- a/libs/iterator/example/node_iterator3.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright David Abrahams 2004. 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) - -#include "node_iterator3.hpp" -#include -#include -#include -#include -#include -#include - -int main() -{ - std::auto_ptr > nodes(new node(42)); - nodes->append(new node(" is greater than ")); - nodes->append(new node(13)); - - // Check interoperability - assert(node_iterator(nodes.get()) == node_const_iterator(nodes.get())); - assert(node_const_iterator(nodes.get()) == node_iterator(nodes.get())); - - assert(node_iterator(nodes.get()) != node_const_iterator()); - assert(node_const_iterator(nodes.get()) != node_iterator()); - - std::copy( - node_iterator(nodes.get()), node_iterator() - , std::ostream_iterator(std::cout, " ") - ); - std::cout << std::endl; - - std::for_each( - node_iterator(nodes.get()), node_iterator() - , boost::mem_fn(&node_base::double_me) - ); - - std::copy( - node_const_iterator(nodes.get()), node_const_iterator() - , std::ostream_iterator(std::cout, "/") - ); - std::cout << std::endl; - return 0; -} diff --git a/libs/iterator/example/node_iterator3.hpp b/libs/iterator/example/node_iterator3.hpp deleted file mode 100644 index 85127e1c1..000000000 --- a/libs/iterator/example/node_iterator3.hpp +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright David Abrahams 2004. 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 NODE_ITERATOR3_DWA2004110_HPP -# define NODE_ITERATOR3_DWA2004110_HPP - -# include "node.hpp" -# include - -# ifndef BOOST_NO_SFINAE -# include -# include -# endif - -template -class node_iter - : public boost::iterator_adaptor< - node_iter // Derived - , Value* // Base - , boost::use_default // Value - , boost::forward_traversal_tag // CategoryOrTraversal - > -{ - private: - struct enabler {}; // a private type avoids misuse - - typedef boost::iterator_adaptor< - node_iter, Value*, boost::use_default, boost::forward_traversal_tag - > super_t; - - public: - node_iter() - : super_t(0) {} - - explicit node_iter(Value* p) - : super_t(p) {} - - template - node_iter( - node_iter const& other -# ifndef BOOST_NO_SFINAE - , typename boost::enable_if< - boost::is_convertible - , enabler - >::type = enabler() -# endif - ) - : super_t(other.base()) {} - -# if !BOOST_WORKAROUND(__GNUC__, == 2) - private: // GCC2 can't grant friendship to template member functions - friend class boost::iterator_core_access; -# endif - void increment() { this->base_reference() = this->base()->next(); } -}; - -typedef node_iter node_iterator; -typedef node_iter node_const_iterator; - -#endif // NODE_ITERATOR3_DWA2004110_HPP diff --git a/libs/iterator/example/permutation_iter_example.cpp b/libs/iterator/example/permutation_iter_example.cpp deleted file mode 100644 index aad6125de..000000000 --- a/libs/iterator/example/permutation_iter_example.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright (C) 2004 Jeremy Siek -// Distributed under the 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 -#include -#include -#include -#include -#include -#include - - -int main() { - using namespace boost; - int i = 0; - - typedef std::vector< int > element_range_type; - typedef std::deque< int > index_type; - - static const int element_range_size = 10; - static const int index_size = 4; - - element_range_type elements( element_range_size ); - for(element_range_type::iterator el_it = elements.begin() ; el_it != elements.end() ; ++el_it) - *el_it = std::distance(elements.begin(), el_it); - - index_type indices( index_size ); - for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it ) - *i_it = element_range_size - index_size + std::distance(indices.begin(), i_it); - std::reverse( indices.begin(), indices.end() ); - - typedef permutation_iterator< element_range_type::iterator, index_type::iterator > permutation_type; - permutation_type begin = make_permutation_iterator( elements.begin(), indices.begin() ); - permutation_type it = begin; - permutation_type end = make_permutation_iterator( elements.begin(), indices.end() ); - - std::cout << "The original range is : "; - std::copy( elements.begin(), elements.end(), std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "The reindexing scheme is : "; - std::copy( indices.begin(), indices.end(), std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "The permutated range is : "; - std::copy( begin, end, std::ostream_iterator< int >( std::cout, " " ) ); - std::cout << "\n"; - - std::cout << "Elements at even indices in the permutation : "; - it = begin; - for(i = 0; i < index_size / 2 ; ++i, it+=2 ) std::cout << *it << " "; - std::cout << "\n"; - - std::cout << "Permutation backwards : "; - it = begin + (index_size); - assert( it != begin ); - for( ; it-- != begin ; ) std::cout << *it << " "; - std::cout << "\n"; - - std::cout << "Iterate backward with stride 2 : "; - it = begin + (index_size - 1); - for(i = 0 ; i < index_size / 2 ; ++i, it-=2 ) std::cout << *it << " "; - std::cout << "\n"; - - return boost::exit_success; -} diff --git a/libs/iterator/example/reverse_iterator.cpp b/libs/iterator/example/reverse_iterator.cpp deleted file mode 100644 index b5f10f76b..000000000 --- a/libs/iterator/example/reverse_iterator.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (C) 2004 Jeremy Siek -// Distributed under the 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 -#include -#include -#include -#include - -int main() -{ - int x[] = { 1, 2, 3, 4 }; - boost::reverse_iterator first(x + 4), last(x); - std::copy(first, last, std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - return 0; -} diff --git a/libs/iterator/example/reverse_iterator_example.cpp b/libs/iterator/example/reverse_iterator_example.cpp deleted file mode 100644 index 61b8c4fd0..000000000 --- a/libs/iterator/example/reverse_iterator_example.cpp +++ /dev/null @@ -1,41 +0,0 @@ -// (C) Copyright Jeremy Siek 2000-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) - -#include -#include -#include -#include -#include - -int main(int, char*[]) -{ - char letters_[] = "hello world!"; - const int N = sizeof(letters_)/sizeof(char) - 1; - typedef char* base_iterator; - base_iterator letters(letters_); - - std::cout << "original sequence of letters:\t\t\t" - << letters_ << std::endl; - - // Use reverse_iterator to print a sequence of letters in reverse - // order. - - boost::reverse_iterator - reverse_letters_first(letters + N), - reverse_letters_last(letters); - - std::cout << "sequence in reverse order:\t\t\t"; - std::copy(reverse_letters_first, reverse_letters_last, - std::ostream_iterator(std::cout)); - std::cout << std::endl; - - std::cout << "sequence in double-reversed (normal) order:\t"; - std::copy(boost::make_reverse_iterator(reverse_letters_last), - boost::make_reverse_iterator(reverse_letters_first), - std::ostream_iterator(std::cout)); - std::cout << std::endl; - - return boost::exit_success; -} diff --git a/libs/iterator/example/transform_iterator_example.cpp b/libs/iterator/example/transform_iterator_example.cpp deleted file mode 100644 index 6f51f0144..000000000 --- a/libs/iterator/example/transform_iterator_example.cpp +++ /dev/null @@ -1,76 +0,0 @@ -// (C) Copyright Jeremy Siek 2000-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) - - -#include -#include -#include -#include - -// What a bummer. We can't use std::binder1st with transform iterator -// because it does not have a default constructor. Here's a version -// that does. - -namespace boost { - - template - class binder1st - : public std::unary_function { - protected: - Operation op; - typename Operation::first_argument_type value; - public: - binder1st() { } // this had to be added! - binder1st(const Operation& x, - const typename Operation::first_argument_type& y) - : op(x), value(y) {} - typename Operation::result_type - operator()(const typename Operation::second_argument_type& x) const { - return op(value, x); - } - }; - - template - inline binder1st bind1st(const Operation& op, const T& x) { - typedef typename Operation::first_argument_type arg1_type; - return binder1st(op, arg1_type(x)); - } - -} // namespace boost - -int -main(int, char*[]) -{ - // This is a simple example of using the transform_iterators class to - // generate iterators that multiply the value returned by dereferencing - // the iterator. In this case we are multiplying by 2. - // Would be cooler to use lambda library in this example. - - int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; - const int N = sizeof(x)/sizeof(int); - - typedef boost::binder1st< std::multiplies > Function; - typedef boost::transform_iterator doubling_iterator; - - doubling_iterator i(x, boost::bind1st(std::multiplies(), 2)), - i_end(x + N, boost::bind1st(std::multiplies(), 2)); - - std::cout << "multiplying the array by 2:" << std::endl; - while (i != i_end) - std::cout << *i++ << " "; - std::cout << std::endl; - - std::cout << "adding 4 to each element in the array:" << std::endl; - - std::copy(boost::make_transform_iterator(x, boost::bind1st(std::plus(), 4)), - boost::make_transform_iterator(x + N, boost::bind1st(std::plus(), 4)), - std::ostream_iterator(std::cout, " ")); - std::cout << std::endl; - - return 0; -} - - diff --git a/libs/iterator/index.html b/libs/iterator/index.html deleted file mode 100644 index 71517c407..000000000 --- a/libs/iterator/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - -Automatically loading index page... if nothing happens, please go to -doc/index.html. - - - - - diff --git a/libs/iterator/meta/libraries.json b/libs/iterator/meta/libraries.json deleted file mode 100644 index 537d803fb..000000000 --- a/libs/iterator/meta/libraries.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "key": "iterator", - "name": "Iterator", - "authors": [ - "Dave Abrahams", - "Jeremy Siek", - "Thomas Witt" - ], - "description": "The Boost Iterator Library contains two parts. The first is a system of concepts which extend the C++ standard iterator requirements. The second is a framework of components for building iterators based on these extended concepts and includes several useful iterator adaptors.", - "category": [ - "Iterators" - ], - "maintainers": [ - "David Abrahams ", - "Thomas Witt ", - "Jeffrey Lee Hellrung Jr. " - ] -} diff --git a/libs/iterator/test/Jamfile.v2 b/libs/iterator/test/Jamfile.v2 deleted file mode 100644 index 81547dc1e..000000000 --- a/libs/iterator/test/Jamfile.v2 +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright David Abrahams 2003. Distributed under the Boost -# Software License, Version 1.0. (See accompanying -# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -test-suite iterator - : - # These first two tests will run last, and are expected to fail - # for many less-capable compilers. - - [ compile-fail interoperable_fail.cpp ] - # test uses expected success, so that we catch unrelated - # compilation problems. - [ run is_convertible_fail.cpp ] - - [ run zip_iterator_test.cpp - : : : - # stlport's debug mode generates long symbols which overwhelm - # vc6 - #<*>release - ] - [ run zip_iterator_test2_std_tuple.cpp ] - [ run zip_iterator_test2_fusion_vector.cpp ] - [ run zip_iterator_test2_fusion_list.cpp ] -# [ run zip_iterator_test2_fusion_deque.cpp ] // See bug report for fusion https://svn.boost.org/trac/boost/ticket/11572 - [ run zip_iterator_test_fusion.cpp ] - [ run zip_iterator_test_std_tuple.cpp ] - [ run zip_iterator_test_std_pair.cpp ] - - # These tests should work for just about everything. - [ compile is_lvalue_iterator.cpp ] - [ compile is_readable_iterator.cpp ] - [ compile pointee.cpp ] - - [ run unit_tests.cpp ] - [ run concept_tests.cpp ] - [ run iterator_adaptor_cc.cpp ] - [ run iterator_adaptor_test.cpp ] - [ compile iterator_archetype_cc.cpp ] - [ compile-fail iter_archetype_default_ctor.cpp ] - [ compile-fail lvalue_concept_fail.cpp ] - [ run transform_iterator_test.cpp ] - [ run indirect_iterator_test.cpp ] - [ compile indirect_iter_member_types.cpp ] - [ run filter_iterator_test.cpp ] - [ run iterator_facade.cpp ] - [ run reverse_iterator_test.cpp ] - [ run counting_iterator_test.cpp ] - [ run interoperable.cpp ] - [ run iterator_traits_test.cpp ] - [ run permutation_iterator_test.cpp : : : # on - ] - [ run function_input_iterator_test.cpp ] - - [ run generator_iterator_test.cpp ] - - [ run minimum_category.cpp ] - [ compile-fail minimum_category_compile_fail.cpp ] -; diff --git a/libs/iterator/test/concept_tests.cpp b/libs/iterator/test/concept_tests.cpp deleted file mode 100644 index f3d518a1f..000000000 --- a/libs/iterator/test/concept_tests.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// (C) Copyright Jeremy Siek 2002. -// Distributed under the 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 -#include -#include - -struct new_random_access - : std::random_access_iterator_tag - , boost::random_access_traversal_tag -{}; - -struct new_iterator - : public boost::iterator< new_random_access, int > -{ - int& operator*() const { return *m_x; } - new_iterator& operator++() { return *this; } - new_iterator operator++(int) { return *this; } - new_iterator& operator--() { return *this; } - new_iterator operator--(int) { return *this; } - new_iterator& operator+=(std::ptrdiff_t) { return *this; } - new_iterator operator+(std::ptrdiff_t) { return *this; } - new_iterator& operator-=(std::ptrdiff_t) { return *this; } - std::ptrdiff_t operator-(const new_iterator&) const { return 0; } - new_iterator operator-(std::ptrdiff_t) const { return *this; } - bool operator==(const new_iterator&) const { return false; } - bool operator!=(const new_iterator&) const { return false; } - bool operator<(const new_iterator&) const { return false; } - int* m_x; -}; -new_iterator operator+(std::ptrdiff_t, new_iterator x) { return x; } - -struct old_iterator - : public boost::iterator -{ - int& operator*() const { return *m_x; } - old_iterator& operator++() { return *this; } - old_iterator operator++(int) { return *this; } - old_iterator& operator--() { return *this; } - old_iterator operator--(int) { return *this; } - old_iterator& operator+=(std::ptrdiff_t) { return *this; } - old_iterator operator+(std::ptrdiff_t) { return *this; } - old_iterator& operator-=(std::ptrdiff_t) { return *this; } - old_iterator operator-(std::ptrdiff_t) const { return *this; } - std::ptrdiff_t operator-(const old_iterator&) const { return 0; } - bool operator==(const old_iterator&) const { return false; } - bool operator!=(const old_iterator&) const { return false; } - bool operator<(const old_iterator&) const { return false; } - int* m_x; -}; -old_iterator operator+(std::ptrdiff_t, old_iterator x) { return x; } - -int -main() -{ - boost::iterator_traversal::type tc; - boost::random_access_traversal_tag derived = tc; - (void)derived; - - boost::function_requires< - boost_concepts::WritableIteratorConcept >(); - boost::function_requires< - boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< - boost_concepts::RandomAccessTraversalConcept >(); - - boost::function_requires< - boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< - boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< - boost_concepts::RandomAccessTraversalConcept >(); - - boost::function_requires< - boost_concepts::WritableIteratorConcept >(); - boost::function_requires< - boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< - boost_concepts::RandomAccessTraversalConcept >(); - - boost::function_requires< - boost_concepts::WritableIteratorConcept >(); - boost::function_requires< - boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< - boost_concepts::RandomAccessTraversalConcept >(); - - boost::function_requires< - boost_concepts::InteroperableIteratorConcept >(); - - return 0; -} diff --git a/libs/iterator/test/constant_iter_arrow.cpp b/libs/iterator/test/constant_iter_arrow.cpp deleted file mode 100644 index 3579c53ba..000000000 --- a/libs/iterator/test/constant_iter_arrow.cpp +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright David Abrahams 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) - -#include -#include - -struct my_iter : boost::iterator_adaptor const*> -{ - my_iter(std::pair const*); - my_iter(); -}; - -std::pair const x(1,1); -my_iter p(&x); -int y = p->first; // operator-> attempts to return an non-const pointer diff --git a/libs/iterator/test/constant_iter_arrow_fail.cpp b/libs/iterator/test/constant_iter_arrow_fail.cpp deleted file mode 100644 index 05f551a93..000000000 --- a/libs/iterator/test/constant_iter_arrow_fail.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright David Abrahams 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) - -#include -#include - -struct my_iter : boost::iterator_adaptor const*> -{ - my_iter(std::pair const*); - my_iter(); -}; - -std::pair const x(1,1); -my_iter p(&x); - -void test() -{ - p->first = 3; -} diff --git a/libs/iterator/test/counting_iterator_test.cpp b/libs/iterator/test/counting_iterator_test.cpp deleted file mode 100644 index 7770af5af..000000000 --- a/libs/iterator/test/counting_iterator_test.cpp +++ /dev/null @@ -1,300 +0,0 @@ -// (C) Copyright David Abrahams 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 for most recent version including documentation. -// -// Revision History -// 16 Feb 2001 Added a missing const. Made the tests run (somewhat) with -// plain MSVC again. (David Abrahams) -// 11 Feb 2001 #if 0'd out use of counting_iterator on non-numeric types in -// MSVC without STLport, so that the other tests may proceed -// (David Abrahams) -// 04 Feb 2001 Added use of iterator_tests.hpp (David Abrahams) -// 28 Jan 2001 Removed not_an_iterator detritus (David Abrahams) -// 24 Jan 2001 Initial revision (David Abrahams) - -#include - -#ifdef __BORLANDC__ // Borland mis-detects our custom iterators -# pragma warn -8091 // template argument ForwardIterator passed to '...' is a output iterator -# pragma warn -8071 // Conversion may lose significant digits (due to counting_iterator += n). -#endif - -#ifdef BOOST_MSVC -# pragma warning(disable:4786) // identifier truncated in debug info -#endif - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#ifndef __BORLANDC__ -# include -#endif -#include -#include -#include -#ifndef BOOST_NO_SLIST -# ifdef BOOST_SLIST_HEADER -# include BOOST_SLIST_HEADER -# else -# include -# endif -#endif - - -#ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS -template -struct signed_assert_nonnegative -{ - static void test(T x) { BOOST_TEST(x >= 0); } -}; - -template -struct unsigned_assert_nonnegative -{ - static void test(T x) {} -}; - -template -struct assert_nonnegative - : boost::mpl::if_c< - std::numeric_limits::is_signed - , signed_assert_nonnegative - , unsigned_assert_nonnegative - >::type -{ -}; -#endif - -// Special tests for RandomAccess CountingIterators. -template -void category_test( - CountingIterator start, - CountingIterator finish, - Value, - std::random_access_iterator_tag) -{ - typedef typename - boost::detail::iterator_traits::difference_type - difference_type; - difference_type distance = boost::detail::distance(start, finish); - - // Pick a random position internal to the range - difference_type offset = (unsigned)rand() % distance; - -#ifdef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS - BOOST_TEST(offset >= 0); -#else - assert_nonnegative::test(offset); -#endif - - CountingIterator internal = start; - std::advance(internal, offset); - - // Try some binary searches on the range to show that it's ordered - BOOST_TEST(std::binary_search(start, finish, *internal)); - - // #including tuple crashed borland, so I had to give up on tie(). - std::pair xy( - std::equal_range(start, finish, *internal)); - CountingIterator x = xy.first, y = xy.second; - - BOOST_TEST(boost::detail::distance(x, y) == 1); - - // Show that values outside the range can't be found - BOOST_TEST(!std::binary_search(start, boost::prior(finish), *finish)); - - // Do the generic random_access_iterator_test - typedef typename CountingIterator::value_type value_type; - std::vector v; - for (value_type z = *start; !(z == *finish); ++z) - v.push_back(z); - - // Note that this test requires a that the first argument is - // dereferenceable /and/ a valid iterator prior to the first argument - boost::random_access_iterator_test(start, v.size(), v.begin()); -} - -// Special tests for bidirectional CountingIterators -template -void category_test(CountingIterator start, Value v1, std::bidirectional_iterator_tag) -{ - Value v2 = v1; - ++v2; - - // Note that this test requires a that the first argument is - // dereferenceable /and/ a valid iterator prior to the first argument - boost::bidirectional_iterator_test(start, v1, v2); -} - -template -void category_test(CountingIterator start, CountingIterator finish, Value v1, std::forward_iterator_tag) -{ - Value v2 = v1; - ++v2; - if (finish != start && finish != boost::next(start)) - boost::forward_readable_iterator_test(start, finish, v1, v2); -} - -template -void test_aux(CountingIterator start, CountingIterator finish, Value v1) -{ - typedef typename CountingIterator::iterator_category category; - typedef typename CountingIterator::value_type value_type; - - // If it's a RandomAccessIterator we can do a few delicate tests - category_test(start, finish, v1, category()); - - // Okay, brute force... - for (CountingIterator p = start - ; p != finish && boost::next(p) != finish - ; ++p) - { - BOOST_TEST(boost::next(*p) == *boost::next(p)); - } - - // prove that a reference can be formed to these values - typedef typename CountingIterator::value_type value; - const value* q = &*start; - (void)q; // suppress unused variable warning -} - -template -void test(Incrementable start, Incrementable finish) -{ - test_aux(boost::make_counting_iterator(start), boost::make_counting_iterator(finish), start); -} - -template -void test_integer(Integer* = 0) // default arg works around MSVC bug -{ - Integer start = 0; - Integer finish = 120; - test(start, finish); -} - -template -void test_integer3(Integer* = 0, Category* = 0, Difference* = 0) // default arg works around MSVC bug -{ - Integer start = 0; - Integer finish = 120; - typedef boost::counting_iterator iterator; - test_aux(iterator(start), iterator(finish), start); -} - -template -void test_container(Container* = 0) // default arg works around MSVC bug -{ - Container c(1 + (unsigned)rand() % 1673); - - const typename Container::iterator start = c.begin(); - - // back off by 1 to leave room for dereferenceable value at the end - typename Container::iterator finish = start; - std::advance(finish, c.size() - 1); - - test(start, finish); - - typedef typename Container::const_iterator const_iterator; - test(const_iterator(start), const_iterator(finish)); -} - -class my_int1 { -public: - my_int1() { } - my_int1(int x) : m_int(x) { } - my_int1& operator++() { ++m_int; return *this; } - bool operator==(const my_int1& x) const { return m_int == x.m_int; } -private: - int m_int; -}; - -class my_int2 { -public: - typedef void value_type; - typedef void pointer; - typedef void reference; - typedef std::ptrdiff_t difference_type; - typedef std::bidirectional_iterator_tag iterator_category; - - my_int2() { } - my_int2(int x) : m_int(x) { } - my_int2& operator++() { ++m_int; return *this; } - my_int2& operator--() { --m_int; return *this; } - bool operator==(const my_int2& x) const { return m_int == x.m_int; } -private: - int m_int; -}; - -class my_int3 { -public: - typedef void value_type; - typedef void pointer; - typedef void reference; - typedef std::ptrdiff_t difference_type; - typedef std::random_access_iterator_tag iterator_category; - - my_int3() { } - my_int3(int x) : m_int(x) { } - my_int3& operator++() { ++m_int; return *this; } - my_int3& operator+=(std::ptrdiff_t n) { m_int += n; return *this; } - std::ptrdiff_t operator-(const my_int3& x) const { return m_int - x.m_int; } - my_int3& operator--() { --m_int; return *this; } - bool operator==(const my_int3& x) const { return m_int == x.m_int; } - bool operator!=(const my_int3& x) const { return m_int != x.m_int; } - bool operator<(const my_int3& x) const { return m_int < x.m_int; } -private: - int m_int; -}; - -int main() -{ - // Test the built-in integer types. - test_integer(); - test_integer(); - test_integer(); - test_integer(); - test_integer(); - test_integer(); - test_integer(); - test_integer(); - test_integer(); - test_integer(); -#if defined(BOOST_HAS_LONG_LONG) - test_integer< ::boost::long_long_type>(); - test_integer< ::boost::ulong_long_type>(); -#endif - - // Test user-defined type. - - test_integer3(); - test_integer3(); - test_integer(); - test_integer(); - - // Some tests on container iterators, to prove we handle a few different categories - test_container >(); - test_container >(); -# ifndef BOOST_NO_SLIST - test_container >(); -# endif - - // Also prove that we can handle raw pointers. - int array[2000]; - test(boost::make_counting_iterator(array), boost::make_counting_iterator(array+2000-1)); - - return boost::report_errors(); -} diff --git a/libs/iterator/test/detail/zip_iterator_test.ipp b/libs/iterator/test/detail/zip_iterator_test.ipp deleted file mode 100644 index f659099e0..000000000 --- a/libs/iterator/test/detail/zip_iterator_test.ipp +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) 2014 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) -// -// See http://www.boost.org for most recent version including documentation. - -#include - -#include -#include -#include -#include -#include - - -int main() -{ - typedef TUPLE< - std::vector::iterator, - std::vector::iterator - > iterator_tuple; - - std::vector vi = boost::assign::list_of(42)(72); - std::vector vs = boost::assign::list_of("kokoro")("pyonpyon"); - - { - boost::zip_iterator i1(MAKE_TUPLE(vi.begin(), vs.begin())); - boost::zip_iterator i2 = i1; - - BOOST_TEST( i1 == i2); - BOOST_TEST( i1++ == i2); - BOOST_TEST( i1 == (i2 + 1)); - BOOST_TEST((i1 - 1) == i2); - BOOST_TEST( i1-- == ++i2); - BOOST_TEST( i1 == --i2); - } - - { - boost::zip_iterator i1(MAKE_TUPLE(vi.begin(), vs.begin())); - boost::zip_iterator i2 = i1 + 1; - - BOOST_TEST( i1 != i2); - BOOST_TEST( i1++ != i2); - BOOST_TEST( i1 != (i2 + 1)); - BOOST_TEST((i1 - 1) != i2); - BOOST_TEST( i1-- != ++i2); - BOOST_TEST( i1 != --i2); - } - - { - boost::zip_iterator i(MAKE_TUPLE(vi.begin(), vs.begin())); - - BOOST_TEST(boost::fusion::at_c<0>(* i ) == 42); - BOOST_TEST(boost::fusion::at_c<1>(* i ) == "kokoro"); - BOOST_TEST(boost::fusion::at_c<0>(*(i + 1)) == 72); - BOOST_TEST(boost::fusion::at_c<1>(*(i + 1)) == "pyonpyon"); - } - - { - boost::zip_iterator i1(MAKE_TUPLE(vi.begin(), vs.begin())); - boost::zip_iterator i2(MAKE_TUPLE(vi.end(), vs.end())); - - BOOST_TEST((i2 - i1) == 2); - ++i1; - BOOST_TEST((i2 - i1) == 1); - --i2; - BOOST_TEST((i2 - i1) == 0); - } - - return boost::report_errors(); -} diff --git a/libs/iterator/test/detail/zip_iterator_test_original.ipp b/libs/iterator/test/detail/zip_iterator_test_original.ipp deleted file mode 100644 index dc042214b..000000000 --- a/libs/iterator/test/detail/zip_iterator_test_original.ipp +++ /dev/null @@ -1,857 +0,0 @@ -// (C) Copyright Dave Abrahams and Thomas Becker 2003. Distributed -// under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// - -// File: -// ===== -// zip_iterator_test_main.cpp - -// Author: -// ======= -// Thomas Becker - -// Created: -// ======== -// Jul 15, 2003 - -// Purpose: -// ======== -// Test driver for zip_iterator.hpp - -// Compilers Tested: -// ================= -// Metrowerks Codewarrior Pro 7.2, 8.3 -// gcc 2.95.3 -// gcc 3.2 -// Microsoft VC 6sp5 (test fails due to some compiler bug) -// Microsoft VC 7 (works) -// Microsoft VC 7.1 -// Intel 5 -// Intel 6 -// Intel 7.1 -// Intel 8 -// Borland 5.5.1 (broken due to lack of support from Boost.Tuples) - -///////////////////////////////////////////////////////////////////////////// -// -// Includes -// -///////////////////////////////////////////////////////////////////////////// - -#include -#include // 2nd #include tests #include guard. -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -/// Tests for https://svn.boost.org/trac/boost/ticket/1517 -int to_value(int const &v) -{ - return v; -} - -void category_test() -{ - std::list rng1; - std::string rng2; - - boost::make_zip_iterator( - ZI_MAKE_TUPLE( - boost::make_transform_iterator(rng1.begin(), &to_value), // BidirectionalInput - rng2.begin() // RandomAccess - ) - ); -} -/// - -///////////////////////////////////////////////////////////////////////////// -// -// Das Main Funktion -// -///////////////////////////////////////////////////////////////////////////// - -int main( void ) -{ - - category_test(); - - std::cout << "\n" - << "***********************************************\n" - << "* *\n" - << "* Test driver for boost::zip_iterator *\n" - << "* Copyright Thomas Becker 2003 *\n" - << "* *\n" - << "***********************************************\n\n" - << std::flush; - - size_t num_successful_tests = 0; - size_t num_failed_tests = 0; - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator construction and dereferencing - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator construction and dereferencing: " - << std::flush; - - std::vector vect1(3); - vect1[0] = 42.; - vect1[1] = 43.; - vect1[2] = 44.; - - std::set intset; - intset.insert(52); - intset.insert(53); - intset.insert(54); - // - - typedef - boost::zip_iterator< - ZI_TUPLE< - std::set::iterator - , std::vector::iterator - > - > zit_mixed; - - zit_mixed zip_it_mixed = zit_mixed( - ZI_MAKE_TUPLE( - intset.begin() - , vect1.begin() - ) - ); - - ZI_TUPLE val_tuple( - *zip_it_mixed); - - ZI_TUPLE ref_tuple( - *zip_it_mixed); - - double dblOldVal = ZI_TUPLE_GET(1)(ref_tuple); - ZI_TUPLE_GET(1)(ref_tuple) -= 41.; - - if( 52 == ZI_TUPLE_GET(0)(val_tuple) && - 42. == ZI_TUPLE_GET(1)(val_tuple) && - 52 == ZI_TUPLE_GET(0)(ref_tuple) && - 1. == ZI_TUPLE_GET(1)(ref_tuple) && - 1. == *vect1.begin() - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - // Undo change to vect1 - ZI_TUPLE_GET(1)(ref_tuple) = dblOldVal; - -#if defined(ZI_USE_BOOST_TUPLE) - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator with 12 components - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterators with 12 components: " - << std::flush; - - // Declare 12 containers - // - std::list li1; - li1.push_back(1); - std::set se1; - se1.insert(2); - std::vector ve1; - ve1.push_back(3); - // - std::list li2; - li2.push_back(4); - std::set se2; - se2.insert(5); - std::vector ve2; - ve2.push_back(6); - // - std::list li3; - li3.push_back(7); - std::set se3; - se3.insert(8); - std::vector ve3; - ve3.push_back(9); - // - std::list li4; - li4.push_back(10); - std::set se4; - se4.insert(11); - std::vector ve4; - ve4.push_back(12); - - // typedefs for cons lists of iterators. - typedef boost::tuples::cons< - std::set::iterator, - ZI_TUPLE< - std::vector::iterator, - std::list::iterator, - std::set::iterator, - std::vector::iterator, - std::list::iterator, - std::set::iterator, - std::vector::iterator, - std::list::iterator, - std::set::iterator, - std::vector::const_iterator - >::inherited - > cons_11_its_type; - // - typedef boost::tuples::cons< - std::list::const_iterator, - cons_11_its_type - > cons_12_its_type; - - // typedefs for cons lists for dereferencing the zip iterator - // made from the cons list above. - typedef boost::tuples::cons< - const int&, - ZI_TUPLE< - int&, - int&, - const int&, - int&, - int&, - const int&, - int&, - int&, - const int&, - const int& - >::inherited - > cons_11_refs_type; - // - typedef boost::tuples::cons< - const int&, - cons_11_refs_type - > cons_12_refs_type; - - // typedef for zip iterator with 12 elements - typedef boost::zip_iterator zip_it_12_type; - - // Declare a 12-element zip iterator. - zip_it_12_type zip_it_12( - cons_12_its_type( - li1.begin(), - cons_11_its_type( - se1.begin(), - ZI_MAKE_TUPLE( - ve1.begin(), - li2.begin(), - se2.begin(), - ve2.begin(), - li3.begin(), - se3.begin(), - ve3.begin(), - li4.begin(), - se4.begin(), - ve4.begin() - ) - ) - ) - ); - - // Dereference, mess with the result a little. - cons_12_refs_type zip_it_12_dereferenced(*zip_it_12); - ZI_TUPLE_GET(9)(zip_it_12_dereferenced) = 42; - - // Make a copy and move it a little to force some instantiations. - zip_it_12_type zip_it_12_copy(zip_it_12); - ++zip_it_12_copy; - - if( ZI_TUPLE_GET(11)(zip_it_12.get_iterator_tuple()) == ve4.begin() && - ZI_TUPLE_GET(11)(zip_it_12_copy.get_iterator_tuple()) == ve4.end() && - 1 == ZI_TUPLE_GET(0)(zip_it_12_dereferenced) && - 12 == ZI_TUPLE_GET(11)(zip_it_12_dereferenced) && - 42 == *(li4.begin()) - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - -#endif - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator incrementing and dereferencing - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator ++ and *: " - << std::flush; - - std::vector vect2(3); - vect2[0] = 2.2; - vect2[1] = 3.3; - vect2[2] = 4.4; - - boost::zip_iterator< - ZI_TUPLE< - std::vector::const_iterator, - std::vector::const_iterator - > - > - zip_it_begin( - ZI_MAKE_TUPLE( - vect1.begin(), - vect2.begin() - ) - ); - - boost::zip_iterator< - ZI_TUPLE< - std::vector::const_iterator, - std::vector::const_iterator - > - > - zip_it_run( - ZI_MAKE_TUPLE( - vect1.begin(), - vect2.begin() - ) - ); - - boost::zip_iterator< - ZI_TUPLE< - std::vector::const_iterator, - std::vector::const_iterator - > - > - zip_it_end( - ZI_MAKE_TUPLE( - vect1.end(), - vect2.end() - ) - ); - - if( zip_it_run == zip_it_begin && - 42. == ZI_TUPLE_GET(0)(*zip_it_run) && - 2.2 == ZI_TUPLE_GET(1)(*zip_it_run) && - 43. == ZI_TUPLE_GET(0)(*(++zip_it_run)) && - 3.3 == ZI_TUPLE_GET(1)(*zip_it_run) && - 44. == ZI_TUPLE_GET(0)(*(++zip_it_run)) && - 4.4 == ZI_TUPLE_GET(1)(*zip_it_run) && - zip_it_end == ++zip_it_run - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator decrementing and dereferencing - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator -- and *: " - << std::flush; - - if( zip_it_run == zip_it_end && - zip_it_end == zip_it_run-- && - 44. == ZI_TUPLE_GET(0)(*zip_it_run) && - 4.4 == ZI_TUPLE_GET(1)(*zip_it_run) && - 43. == ZI_TUPLE_GET(0)(*(--zip_it_run)) && - 3.3 == ZI_TUPLE_GET(1)(*zip_it_run) && - 42. == ZI_TUPLE_GET(0)(*(--zip_it_run)) && - 2.2 == ZI_TUPLE_GET(1)(*zip_it_run) && - zip_it_begin == zip_it_run - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator copy construction and equality - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator copy construction and equality: " - << std::flush; - - boost::zip_iterator< - ZI_TUPLE< - std::vector::const_iterator, - std::vector::const_iterator - > - > zip_it_run_copy(zip_it_run); - - if(zip_it_run == zip_it_run && zip_it_run == zip_it_run_copy) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator inequality - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator inequality: " - << std::flush; - - if(!(zip_it_run != zip_it_run_copy) && zip_it_run != ++zip_it_run_copy) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator less than - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator less than: " - << std::flush; - - // Note: zip_it_run_copy == zip_it_run + 1 - // - if( zip_it_run < zip_it_run_copy && - !( zip_it_run < --zip_it_run_copy) && - zip_it_run == zip_it_run_copy - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator less than or equal - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "zip iterator less than or equal: " - << std::flush; - - // Note: zip_it_run_copy == zip_it_run - // - ++zip_it_run; - zip_it_run_copy += 2; - - if( zip_it_run <= zip_it_run_copy && - zip_it_run <= --zip_it_run_copy && - !( zip_it_run <= --zip_it_run_copy) && - zip_it_run <= zip_it_run - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator greater than - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator greater than: " - << std::flush; - - // Note: zip_it_run_copy == zip_it_run - 1 - // - if( zip_it_run > zip_it_run_copy && - !( zip_it_run > ++zip_it_run_copy) && - zip_it_run == zip_it_run_copy - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator greater than or equal - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator greater than or equal: " - << std::flush; - - ++zip_it_run; - - // Note: zip_it_run == zip_it_run_copy + 1 - // - if( zip_it_run >= zip_it_run_copy && - --zip_it_run >= zip_it_run_copy && - ! (zip_it_run >= ++zip_it_run_copy) - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator + int - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator + int: " - << std::flush; - - // Note: zip_it_run == zip_it_run_copy - 1 - // - zip_it_run = zip_it_run + 2; - ++zip_it_run_copy; - - if( zip_it_run == zip_it_run_copy && zip_it_run == zip_it_begin + 3 ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator - int - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator - int: " - << std::flush; - - // Note: zip_it_run == zip_it_run_copy, and both are at end position - // - zip_it_run = zip_it_run - 2; - --zip_it_run_copy; - --zip_it_run_copy; - - if( zip_it_run == zip_it_run_copy && (zip_it_run - 1) == zip_it_begin ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator += - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator +=: " - << std::flush; - - // Note: zip_it_run == zip_it_run_copy, and both are at begin + 1 - // - zip_it_run += 2; - if( zip_it_run == zip_it_begin + 3 ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator -= - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator -=: " - << std::flush; - - // Note: zip_it_run is at end position, zip_it_run_copy is at - // begin plus one. - // - zip_it_run -= 2; - if( zip_it_run == zip_it_run_copy ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator getting member iterators - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator member iterators: " - << std::flush; - - // Note: zip_it_run and zip_it_run_copy are both at - // begin plus one. - // - if( ZI_TUPLE_GET(0)(zip_it_run.get_iterator_tuple()) == vect1.begin() + 1 && - ZI_TUPLE_GET(1)(zip_it_run.get_iterator_tuple()) == vect2.begin() + 1 - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Making zip iterators - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Making zip iterators: " - << std::flush; - - std::vector > - vect_of_tuples(3); - - std::copy( - boost::make_zip_iterator( - ZI_MAKE_TUPLE( - vect1.begin(), - vect2.begin() - ) - ), - boost::make_zip_iterator( - ZI_MAKE_TUPLE( - vect1.end(), - vect2.end() - ) - ), - vect_of_tuples.begin() - ); - - if( 42. == ZI_TUPLE_GET(0)(*vect_of_tuples.begin()) && - 2.2 == ZI_TUPLE_GET(1)(*vect_of_tuples.begin()) && - 43. == ZI_TUPLE_GET(0)(*(vect_of_tuples.begin() + 1)) && - 3.3 == ZI_TUPLE_GET(1)(*(vect_of_tuples.begin() + 1)) && - 44. == ZI_TUPLE_GET(0)(*(vect_of_tuples.begin() + 2)) && - 4.4 == ZI_TUPLE_GET(1)(*(vect_of_tuples.begin() + 2)) - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator non-const --> const conversion - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator non-const to const conversion: " - << std::flush; - - boost::zip_iterator< - ZI_TUPLE< - std::set::const_iterator, - std::vector::const_iterator - > - > - zip_it_const( - ZI_MAKE_TUPLE( - intset.begin(), - vect2.begin() - ) - ); - // - boost::zip_iterator< - ZI_TUPLE< - std::set::iterator, - std::vector::const_iterator - > - > - zip_it_half_const( - ZI_MAKE_TUPLE( - intset.begin(), - vect2.begin() - ) - ); - // - boost::zip_iterator< - ZI_TUPLE< - std::set::iterator, - std::vector::iterator - > - > - zip_it_non_const( - ZI_MAKE_TUPLE( - intset.begin(), - vect2.begin() - ) - ); - - zip_it_half_const = ++zip_it_non_const; - zip_it_const = zip_it_half_const; - ++zip_it_const; -// zip_it_non_const = ++zip_it_const; // Error: can't convert from const to non-const - - if( 54 == ZI_TUPLE_GET(0)(*zip_it_const) && - 4.4 == ZI_TUPLE_GET(1)(*zip_it_const) && - 53 == ZI_TUPLE_GET(0)(*zip_it_half_const) && - 3.3 == ZI_TUPLE_GET(1)(*zip_it_half_const) - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - - -#if defined(ZI_USE_BOOST_TUPLE) - - ///////////////////////////////////////////////////////////////////////////// - // - // Zip iterator categories - // - ///////////////////////////////////////////////////////////////////////////// - - std::cout << "Zip iterator categories: " - << std::flush; - - // The big iterator of the previous test has vector, list, and set iterators. - // Therefore, it must be bidirectional, but not random access. - bool bBigItIsBidirectionalIterator = boost::is_convertible< - boost::iterator_traversal::type - , boost::bidirectional_traversal_tag - >::value; - - bool bBigItIsRandomAccessIterator = boost::is_convertible< - boost::iterator_traversal::type - , boost::random_access_traversal_tag - >::value; - - // A combining iterator with all vector iterators must have random access - // traversal. - // - typedef boost::zip_iterator< - ZI_TUPLE< - std::vector::const_iterator, - std::vector::const_iterator - > - > all_vects_type; - - bool bAllVectsIsRandomAccessIterator = boost::is_convertible< - boost::iterator_traversal::type - , boost::random_access_traversal_tag - >::value; - - // The big test. - if( bBigItIsBidirectionalIterator && - ! bBigItIsRandomAccessIterator && - bAllVectsIsRandomAccessIterator - ) - { - ++num_successful_tests; - std::cout << "OK" << std::endl; - } - else - { - ++num_failed_tests; - std::cout << "not OK" << std::endl; - } - -#endif - - // Done - // - std::cout << "\nTest Result:" - << "\n============" - << "\nNumber of successful tests: " << static_cast(num_successful_tests) - << "\nNumber of failed tests: " << static_cast(num_failed_tests) - << std::endl; - - return num_failed_tests; -} - diff --git a/libs/iterator/test/filter_iterator_test.cpp b/libs/iterator/test/filter_iterator_test.cpp deleted file mode 100644 index beaab4dd4..000000000 --- a/libs/iterator/test/filter_iterator_test.cpp +++ /dev/null @@ -1,272 +0,0 @@ -// Copyright David Abrahams 2003, Jeremy Siek 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) - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -using boost::dummyT; - -struct one_or_four -{ - bool operator()(dummyT x) const - { - return x.foo() == 1 || x.foo() == 4; - } -}; - -template struct undefined; - -template struct see_type; - -// Test filter iterator -int main() -{ - // Concept checks - // Adapting old-style iterators - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::SinglePassIteratorConcept >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost::OutputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::SinglePassIteratorConcept >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::ForwardIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::ForwardTraversalConcept >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::Mutable_ForwardIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::ForwardTraversalConcept >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::Mutable_BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::filter_iterator > Iter; - boost::function_requires< boost::Mutable_BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - // Adapting new-style iterators - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_iterator_t - , boost::single_pass_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::SinglePassIteratorConcept >(); - } -#if !BOOST_WORKAROUND(BOOST_MSVC, == 1200) // Causes Internal Error in linker. - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::readable_writable_iterator_t - , boost::single_pass_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost::OutputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::SinglePassIteratorConcept >(); - } -#endif - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_iterator_t - , boost::forward_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::ForwardTraversalConcept >(); - } - -#if !BOOST_WORKAROUND(BOOST_MSVC, == 1200) // Causes Internal Error in linker. - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::readable_writable_iterator_t - , boost::forward_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::ForwardTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_lvalue_iterator_t - , boost::forward_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost::ForwardIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::ForwardTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::writable_lvalue_iterator_t - , boost::forward_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost::Mutable_ForwardIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::ForwardTraversalConcept >(); - } -#endif - - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_iterator_t - , boost::random_access_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - -#if !BOOST_WORKAROUND(BOOST_MSVC, == 1200) // Causes Internal Error in linker. - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::readable_writable_iterator_t - , boost::random_access_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_lvalue_iterator_t - , boost::random_access_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost::BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::writable_lvalue_iterator_t - , boost::random_access_traversal_tag - > BaseIter; - typedef boost::filter_iterator Iter; - boost::function_requires< boost::Mutable_BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } -#endif - - // Run-time tests - - dummyT array[] = { dummyT(0), dummyT(1), dummyT(2), - dummyT(3), dummyT(4), dummyT(5) }; - const int N = sizeof(array)/sizeof(dummyT); - - typedef boost::filter_iterator filter_iter; - - boost::bidirectional_readable_iterator_test( - filter_iter(one_or_four(), array, array+N) - , dummyT(1), dummyT(4)); - - BOOST_STATIC_ASSERT( - (!boost::is_convertible< - boost::iterator_traversal::type - , boost::random_access_traversal_tag - >::value - )); - - //# endif - - // On compilers not supporting partial specialization, we can do more type - // deduction with deque iterators than with pointers... unless the library - // is broken ;-( - std::deque array2; - std::copy(array+0, array+N, std::back_inserter(array2)); - boost::bidirectional_readable_iterator_test( - boost::make_filter_iterator(one_or_four(), array2.begin(), array2.end()), - dummyT(1), dummyT(4)); - - boost::bidirectional_readable_iterator_test( - boost::make_filter_iterator(one_or_four(), array2.begin(), array2.end()), - dummyT(1), dummyT(4)); - - boost::bidirectional_readable_iterator_test( - boost::make_filter_iterator( - one_or_four() - , boost::make_reverse_iterator(array2.end()) - , boost::make_reverse_iterator(array2.begin()) - ), - dummyT(4), dummyT(1)); - - boost::bidirectional_readable_iterator_test( - filter_iter(array+0, array+N), - dummyT(1), dummyT(4)); - - boost::bidirectional_readable_iterator_test( - filter_iter(one_or_four(), array, array + N), - dummyT(1), dummyT(4)); - - - return boost::report_errors(); -} diff --git a/libs/iterator/test/function_input_iterator_test.cpp b/libs/iterator/test/function_input_iterator_test.cpp deleted file mode 100644 index b08caa65e..000000000 --- a/libs/iterator/test/function_input_iterator_test.cpp +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2010 (c) Dean Michael Berris -// Distributed under the 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 -#include - -#include -#include -#include -#include - -#include - -namespace { - -struct ones { - typedef int result_type; - result_type operator() () { - return 1; - } -}; - -int ones_function () { - return 1; -} - -struct counter { - typedef int result_type; - int n; - explicit counter(int n_) : n(n_) { } - result_type operator() () { - return n++; - } -}; - -} // namespace - -using namespace std; - -int main(int argc, char * argv[]) -{ - // test the iterator with function objects - ones ones_generator; - vector values(10); - generate(values.begin(), values.end(), ones()); - - vector generated; - copy( - boost::make_function_input_iterator(ones_generator, 0), - boost::make_function_input_iterator(ones_generator, 10), - back_inserter(generated) - ); - - assert(values.size() == generated.size()); - assert(equal(values.begin(), values.end(), generated.begin())); - cout << "function iterator test with function objects successful." << endl; - - // test the iterator with normal functions - vector().swap(generated); - copy( - boost::make_function_input_iterator(&ones_function, 0), - boost::make_function_input_iterator(&ones_function, 10), - back_inserter(generated) - ); - - assert(values.size() == generated.size()); - assert(equal(values.begin(), values.end(), generated.begin())); - cout << "function iterator test with pointer to function successful." << endl; - - // test the iterator with a reference to a function - vector().swap(generated); - copy( - boost::make_function_input_iterator(ones_function, 0), - boost::make_function_input_iterator(ones_function, 10), - back_inserter(generated) - ); - - assert(values.size() == generated.size()); - assert(equal(values.begin(), values.end(), generated.begin())); - cout << "function iterator test with reference to function successful." << endl; - - // test the iterator with a stateful function object - counter counter_generator(42); - vector().swap(generated); - copy( - boost::make_function_input_iterator(counter_generator, 0), - boost::make_function_input_iterator(counter_generator, 10), - back_inserter(generated) - ); - - assert(generated.size() == 10); - assert(counter_generator.n == 42 + 10); - for(std::size_t i = 0; i != 10; ++i) - assert(generated[i] == 42 + i); - cout << "function iterator test with stateful function object successful." << endl; - - return 0; -} - diff --git a/libs/iterator/test/generator_iterator_test.cpp b/libs/iterator/test/generator_iterator_test.cpp deleted file mode 100644 index 1c7a11040..000000000 --- a/libs/iterator/test/generator_iterator_test.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// -// Copyright 2014 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 -#include -#include - -class X -{ -private: - - int v; - -public: - - typedef int result_type; - - X(): v( 0 ) - { - } - - int operator()() - { - return ++v; - } -}; - -template OutputIterator copy_n( InputIterator first, Size n, OutputIterator result ) -{ - while( n-- > 0 ) - { - *result++ = *first++; - } - - return result; -} - -void copy_test() -{ - X x; - boost::generator_iterator in( &x ); - - int const N = 4; - int v[ N ] = { 0 }; - - ::copy_n( in, 4, v ); - - BOOST_TEST_EQ( v[0], 1 ); - BOOST_TEST_EQ( v[1], 2 ); - BOOST_TEST_EQ( v[2], 3 ); - BOOST_TEST_EQ( v[3], 4 ); -} - -int main() -{ - copy_test(); - return boost::report_errors(); -} diff --git a/libs/iterator/test/indirect_iter_member_types.cpp b/libs/iterator/test/indirect_iter_member_types.cpp deleted file mode 100644 index da09ac8be..000000000 --- a/libs/iterator/test/indirect_iter_member_types.cpp +++ /dev/null @@ -1,87 +0,0 @@ -// (C) Copyright Jeremy Siek 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) - -// Revision History -// 03 Jan 2004 Jeremy Siek -// First draft. - - -#include -#include - -#include -#include -#include "static_assert_same.hpp" -#include - -struct zow { }; - -struct my_ptr { - typedef zow const element_type; - zow const& operator*() const; -// typedef const zow& reference; -// typedef const zow* pointer; -// typedef void difference_type; -// typedef boost::no_traversal_tag iterator_category; -}; - - -// Borland 5.6.4 and earlier drop const all over the place, so this -// test will fail in the lines marked with (**) - -int main() -{ - { - typedef boost::indirect_iterator Iter; - STATIC_ASSERT_SAME(Iter::value_type, int); - STATIC_ASSERT_SAME(Iter::reference, int&); - STATIC_ASSERT_SAME(Iter::pointer, int*); - STATIC_ASSERT_SAME(Iter::difference_type, std::ptrdiff_t); - - BOOST_STATIC_ASSERT((boost::is_convertible::value)); - BOOST_STATIC_ASSERT((boost::is_convertible::type, - boost::random_access_traversal_tag>::value)); - } - { - typedef boost::indirect_iterator Iter; - STATIC_ASSERT_SAME(Iter::value_type, int); - STATIC_ASSERT_SAME(Iter::reference, const int&); - STATIC_ASSERT_SAME(Iter::pointer, const int*); // (**) - } - { - typedef boost::indirect_iterator Iter; - STATIC_ASSERT_SAME(Iter::value_type, int); - STATIC_ASSERT_SAME(Iter::reference, int&); - STATIC_ASSERT_SAME(Iter::pointer, int*); - } - { - typedef boost::indirect_iterator Iter; - STATIC_ASSERT_SAME(Iter::value_type, int); - STATIC_ASSERT_SAME(Iter::reference, const int&); - STATIC_ASSERT_SAME(Iter::pointer, const int*); // (**) - } - { - typedef boost::indirect_iterator Iter; - STATIC_ASSERT_SAME(Iter::value_type, zow); - STATIC_ASSERT_SAME(Iter::reference, const zow&); // (**) - STATIC_ASSERT_SAME(Iter::pointer, const zow*); // (**) - - STATIC_ASSERT_SAME(Iter::difference_type, std::ptrdiff_t); - - BOOST_STATIC_ASSERT((boost::is_convertible::value)); - BOOST_STATIC_ASSERT((boost::is_convertible::type, - boost::random_access_traversal_tag>::value)); - } - { - typedef boost::indirect_iterator Iter; - STATIC_ASSERT_SAME(Iter::value_type, int); - STATIC_ASSERT_SAME(Iter::reference, long&); - STATIC_ASSERT_SAME(Iter::pointer, int*); - STATIC_ASSERT_SAME(Iter::difference_type, short); - } - return 0; -} diff --git a/libs/iterator/test/indirect_iterator_test.cpp b/libs/iterator/test/indirect_iterator_test.cpp deleted file mode 100644 index c6896736f..000000000 --- a/libs/iterator/test/indirect_iterator_test.cpp +++ /dev/null @@ -1,218 +0,0 @@ -// (C) Copyright Jeremy Siek 1999. -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// Revision History -// 22 Nov 2002 Thomas Witt -// Added interoperability check. -// 08 Mar 2001 Jeremy Siek -// Moved test of indirect iterator into its own file. It to -// to be in iterator_adaptor_test.cpp. - -#include -#include -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include - -#include - -#include -#include -#include - -#if !defined(__SGI_STL_PORT) \ - && (defined(BOOST_MSVC_STD_ITERATOR) \ - || BOOST_WORKAROUND(_CPPLIB_VER, <= 310) \ - || BOOST_WORKAROUND(__GNUC__, <= 2)) - -// std container random-access iterators don't support mutable/const -// interoperability (but may support const/mutable interop). -# define NO_MUTABLE_CONST_STD_SET_ITERATOR_INTEROPERABILITY - -#endif - - -template struct see_type; -template struct see_val; - -struct my_iterator_tag : public std::random_access_iterator_tag { }; - -using boost::dummyT; - -typedef std::vector storage; -typedef std::vector pointer_ra_container; -typedef std::set iterator_set; - -template -struct indirect_iterator_pair_generator -{ - typedef boost::indirect_iterator iterator; - - typedef boost::indirect_iterator< - typename Container::iterator - , typename iterator::value_type const - > const_iterator; -}; - -void more_indirect_iterator_tests() -{ - storage store(1000); - std::generate(store.begin(), store.end(), rand); - - pointer_ra_container ptr_ra_container; - iterator_set iter_set; - - for (storage::iterator p = store.begin(); p != store.end(); ++p) - { - ptr_ra_container.push_back(&*p); - iter_set.insert(p); - } - - typedef indirect_iterator_pair_generator indirect_ra_container; - - indirect_ra_container::iterator db(ptr_ra_container.begin()); - indirect_ra_container::iterator de(ptr_ra_container.end()); - BOOST_TEST(static_cast(de - db) == store.size()); - BOOST_TEST(db + store.size() == de); - indirect_ra_container::const_iterator dci = db; - - BOOST_TEST(dci == db); - -#ifndef NO_MUTABLE_CONST_RA_ITERATOR_INTEROPERABILITY - BOOST_TEST(db == dci); -#endif - - BOOST_TEST(dci != de); - BOOST_TEST(dci < de); - BOOST_TEST(dci <= de); - -#ifndef NO_MUTABLE_CONST_RA_ITERATOR_INTEROPERABILITY - BOOST_TEST(de >= dci); - BOOST_TEST(de > dci); -#endif - - dci = de; - BOOST_TEST(dci == de); - - boost::random_access_iterator_test(db + 1, store.size() - 1, boost::next(store.begin())); - - *db = 999; - BOOST_TEST(store.front() == 999); - - // Borland C++ is getting very confused about the typedefs here - typedef boost::indirect_iterator indirect_set_iterator; - typedef boost::indirect_iterator< - iterator_set::iterator - , iterator_set::iterator::value_type const - > const_indirect_set_iterator; - - indirect_set_iterator sb(iter_set.begin()); - indirect_set_iterator se(iter_set.end()); - const_indirect_set_iterator sci(iter_set.begin()); - BOOST_TEST(sci == sb); - -# ifndef NO_MUTABLE_CONST_STD_SET_ITERATOR_INTEROPERABILITY - BOOST_TEST(se != sci); -# endif - - BOOST_TEST(sci != se); - sci = se; - BOOST_TEST(sci == se); - - *boost::prior(se) = 888; - BOOST_TEST(store.back() == 888); - BOOST_TEST(std::equal(sb, se, store.begin())); - - boost::bidirectional_iterator_test(boost::next(sb), store[1], store[2]); - BOOST_TEST(std::equal(db, de, store.begin())); -} - -// element_type detector; defaults to true so the test passes when -// has_xxx isn't implemented -BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(has_element_type, element_type, true) - -int -main() -{ - dummyT array[] = { dummyT(0), dummyT(1), dummyT(2), - dummyT(3), dummyT(4), dummyT(5) }; - const int N = sizeof(array)/sizeof(dummyT); - -# if BOOST_WORKAROUND(BOOST_MSVC, == 1200) - boost::shared_ptr zz((dummyT*)0); // Why? I don't know, but it suppresses a bad instantiation. -# endif - - typedef std::vector > shared_t; - shared_t shared; - - // Concept checks - { - typedef boost::indirect_iterator iter_t; - - BOOST_STATIC_ASSERT( - has_element_type< - boost::detail::iterator_traits::value_type - >::value - ); - - typedef boost::indirect_iterator< - shared_t::iterator - , boost::iterator_value::type const - > c_iter_t; - -# ifndef NO_MUTABLE_CONST_RA_ITERATOR_INTEROPERABILITY - boost::function_requires< boost_concepts::InteroperableIteratorConcept >(); -# endif - } - - // Test indirect_iterator_generator - { - for (int jj = 0; jj < N; ++jj) - shared.push_back(boost::shared_ptr(new dummyT(jj))); - - dummyT* ptr[N]; - for (int k = 0; k < N; ++k) - ptr[k] = array + k; - - typedef boost::indirect_iterator indirect_iterator; - - typedef boost::indirect_iterator - const_indirect_iterator; - - indirect_iterator i(ptr); - boost::random_access_iterator_test(i, N, array); - - boost::random_access_iterator_test( - boost::indirect_iterator(shared.begin()) - , N, array); - - boost::random_access_iterator_test(boost::make_indirect_iterator(ptr), N, array); - - // check operator-> - assert((*i).m_x == i->foo()); - - const_indirect_iterator j(ptr); - boost::random_access_iterator_test(j, N, array); - - dummyT const*const* const_ptr = ptr; - boost::random_access_iterator_test(boost::make_indirect_iterator(const_ptr), N, array); - - boost::const_nonconst_iterator_test(i, ++j); - - more_indirect_iterator_tests(); - } - return boost::report_errors(); -} diff --git a/libs/iterator/test/interoperable.cpp b/libs/iterator/test/interoperable.cpp deleted file mode 100644 index ba4196a5b..000000000 --- a/libs/iterator/test/interoperable.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright David Abrahams 2004. 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) - -#include -#include -#include -#include - -struct mutable_it : boost::iterator_adaptor -{ - typedef boost::iterator_adaptor super_t; - - mutable_it(); - explicit mutable_it(int* p) : super_t(p) {} - - bool equal(mutable_it const& rhs) const - { - return this->base() == rhs.base(); - } -}; - -struct constant_it : boost::iterator_adaptor -{ - typedef boost::iterator_adaptor super_t; - - constant_it(); - explicit constant_it(int* p) : super_t(p) {} - constant_it(mutable_it const& x) : super_t(x.base()) {} - - bool equal(constant_it const& rhs) const - { - return this->base() == rhs.base(); - } -}; - -int main() -{ - int data[] = { 49, 77 }; - - mutable_it i(data); - constant_it j(data + 1); - BOOST_TEST(i < j); - BOOST_TEST(j > i); - BOOST_TEST(i <= j); - BOOST_TEST(j >= i); - BOOST_TEST(j - i == 1); - BOOST_TEST(i - j == -1); - - constant_it k = i; - - BOOST_TEST(!(i < k)); - BOOST_TEST(!(k > i)); - BOOST_TEST(i <= k); - BOOST_TEST(k >= i); - BOOST_TEST(k - i == 0); - BOOST_TEST(i - k == 0); - - return boost::report_errors(); -} diff --git a/libs/iterator/test/interoperable_fail.cpp b/libs/iterator/test/interoperable_fail.cpp deleted file mode 100644 index d6d249a42..000000000 --- a/libs/iterator/test/interoperable_fail.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright Thomas Witt 2003. -// Distributed under the 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 -#include -#include -#include -#include - -int main() -{ - { - typedef boost::reverse_iterator::iterator> rev_iter; - typedef boost::indirect_iterator::iterator> ind_iter; - - ind_iter() == rev_iter(); - } - - return boost::exit_success; -} diff --git a/libs/iterator/test/is_convertible_fail.cpp b/libs/iterator/test/is_convertible_fail.cpp deleted file mode 100644 index 757b5c6ac..000000000 --- a/libs/iterator/test/is_convertible_fail.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// -// Copyright (c) Thomas Witt 2002. -// -// 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) -// -#include -#include - -int main() -{ - typedef boost::reverse_iterator rev_iter1; - typedef boost::reverse_iterator rev_iter2; - - return boost::is_convertible::value - ? boost::exit_failure : boost::exit_success; -} diff --git a/libs/iterator/test/is_lvalue_iterator.cpp b/libs/iterator/test/is_lvalue_iterator.cpp deleted file mode 100644 index a3f7b6fa4..000000000 --- a/libs/iterator/test/is_lvalue_iterator.cpp +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright David Abrahams 2003. 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) - -#include -#include -#include -#include -#include -#include -#include - -// Last, for BOOST_NO_LVALUE_RETURN_DETECTION -#include - -struct v -{ - v(); - ~v(); -}; - - -struct value_iterator : boost::iterator -{ - v operator*() const; -}; - -struct noncopyable_iterator : boost::iterator -{ - boost::noncopyable const& operator*() const; -}; - -template -struct proxy_iterator - : boost::iterator -{ - typedef T value_type; - -#if BOOST_WORKAROUND(__GNUC__, == 2) - typedef boost::iterator base; - typedef base::iterator_category iterator_category; - typedef base::difference_type difference_type; - typedef base::pointer pointer; - typedef base::reference reference; -#endif - - struct proxy - { - operator value_type&() const; - proxy& operator=(value_type) const; - }; - - proxy operator*() const; -}; - -template -struct lvalue_iterator -{ - typedef T value_type; - typedef T& reference; - typedef T difference_type; - typedef std::input_iterator_tag iterator_category; - typedef T* pointer; - - T& operator*() const; - lvalue_iterator& operator++(); - lvalue_iterator operator++(int); -}; - -template -struct constant_lvalue_iterator -{ - typedef T value_type; - typedef T const& reference; - typedef T difference_type; - typedef std::input_iterator_tag iterator_category; - typedef T const* pointer; - - T const& operator*() const; - constant_lvalue_iterator& operator++(); - constant_lvalue_iterator operator++(int); -}; - - -int main() -{ - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::iterator>::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::const_iterator>::value); - BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator > >::value); - BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator >::value); -#ifndef BOOST_NO_LVALUE_RETURN_DETECTION - BOOST_STATIC_ASSERT(!boost::is_lvalue_iterator::value); -#endif - // Make sure inaccessible copy constructor doesn't prevent - // reference binding - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::value); - - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - - - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator >::value); - - - - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator::value); - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator::iterator>::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator::const_iterator>::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator > >::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); -#ifndef BOOST_NO_LVALUE_RETURN_DETECTION - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator::value); -#endif - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator::value); - - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator >::value); -#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator >::value); -#endif - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator >::value); - - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); - BOOST_STATIC_ASSERT(!boost::is_non_const_lvalue_iterator >::value); - - return 0; -} diff --git a/libs/iterator/test/is_readable_iterator.cpp b/libs/iterator/test/is_readable_iterator.cpp deleted file mode 100644 index ee58089d3..000000000 --- a/libs/iterator/test/is_readable_iterator.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright David Abrahams 2003. 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) - -#include -#include -#include -#include -#include -#include -#include - -// Last, for BOOST_NO_LVALUE_RETURN_DETECTION -#include - -struct v -{ - v(); - ~v(); -}; - - -struct value_iterator : boost::iterator -{ - v operator*() const; -}; - -struct noncopyable_iterator : boost::iterator -{ - boost::noncopyable const& operator*() const; -}; - -struct proxy_iterator : boost::iterator -{ -#if BOOST_WORKAROUND(__GNUC__, == 2) - typedef boost::iterator base; - typedef base::iterator_category iterator_category; - typedef base::value_type value_type; - typedef base::difference_type difference_type; - typedef base::pointer pointer; - typedef base::reference reference; -#endif - - struct proxy - { - operator v&(); - proxy& operator=(v) const; - }; - - proxy operator*() const; -}; - -struct proxy_iterator2 : boost::iterator -{ -#if BOOST_WORKAROUND(__GNUC__, == 2) - typedef boost::iterator base; - typedef base::iterator_category iterator_category; - typedef base::value_type value_type; - typedef base::difference_type difference_type; - typedef base::pointer pointer; - typedef base::reference reference; -#endif - - struct proxy - { - proxy& operator=(v) const; - }; - - proxy operator*() const; -}; - - -int main() -{ - BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); - BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); - BOOST_STATIC_ASSERT(boost::is_readable_iterator::iterator>::value); - BOOST_STATIC_ASSERT(boost::is_readable_iterator::const_iterator>::value); - BOOST_STATIC_ASSERT(!boost::is_readable_iterator > >::value); - BOOST_STATIC_ASSERT(!boost::is_readable_iterator >::value); - BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); - BOOST_STATIC_ASSERT(!boost::is_readable_iterator::value); - BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); - - // Make sure inaccessible copy constructor doesn't prevent - // readability - BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); - - return 0; -} diff --git a/libs/iterator/test/iter_archetype_default_ctor.cpp b/libs/iterator/test/iter_archetype_default_ctor.cpp deleted file mode 100644 index 7936bdd2f..000000000 --- a/libs/iterator/test/iter_archetype_default_ctor.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright Thomas Witt 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) -// -#include - - -int main() -{ - typedef boost::iterator_archetype< - int - , boost::iterator_archetypes::readable_iterator_t - , boost::single_pass_traversal_tag - > iter; - - // single_pass_traversal iterators are not required to be - // default constructible - iter it; -} diff --git a/libs/iterator/test/iterator_adaptor_cc.cpp b/libs/iterator/test/iterator_adaptor_cc.cpp deleted file mode 100644 index 599474c1f..000000000 --- a/libs/iterator/test/iterator_adaptor_cc.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2004 Jeremy Siek -// Distributed under the 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 -#include -#include -#include -#include - -int main() -{ - { - typedef boost::reverse_iterator rev_iter; - typedef boost::reverse_iterator c_rev_iter; - - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::RandomAccessTraversalConcept >(); - boost::function_requires< boost::RandomAccessIteratorConcept >(); - boost::function_requires< boost_concepts::InteroperableIteratorConcept >(); - } - - // Many compilers' builtin container iterators don't interoperate well, though - // STLport fixes that problem. -#if defined(__SGI_STL_PORT) \ - || !BOOST_WORKAROUND(__GNUC__, <= 2) \ - && !(BOOST_WORKAROUND(__GNUC__, == 3) && BOOST_WORKAROUND(__GNUC_MINOR__, <= 1)) \ - && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) \ - && !BOOST_WORKAROUND(__LIBCOMO_VERSION__, BOOST_TESTED_AT(29)) \ - && !BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, <= 1) - { - typedef boost::reverse_iterator::iterator> rev_iter; - typedef boost::reverse_iterator::const_iterator> c_rev_iter; - - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - boost::function_requires< boost::BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::InteroperableIteratorConcept >(); - } -#endif - - return boost::exit_success; -} diff --git a/libs/iterator/test/iterator_adaptor_test.cpp b/libs/iterator/test/iterator_adaptor_test.cpp deleted file mode 100644 index 5b5e0c34e..000000000 --- a/libs/iterator/test/iterator_adaptor_test.cpp +++ /dev/null @@ -1,335 +0,0 @@ -// (C) Copyright Thomas Witt 2003. -// Distributed under the 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. - -#include -#include - -#include -#include -#include - -#include -#if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407) -# include -# include -#endif -#include - -# include - -#include -#include -#include -#include -#include - -#include "static_assert_same.hpp" - -#include - -using boost::dummyT; - -struct mult_functor { - typedef int result_type; - typedef int argument_type; - // Functors used with transform_iterator must be - // DefaultConstructible, as the transform_iterator must be - // DefaultConstructible to satisfy the requirements for - // TrivialIterator. - mult_functor() { } - mult_functor(int aa) : a(aa) { } - int operator()(int b) const { return a * b; } - int a; -}; - -template -struct select1st_ - : public std::unary_function -{ - const typename Pair::first_type& operator()(const Pair& x) const { - return x.first; - } - typename Pair::first_type& operator()(Pair& x) const { - return x.first; - } -}; - -struct one_or_four { - bool operator()(dummyT x) const { - return x.foo() == 1 || x.foo() == 4; - } -}; - -typedef std::deque storage; -typedef std::deque pointer_deque; -typedef std::set iterator_set; - -template struct foo; - -void blah(int) { } - -struct my_gen -{ - typedef int result_type; - my_gen() : n(0) { } - int operator()() { return ++n; } - int n; -}; - -template -struct ptr_iterator - : boost::iterator_adaptor< - ptr_iterator - , V* - , V - , boost::random_access_traversal_tag -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) - , V& -#endif - > -{ -private: - typedef boost::iterator_adaptor< - ptr_iterator - , V* - , V - , boost::random_access_traversal_tag -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) - , V& -#endif - > super_t; - -public: - ptr_iterator() { } - ptr_iterator(V* d) : super_t(d) { } - - template - ptr_iterator( - const ptr_iterator& x - , typename boost::enable_if_convertible::type* = 0 - ) - : super_t(x.base()) - {} -}; - -// Non-functional iterator for category modification checking -template -struct modify_traversal - : boost::iterator_adaptor< - modify_traversal - , Iter - , boost::use_default - , Traversal - > -{}; - -template -struct fwd_iterator - : boost::iterator_adaptor< - fwd_iterator - , boost::forward_iterator_archetype - > -{ -private: - typedef boost::iterator_adaptor< - fwd_iterator - , boost::forward_iterator_archetype - > super_t; - -public: - fwd_iterator() { } - fwd_iterator(boost::forward_iterator_archetype d) : super_t(d) { } -}; - -template -struct in_iterator - : boost::iterator_adaptor< - in_iterator - , boost::input_iterator_archetype_no_proxy - > -{ -private: - typedef boost::iterator_adaptor< - in_iterator - , boost::input_iterator_archetype_no_proxy - > super_t; - -public: - in_iterator() { } - in_iterator(boost::input_iterator_archetype_no_proxy d) : super_t(d) { } -}; - -template -struct constant_iterator - : boost::iterator_adaptor< - constant_iterator - , Iter - , typename std::iterator_traits::value_type const - > -{ - typedef boost::iterator_adaptor< - constant_iterator - , Iter - , typename std::iterator_traits::value_type const - > base_t; - - constant_iterator() {} - constant_iterator(Iter it) - : base_t(it) {} -}; - -char (& traversal2(boost::incrementable_traversal_tag) )[1]; -char (& traversal2(boost::single_pass_traversal_tag ) )[2]; -char (& traversal2(boost::forward_traversal_tag ) )[3]; -char (& traversal2(boost::bidirectional_traversal_tag) )[4]; -char (& traversal2(boost::random_access_traversal_tag) )[5]; - -template -struct traversal3 -{ - static typename boost::iterator_category_to_traversal::type x; - BOOST_STATIC_CONSTANT(std::size_t, value = sizeof(traversal2(x))); - typedef char (&type)[value]; -}; - -template -typename traversal3::type traversal(Cat); - -template -int static_assert_traversal(Iter* = 0, Trav* = 0) -{ - typedef typename boost::iterator_category_to_traversal< - BOOST_DEDUCED_TYPENAME Iter::iterator_category - >::type t2; - - return static_assert_same::value; -} - -int -main() -{ - dummyT array[] = { dummyT(0), dummyT(1), dummyT(2), - dummyT(3), dummyT(4), dummyT(5) }; - const int N = sizeof(array)/sizeof(dummyT); - - // sanity check, if this doesn't pass the test is buggy - boost::random_access_iterator_test(array, N, array); - - // Test the iterator_adaptor - { - ptr_iterator i(array); - boost::random_access_iterator_test(i, N, array); - - ptr_iterator j(array); - boost::random_access_iterator_test(j, N, array); - boost::const_nonconst_iterator_test(i, ++j); - } - - int test; - // Test the iterator_traits - { - // Test computation of defaults - typedef ptr_iterator Iter1; - // don't use std::iterator_traits here to avoid VC++ problems - test = static_assert_same::value; - test = static_assert_same::value; - test = static_assert_same::value; - test = static_assert_same::value; -#if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407) - BOOST_STATIC_ASSERT((boost::is_convertible::value)); -#endif - } - - { - // Test computation of default when the Value is const - typedef ptr_iterator Iter1; - test = static_assert_same::value; - test = static_assert_same::value; - -#if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407) - BOOST_STATIC_ASSERT(boost::is_readable_iterator::value); -# ifndef BOOST_NO_LVALUE_RETURN_DETECTION - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::value); -# endif -#endif - -#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) // borland drops constness - test = static_assert_same::value; -#endif - } - - { - // Test constant iterator idiom - typedef ptr_iterator BaseIter; - typedef constant_iterator Iter; - - test = static_assert_same::value; - test = static_assert_same::value; -#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) // borland drops constness - test = static_assert_same::value; -#endif - -#ifndef BOOST_NO_LVALUE_RETURN_DETECTION - BOOST_STATIC_ASSERT(boost::is_non_const_lvalue_iterator::value); - BOOST_STATIC_ASSERT(boost::is_lvalue_iterator::value); -#endif - - typedef modify_traversal IncrementableIter; - - static_assert_traversal(); - static_assert_traversal(); - } - - // Test the iterator_adaptor - { - ptr_iterator i(array); - boost::random_access_iterator_test(i, N, array); - - ptr_iterator j(array); - boost::random_access_iterator_test(j, N, array); - boost::const_nonconst_iterator_test(i, ++j); - } - - // check operator-> with a forward iterator - { - boost::forward_iterator_archetype forward_iter; - - typedef fwd_iterator adaptor_type; - - adaptor_type i(forward_iter); - int zero = 0; - if (zero) // don't do this, just make sure it compiles - BOOST_TEST((*i).m_x == i->foo()); - } - - // check operator-> with an input iterator - { - boost::input_iterator_archetype_no_proxy input_iter; - typedef in_iterator adaptor_type; - adaptor_type i(input_iter); - int zero = 0; - if (zero) // don't do this, just make sure it compiles - BOOST_TEST((*i).m_x == i->foo()); - } - - // check that base_type is correct - { - // Test constant iterator idiom - typedef ptr_iterator BaseIter; - - test = static_assert_same::value; - test = static_assert_same::base_type,BaseIter>::value; - - typedef modify_traversal IncrementableIter; - - test = static_assert_same::value; - } - - std::cout << "test successful " << std::endl; - (void)test; - return boost::report_errors(); -} diff --git a/libs/iterator/test/iterator_archetype_cc.cpp b/libs/iterator/test/iterator_archetype_cc.cpp deleted file mode 100644 index 580a32ccf..000000000 --- a/libs/iterator/test/iterator_archetype_cc.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// -// Copyright Thomas Witt 2003. -// Distributed under the 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 -#include -#include -#include -#include - -int main() -{ - { - typedef boost::iterator_archetype< - int - , boost::iterator_archetypes::readable_iterator_t - , boost::random_access_traversal_tag - > iter; - - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::RandomAccessTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - int - , boost::iterator_archetypes::readable_writable_iterator_t - , boost::random_access_traversal_tag - > iter; - - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::RandomAccessTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - const int // I don't like adding const to Value. It is redundant. -JGS - , boost::iterator_archetypes::readable_lvalue_iterator_t - , boost::random_access_traversal_tag - > iter; - - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::RandomAccessTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - int - , boost::iterator_archetypes::writable_lvalue_iterator_t - , boost::random_access_traversal_tag - > iter; - - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::RandomAccessTraversalConcept >(); - } - - return boost::exit_success; -} - diff --git a/libs/iterator/test/iterator_facade.cpp b/libs/iterator/test/iterator_facade.cpp deleted file mode 100644 index 9200cc1da..000000000 --- a/libs/iterator/test/iterator_facade.cpp +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright David Abrahams 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) - -// This is really an incomplete test; should be fleshed out. - -#include -#include - -#include -#include -#include -#include - -// This is a really, really limited test so far. All we're doing -// right now is checking that the postfix++ proxy for single-pass -// iterators works properly. -template -class counter_iterator - : public boost::iterator_facade< - counter_iterator - , int const - , boost::single_pass_traversal_tag - , Ref - > -{ - public: - counter_iterator() {} - counter_iterator(int* state) : state(state) {} - - void increment() - { - ++*state; - } - - Ref - dereference() const - { - return *state; - } - - bool equal(counter_iterator const& y) const - { - return *this->state == *y.state; - } - - int* state; -}; - -struct proxy -{ - proxy(int& x) : state(x) {} - - operator int const&() const - { - return state; - } - - int& operator=(int x) { state = x; return state; } - - int& state; -}; - -struct value -{ - void mutator() {} // non-const member function -}; - -struct input_iter - : boost::iterator_facade< - input_iter - , value - , boost::single_pass_traversal_tag - , value - > -{ - public: - input_iter() {} - - void increment() - { - } - value - dereference() const - { - return value(); - } - - bool equal(input_iter const& y) const - { - return false; - } -}; - -template -struct wrapper -{ - T m_x; - explicit wrapper(typename boost::call_traits::param_type x) - : m_x(x) - { } - template - wrapper(const wrapper& other, - typename boost::enable_if< boost::is_convertible >::type* = 0) - : m_x(other.m_x) - { } -}; - -struct iterator_with_proxy_reference - : boost::iterator_facade< - iterator_with_proxy_reference - , wrapper - , boost::incrementable_traversal_tag - , wrapper - > -{ - int& m_x; - explicit iterator_with_proxy_reference(int& x) - : m_x(x) - { } - - void increment() - { } - wrapper dereference() const - { return wrapper(m_x); } -}; - -template -void same_type(U const&) -{ BOOST_MPL_ASSERT((boost::is_same)); } - -template -struct abstract_iterator - : boost::iterator_facade< - abstract_iterator - , A & - // In order to be value type as a reference, traversal category has - // to satisfy least forward traversal. - , boost::forward_traversal_tag - , A & - > -{ - abstract_iterator(I iter) : iter(iter) {} - - void increment() - { ++iter; } - - A & dereference() const - { return *iter; } - - bool equal(abstract_iterator const& y) const - { return iter == y.iter; } - - I iter; -}; - -struct base -{ - virtual void assign(const base &) = 0; - virtual bool equal(const base &) const = 0; -}; - -struct derived : base -{ - derived(int state) : state(state) { } - derived(const derived &d) : state(d.state) { } - derived(const base &b) { derived::assign(b); } - - virtual void assign(const base &b) - { - state = boost::polymorphic_cast(&b)->state; - } - - virtual bool equal(const base &b) const - { - return state == boost::polymorphic_cast(&b)->state; - } - - int state; -}; - -inline bool operator==(const base &lhs, const base &rhs) -{ - return lhs.equal(rhs); -} - -int main() -{ - { - int state = 0; - boost::readable_iterator_test(counter_iterator(&state), 0); - state = 3; - boost::readable_iterator_test(counter_iterator(&state), 3); - boost::writable_iterator_test(counter_iterator(&state), 9, 7); - BOOST_TEST(state == 8); - } - - { - // test for a fix to http://tinyurl.com/zuohe - // These two lines should be equivalent (and both compile) - input_iter p; - (*p).mutator(); - p->mutator(); - - same_type(p.operator->()); - } - - { - int x = 0; - iterator_with_proxy_reference i(x); - BOOST_TEST(x == 0); - BOOST_TEST(i.m_x == 0); - ++(*i).m_x; - BOOST_TEST(x == 1); - BOOST_TEST(i.m_x == 1); - ++i->m_x; - BOOST_TEST(x == 2); - BOOST_TEST(i.m_x == 2); - } - - { - derived d(1); - boost::readable_iterator_test(abstract_iterator(&d), derived(1)); - } - - return boost::report_errors(); -} diff --git a/libs/iterator/test/iterator_traits_test.cpp b/libs/iterator/test/iterator_traits_test.cpp deleted file mode 100644 index 3131d4464..000000000 --- a/libs/iterator/test/iterator_traits_test.cpp +++ /dev/null @@ -1,218 +0,0 @@ -// (C) Copyright David Abrahams 2002. -// Distributed under the 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. - -// Revision History -// 04 Mar 2001 Patches for Intel C++ (Dave Abrahams) -// 19 Feb 2001 Take advantage of improved iterator_traits to do more tests -// on MSVC. Reordered some #ifdefs for coherency. -// (David Abrahams) -// 13 Feb 2001 Test new VC6 workarounds (David Abrahams) -// 11 Feb 2001 Final fixes for Borland (David Abrahams) -// 11 Feb 2001 Some fixes for Borland get it closer on that compiler -// (David Abrahams) -// 07 Feb 2001 More comprehensive testing; factored out static tests for -// better reuse (David Abrahams) -// 21 Jan 2001 Quick fix to my_iterator, which wasn't returning a -// reference type from operator* (David Abrahams) -// 19 Jan 2001 Initial version with iterator operators (David Abrahams) - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// A UDT for which we can specialize std::iterator_traits on -// compilers which don't support partial specialization. There's no -// other reasonable way to test pointers on those compilers. -struct element {}; - -// An iterator for which we can get traits. -struct my_iterator1 - : boost::forward_iterator_helper -{ - my_iterator1(const char* p) : m_p(p) {} - - bool operator==(const my_iterator1& rhs) const - { return this->m_p == rhs.m_p; } - - my_iterator1& operator++() { ++this->m_p; return *this; } - const char& operator*() { return *m_p; } - private: - const char* m_p; -}; - -// Used to prove that we don't require std::iterator<> in the hierarchy under -// MSVC6, and that we can compute all the traits for a standard-conforming UDT -// iterator. -struct my_iterator2 - : boost::equality_comparable > > -{ - typedef char value_type; - typedef long difference_type; - typedef const char* pointer; - typedef const char& reference; - typedef std::forward_iterator_tag iterator_category; - - my_iterator2(const char* p) : m_p(p) {} - - bool operator==(const my_iterator2& rhs) const - { return this->m_p == rhs.m_p; } - - my_iterator2& operator++() { ++this->m_p; return *this; } - const char& operator*() { return *m_p; } - private: - const char* m_p; -}; - -// Used to prove that we're not overly confused by the existence of -// std::iterator<> in the hierarchy under MSVC6 - we should find that -// boost::detail::iterator_traits::difference_type is int. -struct my_iterator3 : my_iterator1 -{ - typedef int difference_type; - my_iterator3(const char* p) - : my_iterator1(p) {} -}; - -// -// Assertion tools. Used instead of BOOST_STATIC_ASSERT because that -// doesn't give us a nice stack backtrace -// -template struct assertion; - -template <> struct assertion -{ - typedef char type; -}; - -template -struct assert_same - : assertion<(::boost::is_same::value)> -{ -}; - - -// Iterator tests -template -struct non_portable_tests -{ - typedef typename boost::detail::iterator_traits::pointer test_pt; - typedef typename boost::detail::iterator_traits::reference test_rt; - typedef typename assert_same::type a1; - typedef typename assert_same::type a2; -}; - -template -struct portable_tests -{ - typedef typename boost::detail::iterator_traits::difference_type test_dt; - typedef typename boost::detail::iterator_traits::iterator_category test_cat; - typedef typename assert_same::type a1; - typedef typename assert_same::type a2; -}; - -// Test iterator_traits -template -struct input_iterator_test - : portable_tests -{ - typedef typename boost::detail::iterator_traits::value_type test_vt; - typedef typename assert_same::type a1; -}; - -template -struct non_pointer_test - : input_iterator_test - , non_portable_tests -{ -}; - -template -struct maybe_pointer_test - : portable_tests - , non_portable_tests -{ -}; - -input_iterator_test, int, std::ptrdiff_t, int*, int&, std::input_iterator_tag> - istream_iterator_test; - -#if BOOST_WORKAROUND(__BORLANDC__, <= 0x564) && !defined(__SGI_STL_PORT) -typedef ::std::char_traits::off_type distance; -non_pointer_test,int, - distance,int*,int&,std::output_iterator_tag> ostream_iterator_test; -#elif defined(BOOST_MSVC_STD_ITERATOR) -non_pointer_test, - int, void, int*, int&, std::output_iterator_tag> - ostream_iterator_test; -#elif BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(70190006)) -non_pointer_test, - int, long, int*, int&, std::output_iterator_tag> - ostream_iterator_test; -#else -non_pointer_test, - void, void, void, void, std::output_iterator_tag> - ostream_iterator_test; -#endif - - -#ifdef __KCC - typedef long std_list_diff_type; -#else - typedef std::ptrdiff_t std_list_diff_type; -#endif - -non_pointer_test::iterator, int, std_list_diff_type, int*, int&, std::bidirectional_iterator_tag> - list_iterator_test; - -maybe_pointer_test::iterator, int, std::ptrdiff_t, int*, int&, std::random_access_iterator_tag> - vector_iterator_test; - -maybe_pointer_test - int_pointer_test; - -non_pointer_test - my_iterator1_test; - -non_pointer_test - my_iterator2_test; - -non_pointer_test - my_iterator3_test; - -int main() -{ - char chars[100]; - int ints[100]; - - for (int length = 3; length < 100; length += length / 3) - { - std::list l(length); - BOOST_TEST(boost::detail::distance(l.begin(), l.end()) == length); - - std::vector v(length); - BOOST_TEST(boost::detail::distance(v.begin(), v.end()) == length); - - BOOST_TEST(boost::detail::distance(&ints[0], ints + length) == length); - BOOST_TEST(boost::detail::distance(my_iterator1(chars), my_iterator1(chars + length)) == length); - BOOST_TEST(boost::detail::distance(my_iterator2(chars), my_iterator2(chars + length)) == length); - BOOST_TEST(boost::detail::distance(my_iterator3(chars), my_iterator3(chars + length)) == length); - } - return boost::report_errors(); -} diff --git a/libs/iterator/test/lvalue_concept_fail.cpp b/libs/iterator/test/lvalue_concept_fail.cpp deleted file mode 100644 index 735bb4ab8..000000000 --- a/libs/iterator/test/lvalue_concept_fail.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2004 Jeremy Siek -// Distributed under the 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 -#include -#include - -int main() -{ - typedef boost::iterator_archetype< - int - , boost::iterator_archetypes::readable_iterator_t - , boost::single_pass_traversal_tag - > Iter; - boost::function_requires< - boost_concepts::LvalueIteratorConcept >(); - return boost::exit_success; -} diff --git a/libs/iterator/test/minimum_category.cpp b/libs/iterator/test/minimum_category.cpp deleted file mode 100644 index 3f89d6c6a..000000000 --- a/libs/iterator/test/minimum_category.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright Andrey Semashev 2014. -// -// 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) - -#include -#include -#include -#include - -using boost::is_same; -using boost::iterators::minimum_category; - -int main(int, char*[]) -{ - BOOST_TEST_TRAIT_TRUE((is_same::type, std::forward_iterator_tag>)); - BOOST_TEST_TRAIT_TRUE((is_same::type, std::forward_iterator_tag>)); - BOOST_TEST_TRAIT_TRUE((is_same::type, std::random_access_iterator_tag>)); - - return boost::report_errors(); -} diff --git a/libs/iterator/test/minimum_category_compile_fail.cpp b/libs/iterator/test/minimum_category_compile_fail.cpp deleted file mode 100644 index 736cc200d..000000000 --- a/libs/iterator/test/minimum_category_compile_fail.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright Andrey Semashev 2014. -// -// 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) - -#include - -using boost::iterators::minimum_category; - -struct A {}; -struct B {}; - -int main(int, char*[]) -{ - minimum_category::type cat; - - return 0; -} diff --git a/libs/iterator/test/permutation_iterator_test.cpp b/libs/iterator/test/permutation_iterator_test.cpp deleted file mode 100644 index 6d1421871..000000000 --- a/libs/iterator/test/permutation_iterator_test.cpp +++ /dev/null @@ -1,103 +0,0 @@ -// (C) Copyright Toon Knapen 2001. -// (C) Copyright Roland Richter 2003. -// Distributed under the 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 -#include - -#include -#include -#include -#include - -#include -#include - -#include - - -// This test checks for convertibility/interoperability among similar -// permutation iterators. We're not using container iterators -// underneath, as in permutation_test, because of bugs in GCC-3.3's -// __normal_iterator that make is_convertible choke when testing -// convertibility. -void iterop_test() -{ - typedef boost::permutation_iterator< double*, int const* > permutation_type; - typedef boost::permutation_iterator< double const*, int const* > permutation_const_type; - - BOOST_CONCEPT_ASSERT(( - boost_concepts::InteroperableIteratorConcept< - permutation_type - , permutation_const_type - >)); -} - -void permutation_test() -{ - // Example taken from documentation of old permutation_iterator. - typedef std::vector< double > element_range_type; - typedef std::list< int > index_type; - - const int element_range_size = 10; - const int index_size = 7; - - BOOST_STATIC_ASSERT(index_size <= element_range_size); - element_range_type elements( element_range_size ); - for( element_range_type::iterator el_it = elements.begin(); el_it != elements.end(); ++el_it ) - { *el_it = std::distance(elements.begin(), el_it); } - - index_type indices( index_size ); - for( index_type::iterator i_it = indices.begin(); i_it != indices.end(); ++i_it ) - { *i_it = element_range_size - index_size + std::distance(indices.begin(), i_it); } - std::reverse( indices.begin(), indices.end() ); - - typedef boost::permutation_iterator< element_range_type::iterator, index_type::iterator > permutation_type; - permutation_type begin = boost::make_permutation_iterator( elements.begin(), indices.begin() ); - permutation_type it = begin; - permutation_type end = boost::make_permutation_iterator( elements.begin(), indices.end() ); - - BOOST_CHECK( it == begin ); - BOOST_CHECK( it != end ); - - BOOST_CHECK( std::distance( begin, end ) == index_size ); - - for( index_type::iterator i_it1 = indices.begin(); it != end; ++i_it1, ++it ) - { - BOOST_CHECK( *it == elements[ *i_it1 ] ); - } - - it = begin; - for( int i1 = 0; i1 < index_size - 1 ; ++++i1, ++++it ) - { - index_type::iterator i_it2 = indices.begin(); - std::advance( i_it2, i1 ); - BOOST_CHECK( *it == elements[ *i_it2 ] ); - } - - it = begin; - std::advance(it, index_size); - for( index_type::iterator i_it3 = indices.end(); it != begin; ) - { - BOOST_CHECK( *--it == elements[ *--i_it3 ] ); - } - - it = begin; - std::advance(it, index_size); - for( int i2 = 0; i2 < index_size - 1; i2+=2, --it ) - { - index_type::iterator i_it4 = --indices.end(); - std::advance( i_it4, -i2 ); - BOOST_CHECK( *--it == elements[ *i_it4 ] ); - } - -} - - -int test_main(int, char *[]) -{ - permutation_test(); - return 0; -} diff --git a/libs/iterator/test/pointee.cpp b/libs/iterator/test/pointee.cpp deleted file mode 100644 index 71d1d04a2..000000000 --- a/libs/iterator/test/pointee.cpp +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright David Abrahams 2004. 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) - -#include -#include -#include "static_assert_same.hpp" -#include -#include - -template -struct proxy_ptr -{ - typedef T element_type; - struct proxy - { - operator Ref() const; - }; - proxy operator*() const; -}; - -template -struct proxy_ref_ptr : proxy_ptr -{ -}; - -template -struct proxy_value_ptr : proxy_ptr -{ - typedef typename boost::add_const::type element_type; -}; - -struct X { - template X(T const&); - template operator T&() const; -}; - - -int main() -{ - STATIC_ASSERT_SAME(boost::pointee >::type, int); - STATIC_ASSERT_SAME(boost::pointee >::type, X); - - STATIC_ASSERT_SAME(boost::pointee >::type, int const); - STATIC_ASSERT_SAME(boost::pointee >::type, X const); - - STATIC_ASSERT_SAME(boost::pointee >::type, int const); - STATIC_ASSERT_SAME(boost::pointee >::type, X const); - - STATIC_ASSERT_SAME(boost::pointee >::type, int const); - STATIC_ASSERT_SAME(boost::pointee >::type, X const); - - STATIC_ASSERT_SAME(boost::pointee::type, int); - STATIC_ASSERT_SAME(boost::pointee::type, int const); - - STATIC_ASSERT_SAME(boost::pointee::type, X); - STATIC_ASSERT_SAME(boost::pointee::type, X const); - - STATIC_ASSERT_SAME(boost::pointee >::type, int); - STATIC_ASSERT_SAME(boost::pointee >::type, X); - - STATIC_ASSERT_SAME(boost::pointee >::type, int const); - STATIC_ASSERT_SAME(boost::pointee >::type, X const); - - STATIC_ASSERT_SAME(boost::pointee::iterator >::type, int); - STATIC_ASSERT_SAME(boost::pointee::iterator >::type, X); - - STATIC_ASSERT_SAME(boost::pointee::const_iterator >::type, int const); - STATIC_ASSERT_SAME(boost::pointee::const_iterator >::type, X const); - return 0; -} diff --git a/libs/iterator/test/reverse_iterator_test.cpp b/libs/iterator/test/reverse_iterator_test.cpp deleted file mode 100644 index 828bdfe01..000000000 --- a/libs/iterator/test/reverse_iterator_test.cpp +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright Thomas Witt 2003, Jeremy Siek 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) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using boost::dummyT; - -// Test reverse iterator -int main() -{ - dummyT array[] = { dummyT(0), dummyT(1), dummyT(2), - dummyT(3), dummyT(4), dummyT(5) }; - const int N = sizeof(array)/sizeof(dummyT); - - // Concept checks - // Adapting old-style iterators - { - typedef boost::reverse_iterator > Iter; - boost::function_requires< boost::BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::reverse_iterator > Iter; - boost::function_requires< boost::Mutable_BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - // Adapting new-style iterators - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_iterator_t - , boost::bidirectional_traversal_tag - > iter; - typedef boost::reverse_iterator Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } -#if 0 - // It does not seem feasible to make this work. Need to change docs to - // require at lease Readable for the base iterator. -Jeremy - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::writable_iterator_t - , boost::bidirectional_traversal_tag - > iter; - typedef boost::reverse_iterator Iter; - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } -#endif -#if !BOOST_WORKAROUND(BOOST_MSVC, == 1200) // Causes Internal Error in linker. - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::readable_writable_iterator_t - , boost::bidirectional_traversal_tag - > iter; - typedef boost::reverse_iterator Iter; - boost::function_requires< boost::InputIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - const dummyT - , boost::iterator_archetypes::readable_lvalue_iterator_t - , boost::bidirectional_traversal_tag - > iter; - typedef boost::reverse_iterator Iter; - boost::function_requires< boost::BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::ReadableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } - { - typedef boost::iterator_archetype< - dummyT - , boost::iterator_archetypes::writable_lvalue_iterator_t - , boost::bidirectional_traversal_tag - > iter; - typedef boost::reverse_iterator Iter; - boost::function_requires< boost::BidirectionalIteratorConcept >(); - boost::function_requires< boost_concepts::WritableIteratorConcept >(); - boost::function_requires< boost_concepts::LvalueIteratorConcept >(); - boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); - } -#endif - - // Test reverse_iterator - { - dummyT reversed[N]; - std::copy(array, array + N, reversed); - std::reverse(reversed, reversed + N); - - typedef boost::reverse_iterator reverse_iterator; - - reverse_iterator i(reversed + N); - boost::random_access_iterator_test(i, N, array); - - boost::random_access_iterator_test(boost::make_reverse_iterator(reversed + N), N, array); - - typedef boost::reverse_iterator const_reverse_iterator; - - const_reverse_iterator j(reversed + N); - boost::random_access_iterator_test(j, N, array); - - const dummyT* const_reversed = reversed; - - boost::random_access_iterator_test(boost::make_reverse_iterator(const_reversed + N), N, array); - - boost::const_nonconst_iterator_test(i, ++j); - } - - // Test reverse_iterator again, with traits fully deducible on all platforms - { - std::deque reversed_container; - std::reverse_copy(array, array + N, std::back_inserter(reversed_container)); - const std::deque::iterator reversed = reversed_container.begin(); - - - typedef boost::reverse_iterator< - std::deque::iterator> reverse_iterator; - typedef boost::reverse_iterator< - std::deque::const_iterator> const_reverse_iterator; - - // MSVC/STLport gives an INTERNAL COMPILER ERROR when any computation - // (e.g. "reversed + N") is used in the constructor below. - const std::deque::iterator finish = reversed_container.end(); - reverse_iterator i(finish); - - boost::random_access_iterator_test(i, N, array); - boost::random_access_iterator_test(boost::make_reverse_iterator(reversed + N), N, array); - - const_reverse_iterator j = reverse_iterator(finish); - boost::random_access_iterator_test(j, N, array); - - const std::deque::const_iterator const_reversed = reversed; - boost::random_access_iterator_test(boost::make_reverse_iterator(const_reversed + N), N, array); - - // Many compilers' builtin deque iterators don't interoperate well, though - // STLport fixes that problem. -#if defined(__SGI_STL_PORT) \ - || !BOOST_WORKAROUND(__GNUC__, <= 2) \ - && !(BOOST_WORKAROUND(__GNUC__, == 3) && BOOST_WORKAROUND(__GNUC_MINOR__, <= 1)) \ - && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) \ - && !BOOST_WORKAROUND(__LIBCOMO_VERSION__, BOOST_TESTED_AT(29)) \ - && !BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, <= 1) - - boost::const_nonconst_iterator_test(i, ++j); - -#endif - } - - return boost::report_errors(); -} diff --git a/libs/iterator/test/static_assert_same.hpp b/libs/iterator/test/static_assert_same.hpp deleted file mode 100644 index 6df0506ba..000000000 --- a/libs/iterator/test/static_assert_same.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright David Abrahams 2003. -// Distributed under the 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 STATIC_ASSERT_SAME_DWA2003530_HPP -# define STATIC_ASSERT_SAME_DWA2003530_HPP - -#include -# include - -#define STATIC_ASSERT_SAME( T1,T2 ) BOOST_MPL_ASSERT((::boost::is_same< T1, T2 >)) - -template -struct static_assert_same -{ - BOOST_MPL_ASSERT((::boost::is_same< T1, T2 >)); - enum { value = 1 }; -}; - -#endif // STATIC_ASSERT_SAME_DWA2003530_HPP diff --git a/libs/iterator/test/transform_iterator_test.cpp b/libs/iterator/test/transform_iterator_test.cpp deleted file mode 100644 index 3caad2aea..000000000 --- a/libs/iterator/test/transform_iterator_test.cpp +++ /dev/null @@ -1,285 +0,0 @@ -// (C) Copyright Jeremy Siek 2002. -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// Revision History -// 22 Nov 2002 Thomas Witt -// Added interoperability check. -// 28 Oct 2002 Jeremy Siek -// Updated for new iterator adaptors. -// 08 Mar 2001 Jeremy Siek -// Moved test of transform iterator into its own file. It to -// to be in iterator_adaptor_test.cpp. - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -namespace boost { namespace detail -{ - template<> struct function_object_result - { - typedef int type; - }; -}} -#endif - -struct mult_functor { - // Functors used with transform_iterator must be - // DefaultConstructible, as the transform_iterator must be - // DefaultConstructible to satisfy the requirements for - // TrivialIterator. - mult_functor() { } - mult_functor(int aa) : a(aa) { } - int operator()(int b) const { return a * b; } - int a; -}; - -struct adaptable_mult_functor - : mult_functor -{ - typedef int result_type; - typedef int argument_type; - // Functors used with transform_iterator must be - // DefaultConstructible, as the transform_iterator must be - // DefaultConstructible to satisfy the requirements for - // TrivialIterator. - adaptable_mult_functor() { } - adaptable_mult_functor(int aa) : mult_functor(aa) { } -}; - - -struct const_select_first -{ - typedef int const& result_type; - - int const& operator()(std::pairconst& p) const - { - return p.first; - } -}; - -struct select_first - : const_select_first // derivation to allow conversions -{ - typedef int& result_type; - - int& operator()(std::pair& p) const - { - return p.first; - } -}; - -struct select_second -{ - typedef int& result_type; - - int& operator()(std::pair& p) const - { - return p.second; - } -}; - -struct value_select_first -{ - typedef int result_type; - - int operator()(std::pairconst& p) const - { - return p.first; - } -}; - -int mult_2(int arg) -{ - return arg*2; -} - -struct polymorphic_mult_functor -{ - //Implement result_of protocol - template struct result; - template struct result {typedef T type;}; - template struct result {typedef T type;}; - template struct result {typedef T type;}; - template struct result {typedef void type;}; - template struct result {typedef void type;}; - template struct result {typedef void type;}; - - template - T operator()(const T& _arg) const {return _arg*2;} - template - void operator()(const T& _arg) { BOOST_ASSERT(0); } -}; - -int -main() -{ - const int N = 10; - - // Concept checks - { - typedef boost::transform_iterator iter_t; - typedef boost::transform_iterator c_iter_t; - - boost::function_requires< boost_concepts::InteroperableIteratorConcept >(); - } - - // Test transform_iterator - { - int x[N], y[N]; - for (int k = 0; k < N; ++k) - x[k] = k; - std::copy(x, x + N, y); - - for (int k2 = 0; k2 < N; ++k2) - x[k2] = x[k2] * 2; - - typedef boost::transform_iterator iter_t; - iter_t i(y, adaptable_mult_functor(2)); - boost::input_iterator_test(i, x[0], x[1]); - boost::input_iterator_test(iter_t(&y[0], adaptable_mult_functor(2)), x[0], x[1]); - - boost::random_access_readable_iterator_test(i, N, x); - } - - // Test transform_iterator non adaptable functor - { - int x[N], y[N]; - for (int k = 0; k < N; ++k) - x[k] = k; - std::copy(x, x + N, y); - - for (int k2 = 0; k2 < N; ++k2) - x[k2] = x[k2] * 2; - - typedef boost::transform_iterator iter_t; - iter_t i(y, mult_functor(2)); - boost::input_iterator_test(i, x[0], x[1]); - boost::input_iterator_test(iter_t(&y[0], mult_functor(2)), x[0], x[1]); - - boost::random_access_readable_iterator_test(i, N, x); - } - - // Test transform_iterator default argument handling - { - { - typedef boost::transform_iterator iter_t; - BOOST_STATIC_ASSERT((boost::is_same::value)); - BOOST_STATIC_ASSERT((boost::is_same::value)); - } - - { - typedef boost::transform_iterator iter_t; - BOOST_STATIC_ASSERT((boost::is_same::value)); - BOOST_STATIC_ASSERT((boost::is_same::value)); - } - - { - typedef boost::transform_iterator iter_t; - BOOST_STATIC_ASSERT((boost::is_same::value)); - BOOST_STATIC_ASSERT((boost::is_same::value)); - } - } - - // Test transform_iterator with function pointers - { - int x[N], y[N]; - for (int k = 0; k < N; ++k) - x[k] = k; - std::copy(x, x + N, y); - - for (int k2 = 0; k2 < N; ++k2) - x[k2] = x[k2] * 2; - - boost::input_iterator_test( - boost::make_transform_iterator(y, mult_2), x[0], x[1]); - - boost::input_iterator_test( - boost::make_transform_iterator(&y[0], mult_2), x[0], x[1]); - - boost::random_access_readable_iterator_test( - boost::make_transform_iterator(y, mult_2), N, x); - - } - - // Test transform_iterator as projection iterator - { - typedef std::pair pair_t; - - int x[N]; - int y[N]; - pair_t values[N]; - - for(int i = 0; i < N; ++i) { - - x[i] = i; - y[i] = N - (i + 1); - - } - - std::copy( - x - , x + N - , boost::make_transform_iterator((pair_t*)values, select_first()) - ); - - std::copy( - y - , y + N - , boost::make_transform_iterator((pair_t*)values, select_second()) - ); - - boost::random_access_readable_iterator_test( - boost::make_transform_iterator((pair_t*)values, value_select_first()) - , N - , x - ); - - boost::random_access_readable_iterator_test( - boost::make_transform_iterator((pair_t*)values, const_select_first()) - , N, x - ); - - boost::constant_lvalue_iterator_test( - boost::make_transform_iterator((pair_t*)values, const_select_first()), x[0]); - - boost::non_const_lvalue_iterator_test( - boost::make_transform_iterator((pair_t*)values, select_first()), x[0], 17); - - boost::const_nonconst_iterator_test( - ++boost::make_transform_iterator((pair_t*)values, select_first()) - , boost::make_transform_iterator((pair_t*)values, const_select_first()) - ); - } - - // Test transform_iterator with polymorphic object function - { - int x[N], y[N]; - for (int k = 0; k < N; ++k) - x[k] = k; - std::copy(x, x + N, y); - - for (int k2 = 0; k2 < N; ++k2) - x[k2] = x[k2] * 2; - - boost::input_iterator_test( - boost::make_transform_iterator(y, polymorphic_mult_functor()), x[0], x[1]); - - boost::input_iterator_test( - boost::make_transform_iterator(&y[0], polymorphic_mult_functor()), x[0], x[1]); - - boost::random_access_readable_iterator_test( - boost::make_transform_iterator(y, polymorphic_mult_functor()), N, x); - } - - return boost::report_errors(); -} diff --git a/libs/iterator/test/unit_tests.cpp b/libs/iterator/test/unit_tests.cpp deleted file mode 100644 index 656e72ffa..000000000 --- a/libs/iterator/test/unit_tests.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright David Abrahams 2003. -// Distributed under the 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 -#include - -#include "static_assert_same.hpp" - -#include - -struct X { int a; }; - - -struct Xiter : boost::iterator_adaptor -{ - Xiter(); - Xiter(X* p) : boost::iterator_adaptor(p) {} -}; - -void take_xptr(X*) {} -void operator_arrow_test() -{ - // check that the operator-> result is a pointer for lvalue iterators - X x; - take_xptr(Xiter(&x).operator->()); -} - -template -struct static_assert_min_cat - : static_assert_same< - typename boost::iterators::minimum_category::type, Min - > -{}; - -void category_test() -{ - using namespace boost::iterators; - using namespace boost::iterators::detail; - - BOOST_STATIC_ASSERT(( - !boost::is_convertible< - std::input_iterator_tag - , input_output_iterator_tag>::value)); - - BOOST_STATIC_ASSERT(( - !boost::is_convertible< - std::output_iterator_tag - , input_output_iterator_tag>::value)); - - BOOST_STATIC_ASSERT(( - boost::is_convertible< - input_output_iterator_tag - , std::input_iterator_tag>::value)); - - BOOST_STATIC_ASSERT(( - boost::is_convertible< - input_output_iterator_tag - , std::output_iterator_tag>::value)); - -#if 0 // This seems wrong; we're not advertising - // input_output_iterator_tag are we? - BOOST_STATIC_ASSERT(( - boost::is_convertible< - std::forward_iterator_tag - , input_output_iterator_tag>::value)); -#endif - - int test = static_assert_min_cat< - std::input_iterator_tag,input_output_iterator_tag, std::input_iterator_tag - >::value; - - test = static_assert_min_cat< - input_output_iterator_tag,std::input_iterator_tag, std::input_iterator_tag - >::value; - -#if 0 - test = static_assert_min_cat< - input_output_iterator_tag,std::forward_iterator_tag, input_output_iterator_tag - >::value; -#endif - - test = static_assert_min_cat< - std::input_iterator_tag,std::forward_iterator_tag, std::input_iterator_tag - >::value; - - test = static_assert_min_cat< - std::input_iterator_tag,std::random_access_iterator_tag, std::input_iterator_tag - >::value; - -#if 0 // This would be wrong: a random access iterator is not - // neccessarily writable, as is an output iterator. - test = static_assert_min_cat< - std::output_iterator_tag,std::random_access_iterator_tag, std::output_iterator_tag - >::value; -#endif - - (void)test; -} - -int main() -{ - category_test(); - operator_arrow_test(); - return 0; -} - diff --git a/libs/iterator/test/zip_iterator_test.cpp b/libs/iterator/test/zip_iterator_test.cpp deleted file mode 100644 index 08c4581e4..000000000 --- a/libs/iterator/test/zip_iterator_test.cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include - -#define ZI_TUPLE boost::tuples::tuple -#define ZI_MAKE_TUPLE boost::make_tuple -#define ZI_TUPLE_GET(n) boost::tuples::get -#define ZI_USE_BOOST_TUPLE - -#include "detail/zip_iterator_test_original.ipp" diff --git a/libs/iterator/test/zip_iterator_test2_fusion_deque.cpp b/libs/iterator/test/zip_iterator_test2_fusion_deque.cpp deleted file mode 100644 index 82d3b78a7..000000000 --- a/libs/iterator/test/zip_iterator_test2_fusion_deque.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include -#include -#include - -#define ZI_TUPLE boost::fusion::deque -#define ZI_MAKE_TUPLE boost::fusion::make_deque -#define ZI_TUPLE_GET(n) boost::fusion::at_c - -#include "detail/zip_iterator_test_original.ipp" diff --git a/libs/iterator/test/zip_iterator_test2_fusion_list.cpp b/libs/iterator/test/zip_iterator_test2_fusion_list.cpp deleted file mode 100644 index d410032e1..000000000 --- a/libs/iterator/test/zip_iterator_test2_fusion_list.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include - -#include -#include -#include - -#define ZI_TUPLE boost::fusion::list -#define ZI_MAKE_TUPLE boost::fusion::make_list -#define ZI_TUPLE_GET(n) boost::fusion::at_c - -#include "detail/zip_iterator_test_original.ipp" diff --git a/libs/iterator/test/zip_iterator_test2_fusion_vector.cpp b/libs/iterator/test/zip_iterator_test2_fusion_vector.cpp deleted file mode 100644 index d9400b023..000000000 --- a/libs/iterator/test/zip_iterator_test2_fusion_vector.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include - -#include -#include -#include - -#define ZI_TUPLE boost::fusion::vector -#define ZI_MAKE_TUPLE boost::fusion::make_vector -#define ZI_TUPLE_GET(n) boost::fusion::at_c - -#include "detail/zip_iterator_test_original.ipp" diff --git a/libs/iterator/test/zip_iterator_test2_std_tuple.cpp b/libs/iterator/test/zip_iterator_test2_std_tuple.cpp deleted file mode 100644 index 60b1b977b..000000000 --- a/libs/iterator/test/zip_iterator_test2_std_tuple.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include - -#if !defined(BOOST_NO_CXX11_HDR_TUPLE) - -#include -#include - -#define ZI_TUPLE std::tuple -#define ZI_MAKE_TUPLE std::make_tuple -#define ZI_TUPLE_GET(n) std::get - -#include "detail/zip_iterator_test_original.ipp" - -#else - -int main() - { - return 0; - } - -#endif diff --git a/libs/iterator/test/zip_iterator_test_fusion.cpp b/libs/iterator/test/zip_iterator_test_fusion.cpp deleted file mode 100644 index 542fd8824..000000000 --- a/libs/iterator/test/zip_iterator_test_fusion.cpp +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2014 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) -// -// See http://www.boost.org for most recent version including documentation. - -#include -#include - -#define TUPLE boost::fusion::vector -#define MAKE_TUPLE boost::fusion::make_vector - -#include "detail/zip_iterator_test.ipp" diff --git a/libs/iterator/test/zip_iterator_test_std_pair.cpp b/libs/iterator/test/zip_iterator_test_std_pair.cpp deleted file mode 100644 index 215777aa1..000000000 --- a/libs/iterator/test/zip_iterator_test_std_pair.cpp +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2014 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) -// -// See http://www.boost.org for most recent version including documentation. - -#include -#include - -#define TUPLE std::pair -#define MAKE_TUPLE std::make_pair - -#include "detail/zip_iterator_test.ipp" - diff --git a/libs/iterator/test/zip_iterator_test_std_tuple.cpp b/libs/iterator/test/zip_iterator_test_std_tuple.cpp deleted file mode 100644 index 02d648d31..000000000 --- a/libs/iterator/test/zip_iterator_test_std_tuple.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2014 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) -// -// See http://www.boost.org for most recent version including documentation. - -#include - -#if !defined(BOOST_NO_CXX11_HDR_TUPLE) && !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) - -#include -#include - -#define TUPLE std::tuple -#define MAKE_TUPLE std::make_tuple - -#include "detail/zip_iterator_test.ipp" - -#else - -int main() -{ - return 0; -} - -#endif - diff --git a/libs/numeric/conversion/doc/Jamfile.v2 b/libs/numeric/conversion/doc/Jamfile.v2 deleted file mode 100644 index 17645d08d..000000000 --- a/libs/numeric/conversion/doc/Jamfile.v2 +++ /dev/null @@ -1,36 +0,0 @@ -# Boost.Numeric/Conversion -# -# Copyright (c) 2004-2007 Fernando Luis Cacciola Carballal -# -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - - -# Quickbook -# ----------------------------------------------------------------------------- - -import quickbook ; - -path-constant images : html ; - - -xml conversion - : - conversion.qbk - ; - -boostbook standalone - : - conversion - : - boost.root=../../../../.. - html.stylesheet=boostbook.css - toc.max.depth=2 - toc.section.depth=2 - chunk.section.depth=1 - pdf:img.src.path=$(images)/ - pdf:boost.url.prefix=http://www.boost.org/doc/libs/release/libs/numeric/conversion/doc/html - ; - - diff --git a/libs/numeric/conversion/doc/bounds.qbk b/libs/numeric/conversion/doc/bounds.qbk deleted file mode 100644 index f2a849cc5..000000000 --- a/libs/numeric/conversion/doc/bounds.qbk +++ /dev/null @@ -1,100 +0,0 @@ -[/ - Boost.Optional - - Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at - http://www.boost.org/LICENSE_1_0.txt) -] - -[section bounds<> traits class] - -[section Introduction] - -To determine the ranges of numeric types with `std::numeric_limits` \[18.2.1\], -different syntax have to be used depending on numeric type. Specifically, -`numeric_limits::min()` for integral types returns the minimum finite value, -whereas for floating point types it returns the minimum positive normalized -value. The difference in semantics makes client code unnecessarily complex -and error prone. - -`boost::numeric::bounds<>` provides a consistent interface for retrieving the -maximum finite value, the minimum finite value and the minimum positive normalized -value (0 for integral types) for numeric types. The selection of implementation -is performed at compile time, so there is no runtime overhead. - -[endsect] - -[section traits class bounds] - - template - struct bounds - { - static N lowest () { return implementation_defined; } - static N highest () { return implementation_defined; } - static N smallest() { return implementation_defined; } - }; - -[heading Members] - - -[: `lowest()` ] - -Returns the minimum finite value, equivalent to `numeric_limits::min()` when `T` -is an integral type, and to `-numeric_limits::max()` when `T` is a floating point type. - -[: `highest()` ] - -Returns the maximum finite value, equivalent to `numeric_limits::max()`. - -[: `smallest()` ] - -Returns the smallest positive normalized value for floating point types with -denormalization, or returns 0 for integral types. - -[endsect] - -[section Examples] - -The following example demonstrates the use of `numeric::bounds<>` and the -equivalent code using `numeric_limits`: - - #include - - #include - #include - - int main() { - - std::cout << "numeric::bounds versus numeric_limits example.\n"; - - std::cout << "The maximum value for float:\n"; - std::cout << boost::numeric::bounds::highest() << "\n"; - std::cout << std::numeric_limits::max() << "\n"; - - std::cout << "The minimum value for float:\n"; - std::cout << boost::numeric::bounds::lowest() << "\n"; - std::cout << -std::numeric_limits::max() << "\n"; - - std::cout << "The smallest positive value for float:\n"; - std::cout << boost::numeric::bounds::smallest() << "\n"; - std::cout << std::numeric_limits::min() << "\n"; - - return 0; - } - - -[endsect] - -[endsect] - - - - - - - - - - diff --git a/libs/numeric/conversion/doc/conversion.qbk b/libs/numeric/conversion/doc/conversion.qbk deleted file mode 100644 index 0a9a7aa1a..000000000 --- a/libs/numeric/conversion/doc/conversion.qbk +++ /dev/null @@ -1,161 +0,0 @@ -[library Boost.NumericConversion - [quickbook 1.4] - [authors [Cacciola Carballal, Fernando Luis]] - [copyright 2004-2007 Fernando Luis Cacciola Carballal] - [category numerics] - [id numeric_conversion] - [dirname numeric_conversion] - [purpose - Optimized Policy-based Numeric Conversions - ] - [source-mode c++] - [license -Distributed under the Boost Software License, Version 1.0. -(See accompanying file LICENSE_1_0.txt or copy at -[@http://www.boost.org/LICENSE_1_0.txt]) - ] -] - -[/ Macros will be used for links so we have a central place to change them ] - - -[/ Cited Boost resources ] - -[def __MPL_INTEGRAL_CONSTANT__ [@../../../../mpl/doc/refmanual/integral-constant.html MPL's Integral Constant] ] - - - -[/ Other web resources ] - -[def __SGI_UNARY_FUNCTION__ [@http://www.sgi.com/tech/stl/UnaryFunction.html Unary Function Object]] - -[/ Icons ] - -[def __NOTE__ [$images/note.png]] -[def __ALERT__ [$images/caution.png]] -[def __DETAIL__ [$images/note.png]] -[def __TIP__ [$images/tip.png]] -[def __QUESTION_MARK__ [$images/question.png]] -[def __SPACE__ [$images/space.png]] -[def __GO_TO__ [$images/callouts/R.png]] - - - - -[section Overview] - -The Boost Numeric Conversion library is a collection of tools to describe and -perform conversions between values of different -[link boost_numericconversion.definitions.numeric_types numeric types]. - -The library includes a special alternative for a subset of `std::numeric_limits<>`, -the [link boost_numericconversion.bounds___traits_class bounds<>] traits class, which provides -a consistent way to obtain the [link boost_numericconversion.definitions.range_and_precision boundary] -values for the [link boost_numericconversion.definitions.range_and_precision range] of a numeric type. - -It also includes a set of [link boost_numericconversion.conversion_traits___traits_class trait classes] -which describes the compile-time -properties of a conversion from a source to a target numeric type. -Both [link boost_numericconversion.definitions.c___arithmetic_types arithmetic] and -[link boost_numericconversion.definitions.numeric_types user-defined numeric types] can be used. - -A policy-based [link boost_numericconversion.converter___function_object converter] object which -uses `conversion_traits` to select -an optimized implementation is supplied. Such implementation uses an optimal -range checking code suitable for the source/target combination. - -* The converter's out-of-range behavior can be customized via an -[link boost_numericconversion.numeric_converter_policy_classes.policy_overflowhandler OverflowHandler] policy. -* For floating-point to integral conversions, the rounding mode can be selected via the -[link boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder Float2IntRounder] policy. -* A custom low-level conversion routine (for UDTs for instance) can be passed via a -[link boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter RawConverter] policy. -* The optimized automatic range-checking logic can be overridden via a -[link boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker UserRangeChecker] policy. - -[endsect] - - - -[include definitions.qbk] -[include converter.qbk] -[include requirements.qbk] -[include bounds.qbk] -[include conversion_traits.qbk] -[include converter_policies.qbk] -[include numeric_cast.qbk] - - - -[section History and Acknowledgments] - - -[heading Pre-formal review] - -* Kevlin Henney, with help from David Abrahams and Beman Dawes, originally contributed -the previous version of `numeric_cast<>` which already presented the idea of a runtime -range check. - -* Later, Eric Ford, Kevin Lynch and the author spotted some genericity problems with -that `numeric_cast<>` which prevented it from being used in a generic layer of math -functions. - -* An improved `numeric_cast<>` which properly handled all combinations of arithmetic -types was presented. - -* David Abrahams and Beman Dawes acknowledged the need of an improved version of -`numeric_cast<>` and supported the submission as originally laid out. Daryl Walker and -Darin Adler made some important comments and proposed fixes to the original submission. - -* Special thanks go to Björn Karlsoon who helped the author considerably. Having found the -problems with `numeric_cast<>` himself, he revised very carefully the original submission -and spot a subtle bug in the range checking implementation. He also wrote part of -this documentation and proof-read and corrected other parts. And most importantly: -the features now presented here in this library evolved from the original submission as -a result of the useful private communications between Björn and the author. - -[heading Post-formal review] - -* Guillaume Melquiond spoted some documentation and code issues, particularly about -rounding conversions. - -* The following people contributed an important review of the design, documentation and c -ode: Kevin Lynch, Thorsten Ottosen, Paul Bristow, Daryle Walker, Jhon Torjo, Eric Ford, -Gennadiy Rozental. - - -[endsect] - -[section Bibliography] - -* Standard Documents: - # ISO/IEC 14882:98 (C++98 Standard) - # ISO/IEC 9899:1999 (C99 Standard) - # ISO/IEC 10967-1 (Language Independent Arithmetic (LIA), Part I, 1994) - # ISO/IEC 2382-1:1993 (Information Technology - Vocabulary - Part I: Fundamental Terms) - # ANSI/IEEE 754-1985 [and IEC 60559:1989] (Binary floating-point) - # ANSI/IEEE 854-1988 (Radix Independent floating-point) - # ANSI X3/TR-1-82 (Dictionary for Information Processing Systems) - # ISO/IEC JTC1/SC22/WG14/N753 C9X Revision Proposal: LIA-1 Binding: Rationale -* Papers: - # David Goldberg What Every Computer Scientist Should Know About Floating-Point Arithmetic - # Prof. William Kahan papers on floating-point. - -[endsect] - - - - - - - - - - - - - - - - - diff --git a/libs/numeric/conversion/doc/conversion_traits.qbk b/libs/numeric/conversion/doc/conversion_traits.qbk deleted file mode 100644 index 520abb0df..000000000 --- a/libs/numeric/conversion/doc/conversion_traits.qbk +++ /dev/null @@ -1,272 +0,0 @@ -[/ - Boost.Optional - - Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at - http://www.boost.org/LICENSE_1_0.txt) -] - -[section conversion_traits<> traits class] - -[section Types] - -[section enumeration int_float_mixture_enum] - - namespace boost { namespace numeric { - - enum int_float_mixture_enum - { - integral_to_integral - ,integral_to_float - ,float_to_integral - ,float_to_float - } ; - - } } // namespace boost::numeric - -[endsect] - -[section enumeration sign_mixture_enum] - - namespace boost { namespace numeric { - - enum sign_mixture_enum - { - unsigned_to_unsigned - ,signed_to_signed - ,signed_to_unsigned - ,unsigned_to_signed - } ; - - } } // namespace boost::numeric - -[endsect] - -[section enumeration udt_builtin_mixture_enum] - - namespace boost { namespace numeric { - - enum udt_builtin_mixture_enum - { - builtin_to_builtin - ,builtin_to_udt - ,udt_to_builtin - ,udt_to_udt - } ; - - } } // namespace boost::numeric - -[endsect] - -[section template class int_float_mixture<>] - - namespace boost { namespace numeric { - - template - struct int_float_mixture : mpl::integral_c {} ; - - } } // namespace boost::numeric - -Classifying `S` and `T` as either integral or float, this __MPL_INTEGRAL_CONSTANT__ -indicates the combination of these attributes. - -Its `::value` is of enumeration type -[link boost_numericconversion.conversion_traits___traits_class.types.enumeration_int_float_mixture_enum `boost::numeric::int_float_mixture_enum`] - -[endsect] - -[section template class sign_mixture<>] - - namespace boost { namespace numeric { - - template - struct sign_mixture : mpl::integral_c {} ; - - } } // namespace boost::numeric - -Classifying `S` and `T` as either signed or unsigned, this __MPL_INTEGRAL_CONSTANT__ -indicates the combination of these attributes. - -Its `::value` is of enumeration type -[link boost_numericconversion.conversion_traits___traits_class.types.enumeration_sign_mixture_enum `boost::numeric::sign_mixture_enum`] - -[endsect] - -[section template class udt_builtin_mixture<>] - - namespace boost { namespace numeric { - - template - struct udt_builtin_mixture : mpl::integral_c {} ; - - } } // namespace boost::numeric - -Classifying `S` and `T` as either user-defined or builtin, this __MPL_INTEGRAL_CONSTANT__ -indicates the combination of these attributes. - -Its `::value` is of enumeration type -[link boost_numericconversion.conversion_traits___traits_class.types.enumeration_udt_builtin_mixture_enum `boost::numeric::udt_builtin_mixture_enum`] - -[endsect] - -[section template class is_subranged<>] - - namespace boost { namespace numeric { - - template - struct is_subranged : mpl::bool_ {} ; - - } } // namespace boost::numeric - -Indicates if the range of the target type `T` is a subset of the range of the source -type `S`. That is: if there are some source values which fall out of the -Target type's range. - -It is a boolean __MPL_INTEGRAL_CONSTANT__. - -It does not indicate if a particular conversion is effectively out of range; -it indicates that some conversion might be out of range because not all the -source values are representable as Target type. - -[endsect] - -[section template class conversion_traits<>] - - namespace boost { namespace numeric { - - template - struct conversion_traits - { - mpl::integral_c int_float_mixture ; - mpl::integral_c sign_mixture; - mpl::integral_c udt_builtin_mixture ; - - mpl::bool_<...> subranged ; - mpl::bool_<...> trivial ; - - typedef T target_type ; - typedef S source_type ; - typedef ... argument_type ; - typedef ... result_type ; - typedef ... supertype ; - typedef ... subtype ; - } ; - - } } // namespace numeric, namespace boost - - -This traits class indicates some properties of a ['numeric conversion] direction: -from a source type `S` to a target type `T`. It does not indicate the properties -of a ['specific] conversion, but of the conversion direction. See -[link boost_numericconversion.definitions.subranged_conversion_direction__subtype_and_supertype Definitions] for details. - -The traits class provides the following __MPL_INTEGRAL_CONSTANT__\s of enumeration -type. They express the combination of certain attributes of the Source and -Target types (thus they are call mixture): - -[table -[[ ][ ]] -[[[*int_float_mixture ]][ -Same as given by the traits class -[link boost_numericconversion.conversion_traits___traits_class.types.template_class_int_float_mixture__ int_float_mixture] -]] -[[[*sign_mixture ]][ -Same as given by the traits class -[link boost_numericconversion.conversion_traits___traits_class.types.template_class_sign_mixture__ sign_mixture] -]] -[[[*udt_builtin_mixture ]] -[Same as given by the traits class -[link boost_numericconversion.conversion_traits___traits_class.types.template_class_udt_builtin_mixture__ udt_builtin_mixture] -]] -] - -The traits class provides the following __MPL_INTEGRAL_CONSTANT__\s of boolean type -which indicates indirectly the relation between the Source and Target ranges -(see [link boost_numericconversion.definitions.range_and_precision Definitions] for details). - -[table -[[ ][ ]] -[[subranged ][ -Same as given by [link boost_numericconversion.conversion_traits___traits_class.types.template_class_is_subranged__ is_subranged] -]] -[[trivial][ -Indicates if both Source and Target, [_without cv-qualifications], are the same type. - -Its `::value` is of boolean type. -]] -] - -The traits class provides the following types. They are the Source and Target types classified -and qualified for different purposes. - - -[table -[[ ][ ]] -[[[*target_type]][ -The template parameter `T` without cv-qualifications -]] -[[[*source_type]][ -The template parameter `S` without cv-qualifications -]] -[[[*argument_type]][ -This type is either source_type or `source_type const&`. - -It represents the optimal argument type for the -[link boost_numericconversion.converter___function_object converter] member functions. - -If S is a built-in type, this is `source_type`, otherwise, this is `source_type const&`. -]] -[[[*result_type]][ -This type is either target_type or target_type const& - -It represents the return type of the -[link boost_numericconversion.converter___function_object converter] member functions. - -If `T==S`, it is `target_type const&`, otherwise, it is `target_type`. -]] -[[[*supertype]][ -If the conversion is subranged, it is `source_type`, otherwise, it is `target_type` -]] -[[[*subtype]][ -If the conversion is subranged, it is `target_type`, otherwise, it is `source_type` -]] -] - -[endsect] - -[endsect] - -[section Examples] - - #include - #include - #include - - int main() - { - - // A trivial conversion. - typedef boost::numeric::conversion_traits Short2Short_Traits ; - assert ( Short2Short_Traits::trivial::value ) ; - - // A subranged conversion. - typedef boost::numeric::conversion_traits UInt2Double_Traits ; - assert ( UInt2Double_Traits::int_float_mixture::value == boost::numeric::integral_to_float ) ; - assert ( UInt2Double_Traits::sign_mixture::value == boost::numeric::unsigned_to_signed ) ; - assert ( !UInt2Double_Traits::subranged::value ) ; - assert ( typeid(UInt2Double_Traits::supertype) == typeid(double) ) ; - assert ( typeid(UInt2Double_Traits::subtype) == typeid(unsigned int) ) ; - - // A doubly subranged conversion. - assert ( (boost::numeric::conversion_traits::subranged::value) ); - assert ( (boost::numeric::conversion_traits::subranged::value) ); - - return 0; - } - -[endsect] - -[endsect] - diff --git a/libs/numeric/conversion/doc/converter.qbk b/libs/numeric/conversion/doc/converter.qbk deleted file mode 100644 index 192268917..000000000 --- a/libs/numeric/conversion/doc/converter.qbk +++ /dev/null @@ -1,293 +0,0 @@ -[/ - Boost.Optional - - Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at - http://www.boost.org/LICENSE_1_0.txt) -] - -[section converter<> function object] - -[section Synopsis] - - namespace boost { namespace numeric { - - - template - class OverflowHandler = def_overflow_handler, - class Float2IntRounder = Trunc< typename Traits::source_type >, - class RawConverter = raw_converter, - class UserRangeChecker = UseInternalRangeChecker - > - struct converter - { - typedef Traits traits ; - - typedef typename Traits::source_type source_type ; - typedef typename Traits::argument_type argument_type ; - typedef typename Traits::result_type result_type ; - - static result_type convert ( argument_type s ) ; - - result_type operator() ( argument_type s ) const ; - - // Internal member functions: - - static range_check_result out_of_range ( argument_type s ) ; - static void validate_range ( argument_type s ) ; - static result_type low_level_convert ( argument_type s ) ; - static source_type nearbyint ( argument_type s ) ; - - } ; - - } } // namespace numeric, boost - - -`boost::numeric::converter<>` is a __SGI_UNARY_FUNCTION__ encapsulating -the code to perform a numeric conversion with the direction and -properties specified by the Traits template parameter. It can optionally -take some [link boost_numericconversion.numeric_converter_policy_classes policies] which can be used to customize its behavior. The -`Traits` parameter is not a policy but the parameter that defines -the conversion. - -[endsect] - -[section Template parameters] - -[table -[[ ][ ]] -[[`T`][ -The [link boost_numericconversion.definitions.numeric_types Numeric Type] -which is the ['Target] of the conversion. -]] -[[`S`][ -The [link boost_numericconversion.definitions.numeric_types Numeric Type] -which is the ['Source] of the conversion. -]] -[[`Traits`][ -This must be a conversion traits class with the interface of -[link boost_numericconversion.conversion_traits___traits_class `boost::numeric::conversion_traits`] -]] -[[`OverflowHandler`][ -[*Stateless Policy] called to administrate the result of the range checking. - -It is a [*Function Object] which receives the result of `out_of_range()` -and is called inside the `validate_range()` static member function exposed -by the converter. -]] -[[`Float2IntRounder`][ -[*Stateless Policy] which specifies the rounding mode used for float to -integral conversions. - -It supplies the `nearbyint()` static member function exposed by the converter. -]] -[[`RawConverter`][ -[*Stateless Policy] which is used to perform the actual conversion. - -It supplies the `low_level_convert()` static member function exposed -by the converter. -]] -[[`UserRangeChecker`][ -['Special and Optional] [*Stateless Policy] which can be used to override -the internal range checking logic. - -If given, supplies alternative code for the `out_of_range()` and -`validate_range()` static member functions exposed by the converter. -]] -] - -[endsect] - -[section Member functions] - -[: `static result_type converter<>::convert ( argument_type s ) ; // throw -`] - -This static member function converts an rvalue of type `source_type` to -an rvalue of type `target_type`. - -If the conversion requires it, it performs a range checking before the conversion -and passes the result of the check to the overflow handler policy (the default -policy throws an exception if out-of-range is detected) - -The implementation of this function is actually built from the policies and is -basically as follows: - - result_type converter<>::convert ( argument_type s ) - { - validate_range(s); // Implemented by the internal range checking logic - // (which also calls the OverflowHandler policy) - // or externally supplied by the UserRangeChecker policy. - - s = nearbyint(s); // Externally supplied by the Float2IntRounder policy. - // NOTE: This is actually called only for float to int conversions. - - return low_level_convert(s); // Externally supplied by the RawConverter policy. - } - -`converter<>::operator() const` just calls `convert()` - -__SPACE__ - -[: `static range_check_result numeric_converter<>::out_of_range ( argument_type s ) ;`] - -This [link numeric_conversion_converter_internal internal] static member function -determines if the value `s` can be -represented by the target type without overflow. - -It does not determine if the conversion is ['exact]; that is, it does not detect -['inexact] conversions, only ['out-of-range] conversions (see the -[link boost_numericconversion.definitions.exact__correctly_rounded_and_out_of_range_representations Definitions] for further details). - -The return value is of enum type -[link boost_numericconversion.numeric_converter_policy_classes.enum_range_check_result `boost::numeric::range_check_result`] - -The actual code for the range checking logic is optimized for the combined -properties of the source and target types. For example, a non-subranged -conversion (i.e: `int`->`float`), requires no range checking, so `out_of_range()` -returns `cInRange` directly. See the following -[link boost_numericconversion.converter___function_object.range_checking_logic table] for more details. - -If the user supplied a -[link boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker UserRangeChecker] policy, -is this policy which implements this function, so the implementation is user -defined, although it is expected to perform the same conceptual check and -return the appropriate result. - -__SPACE__ - -[: `static void numeric_converter<>::validate_range ( argument_type s ) ; // no throw -`] - -This [link numeric_conversion_converter_internal internal] static member function -calls out_of_range(s), and passes the -result to the [link boost_numericconversion.numeric_converter_policy_classes.policy_overflowhandler OverflowHandler] -policy class. - -For those Target/Source combinations which don't require range checking, this -is an empty inline function. - -If the user supplied a -[link boost_numericconversion.numeric_converter_policy_classes.policy_userrangechecker UserRangeChecker] policy, -is this policy which implements this function, so the implementation is user -defined, although it is expected to perform the same action as the default. -In particular, it is expected to pass the result of the check to the overflow handler. - -__SPACE__ - -[: `static result_type numeric_converter<>::low_level_convert ( argument_type s ) ;` ] - -This [link numeric_conversion_converter_internal internal] static member function -performs the actual conversion. - -This function is externally supplied by the -[link boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter RawConverter] policy class. - -__SPACE__ - -[: `static source_type converter<>::nearbyint ( argument_type s ) ;`] - -This [link numeric_conversion_converter_internal internal] static member function, -which is [_only used] for -`float` to `int` conversions, returns an ['integer] value of ['[_floating-point -type]] according to some rounding direction. - -This function is externally supplied by the -[link boost_numericconversion.numeric_converter_policy_classes.policy_float2introunder Float2IntRounder] policy class -which encapsulates the specific rounding mode. - -__SPACE__ - -[#numeric_conversion_converter_internal] - -[heading Internal Member Functions] - -These static member functions build the actual conversion code used by `convert()`. -The user does not have to call these if calling `convert()`, since `convert()` calls -them infernally, but they can be called separately for specific needs. - -[endsect] - -[section Range Checking Logic] - -The following table summarizes the internal range checking logic performed for -each combination of the properties of Source and Target. - -LowestT/HighestT denotes the highest and lowest values of the Target type, respectively. - -`S(n)` is short for `static_cast(n)` (`S` denotes the Source type). - -`NONE` indicates that for this case there is no range checking. - -[pre -[^ -int_to_int |--> sig_to_sig |--> subranged |--> ( s >= S(LowestT) ) && ( s <= S(HighestT) ) - | |--> not subranged |--> NONE - | - |--> unsig_to_unsig |--> subranged |--> ( s >= S(LowestT) ) && ( s <= S(HighestT) ) - | |--> not subranged |--> NONE - | - |--> sig_to_unsig |--> pos subranged |--> ( s >= S(0) ) && ( s <= S(HighestT) ) - | |--> not pos subranged |--> ( s >= S(0) ) - | - |--> unsig_to_sig |--> subranged |--> ( s <= S(HighestT) ) - | |--> not subranged |--> NONE -] -[^ -int_to_float |--> NONE -] -[^ -float_to_int |--> round_to_zero |--> ( s > S(LowestT)-S(1) ) && ( s < S(HighestT)+S(1) ) - |--> round_to_even_nearest |--> ( s >= S(LowestT)-S(0.5) ) && ( s < S(HighestT)+S(0.5) ) - |--> round_to_infinity |--> ( s > S(LowestT)-S(1) ) && ( s <= S(HighestT) ) - |--> round_to_neg_infinity |--> ( s >= S(LowestT) ) && ( s < S(HighestT)+S(1) ) -] -[^ -float_to_float |--> subranged |--> ( s >= S(LowestT) ) && ( s <= S(HighestT) ) - |--> not subranged |--> NONE -] -] - - - -[endsect] - -[section Examples] - - #include - #include - - int main() { - - typedef boost::numeric::converter Double2Int ; - - int x = Double2Int::convert(2.0); - assert ( x == 2 ); - - int y = Double2Int()(3.14); // As a function object. - assert ( y == 3 ) ; // The default rounding is trunc. - - try - { - double m = boost::numeric::bounds::highest(); - int z = Double2Int::convert(m); // By default throws positive_overflow() - } - catch ( boost::numeric::positive_overflow const& ) - { - } - - return 0; - } - -[endsect] - -[endsect] - - - - - diff --git a/libs/numeric/conversion/doc/converter_policies.qbk b/libs/numeric/conversion/doc/converter_policies.qbk deleted file mode 100644 index 062ee4fb6..000000000 --- a/libs/numeric/conversion/doc/converter_policies.qbk +++ /dev/null @@ -1,311 +0,0 @@ -[/ - Boost.Optional - - Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at - http://www.boost.org/LICENSE_1_0.txt) -] - -[section Numeric Converter Policy Classes] - - -[section enum range_check_result] - - namespace boost { namespace numeric { - - enum range_check_result - { - cInRange , - cNegOverflow , - cPosOverflow - } ; - - } } - -Defines the values returned by `boost::numeric::converter<>::out_of_range()` - -[endsect] - -[section Policy OverflowHandler] - -This ['stateless] non-template policy class must be a ['function object] and is -called to administrate the result of the range checking. It can throw an exception -if overflow has been detected by the range checking as indicated by its argument. -If it throws, is is recommended that it be `std::bad_cast` or derived. - -It must have the following interface (it does not has to be a template class): - - struct YourOverflowHandlerPolicy - { - void operator() ( boost::range_check_result ) ; // throw bad_cast or derived - } ; - -It is called with the result of the converter's `out_of_range()` inside `validate_range()`. - -These are the two overflow handler classes provided by the library: - - namespace boost { namespace numeric { - - struct def_overflow_handler - { - void operator() ( range_check_result r ) // throw bad_numeric_conversion derived - { - if ( r == cNegOverflow ) - throw negative_overflow() ; - else if ( r == cPosOverflow ) - throw positive_overflow() ; - } - } ; - - struct silent_overflow_handler - { - void operator() ( range_check_result ) // no-throw - {} - } ; - - } } - -And these are the Exception Classes thrown by the default overflow handler -[link numeric_conversion_policy_overflow_handler_important_note (see IMPORTANT note)] - - namespace boost { namespace numeric { - - ``[#numeric_conversion_bad_numeric_cast]`` - class bad_numeric_cast : public std::bad_cast - { - public: - virtual const char *what() const // throw() - { - return "bad numeric conversion: overflow"; - } - - }; - - ``[#numeric_conversion_negative_overflow]`` - class negative_overflow : public bad_numeric_cast - { - public: - virtual const char *what() const // throw() - { - return "bad numeric conversion: negative overflow"; - } - }; - - ``[#numeric_conversion_possitive_overflow]`` - class positive_overflow : public bad_numeric_cast - { - public: - virtual const char *what() const // throw() - { - return "bad numeric conversion: positive overflow"; - } - }; - - - } } - -[#numeric_conversion_policy_overflow_handler_important_note] - -[important [*RELEASE NOTE for 1.33] -Previous to boost version 1.33, the exception class `bad_numeric_cast` was -named `bad_numeric_conversion`. However, in 1.33, the old function -`numeric_cast<>` from `boost/cast.hpp` was completly replaced by the -new `numeric_cast<>` in `boost/numeric/conversion/cast.hpp` -(and `boost/cast.hpp` is including `boost/numeric/conversion/cast.hpp` now). -That old function which existed in boost for quite some time used the -`bad_numeric_cast` as its exception type so I decided to avoid backward -compatibility problems by adopting it (guessing that the user base for -the old code is wider than for the new code). -] - -[endsect] - -[section Policy Float2IntRounder] - -This ['stateless] template policy class specifies the rounding mode used -for [_float to integral] conversions. It supplies the `nearbyint()` -static member function exposed by the converter, which means that it -[_publicly inherits from this policy]. - -The policy must have the following interface: - - template - struct YourFloat2IntRounderPolicy - { - typedef S source_type ; - typedef {S or S const&} argument_type ; - - static source_type nearbyint ( argument_type s ) { ... } - - typedef mpl::integral_c round_style ; - - } ; - -These are the rounder classes provided by the library (only the specific parts are shown, -see the general policy form above) - -[note -These classes are not intended to be general purpose rounding functions -but specific policies for `converter<>`. This is why they are not function objects. -] - - namespace boost { namespace numeric { - - - template - struct Trunc - { - static source_type nearbyint ( argument_type s ) - { - using std::floor ; - using std::ceil ; - - return s >= static_cast(0) ? floor(s) : ceil(s) ; - } - - typedef mpl::integral_c round_style ; - } ; - - - template - struct RoundEven - { - static source_type nearbyint ( argument_type s ) - { - return impl-defined-value ; - } - - typedef mpl::integral_c round_style ; - } ; - - - template - struct Ceil - { - static source_type nearbyint ( argument_type s ) - { - using std::ceil ; - return ceil(s) ; - } - - typedef mpl::integral_c round_style ; - } ; - - - template - struct Floor - { - static source_type nearbyint ( argument_type s ) - { - using std::floor ; - return floor(s) ; - } - typedef mpl::integral_c round_style ; - } ; - - } } // namespace numeric, namespace boost - -[heading Math Functions used by the rounder policies] - -The rounder policies supplied by this header use math functions `floor()` and `ceil()`. -The standard versions of these functions are introduced in context by a using directive, -so in normal conditions, the standard functions will be used. - -However, if there are other visible corresponding overloads an ambiguity could arise. -In this case, the user can supply her own rounder policy which could, for instance, -use a fully qualified call. - -This technique allows the default rounder policies to be used directly with -user defined types. The user only requires that suitable overloads of `floor()` and `ceil()` -be visible. See also [link boost_numericconversion.type_requirements_and_user_defined_types_support User Defined Numeric Types] -support. - -[endsect] - -[section Policy RawConverter] - -This ['stateless] template policy class is used to perform the -actual conversion from Source to Target. It supplies the -`low_level_convert()` static member function exposed by the -converter, which means that it publicly inherits from this policy. - -The policy must have the following interface: - - template - struct YourRawConverterPolicy - { - typedef typename Traits::result_type result_type ; - typedef typename Traits::argument_type argument_type ; - - static result_type low_level_convert ( argument_type s ) { return ; } - } ; - - -This policy is mostly provided as a hook for user defined types which don't support `static_cast<>` conversions to some types - -This is the only raw converter policy class provided by the library: - - namespace boost { namespace numeric { - - template - struct raw_numeric_converter - { - typedef typename Traits::result_type result_type ; - typedef typename Traits::argument_type argument_type ; - - static result_type low_level_convert ( argument_type s ) - { - return static_cast(s) ; - } - } ; - - } } - -[endsect] - -[section Policy UserRangeChecker] - -This ['stateless] template policy class is used [_only if supplied] -to [*override] the internal range checking logic. - -It supplies the `validate_range()` static member function -exposed by the converter, which means that it publicly inherits -from this policy. - -The policy must have the following interface: - - template - struct YourRangeCheckerPolicy - { - typedef typename Traits::argument_type argument_type ; - - // Determines if the value 's' fits in the range of the Target type. - static range_check_result out_of_range ( argument_type s ) ; - - // Checks whether the value 's' is out_of_range() - // and passes the result of the check to the OverflowHandler policy. - static void validate_range ( argument_type s ) - { - OverflowHandler()( out_of_range(s) ) ; - } - } ; - - -This policy is [*only] provided as a hook for user defined types which require -range checking (which is disabled by default when a UDT is involved). -The library provides a class: `UseInternalRangeChecker{}`; which is a ['fake] -`RangeChecker` policy used to signal the converter to use its internal -range checking implementation. - -[endsect] - -[endsect] - - - - - - - diff --git a/libs/numeric/conversion/doc/definitions.qbk b/libs/numeric/conversion/doc/definitions.qbk deleted file mode 100644 index 742d0afac..000000000 --- a/libs/numeric/conversion/doc/definitions.qbk +++ /dev/null @@ -1,550 +0,0 @@ -[/ - Boost.Optional - - Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at - http://www.boost.org/LICENSE_1_0.txt) -] - - -[section Definitions] - -[section Introduction] - -This section provides definitions of terms used in the Numeric Conversion library. - -[blurb [*Notation] -[_underlined text] denotes terms defined in the C++ standard. - -[*bold face] denotes terms defined here but not in the standard. -] - -[endsect] - -[section Types and Values] - -As defined by the [_C++ Object Model] (§1.7) the [_storage] or memory on which a -C++ program runs is a contiguous sequence of [_bytes] where each byte is a -contiguous sequence of bits. - -An [_object] is a region of storage (§1.8) and has a type (§3.9). - -A [_type] is a discrete set of values. - -An object of type `T` has an [_object representation] which is the sequence of -bytes stored in the object (§3.9/4) - -An object of type `T` has a [_value representation] which is the set of -bits that determine the ['value] of an object of that type (§3.9/4). -For [_POD] types (§3.9/10), this bitset is given by the object representation, -but not all the bits in the storage need to participate in the value -representation (except for character types): for example, some bits might -be used for padding or there may be trap-bits. - -__SPACE__ - -The [*typed value] that is held by an object is the value which is determined -by its value representation. - -An [*abstract value] (untyped) is the conceptual information that is -represented in a type (i.e. the number π). - -The [*intrinsic value] of an object is the binary value of the sequence of -unsigned characters which form its object representation. - -__SPACE__ - -['Abstract] values can be [*represented] in a given type. - -To [*represent] an abstract value `V` in a type `T` is to obtain a typed value -`v` which corresponds to the abstract value `V`. - -The operation is denoted using the `rep()` operator, as in: `v=rep(V)`. -`v` is the [*representation] of `V` in the type `T`. - -For example, the abstract value π can be represented in the type -`double` as the `double value M_PI` and in the type `int` as the -`int value 3` - -__SPACE__ - -Conversely, ['typed values] can be [*abstracted]. - -To [*abstract] a typed value `v` of type `T` is to obtain the abstract value `V` -whose representation in `T` is `v`. - -The operation is denoted using the `abt()` operator, as in: `V=abt(v)`. - -`V` is the [*abstraction] of `v` of type `T`. - -Abstraction is just an abstract operation (you can't do it); but it is -defined nevertheless because it will be used to give the definitions in the -rest of this document. - -[endsect] - -[section C++ Arithmetic Types] - -The C++ language defines [_fundamental types] (§3.9.1). The following subsets of -the fundamental types are intended to represent ['numbers]: - -[variablelist -[[[_signed integer types] (§3.9.1/2):][ -`{signed char, signed short int, signed int, signed long int}` -Can be used to represent general integer numbers (both negative and positive). -]] -[[[_unsigned integer types] (§3.9.1/3):][ -`{unsigned char, unsigned short int, unsigned int, unsigned long int}` -Can be used to represent positive integer numbers with modulo-arithmetic. -]] -[[[_floating-point types] (§3.9.1/8):][ -`{float,double,long double}` -Can be used to represent real numbers. -]] -[[[_integral or integer types] (§3.9.1/7):][ -`{{signed integers},{unsigned integers}, bool, char and wchar_t}` -]] -[[[_arithmetic types] (§3.9.1/8):][ -`{{integer types},{floating types}}` -]] -] - -The integer types are required to have a ['binary] value representation. - -Additionally, the signed/unsigned integer types of the same base type -(`short`, `int` or `long`) are required to have the same value representation, -that is: - - int i = -3 ; // suppose value representation is: 10011 (sign bit + 4 magnitude bits) - unsigned int u = i ; // u is required to have the same 10011 as its value representation. - -In other words, the integer types signed/unsigned X use the same value -representation but a different ['interpretation] of it; that is, their -['typed values] might differ. - -Another consequence of this is that the range for signed X is always a smaller -subset of the range of unsigned X, as required by §3.9.1/3. - -[note -Always remember that unsigned types, unlike signed types, have modulo-arithmetic; -that is, they do not overflow. -This means that: - -[*-] Always be extra careful when mixing signed/unsigned types - -[*-] Use unsigned types only when you need modulo arithmetic or very very large -numbers. Don't use unsigned types just because you intend to deal with -positive values only (you can do this with signed types as well). -] - - -[endsect] - -[section Numeric Types] - -This section introduces the following definitions intended to integrate -arithmetic types with user-defined types which behave like numbers. -Some definitions are purposely broad in order to include a vast variety of -user-defined number types. - -Within this library, the term ['number] refers to an abstract numeric value. - -A type is [*numeric] if: - -* It is an arithmetic type, or, -* It is a user-defined type which - * Represents numeric abstract values (i.e. numbers). - * Can be converted (either implicitly or explicitly) to/from at least one arithmetic type. - * Has [link boost_numericconversion.definitions.range_and_precision range] (possibly unbounded) - and [link boost_numericconversion.definitions.range_and_precision precision] (possibly dynamic or - unlimited). - * Provides an specialization of `std::numeric_limits`. - -A numeric type is [*signed] if the abstract values it represent include negative numbers. - -A numeric type is [*unsigned] if the abstract values it represent exclude negative numbers. - -A numeric type is [*modulo] if it has modulo-arithmetic (does not overflow). - -A numeric type is [*integer] if the abstract values it represent are whole numbers. - -A numeric type is [*floating] if the abstract values it represent are real numbers. - -An [*arithmetic value] is the typed value of an arithmetic type - -A [*numeric value] is the typed value of a numeric type - -These definitions simply generalize the standard notions of arithmetic types and -values by introducing a superset called [_numeric]. All arithmetic types and values are -numeric types and values, but not vice versa, since user-defined numeric types are not -arithmetic types. - -The following examples clarify the differences between arithmetic and numeric -types (and values): - - - // A numeric type which is not an arithmetic type (is user-defined) - // and which is intended to represent integer numbers (i.e., an 'integer' numeric type) - class MyInt - { - MyInt ( long long v ) ; - long long to_builtin(); - } ; - namespace std { - template<> numeric_limits { ... } ; - } - - // A 'floating' numeric type (double) which is also an arithmetic type (built-in), - // with a float numeric value. - double pi = M_PI ; - - // A 'floating' numeric type with a whole numeric value. - // NOTE: numeric values are typed valued, hence, they are, for instance, - // integer or floating, despite the value itself being whole or including - // a fractional part. - double two = 2.0 ; - - // An integer numeric type with an integer numeric value. - MyInt i(1234); - - -[endsect] - -[section Range and Precision] - -Given a number set `N`, some of its elements are representable in a numeric type `T`. - -The set of representable values of type `T`, or numeric set of `T`, is a set of numeric -values whose elements are the representation of some subset of `N`. - -For example, the interval of `int` values `[INT_MIN,INT_MAX]` is the set of representable -values of type `int`, i.e. the `int` numeric set, and corresponds to the representation -of the elements of the interval of abstract values `[abt(INT_MIN),abt(INT_MAX)]` from -the integer numbers. - -Similarly, the interval of `double` values `[-DBL_MAX,DBL_MAX]` is the `double` -numeric set, which corresponds to the subset of the real numbers from `abt(-DBL_MAX)` to -`abt(DBL_MAX)`. - -__SPACE__ - -Let [*`next(x)`] denote the lowest numeric value greater than x. - -Let [*`prev(x)`] denote the highest numeric value lower then x. - -Let [*`v=prev(next(V))`] and [*`v=next(prev(V))`] be identities that relate a numeric -typed value `v` with a number `V`. - -An ordered pair of numeric values `x`,`y` s.t. `x abt(h)`, `V` is [*not representable] (cannot be represented) in -the type `T`, or, equivalently, it's representation in the type `T` is [*out of range], -or [*overflows]. - -* If `V < abt(l)`, the [*overflow is negative]. -* If `V > abt(h)`, the [*overflow is positive]. - -If `V >= abt(l)` and `V <= abt(h)`, `V` is [*representable] (can be represented) in the -type `T`, or, equivalently, its representation in the type `T` is [*in range], or -[*does not overflow]. - -Notice that a numeric type, such as a C++ unsigned type, can define that any `V` does -not overflow by always representing not `V` itself but the abstract value -`U = [ V % (abt(h)+1) ]`, which is always in range. - -Given an abstract value `V` represented in the type `T` as `v`, the [*roundoff] error -of the representation is the abstract difference: `(abt(v)-V)`. - -Notice that a representation is an ['operation], hence, the roundoff error corresponds -to the representation operation and not to the numeric value itself -(i.e. numeric values do not have any error themselves) - -* If the roundoff is 0, the representation is [*exact], and `V` is exactly representable -in the type `T`. -* If the roundoff is not 0, the representation is [*inexact], and `V` is inexactly -representable in the type `T`. - -If a representation `v` in a type `T` -either exact or inexact-, is any of the adjacents -of `V` in that type, that is, if `v==prev` or `v==next`, the representation is -faithfully rounded. If the choice between `prev` and `next` matches a given -[*rounding direction], it is [*correctly rounded]. - -All exact representations are correctly rounded, but not all inexact representations are. -In particular, C++ requires numeric conversions (described below) and the result of -arithmetic operations (not covered by this document) to be correctly rounded, but -batch operations propagate roundoff, thus final results are usually incorrectly -rounded, that is, the numeric value `r` which is the computed result is neither of -the adjacents of the abstract value `R` which is the theoretical result. - -Because a correctly rounded representation is always one of adjacents of the abstract -value being represented, the roundoff is guaranteed to be at most 1ulp. - -The following examples summarize the given definitions. Consider: - -* A numeric type `Int` representing integer numbers with a -['numeric set]: `{-2,-1,0,1,2}` and -['range]: `[-2,2]` -* A numeric type `Cardinal` representing integer numbers with a -['numeric set]: `{0,1,2,3,4,5,6,7,8,9}` and -['range]: `[0,9]` (no modulo-arithmetic here) -* A numeric type `Real` representing real numbers with a -['numeric set]: `{-2.0,-1.5,-1.0,-0.5,-0.0,+0.0,+0.5,+1.0,+1.5,+2.0}` and -['range]: `[-2.0,+2.0]` -* A numeric type `Whole` representing real numbers with a -['numeric set]: `{-2.0,-1.0,0.0,+1.0,+2.0}` and -['range]: `[-2.0,+2.0]` - -First, notice that the types `Real` and `Whole` both represent real numbers, -have the same range, but different precision. - -* The integer number `1` (an abstract value) can be exactly represented -in any of these types. -* The integer number `-1` can be exactly represented in `Int`, `Real` and `Whole`, -but cannot be represented in `Cardinal`, yielding negative overflow. -* The real number `1.5` can be exactly represented in `Real`, and inexactly -represented in the other types. -* If `1.5` is represented as either `1` or `2` in any of the types (except `Real`), -the representation is correctly rounded. -* If `0.5` is represented as `+1.5` in the type `Real`, it is incorrectly rounded. -* `(-2.0,-1.5)` are the `Real` adjacents of any real number in the interval -`[-2.0,-1.5]`, yet there are no `Real` adjacents for `x < -2.0`, nor for `x > +2.0`. - -[endsect] - -[section Standard (numeric) Conversions] - -The C++ language defines [_Standard Conversions] (§4) some of which are conversions -between arithmetic types. - -These are [_Integral promotions] (§4.5), [_Integral conversions] (§4.7), -[_Floating point promotions] (§4.6), [_Floating point conversions] (§4.8) and -[_Floating-integral conversions] (§4.9). - -In the sequel, integral and floating point promotions are called [*arithmetic promotions], -and these plus integral, floating-point and floating-integral conversions are called -[*arithmetic conversions] (i.e, promotions are conversions). - -Promotions, both Integral and Floating point, are ['value-preserving], which means that -the typed value is not changed with the conversion. - -In the sequel, consider a source typed value `s` of type `S`, the source abstract -value `N=abt(s)`, a destination type `T`; and whenever possible, a result typed value -`t` of type `T`. - - -Integer to integer conversions are always defined: - -* If `T` is unsigned, the abstract value which is effectively represented is not -`N` but `M=[ N % ( abt(h) + 1 ) ]`, where `h` is the highest unsigned typed -value of type `T`. -* If `T` is signed and `N` is not directly representable, the result `t` is -[_implementation-defined], which means that the C++ implementation is required to -produce a value `t` even if it is totally unrelated to `s`. - - -Floating to Floating conversions are defined only if `N` is representable; -if it is not, the conversion has [_undefined behavior]. - -* If `N` is exactly representable, `t` is required to be the exact representation. -* If `N` is inexactly representable, `t` is required to be one of the two -adjacents, with an implementation-defined choice of rounding direction; -that is, the conversion is required to be correctly rounded. - - -Floating to Integer conversions represent not `N` but `M=trunc(N)`, were -`trunc()` is to truncate: i.e. to remove the fractional part, if any. - -* If `M` is not representable in `T`, the conversion has [_undefined behavior] -(unless `T` is `bool`, see §4.12). - - -Integer to Floating conversions are always defined. - -* If `N` is exactly representable, `t` is required to be the exact representation. -* If `N` is inexactly representable, `t` is required to be one of the -two adjacents, with an implementation-defined choice of rounding direction; -that is, the conversion is required to be correctly rounded. - -[endsect] - -[section Subranged Conversion Direction, Subtype and Supertype] - -Given a source type `S` and a destination type `T`, there is a -[*conversion direction] denoted: `S->T`. - -For any two ranges the following ['range relation] can be defined: -A range `X` can be ['entirely contained] in a range `Y`, in which case -it is said that `X` is enclosed by `Y`. - -[: [*Formally:] `R(S)` is enclosed by `R(T)` iif `(R(S) intersection R(T)) == R(S)`.] - -If the source type range, `R(S)`, is not enclosed in the target type range, -`R(T)`; that is, if `(R(S) & R(T)) != R(S)`, the conversion direction is said -to be [*subranged], which means that `R(S)` is not entirely contained in `R(T)` -and therefore there is some portion of the source range which falls outside -the target range. In other words, if a conversion direction `S->T` is subranged, -there are values in `S` which cannot be represented in `T` because they are -out of range. -Notice that for `S->T`, the adjective subranged applies to `T`. - -Examples: - -Given the following numeric types all representing real numbers: - -* `X` with numeric set `{-2.0,-1.0,0.0,+1.0,+2.0}` and range `[-2.0,+2.0]` -* `Y` with numeric set `{-2.0,-1.5,-1.0,-0.5,0.0,+0.5,+1.0,+1.5,+2.0}` and range `[-2.0,+2.0]` -* `Z` with numeric set `{-1.0,0.0,+1.0}` and range `[-1.0,+1.0]` - -For: - -[variablelist -[[(a) X->Y:][ -`R(X) & R(Y) == R(X)`, then `X->Y` is not subranged. -Thus, all values of type `X` are representable in the type `Y`. -]] -[[(b) Y->X:][ -`R(Y) & R(X) == R(Y)`, then `Y->X` is not subranged. -Thus, all values of type `Y` are representable in the type `X`, but in this case, -some values are ['inexactly] representable (all the halves). -(note: it is to permit this case that a range is an interval of abstract values and -not an interval of typed values) -]] -[[(b) X->Z:][ -`R(X) & R(Z) != R(X)`, then `X->Z` is subranged. -Thus, some values of type `X` are not representable in the type `Z`, they fall -out of range `(-2.0 and +2.0)`. -]] -] - -It is possible that `R(S)` is not enclosed by `R(T)`, while neither is `R(T)` enclosed -by `R(S)`; for example, `UNSIG=[0,255]` is not enclosed by `SIG=[-128,127]`; -neither is `SIG` enclosed by `UNSIG`. -This implies that is possible that a conversion direction is subranged both ways. -This occurs when a mixture of signed/unsigned types are involved and indicates that -in both directions there are values which can fall out of range. - -Given the range relation (subranged or not) of a conversion direction `S->T`, it -is possible to classify `S` and `T` as [*supertype] and [*subtype]: -If the conversion is subranged, which means that `T` cannot represent all possible -values of type `S`, `S` is the supertype and `T` the subtype; otherwise, `T` is the -supertype and `S` the subtype. - -For example: - -[: `R(float)=[-FLT_MAX,FLT_MAX]` and `R(double)=[-DBL_MAX,DBL_MAX]` ] - -If `FLT_MAX < DBL_MAX`: - -* `double->float` is subranged and `supertype=double`, `subtype=float`. -* `float->double` is not subranged and `supertype=double`, `subtype=float`. - -Notice that while `double->float` is subranged, `float->double` is not, -which yields the same supertype,subtype for both directions. - -Now consider: - -[: `R(int)=[INT_MIN,INT_MAX]` and `R(unsigned int)=[0,UINT_MAX]` ] - -A C++ implementation is required to have `UINT_MAX > INT_MAX` (§3.9/3), so: - -* 'int->unsigned' is subranged (negative values fall out of range) -and `supertype=int`, `subtype=unsigned`. -* 'unsigned->int' is ['also] subranged (high positive values fall out of range) -and `supertype=unsigned`, `subtype=int`. - -In this case, the conversion is subranged in both directions and the -supertype,subtype pairs are not invariant (under inversion of direction). -This indicates that none of the types can represent all the values of the other. - -When the supertype is the same for both `S->T` and `T->S`, it is effectively -indicating a type which can represent all the values of the subtype. -Consequently, if a conversion `X->Y` is not subranged, but the opposite `(Y->X)` is, -so that the supertype is always `Y`, it is said that the direction `X->Y` is [*correctly -rounded value preserving], meaning that all such conversions are guaranteed to -produce results in range and correctly rounded (even if inexact). -For example, all integer to floating conversions are correctly rounded value preserving. - -[endsect] - -[endsect] - - diff --git a/libs/numeric/conversion/doc/html/HTML.manifest b/libs/numeric/conversion/doc/html/HTML.manifest deleted file mode 100644 index 551fe2bfc..000000000 --- a/libs/numeric/conversion/doc/html/HTML.manifest +++ /dev/null @@ -1,10 +0,0 @@ -index.html -boost_numericconversion/definitions.html -boost_numericconversion/converter___function_object.html -boost_numericconversion/type_requirements_and_user_defined_types_support.html -boost_numericconversion/bounds___traits_class.html -boost_numericconversion/conversion_traits___traits_class.html -boost_numericconversion/numeric_converter_policy_classes.html -boost_numericconversion/improved_numeric_cast__.html -numeric_conversion/history_and_acknowledgments.html -numeric_conversion/bibliography.html diff --git a/libs/numeric/conversion/doc/html/boost_numericconversion/bounds___traits_class.html b/libs/numeric/conversion/doc/html/boost_numericconversion/bounds___traits_class.html deleted file mode 100644 index 3da45805b..000000000 --- a/libs/numeric/conversion/doc/html/boost_numericconversion/bounds___traits_class.html +++ /dev/null @@ -1,143 +0,0 @@ - - - -bounds<> traits class - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
- -

- To determine the ranges of numeric types with std::numeric_limits - [18.2.1], different syntax have to be used depending on numeric type. Specifically, - numeric_limits<T>::min() for - integral types returns the minimum finite value, whereas for floating point - types it returns the minimum positive normalized value. The difference in - semantics makes client code unnecessarily complex and error prone. -

-

- boost::numeric::bounds<> - provides a consistent interface for retrieving the maximum finite value, - the minimum finite value and the minimum positive normalized value (0 for - integral types) for numeric types. The selection of implementation is performed - at compile time, so there is no runtime overhead. -

-
-
- -
template<class N>
-struct bounds
-{
-    static N lowest  () { return implementation_defined; }
-    static N highest () { return implementation_defined; }
-    static N smallest() { return implementation_defined; }
-};
-
-
- - Members -
-

- lowest() -

-

- Returns the minimum finite value, equivalent to numeric_limits<T>::min() when - T is an integral type, and - to -numeric_limits<T>::max() when - T is a floating point type. -

-

- highest() -

-

- Returns the maximum finite value, equivalent to numeric_limits<T>::max(). -

-

- smallest() -

-

- Returns the smallest positive normalized value for floating point types with - denormalization, or returns 0 for integral types. -

-
-
- -

- The following example demonstrates the use of numeric::bounds<> and the equivalent code using numeric_limits: -

-
#include <iostream>
-
-#include <boost/numeric/conversion/bounds.hpp>
-#include <boost/limits.hpp>
-
-int main() {
-
-    std::cout << "numeric::bounds versus numeric_limits example.\n";
-
-    std::cout << "The maximum value for float:\n";
-    std::cout << boost::numeric::bounds<float>::highest() << "\n";
-    std::cout << std::numeric_limits<float>::max() << "\n";
-
-    std::cout << "The minimum value for float:\n";
-    std::cout << boost::numeric::bounds<float>::lowest() << "\n";
-    std::cout << -std::numeric_limits<float>::max() << "\n";
-
-    std::cout << "The smallest positive value for float:\n";
-    std::cout << boost::numeric::bounds<float>::smallest() << "\n";
-    std::cout << std::numeric_limits<float>::min() << "\n";
-
-    return 0;
-}
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/conversion/doc/html/boost_numericconversion/conversion_traits___traits_class.html b/libs/numeric/conversion/doc/html/boost_numericconversion/conversion_traits___traits_class.html deleted file mode 100644 index 3391610b4..000000000 --- a/libs/numeric/conversion/doc/html/boost_numericconversion/conversion_traits___traits_class.html +++ /dev/null @@ -1,505 +0,0 @@ - - - -conversion_traits<> traits class - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
-

-Types -

- -
- -
namespace boost { namespace numeric {
-
-    enum int_float_mixture_enum
-    {
-       integral_to_integral
-      ,integral_to_float
-      ,float_to_integral
-      ,float_to_float
-    } ;
-
-} } // namespace boost::numeric
-
-
-
- -
namespace boost { namespace numeric {
-
-enum sign_mixture_enum
-{
-   unsigned_to_unsigned
-  ,signed_to_signed
-  ,signed_to_unsigned
-  ,unsigned_to_signed
-} ;
-
-} } // namespace boost::numeric
-
-
-
- -
namespace boost { namespace numeric {
-
-    enum udt_builtin_mixture_enum
-    {
-       builtin_to_builtin
-      ,builtin_to_udt
-      ,udt_to_builtin
-      ,udt_to_udt
-    } ;
-
-} } // namespace boost::numeric
-
-
-
- -
namespace boost { namespace numeric {
-
-    template <class T, class S>
-    struct int_float_mixture : mpl::integral_c<int_float_mixture_enum, impl-def-value> {} ;
-
-} } // namespace boost::numeric
-
-

- Classifying S and T as either integral or float, this - MPL's - Integral Constant indicates the combination of these attributes. -

-

- Its ::value - is of enumeration type boost::numeric::int_float_mixture_enum -

-
-
- -
namespace boost { namespace numeric {
-
-    template <class T, class S>
-    struct sign_mixture : mpl::integral_c<sign_mixture_enum, impl-def-value> {} ;
-
-} } // namespace boost::numeric
-
-

- Classifying S and T as either signed or unsigned, this - MPL's - Integral Constant indicates the combination of these attributes. -

-

- Its ::value - is of enumeration type boost::numeric::sign_mixture_enum -

-
-
- -
namespace boost { namespace numeric {
-
-    template <class T, class S>
-    struct udt_builtin_mixture : mpl::integral_c<udt_builtin__mixture_enum, impl-def-value> {} ;
-
-} } // namespace boost::numeric
-
-

- Classifying S and T as either user-defined or builtin, - this MPL's - Integral Constant indicates the combination of these attributes. -

-

- Its ::value - is of enumeration type boost::numeric::udt_builtin_mixture_enum -

-
-
- -
namespace boost { namespace numeric {
-
-    template <class T, class S>
-    struct is_subranged : mpl::bool_<impl-def-value> {} ;
-
-} } // namespace boost::numeric
-
-

- Indicates if the range of the target type T - is a subset of the range of the source type S. - That is: if there are some source values which fall out of the Target type's - range. -

-

- It is a boolean MPL's - Integral Constant . -

-

- It does not indicate if a particular conversion is effectively out of range; - it indicates that some conversion might be out of range because not all - the source values are representable as Target type. -

-
-
- -
namespace boost { namespace numeric {
-
-    template <class T, class S>
-    struct conversion_traits
-    {
-        mpl::integral_c<int_float_mixture_enum  , ...> int_float_mixture ;
-        mpl::integral_c<sign_mixture_enum       , ...> sign_mixture;
-        mpl::integral_c<udt_builtin_mixture_enum, ...> udt_builtin_mixture ;
-
-        mpl::bool_<...> subranged ;
-        mpl::bool_<...> trivial ;
-
-        typedef T target_type   ;
-        typedef S source_type   ;
-        typedef ... argument_type ;
-        typedef ... result_type   ;
-        typedef ... supertype     ;
-        typedef ... subtype       ;
-    } ;
-
-} } // namespace numeric, namespace boost
-
-

- This traits class indicates some properties of a numeric conversion - direction: from a source type S - to a target type T. It - does not indicate the properties of a specific conversion, - but of the conversion direction. See Definitions - for details. -

-

- The traits class provides the following MPL's - Integral Constant \s of enumeration type. They express the combination - of certain attributes of the Source and Target types (thus they are call - mixture): -

-
---- - - - - - - - - - - - - - - - - - - -
- -
-

- int_float_mixture -

-
-

- Same as given by the traits class int_float_mixture -

-
-

- sign_mixture -

-
-

- Same as given by the traits class sign_mixture -

-
-

- udt_builtin_mixture -

-
-

- Same as given by the traits class udt_builtin_mixture -

-
-

- The traits class provides the following MPL's - Integral Constant \s of boolean type which indicates indirectly - the relation between the Source and Target ranges (see Definitions - for details). -

-
---- - - - - - - - - - - - - - - -
- -
-

- subranged -

-
-

- Same as given by is_subranged -

-
-

- trivial -

-
-

- Indicates if both Source and Target, without - cv-qualifications, are the same type. -

-

- Its ::value - is of boolean type. -

-
-

- The traits class provides the following types. They are the Source and - Target types classified and qualified for different purposes. -

-
---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-

- target_type -

-
-

- The template parameter T - without cv-qualifications -

-
-

- source_type -

-
-

- The template parameter S - without cv-qualifications -

-
-

- argument_type -

-
-

- This type is either source_type or source_type - const&. -

-

- It represents the optimal argument type for the converter - member functions. -

-

- If S is a built-in type, this is source_type, - otherwise, this is source_type - const&. -

-
-

- result_type -

-
-

- This type is either target_type or target_type const& -

-

- It represents the return type of the converter - member functions. -

-

- If T==S, it is target_type - const&, - otherwise, it is target_type. -

-
-

- supertype -

-
-

- If the conversion is subranged, it is source_type, - otherwise, it is target_type -

-
-

- subtype -

-
-

- If the conversion is subranged, it is target_type, - otherwise, it is source_type -

-
-
-
-
- -
#include <cassert>
-#include <typeinfo>
-#include <boost/numeric/conversion/conversion_traits.hpp>
-
-int main()
-{
-
-    // A trivial conversion.
-    typedef boost::numeric::conversion_traits<short,short> Short2Short_Traits ;
-    assert ( Short2Short_Traits::trivial::value ) ;
-
-    // A subranged conversion.
-    typedef boost::numeric::conversion_traits<double,unsigned int> UInt2Double_Traits ;
-    assert (  UInt2Double_Traits::int_float_mixture::value == boost::numeric::integral_to_float ) ;
-    assert (  UInt2Double_Traits::sign_mixture::value == boost::numeric::unsigned_to_signed ) ;
-    assert ( !UInt2Double_Traits::subranged::value ) ;
-    assert ( typeid(UInt2Double_Traits::supertype) == typeid(double) ) ;
-    assert ( typeid(UInt2Double_Traits::subtype) == typeid(unsigned int) ) ;
-
-    // A doubly subranged conversion.
-    assert ( (boost::numeric::conversion_traits<short, unsigned short>::subranged::value) );
-    assert ( (boost::numeric::conversion_traits<unsigned short, short>::subranged::value) );
-
-    return 0;
-}
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/conversion/doc/html/boost_numericconversion/converter___function_object.html b/libs/numeric/conversion/doc/html/boost_numericconversion/converter___function_object.html deleted file mode 100644 index 9e805474d..000000000 --- a/libs/numeric/conversion/doc/html/boost_numericconversion/converter___function_object.html +++ /dev/null @@ -1,462 +0,0 @@ - - - -converter<> function object - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
- -
namespace boost { namespace numeric {
-
-
-    template<class T,
-             class S,
-             class Traits,          = conversion_traits<T,S>
-             class OverflowHandler  = def_overflow_handler,
-             class Float2IntRounder = Trunc< typename Traits::source_type >,
-             class RawConverter     = raw_converter<Traits>,
-             class UserRangeChecker = UseInternalRangeChecker
-            >
-    struct converter
-    {
-        typedef Traits traits ;
-
-        typedef typename Traits::source_type   source_type   ;
-        typedef typename Traits::argument_type argument_type ;
-        typedef typename Traits::result_type   result_type   ;
-
-        static result_type convert ( argument_type s ) ;
-
-        result_type operator() ( argument_type s ) const ;
-
-        // Internal member functions:
-
-        static range_check_result out_of_range      ( argument_type s ) ;
-        static void               validate_range    ( argument_type s ) ;
-        static result_type        low_level_convert ( argument_type s ) ;
-        static source_type        nearbyint         ( argument_type s ) ;
-
-    } ;
-
-} } // namespace numeric, boost
-
-

- boost::numeric::converter<> - is a Unary Function - Object encapsulating the code to perform a numeric conversion with - the direction and properties specified by the Traits template parameter. - It can optionally take some policies - which can be used to customize its behavior. The Traits - parameter is not a policy but the parameter that defines the conversion. -

-
-
- -
---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-

- T -

-
-

- The Numeric - Type which is the Target of the conversion. -

-
-

- S -

-
-

- The Numeric - Type which is the Source of the conversion. -

-
-

- Traits -

-
-

- This must be a conversion traits class with the interface of boost::numeric::conversion_traits -

-
-

- OverflowHandler -

-
-

- Stateless Policy called to administrate - the result of the range checking. -

-

- It is a Function Object which - receives the result of out_of_range() and is called inside the validate_range() - static member function exposed by the converter. -

-
-

- Float2IntRounder -

-
-

- Stateless Policy which specifies - the rounding mode used for float to integral conversions. -

-

- It supplies the nearbyint() static member function exposed - by the converter. -

-
-

- RawConverter -

-
-

- Stateless Policy which is used - to perform the actual conversion. -

-

- It supplies the low_level_convert() static member function exposed - by the converter. -

-
-

- UserRangeChecker -

-
-

- Special and Optional Stateless - Policy which can be used to override the internal range - checking logic. -

-

- If given, supplies alternative code for the out_of_range() and validate_range() static member functions exposed - by the converter. -

-
-
-
- -

- static result_type - converter<>::convert ( argument_type s - ) ; // throw -

-

- This static member function converts an rvalue of type source_type - to an rvalue of type target_type. -

-

- If the conversion requires it, it performs a range checking before the conversion - and passes the result of the check to the overflow handler policy (the default - policy throws an exception if out-of-range is detected) -

-

- The implementation of this function is actually built from the policies and - is basically as follows: -

-
result_type converter<>::convert ( argument_type s )
-{
-    validate_range(s); // Implemented by the internal range checking logic
-                       // (which also calls the OverflowHandler policy)
-                       // or externally supplied by the UserRangeChecker policy.
-
-    s = nearbyint(s); // Externally supplied by the Float2IntRounder policy.
-                      // NOTE: This is actually called only for float to int conversions.
-
-    return low_level_convert(s); // Externally supplied by the RawConverter policy.
-}
-
-

- converter<>::operator() const just calls convert() -

-

- space -

-

- static range_check_result - numeric_converter<>::out_of_range ( - argument_type s - ) ; -

-

- This internal - static member function determines if the value s - can be represented by the target type without overflow. -

-

- It does not determine if the conversion is exact; that - is, it does not detect inexact conversions, only out-of-range - conversions (see the Definitions - for further details). -

-

- The return value is of enum type boost::numeric::range_check_result -

-

- The actual code for the range checking logic is optimized for the combined - properties of the source and target types. For example, a non-subranged conversion - (i.e: int->float), requires no range checking, so out_of_range() - returns cInRange directly. - See the following table - for more details. -

-

- If the user supplied a UserRangeChecker - policy, is this policy which implements this function, so the implementation - is user defined, although it is expected to perform the same conceptual check - and return the appropriate result. -

-

- space -

-

- static void - numeric_converter<>::validate_range ( - argument_type s - ) ; // no throw -

-

- This internal - static member function calls out_of_range(s), and passes the result to the - OverflowHandler - policy class. -

-

- For those Target/Source combinations which don't require range checking, - this is an empty inline function. -

-

- If the user supplied a UserRangeChecker - policy, is this policy which implements this function, so the implementation - is user defined, although it is expected to perform the same action as the - default. In particular, it is expected to pass the result of the check to - the overflow handler. -

-

- space -

-

- static result_type - numeric_converter<>::low_level_convert ( - argument_type s - ) ; -

-

- This internal - static member function performs the actual conversion. -

-

- This function is externally supplied by the RawConverter - policy class. -

-

- space -

-

- static source_type - converter<>::nearbyint ( - argument_type s - ) ; -

-

- This internal - static member function, which is only used - for float to int - conversions, returns an integer value of floating-point type according to some - rounding direction. -

-

- This function is externally supplied by the Float2IntRounder - policy class which encapsulates the specific rounding mode. -

-

- space -

-
- - Internal - Member Functions -
-

- These static member functions build the actual conversion code used by convert(). - The user does not have to call these if calling convert(), since convert() calls them infernally, but they can be - called separately for specific needs. -

-
-
- -

- The following table summarizes the internal range checking logic performed - for each combination of the properties of Source and Target. -

-

- LowestT/HighestT denotes the highest and lowest values of the Target type, - respectively. -

-

- S(n) is short - for static_cast<S>(n) (S denotes the Source type). -

-

- NONE indicates that for this - case there is no range checking. -

-

-int_to_int    |--> sig_to_sig     |--> subranged     |--> ( s >= S(LowestT) ) && ( s <= S(HighestT) )
-              |                   |--> not subranged |--> NONE
-              |
-              |--> unsig_to_unsig |--> subranged     |--> ( s >= S(LowestT) ) && ( s <= S(HighestT) )
-              |                   |--> not subranged |--> NONE
-              |
-              |--> sig_to_unsig   |--> pos subranged     |--> ( s >= S(0) ) && ( s <= S(HighestT) )
-              |                   |--> not pos subranged |--> ( s >= S(0) )
-              |
-              |--> unsig_to_sig   |--> subranged     |--> ( s <= S(HighestT) )
-              |                   |--> not subranged |--> NONE
-
-
-int_to_float   |--> NONE
-
-
-float_to_int   |--> round_to_zero         |--> ( s >  S(LowestT)-S(1)   ) && ( s <  S(HighestT)+S(1)   )
-               |--> round_to_even_nearest |--> ( s >= S(LowestT)-S(0.5) ) && ( s <  S(HighestT)+S(0.5) )
-               |--> round_to_infinity     |--> ( s >  S(LowestT)-S(1)   ) && ( s <= S(HighestT)        )
-               |--> round_to_neg_infinity |--> ( s >= S(LowestT)        ) && ( s <  S(HighestT)+S(1)   )
-
-
-float_to_float |--> subranged     |--> ( s >= S(LowestT) ) && ( s <= S(HighestT) )
-               |--> not subranged |--> NONE
-
-
-
-
- -
#include <cassert>
-#include <boost/numeric/conversion/converter.hpp>
-
-int main() {
-
-    typedef boost::numeric::converter<int,double> Double2Int ;
-
-    int x = Double2Int::convert(2.0);
-    assert ( x == 2 );
-
-    int y = Double2Int()(3.14); // As a function object.
-    assert ( y == 3 ) ; // The default rounding is trunc.
-
-    try
-    {
-        double m = boost::numeric::bounds<double>::highest();
-        int z = Double2Int::convert(m); // By default throws positive_overflow()
-    }
-    catch ( boost::numeric::positive_overflow const& )
-    {
-    }
-
-    return 0;
-}
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/conversion/doc/html/boost_numericconversion/definitions.html b/libs/numeric/conversion/doc/html/boost_numericconversion/definitions.html deleted file mode 100644 index 4113a97c9..000000000 --- a/libs/numeric/conversion/doc/html/boost_numericconversion/definitions.html +++ /dev/null @@ -1,974 +0,0 @@ - - - -Definitions - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
- -

- This section provides definitions of terms used in the Numeric Conversion - library. -

- -
-
- -

- As defined by the C++ Object Model - (§1.7) the storage or memory on which - a C++ program runs is a contiguous sequence of bytes - where each byte is a contiguous sequence of bits. -

-

- An object is a region of storage (§1.8) - and has a type (§3.9). -

-

- A type is a discrete set of values. -

-

- An object of type T has an - object representation which is the - sequence of bytes stored in the object (§3.9/4) -

-

- An object of type T has a - value representation which is the set - of bits that determine the value of an object of that - type (§3.9/4). For POD types (§3.9/10), - this bitset is given by the object representation, but not all the bits in - the storage need to participate in the value representation (except for character - types): for example, some bits might be used for padding or there may be - trap-bits. -

-

- space -

-

- The typed value that is held by an object - is the value which is determined by its value representation. -

-

- An abstract value (untyped) is the conceptual - information that is represented in a type (i.e. the number π). -

-

- The intrinsic value of an object is the - binary value of the sequence of unsigned characters which form its object - representation. -

-

- space -

-

- Abstract values can be represented - in a given type. -

-

- To represent an abstract value V in a type T - is to obtain a typed value v - which corresponds to the abstract value V. -

-

- The operation is denoted using the rep() operator, as in: v=rep(V). v is the representation - of V in the type T. -

-

- For example, the abstract value π can be represented in the type double as the double - value M_PI - and in the type int as the - int value - 3 -

-

- space -

-

- Conversely, typed values can be abstracted. -

-

- To abstract a typed value v of type T - is to obtain the abstract value V - whose representation in T - is v. -

-

- The operation is denoted using the abt() operator, as in: V=abt(v). -

-

- V is the abstraction - of v of type T. -

-

- Abstraction is just an abstract operation (you can't do it); but it is defined - nevertheless because it will be used to give the definitions in the rest - of this document. -

-
-
- -

- The C++ language defines fundamental types - (§3.9.1). The following subsets of the fundamental types are intended to - represent numbers: -

-
-

-
-
signed integer types (§3.9.1/2):
-

- {signed - char, - signed short - int, - signed int, signed long int} Can be used to represent general integer - numbers (both negative and positive). -

-
unsigned integer types (§3.9.1/3):
-

- {unsigned - char, - unsigned short - int, - unsigned int, unsigned - long int} Can be used to represent positive - integer numbers with modulo-arithmetic. -

-
floating-point types (§3.9.1/8):
-

- {float,double,long double} - Can be used to represent real numbers. -

-
integral or integer types (§3.9.1/7):
-

- {{signed - integers},{unsigned integers}, bool, char and wchar_t} -

-
arithmetic types (§3.9.1/8):
-

- {{integer - types},{floating types}} -

-
-
-

- The integer types are required to have a binary value - representation. -

-

- Additionally, the signed/unsigned integer types of the same base type (short, int - or long) are required to have - the same value representation, that is: -

-
         int i = -3 ; // suppose value representation is: 10011 (sign bit + 4 magnitude bits)
-unsigned int u =  i ; // u is required to have the same 10011 as its value representation.
-
-

- In other words, the integer types signed/unsigned X use the same value representation - but a different interpretation of it; that is, their - typed values might differ. -

-

- Another consequence of this is that the range for signed X is always a smaller - subset of the range of unsigned X, as required by §3.9.1/3. -

-
- - - - - -
[Note]Note
-

- Always remember that unsigned types, unlike signed types, have modulo-arithmetic; - that is, they do not overflow. This means that: -

-

- - Always be extra careful when mixing - signed/unsigned types -

-

- - Use unsigned types only when you need - modulo arithmetic or very very large numbers. Don't use unsigned types - just because you intend to deal with positive values only (you can do this - with signed types as well). -

-
-
-
- -

- This section introduces the following definitions intended to integrate arithmetic - types with user-defined types which behave like numbers. Some definitions - are purposely broad in order to include a vast variety of user-defined number - types. -

-

- Within this library, the term number refers to an abstract - numeric value. -

-

- A type is numeric if: -

-
    -
  • - It is an arithmetic type, or, -
  • -
  • - It is a user-defined type which -
      -
    • - Represents numeric abstract values (i.e. numbers). -
    • -
    • - Can be converted (either implicitly or explicitly) to/from at least - one arithmetic type. -
    • -
    • - Has range - (possibly unbounded) and precision - (possibly dynamic or unlimited). -
    • -
    • - Provides an specialization of std::numeric_limits. -
    • -
    -
  • -
-

- A numeric type is signed if the abstract - values it represent include negative numbers. -

-

- A numeric type is unsigned if the abstract - values it represent exclude negative numbers. -

-

- A numeric type is modulo if it has modulo-arithmetic - (does not overflow). -

-

- A numeric type is integer if the abstract - values it represent are whole numbers. -

-

- A numeric type is floating if the abstract - values it represent are real numbers. -

-

- An arithmetic value is the typed value of - an arithmetic type -

-

- A numeric value is the typed value of a - numeric type -

-

- These definitions simply generalize the standard notions of arithmetic types - and values by introducing a superset called numeric. - All arithmetic types and values are numeric types and values, but not vice - versa, since user-defined numeric types are not arithmetic types. -

-

- The following examples clarify the differences between arithmetic and numeric - types (and values): -

-
// A numeric type which is not an arithmetic type (is user-defined)
-// and which is intended to represent integer numbers (i.e., an 'integer' numeric type)
-class MyInt
-{
-    MyInt ( long long v ) ;
-    long long to_builtin();
-} ;
-namespace std {
-template<> numeric_limits<MyInt> { ... } ;
-}
-
-// A 'floating' numeric type (double) which is also an arithmetic type (built-in),
-// with a float numeric value.
-double pi = M_PI ;
-
-// A 'floating' numeric type with a whole numeric value.
-// NOTE: numeric values are typed valued, hence, they are, for instance,
-// integer or floating, despite the value itself being whole or including
-// a fractional part.
-double two = 2.0 ;
-
-// An integer numeric type with an integer numeric value.
-MyInt i(1234);
-
-
-
- -

- Given a number set N, some - of its elements are representable in a numeric type T. -

-

- The set of representable values of type T, - or numeric set of T, is a - set of numeric values whose elements are the representation of some subset - of N. -

-

- For example, the interval of int - values [INT_MIN,INT_MAX] is the set of representable values of type - int, i.e. the int numeric set, and corresponds to the representation - of the elements of the interval of abstract values [abt(INT_MIN),abt(INT_MAX)] - from the integer numbers. -

-

- Similarly, the interval of double - values [-DBL_MAX,DBL_MAX] is the double - numeric set, which corresponds to the subset of the real numbers from abt(-DBL_MAX) to abt(DBL_MAX). -

-

- space -

-

- Let next(x) - denote the lowest numeric value greater than x. -

-

- Let prev(x) - denote the highest numeric value lower then x. -

-

- Let v=prev(next(V)) and v=next(prev(V)) - be identities that relate a numeric typed value v - with a number V. -

-

- An ordered pair of numeric values x,y s.t. x<y are - consecutive iff next(x)==y. -

-

- The abstract distance between consecutive numeric values is usually referred - to as a Unit in the Last Place, or - ulp for short. A ulp is a quantity whose - abstract magnitude is relative to the numeric values it corresponds to: If - the numeric set is not evenly distributed, that is, if the abstract distance - between consecutive numeric values varies along the set -as is the case with - the floating-point types-, the magnitude of 1ulp after the numeric value - x might be (usually is) different - from the magnitude of a 1ulp after the numeric value y for x!=y. -

-

- Since numbers are inherently ordered, a numeric set - of type T is an ordered sequence - of numeric values (of type T) - of the form: -

-
REP(T)={l,next(l),next(next(l)),...,prev(prev(h)),prev(h),h}
-
-

- where l and h are respectively the lowest and highest - values of type T, called - the boundary values of type T. -

-

- space -

-

- A numeric set is discrete. It has a size - which is the number of numeric values in the set, a width - which is the abstract difference between the highest and lowest boundary - values: [abt(h)-abt(l)], and a density - which is the relation between its size and width: density=size/width. -

-

- The integer types have density 1, which means that there are no unrepresentable - integer numbers between abt(l) - and abt(h) (i.e. - there are no gaps). On the other hand, floating types have density much smaller - than 1, which means that there are real numbers unrepresented between consecutive - floating values (i.e. there are gaps). -

-

- space -

-

- The interval of abstract values [abt(l),abt(h)] - is the range of the type T, - denoted R(T). -

-

- A range is a set of abstract values and not a set of numeric values. In other - documents, such as the C++ standard, the word range - is sometimes used as synonym for numeric - set, that is, as the ordered sequence - of numeric values from l - to h. In this document, however, - a range is an abstract interval which subtends the numeric set. -

-

- For example, the sequence [-DBL_MAX,DBL_MAX] - is the numeric set of the type double, - and the real interval [abt(-DBL_MAX),abt(DBL_MAX)] - is its range. -

-

- Notice, for instance, that the range of a floating-point type is continuous - unlike its numeric set. -

-

- This definition was chosen because: -

-
    -
  • - (a) The discrete set of numeric values - is already given by the numeric set. -
  • -
  • - (b) Abstract intervals are easier to - compare and overlap since only boundary values need to be considered. -
  • -
-

- This definition allows for a concise definition of subranged - as given in the last section. -

-

- The width of a numeric set, as defined, is exactly equivalent to the width - of a range. -

-

- space -

-

- The precision of a type is given by the - width or density of the numeric set. -

-

- For integer types, which have density 1, the precision is conceptually equivalent - to the range and is determined by the number of bits used in the value representation: - The higher the number of bits the bigger the size of the numeric set, the - wider the range, and the higher the precision. -

-

- For floating types, which have density <<1, the precision is given - not by the width of the range but by the density. In a typical implementation, - the range is determined by the number of bits used in the exponent, and the - precision by the number of bits used in the mantissa (giving the maximum - number of significant digits that can be exactly represented). The higher - the number of exponent bits the wider the range, while the higher the number - of mantissa bits, the higher the precision. -

-
-
- -

- Given an abstract value V - and a type T with its corresponding - range [abt(l),abt(h)]: -

-

- If V < - abt(l) or - V > - abt(h), V is not representable - (cannot be represented) in the type T, - or, equivalently, it's representation in the type T - is out of range, or overflows. -

-
    -
  • - If V < - abt(l), - the overflow is negative. -
  • -
  • - If V > - abt(h), - the overflow is positive. -
  • -
-

- If V >= - abt(l) and - V <= - abt(h), V is representable - (can be represented) in the type T, - or, equivalently, its representation in the type T - is in range, or does - not overflow. -

-

- Notice that a numeric type, such as a C++ unsigned type, can define that - any V does not overflow by - always representing not V - itself but the abstract value U - = [ V % (abt(h)+1) - ], which is always in range. -

-

- Given an abstract value V - represented in the type T - as v, the roundoff - error of the representation is the abstract difference: (abt(v)-V). -

-

- Notice that a representation is an operation, hence, - the roundoff error corresponds to the representation operation and not to - the numeric value itself (i.e. numeric values do not have any error themselves) -

-
    -
  • - If the roundoff is 0, the representation is exact, - and V is exactly representable - in the type T. -
  • -
  • - If the roundoff is not 0, the representation is inexact, - and V is inexactly representable - in the type T. -
  • -
-

- If a representation v in - a type T -either exact or - inexact-, is any of the adjacents of V - in that type, that is, if v==prev - or v==next, the representation is faithfully - rounded. If the choice between prev - and next matches a given - rounding direction, it is correctly - rounded. -

-

- All exact representations are correctly rounded, but not all inexact representations - are. In particular, C++ requires numeric conversions (described below) and - the result of arithmetic operations (not covered by this document) to be - correctly rounded, but batch operations propagate roundoff, thus final results - are usually incorrectly rounded, that is, the numeric value r which is the computed result is neither - of the adjacents of the abstract value R - which is the theoretical result. -

-

- Because a correctly rounded representation is always one of adjacents of - the abstract value being represented, the roundoff is guaranteed to be at - most 1ulp. -

-

- The following examples summarize the given definitions. Consider: -

-
    -
  • - A numeric type Int representing - integer numbers with a numeric set: {-2,-1,0,1,2} and - range: [-2,2] -
  • -
  • - A numeric type Cardinal - representing integer numbers with a numeric set: - {0,1,2,3,4,5,6,7,8,9} and range: [0,9] (no - modulo-arithmetic here) -
  • -
  • - A numeric type Real representing - real numbers with a numeric set: {-2.0,-1.5,-1.0,-0.5,-0.0,+0.0,+0.5,+1.0,+1.5,+2.0} and - range: [-2.0,+2.0] -
  • -
  • - A numeric type Whole - representing real numbers with a numeric set: {-2.0,-1.0,0.0,+1.0,+2.0} and - range: [-2.0,+2.0] -
  • -
-

- First, notice that the types Real - and Whole both represent - real numbers, have the same range, but different precision. -

-
    -
  • - The integer number 1 (an - abstract value) can be exactly represented in any of these types. -
  • -
  • - The integer number -1 - can be exactly represented in Int, - Real and Whole, but cannot be represented in - Cardinal, yielding negative - overflow. -
  • -
  • - The real number 1.5 can be - exactly represented in Real, - and inexactly represented in the other types. -
  • -
  • - If 1.5 is represented as - either 1 or 2 in any of the types (except Real), the representation is correctly - rounded. -
  • -
  • - If 0.5 is represented as - +1.5 - in the type Real, it - is incorrectly rounded. -
  • -
  • - (-2.0,-1.5) - are the Real adjacents - of any real number in the interval [-2.0,-1.5], yet there are no Real - adjacents for x < - -2.0, - nor for x > - +2.0. -
  • -
-
-
- -

- The C++ language defines Standard Conversions - (§4) some of which are conversions between arithmetic types. -

-

- These are Integral promotions (§4.5), - Integral conversions (§4.7), Floating point promotions (§4.6), Floating point conversions (§4.8) and Floating-integral conversions (§4.9). -

-

- In the sequel, integral and floating point promotions are called arithmetic promotions, and these plus integral, floating-point - and floating-integral conversions are called arithmetic - conversions (i.e, promotions are conversions). -

-

- Promotions, both Integral and Floating point, are value-preserving, - which means that the typed value is not changed with the conversion. -

-

- In the sequel, consider a source typed value s - of type S, the source abstract - value N=abt(s), a destination type T; - and whenever possible, a result typed value t - of type T. -

-

- Integer to integer conversions are always defined: -

-
    -
  • - If T is unsigned, the - abstract value which is effectively represented is not N but M=[ N % ( abt(h) + 1 - ) ], - where h is the highest - unsigned typed value of type T. -
  • -
  • - If T is signed and N is not directly representable, the - result t is implementation-defined, which means that - the C++ implementation is required to produce a value t - even if it is totally unrelated to s. -
  • -
-

- Floating to Floating conversions are defined only if N - is representable; if it is not, the conversion has undefined - behavior. -

-
    -
  • - If N is exactly representable, - t is required to be the - exact representation. -
  • -
  • - If N is inexactly representable, - t is required to be one - of the two adjacents, with an implementation-defined choice of rounding - direction; that is, the conversion is required to be correctly rounded. -
  • -
-

- Floating to Integer conversions represent not N - but M=trunc(N), were - trunc() - is to truncate: i.e. to remove the fractional part, if any. -

-
  • - If M is not representable - in T, the conversion - has undefined behavior (unless - T is bool, - see §4.12). -
-

- Integer to Floating conversions are always defined. -

-
    -
  • - If N is exactly representable, - t is required to be the - exact representation. -
  • -
  • - If N is inexactly representable, - t is required to be one - of the two adjacents, with an implementation-defined choice of rounding - direction; that is, the conversion is required to be correctly rounded. -
  • -
-
-
- -

- Given a source type S and - a destination type T, there - is a conversion direction denoted: S->T. -

-

- For any two ranges the following range relation can - be defined: A range X can - be entirely contained in a range Y, - in which case it is said that X - is enclosed by Y. -

-

- Formally: R(S) - is enclosed by R(T) iif - (R(S) - intersection R(T)) - == R(S). -

-

- If the source type range, R(S), - is not enclosed in the target type range, R(T); - that is, if (R(S) - & R(T)) - != R(S), - the conversion direction is said to be subranged, - which means that R(S) is not - entirely contained in R(T) and - therefore there is some portion of the source range which falls outside the - target range. In other words, if a conversion direction S->T - is subranged, there are values in S - which cannot be represented in T - because they are out of range. Notice that for S->T, - the adjective subranged applies to T. -

-

- Examples: -

-

- Given the following numeric types all representing real numbers: -

-
    -
  • - X with numeric set {-2.0,-1.0,0.0,+1.0,+2.0} and - range [-2.0,+2.0] -
  • -
  • - Y with numeric set {-2.0,-1.5,-1.0,-0.5,0.0,+0.5,+1.0,+1.5,+2.0} and range [-2.0,+2.0] -
  • -
  • - Z with numeric set {-1.0,0.0,+1.0} and range [-1.0,+1.0] -
  • -
-

- For: -

-
-

-
-
(a) X->Y:
-

- R(X) & R(Y) == R(X), - then X->Y is not subranged. Thus, all values - of type X are representable - in the type Y. -

-
(b) Y->X:
-

- R(Y) & R(X) == R(Y), - then Y->X is not subranged. Thus, all values - of type Y are representable - in the type X, but - in this case, some values are inexactly representable - (all the halves). (note: it is to permit this case that a range is - an interval of abstract values and not an interval of typed values) -

-
(b) X->Z:
-

- R(X) & R(Z) != R(X), - then X->Z is subranged. Thus, some values - of type X are not representable - in the type Z, they - fall out of range (-2.0 - and +2.0). -

-
-
-

- It is possible that R(S) is not - enclosed by R(T), while - neither is R(T) enclosed - by R(S); for - example, UNSIG=[0,255] is not enclosed by SIG=[-128,127]; neither - is SIG enclosed by UNSIG. This implies that is possible that - a conversion direction is subranged both ways. This occurs when a mixture - of signed/unsigned types are involved and indicates that in both directions - there are values which can fall out of range. -

-

- Given the range relation (subranged or not) of a conversion direction S->T, it is possible to classify S and T - as supertype and subtype: - If the conversion is subranged, which means that T - cannot represent all possible values of type S, - S is the supertype and T the subtype; otherwise, T is the supertype and S - the subtype. -

-

- For example: -

-

- R(float)=[-FLT_MAX,FLT_MAX] - and R(double)=[-DBL_MAX,DBL_MAX] -

-

- If FLT_MAX < - DBL_MAX: -

-
    -
  • - double->float is subranged and supertype=double, - subtype=float. -
  • -
  • - float->double is not subranged and supertype=double, subtype=float. -
  • -
-

- Notice that while double->float is subranged, float->double - is not, which yields the same supertype,subtype for both directions. -

-

- Now consider: -

-

- R(int)=[INT_MIN,INT_MAX] and R(unsigned int)=[0,UINT_MAX] -

-

- A C++ implementation is required to have UINT_MAX - > INT_MAX - (§3.9/3), so: -

-
    -
  • - 'int->unsigned' is subranged (negative values fall out of range) and - supertype=int, subtype=unsigned. -
  • -
  • - 'unsigned->int' is also subranged (high positive - values fall out of range) and supertype=unsigned, - subtype=int. -
  • -
-

- In this case, the conversion is subranged in both directions and the supertype,subtype - pairs are not invariant (under inversion of direction). This indicates that - none of the types can represent all the values of the other. -

-

- When the supertype is the same for both S->T - and T->S, it is effectively indicating a type - which can represent all the values of the subtype. Consequently, if a conversion - X->Y is not subranged, but the opposite (Y->X) is, - so that the supertype is always Y, - it is said that the direction X->Y - is correctly rounded value preserving, meaning - that all such conversions are guaranteed to produce results in range and - correctly rounded (even if inexact). For example, all integer to floating - conversions are correctly rounded value preserving. -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/conversion/doc/html/boost_numericconversion/improved_numeric_cast__.html b/libs/numeric/conversion/doc/html/boost_numericconversion/improved_numeric_cast__.html deleted file mode 100644 index 45608022e..000000000 --- a/libs/numeric/conversion/doc/html/boost_numericconversion/improved_numeric_cast__.html +++ /dev/null @@ -1,212 +0,0 @@ - - - -Improved numeric_cast<> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
- -

- The lack of preservation of range makes conversions between numeric types - error prone. This is true for both implicit conversions and explicit conversions - (through static_cast). numeric_cast detects loss of range - when a numeric type is converted, and throws an exception if the range cannot - be preserved. -

-

- There are several situations where conversions are unsafe: -

-
    -
  • - Conversions from an integral type with a wider range than the target - integral type. -
  • -
  • - Conversions from unsigned to signed (and vice versa) integral types. -
  • -
  • - Conversions from floating point types to integral types. -
  • -
-

- The C++ Standard does not specify the behavior when a numeric type is assigned - a value that cannot be represented by the type, except for unsigned integral - types [3.9.1.4], which must obey the laws of arithmetic modulo 2n (this implies - that the result will be reduced modulo the number that is one greater than - the largest value that can be represented). The fact that the behavior for - overflow is undefined for all conversions (except the aforementioned unsigned - to unsigned) makes any code that may produce positive or negative overflows - exposed to portability issues. -

-

- By default numeric_cast adheres - to the rules for implicit conversions mandated by the C++ Standard, such - as truncating floating point types when converting to integral types. The - implementation must guarantee that for a conversion to a type that can hold - all possible values of the source type, there will be no runtime overhead. -

-
-
- -
template <typename Target, typename Source> inline
-Target numeric_cast( Source arg )
-{
-    typedef conversion_traits<Target, Source>   conv_traits;
-    typedef numeric_cast_traits<Target, Source> cast_traits;
-    typedef converter
-        <
-            Target,
-            Source,
-            conv_traits,
-            typename cast_traits::overflow_policy,
-            typename cast_traits::rounding_policy,
-            raw_converter<conv_traits>,
-            typename cast_traits::range_checking_policy
-        > converter;
-    return converter::convert(arg);
-}
-
-

- numeric_cast returns the - result of converting a value of type Source to a value of type Target. If - out-of-range is detected, an overflow policy is executed whose default behavior - is to throw an an exception (see bad_numeric_cast, - negative_overflow - and positive_overflow - ). -

-
-
- -
template <typename Target, typename Source, typename EnableIf = void>
-struct numeric_cast_traits
-{
-    typedef def_overflow_handler    overflow_policy;
-    typedef UseInternalRangeChecker range_checking_policy;
-    typedef Trunc<Source>           rounding_policy;
-};
-
-

- The behavior of numeric_cast - may be tailored for custom numeric types through the specialization of numeric_cast_traits. (see User - Defined Types for details. ) -

-
-
- -

- The following example performs some typical conversions between numeric types: -

-
    -
  1. - include <boost/numeric/conversion/cast.hpp> -
  2. -
  3. - include <iostream> -
  4. -
-
int main()
-{
-    using boost::numeric_cast;
-
-    using boost::numeric::bad_numeric_cast;
-    using boost::numeric::positive_overflow;
-    using boost::numeric::negative_overflow;
-
-    try
-    {
-        int i=42;
-        short s=numeric_cast<short>(i); // This conversion succeeds (is in range)
-    }
-    catch(negative_overflow& e) {
-        std::cout << e.what();
-    }
-    catch(positive_overflow& e) {
-        std::cout << e.what();
-    }
-
-    try
-    {
-        float f=-42.1234;
-
-        // This will cause a boost::numeric::negative_overflow exception to be thrown
-        unsigned int i=numeric_cast<unsigned int>(f);
-    }
-    catch(bad_numeric_cast& e) {
-        std::cout << e.what();
-    }
-
-    double d= f + numeric_cast<double>(123); // int -> double
-
-    unsigned long l=std::numeric_limits<unsigned long>::max();
-
-    try
-    {
-        // This will cause a boost::numeric::positive_overflow exception to be thrown
-        // NOTE: *operations* on unsigned integral types cannot cause overflow
-        // but *conversions* to a signed type ARE range checked by numeric_cast.
-
-        unsigned char c=numeric_cast<unsigned char>(l);
-    }
-    catch(positive_overflow& e) {
-        std::cout << e.what();
-    }
-
-
-    return 0;
-}
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/conversion/doc/html/boost_numericconversion/numeric_converter_policy_classes.html b/libs/numeric/conversion/doc/html/boost_numericconversion/numeric_converter_policy_classes.html deleted file mode 100644 index abd120381..000000000 --- a/libs/numeric/conversion/doc/html/boost_numericconversion/numeric_converter_policy_classes.html +++ /dev/null @@ -1,395 +0,0 @@ - - - -Numeric Converter Policy Classes - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
- -
namespace boost { namespace numeric {
-
-    enum range_check_result
-    {
-        cInRange     ,
-        cNegOverflow ,
-        cPosOverflow
-    } ;
-
-} }
-
-

- Defines the values returned by boost::numeric::converter<>::out_of_range() -

-
-
- -

- This stateless non-template policy class must be a - function object and is called to administrate the result - of the range checking. It can throw an exception if overflow has been detected - by the range checking as indicated by its argument. If it throws, is is recommended - that it be std::bad_cast or derived. -

-

- It must have the following interface (it does not has to be a template class): -

-
struct YourOverflowHandlerPolicy
-{
-    void operator() ( boost::range_check_result ) ; // throw bad_cast or derived
-} ;
-
-

- It is called with the result of the converter's out_of_range() inside validate_range(). -

-

- These are the two overflow handler classes provided by the library: -

-
namespace boost { namespace numeric {
-
-    struct def_overflow_handler
-    {
-        void operator() ( range_check_result r ) // throw bad_numeric_conversion derived
-        {
-            if ( r == cNegOverflow )
-                throw negative_overflow() ;
-            else if ( r == cPosOverflow )
-                throw positive_overflow() ;
-        }
-    } ;
-
-    struct silent_overflow_handler
-    {
-        void operator() ( range_check_result ) // no-throw
-        {}
-    } ;
-
-} }
-
-

- And these are the Exception Classes thrown by the default overflow handler - (see - IMPORTANT note) -

-
namespace boost { namespace numeric {
-
-    
-    class bad_numeric_cast : public std::bad_cast
-    {
-        public:
-        virtual const char *what() const // throw()
-        {
-            return "bad numeric conversion: overflow";
-        }
-
-    };
-
-    
-    class negative_overflow : public bad_numeric_cast
-    {
-        public:
-        virtual const char *what() const // throw()
-        {
-            return "bad numeric conversion: negative overflow";
-        }
-    };
-
-    
-    class positive_overflow : public bad_numeric_cast
-    {
-        public:
-        virtual const char *what() const // throw()
-        {
-            return "bad numeric conversion: positive overflow";
-        }
-    };
-
-
-} }
-
-
- - - - - -
[Important]Important

- RELEASE NOTE for 1.33 Previous to boost - version 1.33, the exception class bad_numeric_cast - was named bad_numeric_conversion. - However, in 1.33, the old function numeric_cast<> from boost/cast.hpp - was completly replaced by the new numeric_cast<> in boost/numeric/conversion/cast.hpp - (and boost/cast.hpp is including boost/numeric/conversion/cast.hpp - now). That old function which existed in boost for quite some time used - the bad_numeric_cast as - its exception type so I decided to avoid backward compatibility problems - by adopting it (guessing that the user base for the old code is wider than - for the new code). -

-
-
- -

- This stateless template policy class specifies the rounding - mode used for float to integral conversions. - It supplies the nearbyint() static member function exposed by the converter, - which means that it publicly inherits from this - policy. -

-

- The policy must have the following interface: -

-
template<class S>
-struct YourFloat2IntRounderPolicy
-{
-    typedef S               source_type ;
-    typedef {S or S const&} argument_type ;
-
-    static source_type nearbyint ( argument_type s ) { ... }
-
-    typedef mpl::integral_c<std::float_round_style,std::round_...> round_style ;
-
-} ;
-
-

- These are the rounder classes provided by the library (only the specific - parts are shown, see the general policy form above) -

-
- - - - - -
[Note]Note

- These classes are not intended to be general purpose rounding functions - but specific policies for converter<>. This is why they are not function - objects. -

-
namespace boost { namespace numeric {
-
-
-    template<class S>
-    struct Trunc
-    {
-        static source_type nearbyint ( argument_type s )
-        {
-            using std::floor ;
-            using std::ceil  ;
-
-            return s >= static_cast<S>(0) ? floor(s) : ceil(s) ;
-        }
-
-        typedef mpl::integral_c<std::float_round_style,std::round_toward_zero> round_style ;
-    } ;
-
-
-    template<class S>
-    struct RoundEven
-    {
-        static source_type nearbyint ( argument_type s )
-        {
-            return impl-defined-value ;
-        }
-
-        typedef mpl::integral_c<std::float_round_style,std::round_to_nearest> round_style ;
-    } ;
-
-
-    template<class S>
-    struct Ceil
-    {
-        static source_type nearbyint ( argument_type s )
-        {
-            using std::ceil ;
-            return ceil(s) ;
-        }
-
-        typedef mpl::integral_c<std::float_round_style,std::round_toward_infinity> round_style ;
-    } ;
-
-
-    template<class S>
-    struct Floor
-    {
-        static source_type nearbyint ( argument_type s )
-        {
-            using std::floor ;
-            return floor(s) ;
-        }
-        typedef mpl::integral_c<std::float_round_style,std::round_toward_neg_infinity> round_style ;
-    } ;
-
-} } // namespace numeric, namespace boost
-
-
- - Math - Functions used by the rounder policies -
-

- The rounder policies supplied by this header use math functions floor() - and ceil(). - The standard versions of these functions are introduced in context by a using - directive, so in normal conditions, the standard functions will be used. -

-

- However, if there are other visible corresponding overloads an ambiguity - could arise. In this case, the user can supply her own rounder policy which - could, for instance, use a fully qualified call. -

-

- This technique allows the default rounder policies to be used directly with - user defined types. The user only requires that suitable overloads of floor() - and ceil() - be visible. See also User - Defined Numeric Types support. -

-
-
- -

- This stateless template policy class is used to perform - the actual conversion from Source to Target. It supplies the low_level_convert() - static member function exposed by the converter, which means that it publicly - inherits from this policy. -

-

- The policy must have the following interface: -

-
template<class Traits>
-struct YourRawConverterPolicy
-{
-    typedef typename Traits::result_type   result_type   ;
-    typedef typename Traits::argument_type argument_type ;
-
-    static result_type low_level_convert ( argument_type s ) { return <impl defined> ; }
-} ;
-
-

- This policy is mostly provided as a hook for user defined types which don't - support static_cast<> - conversions to some types -

-

- This is the only raw converter policy class provided by the library: -

-
namespace boost { namespace numeric {
-
-    template<class Traits>
-    struct raw_numeric_converter
-    {
-        typedef typename Traits::result_type   result_type   ;
-        typedef typename Traits::argument_type argument_type ;
-
-        static result_type low_level_convert ( argument_type s )
-        {
-            return static_cast<result_type>(s) ;
-        }
-    } ;
-
-} }
-
-
-
- -

- This stateless template policy class is used only if supplied to override - the internal range checking logic. -

-

- It supplies the validate_range() static member function exposed by the converter, - which means that it publicly inherits from this policy. -

-

- The policy must have the following interface: -

-
template<class Traits>
-struct YourRangeCheckerPolicy
-{
-    typedef typename Traits::argument_type argument_type ;
-
-    // Determines if the value 's' fits in the range of the Target type.
-    static range_check_result out_of_range ( argument_type s ) ;
-
-    // Checks whether the value 's' is out_of_range()
-    // and passes the result of the check to the OverflowHandler policy.
-    static void validate_range ( argument_type s )
-    {
-        OverflowHandler()( out_of_range(s) ) ;
-    }
-} ;
-
-

- This policy is only provided as a hook for - user defined types which require range checking (which is disabled by default - when a UDT is involved). The library provides a class: UseInternalRangeChecker{}; which is a fake - RangeChecker policy used - to signal the converter to use its internal range checking implementation. -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/conversion/doc/html/boost_numericconversion/type_requirements_and_user_defined_types_support.html b/libs/numeric/conversion/doc/html/boost_numericconversion/type_requirements_and_user_defined_types_support.html deleted file mode 100644 index 2683ff932..000000000 --- a/libs/numeric/conversion/doc/html/boost_numericconversion/type_requirements_and_user_defined_types_support.html +++ /dev/null @@ -1,554 +0,0 @@ - - - -Type Requirements and User-defined-types support - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
- -

- Both arithmetic (built-in) and user-defined numeric types require proper - specialization of std::numeric_limits<> - (that is, with (in-class) integral constants). -

-

- The library uses std::numeric_limits<T>::is_specialized to detect whether the type - is builtin or user defined, and std::numeric_limits<T>::is_integer, std::numeric_limits<T>::is_signed to detect whether the type is - integer or floating point; and whether it is signed/unsigned. -

-

- The default Float2IntRounder - policies uses unqualified calls to functions floor() and ceil(); but the standard functions are introduced - in scope by a using directive: -

-
using std::floor ; return floor(s);
-
-

- Therefore, for builtin arithmetic types, the std functions will be used. - User defined types should provide overloaded versions of these functions - in order to use the default rounder policies. If these overloads are defined - within a user namespace argument dependent lookup (ADL) should find them, - but if your compiler has a weak ADL you might need to put these functions - some place else or write your own rounder policy. -

-

- The default Trunc<> - rounder policy needs to determine if the source value is positive or not, - and for this it evaluates the expression s - < static_cast<S>(0). Therefore, - user defined types require a visible operator< in order to use the Trunc<> policy (the default). -

-
-
- -
- - Conversion - Traits -
-

- If a User Defined Type is involved in a conversion, it is assumed - that the UDT has wider - range than any built-in type, and consequently the values of some - converter_traits<> - members are hardwired regardless of the reality. The following table summarizes - this: -

-
    -
  • - Target=UDT - and Source=built-in -
      -
    • - subranged=false -
    • -
    • - supertype=Target -
    • -
    • - subtype=Source -
    • -
    -
  • -
  • - Target=built-in - and Source=UDT -
      -
    • - subranged=true -
    • -
    • - supertype=Source -
    • -
    • - subtype=Target -
    • -
    -
  • -
  • - Target=UDT - and Source=UDT -
      -
    • - subranged=false -
    • -
    • - supertype=Target -
    • -
    • - subtype=Source -
    • -
    -
  • -
-

- The Traits member udt_mixture can be used to detect whether - a UDT is involved and to infer the validity of the other members as shown - above. -

-
- - Range - Checking -
-

- Because User Defined Numeric Types might have peculiar ranges (such as an - unbounded range), this library does not attempt to supply a meaningful range - checking logic when UDTs are involved in a conversion. Therefore, if either - Target or Source are not built-in types, the bundled range checking of the - converter<> - function object is automatically disabled. However, it is possible to supply - a user-defined range-checker. See Special - Policies -

-
-
- -

- There are two components of the converter<> class that might require special - behavior if User Defined Numeric Types are involved: the Range Checking and - the Raw Conversion. -

-

- When both Target and Source are built-in types, the converter class uses - an internal range checking logic which is optimized and customized for the - combined properties of the types. -

-

- However, this internal logic is disabled when either type is User Defined. - In this case, the user can specify an external range - checking policy which will be used in place of the internal code. See numeric_cast_traits - for details on using UDTs with numeric_cast. -

-

- The converter class performs the actual conversion using a Raw Converter - policy. The default raw converter simply performs a static_cast<Target>(source). -

-

- However, if the a UDT is involved, the static_cast - might not work. In this case, the user can implement and pass a different - raw converter policy. See RawConverter - policy for details. -

-
-
- -

- In order to employ UDTs with numeric_cast, - the user should define a numeric_cast_traits - specialization on the UDT for each conversion. Here is an example of specializations - for converting between the UDT and any other type: -

-
namespace boost { namespace numeric {
-template <typename Source>
-struct numeric_cast_traits<UDT, Source>
-{
-    typedef conversion_traits<UDT, Source>      conv_traits;
-
-    //! The following are required:
-    typedef YourOverflowHandlerPolicy           overflow_policy;
-    typedef YourRangeCheckerPolicy<conv_traits> range_checking_policy;
-    typedef YourFloat2IntRounderPolicy<Source>  rounding_policy;
-};
-template <typename Target>
-struct numeric_cast_traits<Target, UDT>
-{
-    typedef conversion_traits<Target, UDT>      conv_traits;
-
-    //! The following are required:
-    typedef YourOverflowHandlerPolicy           overflow_policy;
-    typedef YourRangeCheckerPolicy<conv_traits> range_checking_policy;
-    typedef YourFloat2IntRounderPolicy<UDT>     rounding_policy;
-};
-}}//namespace boost::numeric;
-
-

- These specializations are already defined with default values for the built-in - numeric types. It is possible to disable the generation of specializations - for built-in types by defining BOOST_NUMERIC_CONVERSION_RELAX_BUILT_IN_CAST_TRAITS. - For details on defining custom policies see Converter - Policies. -

-

- Here is a full example of how to define a custom UDT for use with numeric_cast: -

-
//! Define a simple custom number
-struct Double
-    :   boost::ordered_field_operators
-        <
-            Double
-          , boost::ordered_field_operators2< Double, long double
-          , boost::ordered_field_operators2< Double, double
-          , boost::ordered_field_operators2< Double, float
-          , boost::ordered_field_operators2< Double, int
-          , boost::ordered_field_operators2< Double, unsigned int
-          , boost::ordered_field_operators2< Double, long
-          , boost::ordered_field_operators2< Double, unsigned long
-          , boost::ordered_field_operators2< Double, long long
-          , boost::ordered_field_operators2< Double, unsigned long long
-          , boost::ordered_field_operators2< Double, char
-          , boost::ordered_field_operators2< Double, unsigned char
-          , boost::ordered_field_operators2< Double, short
-          , boost::ordered_field_operators2< Double, unsigned short
-        > > > > > > > > > > > > > >
-{
-    Double()
-        : v(0)
-    {}
-
-    template <typename T>
-    explicit Double( T v )
-        : v(static_cast<double>(v))
-    {}
-
-    template <typename T>
-    Double& operator= ( T t )
-    {
-        v = static_cast<double>(t);
-        return *this;
-    }
-
-    bool operator < ( const Double& rhs ) const
-    {
-        return v < rhs.v;
-    }
-
-    template <typename T>
-    bool operator < ( T rhs ) const
-    {
-        return v < static_cast<double>(rhs);
-    }
-
-    bool operator > ( const Double& rhs ) const
-    {
-        return v > rhs.v;
-    }
-
-    template <typename T>
-    bool operator > ( T rhs ) const
-    {
-        return v > static_cast<double>(rhs);
-    }
-
-    bool operator ==( const Double& rhs ) const
-    {
-        return v == rhs.v;
-    }
-
-    template <typename T>
-    bool operator == ( T rhs ) const
-    {
-        return v == static_cast<double>(rhs);
-    }
-
-    bool operator !() const
-    {
-        return v == 0;
-    }
-
-    Double operator -() const
-    {
-        return Double(-v);
-    }
-
-    Double& operator +=( const Double& t )
-    {
-        v += t.v;
-        return *this;
-    }
-
-    template <typename T>
-    Double& operator +=( T t )
-    {
-        v += static_cast<double>(t);
-        return *this;
-    }
-
-    Double& operator -=( const Double& t )
-    {
-        v -= t.v;
-        return *this;
-    }
-
-    template <typename T>
-    Double& operator -=( T t )
-    {
-        v -= static_cast<double>(t);
-        return *this;
-    }
-
-    Double& operator *= ( const Double& factor )
-    {
-        v *= factor.v;
-        return *this;
-    }
-
-    template <typename T>
-    Double& operator *=( T t )
-    {
-        v *= static_cast<double>(t);
-        return *this;
-    }
-
-    Double& operator /= (const Double& divisor)
-    {
-        v /= divisor.v;
-        return *this;
-    }
-
-    template <typename T>
-    Double& operator /=( T t )
-    {
-         v /= static_cast<double>(t);
-        return (*this);
-    }
-
-    double v;
-};
-
-//! Define numeric_limits for the custom type.
-namespace std
-{
-    template<>
-    class numeric_limits<Double> : public numeric_limits<double>
-    {
-    public:
-
-        //! Limit our Double to a range of +/- 100.0
-        static Double (min)()
-        {
-            return Double(1.e-2);
-        }
-
-        static Double (max)()
-        {
-            return Double(1.e2);
-        }
-
-        static Double epsilon()
-        {
-            return Double( std::numeric_limits<double>::epsilon() );
-        }
-    };
-}
-
-//! Define range checking and overflow policies.
-namespace custom
-{
-    //! Define a custom range checker
-    template<typename Traits, typename OverFlowHandler>
-    struct range_checker
-    {
-        typedef typename Traits::argument_type argument_type ;
-        typedef typename Traits::source_type S;
-        typedef typename Traits::target_type T;
-
-        //! Check range of integral types.
-        static boost::numeric::range_check_result out_of_range( argument_type s )
-        {
-            using namespace boost::numeric;
-            if( s > bounds<T>::highest() )
-                return cPosOverflow;
-            else if( s < bounds<T>::lowest() )
-                return cNegOverflow;
-            else
-                return cInRange;
-        }
-
-        static void validate_range ( argument_type s )
-        {
-            BOOST_STATIC_ASSERT( std::numeric_limits<T>::is_bounded );
-            OverFlowHandler()( out_of_range(s) );
-        }
-    };
-
-    //! Overflow handler
-    struct positive_overflow{};
-    struct negative_overflow{};
-
-    struct overflow_handler
-    {
-        void operator() ( boost::numeric::range_check_result r )
-        {
-            using namespace boost::numeric;
-            if( r == cNegOverflow )
-                throw negative_overflow() ;
-            else if( r == cPosOverflow )
-                throw positive_overflow() ;
-        }
-    };
-
-    //! Define a rounding policy and specialize on the custom type.
-    template<class S>
-    struct Ceil : boost::numeric::Ceil<S>{};
-
-    template<>
-    struct Ceil<Double>
-    {
-      typedef Double source_type;
-
-      typedef Double const& argument_type;
-
-      static source_type nearbyint ( argument_type s )
-      {
-#if !defined(BOOST_NO_STDC_NAMESPACE)
-          using std::ceil ;
-#endif
-          return Double( ceil(s.v) );
-      }
-
-      typedef boost::mpl::integral_c< std::float_round_style, std::round_toward_infinity> round_style;
-    };
-
-    //! Define a rounding policy and specialize on the custom type.
-    template<class S>
-    struct Trunc: boost::numeric::Trunc<S>{};
-
-    template<>
-    struct Trunc<Double>
-    {
-      typedef Double source_type;
-
-      typedef Double const& argument_type;
-
-      static source_type nearbyint ( argument_type s )
-      {
-#if !defined(BOOST_NO_STDC_NAMESPACE)
-          using std::floor;
-#endif
-          return Double( floor(s.v) );
-      }
-
-      typedef boost::mpl::integral_c< std::float_round_style, std::round_toward_zero> round_style;
-    };
-}//namespace custom;
-
-namespace boost { namespace numeric {
-
-    //! Define the numeric_cast_traits specializations on the custom type.
-    template <typename S>
-    struct numeric_cast_traits<Double, S>
-    {
-        typedef custom::overflow_handler                         overflow_policy;
-        typedef custom::range_checker
-                <
-                    boost::numeric::conversion_traits<Double, S>
-                  , overflow_policy
-                >                                                range_checking_policy;
-        typedef boost::numeric::Trunc<S>                         rounding_policy;
-    };
-
-    template <typename T>
-    struct numeric_cast_traits<T, Double>
-    {
-        typedef custom::overflow_handler                         overflow_policy;
-        typedef custom::range_checker
-                <
-                    boost::numeric::conversion_traits<T, Double>
-                  , overflow_policy
-                >                                                range_checking_policy;
-        typedef custom::Trunc<Double>                            rounding_policy;
-    };
-
-    //! Define the conversion from the custom type to built-in types and vice-versa.
-    template<typename T>
-    struct raw_converter< conversion_traits< T, Double > >
-    {
-        static T low_level_convert ( const Double& n )
-        {
-            return static_cast<T>( n.v );
-        }
-    };
-
-    template<typename S>
-    struct raw_converter< conversion_traits< Double, S > >
-    {
-        static Double low_level_convert ( const S& n )
-        {
-            return Double(n);
-        }
-    };
-}}//namespace boost::numeric;
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/conversion/doc/html/boostbook.css b/libs/numeric/conversion/doc/html/boostbook.css deleted file mode 100644 index e5d7bb506..000000000 --- a/libs/numeric/conversion/doc/html/boostbook.css +++ /dev/null @@ -1,582 +0,0 @@ -/*============================================================================= - Copyright (c) 2004 Joel de Guzman - http://spirit.sourceforge.net/ - - 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) -=============================================================================*/ - -/*============================================================================= - Body defaults -=============================================================================*/ - - body - { - margin: 1em; - font-family: sans-serif; - } - -/*============================================================================= - Paragraphs -=============================================================================*/ - - p - { - text-align: left; - font-size: 10pt; - line-height: 1.15; - } - -/*============================================================================= - Program listings -=============================================================================*/ - - /* Code on paragraphs */ - p tt.computeroutput - { - font-size: 10pt; - } - - pre.synopsis - { - font-size: 10pt; - margin: 1pc 4% 0pc 4%; - padding: 0.5pc 0.5pc 0.5pc 0.5pc; - } - - .programlisting, - .screen - { - font-size: 10pt; - display: block; - margin: 1pc 4% 0pc 4%; - padding: 0.5pc 0.5pc 0.5pc 0.5pc; - } - - /* Program listings in tables don't get borders */ - td .programlisting, - td .screen - { - margin: 0pc 0pc 0pc 0pc; - padding: 0pc 0pc 0pc 0pc; - } - -/*============================================================================= - Headings -=============================================================================*/ - - h1, h2, h3, h4, h5, h6 - { - text-align: left; - margin: 1em 0em 0.5em 0em; - font-weight: bold; - } - - h1 { font: 140% } - h2 { font: bold 140% } - h3 { font: bold 130% } - h4 { font: bold 120% } - h5 { font: italic 110% } - h6 { font: italic 100% } - - /* Top page titles */ - title, - h1.title, - h2.title - h3.title, - h4.title, - h5.title, - h6.title, - .refentrytitle - { - font-weight: bold; - margin-bottom: 1pc; - } - - h1.title { font-size: 140% } - h2.title { font-size: 140% } - h3.title { font-size: 130% } - h4.title { font-size: 120% } - h5.title { font-size: 110% } - h6.title { font-size: 100% } - - .section h1 - { - margin: 0em 0em 0.5em 0em; - font-size: 140%; - } - - .section h2 { font-size: 140% } - .section h3 { font-size: 130% } - .section h4 { font-size: 120% } - .section h5 { font-size: 110% } - .section h6 { font-size: 100% } - - /* Code on titles */ - h1 tt.computeroutput { font-size: 140% } - h2 tt.computeroutput { font-size: 140% } - h3 tt.computeroutput { font-size: 130% } - h4 tt.computeroutput { font-size: 120% } - h5 tt.computeroutput { font-size: 110% } - h6 tt.computeroutput { font-size: 100% } - -/*============================================================================= - Author -=============================================================================*/ - - h3.author - { - font-size: 100% - } - -/*============================================================================= - Lists -=============================================================================*/ - - li - { - font-size: 10pt; - line-height: 1.3; - } - - /* Unordered lists */ - ul - { - text-align: left; - } - - /* Ordered lists */ - ol - { - text-align: left; - } - -/*============================================================================= - Links -=============================================================================*/ - - a - { - text-decoration: none; /* no underline */ - } - - a:hover - { - text-decoration: underline; - } - -/*============================================================================= - Spirit style navigation -=============================================================================*/ - - .spirit-nav - { - text-align: right; - } - - .spirit-nav a - { - color: white; - padding-left: 0.5em; - } - - .spirit-nav img - { - border-width: 0px; - } - -/*============================================================================= - Table of contents -=============================================================================*/ - - .toc - { - margin: 1pc 4% 0pc 4%; - padding: 0.1pc 1pc 0.1pc 1pc; - font-size: 10pt; - line-height: 1.15; - } - - .toc-main - { - text-align: center; - margin: 3pc 16% 3pc 16%; - padding: 3pc 1pc 3pc 1pc; - line-height: 0.1; - } - - .boost-toc - { - float: right; - padding: 0.5pc; - } - -/*============================================================================= - Tables -=============================================================================*/ - - .table-title, - div.table p.title - { - margin-left: 4%; - padding-right: 0.5em; - padding-left: 0.5em; - } - - .informaltable table, - .table table - { - width: 92%; - margin-left: 4%; - margin-right: 4%; - } - - div.informaltable table, - div.table table - { - padding: 4px; - } - - /* Table Cells */ - div.informaltable table tr td, - div.table table tr td - { - padding: 0.5em; - text-align: left; - } - - div.informaltable table tr th, - div.table table tr th - { - padding: 0.5em 0.5em 0.5em 0.5em; - border: 1pt solid white; - font-size: 120%; - } - -/*============================================================================= - Blurbs -=============================================================================*/ - - div.note, - div.tip, - div.important, - div.caution, - div.warning, - div.sidebar - { - font-size: 10pt; - line-height: 1.2; - display: block; - margin: 1pc 4% 0pc 4%; - padding: 0.5pc 0.5pc 0.5pc 0.5pc; - } - - div.sidebar img - { - padding: 1pt; - } - - - -/*============================================================================= - Callouts -=============================================================================*/ - .line_callout_bug img - { - float: left; - position:relative; - left: 4px; - top: -12px; - clear: left; - margin-left:-22px; - } - - .callout_bug img - { - } - - - -/*============================================================================= - Variable Lists -=============================================================================*/ - - /* Make the terms in definition lists bold */ - div.variablelist dl dt, - span.term - { - font-weight: bold; - font-size: 10pt; - } - - div.variablelist table tbody tr td - { - text-align: left; - vertical-align: top; - padding: 0em 2em 0em 0em; - font-size: 10pt; - margin: 0em 0em 0.5em 0em; - line-height: 1; - } - - /* Make the terms in definition lists bold */ - div.variablelist dl dt - { - margin-bottom: 0.2em; - } - - div.variablelist dl dd - { - margin: 0em 0em 0.5em 2em; - font-size: 10pt; - } - - div.variablelist table tbody tr td p - div.variablelist dl dd p - { - margin: 0em 0em 0.5em 0em; - line-height: 1; - } - -/*============================================================================= - Misc -=============================================================================*/ - - /* Title of books and articles in bibliographies */ - span.title - { - font-style: italic; - } - - span.underline - { - text-decoration: underline; - } - - span.strikethrough - { - text-decoration: line-through; - } - - /* Copyright, Legal Notice */ - div div.legalnotice p - { - text-align: left - } - -/*============================================================================= - Colors -=============================================================================*/ - - @media screen - { - /* Links */ - a - { - color: #0C7445; - } - - a:visited - { - color: #663974; - } - - h1 a, h2 a, h3 a, h4 a, h5 a, h6 a, - h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover, - h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited - { - text-decoration: none; /* no underline */ - color: #000000; - } - - /* Syntax Highlighting */ - .keyword { color: #0000AA; } - .identifier { color: #000000; } - .special { color: #707070; } - .preprocessor { color: #402080; } - .char { color: teal; } - .comment { color: #800000; } - .string { color: teal; } - .number { color: teal; } - .white_bkd { background-color: #E8FBE9; } - .dk_grey_bkd { background-color: #A0DAAC; } - - /* Copyright, Legal Notice */ - .copyright - { - color: #666666; - font-size: small; - } - - div div.legalnotice p - { - color: #666666; - } - - /* Program listing */ - pre.synopsis - { - border: 1px solid #DCDCDC; - border-bottom: 3px solid #9D9D9D; - border-right: 3px solid #9D9D9D; - background-color: #FAFFFB; - } - - .programlisting, - .screen - { - border: 1px solid #DCDCDC; - border-bottom: 3px solid #9D9D9D; - border-right: 3px solid #9D9D9D; - background-color: #FAFFFB; - } - - td .programlisting, - td .screen - { - border: 0px solid #DCDCDC; - } - - /* Blurbs */ - div.note, - div.tip, - div.important, - div.caution, - div.warning, - div.sidebar - { - border: 1px solid #DCDCDC; - border-bottom: 3px solid #9D9D9D; - border-right: 3px solid #9D9D9D; - background-color: #FAFFFB; - } - - /* Table of contents */ - .toc - { - border: 1px solid #DCDCDC; - border-bottom: 3px solid #9D9D9D; - border-right: 3px solid #9D9D9D; - background-color: #FAFFFB; - } - - /* Table of contents */ - .toc-main - { - border: 1px solid #DCDCDC; - border-bottom: 3px solid #9D9D9D; - border-right: 3px solid #9D9D9D; - background-color: #FAFFFB; - } - - - /* Tables */ - div.informaltable table tr td, - div.table table tr td - { - border: 1px solid #DCDCDC; - background-color: #FAFFFB; - } - - div.informaltable table tr th, - div.table table tr th - { - background-color: #E3F9E4; - border: 1px solid #DCDCDC; - } - - /* Misc */ - span.highlight - { - color: #00A000; - } - } - - @media print - { - /* Links */ - a - { - color: black; - } - - a:visited - { - color: black; - } - - .spirit-nav - { - display: none; - } - - /* Program listing */ - pre.synopsis - { - border: 1px solid gray; - background-color: #FAFFFB; - } - - .programlisting, - .screen - { - border: 1px solid gray; - background-color: #FAFFFB; - } - - td .programlisting, - td .screen - { - border: 0px solid #DCDCDC; - } - - /* Table of contents */ - .toc - { - border: 1px solid #DCDCDC; - border-bottom: 3px solid #9D9D9D; - border-right: 3px solid #9D9D9D; - background-color: #FAFFFB; - } - - /* Table of contents */ - .toc-main - { - border: 1px solid #DCDCDC; - border-bottom: 3px solid #9D9D9D; - border-right: 3px solid #9D9D9D; - background-color: #FAFFFB; - } - - .informaltable table, - .table table - { - border: 1px solid #DCDCDC; - border-bottom: 3px solid #9D9D9D; - border-right: 3px solid #9D9D9D; - border-collapse: collapse; - background-color: #FAFFFB; - } - - /* Tables */ - div.informaltable table tr td, - div.table table tr td - { - border: 1px solid #DCDCDC; - background-color: #FAFFFB; - } - - div.informaltable table tr th, - div.table table tr th - { - border: 1px solid #DCDCDC; - background-color: #FAFFFB; - } - - /* Misc */ - span.highlight - { - font-weight: bold; - } - } diff --git a/libs/numeric/conversion/doc/html/images/callouts/R.png b/libs/numeric/conversion/doc/html/images/callouts/R.png deleted file mode 100644 index bee36a1ddd846ec8b96557a7887a831291a80ee6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 293 zcmV+=0owkFP)DI+HApacn~vn(@Ak|Y5DIF17mLDMw! zJWq@S$8p@9(ljMW9>>9P9Pj^=o9CHzUDHVL3L=7{C@!3B+t~LVWm!^4qU$=kt_u-C zmSu?J7@t?768-`)PvMl)e%{@sH#BqG-<9Rs<0(mJAMG*iX48ym}Mu~qpW8e2I risE`kr4;(Uf7d6p)=)}4oPY2QW%&Wf_>p!N00000NkvXXu0mjf`K)=O diff --git a/libs/numeric/conversion/doc/html/images/space.png b/libs/numeric/conversion/doc/html/images/space.png deleted file mode 100644 index 8e6dcfbcf1c1e3092a5dc60e36d7bd45ec07923e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^tU#>7!2~4F{Y_T{QWBmnjv*QolmGnxZ_g~0kmSI+ f_)nmnogD+)duG?Oe9uIHY8X6S{an^LB{Ts5&4?7e diff --git a/libs/numeric/conversion/doc/html/index.html b/libs/numeric/conversion/doc/html/index.html deleted file mode 100644 index 64e5de5ef..000000000 --- a/libs/numeric/conversion/doc/html/index.html +++ /dev/null @@ -1,181 +0,0 @@ - - - -Chapter 1. Boost.NumericConversion - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
Next
-
-
-

-Chapter 1. Boost.NumericConversion

-

-Fernando Luis Cacciola Carballal -

-
-
-

- Distributed under the Boost Software License, Version 1.0. (See accompanying - file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -

-
-
- -
- -

- The Boost Numeric Conversion library is a collection of tools to describe and - perform conversions between values of different numeric - types. -

-

- The library includes a special alternative for a subset of std::numeric_limits<>, the bounds<> - traits class, which provides a consistent way to obtain the boundary - values for the range - of a numeric type. -

-

- It also includes a set of trait - classes which describes the compile-time properties of a conversion - from a source to a target numeric type. Both arithmetic - and user-defined - numeric types can be used. -

-

- A policy-based converter - object which uses conversion_traits - to select an optimized implementation is supplied. Such implementation uses - an optimal range checking code suitable for the source/target combination. -

-
    -
  • - The converter's out-of-range behavior can be customized via an OverflowHandler - policy. -
  • -
  • - For floating-point to integral conversions, the rounding mode can be selected - via the Float2IntRounder - policy. -
  • -
  • - A custom low-level conversion routine (for UDTs for instance) can be passed - via a RawConverter - policy. -
  • -
  • - The optimized automatic range-checking logic can be overridden via a UserRangeChecker - policy. -
  • -
-
-
- - - -

Last revised: December 22, 2016 at 12:49:11 GMT

-
-
Next
- - diff --git a/libs/numeric/conversion/doc/html/numeric_conversion/bibliography.html b/libs/numeric/conversion/doc/html/numeric_conversion/bibliography.html deleted file mode 100644 index aef676344..000000000 --- a/libs/numeric/conversion/doc/html/numeric_conversion/bibliography.html +++ /dev/null @@ -1,88 +0,0 @@ - - - -Bibliography - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHome -
-
- -
    -
  • - Standard Documents: -
      -
    1. - ISO/IEC 14882:98 (C++98 Standard) -
    2. -
    3. - ISO/IEC 9899:1999 (C99 Standard) -
    4. -
    5. - ISO/IEC 10967-1 (Language Independent Arithmetic (LIA), Part I, 1994) -
    6. -
    7. - ISO/IEC 2382-1:1993 (Information Technology - Vocabulary - Part I: - Fundamental Terms) -
    8. -
    9. - ANSI/IEEE 754-1985 [and IEC 60559:1989] (Binary floating-point) -
    10. -
    11. - ANSI/IEEE 854-1988 (Radix Independent floating-point) -
    12. -
    13. - ANSI X3/TR-1-82 (Dictionary for Information Processing Systems) -
    14. -
    15. - ISO/IEC JTC1/SC22/WG14/N753 C9X Revision Proposal: LIA-1 Binding: - Rationale -
    16. -
    -
  • -
  • - Papers: -
      -
    1. - David Goldberg What Every Computer Scientist Should Know About Floating-Point - Arithmetic -
    2. -
    3. - Prof. William Kahan papers on floating-point. -
    4. -
    -
  • -
-
- - - -
-
-
-PrevUpHome -
- - diff --git a/libs/numeric/conversion/doc/html/numeric_conversion/history_and_acknowledgments.html b/libs/numeric/conversion/doc/html/numeric_conversion/history_and_acknowledgments.html deleted file mode 100644 index 5dd8f74f6..000000000 --- a/libs/numeric/conversion/doc/html/numeric_conversion/history_and_acknowledgments.html +++ /dev/null @@ -1,97 +0,0 @@ - - - -History and Acknowledgments - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- - Pre-formal - review -

-
    -
  • - Kevlin Henney, with help from David Abrahams and Beman Dawes, originally - contributed the previous version of numeric_cast<> which already presented the idea - of a runtime range check. -
  • -
  • - Later, Eric Ford, Kevin Lynch and the author spotted some genericity problems - with that numeric_cast<> which prevented it from being used - in a generic layer of math functions. -
  • -
  • - An improved numeric_cast<> which properly handled all combinations - of arithmetic types was presented. -
  • -
  • - David Abrahams and Beman Dawes acknowledged the need of an improved version - of numeric_cast<> - and supported the submission as originally laid out. Daryl Walker and Darin - Adler made some important comments and proposed fixes to the original submission. -
  • -
  • - Special thanks go to Björn Karlsoon who helped the author considerably. - Having found the problems with numeric_cast<> himself, he revised very carefully - the original submission and spot a subtle bug in the range checking implementation. - He also wrote part of this documentation and proof-read and corrected other - parts. And most importantly: the features now presented here in this library - evolved from the original submission as a result of the useful private - communications between Björn and the author. -
  • -
-

- - Post-formal - review -

-
    -
  • - Guillaume Melquiond spoted some documentation and code issues, particularly - about rounding conversions. -
  • -
  • - The following people contributed an important review of the design, documentation - and c ode: Kevin Lynch, Thorsten Ottosen, Paul Bristow, Daryle Walker, - Jhon Torjo, Eric Ford, Gennadiy Rozental. -
  • -
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/conversion/doc/html/standalone_HTML.manifest b/libs/numeric/conversion/doc/html/standalone_HTML.manifest deleted file mode 100644 index 551fe2bfc..000000000 --- a/libs/numeric/conversion/doc/html/standalone_HTML.manifest +++ /dev/null @@ -1,10 +0,0 @@ -index.html -boost_numericconversion/definitions.html -boost_numericconversion/converter___function_object.html -boost_numericconversion/type_requirements_and_user_defined_types_support.html -boost_numericconversion/bounds___traits_class.html -boost_numericconversion/conversion_traits___traits_class.html -boost_numericconversion/numeric_converter_policy_classes.html -boost_numericconversion/improved_numeric_cast__.html -numeric_conversion/history_and_acknowledgments.html -numeric_conversion/bibliography.html diff --git a/libs/numeric/conversion/doc/numeric_cast.qbk b/libs/numeric/conversion/doc/numeric_cast.qbk deleted file mode 100644 index a7d44f4d7..000000000 --- a/libs/numeric/conversion/doc/numeric_cast.qbk +++ /dev/null @@ -1,153 +0,0 @@ -[/ - Boost.Optional - - Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at - http://www.boost.org/LICENSE_1_0.txt) -] - -[section Improved numeric_cast<>] - -[section Introduction] - -The lack of preservation of range makes conversions between numeric types -error prone. This is true for both implicit conversions and explicit -conversions (through `static_cast`). -[link boost_numericconversion.improved_numeric_cast__.numeric_cast `numeric_cast`] -detects loss of range when a numeric type is converted, and throws an -exception if the range cannot be preserved. - -There are several situations where conversions are unsafe: - -* Conversions from an integral type with a wider range than the target integral type. -* Conversions from unsigned to signed (and vice versa) integral types. -* Conversions from floating point types to integral types. - -The C++ Standard does not specify the behavior when a numeric type is -assigned a value that cannot be represented by the type, except for unsigned -integral types \[3.9.1.4\], which must obey the laws of arithmetic modulo 2n -(this implies that the result will be reduced modulo the number that is one -greater than the largest value that can be represented). The fact that the -behavior for overflow is undefined for all conversions (except the -aforementioned unsigned to unsigned) makes any code that may produce -positive or negative overflows exposed to portability issues. - -By default `numeric_cast` adheres to the rules for implicit conversions mandated by -the C++ Standard, such as truncating floating point types when converting -to integral types. The implementation must guarantee that for a conversion -to a type that can hold all possible values of the source type, there will -be no runtime overhead. - -[endsect] - -[section numeric_cast] - - template inline - Target numeric_cast( Source arg ) - { - typedef conversion_traits conv_traits; - typedef numeric_cast_traits cast_traits; - typedef converter - < - Target, - Source, - conv_traits, - typename cast_traits::overflow_policy, - typename cast_traits::rounding_policy, - raw_converter, - typename cast_traits::range_checking_policy - > converter; - return converter::convert(arg); - } - -`numeric_cast` returns the result of converting a value of type Source -to a value of type Target. If out-of-range is detected, an overflow policy -is executed whose default behavior is to throw an an exception (see -[link numeric_conversion_bad_numeric_cast bad_numeric_cast], -[link numeric_conversion_negative_overflow negative_overflow] and -[link numeric_conversion_possitive_overflow positive_overflow] -). - -[endsect] - -[section numeric_cast_traits] - - template - struct numeric_cast_traits - { - typedef def_overflow_handler overflow_policy; - typedef UseInternalRangeChecker range_checking_policy; - typedef Trunc rounding_policy; - }; - -The behavior of `numeric_cast` may be tailored for custom numeric types through -the specialization of `numeric_cast_traits`. (see -[link boost_numericconversion.type_requirements_and_user_defined_types_support User Defined Types] -for details. -) - -[endsect] - -[section Examples] - -The following example performs some typical conversions between numeric types: - -#include -#include - - int main() - { - using boost::numeric_cast; - - using boost::numeric::bad_numeric_cast; - using boost::numeric::positive_overflow; - using boost::numeric::negative_overflow; - - try - { - int i=42; - short s=numeric_cast(i); // This conversion succeeds (is in range) - } - catch(negative_overflow& e) { - std::cout << e.what(); - } - catch(positive_overflow& e) { - std::cout << e.what(); - } - - try - { - float f=-42.1234; - - // This will cause a boost::numeric::negative_overflow exception to be thrown - unsigned int i=numeric_cast(f); - } - catch(bad_numeric_cast& e) { - std::cout << e.what(); - } - - double d= f + numeric_cast(123); // int -> double - - unsigned long l=std::numeric_limits::max(); - - try - { - // This will cause a boost::numeric::positive_overflow exception to be thrown - // NOTE: *operations* on unsigned integral types cannot cause overflow - // but *conversions* to a signed type ARE range checked by numeric_cast. - - unsigned char c=numeric_cast(l); - } - catch(positive_overflow& e) { - std::cout << e.what(); - } - - - return 0; - } - -[endsect] - -[endsect] diff --git a/libs/numeric/conversion/doc/requirements.qbk b/libs/numeric/conversion/doc/requirements.qbk deleted file mode 100644 index fe4bae2d1..000000000 --- a/libs/numeric/conversion/doc/requirements.qbk +++ /dev/null @@ -1,448 +0,0 @@ -[/ - Boost.Optional - - Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at - http://www.boost.org/LICENSE_1_0.txt) -] - -[section Type Requirements and User-defined-types support] - -[section Type Requirements] - -Both arithmetic (built-in) and user-defined numeric types require proper -specialization of `std::numeric_limits<>` (that is, with (in-class) integral -constants). - -The library uses `std::numeric_limits::is_specialized` to detect whether -the type is builtin or user defined, and `std::numeric_limits::is_integer`, -`std::numeric_limits::is_signed` to detect whether the type is integer -or floating point; and whether it is signed/unsigned. - -The default `Float2IntRounder` policies uses unqualified calls to functions -`floor()` and `ceil()`; but the standard functions are introduced in scope -by a using directive: - - using std::floor ; return floor(s); - -Therefore, for builtin arithmetic types, the std functions will be used. -User defined types should provide overloaded versions of these functions in -order to use the default rounder policies. If these overloads are defined -within a user namespace argument dependent lookup (ADL) should find them, -but if your compiler has a weak ADL you might need to put these functions -some place else or write your own rounder policy. - -The default `Trunc<>` rounder policy needs to determine if the source value -is positive or not, and for this it evaluates the expression -`s < static_cast(0)`. Therefore, user defined types require a visible -`operator<` in order to use the `Trunc<>` policy (the default). - - -[endsect] - -[section UDT's special semantics] - -[heading Conversion Traits] - -If a User Defined Type is involved in a conversion, it is ['assumed] that -the UDT has [link boost_numericconversion.definitions.range_and_precision wider range] -than any built-in type, and consequently the values -of some `converter_traits<>` members are hardwired regardless of the reality. -The following table summarizes this: - -* `Target=`['UDT] and `Source=`['built-in] - * `subranged=false` - * `supertype=Target` - * `subtype=Source` -* `Target=`['built-in] and `Source=`['UDT] - * `subranged=true` - * `supertype=Source` - * `subtype=Target` - -* `Target=`['UDT] and `Source=`['UDT] - * `subranged=false` - * `supertype=Target` - * `subtype=Source` - - -The `Traits` member `udt_mixture` can be used to detect whether a UDT is involved -and to infer the validity of the other members as shown above. - -[heading Range Checking] - -Because User Defined Numeric Types might have peculiar ranges (such as an -unbounded range), this library does not attempt to supply a meaningful range -checking logic when UDTs are involved in a conversion. Therefore, if either -Target or Source are not built-in types, the bundled range checking of the -`converter<>` function object is automatically disabled. However, it is possible -to supply a user-defined range-checker. See -[link boost_numericconversion.type_requirements_and_user_defined_types_support.special_policies Special Policies] - -[endsect] - -[section Special Policies] - -There are two components of the `converter<>` class that might require special -behavior if User Defined Numeric Types are involved: the Range Checking and the -Raw Conversion. - -When both Target and Source are built-in types, the converter class uses an internal -range checking logic which is optimized and customized for the combined properties -of the types. - -However, this internal logic is disabled when either type is User Defined. -In this case, the user can specify an ['external] range checking policy which will be -used in place of the internal code. See -[link boost_numericconversion.type_requirements_and_user_defined_types_support.udts_with_numeric_cast numeric_cast_traits] -for details on using UDTs with `numeric_cast`. - -The converter class performs the actual conversion using a Raw Converter policy. -The default raw converter simply performs a `static_cast(source)`. - -However, if the a UDT is involved, the `static_cast` might not work. In this case, -the user can implement and pass a different raw converter policy. -See [link boost_numericconversion.numeric_converter_policy_classes.policy_rawconverter RawConverter] policy for details. - -[endsect] - -[section UDTs with numeric_cast] - -In order to employ UDTs with `numeric_cast`, the user should define -a `numeric_cast_traits` specialization on the UDT for each conversion. -Here is an example of specializations for converting between the UDT -and any other type: - - namespace boost { namespace numeric { - template - struct numeric_cast_traits - { - typedef conversion_traits conv_traits; - - //! The following are required: - typedef YourOverflowHandlerPolicy overflow_policy; - typedef YourRangeCheckerPolicy range_checking_policy; - typedef YourFloat2IntRounderPolicy rounding_policy; - }; - template - struct numeric_cast_traits - { - typedef conversion_traits conv_traits; - - //! The following are required: - typedef YourOverflowHandlerPolicy overflow_policy; - typedef YourRangeCheckerPolicy range_checking_policy; - typedef YourFloat2IntRounderPolicy rounding_policy; - }; - }}//namespace boost::numeric; - -These specializations are already defined with default values for the built-in -numeric types. It is possible to disable the generation of specializations for -built-in types by defining `BOOST_NUMERIC_CONVERSION_RELAX_BUILT_IN_CAST_TRAITS`. -For details on defining custom policies see [link boost_numericconversion.numeric_converter_policy_classes Converter Policies]. - -Here is a full example of how to define a custom UDT for use with `numeric_cast`: - - //! Define a simple custom number - struct Double - : boost::ordered_field_operators - < - Double - , boost::ordered_field_operators2< Double, long double - , boost::ordered_field_operators2< Double, double - , boost::ordered_field_operators2< Double, float - , boost::ordered_field_operators2< Double, int - , boost::ordered_field_operators2< Double, unsigned int - , boost::ordered_field_operators2< Double, long - , boost::ordered_field_operators2< Double, unsigned long - , boost::ordered_field_operators2< Double, long long - , boost::ordered_field_operators2< Double, unsigned long long - , boost::ordered_field_operators2< Double, char - , boost::ordered_field_operators2< Double, unsigned char - , boost::ordered_field_operators2< Double, short - , boost::ordered_field_operators2< Double, unsigned short - > > > > > > > > > > > > > > - { - Double() - : v(0) - {} - - template - explicit Double( T v ) - : v(static_cast(v)) - {} - - template - Double& operator= ( T t ) - { - v = static_cast(t); - return *this; - } - - bool operator < ( const Double& rhs ) const - { - return v < rhs.v; - } - - template - bool operator < ( T rhs ) const - { - return v < static_cast(rhs); - } - - bool operator > ( const Double& rhs ) const - { - return v > rhs.v; - } - - template - bool operator > ( T rhs ) const - { - return v > static_cast(rhs); - } - - bool operator ==( const Double& rhs ) const - { - return v == rhs.v; - } - - template - bool operator == ( T rhs ) const - { - return v == static_cast(rhs); - } - - bool operator !() const - { - return v == 0; - } - - Double operator -() const - { - return Double(-v); - } - - Double& operator +=( const Double& t ) - { - v += t.v; - return *this; - } - - template - Double& operator +=( T t ) - { - v += static_cast(t); - return *this; - } - - Double& operator -=( const Double& t ) - { - v -= t.v; - return *this; - } - - template - Double& operator -=( T t ) - { - v -= static_cast(t); - return *this; - } - - Double& operator *= ( const Double& factor ) - { - v *= factor.v; - return *this; - } - - template - Double& operator *=( T t ) - { - v *= static_cast(t); - return *this; - } - - Double& operator /= (const Double& divisor) - { - v /= divisor.v; - return *this; - } - - template - Double& operator /=( T t ) - { - v /= static_cast(t); - return (*this); - } - - double v; - }; - - //! Define numeric_limits for the custom type. - namespace std - { - template<> - class numeric_limits : public numeric_limits - { - public: - - //! Limit our Double to a range of +/- 100.0 - static Double (min)() - { - return Double(1.e-2); - } - - static Double (max)() - { - return Double(1.e2); - } - - static Double epsilon() - { - return Double( std::numeric_limits::epsilon() ); - } - }; - } - - //! Define range checking and overflow policies. - namespace custom - { - //! Define a custom range checker - template - struct range_checker - { - typedef typename Traits::argument_type argument_type ; - typedef typename Traits::source_type S; - typedef typename Traits::target_type T; - - //! Check range of integral types. - static boost::numeric::range_check_result out_of_range( argument_type s ) - { - using namespace boost::numeric; - if( s > bounds::highest() ) - return cPosOverflow; - else if( s < bounds::lowest() ) - return cNegOverflow; - else - return cInRange; - } - - static void validate_range ( argument_type s ) - { - BOOST_STATIC_ASSERT( std::numeric_limits::is_bounded ); - OverFlowHandler()( out_of_range(s) ); - } - }; - - //! Overflow handler - struct positive_overflow{}; - struct negative_overflow{}; - - struct overflow_handler - { - void operator() ( boost::numeric::range_check_result r ) - { - using namespace boost::numeric; - if( r == cNegOverflow ) - throw negative_overflow() ; - else if( r == cPosOverflow ) - throw positive_overflow() ; - } - }; - - //! Define a rounding policy and specialize on the custom type. - template - struct Ceil : boost::numeric::Ceil{}; - - template<> - struct Ceil - { - typedef Double source_type; - - typedef Double const& argument_type; - - static source_type nearbyint ( argument_type s ) - { - #if !defined(BOOST_NO_STDC_NAMESPACE) - using std::ceil ; - #endif - return Double( ceil(s.v) ); - } - - typedef boost::mpl::integral_c< std::float_round_style, std::round_toward_infinity> round_style; - }; - - //! Define a rounding policy and specialize on the custom type. - template - struct Trunc: boost::numeric::Trunc{}; - - template<> - struct Trunc - { - typedef Double source_type; - - typedef Double const& argument_type; - - static source_type nearbyint ( argument_type s ) - { - #if !defined(BOOST_NO_STDC_NAMESPACE) - using std::floor; - #endif - return Double( floor(s.v) ); - } - - typedef boost::mpl::integral_c< std::float_round_style, std::round_toward_zero> round_style; - }; - }//namespace custom; - - namespace boost { namespace numeric { - - //! Define the numeric_cast_traits specializations on the custom type. - template - struct numeric_cast_traits - { - typedef custom::overflow_handler overflow_policy; - typedef custom::range_checker - < - boost::numeric::conversion_traits - , overflow_policy - > range_checking_policy; - typedef boost::numeric::Trunc rounding_policy; - }; - - template - struct numeric_cast_traits - { - typedef custom::overflow_handler overflow_policy; - typedef custom::range_checker - < - boost::numeric::conversion_traits - , overflow_policy - > range_checking_policy; - typedef custom::Trunc rounding_policy; - }; - - //! Define the conversion from the custom type to built-in types and vice-versa. - template - struct raw_converter< conversion_traits< T, Double > > - { - static T low_level_convert ( const Double& n ) - { - return static_cast( n.v ); - } - }; - - template - struct raw_converter< conversion_traits< Double, S > > - { - static Double low_level_convert ( const S& n ) - { - return Double(n); - } - }; - }}//namespace boost::numeric; - -[endsect] - -[endsect] - diff --git a/libs/numeric/conversion/index.html b/libs/numeric/conversion/index.html deleted file mode 100644 index 305b7385a..000000000 --- a/libs/numeric/conversion/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - -Automatic redirection failed, please go to -doc/index.html
-

� Copyright Beman Dawes, 2001

-

Distributed under the Boost Software License, Version 1.0. (See accompanying -file LICENSE_1_0.txt or copy -at www.boost.org/LICENSE_1_0.txt)

- - diff --git a/libs/numeric/conversion/test/Jamfile.v2 b/libs/numeric/conversion/test/Jamfile.v2 deleted file mode 100644 index d4fc25aeb..000000000 --- a/libs/numeric/conversion/test/Jamfile.v2 +++ /dev/null @@ -1,42 +0,0 @@ -# Boost Numeric Conversion Library test Jamfile -# -# Copyright (C) 2003, Fernando Luis Cacciola Carballal. -# -# Distributed under the Boost Software License, Version 1.0. (See -# accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) -# -# import testing ; - -project numeric_conversion_unit_tests - : - requirements - . - gcc:"-ftemplate-depth-300 -g0" - darwin:"-ftemplate-depth-300 -g0" - ; - -test-suite minimal - : - [ run bounds_test.cpp ] - [ run traits_test.cpp ] - [ run converter_test.cpp ] - [ run udt_support_test.cpp ] - [ run numeric_cast_test.cpp ] - [ run udt_example_0.cpp ] - [ run numeric_cast_traits_test.cpp ] - ; - -test-suite full - : - minimal - [ compile-fail compile_fail/built_in_numeric_cast_traits.cpp ] - ; - -test-suite extra ; - -explicit minimal ; -explicit extra ; - -# support the old test target -test-suite numeric/conversion : full ; diff --git a/libs/numeric/conversion/test/bounds_test.cpp b/libs/numeric/conversion/test/bounds_test.cpp deleted file mode 100644 index 504c47c52..000000000 --- a/libs/numeric/conversion/test/bounds_test.cpp +++ /dev/null @@ -1,101 +0,0 @@ -// (c) Copyright Fernando Luis Cacciola Carballal 2000-2004 -// 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 library home page at http://www.boost.org/libs/numeric/conversion -// -// Contact the author at: fernando_cacciola@hotmail.com -// -#include -#include -#include - -#include "boost/numeric/conversion/bounds.hpp" - -#ifdef __BORLANDC__ -#pragma hdrstop -#endif - -#include "test_helpers.cpp" - -using namespace std ; -using namespace boost ; -using namespace numeric ; - -// Test the fields of boost::numeric::bounds<> against the expected values. -// -template -void test_bounds( T expected_lowest, T expected_highest, T expected_smallest ) -{ - T lowest = bounds::lowest () ; - T highest = bounds::highest () ; - T smallest = bounds::smallest() ; - - BOOST_CHECK_MESSAGE ( lowest == expected_lowest, - "bounds<" << typeid(T).name() << ">::lowest() = " << printable(lowest) << ". Expected " << printable(expected_lowest) - ) ; - - BOOST_CHECK_MESSAGE ( highest == expected_highest, - "bounds<" << typeid(T).name() << ">::highest() = " << printable(highest) << ". Expected " << printable(expected_highest) - ) ; - - BOOST_CHECK_MESSAGE ( smallest == expected_smallest, - "bounds<" << typeid(T).name() << ">::smallest() = " << printable(smallest) << ". Expected " << printable(expected_smallest) - ) ; -} - - -template -void test_bounds_integer( MATCH_FNTPL_ARG(T) ) -{ - test_bounds( numeric_limits::min BOOST_PREVENT_MACRO_SUBSTITUTION() - , numeric_limits::max BOOST_PREVENT_MACRO_SUBSTITUTION() - , static_cast(1) - ) ; -} -template -void test_bounds_float( MATCH_FNTPL_ARG(T)) -{ - test_bounds( -numeric_limits::max BOOST_PREVENT_MACRO_SUBSTITUTION () - , numeric_limits::max BOOST_PREVENT_MACRO_SUBSTITUTION () - , numeric_limits::min BOOST_PREVENT_MACRO_SUBSTITUTION () - ) ; -} - -void test_bounds_integers() -{ - test_bounds_integer( SET_FNTPL_ARG(unsigned char) ) ; - test_bounds_integer( SET_FNTPL_ARG(signed char) ) ; - test_bounds_integer( SET_FNTPL_ARG(char) ) ; - test_bounds_integer( SET_FNTPL_ARG(unsigned short) ) ; - test_bounds_integer( SET_FNTPL_ARG(short) ) ; - test_bounds_integer( SET_FNTPL_ARG(unsigned int) ) ; - test_bounds_integer( SET_FNTPL_ARG(int) ) ; - test_bounds_integer( SET_FNTPL_ARG(unsigned long) ) ; - test_bounds_integer( SET_FNTPL_ARG(long) ) ; -} - -void test_bounds_floats() -{ - test_bounds_float( SET_FNTPL_ARG(float) ); - test_bounds_float( SET_FNTPL_ARG(double) ); - test_bounds_float( SET_FNTPL_ARG(long double) ); -} - -void test_bounds() -{ - test_bounds_integers() ; - test_bounds_floats () ; -} - - -int test_main( int, char * [] ) -{ - cout << setprecision( std::numeric_limits::digits10 ) ; - - test_bounds(); - - return 0; -} - diff --git a/libs/numeric/conversion/test/compile_fail/built_in_numeric_cast_traits.cpp b/libs/numeric/conversion/test/compile_fail/built_in_numeric_cast_traits.cpp deleted file mode 100644 index c795d88b3..000000000 --- a/libs/numeric/conversion/test/compile_fail/built_in_numeric_cast_traits.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// -//! Copyright (c) 2011 -//! Brandon Kohn -// -// Distributed under the 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//! Generate default traits for the specified source and target. -#define BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TRAITS(r, state) \ -template <> \ -struct numeric_cast_traits< \ - BOOST_PP_SEQ_ELEM( BOOST_PP_TUPLE_ELEM(4,0,state) \ - , BOOST_PP_TUPLE_ELEM(4,3,state) ) \ - , BOOST_PP_TUPLE_ELEM(4,2,state)> \ -{ \ - typedef def_overflow_handler overflow_policy; \ - typedef UseInternalRangeChecker range_checking_policy; \ - typedef Trunc rounding_policy; \ -}; \ -/***/ - -#define BOOST_NUMERIC_CONVERSION_TUPLE_SENTINAL(r, state) \ - BOOST_PP_LESS \ - ( \ - BOOST_PP_TUPLE_ELEM(4,0,state) \ - , BOOST_PP_TUPLE_ELEM(4,1,state) \ - ) \ -/***/ - -#define BOOST_NUMERIC_CONVERSION_INC_OP(r, state) \ - ( \ - BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4,0,state)) \ - , BOOST_PP_TUPLE_ELEM(4,1,state) \ - , BOOST_PP_TUPLE_ELEM(4,2,state) \ - , BOOST_PP_TUPLE_ELEM(4,3,state) \ - ) \ -/***/ - -#define BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TARGET_STEP(r, state) \ - BOOST_PP_FOR \ - ( \ - ( \ - 0 \ - , BOOST_PP_TUPLE_ELEM(4,1,state) \ - , BOOST_PP_SEQ_ELEM(BOOST_PP_TUPLE_ELEM(4,0,state),BOOST_PP_TUPLE_ELEM(4,2,state)) \ - , BOOST_PP_TUPLE_ELEM(4,2,state) \ - ) \ - , BOOST_NUMERIC_CONVERSION_TUPLE_SENTINAL \ - , BOOST_NUMERIC_CONVERSION_INC_OP \ - , BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TRAITS \ - ) \ -/***/ - -#define BOOST_NUMERIC_CONVERSION_GENERATE_BUILTIN_CAST_TRAITS(types) \ - BOOST_PP_FOR \ - ( \ - (0,BOOST_PP_SEQ_SIZE(types),types,_) \ - , BOOST_NUMERIC_CONVERSION_TUPLE_SENTINAL \ - , BOOST_NUMERIC_CONVERSION_INC_OP \ - , BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TARGET_STEP \ - ) \ -/***/ - -namespace boost { namespace numeric { -#if !defined( BOOST_NO_INT64_T ) - //! Generate the specializations for the built-in types. - BOOST_NUMERIC_CONVERSION_GENERATE_BUILTIN_CAST_TRAITS - ( - (char) - (boost::int8_t) - (boost::uint8_t) - (boost::int16_t) - (boost::uint16_t) - (boost::int32_t) - (boost::uint32_t) - (boost::int64_t) - (boost::uint64_t) - (float) - (double) - (long double) - ) -#else - BOOST_NUMERIC_CONVERSION_GENERATE_BUILTIN_CAST_TRAITS - ( - (char) - (boost::int8_t) - (boost::uint8_t) - (boost::int16_t) - (boost::uint16_t) - (boost::int32_t) - (boost::uint32_t) - (float) - (double) - (long double) - ) -#endif -}}//namespace boost::numeric; - -int test_main( int argc, char * argv[] ) -{ - //! This test should not compile. - return 1; -} - -#undef BOOST_NUMERIC_CONVERSION_GENERATE_BUILTIN_CAST_TRAITS -#undef BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TARGET_STEP -#undef BOOST_NUMERIC_CONVERSION_INC_OP -#undef BOOST_NUMERIC_CONVERSION_TUPLE_SENTINAL -#undef BOOST_NUMERIC_CONVERSION_GENERATE_CAST_TRAITS diff --git a/libs/numeric/conversion/test/converter_test.cpp b/libs/numeric/conversion/test/converter_test.cpp deleted file mode 100644 index a460df158..000000000 --- a/libs/numeric/conversion/test/converter_test.cpp +++ /dev/null @@ -1,562 +0,0 @@ -// (c) Copyright Fernando Luis Cacciola Carballal 2000-2004 -// 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 library home page at http://www.boost.org/libs/numeric/conversion -// -// Contact the author at: fernando_cacciola@hotmail.com -// -#include -#include -#include -#include -#include -#include -#include - -#include "boost/config.hpp" -#include "boost/cstdint.hpp" -#include "boost/utility.hpp" - -// -// Borland 5.5 lacks the following math overloads -// -#if BOOST_WORKAROUND(__BORLANDC__, <= 0x551) -namespace std -{ - -inline float ceil (float x) { return std::ceil ( static_cast(x)); } -inline float floor (float x) { return std::floor ( static_cast(x)); } -inline long double ceil (long double x) { return std::ceill (x); } -inline long double floor (long double x) { return std::floorl(x); } - -} // namespace std -#endif - -#include "boost/numeric/conversion/converter.hpp" -#include "boost/numeric/conversion/cast.hpp" - -#ifdef __BORLANDC__ -#pragma hdrstop -#endif - -#include "test_helpers.cpp" -#include "test_helpers2.cpp" -#include "test_helpers3.cpp" - -#include "boost/mpl/alias.hpp" - -using std::cout ; - -// A generic 'abs' function. -template inline N absG ( N v ) -{ - return v < static_cast(0) ? static_cast(-v) : v ; -} -template<> inline unsigned char absG ( unsigned char v ) { return v ; } -template<> inline unsigned short absG ( unsigned short v ) { return v ; } -template<> inline unsigned int absG ( unsigned int v ) { return v ; } -template<> inline unsigned long absG ( unsigned long v ) { return v ; } - -template inline void unused_variable ( T const& ) {} -// -// The following function excersizes specific conversions that cover -// usual and boundary cases for each relevant combination. -// -void test_conversions() -{ - using namespace boost ; - using namespace numeric ; - - // To help the test found possible bugs a random numbers are used. -#if !defined(BOOST_NO_STDC_NAMESPACE) - using std::rand ; -#endif - - boost::int16_t v16 ; - boost::uint16_t uv16 ; - boost::int32_t v32 ; - boost::uint32_t uv32 ; - - volatile float fv ; // avoid this to be cached internally in some fpu register - volatile double dv ; // avoid this to be cached internally in some fpu register - - // - // sample (representative) conversions: - // - cout << "Testing representative conversions\n"; - - // integral to integral - - // signed to signed - - // not subranged - v16 = static_cast(rand()); - TEST_SUCCEEDING_CONVERSION_DEF(boost::int32_t,boost::int16_t,v16,v16); - - // subranged - v16 = static_cast(rand()); - TEST_SUCCEEDING_CONVERSION_DEF(boost::int16_t,boost::int32_t,v16,v16); - TEST_POS_OVERFLOW_CONVERSION_DEF(boost::int16_t,boost::int32_t,bounds::highest() + boost::int32_t(1) ) ; - TEST_NEG_OVERFLOW_CONVERSION_DEF(boost::int16_t,boost::int32_t,bounds::lowest() - boost::int32_t(1) ) ; - - // signed to unsigned - - // subranged - v32 = absG(static_cast(rand())); - v16 = absG(static_cast(rand())); - TEST_SUCCEEDING_CONVERSION_DEF(boost::uint32_t,boost::int32_t,v32,v32); - TEST_SUCCEEDING_CONVERSION_DEF(boost::uint16_t,boost::int32_t,v16,v16); - TEST_POS_OVERFLOW_CONVERSION_DEF(boost::uint16_t,boost::int32_t,bounds::highest() + boost::int32_t(1) ) ; - TEST_NEG_OVERFLOW_CONVERSION_DEF(boost::uint32_t,boost::int32_t,boost::int32_t(-1) ) ; - - // unsigned to signed - - // not subranged - v32 = absG(static_cast(rand())); - TEST_SUCCEEDING_CONVERSION_DEF(boost::int32_t,boost::uint32_t,v32,v32); - - // subranged - v16 = absG(static_cast(rand())); - TEST_SUCCEEDING_CONVERSION_DEF(boost::int16_t,boost::uint32_t,v16,v16); - TEST_POS_OVERFLOW_CONVERSION_DEF(boost::int32_t,boost::uint32_t,bounds::highest() ) ; - TEST_POS_OVERFLOW_CONVERSION_DEF(boost::int16_t,boost::uint32_t,bounds::highest() ) ; - - // unsigned to unsigned - - // not subranged - uv16 = static_cast(rand()); - TEST_SUCCEEDING_CONVERSION_DEF(boost::uint32_t,boost::uint16_t,uv16,uv16); - - // subranged - uv16 = static_cast(rand()); - TEST_SUCCEEDING_CONVERSION_DEF(boost::uint16_t,boost::uint32_t,uv16,uv16); - TEST_POS_OVERFLOW_CONVERSION_DEF(boost::uint16_t,boost::uint32_t,bounds::highest() ) ; - - // integral to float - - // from signed integral - v32 = static_cast(rand()); - TEST_SUCCEEDING_CONVERSION_DEF(double,boost::int32_t,v32,v32); - - // from uint32_tegral - uv32 = static_cast(rand()); - TEST_SUCCEEDING_CONVERSION_DEF(double,boost::uint32_t,uv32,uv32); - - // float to integral - - // to signed integral - v32 = static_cast(rand()); - TEST_SUCCEEDING_CONVERSION_DEF(boost::int32_t,double,v32,v32); - - dv = static_cast(bounds::highest()) + 1.0 ; - TEST_POS_OVERFLOW_CONVERSION_DEF(boost::int32_t,double,dv) ; - TEST_NEG_OVERFLOW_CONVERSION_DEF(boost::int32_t,double,-dv) ; - - // float to float - - // not subranged - fv = static_cast(rand()) / static_cast(3) ; - TEST_SUCCEEDING_CONVERSION_DEF(double,float,fv,fv); - - - // subranged - fv = static_cast(rand()) / static_cast(3) ; - TEST_SUCCEEDING_CONVERSION_DEF(float,double,fv,fv); - TEST_POS_OVERFLOW_CONVERSION_DEF(float,double,bounds::highest()) ; - TEST_NEG_OVERFLOW_CONVERSION_DEF(float,double,bounds::lowest ()) ; -} - -// Custom OverflowHandler -struct custom_overflow_handler -{ - void operator() ( boost::numeric::range_check_result r ) - { - if ( r == boost::numeric::cNegOverflow ) - cout << "negative_overflow detected!\n" ; - else if ( r == boost::numeric::cPosOverflow ) - cout << "positive_overflow detected!\n" ; - } -} ; - -template -void test_overflow_handler( MATCH_FNTPL_ARG(T), MATCH_FNTPL_ARG(S), MATCH_FNTPL_ARG(OverflowHandler), - PostCondition pos, - PostCondition neg - ) -{ - typedef boost::numeric::conversion_traits traits ; - typedef boost::numeric::converter converter ; - - static const S psrc = boost::numeric::bounds::highest(); - static const S nsrc = boost::numeric::bounds::lowest (); - - static const T pres = static_cast(psrc); - static const T nres = static_cast(nsrc); - - test_conv_base ( ConversionInstance(pres,psrc,pos) ) ; - test_conv_base ( ConversionInstance(nres,nsrc,neg) ) ; -} - -template -void test_overflow_handlers( MATCH_FNTPL_ARG(T), MATCH_FNTPL_ARG(S) ) -{ - cout << "Testing Silent Overflow Handler policy\n"; - - test_overflow_handler( SET_FNTPL_ARG(T), - SET_FNTPL_ARG(S), - SET_FNTPL_ARG(boost::numeric::silent_overflow_handler), - c_converted, - c_converted - ) ; - - cout << "Testing Default Overflow Handler policy\n"; - - test_overflow_handler( SET_FNTPL_ARG(T), - SET_FNTPL_ARG(S), - SET_FNTPL_ARG(boost::numeric::def_overflow_handler), - c_pos_overflow, - c_neg_overflow - ) ; - - cout << "Testing Custom (User-Defined) Overflow Handler policy\n"; - - test_overflow_handler( SET_FNTPL_ARG(T), - SET_FNTPL_ARG(S), - SET_FNTPL_ARG(custom_overflow_handler), - c_converted, - c_converted - ) ; -} - -// For a given float-type number 'n' of integer value (n.0), check the conversions -// within the range [n-1,n+1] taking values at: (n-1,n-0.5,n,n+0.5,n+1). -// For each sampled value there is an expected result and a PostCondition according to the -// specified round_style. -// -template -void test_rounding_conversion ( MATCH_FNTPL_ARG(T), MATCH_FNTPL_ARG(Float2IntRounder), - S s, - PostCondition resl1, - PostCondition resl0, - PostCondition res, - PostCondition resr0, - PostCondition resr1 - ) -{ - typedef boost::numeric::conversion_traits Traits ; - - typedef boost::numeric::converter - Converter ; - - S sl1 = s - static_cast(1); - S sl0 = s - static_cast(0.5); - S sr0 = s + static_cast(0.5); - S sr1 = s + static_cast(1); - - T tl1 = static_cast( Converter::nearbyint(sl1) ); - T tl0 = static_cast( Converter::nearbyint(sl0) ); - T t = static_cast( Converter::nearbyint(s) ); - T tr0 = static_cast( Converter::nearbyint(sr0) ); - T tr1 = static_cast( Converter::nearbyint(sr1) ); - - test_conv_base ( ConversionInstance(tl1,sl1,resl1) ) ; - test_conv_base ( ConversionInstance(tl0,sl0,resl0) ) ; - test_conv_base ( ConversionInstance(t,s,res) ) ; - test_conv_base ( ConversionInstance(tr0,sr0,resr0) ) ; - test_conv_base ( ConversionInstance(tr1,sr1,resr1) ) ; -} - - -template -void test_round_style( MATCH_FNTPL_ARG(T), MATCH_FNTPL_ARG(S) ) -{ - S min = boost::numeric::bounds::lowest(); - S max = boost::numeric::bounds::highest(); - - cout << "Testing 'Trunc' Float2IntRounder policy\n"; - - test_rounding_conversion(SET_FNTPL_ARG(T), - SET_FNTPL_ARG(boost::numeric::Trunc), - min, - c_neg_overflow, - c_converted, - c_converted, - c_converted, - c_converted - ) ; - - test_rounding_conversion(SET_FNTPL_ARG(T), - SET_FNTPL_ARG(boost::numeric::Trunc), - max, - c_converted, - c_converted, - c_converted, - c_converted, - c_pos_overflow - ) ; - - cout << "Testing 'RoundEven' Float2IntRounder policy\n"; - - test_rounding_conversion(SET_FNTPL_ARG(T), - SET_FNTPL_ARG(boost::numeric::RoundEven), - min, - c_neg_overflow, - c_converted, - c_converted, - c_converted, - c_converted - ) ; - - test_rounding_conversion(SET_FNTPL_ARG(T), - SET_FNTPL_ARG(boost::numeric::RoundEven), - max, - c_converted, - c_converted, - c_converted, - c_pos_overflow, - c_pos_overflow - ) ; - - cout << "Testing 'Ceil' Float2IntRounder policy\n"; - - test_rounding_conversion(SET_FNTPL_ARG(T), - SET_FNTPL_ARG(boost::numeric::Ceil), - min, - c_neg_overflow, - c_converted, - c_converted, - c_converted, - c_converted - ) ; - - test_rounding_conversion(SET_FNTPL_ARG(T), - SET_FNTPL_ARG(boost::numeric::Ceil), - max, - c_converted, - c_converted, - c_converted, - c_pos_overflow, - c_pos_overflow - ) ; - - cout << "Testing 'Floor' Float2IntRounder policy\n" ; - - test_rounding_conversion(SET_FNTPL_ARG(T), - SET_FNTPL_ARG(boost::numeric::Floor), - min, - c_neg_overflow, - c_neg_overflow, - c_converted, - c_converted, - c_converted - ) ; - - test_rounding_conversion(SET_FNTPL_ARG(T), - SET_FNTPL_ARG(boost::numeric::Floor), - max, - c_converted, - c_converted, - c_converted, - c_converted, - c_pos_overflow - ) ; - -} - -void test_round_even( double n, double x ) -{ - double r = boost::numeric::RoundEven::nearbyint(n); - BOOST_CHECK( r == x ) ; -} - -void test_round_even() -{ - cout << "Testing 'RoundEven' tie-breaking\n"; - - double min = boost::numeric::bounds::lowest(); - double max = boost::numeric::bounds::highest(); - -#if !defined(BOOST_NO_STDC_NAMESPACE) - using std::floor ; - using std::ceil ; -#endif - test_round_even(min, floor(min)); - test_round_even(max, ceil (max)); - test_round_even(2.0, 2.0); - test_round_even(2.3, 2.0); - test_round_even(2.5, 2.0); - test_round_even(2.7, 3.0); - test_round_even(3.0, 3.0); - test_round_even(3.3, 3.0); - test_round_even(3.5, 4.0); - test_round_even(3.7, 4.0); -} - -int double_to_int ( double n ) { return static_cast(n) ; } - -void test_converter_as_function_object() -{ - cout << "Testing converter as function object.\n"; - - // Create a sample sequence of double values. - std::vector S ; - for ( int i = 0 ; i < 10 ; ++ i ) - S.push_back( i * ( 18.0 / 19.0 ) ); - - // Create a sequence of int values from 's' using the standard conversion. - std::vector W ; - std::transform(S.begin(),S.end(),std::back_inserter(W),double_to_int); - - // Create a sequence of int values from s using a default numeric::converter - std::vector I ; - std::transform(S.begin(), - S.end(), - std::back_inserter(I), - boost::numeric::converter() - ) ; - - // Match 'w' and 'i' which should be equal. - bool double_to_int_OK = std::equal(W.begin(),W.end(),I.begin()) ; - BOOST_CHECK_MESSAGE(double_to_int_OK, "converter (int,double) as function object"); - - // Create a sequence of double values from s using a default numeric::converter (which should be the trivial conv). - std::vector D ; - std::transform(S.begin(), - S.end(), - std::back_inserter(D), - boost::numeric::converter() - ) ; - - // Match 's' and 'd' which should be equal. - bool double_to_double_OK = std::equal(S.begin(),S.end(),D.begin()) ; - BOOST_CHECK_MESSAGE(double_to_double_OK, "converter (double,double) as function object"); -} - -#if BOOST_WORKAROUND(__IBMCPP__, <= 600 ) // VCAPP6 -# define UNOPTIMIZED -#else -# define UNOPTIMIZED volatile -#endif - -void test_optimizations() -{ - using namespace boost; - using namespace numeric; - - float fv0 = 18.0f / 19.0f ; - - // This code deosn't produce any output. - // It is intended to show the optimization of numeric::converter<> by manual inspection - // of the generated code. - // Each test shows first the equivalent hand-coded version. - // The numeric_cast<> code should be the same if full compiler optimization/inlining is used. - - //--------------------------------- - // trivial conversion. - // - // equivalent code: - UNOPTIMIZED float fv1a = fv0 ; - - float fv1b = numeric_cast(fv0); - unused_variable(fv1a); - unused_variable(fv1b); - // - //--------------------------------- - - //--------------------------------- - // nonsubranged conversion. - // - // equivalent code: - UNOPTIMIZED double dv1a = static_cast(fv0); - - double dv1b = numeric_cast(fv0); - unused_variable(dv1a); - unused_variable(dv1b); - // - //--------------------------------- - - //------------------------------------------------------ - // subranged conversion with both-sided range checking. - // - - // equivalent code: - - { - double const& s = dv1b ; - // range checking - range_check_result r = s < static_cast(bounds::lowest()) - ? cNegOverflow : cInRange ; - if ( r == cInRange ) - { - r = s > static_cast(bounds::highest()) ? cPosOverflow : cInRange ; - } - if ( r == cNegOverflow ) - throw negative_overflow() ; - else if ( r == cPosOverflow ) - throw positive_overflow() ; - // conversion - UNOPTIMIZED float fv2a = static_cast(s); - unused_variable(fv2a); - } - - float fv2b = numeric_cast(dv1b); - unused_variable(fv2b); - // - //--------------------------------- - - - //--------------------------------- - // subranged rounding conversion - // - // equivalent code: - - { - double const& s = dv1b ; - // range checking - range_check_result r = s <= static_cast(bounds::lowest()) - static_cast(1.0) - ? cNegOverflow : cInRange ; - if ( r == cInRange ) - { - r = s >= static_cast(bounds::highest()) + static_cast(1.0) - ? cPosOverflow : cInRange ; - } - if ( r == cNegOverflow ) - throw negative_overflow() ; - else if ( r == cPosOverflow ) - throw positive_overflow() ; - // rounding - -#if !defined(BOOST_NO_STDC_NAMESPACE) - using std::floor ; -#endif - - double s1 = floor(dv1b + 0.5); - - // conversion - UNOPTIMIZED int iv1a = static_cast(s1); - unused_variable(iv1a); - } - - int iv1b = numeric_cast(dv1b); - unused_variable(iv1b); - // - //--------------------------------- -} - -int test_main( int, char* argv[] ) -{ - std::cout << std::setprecision( std::numeric_limits::digits10 ) ; - - test_conversions(); - test_overflow_handlers( SET_FNTPL_ARG(boost::int16_t), SET_FNTPL_ARG(boost::int32_t)); - test_round_style(SET_FNTPL_ARG(boost::int32_t), SET_FNTPL_ARG(double) ) ; - test_round_even() ; - test_converter_as_function_object(); - test_optimizations() ; - - return 0; -} -//--------------------------------------------------------------------------- - diff --git a/libs/numeric/conversion/test/numeric_cast_test.cpp b/libs/numeric/conversion/test/numeric_cast_test.cpp deleted file mode 100644 index f94393cb1..000000000 --- a/libs/numeric/conversion/test/numeric_cast_test.cpp +++ /dev/null @@ -1,97 +0,0 @@ -// boost utility cast test program -----------------------------------------// - -// (C) Copyright Beman Dawes, Dave Abrahams 1999. Distributed under the 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. - -// Revision History -// 28 Set 04 taken from the old cast library (Fernando Cacciola) - -#include -#include -#include // for DBL_MAX (Peter Schmid) - -#include - -#include "boost/test/minimal.hpp" - -# if SCHAR_MAX == LONG_MAX -# error "This test program doesn't work if SCHAR_MAX == LONG_MAX" -# endif - -using namespace boost; -using std::cout; - -int test_main( int argc, char * argv[] ) -{ - -# ifdef NDEBUG - cout << "NDEBUG is defined\n"; -# else - cout << "NDEBUG is not defined\n"; -# endif - - cout << "\nBeginning tests...\n"; - -// test implicit_cast and numeric_cast -------------------------------------// - - // tests which should succeed - long small_value = 1; - long small_negative_value = -1; - long large_value = LONG_MAX; - long large_negative_value = LONG_MIN; - signed char c = 0; - - c = large_value; // see if compiler generates warning - - c = numeric_cast( small_value ); - BOOST_CHECK( c == 1 ); - c = 0; - c = numeric_cast( small_value ); - BOOST_CHECK( c == 1 ); - c = 0; - c = numeric_cast( small_negative_value ); - BOOST_CHECK( c == -1 ); - - // These tests courtesy of Joe R NWP Swatosh - BOOST_CHECK( 0.0f == numeric_cast( 0.0 ) ); - BOOST_CHECK( 0.0 == numeric_cast( 0.0 ) ); - - // tests which should result in errors being detected - - bool caught_exception = false; - try { c = numeric_cast( large_value ); } - catch ( numeric::bad_numeric_cast ) - { cout<<"caught bad_numeric_cast #1\n"; caught_exception = true; } - BOOST_CHECK ( caught_exception ); - - caught_exception = false; - try { c = numeric_cast( large_negative_value ); } - catch ( numeric::bad_numeric_cast ) - { cout<<"caught bad_numeric_cast #2\n"; caught_exception = true; } - BOOST_CHECK ( caught_exception ); - - unsigned long ul; - caught_exception = false; - try { ul = numeric_cast( large_negative_value ); } - catch ( numeric::bad_numeric_cast ) - { cout<<"caught bad_numeric_cast #3\n"; caught_exception = true; } - BOOST_CHECK ( caught_exception ); - - caught_exception = false; - try { ul = numeric_cast( small_negative_value ); } - catch ( numeric::bad_numeric_cast ) - { cout<<"caught bad_numeric_cast #4\n"; caught_exception = true; } - BOOST_CHECK ( caught_exception ); - - caught_exception = false; - try { numeric_cast( DBL_MAX ); } - catch ( numeric::bad_numeric_cast ) - { cout<<"caught bad_numeric_cast #5\n"; caught_exception = true; } - BOOST_CHECK ( caught_exception ); - - return 0 ; - -} // main diff --git a/libs/numeric/conversion/test/numeric_cast_traits_test.cpp b/libs/numeric/conversion/test/numeric_cast_traits_test.cpp deleted file mode 100644 index f59cb6bc7..000000000 --- a/libs/numeric/conversion/test/numeric_cast_traits_test.cpp +++ /dev/null @@ -1,380 +0,0 @@ -// -//! Copyright (c) 2011 -//! Brandon Kohn -// -// Distributed under the 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 -#include -#include -#include -#include -#include - -//! Define a simple custom number -struct Double -{ - Double() - : v(0) - {} - - template - explicit Double( T v ) - : v(static_cast(v)) - {} - - template - Double& operator= ( T t ) - { - v = static_cast(t); - return *this; - } - - bool operator < ( const Double& rhs ) const - { - return v < rhs.v; - } - - template - bool operator < ( T rhs ) const - { - return v < static_cast(rhs); - } - - template - friend bool operator < ( const LHS& lhs, const Double& rhs ) - { - return lhs < rhs.v; - } - - bool operator > ( const Double& rhs ) const - { - return v > rhs.v; - } - - template - friend bool operator > ( const LHS& lhs, const Double& rhs ) - { - return lhs > rhs.v; - } - - template - bool operator > ( T rhs ) const - { - return v > static_cast(rhs); - } - - bool operator == ( const Double& rhs ) const - { - return v == rhs.v; - } - - template - bool operator == ( T rhs ) const - { - return v == static_cast(rhs); - } - - template - friend bool operator == ( const LHS& lhs, const Double& rhs ) - { - return lhs == rhs.v; - } - - bool operator !() const - { - return v == 0; - } - - Double operator -() const - { - return Double(-v); - } - - Double& operator +=( const Double& t ) - { - v += t.v; - return *this; - } - - template - Double& operator +=( T t ) - { - v += static_cast(t); - return *this; - } - - Double& operator -=( const Double& t ) - { - v -= t.v; - return *this; - } - - template - Double& operator -=( T t ) - { - v -= static_cast(t); - return *this; - } - - Double& operator *= ( const Double& factor ) - { - v *= factor.v; - return *this; - } - - template - Double& operator *=( T t ) - { - v *= static_cast(t); - return *this; - } - - Double& operator /= (const Double& divisor) - { - v /= divisor.v; - return *this; - } - - template - Double& operator /=( T t ) - { - v /= static_cast(t); - return (*this); - } - - double v; -}; - -//! Define numeric_limits for the custom type. -namespace std -{ - template<> - class numeric_limits< Double > : public numeric_limits - { - public: - - //! Limit our Double to a range of +/- 100.0 - static Double (min)() - { - return Double(1.e-2); - } - - static Double (max)() - { - return Double(1.e2); - } - - static Double epsilon() - { - return Double( std::numeric_limits::epsilon() ); - } - }; -} - -//! Define range checking and overflow policies. -namespace custom -{ - //! Define a custom range checker - template - struct range_checker - { - typedef typename Traits::argument_type argument_type ; - typedef typename Traits::source_type S; - typedef typename Traits::target_type T; - - //! Check range of integral types. - static boost::numeric::range_check_result out_of_range( argument_type s ) - { - using namespace boost::numeric; - if( s > bounds::highest() ) - return cPosOverflow; - else if( s < bounds::lowest() ) - return cNegOverflow; - else - return cInRange; - } - - static void validate_range ( argument_type s ) - { - BOOST_STATIC_ASSERT( std::numeric_limits::is_bounded ); - OverFlowHandler()( out_of_range(s) ); - } - }; - - //! Overflow handler - struct positive_overflow{}; - struct negative_overflow{}; - - struct overflow_handler - { - void operator() ( boost::numeric::range_check_result r ) - { - using namespace boost::numeric; - if( r == cNegOverflow ) - throw negative_overflow() ; - else if( r == cPosOverflow ) - throw positive_overflow() ; - } - }; - - //! Define a rounding policy and specialize on the custom type. - template - struct Ceil : boost::numeric::Ceil{}; - - template<> - struct Ceil - { - typedef Double source_type; - - typedef Double const& argument_type; - - static source_type nearbyint ( argument_type s ) - { -#if !defined(BOOST_NO_STDC_NAMESPACE) - using std::ceil ; -#endif - return Double( ceil(s.v) ); - } - - typedef boost::mpl::integral_c< std::float_round_style, std::round_toward_infinity> round_style; - }; - - //! Define a rounding policy and specialize on the custom type. - template - struct Trunc: boost::numeric::Trunc{}; - - template<> - struct Trunc - { - typedef Double source_type; - - typedef Double const& argument_type; - - static source_type nearbyint ( argument_type s ) - { -#if !defined(BOOST_NO_STDC_NAMESPACE) - using std::floor; -#endif - return Double( floor(s.v) ); - } - - typedef boost::mpl::integral_c< std::float_round_style, std::round_toward_zero> round_style; - }; -}//namespace custom; - -namespace boost { namespace numeric { - - //! Define the numeric_cast_traits specializations on the custom type. - template - struct numeric_cast_traits - { - typedef custom::overflow_handler overflow_policy; - typedef custom::range_checker - < - boost::numeric::conversion_traits - , overflow_policy - > range_checking_policy; - typedef boost::numeric::Trunc rounding_policy; - }; - - template - struct numeric_cast_traits - { - typedef custom::overflow_handler overflow_policy; - typedef custom::range_checker - < - boost::numeric::conversion_traits - , overflow_policy - > range_checking_policy; - typedef custom::Trunc rounding_policy; - }; - - //! Define the conversion from the custom type to built-in types and vice-versa. - template - struct raw_converter< conversion_traits< T, Double > > - { - static T low_level_convert ( const Double& n ) - { - return static_cast( n.v ); - } - }; - - template - struct raw_converter< conversion_traits< Double, S > > - { - static Double low_level_convert ( const S& n ) - { - return Double(n); - } - }; -}}//namespace boost::numeric; - -#define BOOST_TEST_CATCH_CUSTOM_POSITIVE_OVERFLOW( CastCode ) \ - try { CastCode; BOOST_CHECK( false ); } \ - catch( custom::positive_overflow& ){} \ - catch(...){ BOOST_CHECK( false ); } \ -/***/ - -#define BOOST_TEST_CATCH_CUSTOM_NEGATIVE_OVERFLOW( CastCode ) \ - try { CastCode; BOOST_CHECK( false ); } \ - catch( custom::negative_overflow& ){} \ - catch(...){ BOOST_CHECK( false ); } \ -/***/ - -struct test_cast_traits -{ - template - void operator()(T) const - { - Double d = boost::numeric_cast( static_cast(50) ); - BOOST_CHECK( d.v == 50. ); - T v = boost::numeric_cast( d ); - BOOST_CHECK( v == 50 ); - } -}; - -void test_numeric_cast_traits() -{ - typedef boost::mpl::vector - < - boost::int8_t - , boost::uint8_t - , boost::int16_t - , boost::uint16_t - , boost::int32_t - , boost::uint32_t -#if !defined( BOOST_NO_INT64_T ) - , boost::int64_t - , boost::uint64_t -#endif - , float - , double - , long double - > types; - boost::mpl::for_each( test_cast_traits() ); - - //! Check overflow handler. - Double d( 56.0 ); - BOOST_TEST_CATCH_CUSTOM_POSITIVE_OVERFLOW( d = boost::numeric_cast( 101 ) ); - BOOST_CHECK( d.v == 56. ); - BOOST_TEST_CATCH_CUSTOM_NEGATIVE_OVERFLOW( d = boost::numeric_cast( -101 ) ); - BOOST_CHECK( d.v == 56.); - - //! Check custom round policy. - d = 5.9; - int five = boost::numeric_cast( d ); - BOOST_CHECK( five == 5 ); -} - -int test_main( int argc, char * argv[] ) -{ - test_numeric_cast_traits(); - return 0; -} - -#undef BOOST_TEST_CATCH_CUSTOM_POSITIVE_OVERFLOW -#undef BOOST_TEST_CATCH_CUSTOM_NEGATIVE_OVERFLOW diff --git a/libs/numeric/conversion/test/test_helpers.cpp b/libs/numeric/conversion/test/test_helpers.cpp deleted file mode 100644 index 5f2d88d32..000000000 --- a/libs/numeric/conversion/test/test_helpers.cpp +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright (C) 2003, Fernando Luis Cacciola Carballal. -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// - - -// -// NOTE: This file is intended to be used ONLY by the test files -// from the Numeric Conversions Library -// -// -#include - -#include "boost/limits.hpp" -#include "boost/utility.hpp" - -#include "boost/test/included/test_exec_monitor.hpp" - -// Convenience macros to help with compilers which don't parse -// explicit template function instantiations (MSVC6) -#define MATCH_FNTPL_ARG(t) t const* -#define SET_FNTPL_ARG(t) (static_cast< t const* >(0)) - -// -// *Minimal* example of a User Defined Numeric Type -// -// -namespace MyUDT -{ - -template -struct UDT -{ - typedef T builtin_type ; - - UDT ( T v_ ) : v (v_) {} - - T to_builtin() const { return v ; } - - friend bool operator == ( UDT const& lhs, UDT const& rhs ) - { return lhs.to_builtin() == rhs.to_builtin() ; } - - // NOTE: This operator is *required* by the Numeric Conversion Library - // if Turnc<> is used as the Float2IntRounder policy. - friend bool operator < ( UDT const& lhs, UDT const& rhs ) - { return lhs.to_builtin() < rhs.to_builtin() ; } - - friend std::ostream& operator << ( std::ostream& os, UDT const& n ) - { return os << n.to_builtin() ; } - - T v ; -} ; - -typedef UDT MyInt ; -typedef UDT MyFloat ; - -// -// The Float2IntRounder policies *require* a visible 'ceil' or 'floor' math function -// with standard semantics. -// In a conformant compiler, ADL can pick these functions even if they are defined -// within a user namespace, as below. -// -inline MyInt ceil ( MyInt const& x ) { return x ; } -inline MyInt floor ( MyInt const& x ) { return x ; } - -inline MyFloat floor ( MyFloat const& x ) -{ -#if !defined(BOOST_NO_STDC_NAMESPACE) - return MyFloat ( std::floor(x.to_builtin()) ) ; -#else - return MyFloat ( ::floor(x.to_builtin()) ) ; -#endif -} - -inline MyFloat ceil ( MyFloat const& x ) -{ -#if !defined(BOOST_NO_STDC_NAMESPACE) - return MyFloat ( std::ceil(x.to_builtin()) ) ; -#else - return MyFloat ( ::ceil(x.to_builtin()) ) ; -#endif -} - -} // namespace MyUDT - - -// -// The Numeric Conversion Library *requires* User Defined Numeric Types -// to properly specialize std::numeric_limits<> -// -namespace std -{ - -template<> -class numeric_limits : public numeric_limits -{ - public : - - BOOST_STATIC_CONSTANT(bool, is_specialized = false); -} ; - -template<> -class numeric_limits : public numeric_limits -{ - public : - - BOOST_STATIC_CONSTANT(bool, is_specialized = false); -} ; - -} // namespace std - - - -// -// The functions floor and ceil defined within namespace MyUDT -// should be found by koenig loopkup, but some compilers don't do it right -// so we inyect them into namespace std so ordinary overload resolution -// can found them. -#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) || defined(__BORLANDC__) || defined(__GNUC__) -namespace std { -using MyUDT::floor ; -using MyUDT::ceil ; -} // namespace std -#endif - - -std::string to_string( bool arg ) -{ - return arg ? "true" : "false" ; -} - -std::string to_string( ... ) { throw std::runtime_error("to_string() called with wrong type!") ; } - -// -// This is used to print 'char' values as numbers instead of characters. -// -template struct printable_number_type { typedef T type ; } ; -template<> struct printable_number_type { typedef int type ; } ; -template<> struct printable_number_type { typedef unsigned type ; } ; -template<> struct printable_number_type { typedef int type ; } ; - -template -inline -typename printable_number_type::type -printable( T n ) { return n ; } - - -// -/////////////////////////////////////////////////////////////////////////////////////////////// - diff --git a/libs/numeric/conversion/test/test_helpers2.cpp b/libs/numeric/conversion/test/test_helpers2.cpp deleted file mode 100644 index 8fca50b63..000000000 --- a/libs/numeric/conversion/test/test_helpers2.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (C) 2003, Fernando Luis Cacciola Carballal. -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// - - -// -// NOTE: This file is intended to be used ONLY by the test files -// from the Numeric Conversions Library -// - -// -// The following 'to_string' helpers are provided to give readable names -// to the various enums used by the library. -// NOTE: specializations of boost::lexical_cast<> were not used since some compilers had -// trouble dealing with such specializations for different enumerations. -// - -std::string to_string ( boost::numeric::int_float_mixture_enum arg ) -{ - switch ( arg ) - { - case boost::numeric::integral_to_integral : return "integral_to_integral" ; - case boost::numeric::integral_to_float : return "integral_to_float" ; - case boost::numeric::float_to_integral : return "float_to_integral" ; - case boost::numeric::float_to_float : return "float_to_float" ; - } - return "(Unknown result!)" ; -} - - -std::string to_string ( boost::numeric::sign_mixture_enum arg ) -{ - switch ( arg ) - { - case boost::numeric::unsigned_to_unsigned : return "unsigned_to_unsigned" ; - case boost::numeric::signed_to_signed : return "signed_to_signed" ; - case boost::numeric::signed_to_unsigned : return "signed_to_unsigned" ; - case boost::numeric::unsigned_to_signed : return "unsigned_to_signed" ; - } - return "(Unknown result!)" ; -} - -std::string to_string ( boost::numeric::udt_builtin_mixture_enum arg ) -{ - switch ( arg ) - { - case boost::numeric::builtin_to_builtin : return "builtin_to_builtin" ; - case boost::numeric::builtin_to_udt : return "builtin_to_udt" ; - case boost::numeric::udt_to_builtin : return "udt_to_builtin" ; - case boost::numeric::udt_to_udt : return "udt_to_udt" ; - } - return "(Unknown result!)" ; -} - -// -/////////////////////////////////////////////////////////////////////////////////////////////// - diff --git a/libs/numeric/conversion/test/test_helpers3.cpp b/libs/numeric/conversion/test/test_helpers3.cpp deleted file mode 100644 index de345ba86..000000000 --- a/libs/numeric/conversion/test/test_helpers3.cpp +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (C) 2003, Fernando Luis Cacciola Carballal. -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// - - -// -// NOTE: This file is intended to be used ONLY by the test files -// from the Numeric Conversions Library -// - -// The conversion test is performed using a class whose instances encapsulate -// a particular specific conversion defnied explicitely. -// A ConversionInstance object includes the source type, the target type, -// the source value and the expected result, including possible exceptions. -// - -enum PostCondition { c_converted, c_overflow, c_neg_overflow, c_pos_overflow } ; - -template -struct ConversionInstance -{ - typedef Converter converter ; - - typedef typename Converter::argument_type argument_type ; - typedef typename Converter::result_type result_type ; - - typedef typename Converter::traits traits ; - typedef typename traits::target_type target_type ; - typedef typename traits::source_type source_type ; - - ConversionInstance ( result_type a_result, argument_type a_source, PostCondition a_post) - : - source(a_source), - result(a_result), - post(a_post) - {} - - std::string to_string() const - { - return std::string("converter<") - + typeid(target_type).name() - + std::string(",") - + typeid(source_type).name() - + std::string(">::convert(") ; - } - - argument_type source ; - result_type result ; - PostCondition post ; -} ; - -// -// Main conversion test point. -// Exercises a specific conversion described by 'conv'. -// -template -void test_conv_base( Instance const& conv ) -{ - typedef typename Instance::argument_type argument_type ; - typedef typename Instance::result_type result_type ; - typedef typename Instance::converter converter ; - - argument_type source = conv.source ; - - try - { - result_type result = converter::convert(source); - - if ( conv.post == c_converted ) - { - BOOST_CHECK_MESSAGE( result == conv.result, - conv.to_string() << printable(source) << ")= " << printable(result) << ". Expected:" << printable(conv.result) - ) ; - } - else - { - BOOST_ERROR( conv.to_string() << printable(source) << ") = " << printable(result) - << ". Expected:" << ( conv.post == c_neg_overflow ? " negative_overflow" : "positive_overflow" ) - ) ; - } - } - catch ( boost::numeric::negative_overflow const& ) - { - if ( conv.post == c_neg_overflow ) - { - BOOST_CHECK_MESSAGE( true, conv.to_string() << printable(source) << ") = negative_overflow, as expected" ) ; - } - else - { - BOOST_ERROR( conv.to_string() << printable(source) << ") = negative_overflow. Expected:" << printable(conv.result) ) ; - } - } - catch ( boost::numeric::positive_overflow const& ) - { - if ( conv.post == c_pos_overflow ) - { - BOOST_CHECK_MESSAGE( true, conv.to_string() << printable(source) << ") = positive_overflow, as expected" ) ; - } - else - { - BOOST_ERROR( conv.to_string() << printable(source) << ") = positive_overflow. Expected:" << printable(conv.result) ) ; - } - } - catch ( boost::numeric::bad_numeric_cast const& ) - { - if ( conv.post == c_overflow ) - { - BOOST_CHECK_MESSAGE( true, conv.to_string() << printable(source) << ") = bad_numeric_cast, as expected" ) ; - } - else - { - BOOST_ERROR( conv.to_string() << printable(source) << ") = bad_numeric_cast. Expected:" << printable(conv.result) ) ; - } - } -} - - -#define TEST_SUCCEEDING_CONVERSION(Conv,typeT,typeS,valueT,valueS) \ - test_conv_base( ConversionInstance< Conv >(valueT, valueS, c_converted ) ) - -#define TEST_POS_OVERFLOW_CONVERSION(Conv,typeT,typeS,valueS) \ - test_conv_base( ConversionInstance< Conv >( static_cast< typeT >(0), valueS, c_pos_overflow ) ) - -#define TEST_NEG_OVERFLOW_CONVERSION(Conv,typeT,typeS,valueS) \ - test_conv_base( ConversionInstance< Conv >( static_cast< typeT >(0), valueS, c_neg_overflow ) ) - -#define DEF_CONVERTER(T,S) boost::numeric::converter< T , S > - -#define TEST_SUCCEEDING_CONVERSION_DEF(typeT,typeS,valueT,valueS) \ - TEST_SUCCEEDING_CONVERSION( DEF_CONVERTER(typeT,typeS), typeT, typeS, valueT, valueS ) - -#define TEST_POS_OVERFLOW_CONVERSION_DEF(typeT,typeS,valueS) \ - TEST_POS_OVERFLOW_CONVERSION( DEF_CONVERTER(typeT,typeS), typeT, typeS, valueS ) - -#define TEST_NEG_OVERFLOW_CONVERSION_DEF(typeT,typeS,valueS) \ - TEST_NEG_OVERFLOW_CONVERSION( DEF_CONVERTER(typeT,typeS), typeT, typeS, valueS ) - - -// -/////////////////////////////////////////////////////////////////////////////////////////////// - diff --git a/libs/numeric/conversion/test/traits_test.cpp b/libs/numeric/conversion/test/traits_test.cpp deleted file mode 100644 index d8d620b70..000000000 --- a/libs/numeric/conversion/test/traits_test.cpp +++ /dev/null @@ -1,341 +0,0 @@ -// Copyright (C) 2003, Fernando Luis Cacciola Carballal. -// -// Distributed under the 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 -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#ifdef __BORLANDC__ -#pragma hdrstop -#endif - -#include "test_helpers.cpp" -#include "test_helpers2.cpp" - -using namespace std ; -using namespace boost ; -using namespace numeric; -using namespace MyUDT ; - -// These helpers are used by generate_expected_traits. -// Unlike the similar helpers in the implementation, they are specialized by extension. -// -template struct my_is_subranged ; -template struct my_is_trivial ; -template struct my_int_float_mixture ; -template struct my_sign_mixture ; -template struct my_udt_builtin_mixture ; - -// This macro is used to define the properties of each conversion between -// the builtin arithmetric types -// -// It defines the specialization of the helper traits used by 'generate_expected_traits' -// -#define DEFINE_CONVERSION(Target,Source,Trivial,Mixture,SignMixture,UdtMixture,SubRanged) \ - \ - template<> struct my_is_subranged \ - { typedef mpl::bool_< (SubRanged) > type ; } ; \ - \ - template<> struct my_is_trivial \ - { typedef mpl::bool_< (Trivial) > type ; } ; \ - \ - template<> struct my_int_float_mixture \ - { typedef mpl::integral_c type ; } ; \ - \ - template<> struct my_sign_mixture \ - { typedef mpl::integral_c type ; } ; \ - \ - template<> struct my_udt_builtin_mixture \ - { typedef mpl::integral_c type ; } - - -#define cSubRanged true -#define cTrivial true - -// The following test assumes a specific relation between the sizes of the types being used; -// therefore, use specific fixed-width types instead built-in types directly. - -// NOTE --> TARGET,SOURCE -// -DEFINE_CONVERSION(boost::uint8_t , boost::uint8_t, cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(boost::int8_t , boost::uint8_t, !cTrivial, integral_to_integral, unsigned_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint16_t , boost::uint8_t, !cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(boost::int16_t , boost::uint8_t, !cTrivial, integral_to_integral, unsigned_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(boost::uint32_t , boost::uint8_t, !cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(boost::int32_t , boost::uint8_t, !cTrivial, integral_to_integral, unsigned_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(float , boost::uint8_t, !cTrivial, integral_to_float , unsigned_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(double , boost::uint8_t, !cTrivial, integral_to_float , unsigned_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(long double , boost::uint8_t, !cTrivial, integral_to_float , unsigned_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(MyInt , boost::uint8_t, !cTrivial, integral_to_integral, unsigned_to_signed , builtin_to_udt , !cSubRanged ); -DEFINE_CONVERSION(MyFloat , boost::uint8_t, !cTrivial, integral_to_float , unsigned_to_signed , builtin_to_udt , !cSubRanged ); - -DEFINE_CONVERSION(boost::uint8_t , boost::int8_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int8_t , boost::int8_t, cTrivial, integral_to_integral, signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(boost::uint16_t , boost::int8_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int16_t , boost::int8_t, !cTrivial, integral_to_integral, signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(boost::uint32_t , boost::int8_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int32_t , boost::int8_t, !cTrivial, integral_to_integral, signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(float , boost::int8_t, !cTrivial, integral_to_float , signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(double , boost::int8_t, !cTrivial, integral_to_float , signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(long double , boost::int8_t, !cTrivial, integral_to_float , signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(MyInt , boost::int8_t, !cTrivial, integral_to_integral, signed_to_signed , builtin_to_udt , !cSubRanged ); -DEFINE_CONVERSION(MyFloat , boost::int8_t, !cTrivial, integral_to_float , signed_to_signed , builtin_to_udt , !cSubRanged ); - -DEFINE_CONVERSION(boost::uint8_t , boost::uint16_t, !cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int8_t , boost::uint16_t, !cTrivial, integral_to_integral, unsigned_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint16_t , boost::uint16_t, cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(boost::int16_t , boost::uint16_t, !cTrivial, integral_to_integral, unsigned_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint32_t , boost::uint16_t, !cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(boost::int32_t , boost::uint16_t, !cTrivial, integral_to_integral, unsigned_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(float , boost::uint16_t, !cTrivial, integral_to_float , unsigned_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(double , boost::uint16_t, !cTrivial, integral_to_float , unsigned_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(long double , boost::uint16_t, !cTrivial, integral_to_float , unsigned_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(MyInt , boost::uint16_t, !cTrivial, integral_to_integral, unsigned_to_signed , builtin_to_udt , !cSubRanged ); -DEFINE_CONVERSION(MyFloat , boost::uint16_t, !cTrivial, integral_to_float , unsigned_to_signed , builtin_to_udt , !cSubRanged ); - -DEFINE_CONVERSION(boost::uint8_t , boost::int16_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int8_t , boost::int16_t, !cTrivial, integral_to_integral, signed_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint16_t , boost::int16_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int16_t , boost::int16_t, cTrivial, integral_to_integral, signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(boost::uint32_t , boost::int16_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int32_t , boost::int16_t, !cTrivial, integral_to_integral, signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(float , boost::int16_t, !cTrivial, integral_to_float , signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(double , boost::int16_t, !cTrivial, integral_to_float , signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(long double , boost::int16_t, !cTrivial, integral_to_float , signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(MyInt , boost::int16_t, !cTrivial, integral_to_integral, signed_to_signed , builtin_to_udt , !cSubRanged ); -DEFINE_CONVERSION(MyFloat , boost::int16_t, !cTrivial, integral_to_float , signed_to_signed , builtin_to_udt , !cSubRanged ); - -DEFINE_CONVERSION(boost::uint8_t , boost::uint32_t, !cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int8_t , boost::uint32_t, !cTrivial, integral_to_integral, unsigned_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint16_t , boost::uint32_t, !cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int16_t , boost::uint32_t, !cTrivial, integral_to_integral, unsigned_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint32_t , boost::uint32_t, cTrivial, integral_to_integral, unsigned_to_unsigned, builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(boost::int32_t , boost::uint32_t, !cTrivial, integral_to_integral, unsigned_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(float , boost::uint32_t, !cTrivial, integral_to_float , unsigned_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(double , boost::uint32_t, !cTrivial, integral_to_float , unsigned_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(long double , boost::uint32_t, !cTrivial, integral_to_float , unsigned_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(MyInt , boost::uint32_t, !cTrivial, integral_to_integral, unsigned_to_signed , builtin_to_udt , !cSubRanged ); -DEFINE_CONVERSION(MyFloat , boost::uint32_t, !cTrivial, integral_to_float , unsigned_to_signed , builtin_to_udt , !cSubRanged ); - -DEFINE_CONVERSION(boost::uint8_t , boost::int32_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int8_t , boost::int32_t, !cTrivial, integral_to_integral, signed_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint16_t , boost::int32_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int16_t , boost::int32_t, !cTrivial, integral_to_integral, signed_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint32_t , boost::int32_t, !cTrivial, integral_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int32_t , boost::int32_t, cTrivial, integral_to_integral, signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(float , boost::int32_t, !cTrivial, integral_to_float , signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(double , boost::int32_t, !cTrivial, integral_to_float , signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(long double , boost::int32_t, !cTrivial, integral_to_float , signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(MyInt , boost::int32_t, !cTrivial, integral_to_integral, signed_to_signed , builtin_to_udt , !cSubRanged ); -DEFINE_CONVERSION(MyFloat , boost::int32_t, !cTrivial, integral_to_float , signed_to_signed , builtin_to_udt , !cSubRanged ); - -DEFINE_CONVERSION(boost::uint8_t , float, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int8_t , float, !cTrivial, float_to_integral, signed_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint16_t , float, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int16_t , float, !cTrivial, float_to_integral, signed_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint32_t , float, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int32_t , float, !cTrivial, float_to_integral, signed_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(float , float, cTrivial, float_to_float , signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(double , float, !cTrivial, float_to_float , signed_to_signed , builtin_to_builtin, ( sizeof(float) > sizeof(double) ) ); -DEFINE_CONVERSION(long double , float, !cTrivial, float_to_float , signed_to_signed , builtin_to_builtin, ( sizeof(float) > sizeof(long double) ) ); -DEFINE_CONVERSION(MyInt , float, !cTrivial, float_to_integral, signed_to_signed , builtin_to_udt , !cSubRanged ); -DEFINE_CONVERSION(MyFloat , float, !cTrivial, float_to_float , signed_to_signed , builtin_to_udt , !cSubRanged ); - -DEFINE_CONVERSION(boost::uint8_t , double, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int8_t , double, !cTrivial, float_to_integral, signed_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint16_t , double, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int16_t , double, !cTrivial, float_to_integral, signed_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint32_t , double, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int32_t , double, !cTrivial, float_to_integral, signed_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(float , double, !cTrivial, float_to_float , signed_to_signed , builtin_to_builtin, ( sizeof(double) > sizeof(float) ) ); -DEFINE_CONVERSION(double , double, cTrivial, float_to_float , signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(long double , double, !cTrivial, float_to_float , signed_to_signed , builtin_to_builtin, ( sizeof(double) > sizeof(long double) ) ); -DEFINE_CONVERSION(MyInt , double, !cTrivial, float_to_integral, signed_to_signed , builtin_to_udt , !cSubRanged ); -DEFINE_CONVERSION(MyFloat , double, !cTrivial, float_to_float , signed_to_signed , builtin_to_udt , !cSubRanged ); - -DEFINE_CONVERSION(boost::uint8_t , long double, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int8_t , long double, !cTrivial, float_to_integral, signed_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint16_t , long double, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int16_t , long double, !cTrivial, float_to_integral, signed_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::uint32_t , long double, !cTrivial, float_to_integral, signed_to_unsigned, builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(boost::int32_t , long double, !cTrivial, float_to_integral, signed_to_signed , builtin_to_builtin, cSubRanged ); -DEFINE_CONVERSION(float , long double, !cTrivial, float_to_float , signed_to_signed , builtin_to_builtin, ( sizeof(long double) > sizeof(float) ) ); -DEFINE_CONVERSION(double , long double, !cTrivial, float_to_float , signed_to_signed , builtin_to_builtin, ( sizeof(long double) > sizeof(double) ) ); -DEFINE_CONVERSION(long double , long double, cTrivial, float_to_float , signed_to_signed , builtin_to_builtin, !cSubRanged ); -DEFINE_CONVERSION(MyInt , long double, !cTrivial, float_to_integral, signed_to_signed , builtin_to_udt , !cSubRanged ); -DEFINE_CONVERSION(MyFloat , long double, !cTrivial, float_to_float , signed_to_signed , builtin_to_udt , !cSubRanged ); - -DEFINE_CONVERSION(boost::uint8_t , MyInt, !cTrivial, integral_to_integral, signed_to_unsigned, udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(boost::int8_t , MyInt, !cTrivial, integral_to_integral, signed_to_signed , udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(boost::uint16_t , MyInt, !cTrivial, integral_to_integral, signed_to_unsigned, udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(boost::int16_t , MyInt, !cTrivial, integral_to_integral, signed_to_signed , udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(boost::uint32_t , MyInt, !cTrivial, integral_to_integral, signed_to_unsigned, udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(boost::int32_t , MyInt, !cTrivial, integral_to_integral, signed_to_signed , udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(float , MyInt, !cTrivial, integral_to_float , signed_to_signed , udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(double , MyInt, !cTrivial, integral_to_float , signed_to_signed , udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(long double , MyInt, !cTrivial, integral_to_float , signed_to_signed , udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(MyInt , MyInt, cTrivial, integral_to_integral, signed_to_signed , udt_to_udt ,!cSubRanged ); -DEFINE_CONVERSION(MyFloat , MyInt, !cTrivial, integral_to_float , signed_to_signed , udt_to_udt ,!cSubRanged ); - -DEFINE_CONVERSION(boost::uint8_t , MyFloat, !cTrivial, float_to_integral, signed_to_unsigned, udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(boost::int8_t , MyFloat, !cTrivial, float_to_integral, signed_to_signed , udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(boost::uint16_t , MyFloat, !cTrivial, float_to_integral, signed_to_unsigned, udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(boost::int16_t , MyFloat, !cTrivial, float_to_integral, signed_to_signed , udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(boost::uint32_t , MyFloat, !cTrivial, float_to_integral, signed_to_unsigned, udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(boost::int32_t , MyFloat, !cTrivial, float_to_integral, signed_to_signed , udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(float , MyFloat, !cTrivial, float_to_float , signed_to_signed , udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(double , MyFloat, !cTrivial, float_to_float , signed_to_signed , udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(long double , MyFloat, !cTrivial, float_to_float , signed_to_signed , udt_to_builtin , cSubRanged ); -DEFINE_CONVERSION(MyInt , MyFloat, !cTrivial, float_to_integral, signed_to_signed , udt_to_udt ,!cSubRanged ); -DEFINE_CONVERSION(MyFloat , MyFloat, cTrivial, float_to_float , signed_to_signed , udt_to_udt ,!cSubRanged ); - -// -// The test is performed by comparing each field of -// boost::numeric::conversion_traits -// with the fields of -// expected_traits -// which is a traits class constructed explicitely for each combination -// of the built-in arithmetic types. -// -template -struct expected_traits -{ - typedef typename my_int_float_mixture ::type int_float_mixture ; - typedef typename my_sign_mixture ::type sign_mixture ; - typedef typename my_udt_builtin_mixture ::type udt_builtin_mixture ; - - typedef Subranged subranged ; - typedef Trivial trivial ; - typedef Supertype supertype ; - typedef Subtype subtype ; -} ; - -// This is used by the test engine to generate a expected_traits from T and S. -// -template -struct generate_expected_traits -{ - typedef expected_traits trivial ; - typedef expected_traits subranged ; - typedef expected_traits non_subranged ; - - typedef typename my_is_subranged::type IsSubranged ; - typedef typename my_is_trivial ::type IsTrivial ; - - typedef typename mpl::if_::type non_trivial ; - - typedef typename mpl::if_::type type ; -} ; - -// This macro generates the code that compares a non-type field -// in boost::numeric::conversion_traits<> with its corresponding field -// in expected_traits<> -// - -#define TEST_VALUE_FIELD(Name) \ - typedef typename traits::Name BOOST_PP_CAT(t,Name) ; \ - typedef typename expected::Name BOOST_PP_CAT(x,Name) ; \ - BOOST_CHECK_MESSAGE ( ( BOOST_PP_CAT(t,Name)::value == BOOST_PP_CAT(x,Name)::value ) , \ - "conversion_traits<" << typeid(T).name() << "," << typeid(S).name() \ - << ">::" << #Name << " = " << to_string(BOOST_PP_CAT(t,Name)::value) \ - << ". Expected: " << to_string(BOOST_PP_CAT(x,Name)::value) \ - ) ; - -// This macro generates the code that compares a type field -// in numeric::conversion_traits<> with its corresponding field -// in expected_traits<> -// -#define TEST_TYPE_FIELD(Name) \ - typedef typename traits::Name BOOST_PP_CAT(t,Name) ; \ - typedef typename expected::Name BOOST_PP_CAT(x,Name) ; \ - BOOST_CHECK_MESSAGE ( ( typeid(BOOST_PP_CAT(t,Name)) == typeid(BOOST_PP_CAT(x,Name)) ) , \ - "conversion_traits<" << typeid(T).name() << "," << typeid(S).name() \ - << ">::" << #Name << " = " << typeid(BOOST_PP_CAT(t,Name)).name() \ - << ". Expected: " << typeid(BOOST_PP_CAT(x,Name)).name() \ - ) ; - -// -// Test core. -// Compares each field of boost::numeric::conversion_traits -// with the corresponding field of expected_traits -// -template -void test_traits_base( MATCH_FNTPL_ARG(T), MATCH_FNTPL_ARG(S) ) -{ - typedef boost::numeric::conversion_traits traits ; - typedef typename generate_expected_traits::type expected ; - - TEST_VALUE_FIELD(int_float_mixture) ; - TEST_VALUE_FIELD(sign_mixture) ; - TEST_VALUE_FIELD(udt_builtin_mixture) ; - TEST_VALUE_FIELD(subranged) ; - TEST_VALUE_FIELD(trivial) ; - TEST_TYPE_FIELD (supertype) ; - TEST_TYPE_FIELD (subtype) ; -} - - -template -void test_traits_from( MATCH_FNTPL_ARG(S) ) -{ - test_traits_base( SET_FNTPL_ARG(boost::uint8_t) ,SET_FNTPL_ARG(S) ); - test_traits_base( SET_FNTPL_ARG(boost::int8_t) ,SET_FNTPL_ARG(S) ); - test_traits_base( SET_FNTPL_ARG(boost::uint16_t) ,SET_FNTPL_ARG(S) ); - test_traits_base( SET_FNTPL_ARG(boost::int16_t) ,SET_FNTPL_ARG(S) ); - test_traits_base( SET_FNTPL_ARG(boost::uint32_t) ,SET_FNTPL_ARG(S) ); - test_traits_base( SET_FNTPL_ARG(boost::int32_t) ,SET_FNTPL_ARG(S) ); - test_traits_base( SET_FNTPL_ARG(float) ,SET_FNTPL_ARG(S) ); - test_traits_base( SET_FNTPL_ARG(double) ,SET_FNTPL_ARG(S) ); - test_traits_base( SET_FNTPL_ARG(long double) ,SET_FNTPL_ARG(S) ); - test_traits_base( SET_FNTPL_ARG(MyInt) ,SET_FNTPL_ARG(S) ); - test_traits_base( SET_FNTPL_ARG(MyFloat) ,SET_FNTPL_ARG(S) ); -} - -void test_traits() -{ - test_traits_from( SET_FNTPL_ARG(boost::uint8_t) ); - test_traits_from( SET_FNTPL_ARG(boost::int8_t) ); - test_traits_from( SET_FNTPL_ARG(boost::uint16_t) ); - test_traits_from( SET_FNTPL_ARG(boost::int16_t) ); - test_traits_from( SET_FNTPL_ARG(boost::uint32_t) ); - test_traits_from( SET_FNTPL_ARG(boost::int32_t) ); - test_traits_from( SET_FNTPL_ARG(float) ); - test_traits_from( SET_FNTPL_ARG(double) ); - test_traits_from( SET_FNTPL_ARG(long double) ); - test_traits_from( SET_FNTPL_ARG(MyInt) ); - test_traits_from( SET_FNTPL_ARG(MyFloat) ); -} - -int test_main( int, char * []) -{ - std::cout << std::setprecision( std::numeric_limits::digits10 ) ; - - test_traits(); - - return 0; -} -//--------------------------------------------------------------------------- - diff --git a/libs/numeric/conversion/test/udt_example_0.cpp b/libs/numeric/conversion/test/udt_example_0.cpp deleted file mode 100644 index 067e5e7a4..000000000 --- a/libs/numeric/conversion/test/udt_example_0.cpp +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright (C) 2005, Fernando Luis Cacciola Carballal. -// -// Distributed under the 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" -#include "boost/utility.hpp" -#include "boost/limits.hpp" -#include "boost/utility.hpp" - -#include -#include -#include -#include - - -#include "boost/test/included/test_exec_monitor.hpp" - -#include "boost/numeric/conversion/cast.hpp" - -using namespace std ; -using namespace boost; -using namespace numeric; - -// -// This example illustrates how to add support for user defined types (UDTs) -// to the Boost Numeric Conversion Library. -// It is assumed that you are familiar with the following documentation: -// -// - -// -// The minimum requirement is that boost::is_arithmetic evaluates to false -// (Otherwise the converter code will try to examine the UDT as a built-in type) -// - -// -// Let's start with the simpliest case of an UDT which supports standard conversions -// -struct Double -{ - Double( double v ) : mV(v) {} - - operator double() const { return mV ; } - - double mV ; -} ; - -double dv = (numeric_limits::max)() ; -double fv = (numeric_limits::max)() ; -Double Dv(dv); -Double Fv(fv); - -void simplest_case() -{ - // - // conversion_traits<>::udt_builtin_mixture works out of the box as long as boost::is_arithmetic yields false - // - BOOST_CHECK( (conversion_traits::udt_builtin_mixture::value == udt_to_builtin) ) ; - BOOST_CHECK( (conversion_traits::udt_builtin_mixture::value == builtin_to_udt) ) ; - BOOST_CHECK( (conversion_traits::udt_builtin_mixture::value == udt_to_udt ) ) ; - - // BY DEFINITION, a conversion from UDT to Builtin is subranged. No attempt is made to actually compare ranges. - BOOST_CHECK( (conversion_traits::subranged::value) == true ) ; - BOOST_CHECK( (conversion_traits::subranged::value) == false ) ; - - - - // - // Conversions to/from FLOATING types, if already supported by an UDT - // are also supported out-of-the-box by converter<> in its default configuration. - // - BOOST_CHECK( numeric_cast(Dv) == static_cast(Dv) ) ; - BOOST_CHECK( numeric_cast(dv) == static_cast(dv) ) ; - - BOOST_CHECK( numeric_cast (Dv) == static_cast (Dv) ) ; - BOOST_CHECK( numeric_cast(fv) == static_cast(fv) ) ; - - - // - // Range checking is disabled by default if an UDT is either the source or target of the conversion. - // - BOOST_CHECK( (converter::out_of_range(dv) == cPosOverflow) ); - BOOST_CHECK( (converter::out_of_range(Dv) == cInRange) ); - -} - -// -// The conversion_traits<> class and therefore the converter<> class looks at -// numeric_limits::is_integer/is_signed to generate the proper float_in and sign mixtures. -// In most implementations, is_integer/is_signed are both false for UDTs if there is no explicit specialization for it. -// Therefore, the converter<> will see any UDT for which numeric_limits<> is not specialized as Float AND unsigned. -// Signess is used in the converter<> for range checking, but range checking is disabled by default for UDTs, so, -// normally, signess is mostly irrelevant as far as the library is concerned, except for the numeric_traits<>::sign_mixture -// entry. -// is_integer, however, is relevant in that if the conversion is from a float type to an integer type, the conversion is -// "rounding" and the rounder policies will participate. -// ALL implemented rounder policies require proper definitions for floor(udt) and ceil(udt). -// These names will be searched for using ADL, so, if you need to convert TO integral types from a UDT, -// you need to supply those functions along with the UDT in right namespace (that is, any namespace that allows -// ADL to find them) - -// If your UDT doesn't supply floor/ceil, conversions to integer types -// won't compile unless a custom Float2IntRounder is used. - -Double floor ( Double v ) { return Double(std::floor(v.mV)) ; } -Double ceil ( Double v ) { return Double(std::ceil (v.mV)) ; } - -void rounding() -{ - BOOST_CHECK( numeric_cast(Dv) == static_cast(Dv) ) ; -} - - -// -// If your UDT can't or won't provide floor/ceil you can set-up and use your own -// Float2IntRounder policy (though doing this is not always required as shown so far) -// -struct DoubleToInt -{ - static Double nearbyint ( Double const& s ) { return Double(static_cast(s)); } - - typedef mpl::integral_c< std::float_round_style, std::round_toward_zero> round_style ; -} ; - -void custom_rounding() -{ - typedef converter - ,void // By default UDT disable range checking so this won't be used - ,DoubleToInt - > - DoubleToIntConverter ; - - BOOST_CHECK( DoubleToIntConverter::convert(Dv) == static_cast(Dv) ) ; -} - -// -// In the next Level of complexity, your UDTs might not support conversion operators -// -struct Float -{ - Float( float v ) : mV(v) {} - - float mV ; -} ; - -struct Int -{ - Int( int v ) : mV(v) {} - - int mV ; -} ; - -typedef conversion_traits Float2IntTraits ; -typedef conversion_traits Int2FloatTraits ; - -namespace boost { namespace numeric -{ -// -// Though static_cast<> won't work with them you can still use numeric_cast<> by specializing -// raw_converter as follows: -// -template<> struct raw_converter -{ - typedef Float2IntTraits::result_type result_type ; - typedef Float2IntTraits::argument_type argument_type ; - - static result_type low_level_convert ( argument_type s ) { return Int((int)s.mV); } -} ; -template<> struct raw_converter -{ - typedef Int2FloatTraits::result_type result_type ; - typedef Int2FloatTraits::argument_type argument_type ; - - static result_type low_level_convert ( argument_type s ) { return Float(s.mV); } -} ; - -} } - -void custom_raw_converter() -{ - Float f (12.34); - Int i (12); - Float fi(12); - - BOOST_CHECK(numeric_cast (f).mV == i .mV ) ; - BOOST_CHECK(numeric_cast(i).mV == fi.mV ) ; -} - -// -// Alterntively, the custom raw_converter classes can be defined non-instrusively -// (not as specializations) and passed along as policies -// -struct Float2IntRawConverter -{ - static Int low_level_convert ( Float const& s ) { return Int((int)s.mV); } -} ; -struct Int2FloatRawConverter -{ - static Float low_level_convert ( Int const& s ) { return Float(s.mV); } -} ; - -void custom_raw_converter2() -{ - Float f (12.34); - Int i (12); - Float fi(12); - - typedef converter - ,Float2IntRawConverter - > - Float2IntConverter ; - - BOOST_CHECK(Float2IntConverter::convert(f).mV == i .mV ) ; -} - -int test_main( int, char* [] ) -{ - cout << setprecision( numeric_limits::digits10 ) ; - - simplest_case(); - rounding(); - custom_rounding(); - custom_raw_converter(); - custom_raw_converter2(); - - return 0; -} - - - - - - diff --git a/libs/numeric/conversion/test/udt_support_test.cpp b/libs/numeric/conversion/test/udt_support_test.cpp deleted file mode 100644 index 581b0e504..000000000 --- a/libs/numeric/conversion/test/udt_support_test.cpp +++ /dev/null @@ -1,309 +0,0 @@ -// (C) Copyright 2003, Fernando Luis Cacciola Carballal. -// -// Distributed under the 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 -#include -#include -#include -#include -#include - -#include "boost/numeric/conversion/converter.hpp" - -#ifdef __BORLANDC__ -#pragma hdrstop -#endif - -#include "test_helpers.cpp" -#include "test_helpers2.cpp" -#include "test_helpers3.cpp" - -using namespace std ; -using namespace boost ; -using namespace numeric ; -using namespace MyUDT ; - -//------------------------------------------------------------------------- -// These are the typical steps that are required to install support for -// conversions from/to UDT which need special treatment. -//------------------------------------------------------------------------- - - - -// -// (1) Instantiate specific convesions traits. -// This step is only for convenience. -// These traits instances are required in order to define the specializations -// that follow (and which *are required* to make the library work with MyInt and MyFloat) -// -namespace MyUDT { - -typedef conversion_traits MyFloat_to_double_Traits; -typedef conversion_traits MyFloat_to_int_Traits; -typedef conversion_traits MyFloat_to_MyInt_Traits; -typedef conversion_traits MyInt_to_int_Traits; -typedef conversion_traits MyInt_to_MyFloat_Traits; -typedef conversion_traits double_to_MyInt_Traits; - -} // namespace MyUDT - - -// -// (2) Define suitable raw converters. -// -// Our sample UDTs don't support implicit conversions. -// Therefore, the default raw_converter<> doesn't work, -// and we need to define our own. -// -// There are two ways of doing this: -// -// (a) One is to simply specialize boost::numeric::raw_converter<> directly. -// This way, the default converter will work out of the box, which means, for instance, -// that numeric_cast<> can be used with these UDTs. -// -// (b) Define a user class with the appropriate interface and supply it explicitely -// as a policy to a converter instance. -// -// This test uses chice (a). -// -namespace boost { - -namespace numeric { - -template<> -struct raw_converter -{ - static double low_level_convert ( MyUDT::MyFloat const& s ) - { return s.to_builtin() ; } -} ; - -template<> -struct raw_converter -{ - static int low_level_convert ( MyUDT::MyFloat const& s ) - { return static_cast( s.to_builtin() ) ; } -} ; - -template<> -struct raw_converter -{ - static MyUDT::MyInt low_level_convert ( MyUDT::MyFloat const& s ) - { return MyUDT::MyInt( static_cast(s.to_builtin()) ) ; } -} ; - -template<> -struct raw_converter -{ - static int low_level_convert ( MyUDT::MyInt const& s ) { return s.to_builtin() ; } -} ; - -template<> -struct raw_converter -{ - static MyUDT::MyFloat low_level_convert ( MyUDT::MyInt const& s ) - { - return MyUDT::MyFloat( static_cast(s.to_builtin()) ) ; - } -} ; - -template<> -struct raw_converter -{ - static MyUDT::MyInt low_level_convert ( double s ) - { return MyUDT::MyInt( static_cast(s) ) ; } -} ; - -} // namespace numeric - -} // namespace boost - - - -// -// (3) Define suitable range checkers -// -// By default, if a UDT is involved in a conversion, internal range checking is disabled. -// This is so because a UDT type can have any sort of range, even unbounded, thus -// the library doesn't attempt to automatically figure out the appropriate range checking logic. -// (as it does when builtin types are involved) -// However, this situation is a bit unsufficient in practice, specially from doing narrowing (subranged) -// conversions from UDTs. -// The library provides a rudimentary hook to help this out: The user can plug in his own -// range checker to the converter instance. -// -// This test shows how to define and use a custom range checker. -// - -namespace MyUDT { - -// -// The following are metaprogramming tools to allow us the implement the -// MyCustomRangeChecker generically, for either builtin or UDT types. -// - -// get_builtin_type::type extracts the built-in type of our UDT's -// -template struct get_builtin_type { typedef N type ; } ; -template<> struct get_builtin_type { typedef int type ; } ; -template<> struct get_builtin_type { typedef double type ; } ; - -// U extract_builtin ( T s ) returns 's' converted to the corresponding built-in type U. -// -template -struct extract_builtin -{ - static N apply ( N n ) { return n ; } -} ; -template<> -struct extract_builtin -{ - static int apply ( MyInt const& n ) { return n.to_builtin() ; } -} ; -template<> -struct extract_builtin -{ - static double apply ( MyFloat const& n ) { return n.to_builtin() ; } -} ; - -template -struct MyCustomRangeChecker -{ - typedef typename Traits::argument_type argument_type ; - - // This custom range checker uses the fact that our 'fake' UDT are merely wrappers - // around builtin types; so it just forward the logic to the correspoding range - // checkers for the wrapped builtin types. - // - typedef typename Traits::source_type S ; - typedef typename Traits::target_type T ; - - // NOTE: S and/or T can be either UDT or builtin types. - - typedef typename get_builtin_type::type builtinS ; - typedef typename get_builtin_type::type builtinT ; - - // NOTE: The internal range checker used by default is *built* when you instantiate - // a converter<> with a given Traits according to the properties of the involved types. - // Currently, there is no way to instantiate this range checker as a separate class. - // However, you can see it as part of the interface of the converter - // (since the converter inherits from it) - // Therefore, here we instantiate a converter corresponding to the builtin types to access - // their associated builtin range checker. - // - typedef boost::numeric::converter InternalConverter ; - - static range_check_result out_of_range ( argument_type s ) - { - return InternalConverter::out_of_range( extract_builtin::apply(s) ); - } - - static void validate_range ( argument_type s ) - { - return InternalConverter::validate_range( extract_builtin::apply(s) ); - } -} ; - -} // namespace MyUDT - - - - - - - - -// -// Test here -// - -void test_udt_conversions_with_defaults() -{ - cout << "Testing UDT conversion with default policies\n" ; - - // MyInt <--> int - - int mibv = rand(); - MyInt miv(mibv); - TEST_SUCCEEDING_CONVERSION_DEF(MyInt,int,miv,mibv); - TEST_SUCCEEDING_CONVERSION_DEF(int,MyInt,mibv,miv); - - // MyFloat <--> double - - double mfbv = static_cast(rand()) / 3.0 ; - MyFloat mfv (mfbv); - TEST_SUCCEEDING_CONVERSION_DEF(MyFloat,double,mfv,mfbv); - TEST_SUCCEEDING_CONVERSION_DEF(double,MyFloat,mfbv,mfv); - - // MyInt <--> MyFloat - - MyInt miv2 ( static_cast(mfbv) ); - MyFloat miv2F ( static_cast(mfbv) ); - MyFloat mfv2 ( static_cast(mibv) ); - MyInt mfv2I ( static_cast(mibv) ); - TEST_SUCCEEDING_CONVERSION_DEF(MyFloat,MyInt,miv2F,miv2); - TEST_SUCCEEDING_CONVERSION_DEF(MyInt,MyFloat,mfv2I,mfv2); -} - -template -struct GenerateCustomConverter -{ - typedef conversion_traits Traits; - - typedef def_overflow_handler OverflowHandler ; - typedef Trunc Float2IntRounder ; - typedef raw_converter RawConverter ; - typedef MyCustomRangeChecker RangeChecker ; - - typedef converter type ; -} ; - -void test_udt_conversions_with_custom_range_checking() -{ - cout << "Testing UDT conversions with custom range checker\n" ; - - int mibv = rand(); - MyFloat mfv ( static_cast(mibv) ); - - typedef GenerateCustomConverter::type int_to_MyFloat_Conv ; - - TEST_SUCCEEDING_CONVERSION( int_to_MyFloat_Conv, MyFloat, int, mfv, mibv ); - - int mibv2 = rand(); - MyInt miv (mibv2); - MyFloat mfv2 ( static_cast(mibv2) ); - - typedef GenerateCustomConverter::type MyInt_to_MyFloat_Conv ; - - TEST_SUCCEEDING_CONVERSION( MyInt_to_MyFloat_Conv, MyFloat, MyInt, mfv2, miv ); - - double mfbv = bounds::highest(); - typedef GenerateCustomConverter::type double_to_MyInt_Conv ; - - TEST_POS_OVERFLOW_CONVERSION( double_to_MyInt_Conv, MyInt, double, mfbv ); - - MyFloat mfv3 ( bounds::lowest() ) ; - typedef GenerateCustomConverter::type MyFloat_to_int_Conv ; - - TEST_NEG_OVERFLOW_CONVERSION( MyFloat_to_int_Conv, int, MyFloat, mfv3 ); -} - - -int test_main( int, char* [] ) -{ - cout << setprecision( numeric_limits::digits10 ) ; - - test_udt_conversions_with_defaults(); - test_udt_conversions_with_custom_range_checking(); - - return 0; -} - - - - - - diff --git a/libs/numeric/index.html b/libs/numeric/index.html deleted file mode 100644 index f1e4350be..000000000 --- a/libs/numeric/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - -Automatic redirection failed, please go to -ublas/doc/index.html
-

© Copyright Beman Dawes, 2001

-

Distributed under the Boost Software License, Version 1.0. (See accompanying -file LICENSE_1_0.txt or copy -at www.boost.org/LICENSE_1_0.txt) -

- - diff --git a/libs/numeric/interval/doc/checking.htm b/libs/numeric/interval/doc/checking.htm deleted file mode 100644 index c8af50405..000000000 --- a/libs/numeric/interval/doc/checking.htm +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - - Checking policies - - - -

Checking policies

- -

A checking policy controls how the interval class will deal - with special cases like: empty intervals, infinite numbers, invalid - values.

- -

For example, let's consider operator+(interval, T). The - second argument could be an invalid value (for a floating-point number, it - is a NaN). What to do in such a case? First, we could say that the second - argument can never be an invalid number. Second, we could also say such a - situation can arise but is forbidden. Third, we could allow such values and - generate an empty interval when encountered. And there is many other - possibilities.

- -

It is the reason why such a policy is used: there is a lot of - interesting behaviors and it would be sad to arbitrarily select one of - these.

- -

Requirements

- -

The checking class should satisfy the following requirement (in the form - of an interface):

-
-/* requirements for checking policy */
-struct checking
-{
-  static T pos_inf();
-  static T neg_inf();
-  static T nan();
-  static bool is_nan(const T&);
-  static T empty_lower();
-  static T empty_upper();
-  static bool is_empty(const T&, const T&);
-};
-
- -

The first two functions, pos_inf and neg_inf, - are invoked each time the library has to create the infinite bound of an - interval. For example, interval::whole computes - interval(checking::neg_inf(), checking::pos_inf()). If - infinite values are allowed and - std::numeric_limits<T>::infinity() returns a correct - value, such a value can be used.

- -

Next comes nan. This function is used each time a function - need to return a value of type T but is unable to compute it. - It only happens when one of the arguments of the function is invalid. For - example, if you ask what the median value of an empty interval is, - nan will be used. But please remember: lower and - upper directly return the value stocked in the interval; so, - if the interval is empty, lower will not answer - by a call to checking::nan (but will return the - same value than checking::empty_lower could return).

- -

empty_lower and empty_upper respectively - return the lower and upper bound of the empty interval. There is no - requirements for empty_lower and empty_upper to - return the same value than checking::nan. For example, if the - type T does not have any invalid value, the - empty_ functions can return the [1;0] interval.

- -

is_nan is used to test if a value of type T is - invalid or not. is_empty tests if the interval formed by the - two arguments is empty or not. Such tests will generally be at the - beginning of each function which involves an argument of type - T. If one of the inputs is declared invalid, the the function - will try to produce an invalid value or an input interval.

- -

Synopsis

-
-namespace boost {
-namespace numeric {
-namespace interval_lib {
-
-template<class T>
-struct checking_base;
-template<class T, class Checking = checking_base<T>, class Exception = exception_create_empty<T> >
-struct checking_no_empty;
-template<class T, class Checking = checking_base<T> >
-struct checking_no_nan;
-template<class T, class Checking = checking_base<T>, class Exception = exception_invalid_number<T> >
-struct checking_catch_nan;
-
-template<class T> struct exception_create_empty { T operator()(); };
-template<class T> struct exception_invalid_number { void operator()(); };
-
-} // namespace numeric
-} // namespace interval_lib
-} // namespace boost
-
- -

Predefined classes

- -

In order to simplify the customization of the policy, some templates are - already defined in the library.

- -

First of all, there is checking_base. Thanks to the - information provided by std::numeric_limits<T>, this - class is able to generate a base for the policy. If T has - quiet NaNs (as said by numeric_limits::has_quiet_NaN), then - the value is used for nan, empty_lower, - empty_upper; and a basic test is used for is_nan - (it is x!=x). If T does not have quiet NaNs, then - nan is an assert(false), the empty interval is - [1,0], and is_nan always return false. As for - nan, pos_inf returns - numeric_limits::infinity() if possible, or is an - assert(false) otherwise. neg_inf returns the - opposite. Finally, is_empty(T l,T u) is always defined by - !(l<=u).

- -

Next comes checking_no_empty. Using it means that each time - an empty interval should be produced (by empty_lower and - empty_upper), the function object given by the - Exception argument of the template is invoked and the value it - returns is propagated. So, if Exception is appropriately - defined (for example it could throw an exception, hence the name of the - argument), you can be sure no empty interval will ever be created. So - is_empty will always return false (since there is - no need to test for an empty interval). And as explained before, in that - case we can also replace nan by an assert(false); - you will be sure no invalid number will ever be produced. If this template - is not used, it implicitly means that all the functions can produce empty - intervals and they correctly deal with empty interval arguments.

- -

Finally there are checking_no_nan and - checking_catch_nan. The first one expresses the functions of - the library will never get an invalid number as argument. So - is_nan will only return false. The other one - means the arguments can be an invalid number but in that case, - is_nan will call the function object Exception - and return false. Indeed, this template means invalid numbers - should never make their way through to the body of the function. If none of - this two templates is used, it implicitly means that all the functions can - get invalid number arguments and they will correctly deal with them.

- -

exception_create_empty throws - std::runtime_error with the message "boost::interval: - empty interval created" and exception_invalid_number - throws std::invalid_argument with the message - "boost::interval: invalid number".

- -

Customizing your own checking policy

- -

In order to define a suitable policy, you need to correctly say what you - expect from your interval class. First of all, are you interested in - getting empty intervals at the end of a calculus? If you do not want to - obtain empty intervals, empty_lower and - empty_upper have to fail when invoked (they can throw an - exception, set a flag, etc). However, if no function is able to produce an - empty interval, it is no more necessary to do the test, so - is_empty may always return false. In this case, a - good compiler will do a lot of optimizations.

- -

You could also be interested in getting empty intervals at the end of - the calculus. For example, if you need to transform an array of unsure - values (or intervals) in a new array of intervals, you may not want to stop - the conversion at the first encountered problem. So - empty_lower and empty_upper need to return - suitable values in order to define an empty interval (you can use an upper - bound which is not greater or equal than the lower bound for example); and - is_empty must be able to distinguish empty intervals from the - valid intervals.

- -

Another important question is: is it possible that some base numbers - (objects of type T) are invalid? And if it is possible, are - they allowed or not ? If it is not possible, no test is necessary; - is_nan may always return false. In this case too, - a good compiler will do a lot of optimizations. If function arguments can - hold invalid numbers, two cases must be considered according to whether - they are allowed or not. If they are allowed, is_nan just has - to test if they are invalid or not. If they are forbidden, - is_nan should fail (exception, assert, etc.) when invoked on - an invalid argument and return false otherwise. The value - returned by nan does not have any interest since the interval - functions are guaranteed not to produce invalid interval bounds unless the - user passes invalid numbers to the constructors. So you can put an assert - inside if you do not trust the library. :-)

- -

And finally, you need to decide what to do with nan if it - has not already been decided at the beginning, and with - pos_inf and neg_inf. These functions should - return a value or start an exceptional behavior (especially if the base - type does not have corresponding values).

- -

Some examples

- -
    -
  • If you need a checking policy that allows the library to correctly - manipulate data, even if they contain invalid numbers and empty - intervals, then checking_base<T> is a - possibility.
  • - -
  • If you do not want empty intervals to be created and are not sure all - the numbers are valid, then checking_catch_nan<T, - checking_no_empty<T> > can help you.
  • - -
  • If all the numbers will be valid and if no empty interval is supposed - to be created (or if you do not want them to be created), then you can - use checking_no_nan<T, checking_no_empty<T> >. - Please note that if T does not have a way to represent - invalid numbers, then this policy will behave the same way as - checking_no_empty<T>. This is the default policy and - it is also called interval_lib::checking_strict.
  • - -
  • If all numerical data are valid but the algorithm can produce and - manipulate empty intervals, then checking_no_nan<T> - should be used.
  • - -
  • Similarly, if invalid data have to be signaled and the algorithm can - manipulate empty intervals, the checking_catch_nan<T> - is a solution.
  • - -
  • If you do not mind having undefined results when an empty interval or - an interval number is produced, your best bet is to create your own - policy by overloading checking_base and modifying - is_nan et is_empty in order for them to always - return false. It is probably the fastest checking policy - available; however, it suffers from its deficient security.
  • -
-
- -

Valid HTML 4.01 Transitional

- -

Revised - 2006-12-24

- -

Copyright © 2002 Guillaume Melquiond, Sylvain Pion, Hervé - Brönnimann, Polytechnic University
- Copyright © 2003-2004 Guillaume Melquiond

- -

Distributed under the 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/libs/numeric/interval/doc/comparisons.htm b/libs/numeric/interval/doc/comparisons.htm deleted file mode 100644 index e084d7bea..000000000 --- a/libs/numeric/interval/doc/comparisons.htm +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - Comparisons - - - -

Comparisons

- -

As was said before, the definition of the comparison operators induces a - slight problem. There are many ways to define them, depending of the return - type or the expected order. It is the reason why the meaning of the - operators is not fixed once and for all.

- -

The way the operators are defined could have been influenced by a - policy, as it is already the case for the rounding and the checking. - However, comparisons are more an external property of the the class rather - than an internal one. They are meant to be locally modified, independantly - of the type of the intervals.

- -

The operators <, <=, >, - >=, ==, != are defined each time; - and like the arithmetic operators they can take an argument of the base - type. However, due to technical limitations, this base type can only be the - second argument; so the operators are unfortunately not fully symmetric. - The return type is not always bool, since some interesting - results can be achieved by using a tri-state return type. So here is the - common signatures of the operators:

-
-template<class T, class Policies1, class Policies2>
-return_type operator== (const interval<T, Policies1>&, const interval<T, Policies2>&);
-
-template<class T, class Policies>
-return_type operator== (const interval<T, Policies>&, const T&);
-
- -

vided comparisons

- -

Default comparison

- -

If nothing is specified, the meaning of the comparison operators are an - extension of the operator on the base type. More precisely, if one of the - argument is invalid or empty, an exception is thrown. If the arguments are - valid, the following rules are applied to determine the result of - [a,b] op [c,d] (just consider - c == d if the second argument is of type - T):

- -
    -
  • if ∀ x ∈ [a,b] ∀ y - ∈ [c,d] (x op - y), then true
  • - -
  • if ∀ x ∈ [a,b] ∀ y - ∈ [c,d] !(x op - y), then false
  • - -
  • otherwise throw an exception.
  • -
- -

This comparison allows to replace base types by interval types without - changing the meaning of a program. Indeed, if no exception is thrown, the - result is the same as before; and if an exception is thrown, the previous - comparison was unsure and should have been rewritten.

- -

Other comparisons

- -

The other comparisons are selected by using a namespace. These - namespaces are located under - boost::numeric::interval_lib::compare and are invoked by:

-
-using namespace boost::numeric::interval_lib::compare::the_comparison_to_select;
-
- -

After this line, the default meaning of the operators will have been - replaced by the meaning located in the namespace. Please note that because - of C++ lookup rules, it is not possible to use two namespaces one after - another and they must be used in different block hierarchies. Otherwise the - compiler will complain about ambiguous operators. To summarize:

-
-// example 1: BAD
-using namespace compare1;
-...
-using namespace compare2;
-...
-
-// example 2: GOOD
-{ using namespace compare1;
-  ...                       }
-{ using namespace compare2;
-  ...                       }
-
-// example 3: BAD
-using namespace compare1;
-...
-{ using namespace compare2;
-  ...                       }
-
- -

Now comes the list of the provided comparisons. They all are located in - their respective header files under - <boost/numeric/interval/compare/...>. And as for the - default comparison, the operators will generally complain by throwing an - exception if feed by invalid values.

- -
    -
  • certain: this comparison is equivalent to the default - scheme with the exceptional case mapped to false. So these - operators answer true only when the comparison is verified - for all pairs of elements.
  • - -
  • possible: this time, the exceptional case is mapped to - true. The operators answer true as soon as the - comparison is verified for a pair of elements.
  • - -
  • lexicographic: the lexicographic order (the lower bounds - are first compared, and if it is not enough to know the result, the upper - bounds are then compared). This order does not have a meaning in interval - arithmetic. However, since it is the natural total order on pair of - (totally ordered) numbers, it may be handy in some cases.
  • - -
  • set: the set inclusion partial order. This time, an - empty interval is not considered to be invalid (but an invalid number is - still invalid). <= and < are the subset - and proper subset relations; and >= and > - are the superset and proper superset relations.
  • - -
  • tribool: this comparison relies on the Boost tristate - boolean library and changes the default operators so that an explicit - indeterminate value is returned in the third case instead of throwing an - exception.
  • -
- -

Exception

-
-namespace boost {
-namespace numeric {
-namespace interval_lib {
-
-class comparison_error: std::runtime_error; // "boost::interval: uncertain comparison"
-
-} // namespace interval_lib
-} // namespace numeric
-} // namespace boost
-
- -

Explicit comparison functions

- -

In some situation, you may want to perform direct comparisons on the - bounds and avoid the indeterminate case that appears with default - operators. Some functions are provided for this purpose. They expect their - arguments to be valid and return a result after only one comparison. Their - names are composed by cer (for "certain", if the default - comparison is true, the result is true) or pos (for - "possible", if the default comparison is false, the result is false) - followed by lt, le, gt, - ge, eq or ne. They are located in - <boost/numeric/interval/compare/explicit.hpp>. Each of - these functions takes two parameters and returns a boolean; the parameters - are expected to be valid, undefined behavior may result otherwise. For - example, the definition of the "certainly less than" comparison is:

-
-namespace boost {
-namespace numeric {
-namespace interval_lib {
-
-template<class T, class Policies1, class Policies2>
-bool cerlt(const interval<T, Policies1>& x, const interval<T, Policies2>& y);
-
-template<class T, class Policies>
-bool cerlt(const interval<T, Policies>& x, const T& y);
-
-template<class T, class Policies>
-bool cerlt(const T& x, const interval<T, Policies>& y);
-
-} // namespace interval_lib
-} // namespace numeric
-} // namespace boost
-
-
- -

Valid HTML 4.01 Transitional

- -

Revised - 2006-12-24

- -

Copyright © 2002 Guillaume Melquiond, Sylvain Pion, Hervé - Brönnimann, Polytechnic University
- Copyright © 2003 Guillaume Melquiond

- -

Distributed under the 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/libs/numeric/interval/doc/examples.htm b/libs/numeric/interval/doc/examples.htm deleted file mode 100644 index 81400c8fe..000000000 --- a/libs/numeric/interval/doc/examples.htm +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - - - Tests and Examples - - - -

Tests and Examples

- -

A first example

- -

This example shows how to design a function which takes a polynomial and - a value and returns the sign of this polynomial at this point. This - function is a filter: if the answer is not guaranteed, the functions says - so. The reason of using a filter rather than a simple evaluation function - is: computations with floating-point numbers will incur approximations and - it can be enough to change the sign of the polynomial. So, in order to - validate the result, the function will use interval arithmetic.

- -

The first step is the inclusion of the appropriate headers. Because the - function will handle floating-point bounds, the easiest solution is:

-
-#include <boost/numeric/interval.hpp>
-
- -

Now, let's begin the function. The polynomial is given by the array of - its coefficients and its size (strictly greater to its degree). In order to - simplify the code, two namespaces of the library are included.

-
-int sign_polynomial(double x, double P[], int sz) {
-  using namespace boost::numeric;
-  using namespace interval_lib;
-
- -

Then we can define the interval type. Since no special behavior is - required, the default policies are enough:

-
-  typedef interval<double> I;
-
- -

For the evaluation, let's just use the Horner scheme with interval - arithmetic. The library overloads all the arithmetic operators and provides - mixed operations, so the only difference between the code with and without - interval arithmetic lies in the type of the iterated value - y:

-
-  I y = P[sz - 1];
-  for(int i = sz - 2; i >= 0; i--)
-    y = y * x + P[i];
-
- -

The last step is the computation of the sign of y. It is - done by choosing an appropriate comparison scheme and then doing the - comparison with the usual operators:

-
-  using namespace compare::certain;
-  if (y > 0.) return 1;
-  if (y < 0.) return -1;
-  return 0;
-}
-
- -

The answer 0 does not mean the polynomial is zero at this - point. It only means the answer is not known since y contains - zero and thus does not have a precise sign.

- -

Now we have the expected function. However, due to the poor - implementations of floating-point rounding in most of the processors, it - can be useful to say to optimize the code; or rather, to let the library - optimize it. The main condition for this optimization is that the interval - code should not be mixed with floating-point code. In this example, it is - the case, since all the operations done in the functions involve the - library. So the code can be rewritten:

-
-int sign_polynomial(double x, double P[], int sz) {
-  using namespace boost::numeric;
-  using namespace interval_lib;
-  typedef interval<double> I_aux;
-
-  I_aux::traits_type::rounding rnd;
-  typedef unprotect<I_aux>::type I;
-
-  I y = P[sz - 1];
-  for(int i = sz - 2; i >= 0; i--) 
-    y = y * x + P[i];
-
-  using namespace compare::certain;
-  if (y > 0.) return 1;
-  if (y < 0.) return -1;
-  return 0;
-}
-
- -

The difference between this code and the previous is the use of another - interval type. This new type I indicates to the library that - all the computations can be done without caring for the rounding mode. And - because of that, it is up to the function to care about it: a rounding - object need to be alive whenever the optimized type is used.

- -

Other tests and examples

- -

In libs/numeric/interval/test/ and - libs/numeric/interval/examples/ are some test and example - programs.. The examples illustrate a few uses of intervals. For a general - description and considerations on using this library, and some potential - domains of application, please read this mini-guide.

- -

Tests

- -

The test programs are as follows. Please note that they require the use - of the Boost.test library and can be automatically tested by using - bjam (except for interval_test.cpp).

- -

add.cpp tests if the additive and subtractive operators and the - respective _std and _opp rounding functions are correctly implemented. It - is done by using symbolic expressions as a base type.

- -

cmp.cpp, cmp_lex.cpp, cmp_set.cpp, and - cmp_tribool.cpp test if the operators < - > <= >= == - != behave correctly for the default, lexicographic, set, and - tristate comparisons. cmp_exp.cpp tests the explicit comparison - functions cer.. and pos.. behave correctly. - cmp_exn.cpp tests if the various policies correctly detect - exceptional cases. All these tests use some simple intervals ([1,2] and - [3,4], [1,3] and [2,4], [1,2] and [2,3], etc).

- -

det.cpp tests if the _std and _opp - versions in protected and unprotected mode produce the same result when - Gauss scheme is used on an unstable matrix (in order to exercise rounding). - The tests are done for interval<float> and - interval<double>.

- -

fmod.cpp defines a minimalistic version of - interval<int> and uses it in order to test - fmod on some specific interval values.

- -

mul.cpp exercises the multiplication, the finite division, the - square and the square root with some integer intervals leading to exact - results.

- -

pi.cpp tests if the interval value of π (for int, - float and double base types) contains the number - π (defined with 21 decimal digits) and if it is a subset of - [π±1ulp] (in order to ensure some precision).

- -

pow.cpp tests if the pow function behaves correctly - on some simple test cases.

- -

test_float.cpp exercises the arithmetic operations of the library - for floating point base types.

- -

interval_test.cpp tests if the interval library respects the - inclusion property of interval arithmetic by computing some functions and - operations for both double and - interval<double>.

- -

Examples

- -

filter.cpp contains filters for computational geometry able to - find the sign of a determinant. This example is inspired by the article - Interval arithmetic yields efficient dynamic filters for computational - geometry by Brönnimann, Burnikel and Pion, 2001.

- -

findroot_demo.cpp finds zeros of some functions by using - dichotomy and even produces gnuplot data for one of them. The processor has - to correctly handle elementary functions for this example to properly - work.

- -

horner.cpp is a really basic example of unprotecting the interval - operations for a whole function (which computes the value of a polynomial - by using Horner scheme).

- -

io.cpp shows some stream input and output operators for intervals - .The wide variety of possibilities explains why the library do not - implement i/o operators and they are left to the user.

- -

newton-raphson.cpp is an implementation of a specialized version - of Newton-Raphson algorithm for finding the zeros of a function knowing its - derivative. It exercises unprotecting, full division, some set operations - and empty intervals.

- -

transc.cpp implements the transcendental part of the rounding - policy for double by using an external library (the MPFR - subset of GMP in this case).

-
- -

Valid HTML 4.01 Transitional

- -

Revised - 2006-12-24

- -

Copyright © 2002 Guillaume Melquiond, Sylvain Pion, Hervé - Brönnimann, Polytechnic University
- Copyright © 2003 Guillaume Melquiond

- -

Distributed under the 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/libs/numeric/interval/doc/guide.htm b/libs/numeric/interval/doc/guide.htm deleted file mode 100644 index 5c30aa5e3..000000000 --- a/libs/numeric/interval/doc/guide.htm +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - Choosing Your Own Interval Type - - - -

Choosing Your Own Interval Type

- -

First of all, you need to select your base type. In order to obtain an - useful interval type, the numbers should respect some requirements. Please - refer to this page in order to see them. When - your base type is robust enough, you can go to the next step: the choice of - the policies.

- -

As you should already know if you did not come to this page by accident, - the interval class expect a policies argument describing the - rounding and checking - policies. The first thing to do is to verify if the default policies are or - are not adapted to your case. If your base type is not float, - double, or long double, the default rounding - policy is probably not adapted. However, by specializing - interval_lib::rounded_math to your base type, the default - rounding policy will be suitable.

- -

The default policies define an interval type that performs precise - computations (for float, double, long - double), detects invalid numbers and throws exception each times an - empty interval is created. This is a brief description and you should refer - to the corresponding sections for a more precise description of the default - policies. Unless you need some special behavior, this default type is - usable in a lot of situations.

- -

After having completely defined the interval type (and its policies), - the only thing left to do is to verify that the constants are defined and - std::numeric_limits is correct (if needed). Now you can use - your brand new interval type.

- -

Some Examples

- -

Solving systems

- -

If you use the interval library in order to solve equation and - inequation systems by bisection, something like - boost::interval<double> is probably what you need. The - computations are precise, and they may be fast if enclosed in a protected - rounding mode block (see the performance - section). The comparison are "certain"; it is probably the most used type - of comparison, and the other comparisons are still accessible by the - explicit comparison functions. The checking forbid empty interval; they are - not needed since there would be an empty interval at end of the computation - if an empty interval is created during the computation, and no root would - be inside. The checking also forbid invalid numbers (NaN for floating-point - numbers). It can be a minor performance hit if you only use exact - floating-point constants (which are clearly not NaNs); however, if - performance really does matter, you will probably use a good compiler which - knows how to inline functions and all these annoying little tests will - magically disappear (if not, it is time to upgrade your compiler).

- -

Manipulating wide intervals

- -

You may want to use the library on intervals with imprecise bounds or on - inexact numbers. In particular, it may be an existing algorithm that you - want to rewrite and simplify by using the library. In that case, you are - not really interested by the inclusion property; you are only interested by - the computation algorithms the library provides. So you do not need to use - any rounding; the checking also may not be useful. Use an "exact - computation" rounding (you are allowed to think the name strangely applies - to the situation) and a checking that never tests for any invalid numbers - or empty intervals. By doing that, you will obtain library functions - reduced to their minimum (an addition of two intervals will only be two - additions of numbers).

- -

Computing ranges

- -

The inputs of your program may be empty intervals or invalid values (for - example, a database can allow undefined values in some field) and the core - of your program could also do some non-arithmetic computations that do not - always propagate empty intervals. For example, in the library, the - hull function can happily receive an empty interval but not - generate an empty interval if the other input is valid. The - intersect function is also able to produce empty intervals if - the intervals do not overlap. In that case, it is not really interesting if - an exception is thrown each time an empty interval is produced or an - invalid value is used; it would be better to generate and propagate empty - intervals. So you need to change the checking policy to something like - interval_lib::checking_base<T>.

- -

Switching interval types

- -

This example does not deal with a full case, but with a situation that - can occur often. Sometimes, it can be useful to change the policies of an - interval by converting it to another type. For example, this happens when - you use an unprotected version of the interval type in order to speed up - the computations; it is a change of the rounding policy. It also happens - when you want to temporarily allow empty intervals to be created; it is a - change of the checking policy. These changes should not be prohibited: they - can greatly enhance a program (lisibility, interest, performance).

-
- -

Valid HTML 4.01 Transitional

- -

Revised - 2006-12-24

- -

Copyright © 2002 Guillaume Melquiond, Sylvain Pion, Hervé - Brönnimann, Polytechnic University

- -

Distributed under the 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/libs/numeric/interval/doc/includes.htm b/libs/numeric/interval/doc/includes.htm deleted file mode 100644 index eb8880dc9..000000000 --- a/libs/numeric/interval/doc/includes.htm +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - - - Headers Inclusion - - - -

Headers Inclusion

- -

The easiest way to access to the library is by including the main - header:

-
-#include <boost/numeric/interval.hpp>
-
- -

This header will include almost all the other headers (except the ones - listed as extensions). However, you may not want to access all the - functionalities of the library. So this page stands as a reminder for the - whole structure of the library. - <boost/numeric/interval.hpp> is the only header to be - located directly under boost/numeric; all the other headers - are located in the subdirectory boost/numeric/interval. And - each time this documentation will refer to - interval/something.hpp, it is - <boost/numeric/interval/something.hpp>.

- -

Please also note that all the following headers are independent and can - easily be pre-compiled if necessary (for compilers which support - pre-compiled headers of course).

- -

Function definitions

- -

The following headers contain the definition of the - interval class and all the friendly functions and - operators.

- -

interval/interval.hpp

- -

This header contains the definition and the declaration of the - interval class. However, this class is templated and the - default template parameters are not available by this header. In - particular, this header does not provide the default specialization of the - interval class for the floating-point types - (interval<float>, interval<double> - and interval<long double>). So, unless you use your own - policies, this header is not really useful on its own.

- -

interval/utility.hpp

- -

In this header are all the functions that do not expect any arithmetic - property from the base number type. It only expects the bounds to be - ordered; but it should not surprise you since it is a requirement of the - whole library. You will find in this header the definitions of access and - related functions: lower, upper, - checked_lower, checked_upper, - median, width, widen. There are also - the set-like functions: in, zero_in, - empty, subset, proper_subset, - overlap, singleton, equal, - intersect, hull, bisect. Finally, - abs, min, and max are defined.

- -

interval/arith.hpp

- -

Here are the binary operators +, -, - *, / and the unary operator -.

- -

interval/arith2.hpp

- -

This header defines fmod, square, - sqrt, pow, and root.

- -

interval/arith3.hpp

- -

The third arithmetic header: it provides the functions add, - sub, mul, and div. The type of their - arguments is the base number type.

- -

interval/transc.hpp

- -

It is the last of the headers with mathematical functions; it provides - the following functions: cos, sin, - tan, acos, asin, atan, - cosh, sinh, tanh, - acosh, asinh, atanh, - exp, and log.

- -

Policies

- -

The following headers define some policies. They may be needed if you - use the default policies.

- -

interval/rounded_arith.hpp

- -

This header defines the three provided rounding policies for the - arithmetic functions: rounded_arith_std, - rounded_arith_opp, rounded_arith_exact.

- -

interval/rounded_transc.hpp

- -

This header defines the three provided rounding policies for the - transcendental functions: rounded_transc_std, - rounded_transc_opp, rounded_transc_exact. It is - separated from rounded_arith.hpp since the transcendental part - of the rounding policy is probably less useful than the arithmetic - part.

- -

interval/hw_rounding.hpp

- -

Here are full rounding policies for the basic floating-point types. The - policies are processor-dependent; and to allow the user code to be - portable, they only define the common subset of the hardware available - functions, which are the arithmetic functions of the rounding policy.

- -

interval/checking.hpp

- -

This header provides the predefined checking policies: - checking_base, checking_no_empty, - checking_no_nan, checking_catch_nan, - checking_strict.

- -

interval/policies.hpp

- -

Here are defined the helpers for manipulating policies. It contains - policies (and so is needed for using default policies), - change_rounding, change_checking, - unprotect, etc.

- -

Comparisons

- -

interval/compare.hpp

- -

This header includes all the following headers. They provide some - predefined comparison namespaces.

- -

interval/compare/certain.hpp

- -

Here is compare::certain.

- -

interval/compare/possible.hpp

- -

And here is its friend compare::possible.

- -

interval/compare/explicit.hpp

- -

The explicit comparison functions cerlt, - posge, etc are defined in this header.

- -

interval/compare/lexicographic.hpp

- -

This header provides compare::lexicographic.

- -

interval/compare/set.hpp

- -

This header provides compare::set.

- -

Extensions

- -

The following headers are not included by interval.hpp and - will usually provide not always desirable capabilities.

- -

interval/io.hpp

- -

Here are defined basic stream operators << and - >>. They should only be used as a first approach and - later be replaced by a customized version.

- -

interval/limits.hpp

- -

A specialization of std::numeric_limits adapted to the - interval type.

- -

interval/compare/tribool.hpp

- -

This header provides a comparison namespace - compare::tribool especially adapted to a tristate boolean.

- -

interval/ext/integer.hpp

- -

This header provides mixed operations between intervals and integers. It - is done by converting the integer to the base number type. Because this - comparison is not always correct (for a big int may not be - exactly convertible to float), this header is not - automatically included and the user should ensure that this behavior is - compatible with what she wants to do (if it is only to multiply some - intervals by 2, it probably is a good thing to include this header).

- -

interval/ext/x86_fast_rounding_control.hpp

- -

This header defines a new rounding policy allowing to workaround the - precision problem of the x86 processors (and so speeding up the - computations). However, it only is a partial solution and it shouldn't be - used when there is a possibility of underflow or overflow.

-
- -

Valid HTML 4.01 Transitional

- -

Revised - 2006-12-24

- -

Copyright © 2002 Guillaume Melquiond, Sylvain Pion, Hervé - Brönnimann, Polytechnic University
- Copyright © 2003-2006 Guillaume Melquiond, ENS Lyon

- -

Distributed under the 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/libs/numeric/interval/doc/index.html b/libs/numeric/interval/doc/index.html deleted file mode 100644 index 00c3763d2..000000000 --- a/libs/numeric/interval/doc/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - -Automatic redirection failed, please go to -interval.htm
-

© Copyright Beman Dawes, 2001

-

Distributed under the Boost Software License, Version 1.0. (See accompanying -file LICENSE_1_0.txt or copy -at www.boost.org/LICENSE_1_0.txt)

- - \ No newline at end of file diff --git a/libs/numeric/interval/doc/interval.htm b/libs/numeric/interval/doc/interval.htm deleted file mode 100644 index e08716655..000000000 --- a/libs/numeric/interval/doc/interval.htm +++ /dev/null @@ -1,990 +0,0 @@ - - - - - - - - - Boost Interval Arithmetic Library - - - -

boost.png (6897 bytes) Interval Arithmetic Library

- -
- - - - - - - - -
Contents of this page:
- Introduction
- Synopsis
- Template class interval
- Operations and functions
- Interval support library
- - Common pitfalls and dangers
- Rationale
- History and Acknowledgments
Other pages associated with this page:
- Rounding policies
- Checking policies
- Policies manipulation
- Comparisons
- Base number type requirements
- Choosing your own interval type
- Test and example programs
- Headers inclusion
- Some items on the todo list
-
- -

Introduction and Overview

- -

As implied by its name, this library is intended to help manipulating - mathematical intervals. It consists of a single header <boost/numeric/interval.hpp> - and principally a type which can be used as interval<T>. - In fact, this interval template is declared as - interval<T,Policies> where Policies is a - policy class that controls the various behaviours of the interval class; - interval<T> just happens to pick the default policies - for the type T.

- -

Warning! - Guaranteed interval arithmetic for native floating-point format is not - supported on every combination of processor, operating system, and - compiler. This is a list of systems known to work correctly when using - interval<float> and interval<double> - with basic arithmetic operators.

- -
    -
  • x86-like hardware is supported by the library with GCC, Visual C++ - ≥ 7.1, Intel compiler (≥ 8 on Windows), CodeWarrior (≥ 9), as - long as the traditional x87 floating-point unit is used for - floating-point computations (no -mfpmath=sse2 support).
  • - -
  • Sparc hardware is supported with GCC and Sun compiler.
  • - -
  • PowerPC hardware is supported with GCC and CodeWarrior, when - floating-point computations are not done with the Altivec unit.
  • - -
  • Alpha hardware is supported with GCC, except maybe for the square - root. The options -mfp-rounding-mode=d -mieee have to be - used.
  • -
- -

The previous list is not exhaustive. And even if a system does not - provide guaranteed computations for hardware floating-point types, the - interval library is still usable with user-defined types and for doing box - arithmetic.

- -

Interval Arithmetic

- -

An interval is a pair of numbers which represents all the numbers - between these two. (Intervals are considered closed so the bounds are - included.) The purpose of this library is to extend the usual arithmetic - functions to intervals. These intervals will be written [a,b] - to represent all the numbers between a and b (included). - a and b can be infinite (but they can not be the same - infinite) and ab.

- -

The fundamental property of interval arithmetic is the - inclusion property:

- -
-
``if f is a function on a set of numbers, f can be - extended to a new function defined on intervals. This new function - f takes one interval argument and returns an interval result such - as: ∀ x ∈ [a,b], f(x) - ∈ f([a,b]).''
-
- -

Such a property is not limited to functions with only one argument. - Whenever possible, the interval result should be the smallest one able to - satisfy the property (it is not really useful if the new functions always - answer [-∞,+∞]).

- -

There are at least two reasons a user would like to use this library. - The obvious one is when the user has to compute with intervals. One example - is when input data have some builtin imprecision: instead of a number, an - input variable can be passed as an interval. Another example application is - to solve equations, by bisecting an interval until the interval width is - small enough. A third example application is in computer graphics, where - computations with boxes, segments or rays can be reduced to computations - with points via intervals.

- -

Another common reason to use interval arithmetic is when the computer - doesn't produce exact results: by using intervals, it is possible to - quantify the propagation of rounding errors. This approach is used often in - numerical computation. For example, let's assume the computer stores - numbers with ten decimal significant digits. To the question 1 + 1E-100 - - 1, the computer will answer 0 although the correct answer would be 1E-100. - With the help of interval arithmetic, the computer will answer [0,1E-9]. - This is quite a huge interval for such a little result, but the precision - is now known, without having to compute error propagation.

- -

Numbers, rounding, and exceptional behavior

- -

The base number type is the type that holds - the bounds of the interval. In order to successfully use interval - arithmetic, the base number type must present some characteristics. Firstly, due to the definition of an - interval, the base numbers have to be totally ordered so, for instance, - complex<T> is not usable as base number type for - intervals. The mathematical functions for the base number type should also - be compatible with the total order (for instance if x>y and z>t, then - it should also hold that x+z > y+t), so modulo types are not usable - either.

- -

Secondly, the computations must be exact or provide some rounding - methods (for instance, toward minus or plus infinity) if we want to - guarantee the inclusion property. Note that we also may explicitely specify - no rounding, for instance if the base number type is exact, i.e. the result - of a mathematical operation is always computed and represented without loss - of precision. If the number type is not exact, we may still explicitely - specify no rounding, with the obvious consequence that the inclusion - property is no longer guaranteed.

- -

Finally, because heavy loss of precision is always possible, some - numbers have to represent infinities or an exceptional behavior must be - defined. The same situation also occurs for NaN (Not a Number).

- -

Given all this, one may want to limit the template argument T of the - class template interval to the floating point types - float, double, and long double, as - defined by the IEEE-754 Standard. Indeed, if the interval arithmetic is - intended to replace the arithmetic provided by the floating point unit of a - processor, these types are the best choice. Unlike - std::complex, however, we don't want to limit T - to these types. This is why we allow the rounding and exceptional behaviors - to be given by the two policies (rounding and checking). We do nevertheless - provide highly optimized rounding and checking class specializations for - the above-mentioned floating point types.

- -

Operations and functions

- -

It is straightforward to define the elementary arithmetic operations on - intervals, being guided by the inclusion property. For instance, if [a,b] - and [c,d] are intervals, [a,b]+[c,d] can be computed by taking the smallest - interval that contains all the numbers x+y for x in [a,b] and y in [c,d]; - in this case, rounding a+c down and b+d up will suffice. Other operators - and functions are similarly defined (see their definitions below).

- -

Comparisons

- -

It is also possible to define some comparison operators. Given two - intervals, the result is a tri-state boolean type - {false,true,indeterminate}. The answers false and - true are easy to manipulate since they can directly be mapped on the - boolean true and false. But it is not the case for the answer - indeterminate since comparison operators are supposed to be - boolean functions. So, what to do in order to obtain boolean answers?

- -

One solution consists of deciding to adopt an exceptional behavior, such - as a failed assertion or raising an exception. In this case, the - exceptional behavior will be triggered when the result is - indeterminate.

- -

Another solution is to map indeterminate always to - false, or always to true. If false is chosen, the - comparison will be called "certain;" indeed, the result of - [a,b] < [c,d] will be true if and - only if: ∀ x ∈ [a,b] ∀ y - ∈ [c,d], x < y. If true is - chosen, the comparison will be called "possible;" indeed, the result - of [a,b] < [c,d] will be true if and - only if: ∃ x ∈ [a,b] ∃ y - ∈ [c,d], x < y.

- -

Since any of these solution has a clearly defined semantics, it is not - clear that we should enforce either of them. For this reason, the default - behavior consists to mimic the real comparisons by throwing an exception in - the indeterminate case. Other behaviors can be selected bu using specific - comparison namespace. There is also a bunch of explicitely named comparison - functions. See comparisons pages for further - details.

- -

Overview of the library, and usage

- -

This library provides two quite distinct levels of usage. One is to use - the basic class template interval<T> without specifying - the policy. This only requires one to know and understand the concepts - developed above and the content of the namespace boost. In addition to the - class interval<T>, this level of usage provides - arithmetic operators (+, -, *, - /), algebraic and piecewise-algebraic functions - (abs, square, sqrt, - pow), transcendental and trigonometric functions - (exp, log, sin, cos, - tan, asin, acos, atan, - sinh, cosh, tanh, - asinh, acosh, atanh), and the - standard comparison operators (<, <=, - >, >=, ==, !=), - as well as several interval-specific functions (min, - max, which have a different meaning than std::min - and std::max; lower, upper, - width, median, empty, - singleton, equal, in, - zero_in, subset, proper_subset, - overlap, intersect, hull, - bisect).

- -

For some functions which take several parameters of type - interval<T>, all combinations of argument types - T and interval<T> which contain at least - one interval<T>, are considered in order to avoid a - conversion from the arguments of type T to a singleton of type - interval<T>. This is done for efficiency reasons (the - fact that an argument is a singleton sometimes renders some tests - unnecessary).

- -

A somewhat more advanced usage of this library is to hand-pick the - policies Rounding and Checking and pass them to - interval<T, Policies> through the use of Policies - := boost::numeric::interval_lib::policies<Rounding,Checking>. - Appropriate policies can be fabricated by using the various classes - provided in the namespace boost::numeric::interval_lib as - detailed in section Interval Support Library. - It is also possible to choose the comparison scheme by overloading - operators through namespaces.

- -

Synopsis

-
-namespace boost {
-namespace numeric {
-
-namespace interval_lib {
-
-/* this declaration is necessary for the declaration of interval */
-template <class T> struct default_policies;
-
-/* ... ; the full synopsis of namespace interval_lib can be found here */
-
-} // namespace interval_lib
-
-
-/* template interval_policies; class definition can be found here */
-template<class Rounding, class Checking>
-struct interval_policies;
-
-/* template class interval; class definition can be found here */
-template<class T, class Policies = typename interval_lib::default_policies<T>::type > class interval;
-
-/* arithmetic operators involving intervals */
-template <class T, class Policies>  interval<T, Policies> operator+(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> operator-(const interval<T, Policies>& x);
-
-template <class T, class Policies>  interval<T, Policies> operator+(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  interval<T, Policies> operator+(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  interval<T, Policies> operator+(const T& x, const interval<T, Policies>& y);
-
-template <class T, class Policies>  interval<T, Policies> operator-(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  interval<T, Policies> operator-(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  interval<T, Policies> operator-(const T& x, const interval<T, Policies>& y);
-
-template <class T, class Policies>  interval<T, Policies> operator*(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  interval<T, Policies> operator*(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  interval<T, Policies> operator*(const T& x, const interval<T, Policies>& y);
-
-template <class T, class Policies>  interval<T, Policies> operator/(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  interval<T, Policies> operator/(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  interval<T, Policies> operator/(const T& r, const interval<T, Policies>& x);
-
-/* algebraic functions: sqrt, abs, square, pow, nth_root */
-template <class T, class Policies>  interval<T, Policies> abs(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> sqrt(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> square(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> pow(const interval<T, Policies>& x, int y);
-template <class T, class Policies>  interval<T, Policies> nth_root(const interval<T, Policies>& x, int y);
-
-/* transcendental functions: exp, log */
-template <class T, class Policies>  interval<T, Policies> exp(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> log(const interval<T, Policies>& x);
-
-/* fmod, for trigonometric function argument reduction (see below) */
-template <class T, class Policies>  interval<T, Policies> fmod(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  interval<T, Policies> fmod(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  interval<T, Policies> fmod(const T& x, const interval<T, Policies>& y);
-
-/* trigonometric functions */
-template <class T, class Policies>  interval<T, Policies> sin(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> cos(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> tan(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> asin(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> acos(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> atan(const interval<T, Policies>& x);
-
-/* hyperbolic trigonometric functions */
-template <class T, class Policies>  interval<T, Policies> sinh(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> cosh(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> tanh(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> asinh(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> acosh(const interval<T, Policies>& x);
-template <class T, class Policies>  interval<T, Policies> atanh(const interval<T, Policies>& x);
-
-/* min, max external functions (NOT std::min/max, see below) */
-template <class T, class Policies>  interval<T, Policies> max(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  interval<T, Policies> max(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  interval<T, Policies> max(const T& x, const interval<T, Policies>& y);
-template <class T, class Policies>  interval<T, Policies> min(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  interval<T, Policies> min(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  interval<T, Policies> min(const T& x, const interval<T, Policies>& y);
-
-/* bounds-related interval functions */
-template <class T, class Policies>  T lower(const interval<T, Policies>& x);
-template <class T, class Policies>  T upper(const interval<T, Policies>& x);
-template <class T, class Policies>  T width(const interval<T, Policies>& x);
-template <class T, class Policies>  T median(const interval<T, Policies>& x);
-template <class T, class Policies>  T norm(const interval<T, Policies>& x);
-
-/* bounds-related interval functions */
-template <class T, class Policies>  bool empty(const interval<T, Policies>& b);
-template <class T, class Policies>  bool singleton(const interval<T, Policies>& x);
-template <class T, class Policies>  bool equal(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  bool in(const T& r, const interval<T, Policies>& b);
-template <class T, class Policies>  bool zero_in(const interval<T, Policies>& b);
-template <class T, class Policies>  bool subset(const interval<T, Policies>& a, const interval<T, Policies>& b);
-template <class T, class Policies>  bool proper_subset(const interval<T, Policies>& a, const interval<T, Policies>& b);
-template <class T, class Policies>  bool overlap(const interval<T, Policies>& x, const interval<T, Policies>& y);
-
-/* set manipulation interval functions */
-template <class T, class Policies>  interval<T, Policies> intersect(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  interval<T, Policies> hull(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  interval<T, Policies> hull(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  interval<T, Policies> hull(const T& x, const interval<T, Policies>& y);
-template <class T, class Policies>  interval<T, Policies> hull(const T& x, const T& y);
-template <class T, class Policies>  std::pair<interval<T, Policies>, interval<T, Policies> > bisect(const interval<T, Policies>& x);
-
-/* interval comparison operators */
-template<class T, class Policies>  bool operator<(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template<class T, class Policies>  bool operator<(const interval<T, Policies>& x, const T& y);
-template<class T, class Policies>  bool operator<(const T& x, const interval<T, Policies>& y);
-
-template<class T, class Policies>  bool operator<=(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template<class T, class Policies>  bool operator<=(const interval<T, Policies>& x, const T& y);
-template<class T, class Policies>  bool operator<=(const T& x, const interval<T, Policies>& y);
-
-template<class T, class Policies>  bool operator>(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template<class T, class Policies>  bool operator>(const interval<T, Policies>& x, const T& y);
-template<class T, class Policies>  bool operator>(const T& x, const interval<T, Policies>& y);
-
-template<class T, class Policies>  bool operator>=(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template<class T, class Policies>  bool operator>=(const interval<T, Policies>& x, const T& y);
-template<class T, class Policies>  bool operator>=(const T& x, const interval<T, Policies>& y);
-
-
-template<class T, class Policies>  bool operator==(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template<class T, class Policies>  bool operator==(const interval<T, Policies>& x, const T& y);
-template<class T, class Policies>  bool operator==(const T& x, const interval<T, Policies>& y);
-
-template<class T, class Policies>  bool operator!=(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template<class T, class Policies>  bool operator!=(const interval<T, Policies>& x, const T& y);
-template<class T, class Policies>  bool operator!=(const T& x, const interval<T, Policies>& y);
-
-namespace interval_lib {
-
-template<class T, class Policies>  interval<T, Policies> division_part1(const interval<T, Policies>& x, const interval<T, Policies& y, bool& b);
-template<class T, class Policies>  interval<T, Policies> division_part2(const interval<T, Policies>& x, const interval<T, Policies& y, bool b = true);
-template<class T, class Policies>  interval<T, Policies> multiplicative_inverse(const interval<T, Policies>& x);
-
-template<class I>  I add(const typename I::base_type& x, const typename I::base_type& y);
-template<class I>  I sub(const typename I::base_type& x, const typename I::base_type& y);
-template<class I>  I mul(const typename I::base_type& x, const typename I::base_type& y);
-template<class I>  I div(const typename I::base_type& x, const typename I::base_type& y);
-
-} // namespace interval_lib
-
-} // namespace numeric
-} // namespace boost
-
- -

Template class - interval

The public interface of the template class - interval itself is kept at a simplest minimum: -
-template <class T, class Policies = typename interval_lib::default_policies<T>::type>
-class interval
-{
-  public:
-  typedef T base_type;
-  typedef Policies traits_type;
-
-  interval();
-  interval(T const &v);
-  template<class T1> interval(T1 const &v);
-  interval(T const &l, T const &u);
-  template<class T1, class T2> interval(T1 const &l, T2 const &u);
-  interval(interval<T, Policies> const &r);
-  template<class Policies1> interval(interval<T, Policies1> const &r);
-  template<class T1, class Policies1> interval(interval<T1, Policies1> const &r);
-
-  interval &operator=(T const &v);
-  template<class T1> interval &operator=(T1 const &v);
-  interval &operator=(interval<T, Policies> const &r);
-  template<class Policies1> interval &operator=(interval<T, Policies1> const &r);
-  template<class T1, class Policies1> interval &operator=(interval<T1, Policies1> const &r);
-
-  void assign(T const &l, T const &u);
-
-  T const &lower() const;
-  T const &upper() const;
-
-  static interval empty();
-  static interval whole();
-  static interval hull(T const &x, T const &y);
-
-  interval& operator+= (T const &r);
-  interval& operator-= (T const &r);
-  interval& operator*= (T const &r);
-  interval& operator/= (T const &r);
-  interval& operator+= (interval const &r);
-  interval& operator-= (interval const &r);
-  interval& operator*= (interval const &r);
-  interval& operator/= (interval const &r);
-};
-
- -

The constructors create an interval enclosing their arguments. If there - are two arguments, the first one is assumed to be the left bound and the - second one is the right bound. Consequently, the arguments need to be - ordered. If the property !(l <= u) is not respected, the checking policy - will be used to create an empty interval. If no argument is given, the - created interval is the singleton zero.

- -

If the type of the arguments is the same as the base number type, the - values are directly used for the bounds. If it is not the same type, the - library will use the rounding policy in order to convert the arguments - (conv_down and conv_up) and create an enclosing - interval. When the argument is an interval with a different policy, the - input interval is checked in order to correctly propagate its emptiness (if - empty).

- -

The assignment operators behave similarly, except they obviously take - one argument only. There is also an assign function in order - to directly change the bounds of an interval. It behaves like the - two-arguments constructors if the bounds are not ordered. There is no - assign function that directly takes an interval or only one number as a - parameter; just use the assignment operators in such a case.

- -

The type of the bounds and the policies of the interval type define the - set of values the intervals contain. E.g. with the default policies, - intervals are subsets of the set of real numbers. The static functions - empty and whole produce the intervals/subsets - that are respectively the empty subset and the whole set. They are static - member functions rather than global functions because they cannot guess - their return types. Likewise for hull. empty and - whole involve the checking policy in order to get the bounds - of the resulting intervals.

- -

Operations and Functions

- -

Some of the following functions expect min and - max to be defined for the base type. Those are the only - requirements for the interval class (but the policies can have - other requirements).

- -

Operators + - * / - += -= *= /=

- -

The basic operations are the unary minus and the binary + - - * /. The unary minus takes an - interval and returns an interval. The binary operations take two intervals, - or one interval and a number, and return an interval. If an argument is a - number instead of an interval, you can expect the result to be the same as - if the number was first converted to an interval. This property will be - true for all the following functions and operators.

- -

There are also some assignment operators += -= - *= /=. There is not much to say: x op= - y is equivalent to x = x op y. If an exception is - thrown during the computations, the l-value is not modified (but it may be - corrupt if an exception is thrown by the base type during an - assignment).

- -

The operators / and /= will try to produce an - empty interval if the denominator is exactly zero. If the denominator - contains zero (but not only zero), the result will be the smallest interval - containing the set of division results; so one of its bound will be - infinite, but it may not be the whole interval.

- -

lower upper median - width norm

- -

lower, upper, median respectively - compute the lower bound, the upper bound, and the median number of an - interval ((lower+upper)/2 rounded to nearest). - width computes the width of an interval - (upper-lower rounded toward plus infinity). norm - computes an upper bound of the interval in absolute value; it is a - mathematical norm (hence the name) similar to the absolute value for real - numbers.

- -

min max abs square - pow nth_root division_part? - multiplicative_inverse

- -

The functions min, max and abs - are also defined. Please do not mistake them for the functions defined in - the standard library (aka a<b?a:b, a>b?a:b, - a<0?-a:a). These functions are compatible with the - elementary property of interval arithmetic. For example, - max([a,b], [c,d]) = {max(x,y) - such that x in [a,b] and y in - [c,d]}. They are not defined in the std - namespace but in the boost namespace in order to avoid conflict with the - other definitions.

- -

The square function is quite particular. As you can expect - from its name, it computes the square of its argument. The reason this - function is provided is: square(x) is not x*x but - only a subset when x contains zero. For example, [-2,2]*[-2,2] - = [-4,4] but [-2,2]² = [0,4]; the result is a smaller interval. - Consequently, square(x) should be used instead of - x*x because of its better accuracy and a small performance - improvement.

- -

As for square, pow provides an efficient and - more accurate way to compute the integer power of an interval. Please note: - when the power is 0 and the interval is not empty, the result is 1, even if - the input interval contains 0. nth_root computes the integer root - of an interval (nth_root(pow(x,k),k) encloses x or - abs(x) depending on whether k is odd or even). - The behavior of nth_root is not defined if the integer argument is - not positive. multiplicative_inverse computes - 1/x.

- -

The functions division_part1 and - division_part2 are useful when the user expects the division - to return disjoint intervals if necessary. For example, the narrowest - closed set containing [2,3] / [-2,1] is not ]-∞,∞[ but the union - of ]-∞,-1] and [2,∞[. When the result of the division is - representable by only one interval, division_part1 returns - this interval and sets the boolean reference to false. - However, if the result needs two intervals, division_part1 - returns the negative part and sets the boolean reference to - true; a call to division_part2 is now needed to - get the positive part. This second function can take the boolean returned - by the first function as last argument. If this bool is not given, its - value is assumed to be true and the behavior of the function is then - undetermined if the division does not produce a second interval.

- -

intersect hull overlap - in zero_in subset - proper_subset empty singleton - equal

- -

intersect computes the set intersection of two closed sets, - hull computes the smallest interval which contains the two - parameters; those parameters can be numbers or intervals. If one of the - arguments is an invalid number or an empty interval, the function will only - use the other argument to compute the resulting interval (if allowed by the - checking policy).

- -

There is no union function since the union of two intervals is not an - interval if they do not overlap. If they overlap, the hull - function computes the union.

- -

The function overlap tests if two intervals have some - common subset. in tests if a number is in an interval; - zero_in is a variant which tests if zero is in the interval. - subset tests if the first interval is a subset of the second; - and proper_subset tests if it is a proper subset. - empty and singleton test if an interval is empty - or is a singleton. Finally, equal tests if two intervals are - equal.

- -

sqrt log exp sin - cos tan asin acos - atan sinh cosh tanh - asinh acosh atanh - fmod

- -

The functions sqrt, log, exp, - sin, cos, tan, asin, - acos, atan, sinh, cosh, - tanh, asinh, acosh, - atanh are also defined. There is not much to say; these - functions extend the traditional functions to the intervals and respect the - basic property of interval arithmetic. They use the checking policy to produce empty intervals when the - input interval is strictly outside of the domain of the function.

- -

The function fmod(interval x, interval y) expects the lower - bound of y to be strictly positive and returns an interval - z such as 0 <= z.lower() < y.upper() and - such as z is a superset of x-n*y (with - n being an integer). So, if the two arguments are positive - singletons, this function fmod(interval, interval) will behave - like the traditional function fmod(double, double).

- -

Please note that fmod does not respect the inclusion - property of arithmetic interval. For example, the result of - fmod([13,17],[7,8]) should be [0,8] (since it must contain - [0,3] and [5,8]). But this answer is not really useful when the purpose is - to restrict an interval in order to compute a periodic function. It is the - reason why fmod will answer [5,10].

- -

add sub mul - div

- -

These four functions take two numbers and return the enclosing interval - for the operations. It avoids converting a number to an interval before an - operation, it can result in a better code with poor optimizers.

- -

Constants

- -

Some constants are hidden in the - boost::numeric::interval_lib namespace. They need to be - explicitely templated by the interval type. The functions are - pi<I>(), pi_half<I>() and - pi_twice<I>(), and they return an object of interval - type I. Their respective values are π, π/2 and - 2π.

- -

Exception throwing

- -

The interval class and all the functions defined around this class never - throw any exceptions by themselves. However, it does not mean that an - operation will never throw an exception. For example, let's consider the - copy constructor. As explained before, it is the default copy constructor - generated by the compiler. So it will not throw an exception if the copy - constructor of the base type does not throw an exception.

- -

The same situation applies to all the functions: exceptions will only be - thrown if the base type or one of the two policies throws an exception.

- -

Interval Support Library

- -

The interval support library consists of a collection of classes that - can be used and combined to fabricate almost various commonly-needed - interval policies. In contrast to the basic classes and functions which are - used in conjunction with interval<T> (and the default - policies as the implicit second template parameter in this type), which - belong simply to the namespace boost, these components belong - to the namespace boost::numeric::interval_lib.

- -

We merely give the synopsis here and defer each section to a separate - web page since it is only intended for the advanced user. This allows to - expand on each topic with examples, without unduly stretching the limits of - this document.

- -

Synopsis

-
-namespace boost {
-namespace numeric {
-namespace interval_lib {
-
-/* built-in rounding policy and its specializations */
-template <class T>  struct rounded_math;
-template <>         struct rounded_math<float>;
-template <>         struct rounded_math<double>;
-template <>         struct rounded_math<long double>;
-
-/* built-in rounding construction blocks */
-template <class T>  struct rounding_control;
-
-template <class T, class Rounding = rounding_control<T> >  struct rounded_arith_exact;
-template <class T, class Rounding = rounding_control<T> >  struct rounded_arith_std;
-template <class T, class Rounding = rounding_control<T> >  struct rounded_arith_opp;
-
-template <class T, class Rounding>  struct rounded_transc_dummy;
-template <class T, class Rounding = rounded_arith_exact<T> >  struct rounded_transc_exact;
-template <class T, class Rounding = rounded_arith_std  <T> >  struct rounded_transc_std;
-template <class T, class Rounding = rounded_arith_opp  <T> >  struct rounded_transc_opp;
-
-template <class Rounding> struct save_state;
-template <class Rounding> struct save_state_nothing;
-
-/* built-in checking policies */
-template <class T> struct checking_base;
-template <class T, class Checking = checking_base<T>, class Exception = exception_create_empty>   struct checking_no_empty;
-template <class T, class Checking = checking_base<T> >                                            struct checking_no_nan;
-template <class T, class Checking = checking_base<T>, class Exception = exception_invalid_number> struct checking_catch_nan;
-template <class T> struct checking_strict;
-
-/* some metaprogramming to manipulate interval policies */
-template <class Rounding, class Checking> struct policies;
-template <class OldInterval, class NewRounding> struct change_rounding;
-template <class OldInterval, class NewChecking> struct change_checking;
-template <class OldInterval> struct unprotect;
-
-/* constants, need to be explicitly templated */
-template<class I> I pi();
-template<class I> I pi_half();
-template<class I> I pi_twice();
-
-/* interval explicit comparison functions:
- * the mode can be cer=certainly or pos=possibly,
- * the function lt=less_than, gt=greater_than, le=less_than_or_equal_to, ge=greater_than_or_equal_to
- *   eq=equal_to, ne= not_equal_to */
-template <class T, class Policies>  bool cerlt(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  bool cerlt(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  bool cerlt(const T& x, const interval<T, Policies>& y);
-
-template <class T, class Policies>  bool cerle(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  bool cerle(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  bool cerle(const T& x, const interval<T, Policies>& y);
-
-template <class T, class Policies>  bool cergt(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  bool cergt(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  bool cergt(const T& x, const interval<T, Policies>& y);
-
-template <class T, class Policies>  bool cerge(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  bool cerge(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  bool cerge(const T& x, const interval<T, Policies>& y);
-
-template <class T, class Policies>  bool cereq(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  bool cereq(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  bool cereq(const T& x, const interval<T, Policies>& y);
-
-template <class T, class Policies>  bool cerne(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  bool cerne(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  bool cerne(const T& x, const interval<T, Policies>& y);
-
-template <class T, class Policies>  bool poslt(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  bool poslt(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  bool poslt(const T& x, const interval<T, Policies>& y);
-
-template <class T, class Policies>  bool posle(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  bool posle(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  bool posle(const T& x, const interval<T, Policies>& y);
-
-template <class T, class Policies>  bool posgt(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  bool posgt(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  bool posgt(const T& x, const interval<T, Policies> & y);
-
-template <class T, class Policies>  bool posge(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  bool posge(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  bool posge(const T& x, const interval<T, Policies>& y);
-
-template <class T, class Policies>  bool poseq(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  bool poseq(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  bool poseq(const T& x, const interval<T, Policies>& y);
-
-template <class T, class Policies>  bool posne(const interval<T, Policies>& x, const interval<T, Policies>& y);
-template <class T, class Policies>  bool posne(const interval<T, Policies>& x, const T& y);
-template <class T, class Policies>  bool posne(const T& x, const interval<T, Policies>& y);
-
-/* comparison namespaces */
-namespace compare {
-  namespace certain;
-  namespace possible;
-  namespace lexicographic;
-  namespace set;
-  namespace tribool;
-} // namespace compare
-
-} // namespace interval_lib
-} // namespace numeric
-} // namespace boost
-
- -

Each component of the interval support library is detailed in its own - page.

- - - -

Common Pitfalls and Dangers

- -

Comparisons

- -

One of the biggest problems is probably the correct use of the - comparison functions and operators. First, functions and operators do not - try to know if two intervals are the same mathematical object. So, if the - comparison used is "certain", then x != x is always true - unless x is a singleton interval; and the same problem arises - with cereq and cerne.

- -

Another misleading interpretation of the comparison is: you cannot - always expect [a,b] < [c,d] to be !([a,b] >= [c,d]) since the - comparison is not necessarily total. Equality and less comparison should be - seen as two distincts relational operators. However the default comparison - operators do respect this property since they throw an exception whenever - [a,b] and [c,d] overlap.

- -

Interval values and references

- -

This problem is a corollary of the previous problem with x != - x. All the functions of the library only consider the value of an - interval and not the reference of an interval. In particular, you should - not expect (unless x is a singleton) the following values to - be equal: x/x and 1, x*x and - square(x), x-x and 0, etc. So the main cause of - wide intervals is that interval arithmetic does not identify different - occurrences of the same variable. So, whenever possible, the user has to - rewrite the formulas to eliminate multiple occurences of the same variable. - For example, square(x)-2*x is far less precise than - square(x-1)-1.

- -

Unprotected rounding

- -

As explained in this section, a good way - to speed up computations when the base type is a basic floating-point type - is to unprotect the intervals at the hot spots of the algorithm. This - method is safe and really an improvement for interval computations. But - please remember that any basic floating-point operation executed inside the - unprotection blocks will probably have an undefined behavior (but only for - the current thread). And do not forget to create a rounding object as - explained in the example.

- -

Rationale

- -

The purpose of this library is to provide an efficient and generalized - way to deal with interval arithmetic through the use of a templatized class - boost::numeric::interval. The big contention for which we provide a - rationale is the format of this class template.

- -

It would have been easier to provide a class interval whose base type is - double. Or to follow std::complex and allow only - specializations for float, double, and long - double. We decided not to do this to allow intervals on custom - types, e.g. fixed-precision bigfloat library types (MPFR, etc), rational - numbers, and so on.

- -

Policy design. Although it was tempting to make it a - class template with only one template argument, the diversity of uses for - an interval arithmetic practically forced us to use policies. The behavior - of this class can be fixed by two policies. These policies are packaged - into a single policy class, rather than making interval with - three template parameters. This is both for ease of use (the policy class - can be picked by default) and for readability.

- -

The first policy provides all the mathematical functions on the base - type needed to define the functions on the interval type. The second one - sets the way exceptional cases encountered during computations are - handled.

- -

We could foresee situations where any combination of these policies - would be appropriate. Moreover, we wanted to enable the user of the library - to reuse the interval class template while at the same time - choosing his own behavior. See this page for some - examples.

- -

Rounding policy. The library provides specialized - implementations of the rounding policy for the primitive types float and - double. In order for these implementations to be correct and fast, the - library needs to work a lot with rounding modes. Some processors are - directly dealt with and some mechanisms are provided in order to speed up - the computations. It seems to be heavy and hazardous optimizations for a - gain of only a few computer cycles; but in reality, the speed-up factor can - easily go past 2 or 3 depending on the computer. Moreover, these - optimizations do not impact the interface in any major way (with the design - we have chosen, everything can be added by specialization or by passing - different template parameters).

- -

Pred/succ. In a previous version, two functions - pred and succ, with various corollaries like - widen, were supplied. The intent was to enlarge the interval - by one ulp (as little as possible), e.g. to ensure the inclusion property. - Since making interval a template of T, we could not define ulp for a - random parameter. In turn, rounding policies let us eliminate entirely the - use of ulp while making the intervals tighter (if a result is a - representable singleton, there is no use to widen the interval). We decided - to drop those functions.

- -

Specialization of std::less. Since the - operator < depends on the comparison namespace locally - chosen by the user, it is not possible to correctly specialize - std::less. So you have to explicitely provide such a class to - all the algorithms and templates that could require it (for example, - std::map).

- -

Input/output. The interval library does not include I/O - operators. Printing an interval value allows a lot of customization: some - people may want to output the bounds, others may want to display the median - and the width of intervals, and so on. The example file io.cpp shows some - possibilities and may serve as a foundation in order for the user to define - her own operators.

- -

Mixed operations with integers. When using and reusing - template codes, it is common there are operations like 2*x. - However, the library does not provide them by default because the - conversion from int to the base number type is not always - correct (think about the conversion from a 32bit integer to a single - precision floating-point number). So the functions have been put in a - separate header and the user needs to include them explicitely if she wants - to benefit from these mixed operators. Another point, there is no mixed - comparison operators due to the technical way they are defined.

- -

Interval-aware functions. All the functions defined by - the library are obviously aware they manipulate intervals and they do it - accordingly to general interval arithmetic principles. Consequently they - may have a different behavior than the one commonly encountered with - functions not interval-aware. For example, max is defined by - canonical set extension and the result is not always one of the two - arguments (if the intervals do not overlap, then the result is one of the - two intervals).

- -

This behavior is different from std::max which returns a - reference on one of its arguments. So if the user expects a reference to be - returned, she should use std::max since it is exactly what - this function does. Please note that std::max will throw an - exception when the intervals overlap. This behavior does not predate the - one described by the C++ standard since the arguments are not "equivalent" - and it allows to have an equivalence between a <= b and - &b == &std::max(a,b)(some particular cases may be - implementation-defined). However it is different from the one described by - SGI since it does not return the first argument even if "neither is greater - than the other".

- -

History and Acknowledgments

- -

This library was mostly inspired by previous work from Jens Maurer. Some - discussions about his work are reproduced here. Jeremy Siek - and Maarten Keijzer provided some rounding control for MSVC and Sparc - platforms.

- -

Guillaume Melquiond, Hervé Brönnimann and Sylvain Pion - started from the library left by Jens and added the policy design. - Guillaume and Sylvain worked hard on the code, especially the porting and - mostly tuning of the rounding modes to the different architectures. - Guillaume did most of the coding, while Sylvain and Hervé have - provided some useful comments in order for this library to be written. - Hervé reorganized and wrote chapters of the documentation based on - Guillaume's great starting point.

- -

This material is partly based upon work supported by the National - Science Foundation under NSF CAREER Grant CCR-0133599. Any opinions, - findings and conclusions or recommendations expressed in this material are - those of the author(s) and do not necessarily reflect the views of the - National Science Foundation (NSF).

-
- -

Valid HTML 4.01 Transitional

- -

Revised - 2006-12-25

- -

Copyright © 2002 Guillaume Melquiond, Sylvain Pion, Hervé - Brönnimann, Polytechnic University
- Copyright © 2003-2006 Guillaume Melquiond, ENS Lyon

- -

Distributed under the 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/libs/numeric/interval/doc/numbers.htm b/libs/numeric/interval/doc/numbers.htm deleted file mode 100644 index 45a1c7b6a..000000000 --- a/libs/numeric/interval/doc/numbers.htm +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - Numbers Requirements - - - -

Numbers Requirements

- -

What we call "number" is the base type of the interval - class. The interval library expect a lot of properties from this base type - in order to respect the inclusion property. All these properties are - already detailed in the other sections of this documentation; but we will - try to summarize them here.

- -

Ordering

- -

The numbers need to be supplied with an ordering. This ordering - expresses itself by the operators < <= => > == !=. - It must be a total order (reflexivity, antisymmetry, transitivity, and each - pair of numbers is ordered). So complex<T> will not be a - good candidate for the base type; if you need the inclusion property of - interval property, you should use complex< interval<T> - > in place of interval< complex<T> > - (but unfortunately, complex only provides specialization).

- -

Please note that invalid numbers are not concerned by the order; it can - even be conceptually better if a comparison with these invalid numbers is - always false (except for !=). If your checking - policy uses interval_lib::checking_base and your base type - contains invalid numbers, then this property is needed: - nan!=nan (here nan is an invalid number). If this - property is not present, then you should not use checking_base - directly.

- -

Interval arithmetic involves a lot of comparison to zero. By default, - they are done by comparing the numbers to - static_cast<T>(0). However, if the format of the numbers - allows some faster comparisons when dealing with zero, the template - functions in the interval_lib::user namespace can be - specialized:

-
-namespace user {
-template<class T> inline bool is_zero(T const &v) { return v == static_cast<T>(0); }
-template<class T> inline bool is_neg (T const &v) { return v <  static_cast<T>(0); }
-template<class T> inline bool is_pos (T const &v) { return v >  static_cast<T>(0); }
-}
-
- -

Numeric limits

- -

Another remark about the checking policy. It normally is powerful enough - to handle the exceptional behavior that the basic type could induce; in - particular infinite and invalid numbers (thanks to the four functions - pos_inf, neg_inf, nan and - is_nan). However, if you use - interval_lib::checking_base (and the default checking policy - uses it), your base type should have a correctly specialized - std::numeric_limits<T>. In particular, the values - has_infinity and has_quiet_NaN, and the functions - infinity and quiet_NaN should be accordingly - defined.

- -

So, to summarize, if you do not rely on the default policy and do not - use interval_lib::checking_base, it is not necessary to have a - specialization of the numeric limits for your base type.

- -

Mathematical properties

- -

Ensuring the numbers are correctly ordered is not enough. The basic - operators should also respect some properties depending on the order. Here - they are:

- -
    -
  • 0 ≤ x ⇒ -x ≤ 0
  • - -
  • xy ⇒ -y ≤ -x
  • - -
  • xyx+z ≤ - y+z
  • - -
  • xy and z ≥ 0 ⇒ - x×zy×z
  • - -
  • 0 < xy ⇒ 0 < 1/y ≤ - 1/x
  • -
- -

The previous properties are also used (and enough) for abs, - square and pow. For all the transcendental - functions (including sqrt), other properties are needed. These - functions should have the same properties than the corresponding real - functions. For example, the expected properties for cos - are:

- -
    -
  • cos is defined for all the valid numbers;
  • - -
  • it is 2π-periodic;
  • - -
  • cos(2π-x) is equal to - cos(x);
  • - -
  • cos is a decreasing function on [0,2π].
  • -
- -

Rounding

- -

If you work with a base type and no inexact result is ever computed, you - can skip the rest of this paragraph. You can also skip it if you are not - interested in the inclusion property (if approximate results are enough). - If you are still reading, it is probably because you want to know the basic - properties the rounding policy should validate.

- -

Whichever operation or function you consider, the following property - should be respected: f_down(x,y) <= f(x,y) <= f_up(x,y). - Here, f denotes the infinitely precise function computed and - f_down and f_up are functions which return - possibly inexact values but of the correct type (the base type). If - possible, they should try to return the nearest representable value, but it - is not always easy.

- -

Constants

- -

In order for the trigonometric functions to correctly work, the library - need to know the value of the π constant (and also π/2 and 2π). - Since these constants may not be representable in the base type, the - library does not have to know the exact value: a lower bound and an upper - bound are enough. If these values are not provided by the user, the default - values will be used: they are integer values (so π is bounded by 3 and - 4).

- -

Operators and conversions

- -

As explained at the beginning, the comparison operators should be - defined for the base type. The rounding policy defines a lot of functions - used by the interval library. So the arithmetic operators do not need to be - defined for the base type (unless required by one of the predefined - classes). However, there is an exception: the unary minus need to be - defined. Moreover, this operator should only provide exact results; it is - the reason why the rounding policy does not provide some negation - functions.

- -

The conversion from int to the base type needs to be - defined (only a few values need to be available: -1, 0, 1, 2). The - conversion the other way around is provided by the rounding policy - (int_down and int_up members); and no other - conversion is strictly needed. However, it may be valuable to provide as - much conversions as possible in the rounding policy (conv_down - and conv_up members) in order to benefit from interval - conversions.

-
- -

Valid HTML 4.01 Transitional

- -

Revised - 2006-12-24

- -

Copyright © 2002 Guillaume Melquiond, Sylvain Pion, Hervé - Brönnimann, Polytechnic University
- Copyright © 2004 Guillaume Melquiond

- -

Distributed under the 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/libs/numeric/interval/doc/policies.htm b/libs/numeric/interval/doc/policies.htm deleted file mode 100644 index 57c457d2e..000000000 --- a/libs/numeric/interval/doc/policies.htm +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - Policies - - - -

Policies

- -

The interval template requires two arguments. The first - corresponds to the base type chosen for the bounds. And the second defines - the rounding and checking behaviors of the newly constructed class. This - second argument is not mandatory but may need some customizations. In order - to ease the manipulations, some helper templates are provided in - interval/policies.hpp.

-
-namespace boost {
-namespace numeric {
-namespace interval_lib {
-
-template<class Rounding, class Checking>
-struct policies {
-  typedef Rounding rounding;
-  typedef Checking checking;
-};
-
-template<class OldInterval, class NewRounding>
-struct change_rounding {
-  typedef ... type;
-};
-
-template<class OldInterval, class NewChecking>
-struct change_checking {
-  typedef ... type;
-};
-
-template<class OldInterval>
-struct unprotect {
-  typedef ... type;
-};
-
-} // namespace interval_lib
-} // namespace numeric
-} // namespace boost
-
- -

The policies template should be used whenever the user - needs to define a policy structure for an interval class. - change_rounding and change_checking can be used - to get the type of a new interval by changing one of the policies of an old - interval; the new type is available thanks to the type definition - type. Finally, unprotect looks like - change_rounding and directly changes the rounding of an - interval to its unprotected version (a better explanation is available - here).

-
- -

Valid HTML 4.01 Transitional

- -

Revised - 2006-12-24

- -

Copyright © 2002 Guillaume Melquiond, Sylvain Pion, Hervé - Brönnimann, Polytechnic University

- -

Distributed under the 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/libs/numeric/interval/doc/rounding.htm b/libs/numeric/interval/doc/rounding.htm deleted file mode 100644 index 26e4d904c..000000000 --- a/libs/numeric/interval/doc/rounding.htm +++ /dev/null @@ -1,632 +0,0 @@ - - - - - - - - - Rounding Policies - - - -

Rounding Policies

- -

In order to be as general as possible, the library uses a class to - compute all the necessary functions rounded upward or downward. This class - is the first parameter of policies, it is also the type named - rounding in the policy definition of - interval.

- -

By default, it is interval_lib::rounded_math<T>. The - class interval_lib::rounded_math is already specialized for - the standard floating types (float , double and - long double). So if the base type of your intervals is not one - of these, a good solution would probably be to provide a specialization of - this class. But if the default specialization of - rounded_math<T> for float, - double, or long double is not what you seek, or - you do not want to specialize - interval_lib::rounded_math<T> (say because you prefer to - work in your own namespace) you can also define your own rounding policy - and pass it directly to interval_lib::policies.

- -

Requirements

- -

Here comes what the class is supposed to provide. The domains are - written next to their respective functions (as you can see, the functions - do not have to worry about invalid values, but they have to handle infinite - arguments).

-
-/* Rounding requirements */
-struct rounding {
-  // default constructor, destructor
-  rounding();
-  ~rounding();
-  // mathematical operations
-  T add_down(T, T); // [-∞;+∞][-∞;+∞]
-  T add_up  (T, T); // [-∞;+∞][-∞;+∞]
-  T sub_down(T, T); // [-∞;+∞][-∞;+∞]
-  T sub_up  (T, T); // [-∞;+∞][-∞;+∞]
-  T mul_down(T, T); // [-∞;+∞][-∞;+∞]
-  T mul_up  (T, T); // [-∞;+∞][-∞;+∞]
-  T div_down(T, T); // [-∞;+∞]([-∞;+∞]-{0})
-  T div_up  (T, T); // [-∞;+∞]([-∞;+∞]-{0})
-  T sqrt_down(T);   // ]0;+∞]
-  T sqrt_up  (T);   // ]0;+∞]
-  T exp_down(T);    // [-∞;+∞]
-  T exp_up  (T);    // [-∞;+∞]
-  T log_down(T);    // ]0;+∞]
-  T log_up  (T);    // ]0;+∞]
-  T cos_down(T);    // [0;2π]
-  T cos_up  (T);    // [0;2π]
-  T tan_down(T);    // ]-π/2;π/2[
-  T tan_up  (T);    // ]-π/2;π/2[
-  T asin_down(T);   // [-1;1]
-  T asin_up  (T);   // [-1;1]
-  T acos_down(T);   // [-1;1]
-  T acos_up  (T);   // [-1;1]
-  T atan_down(T);   // [-∞;+∞]
-  T atan_up  (T);   // [-∞;+∞]
-  T sinh_down(T);   // [-∞;+∞]
-  T sinh_up  (T);   // [-∞;+∞]
-  T cosh_down(T);   // [-∞;+∞]
-  T cosh_up  (T);   // [-∞;+∞]
-  T tanh_down(T);   // [-∞;+∞]
-  T tanh_up  (T);   // [-∞;+∞]
-  T asinh_down(T);  // [-∞;+∞]
-  T asinh_up  (T);  // [-∞;+∞]
-  T acosh_down(T);  // [1;+∞]
-  T acosh_up  (T);  // [1;+∞]
-  T atanh_down(T);  // [-1;1]
-  T atanh_up  (T);  // [-1;1] 
-  T median(T, T);   // [-∞;+∞][-∞;+∞]
-  T int_down(T);    // [-∞;+∞]
-  T int_up  (T);    // [-∞;+∞]
-  // conversion functions
-  T conv_down(U);
-  T conv_up  (U);
-  // unprotected rounding class
-  typedef ... unprotected_rounding;
-};
-
- -

The constructor and destructor of the rounding class have a very - important semantic requirement: they are responsible for setting and - resetting the rounding modes of the computation on T. For instance, if T is - a standard floating point type and floating point computation is performed - according to the Standard IEEE 754, the constructor can save the current - rounding state, each _up (resp. _down) function - will round up (resp. down), and the destructor will restore the saved - rounding state. Indeed this is the behavior of the default rounding - policy.

- -

The meaning of all the mathematical functions up until - atanh_up is clear: each function returns number representable - in the type T which is a lower bound (for _down) - or upper bound (for _up) on the true mathematical result of - the corresponding function. The function median computes the - average of its two arguments rounded to its nearest representable number. - The functions int_down and int_up compute the - nearest integer smaller or bigger than their argument. Finally, - conv_down and conv_up are responsible of the - conversions of values of other types to the base number type: the first one - must round down the value and the second one must round it up.

- -

The type unprotected_rounding allows to remove all - controls. For reasons why one might to do this, see the protection paragraph below.

- -

Overview of the provided classes

- -

A lot of classes are provided. The classes are organized by level. At - the bottom is the class rounding_control. At the next level - come rounded_arith_exact, rounded_arith_std and - rounded_arith_opp. Then there are - rounded_transc_dummy, rounded_transc_exact, - rounded_transc_std and rounded_transc_opp. And - finally are save_state and save_state_nothing. - Each of these classes provide a set of members that are required by the - classes of the next level. For example, a rounded_transc_... - class needs the members of a rounded_arith_... class.

- -

When they exist in two versions _std and _opp, - the first one does switch the rounding mode each time, and the second one - tries to keep it oriented toward plus infinity. The main purpose of the - _opp version is to speed up the computations through the use - of the "opposite trick" (see the performance notes). - This version requires the rounding mode to be upward before entering any - computation functions of the class. It guarantees that the rounding mode - will still be upward at the exit of the functions.

- -

Please note that it is really a very bad idea to mix the - _opp version with the _std since they do not have - compatible properties.

- -

There is a third version named _exact which computes the - functions without changing the rounding mode. It is an "exact" version - because it is intended for a base type that produces exact results.

- -

The last version is the _dummy version. It does not do any - computations but still produces compatible results.

- -

Please note that it is possible to use the "exact" version for an - inexact base type, e.g. float or double. In that - case, the inclusion property is no longer guaranteed, but this can be - useful to speed up the computation when the inclusion property is not - desired strictly. For instance, in computer graphics, a small error due to - floating-point roundoff is acceptable as long as an approximate version of - the inclusion property holds.

- -

Here comes what each class defines. Later, when they will be described - more thoroughly, these members will not be repeated. Please come back here - in order to see them. Inheritance is also used to avoid repetitions.

-
-template <class T>
-struct rounding_control
-{
-  typedef ... rounding_mode;
-  void set_rounding_mode(rounding_mode);
-  void get_rounding_mode(rounding_mode&);
-  void downward ();
-  void upward   ();
-  void to_nearest();
-  T to_int(T);
-  T force_rounding(T);
-};
-
-template <class T, class Rounding>
-struct rounded_arith_... : Rounding
-{
-  void init();
-  T add_down(T, T);
-  T add_up  (T, T);
-  T sub_down(T, T);
-  T sub_up  (T, T);
-  T mul_down(T, T);
-  T mul_up  (T, T);
-  T div_down(T, T);
-  T div_up  (T, T);
-  T sqrt_down(T);
-  T sqrt_up  (T);
-  T median(T, T);
-  T int_down(T);
-  T int_up  (T);
-};
-
-template <class T, class Rounding>
-struct rounded_transc_... : Rounding
-{
-  T exp_down(T);
-  T exp_up  (T);
-  T log_down(T);
-  T log_up  (T);
-  T cos_down(T);
-  T cos_up  (T);
-  T tan_down(T);
-  T tan_up  (T);
-  T asin_down(T);
-  T asin_up  (T);
-  T acos_down(T);
-  T acos_up  (T);
-  T atan_down(T);
-  T atan_up  (T);
-  T sinh_down(T);
-  T sinh_up  (T);
-  T cosh_down(T);
-  T cosh_up  (T);
-  T tanh_down(T);
-  T tanh_up  (T);
-  T asinh_down(T);
-  T asinh_up  (T);
-  T acosh_down(T);
-  T acosh_up  (T);
-  T atanh_down(T);
-  T atanh_up  (T);
-};
-
-template <class Rounding>
-struct save_state_... : Rounding
-{
-  save_state_...();
-  ~save_state_...();
-  typedef ... unprotected_rounding;
-};
-
- -

Synopsis

-
-namespace boost {
-namespace numeric {
-namespace interval_lib {
-
-/* basic rounding control */
-template <class T>  struct rounding_control;
-
-/* arithmetic functions rounding */
-template <class T, class Rounding = rounding_control<T> > struct rounded_arith_exact;
-template <class T, class Rounding = rounding_control<T> > struct rounded_arith_std;
-template <class T, class Rounding = rounding_control<T> > struct rounded_arith_opp;
-
-/* transcendental functions rounding */
-template <class T, class Rounding> struct rounded_transc_dummy;
-template <class T, class Rounding = rounded_arith_exact<T> > struct rounded_transc_exact;
-template <class T, class Rounding = rounded_arith_std<T> > struct rounded_transc_std;
-template <class T, class Rounding = rounded_arith_opp<T> > struct rounded_transc_opp;
-
-/* rounding-state-saving classes */
-template <class Rounding> struct save_state;
-template <class Rounding> struct save_state_nothing;
-
-/* default policy for type T */
-template <class T>  struct rounded_math;
-template <>  struct rounded_math<float>;
-template <>  struct rounded_math<double>;
-
-/* some metaprogramming to convert a protected to unprotected rounding */
-template <class I> struct unprotect;
-
-} // namespace interval_lib
-} // namespace numeric
-} // namespace boost
-
- -

Description of the provided classes

- -

We now describe each class in the order they appear in the definition of - a rounding policy (this outermost-to-innermost order is the reverse order - from the synopsis).

- -

Protection control

- -

Protection refers to the fact that the interval operations will be - surrounded by rounding mode controls. Unprotecting a class means to remove - all the rounding controls. Each rounding policy provides a type - unprotected_rounding. The required type - unprotected_rounding gives another rounding class that enables - to work when nested inside rounding. For example, the first three lines - below should all produce the same result (because the first operation is - the rounding constructor, and the last is its destructor, which take care - of setting the rounding modes); and the last line is allowed to have an - undefined behavior (since no rounding constructor or destructor is ever - called).

-
-T c; { rounding rnd; c = rnd.add_down(a, b); }
-T c; { rounding rnd1; { rounding rnd2; c = rnd2.add_down(a, b); } }
-T c; { rounding rnd1; { rounding::unprotected_rounding rnd2; c = rnd2.add_down(a, b); } }
-T d; { rounding::unprotected_rounding rnd; d = rnd.add_down(a, b); }
-
- -

Naturally rounding::unprotected_rounding may simply be - rounding itself. But it can improve performance if it is a - simplified version with empty constructor and destructor. In order to avoid - undefined behaviors, in the library, an object of type - rounding::unprotected_rounding is guaranteed to be created - only when an object of type rounding is already alive. See the - performance notes for some additional details.

- -

The support library defines a metaprogramming class template - unprotect which takes an interval type I and - returns an interval type unprotect<I>::type where the - rounding policy has been unprotected. Some information about the types: - interval<T, interval_lib::policies<Rounding, _> - >::traits_type::rounding is the same type as - Rounding, and unprotect<interval<T, - interval_lib::policies<Rounding, _> > >::type is - the same type as interval<T, - interval_lib::policies<Rounding::unprotected, _> >.

- -

State saving

- -

First comes save_state. This class is responsible for - saving the current rounding mode and calling init in its constructor, and - for restoring the saved rounding mode in its destructor. This class also - defines the unprotected_rounding type.

- -

If the rounding mode does not require any state-saving or - initialization, save_state_nothing can be used instead of - save_state.

- -

Transcendental functions

- -

The classes rounded_transc_exact, - rounded_transc_std and rounded_transc_opp expect - the std namespace to provide the functions exp log cos tan acos asin atan - cosh sinh tanh acosh asinh atanh. For the _std and - _opp versions, all these functions should respect the current - rounding mode fixed by a call to downward or upward.

- -

Please note: Unfortunately, the latter is rarely the - case. It is the reason why a class rounded_transc_dummy is - provided which does not depend on the functions from the std namespace. - There is no magic, however. The functions of - rounded_transc_dummy do not compute anything. They only return - valid values. For example, cos_down always returns -1. In this - way, we do verify the inclusion property for the default implementation, - even if this has strictly no value for the user. In order to have useful - values, another policy should be used explicitely, which will most likely - lead to a violation of the inclusion property. In this way, we ensure that - the violation is clearly pointed out to the user who then knows what he - stands against. This class could have been used as the default - transcendental rounding class, but it was decided it would be better for - the compilation to fail due to missing declarations rather than succeed - thanks to valid but unusable functions.

- -

Basic arithmetic functions

- -

The classes rounded_arith_std and - rounded_arith_opp expect the operators + - * / and the - function std::sqrt to respect the current rounding mode.

- -

The class rounded_arith_exact requires - std::floor and std::ceil to be defined since it - can not rely on to_int.

- -

Rounding control

- -

The functions defined by each of the previous classes did not need any - explanation. For example, the behavior of add_down is to - compute the sum of two numbers rounded downward. For - rounding_control, the situation is a bit more complex.

- -

The basic function is force_rounding which returns its - argument correctly rounded accordingly to the current rounding mode if it - was not already the case. This function is necessary to handle delayed - rounding. Indeed, depending on the way the computations are done, the - intermediate results may be internally stored in a more precise format and - it can lead to a wrong rounding. So the function enforces the rounding. - Here is an example of what happens when the rounding - is not enforced.

- -

The function get_rounding_mode returns the current rounding - mode, set_rounding_mode sets the rounding mode back to a - previous value returned by get_rounding_mode. - downward, upward and to_nearest sets - the rounding mode in one of the three directions. This rounding mode should - be global to all the functions that use the type T. For - example, after a call to downward, - force_rounding(x+y) is expected to return the sum rounded - toward -∞.

- -

The function to_int computes the nearest integer - accordingly to the current rounding mode.

- -

The non-specialized version of rounding_control does not do - anything. The functions for the rounding mode are empty, and - to_int and force_rounding are identity functions. - The pi_ constant functions return suitable integers (for - example, pi_up returns T(4)).

- -

The class template rounding_control is specialized for - float, double and long double in - order to best use the floating point unit of the computer.

- -

Template class rounded_math

- -

The default policy (aka rounded_math<T>) is simply - defined as:

-
-template <class T> struct rounded_math<T> : save_state_nothing<rounded_arith_exact<T> > {};
-
- -

and the specializations for float, double and - long double use rounded_arith_opp, as in:

-
-template <> struct rounded_math<float>       : save_state<rounded_arith_opp<float> >       {};
-template <> struct rounded_math<double>      : save_state<rounded_arith_opp<double> >      {};
-template <> struct rounded_math<long double> : save_state<rounded_arith_opp<long double> > {};
-
- -

Performance Issues

- -

This paragraph deals mostly with the performance of the library with - intervals using the floating-point unit (FPU) of the computer. Let's - consider the sum of [a,b] and [c,d] as an - example. The result is [down(a+c), - up(b+d)], where down and - up indicate the rounding mode needed.

- -

Rounding Mode Switch

- -

If the FPU is able to use a different rounding mode for each operation, - there is no problem. For example, it's the case for the Alpha processor: - each floating-point instruction can specify a different rounding mode. - However, the IEEE-754 Standard does not require such a behavior. So most of - the FPUs only provide some instructions to set the rounding mode for all - subsequent operations. And generally, these instructions need to flush the - pipeline of the FPU.

- -

In this situation, the time needed to sum [a,b] and - [c,d] is far worse than the time needed to calculate - a+b and c+d since the two additions cannot be - parallelized. Consequently, the objective is to diminish the number of - rounding mode switches.

- -

If this library is not used to provide exact computations, but only for - pair arithmetic, the solution is quite simple: do not use rounding. In that - case, doing the sum [a,b] and [c,d] will be as - fast as computing a+b and c+d. Everything is - perfect.

- -

However, if exact computations are required, such a solution is totally - unthinkable. So, are we penniless? No, there is still a trick available. - Indeed, down(a+c) = -up(-a-c) if the unary - minus is an exact operation. It is now possible to calculate the whole sum - with the same rounding mode. Generally, the cost of the mode switching is - worse than the cost of the sign changes.

- -

Speeding up consecutive operations

- -

The interval addition is not the only operation; most of the interval - operations can be computed by setting the rounding direction of the FPU - only once. So the operations of the floating point rounding policy assume - that the direction is correctly set. This assumption is usually not true in - a program (the user and the standard library expect the rounding direction - to be to nearest), so these operations have to be enclosed in a shell that - sets the floating point environment. This protection is done by the - constructor and destructor of the rounding policy.

- -

Les us now consider the case of two consecutive interval additions: - [a,b] + [c,d] + [e,f]. The - generated code should look like:

-
-init_rounding_mode();    // rounding object construction during the first addition
-t1 = -(-a - c);
-t2 = b + d;
-restore_rounding_mode(); // rounding object destruction
-init_rounding_mode();    // rounding object construction during the second addition
-x = -(-t1 - e);
-y = t2 + f;
-restore_rounding_mode(); // rounding object destruction
-// the result is the interval [x,y]
-
- -

Between the two operations, the rounding direction is restored, and then - initialized again. Ideally, compilers should be able to optimize this - useless code away. But unfortunately they are not, and this slows the code - down by an order of magnitude. In order to avoid this bottleneck, the user - can tell to the interval operations that they do not need to be protected - anymore. It will then be up to the user to protect the interval - computations. The compiler will then be able to generate such a code:

-
-init_rounding_mode();    // done by the user
-x = -(-a - c - e);
-y = b + d + f;
-restore_rounding_mode(); // done by the user
-
- -

The user will have to create a rounding object. And as long as this - object is alive, unprotected versions of the interval operations can be - used. They are selected by using an interval type with a specific rounding - policy. If the initial interval type is I, then - I::traits_type::rounding is the type of the rounding object, - and interval_lib::unprotect<I>::type is the type of the - unprotected interval type.

- -

Because the rounding mode of the FPU is changed during the life of the - rounding object, any arithmetic floating point operation that does not - involve the interval library can lead to unexpected results. And - reciprocally, using unprotected interval operation when no rounding object - is alive will produce intervals that are not guaranteed anymore to contain - the real result.

- -

Example

- -

Here is an example of Horner's scheme to compute the value of a polynom. - The rounding mode switches are disabled for the whole computation.

-
-// I is an interval class, the polynom is a simple array
-template<class I>
-I horner(const I& x, const I p[], int n) {
-
-  // save and initialize the rounding mode
-  typename I::traits_type::rounding rnd;
-
-  // define the unprotected version of the interval type
-  typedef typename boost::numeric::interval_lib::unprotect<I>::type R;
-
-  const R& a = x;
-  R y = p[n - 1];
-  for(int i = n - 2; i >= 0; i--) {
-    y = y * a + (const R&)(p[i]);
-  }
-  return y;
-
-  // restore the rounding mode with the destruction of rnd
-}
-
- -

Please note that a rounding object is specially created in order to - protect all the interval computations. Each interval of type I is converted - in an interval of type R before any operations. If this conversion is not - done, the result is still correct, but the interest of this whole - optimization has disappeared. Whenever possible, it is good to convert to - const R& instead of R: indeed, the function - could already be called inside an unprotection block so the types - R and I would be the same interval, no need for a - conversion.

- -

Uninteresting remark

- -

It was said at the beginning that the Alpha processors can use a - specific rounding mode for each operation. However, due to the instruction - format, the rounding toward plus infinity is not available. Only the - rounding toward minus infinity can be used. So the trick using the change - of sign becomes essential, but there is no need to save and restore the - rounding mode on both sides of an operation.

- -

Extended Registers

- -

There is another problem besides the cost of the rounding mode switch. - Some FPUs use extended registers (for example, float computations will be - done with double registers, or double computations with long double - registers). Consequently, many problems can arise.

- -

The first one is due to to the extended precision of the mantissa. The - rounding is also done on this extended precision. And consequently, we - still have down(a+b) = -up(-a-b) in the - extended registers. But back to the standard precision, we now have - down(a+b) < -up(-a-b) instead of an - equality. A solution could be not to use this method. But there still are - other problems, with the comparisons between numbers for example.

- -

Naturally, there is also a problem with the extended precision of the - exponent. To illustrate this problem, let m be the biggest number - before +inf. If we calculate 2*[m,m], the answer - should be [m,inf]. But due to the extended registers, the FPU - will first store [2m,2m] and then convert it to - [inf,inf] at the end of the calculus (when the rounding mode - is toward +inf). So the answer is no more accurate.

- -

There is only one solution: to force the FPU to convert the extended - values back to standard precision after each operation. Some FPUs provide - an instruction able to do this conversion (for example the PowerPC - processors). But for the FPUs that do not provide it (the x86 processors), - the only solution is to write the values to memory and read them back. Such - an operation is obviously very expensive.

- -

Some Examples

- -

Here come several cases:

- -
    -
  • if you need precise computations with the float or - double types, use the default - rounded_math<T>;
  • - -
  • for fast wide intervals without any rounding nor precision, use - save_state_nothing<rounded_transc_exact<T> - >;
  • - -
  • for an exact type (like int or rational with a little help for - infinite and NaN values) without support for transcendental functions, - the solution could be - save_state_nothing<rounded_transc_dummy<T, - rounded_arith_exact<T> > > or directly - save_state_nothing<rounded_arith_exact<T> - >;
  • - -
  • if it is a more complex case than the previous ones, the best thing - is probably to directly define your own policy.
  • -
-
- -

Valid HTML 4.01 Transitional

- -

Revised - 2006-12-24

- -

Copyright © 2002 Guillaume Melquiond, Sylvain Pion, Hervé - Brönnimann, Polytechnic University
- Copyright © 2004-2005 Guillaume Melquiond, ENS Lyon

- -

Distributed under the 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/libs/numeric/interval/doc/todo.htm b/libs/numeric/interval/doc/todo.htm deleted file mode 100644 index 8c134b537..000000000 --- a/libs/numeric/interval/doc/todo.htm +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - Interval-TODO.htm - - - -

TODO list for the Interval Arithmetic library

- -

Comments from the review process

- -
    -
  • It would be nice to have a 100% portable Rounding policy class based - on LIA-1 only, with no additional requirement such as IEEE 754 or even - more.
  • - -
  • For pi and other constants, we should fetch them from the Math - constants library when it is ready.
  • -
- -

Various items

- -
    -
  • Support the -mfpmath=sse option of g++ for Pentium IV - optimized code. This requires a different rounding policy class.
  • - -
  • Have an optimized specialization of - interval<double> using SSE2 instructions? Tricky.
  • - -
  • Write a traits specialization for interval<MPFR>, - and other non-built-in number types.
  • - -
  • Have a robust implementation of transcendental functions over the - built-in floating point types (e.g. using MPFR)?
  • - -
  • Safe conversions from interval<double> to - interval<float>? Requires partial specialization.
  • - -
  • It would be nice to use the expression template mechanism to - automatically use the more efficient unprotected rounding mode version - for small subexpressions (although you can do bigger expressions by - hand).
  • -
-
- -

Valid HTML 4.01 Transitional

- -

Revised - 2006-12-24

- -

Copyright © 2002 Guillaume Melquiond, Sylvain Pion, Hervé - Brönnimann, Polytechnic University

- -

Distributed under the 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/libs/numeric/interval/examples/filter.cpp b/libs/numeric/interval/examples/filter.cpp deleted file mode 100644 index a9321a25b..000000000 --- a/libs/numeric/interval/examples/filter.cpp +++ /dev/null @@ -1,208 +0,0 @@ -/* Boost example/filter.cpp - * two examples of filters for computing the sign of a determinant - * the second filter is based on an idea presented in - * "Interval arithmetic yields efficient dynamic filters for computational - * geometry" by Brönnimann, Burnikel and Pion, 2001 - * - * Copyright 2003 Guillaume Melquiond - * - * Distributed under the 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 -#include - -namespace dummy { - using namespace boost; - using namespace numeric; - using namespace interval_lib; - typedef save_state > R; - typedef checking_no_nan > P; - typedef interval > I; -} - -template -class vector { - T* ptr; -public: - vector(int d) { ptr = (T*)malloc(sizeof(T) * d); } - ~vector() { free(ptr); } - const T& operator[](int i) const { return ptr[i]; } - T& operator[](int i) { return ptr[i]; } -}; - -template -class matrix { - int dim; - T* ptr; -public: - matrix(int d): dim(d) { ptr = (T*)malloc(sizeof(T) * dim * dim); } - ~matrix() { free(ptr); } - int get_dim() const { return dim; } - void assign(const matrix &a) { memcpy(ptr, a.ptr, sizeof(T) * dim * dim); } - const T* operator[](int i) const { return &(ptr[i * dim]); } - T* operator[](int i) { return &(ptr[i * dim]); } -}; - -typedef dummy::I I_dbl; - -/* compute the sign of a determinant using an interval LU-decomposition; the - function answers 1 or -1 if the determinant is positive or negative (and - more importantly, the result must be provable), or 0 if the algorithm was - unable to get a correct sign */ -int det_sign_algo1(const matrix &a) { - int dim = a.get_dim(); - vector p(dim); - for(int i = 0; i < dim; i++) p[i] = i; - int sig = 1; - I_dbl::traits_type::rounding rnd; - typedef boost::numeric::interval_lib::unprotect::type I; - matrix u(dim); - for(int i = 0; i < dim; i++) { - const double* line1 = a[i]; - I* line2 = u[i]; - for(int j = 0; j < dim; j++) - line2[j] = line1[j]; - } - // computation of L and U - for(int i = 0; i < dim; i++) { - // partial pivoting - { - int pivot = i; - double max = 0; - for(int j = i; j < dim; j++) { - const I &v = u[p[j]][i]; - if (zero_in(v)) continue; - double m = norm(v); - if (m > max) { max = m; pivot = j; } - } - if (max == 0) return 0; - if (pivot != i) { - sig = -sig; - int tmp = p[i]; - p[i] = p[pivot]; - p[pivot] = tmp; - } - } - // U[i,?] - { - I *line1 = u[p[i]]; - const I &pivot = line1[i]; - if (boost::numeric::interval_lib::cerlt(pivot, 0.)) sig = -sig; - for(int k = i + 1; k < dim; k++) { - I *line2 = u[p[k]]; - I fact = line2[i] / pivot; - for(int j = i + 1; j < dim; j++) line2[j] -= fact * line1[j]; - } - } - } - return sig; -} - -/* compute the sign of a determinant using a floating-point LU-decomposition - and an a posteriori interval validation; the meaning of the answer is the - same as previously */ -int det_sign_algo2(const matrix &a) { - int dim = a.get_dim(); - vector p(dim); - for(int i = 0; i < dim; i++) p[i] = i; - int sig = 1; - matrix lui(dim); - { - // computation of L and U - matrix lu(dim); - lu.assign(a); - for(int i = 0; i < dim; i++) { - // partial pivoting - { - int pivot = i; - double max = std::abs(lu[p[i]][i]); - for(int j = i + 1; j < dim; j++) { - double m = std::abs(lu[p[j]][i]); - if (m > max) { max = m; pivot = j; } - } - if (max == 0) return 0; - if (pivot != i) { - sig = -sig; - int tmp = p[i]; - p[i] = p[pivot]; - p[pivot] = tmp; - } - } - // L[?,i] and U[i,?] - { - double *line1 = lu[p[i]]; - double pivot = line1[i]; - if (pivot < 0) sig = -sig; - for(int k = i + 1; k < dim; k++) { - double *line2 = lu[p[k]]; - double fact = line2[i] / pivot; - line2[i] = fact; - for(int j = i + 1; j < dim; j++) line2[j] -= line1[j] * fact; - } - } - } - - // computation of approximate inverses: Li and Ui - for(int j = 0; j < dim; j++) { - for(int i = j + 1; i < dim; i++) { - double *line = lu[p[i]]; - double s = - line[j]; - for(int k = j + 1; k < i; k++) s -= line[k] * lui[k][j]; - lui[i][j] = s; - } - lui[j][j] = 1 / lu[p[j]][j]; - for(int i = j - 1; i >= 0; i--) { - double *line = lu[p[i]]; - double s = 0; - for(int k = i + 1; k <= j; k++) s -= line[k] * lui[k][j]; - lui[i][j] = s / line[i]; - } - } - } - - // norm of PAUiLi-I computed with intervals - { - I_dbl::traits_type::rounding rnd; - typedef boost::numeric::interval_lib::unprotect::type I; - vector m1(dim); - vector m2(dim); - for(int i = 0; i < dim; i++) { - for(int j = 0; j < dim; j++) m1[j] = 0; - const double *l1 = a[p[i]]; - for(int j = 0; j < dim; j++) { - double v = l1[j]; // PA[i,j] - double *l2 = lui[j]; // Ui[j,?] - for(int k = j; k < dim; k++) { - using boost::numeric::interval_lib::mul; - m1[k] += mul(v, l2[k]); // PAUi[i,k] - } - } - for(int j = 0; j < dim; j++) m2[j] = m1[j]; // PAUi[i,j] * Li[j,j] - for(int j = 1; j < dim; j++) { - const I &v = m1[j]; // PAUi[i,j] - double *l2 = lui[j]; // Li[j,?] - for(int k = 0; k < j; k++) - m2[k] += v * l2[k]; // PAUiLi[i,k] - } - m2[i] -= 1; // PAUiLi-I - double ss = 0; - for(int i = 0; i < dim; i++) ss = rnd.add_up(ss, norm(m2[i])); - if (ss >= 1) return 0; - } - } - return sig; -} - -int main() { - int dim = 20; - matrix m(dim); - for(int i = 0; i < dim; i++) for(int j = 0; j < dim; j++) - m[i][j] = /*1 / (i-j-0.001)*/ cos(1+i*sin(1 + j)) /*1./(1+i+j)*/; - - // compute the sign of the determinant of a "strange" matrix with the two - // algorithms, the first should fail and the second succeed - std::cout << det_sign_algo1(m) << " " << det_sign_algo2(m) << std::endl; -} diff --git a/libs/numeric/interval/examples/findroot_demo.cpp b/libs/numeric/interval/examples/findroot_demo.cpp deleted file mode 100644 index 9a37ca166..000000000 --- a/libs/numeric/interval/examples/findroot_demo.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* Boost example/findroot_demo.cpp - * find zero points of some function by dichotomy - * - * Copyright 2000 Jens Maurer - * Copyright 2002-2003 Guillaume Melquiond - * - * Distributed under the Boost Software License, Version 1.0. - * (See accompanying file LICENSE_1_0.txt or - * copy at http://www.boost.org/LICENSE_1_0.txt) - * - * The idea and the 2D function are based on RVInterval, - * which contains the following copyright notice: - - This file is copyrighted 1996 by Ronald Van Iwaarden. - - Permission is hereby granted, without written agreement and - without license or royalty fees, to use, copy, modify, and - distribute this software and its documentation for any - purpose, subject to the following conditions: - - The above license notice and this permission notice shall - appear in all copies or substantial portions of this software. - - The name "RVInterval" cannot be used for any modified form of - this software that does not originate from the authors. - Nevertheless, the name "RVInterval" may and should be used to - designate the optimization software implemented and described - in this package, even if embedded in any other system, as long - as any portion of this code remains. - - The authors specifically disclaim any warranties, including, - but not limited to, the implied warranties of merchantability - and fitness for a particular purpose. The software provided - hereunder is on an "as is" basis, and the authors have no - obligation to provide maintenance, support, updates, - enhancements, or modifications. In no event shall the authors - be liable to any party for direct, indirect, special, - incidental, or consequential damages arising out of the use of - this software and its documentation. -*/ - -#include // must be first for workaround -#include -#include -#include -#include -#include - - -template -struct test_func2d -{ - T operator()(T x, T y) const - { - return sin(x)*cos(y) - exp(x*y)/45.0 * (pow(x+y, 2)+100.0) - - cos(sin(y))*y/4.0; - } -}; - -template -struct test_func1d -{ - T operator()(T x) const - { - return sin(x)/(x*x+1.0); - } -}; - -template -struct test_func1d_2 -{ - T operator()(T x) const - { - using std::sqrt; - return sqrt(x*x-1.0); - } -}; - -template -void find_zeros(std::ostream & os, Function f, I searchrange) -{ - std::list l, done; - l.push_back(searchrange); - while(!l.empty()) { - I range = l.front(); - l.pop_front(); - I val = f(range); - if (zero_in(val)) { - if(width(range) < 1e-6) { - os << range << '\n'; - continue; - } - // there's still a solution hidden somewhere - std::pair p = bisect(range); - l.push_back(p.first); - l.push_back(p.second); - } - } -} - -template -std::ostream &operator<<(std::ostream &os, const std::pair &x) { - os << "(" << x.first << ", " << x.second << ")"; - return os; -} - -template -std::ostream &operator<<(std::ostream &os, - const boost::numeric::interval &x) { - os << "[" << x.lower() << ", " << x.upper() << "]"; - return os; -} - -static const double epsilon = 5e-3; - -template -void find_zeros(std::ostream & os, Function f, I rx, I ry) -{ - typedef std::pair rectangle; - typedef std::deque container; - container l, done; - // l.reserve(50); - l.push_back(std::make_pair(rx, ry)); - for(int i = 1; !l.empty(); ++i) { - rectangle rect = l.front(); - l.pop_front(); - I val = f(rect.first, rect.second); - if (zero_in(val)) { - if(width(rect.first) < epsilon && width(rect.second) < epsilon) { - os << median(rect.first) << " " << median(rect.second) << " " - << lower(rect.first) << " " << upper(rect.first) << " " - << lower(rect.second) << " " << upper(rect.second) - << '\n'; - } else { - if(width(rect.first) > width(rect.second)) { - std::pair p = bisect(rect.first); - l.push_back(std::make_pair(p.first, rect.second)); - l.push_back(std::make_pair(p.second, rect.second)); - } else { - std::pair p = bisect(rect.second); - l.push_back(std::make_pair(rect.first, p.first)); - l.push_back(std::make_pair(rect.first, p.second)); - } - } - } - if(i % 10000 == 0) - std::cerr << "\rIteration " << i << ", l.size() = " << l.size(); - } - std::cerr << '\n'; -} - -int main() -{ - using namespace boost; - using namespace numeric; - using namespace interval_lib; - - typedef interval >, - checking_base > > I; - - std::cout << "Zero points of sin(x)/(x*x+1)\n"; - find_zeros(std::cout, test_func1d(), I(-11, 10)); - std::cout << "Zero points of sqrt(x*x-1)\n"; - find_zeros(std::cout, test_func1d_2(), I(-5, 6)); - std::cout << "Zero points of Van Iwaarden's 2D function\n"; - std::ofstream f("func2d.data"); - find_zeros(f, test_func2d(), I(-20, 20), I(-20, 20)); - std::cout << "Use gnuplot, command 'plot \"func2d.data\" with dots' to plot\n"; -} diff --git a/libs/numeric/interval/examples/horner.cpp b/libs/numeric/interval/examples/horner.cpp deleted file mode 100644 index dfae28966..000000000 --- a/libs/numeric/interval/examples/horner.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* Boost example/horner.cpp - * example of unprotecting rounding for a whole function computation - * - * Copyright 2002-2003 Guillaume Melquiond - * - * Distributed under the 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 -#include - -// I is an interval class, the polynom is a simple array -template -I horner(const I& x, const I p[], int n) { - - // initialize and restore the rounding mode - typename I::traits_type::rounding rnd; - - // define the unprotected version of the interval type - typedef typename boost::numeric::interval_lib::unprotect::type R; - - const R& a = x; - R y = p[n - 1]; - for(int i = n - 2; i >= 0; i--) { - y = y * a + (const R&)(p[i]); - } - return y; - - // restore the rounding mode with the destruction of rnd -} - -template -std::ostream &operator<<(std::ostream &os, - const boost::numeric::interval &x) { - os << "[" << x.lower() << ", " << x.upper() << "]"; - return os; -} - -int main() { - typedef boost::numeric::interval I; - I p[3] = { -1.0, 0, 1.0 }; - I x = 1.0; - std::cout << horner(x, p, 3) << std::endl; - return 0; -} diff --git a/libs/numeric/interval/examples/io.cpp b/libs/numeric/interval/examples/io.cpp deleted file mode 100644 index 3e029cd85..000000000 --- a/libs/numeric/interval/examples/io.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/* Boost examples/io.cpp - * show some exampleso of i/o operators - * thanks to all the people who commented on this point, particularly on - * the Boost mailing-list - * - * Copyright 2003 Guillaume Melquiond - * - * Distributed under the 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 -#include -#include -#include - -namespace io_std { - -template -std::basic_ostream &operator<< - (std::basic_ostream &stream, - const boost::numeric::interval &value) -{ - if (empty(value)) { - return stream << "[]"; - } else { - return stream << '[' << lower(value) << ',' << upper(value) << ']'; - } -} - -} // namespace io_std - -namespace io_sngl { - -template -std::basic_ostream &operator<< - (std::basic_ostream &stream, - const boost::numeric::interval &value) -{ - if (empty(value)) { - return stream << "[]"; - } else if (singleton(value)) { - return stream << '[' << lower(value) << ']'; - } else { - return stream << '[' << lower(value) << ',' << upper(value) << ']'; - } -} - -} // namespace io_sngl - -namespace io_wdth { - -template -std::basic_ostream &operator<< - (std::basic_ostream &stream, - const boost::numeric::interval &value) -{ - if (empty(value)) { - return stream << "nothing"; - } else { - return stream << median(value) << " ± " << width(value) / 2; - } -} - -} // namespace io_wdth - -namespace io_prec { - -template -std::basic_ostream &operator<< - (std::basic_ostream &stream, - const boost::numeric::interval &value) -{ - if (empty(value)) { - return stream << "nothing"; - } else if (singleton(value)) { - boost::io::ios_precision_saver state(stream, std::numeric_limits::digits10); - return stream << lower(value); - } else if (zero_in(value)) { - return stream << "0~"; - } else { - const T rel = width(value) / norm(value); - int range = - (int)std::log10(rel); - boost::io::ios_precision_saver state(stream, range); - return stream << median(value); - } -} - -} // namespace io_prec - -namespace io_wide { - -template -std::basic_ostream &operator<< - (std::basic_ostream &stream, - const boost::numeric::interval &value) -{ - if (empty(value)) { - return stream << "nothing"; - } else if (singleton(value)) { - boost::io::ios_precision_saver state(stream, std::numeric_limits::digits10); - return stream << lower(value); - } else if (zero_in(value)) { - return stream << "0~"; - } else { - std::streamsize p = stream.precision(); - // FIXME poor man's power of 10, only up to 1E-15 - p = (p > 15) ? 15 : p - 1; - double eps = 1.0; for(; p > 0; --p) { eps /= 10; } - T eps2 = static_cast(eps / 2) * norm(value); - boost::numeric::interval r = widen(value, eps2); - return stream << '[' << lower(r) << ',' << upper(r) << ']'; - } -} - -} // namespace io_wide - -template inline -std::basic_istream &operator>> - (std::basic_istream &stream, - boost::numeric::interval &value) -{ - T l, u; - char c = 0; - stream >> c; - if (c == '[') { - stream >> l >> c; - if (c == ',') stream >> u >> c; else u = l; - if (c != ']') stream.setstate(stream.failbit); - } else { - stream.putback(c); - stream >> l; - u = l; - } - if (stream) - value.assign(l, u); - else - value = boost::numeric::interval::empty(); - return stream; -} - -// Test program - -#include - -int main() -{ - using namespace boost; - using namespace numeric; - using namespace interval_lib; - - typedef interval, - checking_base > > I; - - I tab[] = { I::empty(), I(1,1), I(1,2), I(-1,1), I(12.34,12.35), - I(1234.56,1234.57), I(123456.78, 123456.79), I::empty() }; - unsigned int len = sizeof(tab) / sizeof(I); - std::cout << "Enter an interval: (it will be the last shown)\n"; - std::cin >> tab[len - 1]; - - for(unsigned int i = 0; i < len; ++i) { - { using namespace io_std; std::cout << tab[i] << '\n'; } - { using namespace io_sngl; std::cout << tab[i] << '\n'; } - { using namespace io_wdth; std::cout << tab[i] << '\n'; } - { using namespace io_prec; std::cout << tab[i] << '\n'; } - { using namespace io_wide; std::cout << tab[i] << '\n'; } - std::cout << '\n'; - } - -} diff --git a/libs/numeric/interval/examples/newton-raphson.cpp b/libs/numeric/interval/examples/newton-raphson.cpp deleted file mode 100644 index 7936c2d4c..000000000 --- a/libs/numeric/interval/examples/newton-raphson.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/* Boost example/newton-raphson.cpp - * Newton iteration for intervals - * - * Copyright 2003 Guillaume Melquiond - * - * Distributed under the 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 -#include -#include -#include -#include -#include - -template I f(const I& x) -{ return x * (x - 1.) * (x - 2.) * (x - 3.) * (x - 4.); } -template I f_diff(const I& x) -{ return (((5. * x - 40.) * x + 105.) * x - 100.) * x + 24.; } - -static const double max_width = 1e-10; -static const double alpha = 0.75; - -using namespace boost; -using namespace numeric; -using namespace interval_lib; - -// First method: no empty intervals - -typedef interval I1_aux; -typedef unprotect::type I1; - -std::vector newton_raphson(const I1& xs) { - std::vector l, res; - I1 vf, vd, x, x1, x2; - l.push_back(xs); - while (!l.empty()) { - x = l.back(); - l.pop_back(); - bool x2_used; - double xx = median(x); - vf = f(xx); - vd = f_diff(x); - if (zero_in(vf) && zero_in(vd)) { - x1 = I1::whole(); - x2_used = false; - } else { - x1 = xx - division_part1(vf, vd, x2_used); - if (x2_used) x2 = xx - division_part2(vf, vd); - } - if (overlap(x1, x)) x1 = intersect(x, x1); - else if (x2_used) { x1 = x2; x2_used = false; } - else continue; - if (x2_used) { - if (overlap(x2, x)) x2 = intersect(x, x2); - else x2_used = false; - } - if (x2_used && width(x2) > width(x1)) std::swap(x1, x2); - if (!zero_in(f(x1))) { - if (x2_used) { x1 = x2; x2_used = false; } - else continue; - } - if (width(x1) < max_width) res.push_back(x1); - else if (width(x1) > alpha * width(x)) { - std::pair p = bisect(x); - if (zero_in(f(p.first))) l.push_back(p.first); - x2 = p.second; - x2_used = true; - } else l.push_back(x1); - if (x2_used && zero_in(f(x2))) { - if (width(x2) < max_width) res.push_back(x2); - else l.push_back(x2); - } - } - return res; -} - -// Second method: with empty intervals - -typedef change_checking >::type I2_aux; -typedef unprotect::type I2; - -std::vector newton_raphson(const I2& xs) { - std::vector l, res; - I2 vf, vd, x, x1, x2; - l.push_back(xs); - while (!l.empty()) { - x = l.back(); - l.pop_back(); - double xx = median(x); - vf = f(xx); - vd = f_diff(x); - if (zero_in(vf) && zero_in(vd)) { - x1 = x; - x2 = I2::empty(); - } else { - bool x2_used; - x1 = intersect(x, xx - division_part1(vf, vd, x2_used)); - x2 = intersect(x, xx - division_part2(vf, vd, x2_used)); - } - if (width(x2) > width(x1)) std::swap(x1, x2); - if (empty(x1) || !zero_in(f(x1))) { - if (!empty(x2)) { x1 = x2; x2 = I2::empty(); } - else continue; - } - if (width(x1) < max_width) res.push_back(x1); - else if (width(x1) > alpha * width(x)) { - std::pair p = bisect(x); - if (zero_in(f(p.first))) l.push_back(p.first); - x2 = p.second; - } else l.push_back(x1); - if (!empty(x2) && zero_in(f(x2))) { - if (width(x2) < max_width) res.push_back(x2); - else l.push_back(x2); - } - } - return res; -} - -template -std::ostream &operator<<(std::ostream &os, - const boost::numeric::interval &x) { - os << "[" << x.lower() << ", " << x.upper() << "]"; - return os; -} - -int main() { - { - I1_aux::traits_type::rounding rnd; - std::vector res = newton_raphson(I1(-1, 5.1)); - std::cout << "Results: " << std::endl << std::setprecision(12); - for(std::vector::const_iterator i = res.begin(); i != res.end(); ++i) - std::cout << " " << *i << std::endl; - std::cout << std::endl; - } - { - I2_aux::traits_type::rounding rnd; - std::vector res = newton_raphson(I2(-1, 5.1)); - std::cout << "Results: " << std::endl << std::setprecision(12); - for(std::vector::const_iterator i = res.begin(); i != res.end(); ++i) - std::cout << " " << *i << std::endl; - std::cout << std::endl; - } -} diff --git a/libs/numeric/interval/examples/rational.cpp b/libs/numeric/interval/examples/rational.cpp deleted file mode 100644 index 937171df9..000000000 --- a/libs/numeric/interval/examples/rational.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* Boost example/rational.cpp - * example program of how to use interval< rational<> > - * - * Copyright 2002-2003 Guillaume Melquiond, Sylvain Pion - * - * Distributed under the Boost Software License, Version 1.0. - * (See accompanying file LICENSE_1_0.txt or - * copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -// it would have been enough to only include: -// -// but it's a bit overkill to include processor intrinsics -// and transcendental functions, so we do it by ourselves - -#include // base class -#include // default arithmetic rounding policy -#include // default checking policy -#include // += *= -= etc -#include // default policy - -#include -#include - -typedef boost::rational Rat; -typedef boost::numeric::interval Interval; - -std::ostream& operator<<(std::ostream& os, const Interval& r) { - os << "[" << r.lower() << "," << r.upper() << "]"; - return os; -} - -int main() { - Rat p(2, 3), q(3, 4); - Interval z(4, 5); - Interval a(p, q); - a += z; - z *= q; - a -= p; - a /= q; - std::cout << z << std::endl; - std::cout << a << std::endl; -} diff --git a/libs/numeric/interval/examples/transc.cpp b/libs/numeric/interval/examples/transc.cpp deleted file mode 100644 index 2036f9832..000000000 --- a/libs/numeric/interval/examples/transc.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* Boost example/transc.cpp - * how to use an external library (GMP/MPFR in this case) in order to - * get correct transcendental functions on intervals - * - * Copyright 2003 Guillaume Melquiond - * - * Distributed under the 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 -//extern "C" { -#include -#include -//} -#include - -struct full_rounding: - boost::numeric::interval_lib::rounded_arith_opp -{ -private: - typedef int mpfr_func(mpfr_t, const __mpfr_struct*, mp_rnd_t); - double invoke_mpfr(double x, mpfr_func f, mp_rnd_t r) { - mpfr_t xx; - mpfr_init_set_d(xx, x, GMP_RNDN); - f(xx, xx, r); - double res = mpfr_get_d(xx, r); - mpfr_clear(xx); - return res; - } -public: -# define GENR_FUNC(name) \ - double name##_down(double x) { return invoke_mpfr(x, mpfr_##name, GMP_RNDD); } \ - double name##_up (double x) { return invoke_mpfr(x, mpfr_##name, GMP_RNDU); } - GENR_FUNC(exp) - GENR_FUNC(log) - GENR_FUNC(sin) - GENR_FUNC(cos) - GENR_FUNC(tan) - GENR_FUNC(asin) - GENR_FUNC(acos) - GENR_FUNC(atan) - GENR_FUNC(sinh) - GENR_FUNC(cosh) - GENR_FUNC(tanh) - GENR_FUNC(asinh) - GENR_FUNC(acosh) - GENR_FUNC(atanh) -}; - -namespace dummy { - using namespace boost; - using namespace numeric; - using namespace interval_lib; - typedef save_state R; - typedef checking_strict P; - typedef interval > I; -}; - -typedef dummy::I I; - -template -os_t& operator<<(os_t &os, const I &a) { - os << '[' << a.lower() << ',' << a.upper() << ']'; - return os; -} - -int main() { - I x(0.5, 2.5); - std::cout << "x = " << x << std::endl; - std::cout.precision(16); -# define GENR_TEST(name) \ - std::cout << #name "(x) = " << name(x) << std::endl - GENR_TEST(exp); - GENR_TEST(log); - GENR_TEST(sin); - GENR_TEST(cos); - GENR_TEST(tan); - GENR_TEST(asin); - GENR_TEST(acos); - GENR_TEST(atan); - GENR_TEST(sinh); - GENR_TEST(cosh); - GENR_TEST(tanh); - GENR_TEST(asinh); - GENR_TEST(acosh); - GENR_TEST(atanh); - return 0; -} diff --git a/libs/numeric/interval/meta/libraries.json b/libs/numeric/interval/meta/libraries.json deleted file mode 100644 index d3fa6cfc2..000000000 --- a/libs/numeric/interval/meta/libraries.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "key": "numeric/interval", - "name": "Interval", - "authors": [ - "Guillaume Melquiond", - "Hervé Brönnimann", - "Sylvain Pion" - ], - "description": "Extends the usual arithmetic functions to mathematical intervals.", - "documentation": "doc/interval.htm", - "category": [ - "Math" - ], - "maintainers": [ - "Sylvain Pion ", - "Herve Bronnimann ", - "Guillaume Melquiond " - ] -} diff --git a/libs/numeric/interval/test/Jamfile.v2 b/libs/numeric/interval/test/Jamfile.v2 deleted file mode 100644 index b7afa27f1..000000000 --- a/libs/numeric/interval/test/Jamfile.v2 +++ /dev/null @@ -1,50 +0,0 @@ -# Boost Interval Library test Jamfile -# -# Copyright 2003 Guillaume Melquiond -# -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or -# copy at http://www.boost.org/LICENSE_1_0.txt) - -project - : - source-location $(BOOST_ROOT) - : - requirements - # Enable dynamic rounding on Tru64 (Alpha CPU). - hp_cxx,OSF:"-fprm d" - gcc,OSF:-mfp-rounding-mode=d - ; - -# bring in rules for testing -import testing ; - -{ - test-suite numeric/interval : - [ compile libs/numeric/interval/test/integer.cpp ] - - [ run libs/numeric/interval/test/add.cpp ] - [ run libs/numeric/interval/test/det.cpp ] - [ run libs/numeric/interval/test/fmod.cpp ] - [ run libs/numeric/interval/test/msvc_x64_flags.cpp ] - [ run libs/numeric/interval/test/mul.cpp ] - [ run libs/numeric/interval/test/overflow.cpp ] - [ run libs/numeric/interval/test/pi.cpp ] - [ run libs/numeric/interval/test/pow.cpp ] - - [ run libs/numeric/interval/test/cmp.cpp - ../../../test/build//boost_test_exec_monitor/static ] - [ run libs/numeric/interval/test/cmp_exn.cpp - ../../../test/build//boost_test_exec_monitor/static ] - [ run libs/numeric/interval/test/cmp_exp.cpp - ../../../test/build//boost_test_exec_monitor/static ] - [ run libs/numeric/interval/test/cmp_lex.cpp - ../../../test/build//boost_test_exec_monitor/static ] - [ run libs/numeric/interval/test/cmp_set.cpp - ../../../test/build//boost_test_exec_monitor/static ] - [ run libs/numeric/interval/test/cmp_tribool.cpp - ../../../test/build//boost_test_exec_monitor/static ] - [ run libs/numeric/interval/test/test_float.cpp - ../../../test/build//boost_test_exec_monitor/static ] - ; -} diff --git a/libs/numeric/interval/test/add.cpp b/libs/numeric/interval/test/add.cpp deleted file mode 100644 index 73d502b6b..000000000 --- a/libs/numeric/interval/test/add.cpp +++ /dev/null @@ -1,243 +0,0 @@ -/* Boost test/add.cpp - * test with symbolic operations if the addition algorithm is correct - * - * Copyright 2002-2003 Guillaume Melquiond - * - * Distributed under the 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 -#include -#include -#include -#include -#include -#include -#include "bugs.hpp" - -typedef enum { EXPR_VAR, EXPR_NEG, EXPR_UP, EXPR_DOWN, EXPR_ADD, EXPR_SUB } e_type; - -struct expr; -struct pexpr { - expr *ptr; - expr* operator->() { return ptr; } - pexpr(expr *p = NULL): ptr(p) { } -}; - -struct expr { - e_type type; - int var; - pexpr e; - pexpr e1, e2; -}; - -pexpr var(int v) { - pexpr e = new expr; - e->type = EXPR_VAR; - e->var = v; - return e; -} - -pexpr operator+(pexpr, pexpr); -pexpr operator-(pexpr, pexpr); -pexpr operator-(pexpr); - -pexpr operator+(pexpr a, pexpr b) { - if (a->type == EXPR_NEG) return b - a->e; - if (b->type == EXPR_NEG) return a - b->e; - if (a->type == EXPR_VAR && b->type == EXPR_VAR && a->var > b->var) return b + a; - pexpr c = new expr; - c->type = EXPR_ADD; - c->e1 = a; - c->e2 = b; - return c; -} - -pexpr operator-(pexpr a, pexpr b) { - if (b->type == EXPR_NEG) return a + b->e; - pexpr c = new expr; - c->type = EXPR_SUB; - c->e1 = a; - c->e2 = b; - return c; -} - -pexpr down(pexpr a) { - pexpr e = new expr; - e->type = EXPR_DOWN; - e->e = a; - return e; -} - -pexpr up(pexpr a) { - pexpr e = new expr; - e->type = EXPR_UP; - e->e = a; - return e; -} - -pexpr operator-(pexpr a) { - if (a->type == EXPR_NEG) return a->e; - if (a->type == EXPR_UP) return down(-a->e); - if (a->type == EXPR_DOWN) return up(-a->e); - if (a->type == EXPR_SUB) return a->e2 - a->e1; - if (a->type == EXPR_ADD) return -a->e1 - a->e2; - pexpr e = new expr; - e->type = EXPR_NEG; - e->e = a; - return e; -} - -bool operator==(pexpr a, pexpr b) { - if (a->type != b->type) return false; - if (a->type == EXPR_VAR) return a->var == b->var; - if (a->type == EXPR_DOWN || a->type == EXPR_UP || a->type == EXPR_NEG) - return a->e == b->e; - return a->e1 == b->e1 && a->e2 == b->e2; -} - -bool operator<=(pexpr, pexpr) { return true; } - -namespace boost { -namespace numeric { -namespace interval_lib { - -template<> -struct rounding_control { - typedef enum { RND_U, RND_M, RND_D } rounding_mode; - static rounding_mode mode; - rounding_control() { mode = RND_M; } - void get_rounding_mode(rounding_mode& m) { m = mode; } - void set_rounding_mode(rounding_mode m) { mode = m; } - void upward() { mode = RND_U; } - void downward() { mode = RND_D; } - pexpr force_rounding(pexpr a) { - switch (mode) { - case RND_U: return up(a); - case RND_D: return down(a); - default: throw "Unset rounding mode"; - } - } -}; - -rounding_control::rounding_mode rounding_control::mode = RND_M; - -} // namespace interval_lib -} // namespace numeric -} // namespace boost - -template -bool test_neg() { - I a(var(0), var(1)); - return equal(-a, I(-var(1), -var(0))); -} - -template -bool test_add() { - I a(var(0), var(1)), b(var(2), var(3)); - return equal(a + b, I(down(var(0) + var(2)), up(var(1) + var(3)))); -} - -template -bool test_add1() { - I a(var(0), var(1)); - return equal(a + var(2), I(down(var(0) + var(2)), up(var(1) + var(2)))); -} - -template -bool test_add2() { - I a(var(0), var(1)); - return equal(var(2) + a, I(down(var(0) + var(2)), up(var(1) + var(2)))); -} - -template -bool test_sub() { - I a(var(0), var(1)), b(var(2), var(3)); - return equal(a - b, I(down(var(0) - var(3)), up(var(1) - var(2)))); -} - -template -bool test_sub1() { - I a(var(0), var(1)); - return equal(a - var(2), I(down(var(0) - var(2)), up(var(1) - var(2)))); -} - -template -bool test_sub2() { - I a(var(0), var(1)); - return equal(var(2) - a, I(down(var(2) - var(1)), up(var(2) - var(0)))); -} - -template -bool test_addeq() { - I a(var(0), var(1)), b(var(2), var(3)); - return equal(a += b, I(down(var(0) + var(2)), up(var(1) + var(3)))); -} - -template -bool test_addeq1() { - I a(var(0), var(1)); - return equal(a += var(2), I(down(var(0) + var(2)), up(var(1) + var(2)))); -} - -template -bool test_subeq() { - I a(var(0), var(1)), b(var(2), var(3)); - return equal(a -= b, I(down(var(0) - var(3)), up(var(1) - var(2)))); -} - -template -bool test_subeq1() { - I a(var(0), var(1)); - return equal(a -= var(2), I(down(var(0) - var(2)), up(var(1) - var(2)))); -} - -struct my_checking -{ - static pexpr pos_inf() { throw; } - static pexpr neg_inf() { throw; } - static pexpr nan() { throw; } - static bool is_nan(const pexpr&) { return false; } - static pexpr empty_lower() { throw; } - static pexpr empty_upper() { throw; } - static bool is_empty(const pexpr&, const pexpr&) { return false; } -}; - -template -struct my_interval { -private: - typedef boost::numeric::interval_lib::save_state my_rounding; - typedef boost::numeric::interval_lib::policies my_policies; -public: - typedef boost::numeric::interval type; -}; - -int test_main(int, char *[]) { - typedef my_interval >::type I1; - typedef my_interval >::type I2; - BOOST_CHECK((test_neg())); - BOOST_CHECK((test_neg())); - BOOST_CHECK((test_add())); - BOOST_CHECK((test_add())); - BOOST_CHECK((test_add1())); - BOOST_CHECK((test_add1())); - BOOST_CHECK((test_add2())); - BOOST_CHECK((test_add2())); - BOOST_CHECK((test_sub())); - BOOST_CHECK((test_sub())); - BOOST_CHECK((test_sub1())); - BOOST_CHECK((test_sub1())); - BOOST_CHECK((test_sub2())); - BOOST_CHECK((test_sub2())); - BOOST_CHECK((test_addeq())); - BOOST_CHECK((test_addeq())); - BOOST_CHECK((test_addeq1())); - BOOST_CHECK((test_addeq1())); - BOOST_CHECK((test_subeq())); - BOOST_CHECK((test_subeq())); - BOOST_CHECK((test_subeq1())); - BOOST_CHECK((test_subeq1())); - return 0; -} diff --git a/libs/numeric/interval/test/bugs.hpp b/libs/numeric/interval/test/bugs.hpp deleted file mode 100644 index 31078e9f1..000000000 --- a/libs/numeric/interval/test/bugs.hpp +++ /dev/null @@ -1,43 +0,0 @@ -/* Boost test/bugs.hpp - * Handles namespace resolution quirks in older compilers and braindead - * warnings [Herve, June 3rd 2003] - * - * Copyright 2002-2003 Hervé Brönnimann - * - * Distributed under the 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 - -// Borland compiler complains about unused variables a bit easily and -// incorrectly - -#ifdef __BORLANDC__ -namespace detail { - - template inline void ignore_unused_variable_warning(const T&) { } - - inline void ignore_warnings() { -# ifdef BOOST_NUMERIC_INTERVAL_CONSTANTS_HPP - using namespace boost::numeric::interval_lib::constants; - ignore_unused_variable_warning( pi_f_l ); - ignore_unused_variable_warning( pi_f_u ); - ignore_unused_variable_warning( pi_d_l ); - ignore_unused_variable_warning( pi_d_u ); -# endif - } - -} -#endif - -// Some compilers are broken with respect to name resolution - -#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) || defined( __BORLANDC__) - -using namespace boost; -using namespace numeric; -using namespace interval_lib; - -#endif diff --git a/libs/numeric/interval/test/cmp.cpp b/libs/numeric/interval/test/cmp.cpp deleted file mode 100644 index e3a12a3c8..000000000 --- a/libs/numeric/interval/test/cmp.cpp +++ /dev/null @@ -1,215 +0,0 @@ -/* Boost test/cmp.cpp - * test standard comparison functions - * - * Copyright 2002-2003 Guillaume Melquiond - * - * Distributed under the 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 "cmp_header.hpp" - -// comparisons between [1,2] and [3,4] - -static void test_12_34() { - const I a(1,2), b(3,4); - - BOOST_CHECK(a < b); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(!(a >= b)); - - BOOST_CHECK(b > a); - BOOST_CHECK(b >= a); - BOOST_CHECK(!(b < a)); - BOOST_CHECK(!(b <= a)); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,3] and [2,4] - -static void test_13_24() { - const I a(1,3), b(2,4); - - BOOST_C_EXN(a < b); - BOOST_C_EXN(a <= b); - BOOST_C_EXN(a > b); - BOOST_C_EXN(a >= b); - - BOOST_C_EXN(b < a); - BOOST_C_EXN(b <= a); - BOOST_C_EXN(b > a); - BOOST_C_EXN(b >= a); - - BOOST_C_EXN(a == b); - BOOST_C_EXN(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and [2,3] - -static void test_12_23() { - const I a(1,2), b(2,3); - - BOOST_C_EXN(a < b); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_C_EXN(a >= b); - - BOOST_CHECK(!(b < a)); - BOOST_C_EXN(b <= a); - BOOST_C_EXN(b > a); - BOOST_CHECK(b >= a); - - BOOST_C_EXN(a == b); - BOOST_C_EXN(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 0 - -static void test_12_0() { - const I a(1,2); - const int b = 0; - - BOOST_CHECK(!(a < b)); - BOOST_CHECK(!(a <= b)); - BOOST_CHECK(a > b); - BOOST_CHECK(a >= b); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 1 - -static void test_12_1() { - const I a(1,2); - const int b = 1; - - BOOST_CHECK(!(a < b)); - BOOST_C_EXN(a <= b); - BOOST_C_EXN(a > b); - BOOST_CHECK(a >= b); - - BOOST_C_EXN(a == b); - BOOST_C_EXN(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 2 - -static void test_12_2() { - const I a(1,2); - const int b = 2; - - BOOST_C_EXN(a < b); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_C_EXN(a >= b); - - BOOST_C_EXN(a == b); - BOOST_C_EXN(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 3 - -static void test_12_3() { - const I a(1,2); - const int b = 3; - - BOOST_CHECK(a < b); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(!(a >= b)); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and [1,2] - -static void test_12_12() { - const I a(1,2), b(1,2); - BOOST_C_EXN(a == b); - BOOST_C_EXN(a != b); -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,1] and [1,1] - -static void test_11_11() { - const I a(1,1), b(1,1); - BOOST_CHECK(a == b); - BOOST_CHECK(!(a != b)); -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,1] and 1 - -static void test_11_1() { - const I a(1,1); - const int b = 1; - BOOST_CHECK(a == b); - BOOST_CHECK(!(a != b)); -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -int test_main(int, char *[]) { - test_12_34(); - test_13_24(); - test_12_23(); - test_12_0(); - test_12_1(); - test_12_2(); - test_12_3(); - test_12_12(); - test_11_11(); - test_11_1(); - - return 0; -} diff --git a/libs/numeric/interval/test/cmp_exn.cpp b/libs/numeric/interval/test/cmp_exn.cpp deleted file mode 100644 index 7f6cc0303..000000000 --- a/libs/numeric/interval/test/cmp_exn.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* Boost test/cmp_exn.cpp - * test policies with respect to exception throwing - * - * Copyright 2004 Guillaume Melquiond - * - * Distributed under the 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 -#include -#include -#include -#include -#include - -struct my_checking -{ - static int nan() { return -1; } - static bool is_nan(int x) { return x < 0; } - static int empty_lower() { return -1; } - static int empty_upper() { return -1; } - static bool is_empty(int l, int u) { return l == -1 && u == -1; } -}; - -struct empty_class {}; - -typedef boost::numeric::interval_lib::policies< empty_class, my_checking > - my_policies; - -typedef boost::numeric::interval I; - -#define BOOST_C_EXN(e) \ - BOOST_CHECK_THROW(e, boost::numeric::interval_lib::comparison_error) - -static void test_cer() -{ - I const a(I::empty()), b(1,2); - int const c = 0, d = my_checking::nan(); - using namespace boost::numeric::interval_lib::compare::certain; - - BOOST_C_EXN(a < b); - BOOST_C_EXN(a <= b); - BOOST_C_EXN(a > b); - BOOST_C_EXN(a >= b); - BOOST_C_EXN(a == b); - BOOST_C_EXN(a != b); - BOOST_C_EXN(b < a); - BOOST_C_EXN(b <= a); - BOOST_C_EXN(b > a); - BOOST_C_EXN(b >= a); - BOOST_C_EXN(b == a); - BOOST_C_EXN(b != a); - - BOOST_C_EXN(a < c); - BOOST_C_EXN(a <= c); - BOOST_C_EXN(a > c); - BOOST_C_EXN(a >= c); - BOOST_C_EXN(a == c); - BOOST_C_EXN(a != c); - BOOST_C_EXN(b < d); - BOOST_C_EXN(b <= d); - BOOST_C_EXN(b > d); - BOOST_C_EXN(b >= d); - BOOST_C_EXN(b == d); - BOOST_C_EXN(b != d); -} - -static void test_def() -{ - I const a(I::empty()), b(1,2); - int const c = 0, d = my_checking::nan(); - - BOOST_C_EXN(a < b); - BOOST_C_EXN(a <= b); - BOOST_C_EXN(a > b); - BOOST_C_EXN(a >= b); - BOOST_C_EXN(a == b); - BOOST_C_EXN(a != b); - BOOST_C_EXN(b < a); - BOOST_C_EXN(b <= a); - BOOST_C_EXN(b > a); - BOOST_C_EXN(b >= a); - BOOST_C_EXN(b == a); - BOOST_C_EXN(b != a); - - BOOST_C_EXN(a < c); - BOOST_C_EXN(a <= c); - BOOST_C_EXN(a > c); - BOOST_C_EXN(a >= c); - BOOST_C_EXN(a == c); - BOOST_C_EXN(a != c); - BOOST_C_EXN(b < d); - BOOST_C_EXN(b <= d); - BOOST_C_EXN(b > d); - BOOST_C_EXN(b >= d); - BOOST_C_EXN(b == d); - BOOST_C_EXN(b != d); -} - -static void test_lex() -{ - I const a(I::empty()), b(1,2); - int const c = 0, d = my_checking::nan(); - using namespace boost::numeric::interval_lib::compare::lexicographic; - - BOOST_C_EXN(a < b); - BOOST_C_EXN(a <= b); - BOOST_C_EXN(a > b); - BOOST_C_EXN(a >= b); - BOOST_C_EXN(a == b); - BOOST_C_EXN(a != b); - BOOST_C_EXN(b < a); - BOOST_C_EXN(b <= a); - BOOST_C_EXN(b > a); - BOOST_C_EXN(b >= a); - BOOST_C_EXN(b == a); - BOOST_C_EXN(b != a); - - BOOST_C_EXN(a < c); - BOOST_C_EXN(a <= c); - BOOST_C_EXN(a > c); - BOOST_C_EXN(a >= c); - BOOST_C_EXN(a == c); - BOOST_C_EXN(a != c); - BOOST_C_EXN(b < d); - BOOST_C_EXN(b <= d); - BOOST_C_EXN(b > d); - BOOST_C_EXN(b >= d); - BOOST_C_EXN(b == d); - BOOST_C_EXN(b != d); -} - -static void test_pos() -{ - I const a(I::empty()), b(1,2); - int const c = 0, d = my_checking::nan(); - using namespace boost::numeric::interval_lib::compare::possible; - - BOOST_C_EXN(a < b); - BOOST_C_EXN(a <= b); - BOOST_C_EXN(a > b); - BOOST_C_EXN(a >= b); - BOOST_C_EXN(a == b); - BOOST_C_EXN(a != b); - BOOST_C_EXN(b < a); - BOOST_C_EXN(b <= a); - BOOST_C_EXN(b > a); - BOOST_C_EXN(b >= a); - BOOST_C_EXN(b == a); - BOOST_C_EXN(b != a); - - BOOST_C_EXN(a < c); - BOOST_C_EXN(a <= c); - BOOST_C_EXN(a > c); - BOOST_C_EXN(a >= c); - BOOST_C_EXN(a == c); - BOOST_C_EXN(a != c); - BOOST_C_EXN(b < d); - BOOST_C_EXN(b <= d); - BOOST_C_EXN(b > d); - BOOST_C_EXN(b >= d); - BOOST_C_EXN(b == d); - BOOST_C_EXN(b != d); -} - -static void test_set() -{ - I const a(I::empty()), b(1,2); - int const c = 0; - using namespace boost::numeric::interval_lib::compare::set; - - BOOST_C_EXN(a < c); - BOOST_C_EXN(a <= c); - BOOST_C_EXN(a > c); - BOOST_C_EXN(a >= c); - BOOST_C_EXN(a == c); - BOOST_C_EXN(a != c); - BOOST_C_EXN(b < c); - BOOST_C_EXN(b <= c); - BOOST_C_EXN(b > c); - BOOST_C_EXN(b >= c); - BOOST_C_EXN(b == c); - BOOST_C_EXN(b != c); -} - -static void test_tri() -{ - I const a(I::empty()), b(1,2); - int const c = 0, d = my_checking::nan(); - using namespace boost::numeric::interval_lib::compare::tribool; - - BOOST_C_EXN(a < b); - BOOST_C_EXN(a <= b); - BOOST_C_EXN(a > b); - BOOST_C_EXN(a >= b); - BOOST_C_EXN(a == b); - BOOST_C_EXN(a != b); - BOOST_C_EXN(b < a); - BOOST_C_EXN(b <= a); - BOOST_C_EXN(b > a); - BOOST_C_EXN(b >= a); - BOOST_C_EXN(b == a); - BOOST_C_EXN(b != a); - - BOOST_C_EXN(a < c); - BOOST_C_EXN(a <= c); - BOOST_C_EXN(a > c); - BOOST_C_EXN(a >= c); - BOOST_C_EXN(a == c); - BOOST_C_EXN(a != c); - BOOST_C_EXN(b < d); - BOOST_C_EXN(b <= d); - BOOST_C_EXN(b > d); - BOOST_C_EXN(b >= d); - BOOST_C_EXN(b == d); - BOOST_C_EXN(b != d); -} - -int test_main(int, char *[]) { - test_cer(); - test_def(); - test_lex(); - test_pos(); - test_set(); - test_tri(); - - return 0; -} diff --git a/libs/numeric/interval/test/cmp_exp.cpp b/libs/numeric/interval/test/cmp_exp.cpp deleted file mode 100644 index bebd13af3..000000000 --- a/libs/numeric/interval/test/cmp_exp.cpp +++ /dev/null @@ -1,366 +0,0 @@ -/* Boost test/cmp_exp.cpp - * test explicit comparison functions - * - * Copyright 2002-2003 Guillaume Melquiond - * - * Distributed under the 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 "cmp_header.hpp" - -// comparisons between [1,2] and [3,4] - -static void test_12_34() { - const I a(1,2), b(3,4); - - BOOST_CHECK(cerlt(a, b)); - BOOST_CHECK(cerle(a, b)); - BOOST_CHECK(!cergt(a, b)); - BOOST_CHECK(!cerge(a, b)); - - BOOST_CHECK(!cerlt(b, a)); - BOOST_CHECK(!cerle(b, a)); - BOOST_CHECK(cergt(b, a)); - BOOST_CHECK(cerge(b, a)); - - BOOST_CHECK(poslt(a, b)); - BOOST_CHECK(posle(a, b)); - BOOST_CHECK(!posgt(a, b)); - BOOST_CHECK(!posge(a, b)); - - BOOST_CHECK(!poslt(b, a)); - BOOST_CHECK(!posle(b, a)); - BOOST_CHECK(posgt(b, a)); - BOOST_CHECK(posge(b, a)); - - BOOST_CHECK(!cereq(a, b)); - BOOST_CHECK(cerne(a, b)); - BOOST_CHECK(!poseq(a, b)); - BOOST_CHECK(posne(a, b)); - - BOOST_CHECK(!cereq(b, a)); - BOOST_CHECK(cerne(b, a)); - BOOST_CHECK(!poseq(b, a)); - BOOST_CHECK(posne(b, a)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,3] and [2,4] - -static void test_13_24() { - const I a(1,3), b(2,4); - - BOOST_CHECK(!cerlt(a, b)); - BOOST_CHECK(!cerle(a, b)); - BOOST_CHECK(!cergt(a, b)); - BOOST_CHECK(!cerge(a, b)); - - BOOST_CHECK(!cerlt(b, a)); - BOOST_CHECK(!cerle(b, a)); - BOOST_CHECK(!cergt(b, a)); - BOOST_CHECK(!cerge(b, a)); - - BOOST_CHECK(poslt(a, b)); - BOOST_CHECK(posle(a, b)); - BOOST_CHECK(posgt(a, b)); - BOOST_CHECK(posge(a, b)); - - BOOST_CHECK(poslt(b, a)); - BOOST_CHECK(posle(b, a)); - BOOST_CHECK(posgt(b, a)); - BOOST_CHECK(posge(b, a)); - - BOOST_CHECK(!cereq(a, b)); - BOOST_CHECK(!cerne(a, b)); - BOOST_CHECK(poseq(a, b)); - BOOST_CHECK(posne(a, b)); - - BOOST_CHECK(!cereq(b, a)); - BOOST_CHECK(!cerne(b, a)); - BOOST_CHECK(poseq(b, a)); - BOOST_CHECK(posne(b, a)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and [2,3] - -static void test_12_23() { - const I a(1,2), b(2,3); - - BOOST_CHECK(!cerlt(a, b)); - BOOST_CHECK(cerle(a, b)); - BOOST_CHECK(!cergt(a, b)); - BOOST_CHECK(!cerge(a, b)); - - BOOST_CHECK(!cerlt(b, a)); - BOOST_CHECK(!cerle(b, a)); - BOOST_CHECK(!cergt(b, a)); - BOOST_CHECK(cerge(b, a)); - - BOOST_CHECK(poslt(a, b)); - BOOST_CHECK(posle(a, b)); - BOOST_CHECK(!posgt(a, b)); - BOOST_CHECK(posge(a, b)); - - BOOST_CHECK(!poslt(b, a)); - BOOST_CHECK(posle(b, a)); - BOOST_CHECK(posgt(b, a)); - BOOST_CHECK(posge(b, a)); - - BOOST_CHECK(!cereq(a, b)); - BOOST_CHECK(!cerne(a, b)); - BOOST_CHECK(poseq(a, b)); - BOOST_CHECK(posne(a, b)); - - BOOST_CHECK(!cereq(b, a)); - BOOST_CHECK(!cerne(b, a)); - BOOST_CHECK(poseq(b, a)); - BOOST_CHECK(posne(b, a)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 0 - -static void test_12_0() { - const I a(1,2); - const int b = 0; - - BOOST_CHECK(!cerlt(a, b)); - BOOST_CHECK(!cerle(a, b)); - BOOST_CHECK(cergt(a, b)); - BOOST_CHECK(cerge(a, b)); - - BOOST_CHECK(cerlt(b, a)); - BOOST_CHECK(cerle(b, a)); - BOOST_CHECK(!cergt(b, a)); - BOOST_CHECK(!cerge(b, a)); - - BOOST_CHECK(!poslt(a, b)); - BOOST_CHECK(!posle(a, b)); - BOOST_CHECK(posgt(a, b)); - BOOST_CHECK(posge(a, b)); - - BOOST_CHECK(poslt(b, a)); - BOOST_CHECK(posle(b, a)); - BOOST_CHECK(!posgt(b, a)); - BOOST_CHECK(!posge(b, a)); - - BOOST_CHECK(!cereq(a, b)); - BOOST_CHECK(cerne(a, b)); - BOOST_CHECK(!poseq(a, b)); - BOOST_CHECK(posne(a, b)); - - BOOST_CHECK(!cereq(b, a)); - BOOST_CHECK(cerne(b, a)); - BOOST_CHECK(!poseq(b, a)); - BOOST_CHECK(posne(b, a)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 1 - -static void test_12_1() { - const I a(1,2); - const int b = 1; - - BOOST_CHECK(!cerlt(a, b)); - BOOST_CHECK(!cerle(a, b)); - BOOST_CHECK(!cergt(a, b)); - BOOST_CHECK(cerge(a, b)); - - BOOST_CHECK(!cerlt(b, a)); - BOOST_CHECK(cerle(b, a)); - BOOST_CHECK(!cergt(b, a)); - BOOST_CHECK(!cerge(b, a)); - - BOOST_CHECK(!poslt(a, b)); - BOOST_CHECK(posle(a, b)); - BOOST_CHECK(posgt(a, b)); - BOOST_CHECK(posge(a, b)); - - BOOST_CHECK(poslt(b, a)); - BOOST_CHECK(posle(b, a)); - BOOST_CHECK(!posgt(b, a)); - BOOST_CHECK(posge(b, a)); - - BOOST_CHECK(!cereq(a, b)); - BOOST_CHECK(!cerne(a, b)); - BOOST_CHECK(poseq(a, b)); - BOOST_CHECK(posne(a, b)); - - BOOST_CHECK(!cereq(b, a)); - BOOST_CHECK(!cerne(b, a)); - BOOST_CHECK(poseq(b, a)); - BOOST_CHECK(posne(b, a)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 2 - -static void test_12_2() { - const I a(1,2); - const int b = 2; - - BOOST_CHECK(!cerlt(a, b)); - BOOST_CHECK(cerle(a, b)); - BOOST_CHECK(!cergt(a, b)); - BOOST_CHECK(!cerge(a, b)); - - BOOST_CHECK(!cerlt(b, a)); - BOOST_CHECK(!cerle(b, a)); - BOOST_CHECK(!cergt(b, a)); - BOOST_CHECK(cerge(b, a)); - - BOOST_CHECK(poslt(a, b)); - BOOST_CHECK(posle(a, b)); - BOOST_CHECK(!posgt(a, b)); - BOOST_CHECK(posge(a, b)); - - BOOST_CHECK(!poslt(b, a)); - BOOST_CHECK(posle(b, a)); - BOOST_CHECK(posgt(b, a)); - BOOST_CHECK(posge(b, a)); - - BOOST_CHECK(!cereq(a, b)); - BOOST_CHECK(!cerne(a, b)); - BOOST_CHECK(poseq(a, b)); - BOOST_CHECK(posne(a, b)); - - BOOST_CHECK(!cereq(b, a)); - BOOST_CHECK(!cerne(b, a)); - BOOST_CHECK(poseq(b, a)); - BOOST_CHECK(posne(b, a)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 3 - -static void test_12_3() { - const I a(1,2); - const int b = 3; - - BOOST_CHECK(cerlt(a, b)); - BOOST_CHECK(cerle(a, b)); - BOOST_CHECK(!cergt(a, b)); - BOOST_CHECK(!cerge(a, b)); - - BOOST_CHECK(!cerlt(b, a)); - BOOST_CHECK(!cerle(b, a)); - BOOST_CHECK(cergt(b, a)); - BOOST_CHECK(cerge(b, a)); - - BOOST_CHECK(poslt(a, b)); - BOOST_CHECK(posle(a, b)); - BOOST_CHECK(!posgt(a, b)); - BOOST_CHECK(!posge(a, b)); - - BOOST_CHECK(!poslt(b, a)); - BOOST_CHECK(!posle(b, a)); - BOOST_CHECK(posgt(b, a)); - BOOST_CHECK(posge(b, a)); - - BOOST_CHECK(!cereq(a, b)); - BOOST_CHECK(cerne(a, b)); - BOOST_CHECK(!poseq(a, b)); - BOOST_CHECK(posne(a, b)); - - BOOST_CHECK(!cereq(b, a)); - BOOST_CHECK(cerne(b, a)); - BOOST_CHECK(!poseq(b, a)); - BOOST_CHECK(posne(b, a)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -static void test_12_12() { - const I a(1,2), b(1,2); - BOOST_CHECK(!cereq(a, b)); - BOOST_CHECK(!cerne(a, b)); - BOOST_CHECK(poseq(a, b)); - BOOST_CHECK(posne(a, b)); - BOOST_CHECK(!cereq(b, a)); - BOOST_CHECK(!cerne(b, a)); - BOOST_CHECK(poseq(b, a)); - BOOST_CHECK(posne(b, a)); -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -static void test_11_11() { - const I a(1,1), b(1,1); - BOOST_CHECK(cereq(a, b)); - BOOST_CHECK(!cerne(a, b)); - BOOST_CHECK(poseq(a, b)); - BOOST_CHECK(!posne(a, b)); - BOOST_CHECK(cereq(b, a)); - BOOST_CHECK(!cerne(b, a)); - BOOST_CHECK(poseq(b, a)); - BOOST_CHECK(!posne(b, a)); -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -static void test_11_1() { - const I a(1,1); - const int b = 1; - BOOST_CHECK(cereq(a, b)); - BOOST_CHECK(!cerne(a, b)); - BOOST_CHECK(poseq(a, b)); - BOOST_CHECK(!posne(a, b)); - BOOST_CHECK(cereq(b, a)); - BOOST_CHECK(!cerne(b, a)); - BOOST_CHECK(poseq(b, a)); - BOOST_CHECK(!posne(b, a)); -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -int test_main(int, char *[]) { - test_12_34(); - test_13_24(); - test_12_23(); - test_12_0(); - test_12_1(); - test_12_2(); - test_12_3(); - test_12_12(); - test_11_11(); - test_11_1(); - - return 0; -} diff --git a/libs/numeric/interval/test/cmp_header.hpp b/libs/numeric/interval/test/cmp_header.hpp deleted file mode 100644 index ef4c209ae..000000000 --- a/libs/numeric/interval/test/cmp_header.hpp +++ /dev/null @@ -1,26 +0,0 @@ -/* Boost test/cmp_header.hpp header file - * - * Copyright 2003 Guillaume Melquiond - * - * Distributed under the 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 -#include -#include -#include -#include -#include "bugs.hpp" - -struct empty_class {}; - -typedef boost::numeric::interval_lib::policies - > - my_policies; - -typedef boost::numeric::interval I; - -#define BOOST_C_EXN(e) \ - BOOST_CHECK_THROW(e, boost::numeric::interval_lib::comparison_error) diff --git a/libs/numeric/interval/test/cmp_lex.cpp b/libs/numeric/interval/test/cmp_lex.cpp deleted file mode 100644 index 6ae0bcb92..000000000 --- a/libs/numeric/interval/test/cmp_lex.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/* Boost test/cmp_lex.cpp - * test compare::lexicographic - * - * Copyright 2002-2003 Guillaume Melquiond - * - * Distributed under the 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 "cmp_header.hpp" - -using namespace boost::numeric::interval_lib::compare::lexicographic; - -// comparisons between [1,2] and [3,4] - -static void test_12_34() { - const I a(1,2), b(3,4); - - BOOST_CHECK(a < b); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(!(a >= b)); - - BOOST_CHECK(b > a); - BOOST_CHECK(b >= a); - BOOST_CHECK(!(b < a)); - BOOST_CHECK(!(b <= a)); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,3] and [2,4] - -static void test_13_24() { - const I a(1,3), b(2,4); - - BOOST_CHECK(a < b); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(!(a >= b)); - - BOOST_CHECK(!(b < a)); - BOOST_CHECK(!(b <= a)); - BOOST_CHECK(b > a); - BOOST_CHECK(b >= a); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and [2,3] - -static void test_12_23() { - const I a(1,2), b(2,3); - - BOOST_CHECK(a < b); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(!(a >= b)); - - BOOST_CHECK(!(b < a)); - BOOST_CHECK(!(b <= a)); - BOOST_CHECK(b > a); - BOOST_CHECK(b >= a); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 0 - -static void test_12_0() { - const I a(1,2); - const int b = 0; - - BOOST_CHECK(!(a < b)); - BOOST_CHECK(!(a <= b)); - BOOST_CHECK(a > b); - BOOST_CHECK(a >= b); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 1 - -static void test_12_1() { - const I a(1,2); - const int b = 1; - - BOOST_CHECK(!(a < b)); - BOOST_CHECK(!(a <= b)); - BOOST_CHECK(a > b); - BOOST_CHECK(a >= b); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 2 - -static void test_12_2() { - const I a(1,2); - const int b = 2; - - BOOST_CHECK(a < b); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(!(a >= b)); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 3 - -static void test_12_3() { - const I a(1,2); - const int b = 3; - - BOOST_CHECK(a < b); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(!(a >= b)); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -static void test_12_12() { - const I a(1,2), b(1,2); - - BOOST_CHECK(a == b); - BOOST_CHECK(!(a != b)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -static void test_11_11() { - const I a(1,1), b(1,1); - - BOOST_CHECK(a == b); - BOOST_CHECK(!(a != b)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -static void test_11_1() { - const I a(1,1); - const int b = 1; - - BOOST_CHECK(a == b); - BOOST_CHECK(!(a != b)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -int test_main(int, char *[]) { - test_12_34(); - test_13_24(); - test_12_23(); - test_12_0(); - test_12_1(); - test_12_2(); - test_12_3(); - test_12_12(); - test_11_11(); - test_11_1(); - - return 0; -} diff --git a/libs/numeric/interval/test/cmp_set.cpp b/libs/numeric/interval/test/cmp_set.cpp deleted file mode 100644 index 55c44740e..000000000 --- a/libs/numeric/interval/test/cmp_set.cpp +++ /dev/null @@ -1,218 +0,0 @@ -/* Boost test/cmp_set.cpp - * test compare::set - * - * Copyright 2004 Guillaume Melquiond - * - * Distributed under the 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 "cmp_header.hpp" - -using namespace boost::numeric::interval_lib::compare::set; - -// comparisons between [1,2] and [3,4] - -static void test_12_34() { - const I a(1,2), b(3,4); - - BOOST_CHECK(!(a < b)); - BOOST_CHECK(!(a <= b)); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(!(a >= b)); - - BOOST_CHECK(!(b > a)); - BOOST_CHECK(!(b >= a)); - BOOST_CHECK(!(b < a)); - BOOST_CHECK(!(b <= a)); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,3] and [2,4] - -static void test_13_24() { - const I a(1,3), b(2,4); - - BOOST_CHECK(!(a < b)); - BOOST_CHECK(!(a <= b)); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(!(a >= b)); - - BOOST_CHECK(!(b < a)); - BOOST_CHECK(!(b <= a)); - BOOST_CHECK(!(b > a)); - BOOST_CHECK(!(b >= a)); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,4] and [2,3] - -static void test_14_23() { - const I a(1,4), b(2,3); - - BOOST_CHECK(!(a < b)); - BOOST_CHECK(!(a <= b)); - BOOST_CHECK(a > b); - BOOST_CHECK(a >= b); - - BOOST_CHECK(b < a); - BOOST_CHECK(b <= a); - BOOST_CHECK(!(b > a)); - BOOST_CHECK(!(b >= a)); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and [2,3] - -static void test_12_23() { - const I a(1,2), b(2,3); - - BOOST_CHECK(!(a < b)); - BOOST_CHECK(!(a <= b)); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(!(a >= b)); - - BOOST_CHECK(!(b < a)); - BOOST_CHECK(!(b <= a)); - BOOST_CHECK(!(b > a)); - BOOST_CHECK(!(b >= a)); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and empty set - -static void test_12_E() { - I a(1, 2), b(I::empty()); - - BOOST_CHECK(!(a < b)); - BOOST_CHECK(!(a <= b)); - BOOST_CHECK(a > b); - BOOST_CHECK(a >= b); - - BOOST_CHECK(b < a); - BOOST_CHECK(b <= a); - BOOST_CHECK(!(b > a)); - BOOST_CHECK(!(b >= a)); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between two empty sets - -static void test_E_E() { - I a(I::empty()), b(I::empty()); - - BOOST_CHECK(!(a < b)); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(a >= b); - - BOOST_CHECK(!(b < a)); - BOOST_CHECK(b <= a); - BOOST_CHECK(!(b > a)); - BOOST_CHECK(b >= a); - - BOOST_CHECK(a == b); - BOOST_CHECK(!(a != b)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and [1,2] - -static void test_12_12() { - const I a(1,2), b(1,2); - - BOOST_CHECK(!(a < b)); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(a >= b); - - BOOST_CHECK(!(b < a)); - BOOST_CHECK(b <= a); - BOOST_CHECK(!(b > a)); - BOOST_CHECK(b >= a); - - BOOST_CHECK(a == b); - BOOST_CHECK(!(a != b)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,1] and [1,1] - -static void test_11_11() { - const I a(1,1), b(1,1); - - BOOST_CHECK(!(a < b)); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(a >= b); - - BOOST_CHECK(!(b < a)); - BOOST_CHECK(b <= a); - BOOST_CHECK(!(b > a)); - BOOST_CHECK(b >= a); - - BOOST_CHECK(a == b); - BOOST_CHECK(!(a != b)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -int test_main(int, char *[]) { - test_12_34(); - test_13_24(); - test_14_23(); - test_12_23(); - test_12_E(); - test_E_E(); - test_12_12(); - test_11_11(); - - return 0; -} diff --git a/libs/numeric/interval/test/cmp_tribool.cpp b/libs/numeric/interval/test/cmp_tribool.cpp deleted file mode 100644 index 9b2f5a48c..000000000 --- a/libs/numeric/interval/test/cmp_tribool.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/* Boost test/cmp_tribool.cpp - * test compare::tribool - * - * Copyright 2004 Guillaume Melquiond - * - * Distributed under the 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 "cmp_header.hpp" -#include - -using namespace boost::numeric::interval_lib::compare::tribool; - -// comparisons between [1,2] and [3,4] - -static void test_12_34() { - const I a(1,2), b(3,4); - - BOOST_CHECK(a < b); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(!(a >= b)); - - BOOST_CHECK(b > a); - BOOST_CHECK(b >= a); - BOOST_CHECK(!(b < a)); - BOOST_CHECK(!(b <= a)); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,3] and [2,4] - -static void test_13_24() { - const I a(1,3), b(2,4); - - BOOST_CHECK(indeterminate(a < b)); - BOOST_CHECK(indeterminate(a <= b)); - BOOST_CHECK(indeterminate(a > b)); - BOOST_CHECK(indeterminate(a >= b)); - - BOOST_CHECK(indeterminate(b < a)); - BOOST_CHECK(indeterminate(b <= a)); - BOOST_CHECK(indeterminate(b > a)); - BOOST_CHECK(indeterminate(b >= a)); - - BOOST_CHECK(indeterminate(a == b)); - BOOST_CHECK(indeterminate(a != b)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and [2,3] - -static void test_12_23() { - const I a(1,2), b(2,3); - - BOOST_CHECK(indeterminate(a < b)); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(indeterminate(a >= b)); - - BOOST_CHECK(!(b < a)); - BOOST_CHECK(indeterminate(b <= a)); - BOOST_CHECK(indeterminate(b > a)); - BOOST_CHECK(b >= a); - - BOOST_CHECK(indeterminate(a == b)); - BOOST_CHECK(indeterminate(a != b)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 0 - -static void test_12_0() { - const I a(1,2); - const int b = 0; - - BOOST_CHECK(!(a < b)); - BOOST_CHECK(!(a <= b)); - BOOST_CHECK(a > b); - BOOST_CHECK(a >= b); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 1 - -static void test_12_1() { - const I a(1,2); - const int b = 1; - - BOOST_CHECK(!(a < b)); - BOOST_CHECK(indeterminate(a <= b)); - BOOST_CHECK(indeterminate(a > b)); - BOOST_CHECK(a >= b); - - BOOST_CHECK(indeterminate(a == b)); - BOOST_CHECK(indeterminate(a != b)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 2 - -static void test_12_2() { - const I a(1,2); - const int b = 2; - - BOOST_CHECK(indeterminate(a < b)); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(indeterminate(a >= b)); - - BOOST_CHECK(indeterminate(a == b)); - BOOST_CHECK(indeterminate(a != b)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and 3 - -static void test_12_3() { - const I a(1,2); - const int b = 3; - - BOOST_CHECK(a < b); - BOOST_CHECK(a <= b); - BOOST_CHECK(!(a > b)); - BOOST_CHECK(!(a >= b)); - - BOOST_CHECK(!(a == b)); - BOOST_CHECK(a != b); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,2] and [1,2] - -static void test_12_12() { - const I a(1,2), b(1,2); - - BOOST_CHECK(indeterminate(a == b)); - BOOST_CHECK(indeterminate(a != b)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,1] and [1,1] - -static void test_11_11() { - const I a(1,1), b(1,1); - - BOOST_CHECK(a == b); - BOOST_CHECK(!(a != b)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -// comparisons between [1,1] and 1 - -static void test_11_1() { - const I a(1,1); - const int b = 1; - - BOOST_CHECK(a == b); - BOOST_CHECK(!(a != b)); - -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(a); - ::detail::ignore_unused_variable_warning(b); -# endif -} - -int test_main(int, char *[]) { - test_12_34(); - test_13_24(); - test_12_23(); - test_12_0(); - test_12_1(); - test_12_2(); - test_12_3(); - test_12_12(); - test_11_11(); - test_11_1(); - - return 0; -} diff --git a/libs/numeric/interval/test/det.cpp b/libs/numeric/interval/test/det.cpp deleted file mode 100644 index cc401adc6..000000000 --- a/libs/numeric/interval/test/det.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* Boost test/det.cpp - * test protected and unprotected rounding on an unstable determinant - * - * Copyright 2002-2003 Guillaume Melquiond - * - * Distributed under the 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 -#include -#include "bugs.hpp" - -#define size 8 - -template -void det(I (&mat)[size][size]) { - for(int i = 0; i < size; i++) - for(int j = 0; j < size; j++) - mat[i][j] = I(1) / I(i + j + 1); - - for(int i = 0; i < size - 1; i++) { - int m = i, n = i; - typename I::base_type v = 0; - for(int a = i; a < size; a++) - for(int b = i; b < size; b++) { - typename I::base_type w = abs(mat[a][b]).lower(); - if (w > v) { m = a; n = b; v = w; } - } - if (n != i) - for(int a = 0; a < size; a++) { - I t = mat[a][n]; - mat[a][n] = mat[a][i]; - mat[a][i] = t; - } - if (m != i) - for(int b = i; b < size; b++) { - I t = mat[m][b]; - mat[m][b] = mat[m][i]; - mat[m][i] = t; - } - if (((m + n) & 1) == 1) { }; - I c = mat[i][i]; - for(int j = i + 1; j < size; j++) { - I f = mat[j][i] / c; - for(int k = i; k < size; k++) - mat[j][k] -= f * mat[i][k]; - } - if (zero_in(c)) return; - } -} - -namespace my_namespace { - -using namespace boost; -using namespace numeric; -using namespace interval_lib; - -template -struct variants { - typedef interval I_op; - typedef typename change_rounding > >::type I_sp; - typedef typename unprotect::type I_ou; - typedef typename unprotect::type I_su; - typedef T type; -}; - -} - -template -bool test() { - typedef my_namespace::variants types; - types::I_op mat_op[size][size]; - types::I_sp mat_sp[size][size]; - types::I_ou mat_ou[size][size]; - types::I_su mat_su[size][size]; - det(mat_op); - det(mat_sp); - { types::I_op::traits_type::rounding rnd; det(mat_ou); } - { types::I_sp::traits_type::rounding rnd; det(mat_su); } - for(int i = 0; i < size; i++) - for(int j = 0; j < size; j++) { - typedef types::I_op I; - I d_op = mat_op[i][j]; - I d_sp = mat_sp[i][j]; - I d_ou = mat_ou[i][j]; - I d_su = mat_su[i][j]; - if (!(equal(d_op, d_sp) && equal(d_sp, d_ou) && equal(d_ou, d_su))) - return false; - } - return true; -} - -int test_main(int, char *[]) { - BOOST_CHECK(test()); - BOOST_CHECK(test()); - BOOST_CHECK(test()); -# ifdef __BORLANDC__ - ::detail::ignore_warnings(); -# endif - return 0; -} diff --git a/libs/numeric/interval/test/fmod.cpp b/libs/numeric/interval/test/fmod.cpp deleted file mode 100644 index 230dcd2f0..000000000 --- a/libs/numeric/interval/test/fmod.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* Boost test/fmod.cpp - * test the fmod with specially crafted integer intervals - * - * Copyright 2002-2003 Guillaume Melquiond - * - * Distributed under the 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 -#include -#include -#include -#include -#include -#include -#include "bugs.hpp" - -struct my_rounded_arith { - int sub_down(int x, int y) { return x - y; } - int sub_up (int x, int y) { return x - y; } - int mul_down(int x, int y) { return x * y; } - int mul_up (int x, int y) { return x * y; } - int div_down(int x, int y) { - int q = x / y; - return (x % y < 0) ? (q - 1) : q; - } - int int_down(int x) { return x; } -}; - -using namespace boost; -using namespace numeric; -using namespace interval_lib; - -typedef change_rounding, save_state_nothing >::type I; - -int test_main(int, char *[]) { - - BOOST_CHECK(equal(fmod(I(6,9), 7), I(6,9))); - BOOST_CHECK(equal(fmod(6, I(7,8)), I(6,6))); - BOOST_CHECK(equal(fmod(I(6,9), I(7,8)), I(6,9))); - - BOOST_CHECK(equal(fmod(I(13,17), 7), I(6,10))); - BOOST_CHECK(equal(fmod(13, I(7,8)), I(5,6))); - BOOST_CHECK(equal(fmod(I(13,17), I(7,8)), I(5,10))); - - BOOST_CHECK(equal(fmod(I(-17,-13), 7), I(4,8))); - BOOST_CHECK(equal(fmod(-17, I(7,8)), I(4,7))); - BOOST_CHECK(equal(fmod(I(-17,-13), I(7,8)), I(4,11))); - - return 0; -} diff --git a/libs/numeric/interval/test/integer.cpp b/libs/numeric/interval/test/integer.cpp deleted file mode 100644 index 3e78d8be4..000000000 --- a/libs/numeric/interval/test/integer.cpp +++ /dev/null @@ -1,24 +0,0 @@ -/* Boost test/integer.cpp - * test int extension - * - * Copyright 2003 Guillaume Melquiond - * - * Distributed under the 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 -#include -#include "bugs.hpp" - -typedef boost::numeric::interval I; - -int main() { - I x, y; - x = 4 - (2 * y + 1) / 3; -# ifdef __BORLANDC__ - ::detail::ignore_warnings(); -# endif - return 0; -} diff --git a/libs/numeric/interval/test/msvc_x64_flags.cpp b/libs/numeric/interval/test/msvc_x64_flags.cpp deleted file mode 100644 index a79d2bb08..000000000 --- a/libs/numeric/interval/test/msvc_x64_flags.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* Boost test/msvc_x64_flags.cpp - * Test for amd64\ieee.c(102) : Assertion failed: (mask&~(_MCW_DN|_MCW_EM|_MCW_RC))==0. - * This happens with MSVC on x64 in Debug mode. See ticket #4964. - * - * Distributed under the 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 -#include -#include "bugs.hpp" - -int test_main(int, char *[]) { - boost::numeric::interval i(0.0, 0.0); - boost::numeric::interval i2 = 60.0 - i; -# ifdef __BORLANDC__ - ::detail::ignore_warnings(); -# endif - return 0; -} diff --git a/libs/numeric/interval/test/mul.cpp b/libs/numeric/interval/test/mul.cpp deleted file mode 100644 index 118acf325..000000000 --- a/libs/numeric/interval/test/mul.cpp +++ /dev/null @@ -1,124 +0,0 @@ -/* Boost test/mul.cpp - * test multiplication, division, square and square root on some intervals - * - * Copyright 2002-2003 Guillaume Melquiond - * - * Distributed under the 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 -#include -#include "bugs.hpp" - -typedef boost::numeric::interval I; - -static double min BOOST_PREVENT_MACRO_SUBSTITUTION (double a, double b, double c, double d) { - return (std::min)((std::min)(a, b), (std::min)(c, d)); -} - -static double max BOOST_PREVENT_MACRO_SUBSTITUTION (double a, double b, double c, double d) { - return (std::max)((std::max)(a, b), (std::max)(c, d)); -} - -static bool test_mul(double al, double au, double bl, double bu) { - I a(al, au), b(bl, bu); - I c = a * b; - return c.lower() == (min)(al*bl, al*bu, au*bl, au*bu) - && c.upper() == (max)(al*bl, al*bu, au*bl, au*bu); -} - -static bool test_mul1(double ac, double bl, double bu) { - I a(ac), b(bl, bu); - I c = ac * b; - I d = b * ac; - I e = a * b; - return equal(c, d) && equal(d, e); -} - -static bool test_div(double al, double au, double bl, double bu) { - I a(al, au), b(bl, bu); - I c = a / b; - return c.lower() == (min)(al/bl, al/bu, au/bl, au/bu) - && c.upper() == (max)(al/bl, al/bu, au/bl, au/bu); -} - -static bool test_div1(double al, double au, double bc) { - I a(al, au), b(bc); - I c = a / bc; - I d = a / b; - return equal(c, d); -} - -static bool test_div2(double ac, double bl, double bu) { - I a(ac), b(bl, bu); - I c = ac / b; - I d = a / b; - return equal(c, d); -} - -static bool test_square(double al, double au) { - I a(al, au); - I b = square(a); - I c = a * a; - return b.upper() == c.upper() && - (b.lower() == c.lower() || (c.lower() <= 0 && b.lower() == 0)); -} - -static bool test_sqrt(double al, double au) { - I a(al, au); - I b = square(sqrt(a)); - return subset(abs(a), b); -} - -int test_main(int, char*[]) { - BOOST_CHECK(test_mul(2, 3, 5, 7)); - BOOST_CHECK(test_mul(2, 3, -5, 7)); - BOOST_CHECK(test_mul(2, 3, -7, -5)); - BOOST_CHECK(test_mul(-2, 3, 5, 7)); - BOOST_CHECK(test_mul(-2, 3, -5, 7)); - BOOST_CHECK(test_mul(-2, 3, -7, -5)); - BOOST_CHECK(test_mul(-3, -2, 5, 7)); - BOOST_CHECK(test_mul(-3, -2, -5, 7)); - BOOST_CHECK(test_mul(-3, -2, -7, -5)); - - BOOST_CHECK(test_mul1(3, 5, 7)); - BOOST_CHECK(test_mul1(3, -5, 7)); - BOOST_CHECK(test_mul1(3, -7, -5)); - BOOST_CHECK(test_mul1(-3, 5, 7)); - BOOST_CHECK(test_mul1(-3, -5, 7)); - BOOST_CHECK(test_mul1(-3, -7, -5)); - - BOOST_CHECK(test_div(30, 42, 2, 3)); - BOOST_CHECK(test_div(30, 42, -3, -2)); - BOOST_CHECK(test_div(-30, 42, 2, 3)); - BOOST_CHECK(test_div(-30, 42, -3, -2)); - BOOST_CHECK(test_div(-42, -30, 2, 3)); - BOOST_CHECK(test_div(-42, -30, -3, -2)); - - BOOST_CHECK(test_div1(30, 42, 3)); - BOOST_CHECK(test_div1(30, 42, -3)); - BOOST_CHECK(test_div1(-30, 42, 3)); - BOOST_CHECK(test_div1(-30, 42, -3)); - BOOST_CHECK(test_div1(-42, -30, 3)); - BOOST_CHECK(test_div1(-42, -30, -3)); - - BOOST_CHECK(test_div2(30, 2, 3)); - BOOST_CHECK(test_div2(30, -3, -2)); - BOOST_CHECK(test_div2(-30, 2, 3)); - BOOST_CHECK(test_div2(-30, -3, -2)); - - BOOST_CHECK(test_square(2, 3)); - BOOST_CHECK(test_square(-2, 3)); - BOOST_CHECK(test_square(-3, 2)); - - BOOST_CHECK(test_sqrt(2, 3)); - BOOST_CHECK(test_sqrt(5, 7)); - BOOST_CHECK(test_sqrt(-1, 2)); - -# ifdef __BORLANDC__ - ::detail::ignore_warnings(); -# endif - return 0; -} diff --git a/libs/numeric/interval/test/overflow.cpp b/libs/numeric/interval/test/overflow.cpp deleted file mode 100644 index c15fc917a..000000000 --- a/libs/numeric/interval/test/overflow.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* Boost test/overflow.cpp - * test if extended precision exponent does not disturb interval computation - * - * Copyright 2002-2003 Guillaume Melquiond - * - * Distributed under the 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 -#include -#include "bugs.hpp" - -template -void test_one(typename I::base_type x, typename I::base_type f) { - I y = x; - typename I::base_type g = 1 / f; - const int nb = 10000; - for(int i = 0; i < nb; i++) y *= f; - for(int i = 0; i < nb; i++) y *= g; - BOOST_CHECK(in(x, y)); -# ifdef __BORLANDC__ - ::detail::ignore_unused_variable_warning(nb); -# endif -} - -template -void test() { - test_one(1., 25.); - test_one(1., 0.04); - test_one(-1., 25.); - test_one(-1., 0.04); -} - -int test_main(int, char *[]) { - test >(); - test >(); - //test >(); -# ifdef __BORLANDC__ - ::detail::ignore_warnings(); -# endif - return 0; -} diff --git a/libs/numeric/interval/test/pi.cpp b/libs/numeric/interval/test/pi.cpp deleted file mode 100644 index 38adec99a..000000000 --- a/libs/numeric/interval/test/pi.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* Boost test/pi.cpp - * test if the pi constant is correctly defined - * - * Copyright 2002-2003 Guillaume Melquiond, Sylvain Pion - * - * Distributed under the 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 -#include -#include -#include "bugs.hpp" - -#define PI 3.14159265358979323846 - -typedef boost::numeric::interval I_i; -typedef boost::numeric::interval I_f; -typedef boost::numeric::interval I_d; -typedef boost::numeric::interval I_ld; - -using boost::numeric::interval_lib::pi; -using boost::numeric::interval_lib::pi_half; -using boost::numeric::interval_lib::pi_twice; - -int test_main(int, char *[]) { - I_i pi_i = pi(); - I_f pi_f = pi(); - I_d pi_d = pi(); - I_ld pi_ld = pi(); - - BOOST_CHECK(in((int) PI, pi_i)); - BOOST_CHECK(in((float) PI, pi_f)); - BOOST_CHECK(in((double)PI, pi_d)); - BOOST_CHECK(subset(pi_i, widen(I_i((int) PI), 1))); - BOOST_CHECK(subset(pi_f, widen(I_f((float) PI), (std::numeric_limits ::min)()))); - BOOST_CHECK(subset(pi_d, widen(I_d((double)PI), (std::numeric_limits::min)()))); - - // We can't test the following equalities for interval. - I_f pi_f_half = pi_half(); - I_f pi_f_twice = pi_twice(); - - I_d pi_d_half = pi_half(); - I_d pi_d_twice = pi_twice(); - - I_ld pi_ld_half = pi_half(); - I_ld pi_ld_twice = pi_twice(); - - BOOST_CHECK(equal(2.0f * pi_f_half, pi_f)); - BOOST_CHECK(equal(2.0 * pi_d_half, pi_d)); - BOOST_CHECK(equal(2.0l * pi_ld_half, pi_ld)); - - BOOST_CHECK(equal(2.0f * pi_f, pi_f_twice)); - BOOST_CHECK(equal(2.0 * pi_d, pi_d_twice)); - BOOST_CHECK(equal(2.0l * pi_ld, pi_ld_twice)); - - return 0; -} diff --git a/libs/numeric/interval/test/pow.cpp b/libs/numeric/interval/test/pow.cpp deleted file mode 100644 index ef5b268b0..000000000 --- a/libs/numeric/interval/test/pow.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* Boost test/pow.cpp - * test the pow function - * - * Copyright 2002-2003 Guillaume Melquiond - * - * Distributed under the 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 -#include -#include "bugs.hpp" - -bool test_pow(double al, double au, double bl, double bu, int p) { - typedef boost::numeric::interval I; - I b = pow(I(al, au), p); - return b.lower() == bl && b.upper() == bu; -} - -int test_main(int, char *[]) { - BOOST_CHECK(test_pow(2, 3, 8, 27, 3)); - BOOST_CHECK(test_pow(2, 3, 16, 81, 4)); - BOOST_CHECK(test_pow(-3, 2, -27, 8, 3)); - BOOST_CHECK(test_pow(-3, 2, 0, 81, 4)); - BOOST_CHECK(test_pow(-3, -2, -27, -8, 3)); - BOOST_CHECK(test_pow(-3, -2, 16, 81, 4)); - - BOOST_CHECK(test_pow(2, 4, 1./64, 1./8, -3)); - BOOST_CHECK(test_pow(2, 4, 1./256, 1./16, -4)); - BOOST_CHECK(test_pow(-4, -2, -1./8, -1./64, -3)); - BOOST_CHECK(test_pow(-4, -2, 1./256, 1./16, -4)); - - BOOST_CHECK(test_pow(2, 3, 1, 1, 0)); - BOOST_CHECK(test_pow(-3, 2, 1, 1, 0)); - BOOST_CHECK(test_pow(-3, -2, 1, 1, 0)); - -# ifdef __BORLANDC__ - ::detail::ignore_warnings(); -# endif - return 0; -} diff --git a/libs/numeric/interval/test/test_float.cpp b/libs/numeric/interval/test/test_float.cpp deleted file mode 100644 index 8f478a79a..000000000 --- a/libs/numeric/interval/test/test_float.cpp +++ /dev/null @@ -1,128 +0,0 @@ -/* Boost test/test_float.cpp - * test arithmetic operations on a range of intervals - * - * Copyright 2003 Guillaume Melquiond - * - * Distributed under the 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 -#include -#include -#include "bugs.hpp" - -/* All the following tests should be BOOST_CHECK; however, if a test fails, - the probability is high that hundreds of other tests will fail, so it is - replaced by BOOST_REQUIRE to avoid flooding the logs. */ - -template -void test_unary() { - typedef typename F::I I; - for(I a(-10., -9.91); a.lower() <= 10.; a += 0.3) { - if (!F::validate(a)) continue; - I rI = F::f_I(a); - T rT1 = F::f_T(a.lower()), rT2 = F::f_T(a.upper()), - rT3 = F::f_T(median(a)); - BOOST_REQUIRE(in(rT1, rI)); - BOOST_REQUIRE(in(rT2, rI)); - BOOST_REQUIRE(in(rT3, rI)); - } -} - -template -void test_binary() { - typedef typename F::I I; - for(I a(-10., -9.91); a.lower() <= 10.; a += 0.3) { - for(I b(-10., -9.91); b.lower() <= 10.; b += 0.3) { - if (!F::validate(a, b)) continue; - T al = a.lower(), au = a.upper(), bl = b.lower(), bu = b.upper(); - I rII = F::f_II(a, b); - I rIT1 = F::f_IT(a, bl), rIT2 = F::f_IT(a, bu); - I rTI1 = F::f_TI(al, b), rTI2 = F::f_TI(au, b); - I rTT1 = F::f_TT(al, bl), rTT2 = F::f_TT(al, bu); - I rTT3 = F::f_TT(au, bl), rTT4 = F::f_TT(au, bu); - BOOST_REQUIRE(subset(rTT1, rIT1)); - BOOST_REQUIRE(subset(rTT3, rIT1)); - BOOST_REQUIRE(subset(rTT2, rIT2)); - BOOST_REQUIRE(subset(rTT4, rIT2)); - BOOST_REQUIRE(subset(rTT1, rTI1)); - BOOST_REQUIRE(subset(rTT2, rTI1)); - BOOST_REQUIRE(subset(rTT3, rTI2)); - BOOST_REQUIRE(subset(rTT4, rTI2)); - BOOST_REQUIRE(subset(rIT1, rII)); - BOOST_REQUIRE(subset(rIT2, rII)); - BOOST_REQUIRE(subset(rTI1, rII)); - BOOST_REQUIRE(subset(rTI2, rII)); - } - } -} - -#define new_unary_bunch(name, op, val) \ - template \ - struct name { \ - typedef boost::numeric::interval I; \ - static I f_I(const I& a) { return op(a); } \ - static T f_T(const T& a) { return op(a); } \ - static bool validate(const I& a) { return val; } \ - } - -//#ifndef BOOST_NO_STDC_NAMESPACE -using std::abs; -using std::sqrt; -//#endif - -new_unary_bunch(bunch_pos, +, true); -new_unary_bunch(bunch_neg, -, true); -new_unary_bunch(bunch_sqrt, sqrt, a.lower() >= 0.); -new_unary_bunch(bunch_abs, abs, true); - -template -void test_all_unaries() { - BOOST_TEST_CHECKPOINT("pos"); test_unary >(); - BOOST_TEST_CHECKPOINT("neg"); test_unary >(); - BOOST_TEST_CHECKPOINT("sqrt"); test_unary >(); - BOOST_TEST_CHECKPOINT("abs"); test_unary >(); -} - -#define new_binary_bunch(name, op, val) \ - template \ - struct bunch_##name { \ - typedef boost::numeric::interval I; \ - static I f_II(const I& a, const I& b) { return a op b; } \ - static I f_IT(const I& a, const T& b) { return a op b; } \ - static I f_TI(const T& a, const I& b) { return a op b; } \ - static I f_TT(const T& a, const T& b) \ - { return boost::numeric::interval_lib::name(a,b); } \ - static bool validate(const I& a, const I& b) { return val; } \ - } - -new_binary_bunch(add, +, true); -new_binary_bunch(sub, -, true); -new_binary_bunch(mul, *, true); -new_binary_bunch(div, /, !zero_in(b)); - -template -void test_all_binaries() { - BOOST_TEST_CHECKPOINT("add"); test_binary >(); - BOOST_TEST_CHECKPOINT("sub"); test_binary >(); - BOOST_TEST_CHECKPOINT("mul"); test_binary >(); - BOOST_TEST_CHECKPOINT("div"); test_binary >(); -} - -int test_main(int, char *[]) { - BOOST_TEST_CHECKPOINT("float tests"); - test_all_unaries (); - test_all_binaries (); - BOOST_TEST_CHECKPOINT("double tests"); - test_all_unaries(); - test_all_binaries(); - //BOOST_TEST_CHECKPOINT("long double tests"); - //test_all_unaries(); - //test_all_binaries(); -# ifdef __BORLANDC__ - ::detail::ignore_warnings(); -# endif - return 0; -} diff --git a/libs/numeric/odeint/CHANGELOG b/libs/numeric/odeint/CHANGELOG deleted file mode 100644 index b1537eb1a..000000000 --- a/libs/numeric/odeint/CHANGELOG +++ /dev/null @@ -1,9 +0,0 @@ -odeint 2.1 - -* versioning system -* generation functions -* bugfixing - -odeint 2.2 (still running) - -* removing same_size and resize from state_wrapper into separate functions diff --git a/libs/numeric/odeint/README.md b/libs/numeric/odeint/README.md deleted file mode 100644 index 735afd521..000000000 --- a/libs/numeric/odeint/README.md +++ /dev/null @@ -1,3 +0,0 @@ -[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/headmyshoulder/odeint-v2/trend.png)](https://bitdeli.com/free "Bitdeli Badge") - -odeint is a highly flexible library for solving ordinary differential equations. diff --git a/libs/numeric/odeint/doc/Jamfile.v2 b/libs/numeric/odeint/doc/Jamfile.v2 deleted file mode 100644 index 7a7ac95fa..000000000 --- a/libs/numeric/odeint/doc/Jamfile.v2 +++ /dev/null @@ -1,277 +0,0 @@ -# Copyright 2009-2013 Karsten Ahnert -# Copyright 2011-2012 Mario Mulansky -# Copyright 2012 Daniel James -# Copyright 2013 Pascal Germroth -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - - -using quickbook ; -using boostbook ; -using doxygen ; -import modules ; -path-constant here : . ; - -project : requirements - $(BOOST_ROOT)/tools/auto_index/include - ; - -if --enable-index in [ modules.peek : ARGV ] -{ - ECHO "Building the odeint docs with automatic index generation enabled." ; - - using auto-index ; - - project : requirements - - on - on - - # Choose indexing method (separately for html and pdf): - html:on # on (or off) to use internally generated indexes. - # html:generate.index=0 # Don't let the XSL stylesheets generate indexes. - - pdf:off # on (or off) to use internally generated indexes. - # index # Use ... as the XML wrapper. - - pdf:index.on.type=1 # For the native stylesheets to generate the different indexes. - # PDF native index support is probably better for PDFs as then you actually get page numbers. - - odeint.idx # Specifies the name of the index script to load. - ../include - - # Inform Quickbook that there is to be an index(es). - enable_index - ; -} -else -{ - ECHO "Building the odeint docs with automatic index generation disabled. To get an auto-index, try building with --enable-index." ; -} - - - -doxygen reference - : -# [ glob ../include/boost/numeric/odeint/*.hpp ] - [ glob ../include/boost/numeric/odeint/stepper/*.hpp ] - [ glob ../incude/boost/numeric/odeint/stepper/base/*.hpp ] -# [ glob ../include/boost/numeric/odeint/stepper/generation/*.hpp ] - [ glob ../include/boost/numeric/odeint/integrate/*.hpp : ../include/boost/numeric/odeint/integrate/null_observer.hpp ../include/boost/numeric/odeint/integrate/observer_collection.hpp ] - [ glob ../include/boost/numeric/odeint/iterator/*.hpp ] -# [ glob ../include/boost/numeric/odeint/iterator/impl/*.hpp ] -# [ glob ../include/boost/numeric/odeint/algebra/*.hpp ] -# [ glob ../include/boost/numeric/odeint/util/*.hpp ] -# ../include/boost/numeric/odeint.hpp - : - - # Lots of parameters passed to Doxygen. You can see these in the doxygen docs, or the Wizard Expert tab displays them. - # If you have successfuly built your Doxygen docs standalone using the Wizard (strongly recommended as it is much quicker). - # The values in your project's doxyfile are what to put as the Doxygen parameters passed below. - WARNINGS=YES - WARN_LOGFILE=AutoDoxywarnings.log - WARN_IF_UNDOCUMENTED=NO # Default NO but useful if you aim to Doxygen document *all* members. - QUIET=NO - WARN_NO_PARAMDOC=NO # Default no, but YES useful if you aim to document all function parameters. - DOXYFILE_ENCODING=UTF-8 - PROJECT_NAME="odeint" - PROJECT_NUMBER=2.2 - TAB_SIZE=2 - SORT_MEMBER_DOCS=NO - SORT_BRIEF_DOCS=NO - SORT_MEMBERS_CTORS_1ST=NO - EXTRACT_PRIVATE=NO - INLINE_INHERITED_MEMB=YES - INHERIT_DOCS=YES - EXTRACT_STATIC=YES - EXTRACT_ANON_NSPACES=NO - EXTRACT_LOCAL_CLASSES=YES - EXTRACT_LOCAL_METHODS=YES - HIDE_UNDOC_MEMBERS=NO - HIDE_UNDOC_CLASSES=YES - HIDE_FRIEND_COMPOUNDS=NO - #HIDE_INBODY_DOCS=NO - INTERNAL_DOCS=YES - CASE_SENSE_NAMES=NO - HIDE_SCOPE_NAMES=NO - - # Preprocessor settings. - # Some ugly examples of predefined macro calls (from Boost.Units library) :( - "PREDEFINED= \\ - \"BOOST_UNITS_STATIC_CONSTANT(a,b)=static const b a\" \\ - \"BOOST_UNITS_TYPEOF(a)=typeof(a)\" \\ - \"BOOST_PREVENT_MACRO_SUBSTITUTION=\" \\ - \"BOOST_UNITS_HAS_TYPEOF=1\" \\ - \"DOXYGEN_SKIP=1\" " - ENABLE_PREPROCESSING=YES # Evaluates all C-preprocessor directives found in files. - MACRO_EXPANSION=YES # Will expand all macro names. - EXPAND_ONLY_PREDEF=YES # Only predefined macros expanded. See units library for an example. - SEARCH_INCLUDES=YES # Search #include files found. - INLINE_INFO=YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] is inserted in the documentation for inline members. - - SHOW_INCLUDE_FILES=NO # List of the files that are included by a file in the documentation of that file. - REPEAT_BRIEF=YES # Prepend the brief description of a member or function before the detailed description - BRIEF_MEMBER_DESC=YES # Include brief member descriptions after the members that are listed in the file and class - MULTILINE_CPP_IS_BRIEF=YES # Treat a multi-line C++ special comment block (i.e. a block of //! or /// comments) as a brief description. - # May be best to always use \brief and \details to avoid ambiguity? - # STRIP_FROM_PATH=NO # Most useful to leave default to strip just the directory from which Doxygen is run. - # Yes gives the full path, but NO is more useful, only giving enough to be - # CPP_CLI_SUPPORT=NO # unless, most unusually, you are compiled for a 'managed' CLI application. - SHOW_USED_FILES=YES # Default YES to show a list files used to generate documention. - SHOW_DIRECTORIES=YES # Default NO, but useful to show directory heirarchy. - SHOW_FILES=YES # Default YES is to include a tab for a page of files listed. Useful. - SHOW_NAMESPACES=YES # Default YES to include tab for list of namespaces. Useful if you have namespacess other than boost:: - FILE_PATTERNS= # Types of files to be used as input. Default includes *.c *.cc *.cxx *.cpp *.c++ *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp *.h++ *.py - # Might include .qbk? - - RECURSIVE=YES # Search recursively down subdirectories. - EXCLUDE= # Files or directories that should be excluded from INPUT source files. - # Headers and footers are actually rather attractive, - # HTML_HEADER="doxygen/checks_doxygen_header.html" # A sample including a draft stamp and 'Not_Yet_In_Boost' logo. - # Take care that if you use this (recommended), you need to ensure that the html - # HTML_FOOTER="doxygen/checks_doxygen_footer.html" # This is very useful to add copyright, date of revision, versioning etc. - - # A custom stylesheet is also useful, as the default syntax coloring is 'unusual' ;-) - HTML_STYLESHEET="doxygen/doxygen.css" # Placed in the doxygen directory, - # this will change to your choice of C++ syntax coloring when viewing source from Doxygen. - # Users can place (or edit) their own personal choice CSS file here. - - # Default is just Reference but you can provide your own title for reference section here. - "boost.doxygen.reftitle=odeint Reference" -; - - -xml odeint - : - odeint.qbk - : -; - -boostbook standalone - : - odeint - : - - # Path for links to Boost: - #boost.root=\$(local-boost-root) # Link to Boost logo boost.png - # Links are relative and trying to make absolute does NOT work. - # And remember that all links MUST (unless in quotes) use backslash, not forward that is trip char. - - boost.root=../../../../.. # OK but link to I:/boost_trunk/boost.png - - # Also control links to admonitions, so need to set separately. - #boost.root=../../../../../../../boost_1_47_0 # OK file:///I:/boost_1_48_0/boost.png - # Quickbook [@boost:/boost/units/detail/utility.hpp] should make it relative to xsl parameter boost.root. - - # Use the your own local Boost stylesheet: - # html.stylesheet=../html/boostbook.css - - # Some general style settings: - # see http://docbook.sourceforge.net/release/xsl/current/doc/html/index.html - table.footnote.number.format=1 # Identifies the format used for footnote numbers in tables. - footnote.number.format=1 # Identifies the format used for text footnote numbers. - - # Default to not including the Boost logo in the navbar, when one expressly asks to include the navbar. - # Boost jamroot now includes - # Default to not include a navbar. - #nav.layout=none # No navigation bar (home, prev, next). - # defining creates a runtime error: Global parameter nav.layout already defined - #nav.layout=horizontal # to get a horizontal navigation bar (you probably DO want this). - - boost.image.src=logo.jpg # - boost.image.width=294 # Width of logo in pixels. - boost.image.height=127 # Height of logo in pixels. - - - # HTML options: - # ------------ - navig.graphics=1 # Use graphics not text for navigation. - chunk.section.depth=2 # How far down we chunk nested sections, basically all of them. - chunk.first.sections=1 # Don't put the first section on the same page as the TOC. - toc.section.depth=2 # How far down sections get TOCs. - toc.max.depth=2 # Max depth in each TOC. - generate.section.toc.level=3 # How far down we go with TOCs. - - #html:admon.graphics.extension=".png" # default type for admonitions (important, warning, note ...) - #html:admon.graphics.path=$(nav-images)/ # path to admonition (warning, note...) image (.png) files. - - # http://docbook.sourceforge.net/release/images/draft.png - # but use a local copy of draft.png. - - # PDF Options: - # ----------- - # TOC Generation - fop1.extensions=0 # DISable extensions for FOP version 0.90 and later . - pdf:fop.extensions=0 # DISable extensions for FOP version 0.20.5 and earlier. - pdf:xep.extensions=1 # Use XEP extension- PDF bookmarks, document information and better index processing. - - # No indent on body text: - pdf:body.start.indent=0pt # - pdf:paper.type=A4 # Paper type = A4 - # http://xml.resource.org/public/rfc/html/rfc2346.html - # Making Postscript and PDF International, J Palme, RFC 2346 recommends - # If you are using US letter paper format, ensure that both left and right margins are at least 21 mm (0.8 in). - # If you are using A4 paper, ensure that both the top and bottom margins are at least 33 mm (1.3 in). - # Margins sizes: - #pdf:page.margin.top=1.3in - #pdf:page.margin.inner=0.8in - #pdf:page.margin.bottom=1.3in - #pdf:page.margin.outer=0.8in - - # http://docbook.sourceforge.net/release/xsl/current/doc/index.html - # DocBook XSL Stylesheets: Reference Documentation. - - # Yes, we want graphics for admonishments: - admon.graphics=1 - # Set these one for PDF generation *only*: - # In PDF format, default PNG graphics are awful, so better use SVG images (type .svg) instead. - pdf:admon.graphics.extension=".svg" # - pdf:use.role.for.mediaobject=1 # Use print role on next line. - pdf:preferred.mediaobject.role=print # pdf role is to be printed. - pdf:img.src.path=$(here)/html/ # Path of image (.svg) files. (Note trailing /) ? - #pdf:admon.graphics.path=$(nav_images)/ # path to admonition (warning, note...) image (.svg) files. - #pdf:draft.mode="yes" # Yes if draft watermark wanted! - #pdf:draft.watermark.image="draft.png" # Watermark (local copy). - #pdf:draft.watermark.image=http://docbook.sourceforge.net/release/images/draft.png # Watermark. - - reference # Doxygen reference section - # pdf-install # final pdf - # png-install # Boost standard icons in both png - # svg-install # and svg. -; - - -# To install a copy of 'master' boostbook.css and logo. -# install html : ../../../doc/html/boostbook.css ; -# install ../ : ../../../boost.png ; - - - -# Install (copy) the 'master' copy of boostbook Cascading Style sheet -# from your current Boost-root to the /doc/html folder. -# path-constant boost-root : [ modules.peek : BOOST ] ; -# install css-install : $(boost-root)/doc/src/boostbook.css : html ; - -# path-constant boost-root : [ modules.peek : BOOST ] ; - - -# Install (copy) the 'master' copies of all icon images (both PNG and SVG) -# and the Boost logo from your current Boost-root -# to the local /doc/html/images folder so that html is complete and standalone. -# install png-install : [ glob $(boost-root)/doc/src/images/*.png $(boost-root)/boost.png ] : html/images ; -# install svg-install : [ glob $(boost-root)/doc/src/images/*.svg ] : html/images ; - -# install unordered_pdf : standalone/pdf : . ; -# explicit unordered_pdf ; -# The explicit rule is there so that it's only installed when the target is explicitly named. - -# Effectively copies the file from \bin folder to the \doc folder. -# install pdf-install : standalone : . PDF ; -# But will not work as expected if doxygen and/or autoindex is used -# because a modified pdf file is created, so this command below -# will rename the file to the expected filename, here quick_auto_dox_index.pdf. -# . means installed in same place as this jamfile, /doc. - -install pdfinstall : standalone : PDF . odeint.pdf ; - -install callouts : [ glob src/images/callouts/*.png ] : html/images/callouts ; diff --git a/libs/numeric/odeint/doc/acknowledgements.qbk b/libs/numeric/odeint/doc/acknowledgements.qbk deleted file mode 100644 index 90530b179..000000000 --- a/libs/numeric/odeint/doc/acknowledgements.qbk +++ /dev/null @@ -1,37 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2012 Mario Mulansky - - 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) -=============================================================================/] - - -[section Acknowledgments] - - -[/ - -* Steven Watanabe for managing the Boost review process. -* All people who participated in the odeint review process on the Boost mailing list. -* Paul Bristow for helping with the documentation. -* The Google Summer Of Code (GSOC) program for funding and Andrew Sutton for supervising us during the GSOC and for lots of useful discussions and feedback about many implementation details.. -* Joachim Faulhaber for motivating us to participate in the Boost review process and many detailed comments about the library. -* All users of odeint. They are the main motivation for our efforts. - - -[h3 Contributers] - -* Andreas Angelopoulos implemented the sparse matrix implicit Euler stepper using the MTL4 library. -* Rajeev Singh implemented the stiff Van der Pol oscillator example. -* Sylwester Arabas improved the documentation. -* Denis Demidov provided the adaption to the VexCL and Viennacl libraries. -* Christoph Koke provided improved binders. -* Lee Hodgkinson provided the black hole example. -] - - -[endsect] diff --git a/libs/numeric/odeint/doc/concepts.qbk b/libs/numeric/odeint/doc/concepts.qbk deleted file mode 100644 index 9adfd081e..000000000 --- a/libs/numeric/odeint/doc/concepts.qbk +++ /dev/null @@ -1,27 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011 Mario Mulansky - - 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) -=============================================================================/] - - -[section:concepts Concepts] -[# odeint.concepts] - -[include concepts/system.qbk] -[include concepts/second_order_system.qbk] -[include concepts/symplectic_system.qbk] -[include concepts/implicit_system.qbk] -[include concepts/stepper.qbk] -[include concepts/error_stepper.qbk] -[include concepts/controlled_stepper.qbk] -[include concepts/dense_output_stepper.qbk] -[include concepts/state_algebra_operations.qbk] -[include concepts/state_wrapper.qbk] - -[endsect] \ No newline at end of file diff --git a/libs/numeric/odeint/doc/concepts/controlled_stepper.qbk b/libs/numeric/odeint/doc/concepts/controlled_stepper.qbk deleted file mode 100644 index 20afa8540..000000000 --- a/libs/numeric/odeint/doc/concepts/controlled_stepper.qbk +++ /dev/null @@ -1,74 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011 Mario Mulansky - - 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) -=============================================================================/] - - -[section Controlled Stepper] - -This concept specifies the interface a controlled stepper has to fulfill to be used within __integrate_functions. - -[heading Description] - -A controlled stepper following this Controlled Stepper concept provides the possibility to perform one step of the solution /x(t)/ of an ODE with step-size /dt/ to obtain /x(t+dt)/ with a given step-size /dt/. -Depending on an error estimate of the solution the step might be rejected and a smaller step-size is suggested. - -[heading Associated types] - -* ''''''[*state_type]'''''' -''''''`Stepper::state_type`'''''' -''''''The type characterizing the state of the ODE, hence ['x].'''''' - -* ''''''[*deriv_type]'''''' -''''''`Stepper::deriv_type`'''''' -''''''The type characterizing the derivative of the ODE, hence ['d x/dt].'''''' - -* ''''''[*time_type]'''''' -''''''`Stepper::time_type`'''''' -''''''The type characterizing the dependent variable of the ODE, hence the time ['t].'''''' - -* ''''''[*value_type]'''''' -''''''`Stepper::value_type`'''''' -''''''The numerical data type which is used within the stepper, something like `float`, `double`, `complex< double >`.'''''' - -* ''''''[*stepper_category]'''''' -''''''`Stepper::stepper_category`'''''' -''''''A tag type characterizing the category of the stepper. This type must be convertible to `controlled_stepper_tag`.'''''' - - - -[heading Notation] - -[variablelist - [[`ControlledStepper`] [A type that is a model of Controlled Stepper]] - [[`State`] [A type representing the state /x/ of the ODE]] - [[`Time`] [A type representing the time /t/ of the ODE]] - [[`stepper`] [An object of type `ControlledStepper`]] - [[`x`] [Object of type `State`]] - [[`t`, `dt`] [Objects of type `Time`]] - [[`sys`] [An object defining the ODE, should be a model of __system, __symplectic_system, __simple_symplectic_system or __implicit_system.]] -] - -[heading Valid Expressions] - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Do step] [``stepper.try_step( sys , x , t , dt )``] [`controlled_step_result`] [Tries one step of step size `dt`. If the step was successful, `success` is returned, the resulting state is written to `x`, the new time is stored in `t` and `dt` now contains a new (possibly larger) step-size for the next step. If the error was too big, `rejected` is returned and the results are neglected - `x` and `t` are unchanged and `dt` now contains a reduced step-size to be used for the next try.] ] - [/ [Do step with reference] [`stepper.try_step( boost::ref(sys) , x , t , dt )`] [`void`] [Same as above with `System` as reference] ] -] - -[heading Models] - -* `controlled_error_stepper< runge_kutta_cash_karp54 >` -* `controlled_error_stepper_fsal< runge_kutta_dopri5 >` -* `controlled_error_stepper< runge_kutta_fehlberg78 >` -* `rosenbrock4_controller` -* `bulirsch_stoer` - -[endsect] \ No newline at end of file diff --git a/libs/numeric/odeint/doc/concepts/dense_output_stepper.qbk b/libs/numeric/odeint/doc/concepts/dense_output_stepper.qbk deleted file mode 100644 index 19d3a256c..000000000 --- a/libs/numeric/odeint/doc/concepts/dense_output_stepper.qbk +++ /dev/null @@ -1,85 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright (c) 2009-2013 Karsten Ahnert - Copyright (c) 2009-2013 Mario Mulansky - - 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) -=============================================================================/] - - - -[section Dense Output Stepper] - -This concept specifies the interface a dense output stepper has to fulfill to be used within __integrate_functions. - -[heading Description] -A dense output stepper following this Dense Output Stepper concept provides the possibility to perform a single step of the solution /x(t)/ of an ODE to obtain /x(t+dt)/. -The step-size `dt` might be adjusted automatically due to error control. -Dense output steppers also can interpolate the solution to calculate the state /x(t')/ at any point /t <= t' <= t+dt/. - -[heading Associated types] - -* ''''''[*state_type]'''''' -''''''`Stepper::state_type`'''''' -''''''The type characterizing the state of the ODE, hence ['x].'''''' - -* ''''''[*deriv_type]'''''' -''''''`Stepper::deriv_type`'''''' -''''''The type characterizing the derivative of the ODE, hence ['d x/dt].'''''' - -* ''''''[*time_type]'''''' -''''''`Stepper::time_type`'''''' -''''''The type characterizing the dependent variable of the ODE, hence the time ['t].'''''' - -* ''''''[*value_type]'''''' -''''''`Stepper::value_type`'''''' -''''''The numerical data type which is used within the stepper, something like `float`, `double`, `complex< double >`.'''''' - -* ''''''[*stepper_category]'''''' -''''''`Stepper::stepper_category`'''''' -''''''A tag type characterizing the category of the stepper. This type must be convertible to `dense_output_stepper_tag`.'''''' - - -[heading Notation] - -[variablelist - [[`Stepper`] [A type that is a model of Dense Output Stepper]] - [[`State`] [A type representing the state /x/ of the ODE]] - [[`stepper`] [An object of type `Stepper`]] - [[`x0`, `x`] [Object of type `State`]] - [[`t0`, `dt0`, `t`] [Objects of type `Stepper::time_type`]] - [[`sys`] [An object defining the ODE, should be a model of __system, __symplectic_system, __simple_symplectic_system or __implicit_system.]] -] - -[heading Valid Expressions] - -[table - [[Name] [Expression] [Type] [Semantics]] - - [[Initialize integration] [`stepper.initialize( x0 , t0 , dt0 )`] [void] [Initializes the stepper with initial values `x0`, `t0` and `dt0`.]] - - [[Do step] [`stepper.do_step( sys )`] [`std::pair< Stepper::time_type , Stepper::time_type >`] [Performs one step using the ODE defined by `sys`. The step-size might be changed internally due to error control. This function returns a pair containing `t` and `t+dt` representing the interval for which interpolation can be performed.] ] - - [/ [Do step with reference] [`stepper.do_step( boost::ref( sys ) )`] [`std::pair< Stepper::time_type , Stepper::time_type >`] [Same as above with `System` as reference] ] - - [[Do interpolation] [`stepper.calc_state( t_inter , x )`] [`void`] [Performs the interpolation to calculate /x(t[sub inter]/) where /t <= t[sub inter] <= t+dt/.]] - - [[Get current time] [`stepper.current_time()`] [`const Stepper::time_type&`] [Returns the current time /t+dt/ of the stepper, that is the end time of the last step and the starting time for the next call of `do_step`]] - - [[Get current state] [`stepper.current_state()`] [`const Stepper::state_type&`] [Returns the current state of the stepper, that is /x(t+dt)/, the state at the time returned by `stepper.current_time()`]] - - [[Get current time step] [`stepper.current_time_step()`] [`const - Stepper::time_type&`] [Returns the current step size of the stepper, that is - /dt/]] -] - -[heading Models] - -* `dense_output_controlled_explicit_fsal< controlled_error_stepper_fsal< runge_kutta_dopri5 >` -* `bulirsch_stoer_dense_out` -* `rosenbrock4_dense_output` - -[endsect] diff --git a/libs/numeric/odeint/doc/concepts/error_stepper.qbk b/libs/numeric/odeint/doc/concepts/error_stepper.qbk deleted file mode 100644 index 8ebfde97d..000000000 --- a/libs/numeric/odeint/doc/concepts/error_stepper.qbk +++ /dev/null @@ -1,101 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2013 Karsten Ahnert - Copyright 2011 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - - - -[section Error Stepper] - -This concepts specifies the interface an error stepper has to fulfill to be used within a ControlledErrorStepper. An error stepper must always fulfill the stepper concept. This can trivially implemented by - -`` -template< class System > -error_stepper::do_step( System sys , state_type &x , time_type t , time_type dt ) -{ - state_type xerr; - // allocate xerr - do_step( sys , x , t , dt , xerr ); -} -`` - -[heading Description] - -An error stepper following this Error Stepper concept is capable of doing one step of the solution /x(t)/ of an ODE with step-size /dt/ to obtain /x(t+dt)/ and also computing an error estimate ['x[sub err]] of the result. -Error Steppers can be Runge-Kutta steppers, symplectic steppers as well as implicit steppers. -Based on the stepper type, the ODE is defined as __system, __symplectic_system, __simple_symplectic_system or __implicit_system. - -[heading Refinement of] - -* DefaultConstructable -* CopyConstructable -* Stepper - -[heading Associated types] - -* ''''''[*state_type]'''''' -''''''`Stepper::state_type`'''''' -''''''The type characterizing the state of the ODE, hence ['x].'''''' - -* ''''''[*deriv_type]'''''' -''''''`Stepper::deriv_type`'''''' -''''''The type characterizing the derivative of the ODE, hence ['d x/dt].'''''' - -* ''''''[*time_type]'''''' -''''''`Stepper::time_type`'''''' -''''''The type characterizing the dependent variable of the ODE, hence the time ['t].'''''' - -* ''''''[*value_type]'''''' -''''''`Stepper::value_type`'''''' -''''''The numerical data type which is used within the stepper, something like `float`, `double`, `complex< double >`.'''''' - -* ''''''[*order_type]'''''' -''''''`Stepper::order_type`'''''' -''''''The type characterizing the order of the ODE, typically `unsigned short`.'''''' - -* ''''''[*stepper_category]'''''' -''''''`Stepper::stepper_category`'''''' -''''''A tag type characterizing the category of the stepper. This type must be convertible to `error_stepper_tag`.'''''' - - -[heading Notation] - -[variablelist - [[`ErrorStepper`] [A type that is a model of Error Stepper]] - [[`State`] [A type representing the state /x/ of the ODE]] - [[`Error`] [A type representing the error calculated by the stepper, usually same as `State`]] - [[`Time`] [A type representing the time /t/ of the ODE]] - [[`stepper`] [An object of type `ErrorStepper`]] - [[`x`] [Object of type `State`]] - [[`xerr`] [Object of type `Error`]] - [[`t`, `dt`] [Objects of type `Time`]] - [[`sys`] [An object defining the ODE, should be a model of either __system, __symplectic_system, __simple_symplectic_system or __implicit_system.]] -] - -[heading Valid Expressions] - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Get the stepper order] [`stepper.order()`] [`order_type`] [Returns the order of the stepper for one step without error estimation.]] - [[Get the stepper order] [`stepper.stepper_order()`] [`order_type`] [Returns the order of the stepper for one error estimation step which is used for error calculation.]] - [[Get the error order] [`stepper.errorr_order()`] [`order_type`] [Returns the order of the error step which is used for error calculation.]] - [[Do step] [`stepper.do_step( sys , x , t , dt )`] [`void`] [Performs one step of step size `dt`. The newly obtained state is written in-place to `x`.] ] - [[Do step with error estimation] [`stepper.do_step( sys , x , t , dt , xerr )`] [`void`] [Performs one step of step size `dt` with error estimation. The newly obtained state is written in-place to `x` and the estimated error to `xerr`.] ] - [/ [Do step with reference] [`stepper.do_step( boost::ref(sys) , x , t , dt , xerr )`] [`void`] [Performs one step of step size `dt`. The newly obtained state is written in-place to `x` and the estimated error to `xerr`.] ] -] - -[heading Models] - -* `runge_kutta_cash_karp54` -* `runge_kutta_dopri5` -* `runge_kutta_fehlberg78` -* `rosenbrock4` - -[endsect] diff --git a/libs/numeric/odeint/doc/concepts/implicit_system.qbk b/libs/numeric/odeint/doc/concepts/implicit_system.qbk deleted file mode 100644 index e88902314..000000000 --- a/libs/numeric/odeint/doc/concepts/implicit_system.qbk +++ /dev/null @@ -1,43 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011 Mario Mulansky - Copyright 2011-2012 Karsten Ahnert - - 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) -=============================================================================/] - - - -[section Implicit System] - -[heading Description] - -This concept describes how to define a ODE that can be solved by an implicit routine. -Implicit routines need not only the function /f(x,t)/ but also the Jacobian /df/dx = A(x,t)/. -/A/ is a matrix and implicit routines need to solve the linear problem /Ax = b/. -In odeint this is implemented with use of __ublas, therefore, the ['state_type] implicit routines is ['ublas::vector] and the matrix is defined as ['ublas::matrix]. - -[heading Notation] - -[variablelist - [[`System`] [A type that is a model of `Implicit System`]] - [[`Time`] [A type representing the time of the ODE]] - [[`sys`] [An object of type `System`]] - [[`x`] [Object of type ublas::vector]] - [[`dxdt`] [Object of type ublas::vector]] - [[`jacobi`] [Object of type ublas::matrix]] - [[`t`] [Object of type `Time`]] -] - -[heading Valid Expressions] - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Calculate ['dx/dt := f(x,t)]] [`sys.first( x , dxdt , t )`] [`void`] [Calculates `f(x,t)`, the result is stored into dxdt] ] - [[Calculate ['A := df/dx (x,t)]] [`sys.second( x , jacobi , t )`] [`void`] [Calculates the Jacobian of /f/ at /x/,/t/, the result is stored into `jacobi`] ] -] - -[endsect] \ No newline at end of file diff --git a/libs/numeric/odeint/doc/concepts/second_order_system.qbk b/libs/numeric/odeint/doc/concepts/second_order_system.qbk deleted file mode 100644 index 9ca900965..000000000 --- a/libs/numeric/odeint/doc/concepts/second_order_system.qbk +++ /dev/null @@ -1,44 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright (c) 2009-2013 Karsten Ahnert - Copyright (c) 2009-2013 Mario Mulansky - - 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) -=============================================================================/] - - -[section Second Order System] - -[heading Description] - -The Second Order System concept models the algorithmic implementation of the rhs for steppers requirering the second order -derivative, hence the r.h.s. of the ODE ['x'' = f(x,x',t)]. The only requirement for this concept is that it should be callable -with a specific parameter syntax (see below). A Second Order System is typically implemented as a function or a functor. -Systems fulfilling this concept are required by the Velocity Verlet method. - -[heading Notation] - -[variablelist - [[`System`] [A type that is a model of Second Order System]] - [[`Space`] [A type representing the state /x/ of the ODE]] - [[`Velocity`] [A type representing the derivative /x'/ of the ODE]] - [[`Acceleration`] [A type representing the second order derivative /x''/ of the ODE]] - [[`Time`] [A type representing the time]] - [[`sys`] [An object of type `System`]] - [[`x`] [Object of type `Space`]] - [[`v`] [Object of type `Velocity`]] - [[`a`] [Object of type `Acceleration`]] - [[`t`] [Object of type `Time`]] -] - -[heading Valid expressions] - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Calculate ['x'' := f(x,x',t)]] [`sys( x , v , a , t )`] [`void`] [Calculates f(x,x',t), the result is stored into a.] ] -] - -[endsect] \ No newline at end of file diff --git a/libs/numeric/odeint/doc/concepts/state_algebra_operations.qbk b/libs/numeric/odeint/doc/concepts/state_algebra_operations.qbk deleted file mode 100644 index d92bb8395..000000000 --- a/libs/numeric/odeint/doc/concepts/state_algebra_operations.qbk +++ /dev/null @@ -1,126 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011 Mario Mulansky - Copyright 2012 Karsten Ahnert - Copyright 2013 Pascal Germroth - - 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) -=============================================================================/] - - - -[section State Algebra Operations] - -[note The following does not apply to implicit steppers like implicit_euler or Rosenbrock 4 as there the `state_type` can not be changed from `ublas::vector` and no algebra/operations are used.] - -[heading Description] - -The `State`, `Algebra` and `Operations` together define a concept describing how the mathematical vector operations required for the stepper algorithms are performed. -The typical vector operation done within steppers is - -['*y* = __Sigma __alpha[sub i] [*x[sub i]]]. - -The `State` represents the state variable of an ODE, usually denoted with /x/. -Algorithmically, the state is often realized as a `vector< double >` or `array< double , N >`, however, the genericity of odeint enables you to basically use anything as a state type. -The algorithmic counterpart of such mathematical expressions is divided into two parts. -First, the `Algebra` is used to account for the vector character of the equation. -In the case of a `vector` as state type this means the `Algebra` is responsible for iteration over all vector elements. -Second, the `Operations` are used to represent the actual operation applied to each of the vector elements. -So the `Algebra` iterates over all elements of the `State`s and calls an operation taken from the `Operations` for each element. -This is where `State`, `Algebra` and `Operations` have to work together to make odeint running. -Please have a look at the `range_algebra` and `default_operations` to see an example how this is implemented. - -In the following we describe how `State`, `Algebra` and `Operations` are used together within the stepper implementations. - -[section Operations] - -[heading Notation] - -[variablelist - [[`Operations`] [The operations type]] - [/[`Time`] [A type representing the time type of steppers]] - [[`Value1`, ... , `ValueN`] [Types representing the value or time type of stepper]] - [[`Scale`] [Type of the scale operation]] - [[`scale`] [Object of type `Scale`]] - [[[^ScaleSum['N]]] [Type that represents a general scale_sum operation, [^/N/] should be replaced by a number from 1 to 14.]] - [[[^scale_sum['N]]] [Object of type [^ScaleSum['N]], [^/N/] should be replaced by a number from 1 to 14.]] - [[`ScaleSumSwap2`] [Type of the scale sum swap operation]] - [[`scale_sum_swap2`] [Object of type `ScaleSumSwap2`]] - [[`a1, a2, ...`] [Objects of type `Value1`, `Value2`, ...]] - [[`y, x1, x2, ...`] [Objects of `State`'s value type]] -] - -[heading Valid Expressions] - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Get scale operation] [`Operations::scale< Value >`] [`Scale`] [Get `Scale` from `Operations`]] - [[`Scale` constructor] [`Scale< Value >( a )`] [`Scale`] [Constructs a `Scale` object]] - [[`Scale` operation] [`scale( x )`] [`void`] [Calculates `x *= a`]] - [[Get general `scale_sum` operation] [[^Operations::scale_sum['N]< Value1 , ... , ValueN >]] [[^ScaleSum['N]]] [Get the [^ScaleSum['N]] type from `Operations`, [^/N/] should be replaced by a number from 1 to 14.]] - [[`scale_sum` constructor] [[^ScaleSum['N]< Value1 , ... , ValueN >( a1 , ... , aN )]] [[^ScaleSum['N]]] [Constructs a `scale_sum` object given [^/N/] parameter values with [^/N/] between 1 and 14.]] - [[`scale_sum` operation] [[^scale_sum['N]( y , x1 , ... , xN )]] [`void`] [Calculates `y = a1*x1 + a2*x2 + ... + aN*xN`. Note that this is an [^/N/+1]-ary function call.]] - [[Get scale sum swap operation] [`Operations::scale_sum_swap2< Value1 , Value2 >`] [`ScaleSumSwap2`] [Get scale sum swap from operations]] - [[`ScaleSumSwap2` constructor] [`ScaleSumSwap2< Value1 , Value2 >( a1 , a2 )`] [`ScaleSumSwap2`] [Constructor]] - [[`ScaleSumSwap2` operation] [`scale_sum_swap2( x1 , x2 , x3 )`] [`void`] [Calculates `tmp = x1`, `x1 = a1*x2 + a2*x3` and `x2 = tmp`.]] -] - -[endsect] - -[section Algebra] - -[heading Notation] - -[variablelist - [[`State`] [The state type]] - [[`Algebra`] [The algebra type]] - [[[^Operation['N]]] [An [^/N/]-ary operation type, [^/N/] should be a number from 1 to 14.]] - [[`algebra`] [Object of type `Algebra`]] - [[[^operation['N]]] [Object of type [^Operation['N]]]] - [[`y, x1, x2, ...`] [Objects of type `State`]] -] - - -[heading Valid Expressions] - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Vector Operation with arity 2] [`algebra.for_each2( y , x , operation2 )`] [void] [Calls `operation2( y_i , x_i )` for each element `y_i` of `y` and `x_i` of `x`.]] - [[Vector Operation with arity 3] [`algebra.for_each3( y , x1 , x2 , operation3 )`] [void] [Calls `operation3( y_i , x1_i , x2_i )` for each element `y_i` of `y` and `x1_i` of `x1` and `x2_i` of `x2`.]] - [[Vector Operation with arity [^/N/]] [[^algebra.for_each['N]( y , x1 , ... , xN , operation['N] )]] [void] [Calls [^operation['N]( y_i , x1_i , ... , xN_i )] for each element `y_i` of `y` and `x1_i` of `x1` and so on. [^/N/] should be replaced by a number between 1 and 14.]] -] - -[endsect] - -[section Pre-Defined implementations] - -As standard configuration odeint uses the `range_algebra` and `default_operations` which suffices most situations. -However, a few more possibilities exist either to gain better performance or to ensure interoperability with other libraries. -In the following we list the existing `Algebra`/`Operations` configurations that can be used in the steppers. - -[table - [[`State`] [`Algebra`] [`Operations`] [Remarks]] - [[Anything supporting __boost_range, like `std::vector`, `std::list`, `boost::array`,... based on a `value_type` that supports operators +,* (typically `double`)] [`range_algebra`] [`default_operations`] [Standard implementation, applicable for most typical situations.]] - [[`boost::array` based on a `value_type` that supports operators +,*] [`array_algebra`] [`default_operations`] [Special implementation for boost::array with better performance than `range_algebra`]] - [[Anything that defines operators + within itself and * with scalar (Mathematically spoken, anything that is a vector space).] [`vector_space_algebra`] [`default_operations`] [For the use of __controlled_stepper, the template `vector_space_reduce` has to be instantiated.]] - [[`thrust::device_vector`, `thrust::host_vector`] [`thrust_algebra`] [`thrust_operations`] [For running odeint on CUDA devices by using __thrust]] - [[Any RandomAccessRange] [`openmp_range_algebra`] [`default_operations`] [OpenMP-parallelised range algebra]] - [[`openmp_state`] [`openmp_algebra`] [`default_operations`] [OpenMP-parallelised algebra for split data]] - [[`boost::array` or anything which allocates the elements in a C-like manner] [`vector_space_algebra`] [`mkl_operations`] [Using the __intel_mkl in odeint for maximum performance. Currently, only the RK4 stepper is supported.]] -] - -[endsect] - -[section Example expressions] - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Vector operation] [`algebra.for_each3( y , x1 , x2 , Operations::scale_sum2< Value1 , Value2 >( a1 , a2 ) )`] [void] [Calculates ['*y* = a1 *x1* + a2 *x2*]]] -] - -[endsect] - -[endsect] \ No newline at end of file diff --git a/libs/numeric/odeint/doc/concepts/state_wrapper.qbk b/libs/numeric/odeint/doc/concepts/state_wrapper.qbk deleted file mode 100644 index 768671db5..000000000 --- a/libs/numeric/odeint/doc/concepts/state_wrapper.qbk +++ /dev/null @@ -1,39 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011 Mario Mulansky - Copyright 2012 Karsten Ahnert - - 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) -=============================================================================/] - - -[section State Wrapper] - -[heading Description] - -The `State Wrapper` concept describes the way odeint creates temporary state objects to store intermediate results within the stepper's `do_step` methods. - -[heading Notation] - -[variablelist - [[`State`] [A type that is the `state_type` of the ODE]] - [[`WrappedState`] [A type that is a model of State Wrapper for the state type `State`.]] - [[`x`] [Object of type `State`]] - [[`w`] [Object of type `WrappedState`]] -] - -[heading Valid Expressions] - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Get resizeability] [`is_resizeable< State >`] [`boost::false_type` or `boost::true_type`] [Returns `boost::true_type` if the `State` is resizeable, `boost::false_type` otherwise.]] - [[Create `WrappedState` type] [`state_wrapper< State >`] [`WrappedState`] [Creates the type for a `WrappedState` for the state type `State`]] - [[Constructor] [`WrappedState()`] [`WrappedState`] [Constructs a state wrapper with an empty state]] - [[Copy Constructor] [`WrappedState( w )`] [`WrappedState`] [Constructs a state wrapper with a state of the same size as the state in `w`]] - [[Get state] [`w.m_v`] [`State`] [Returns the `State` object of this state wrapper.]] -] - -[endsect] \ No newline at end of file diff --git a/libs/numeric/odeint/doc/concepts/stepper.qbk b/libs/numeric/odeint/doc/concepts/stepper.qbk deleted file mode 100644 index a23c027e5..000000000 --- a/libs/numeric/odeint/doc/concepts/stepper.qbk +++ /dev/null @@ -1,93 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - - -[section Stepper] - -This concepts specifies the interface a simple stepper has to fulfill to be used within the __integrate_functions. - -[heading Description] - -The basic stepper concept. -A basic stepper following this Stepper concept is able to perform a single step of the solution /x(t)/ of an ODE to obtain /x(t+dt)/ using a given step size /dt/. -Basic steppers can be Runge-Kutta steppers, symplectic steppers as well as implicit steppers. -Depending on the actual stepper, the ODE is defined as __system, __symplectic_system, __simple_symplectic_system or __implicit_system. -Note that all error steppers are also basic steppers. - -[heading Refinement of] - -* DefaultConstructable -* CopyConstructable - - -[heading Associated types] - -* ''''''[*state_type]'''''' -''''''`Stepper::state_type`'''''' -''''''The type characterizing the state of the ODE, hence ['x].'''''' - -* ''''''[*deriv_type]'''''' -''''''`Stepper::deriv_type`'''''' -''''''The type characterizing the derivative of the ODE, hence ['d x/dt].'''''' - -* ''''''[*time_type]'''''' -''''''`Stepper::time_type`'''''' -''''''The type characterizing the dependent variable of the ODE, hence the time ['t].'''''' - -* ''''''[*value_type]'''''' -''''''`Stepper::value_type`'''''' -''''''The numerical data type which is used within the stepper, something like `float`, `double`, `complex< double >`.'''''' - -* ''''''[*order_type]'''''' -''''''`Stepper::order_type`'''''' -''''''The type characterizing the order of the ODE, typically `unsigned short`.'''''' - -* ''''''[*stepper_category]'''''' -''''''`Stepper::stepper_category`'''''' -''''''A tag type characterizing the category of the stepper. This type must be convertible to `stepper_tag`.'''''' - - -[heading Notation] - -[variablelist - [[`Stepper`] [A type that is a model of Stepper]] - [[`State`] [A type representing the state /x/ of the ODE]] - [[`Time`] [A type representing the time /t/ of the ODE]] - [[`stepper`] [An object of type `Stepper`]] - [[`x`] [Object of type `State`]] - [[`t`, `dt`] [Objects of type `Time`]] - [[`sys`] [An object defining the ODE. Depending on the Stepper this might be a model of __system, __symplectic_system, __simple_symplectic_system or __implicit_system ]] -] - -[heading Valid Expressions] - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Get the order] [`stepper.order()`] [`order_type`] [Returns the order of the stepper.]] - [[Do step] [`stepper.do_step( sys , x , t , dt )`] [`void`] [Performs one step of step size `dt`. The newly obtained state is written in place in `x`.] ] - - [/ [Do step with reference] [`stepper.do_step( boost::ref(sys) , x , t , dt )`] [`void`] [Performs one step of step size `dt`. The newly obtained state is written in place in `x`.] ] - - [/ [Do step out-of-place] [`stepper.do_step( sys , in , t , out , dt )`] [`void`] [Performs one step. The newly obtained state is written to `out`] ] -] - -[heading Models] - -* `runge_kutta4` -* `euler` -* `runge_kutta_cash_karp54` -* `runge_kutta_dopri5` -* `runge_kutta_fehlberg78` -* `modified_midpoint` -* `rosenbrock4` - -[endsect] diff --git a/libs/numeric/odeint/doc/concepts/symplectic_system.qbk b/libs/numeric/odeint/doc/concepts/symplectic_system.qbk deleted file mode 100644 index e07859739..000000000 --- a/libs/numeric/odeint/doc/concepts/symplectic_system.qbk +++ /dev/null @@ -1,99 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011 Mario Mulansky - Copyright 2011-2012 Karsten Ahnert - - 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) -=============================================================================/] - - -[section Symplectic System] - -[heading Description] - -This concept describes how to define a symplectic system written with generalized coordinate `q` and generalized momentum `p`: - -[' q'(t) = f(p) ] - -[' p'(t) = g(q) ] - -Such a situation is typically found for Hamiltonian systems with a separable Hamiltonian: - -[' H(p,q) = H[sub kin](p) + V(q) ] - -which gives the equations of motion: - -[' q'(t) = dH[sub kin] / dp = f(p) ] - -[' p'(t) = dV / dq = g(q) ] - - -The algorithmic implementation of this situation is described by a pair of callable objects for /f/ and /g/ with a specific parameter signature. -Such a system should be implemented as a std::pair of functions or a functors. -Symplectic systems are used in symplectic steppers like `symplectic_rkn_sb3a_mclachlan`. - -[heading Notation] - -[variablelist - [[`System`] [A type that is a model of SymplecticSystem]] - [[`Coor`] [The type of the coordinate ['q]]] - [[`Momentum`] [The type of the momentum ['p]]] - [[`CoorDeriv`] [The type of the derivative of coordinate ['q']]] - [[`MomentumDeriv`] [The type of the derivative of momentum ['p']]] - [[`sys`] [An object of the type `System`]] - [[`q`] [Object of type Coor]] - [[`p`] [Object of type Momentum]] - [[`dqdt`] [Object of type CoorDeriv]] - [[`dpdt`] [Object of type MomentumDeriv]] -] - -[heading Valid expressions] - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Check for pair] [`boost::is_pair< System >::type`] [`boost::mpl::true_`] [Check if System is a pair]] - [[Calculate ['dq/dt = f(p)]] [`sys.first( p , dqdt )`] [`void`] [Calculates ['f(p)], the result is stored into `dqdt`] ] - [[Calculate ['dp/dt = g(q)]] [`sys.second( q , dpdt )`] [`void`] [Calculates ['g(q)], the result is stored into `dpdt`] ] -] - -[endsect] - - -[section Simple Symplectic System] - -[heading Description] - -In most Hamiltonian systems the kinetic term is a quadratic term in the momentum ['H[sub kin] = p^2 / 2m] and in many cases it is possible to rescale coordinates and set /m=1/ which leads to a trivial equation of motion: - -[' q'(t) = f(p) = p. ] - -while for /p'/ we still have the general form - -[' p'(t) = g(q) ] - -As this case is very frequent we introduced a concept where only the nontrivial equation for /p'/ has to be provided to the symplectic stepper. -We call this concept ['SimpleSymplecticSystem] - -[heading Notation] - -[variablelist - [[System] [A type that is a model of SimpleSymplecticSystem]] - [[Coor] [The type of the coordinate ['q]]] - [[MomentumDeriv] [The type of the derivative of momentum ['p']]] - [[sys] [An object that models System]] - [[q] [Object of type Coor]] - [[dpdt] [Object of type MomentumDeriv]] -] - -[heading Valid Expressions] - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Check for pair] [`boost::is_pair< System >::type`] [`boost::mpl::false_`] [Check if System is a pair, should be evaluated to false in this case.]] - [[Calculate ['dp/dt = g(q)]] [`sys( q , dpdt )`] [`void`] [Calculates ['g(q)], the result is stored into `dpdt`] ] -] - -[endsect] \ No newline at end of file diff --git a/libs/numeric/odeint/doc/concepts/system.qbk b/libs/numeric/odeint/doc/concepts/system.qbk deleted file mode 100644 index d04c998ad..000000000 --- a/libs/numeric/odeint/doc/concepts/system.qbk +++ /dev/null @@ -1,43 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011 Mario Mulansky - Copyright 2011-2012 Karsten Ahnert - - 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) -=============================================================================/] - - -[section System] - -[heading Description] - -The System concept models the algorithmic implementation of the rhs. of the ODE ['x' = f(x,t)]. -The only requirement for this concept is that it should be callable with a specific parameter syntax (see below). -A System is typically implemented as a function or a functor. -Systems fulfilling this concept are required by all Runge-Kutta steppers as well as the Bulirsch-Stoer steppers. -However, symplectic and implicit steppers work with other system concepts, see __symplectic_system and __implicit_system. - -[heading Notation] - -[variablelist - [[`System`] [A type that is a model of System]] - [[`State`] [A type representing the state /x/ of the ODE]] - [[`Deriv`] [A type representing the derivative /x'/ of the ODE]] - [[`Time`] [A type representing the time]] - [[`sys`] [An object of type `System`]] - [[`x`] [Object of type `State`]] - [[`dxdt`] [Object of type `Deriv`]] - [[`t`] [Object of type `Time`]] -] - -[heading Valid expressions] - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Calculate ['dx/dt := f(x,t)]] [`sys( x , dxdt , t )`] [`void`] [Calculates f(x,t), the result is stored into dxdt] ] -] - -[endsect] \ No newline at end of file diff --git a/libs/numeric/odeint/doc/controlled_stepper_table.qbk b/libs/numeric/odeint/doc/controlled_stepper_table.qbk deleted file mode 100644 index e422c434b..000000000 --- a/libs/numeric/odeint/doc/controlled_stepper_table.qbk +++ /dev/null @@ -1,55 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2012 Mario Mulansky - - 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) -=============================================================================/] - -[table Adaptive step size algorithms - [ [Stepper] [Tolerance formula] [Norm] [Step size adaption] ] - [ [`controlled_runge_kutta`] - [ - ['val = || | err[subl i] | / ( __epsilon[subl abs] + __epsilon[subl rel] * ( a[subl x] | x[subl i] | + a[subl dxdt] | | dxdt[subl i] | )|| ] - ] - [['||x|| = max( x[subl i] )]] - [ - ['val > 1 : dt[subl new] = dt[subl current] max( 0.9 pow( val , -1 / ( O[subl E] - 1 ) ) , 0.2 )] - - ['val < 0.5 : dt[subl new] = dt[subl current] min( 0.9 pow( val , -1 / O[subl S] ) , 5 )] - - ['else : dt[subl new] = dt[subl current]] - ] ] - [ [`rosenbrock4_controller`] - [ - ['val = || err[subl i] / ( __epsilon[subl abs] + __epsilon[subl rel] max( | x[subl i] | , | xold[subl i] | ) ) || ] - ] - [['||x||=(__Sigma[subl i] x[subl i][super 2])[super 1/2]]] - [ - ['fac = max( 1 / 6 , min( 5 , pow( val , 1 / 4 ) / 0.9 ) ] - - ['fac2 = max( 1 / 6 , min( 5 , dt[subl old] / dt[subl current] pow( val[super 2] / val[subl old] , 1 / 4 ) / 0.9 ) ] - - ['val > 1 : dt[subl new] = dt[subl current] / fac ] - - ['val < 1 : dt[subl new] = dt[subl current] / max( fac , fac2 ) ] - ] - ] - [ [bulirsch_stoer] [['tol=1/2]] [-] [['dt[subl new] = dt[subl old][super 1/a]]] ] -] - -[/ - -safe = 0.9 , fac1 = 5.0 , fac2 = 1.0 / 6.0 - -value_type fac_pred = ( m_dt_old / dt ) * pow( err * err / m_err_old , 0.25 ) / safe; - fac_pred = std::max( fac2 , std::min( fac1 , fac_pred ) ); - fac = std::max( fac , fac_pred ); - dt_new = dt / fac; - - -fac = max( fac2 , min( fac1 , pow( err , 0.25 ) / safe ) ) -] \ No newline at end of file diff --git a/libs/numeric/odeint/doc/details.qbk b/libs/numeric/odeint/doc/details.qbk deleted file mode 100644 index 5c5c5fd73..000000000 --- a/libs/numeric/odeint/doc/details.qbk +++ /dev/null @@ -1,30 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2012 Mario Mulansky - - 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) -=============================================================================/] - -[section odeint in detail] - -[include details_steppers.qbk] - -[include details_generation_functions.qbk] - -[include details_integrate_functions.qbk] - -[include details_iterators.qbk] - -[include details_state_types_algebras_operations.qbk] - -[include details_boost_ref.qbk] - -[include details_boost_range.qbk] - -[include details_bind_member_functions.qbk] - -[endsect] diff --git a/libs/numeric/odeint/doc/details_bind_member_functions.qbk b/libs/numeric/odeint/doc/details_bind_member_functions.qbk deleted file mode 100644 index 0a10a729c..000000000 --- a/libs/numeric/odeint/doc/details_bind_member_functions.qbk +++ /dev/null @@ -1,36 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2012 Mario Mulansky - - 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) -=============================================================================/] - - -[section Binding member functions] - -[import ../examples/bind_member_functions.cpp] - -Binding member functions to a function objects suitable for odeint system function is not easy, at least in C++03. The usual way of using __boost_bind does not work because of the forwarding problem. odeint provides two `do_step` method which only differ in the const specifiers of the arguments and __boost_bind binders only provide the specializations up to two argument which is not enough for odeint. - -But one can easily implement the according binders themself: - -[ode_wrapper] - -One can use this binder as follows - -[bind_member_function] - -[section Binding member functions in C++11] - -[import ../examples/bind_member_functions_cpp11.cpp] -In C++11 one can use `std::bind` and one does not need to implement the bind themself: - -[bind_member_function_cpp11] - -[endsect] - -[endsect] diff --git a/libs/numeric/odeint/doc/details_boost_range.qbk b/libs/numeric/odeint/doc/details_boost_range.qbk deleted file mode 100644 index 172e3554f..000000000 --- a/libs/numeric/odeint/doc/details_boost_range.qbk +++ /dev/null @@ -1,60 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2012 Karsten Ahnert - Copyright 2012 Mario Mulansky - - 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) -=============================================================================/] - -[section Using boost::range] - -Most steppers in odeint also accept the state give as a range. A range is -sequence of values modeled by a range concept. See __boost_range for an -overview over existing concepts and examples of ranges. This means that the -`state_type` of the stepper need not necessarily be used to call the `do_step` method. - -One use-case for __boost_range in odeint has been shown in __tut_chaotic_system where the state consists of two parts: one for the original system and one for the perturbations. The ranges are used to initialize (solve) only the system part where the perturbation part is not touched, that is a range consisting only of the system part is used. After that the complete state including the perturbations is solved. - -Another use case is a system consisting of coupled units where you want to initialize each unit separately with the ODE of the uncoupled unit. An example is a chain of coupled van-der-Pol-oscillators which are initialized uniformly from the uncoupled van-der-Pol-oscillator. Then you can use __boost_range to solve only one individual oscillator in the chain. - -In short, you can __boost_range to use one state within two system functions which expect states with different sizes. - -An example was given in the __tut_chaotic_system tutorial. Using Boost.Range usually means that your system function needs to adapt to the iterators of Boost.Range. That is, your function is called with a range and you need to get the iterators from that range. This can easily be done. You have to implement your system as a class or a struct and you have to templatize the `operator()`. Then you can use the `range_iterator`-meta function and `boost::begin` and `boost::end` to obtain the iterators of your range: - -`` -class sys -{ - template< class State , class Deriv > - void operator()( const State &x_ , Deriv &dxdt_ , double t ) const - { - typename boost::range_iterator< const State >::type x = boost::begin( x_ ); - typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ ); - - // fill dxdt - } -}; -`` - -If your range is a random access-range you can also apply the bracket operator to the iterator to access the elements in the range: -`` -class sys -{ - template< class State , class Deriv > - void operator()( const State &x_ , Deriv &dxdt_ , double t ) const - { - typename boost::range_iterator< const State >::type x = boost::begin( x_ ); - typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ ); - - dxdt[0] = f1( x[0] , x[1] ); - dxdt[1] = f2( x[0] , x[1] ); - } -}; -`` - -The following two tables show which steppers and which algebras are compatible with __boost_range. -[include range_table.qbk] - -[endsect] diff --git a/libs/numeric/odeint/doc/details_boost_ref.qbk b/libs/numeric/odeint/doc/details_boost_ref.qbk deleted file mode 100644 index ccd084723..000000000 --- a/libs/numeric/odeint/doc/details_boost_ref.qbk +++ /dev/null @@ -1,35 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2012 Karsten Ahnert - Copyright 2012 Mario Mulansky - - 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) -=============================================================================/] - -[section Using boost::ref] - -In odeint all system functions and observers are passed by value. For example, if you call a `do_step` method of a particular stepper or the integration functions, your system and your stepper will be passed by value: - -[c++] -`` -rk4.do_step( sys , x , t , dt ); // pass sys by value -`` - -This behavior is suitable for most systems, especially if your system does not contain any data or only a few parameters. However, in some cases you might contain some large amount of data with you system function and passing them by value is not desired since the data would be copied. - -In such cases you can easily use `boost::ref` (and its relative `boost::cref`) -which passes its argument by reference (or constant reference). odeint will -unpack the arguments and no copying at all of your system object will take place: - -`` -rk4.do_step( boost::ref( sys ) , x , t , dt ); // pass sys as references -`` - -The same mechanism can be used for the observers in the integrate functions. - -[tip If you are using C++11 you can also use `std::ref` and `std::cref`] - -[endsect] diff --git a/libs/numeric/odeint/doc/details_generation_functions.qbk b/libs/numeric/odeint/doc/details_generation_functions.qbk deleted file mode 100644 index 208f3bd73..000000000 --- a/libs/numeric/odeint/doc/details_generation_functions.qbk +++ /dev/null @@ -1,45 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2012 Karsten Ahnert - Copyright 2012 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - -[section Generation functions] - -[import ../examples/generation_functions.cpp] - -In the __tutorial we have learned how we can use the generation functions `make_controlled` and `make_dense_output` to create controlled and dense output stepper from a simple stepper or an error stepper. The syntax of these two functions is very simple: - -[generation_functions_syntax_auto] - -The first two parameters are the absolute and the relative error tolerances and the third parameter is the stepper. Additionally, a second version exists where additionally a maximal step size is supplied which ensures the the step size is not increased above this value. - In C++03 you can infer the type from the `result_of` mechanism: - -[generation_functions_syntax_result_of] - -To use your own steppers with the `make_controlled` or `make_dense_output` you need to specialize two class templates. Suppose your steppers are called `custom_stepper`, `custom_controller` and `custom_dense_output`. Then, the first class you need to specialize is `boost::numeric::get_controller`, a meta function returning the type of the controller: - -[generation_functions_get_controller] - -The second one is a factory class `boost::numeric::odeint::controller_factory` which constructs the controller from the tolerances and the stepper. In our dummy implementation this class is - -[generation_functions_controller_factory] - -This is all to use the `make_controlled` mechanism. Now you can use your controller via - -[generation_functions_example_custom_controller] - -For the dense_output_stepper everything works similar. Here you have to specialize `boost::numeric::odeint::get_dense_output` and `boost::numeric::odeint::dense_output_factory`. These two classes have the same syntax as their relatives `get_controller` and `controller_factory`. - -All controllers and dense-output steppers in odeint can be used with these mechanisms. In the table below you will find, which steppers is constructed from `make_controlled` or `make_dense_output` if applied on a stepper from odeint: - -[include make_controlled_table.qbk] -[include make_dense_output_table.qbk] - -[endsect] diff --git a/libs/numeric/odeint/doc/details_integrate_functions.qbk b/libs/numeric/odeint/doc/details_integrate_functions.qbk deleted file mode 100644 index 47af7ac0c..000000000 --- a/libs/numeric/odeint/doc/details_integrate_functions.qbk +++ /dev/null @@ -1,147 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2012 Mario Mulansky - - 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) -=============================================================================/] - -[def _max_step_checker_ [classref boost::numeric::odeint::max_step_checker `max_step_checker`]] - -[section Integrate functions] - -Integrate functions perform the time evolution of a given ODE from some -starting time ['t[sub 0]] to a given end time ['t[sub 1]] and starting at state ['x[sub 0]] by subsequent calls of a given stepper's `do_step` function. -Additionally, the user can provide an __observer to analyze the state during time evolution, and -a _max_step_checker_ to throw an exception if too many steps are taken between observer calls (i.e. too -small step size). -There are five different integrate functions which have different strategies on when to call the observer function during integration. -All of the integrate functions except `integrate_n_steps` can be called with any stepper following one of the stepper concepts: __stepper , __error_stepper , __controlled_stepper , __dense_output_stepper. -Depending on the abilities of the stepper, the integrate functions make use of step-size control or dense output. - -[heading Equidistant observer calls] - -If observer calls at equidistant time intervals /dt/ are needed, the -`integrate_const` or `integrate_n_steps` function should be used. -We start with explaining `integrate_const`: - -`integrate_const( stepper , system , x0 , t0 , t1 , dt )` - -`integrate_const( stepper , system , x0 , t0 , t1 , dt , observer )` - -`integrate_const( stepper , system , x0 , t0 , t1 , dt , observer , max_step_checker )` - -These integrate the ODE given by `system` with subsequent steps from `stepper`. -Integration start at `t0` and `x0` and ends at some ['t' = t[sub 0] + n dt] with /n/ such that ['t[sub 1] - dt < t' <= t[sub 1]]. -`x0` is changed to the approximative solution ['x(t')] at the end of integration. -If provided, the `observer` is invoked at times ['t[sub 0]], ['t[sub 0] + dt], ['t[sub 0] + 2dt], ... ,['t']. -If provided, the `max_step_checker` counts the number of steps between observer calls and throws a -`no_progress_error` this exceeds some limit (default: 500). -`integrate_const` returns the number of steps performed during the integration. -Note that if you are using a simple __stepper or __error_stepper and want to make exactly `n` steps you should prefer the `integrate_n_steps` function below. - -* If `stepper` is a __stepper or __error_stepper then `dt` is also the step size used for integration and the observer is called just after every step. -* If `stepper` is a __controlled_stepper then `dt` is the initial step size. -The actual step size will change due to error control during time evolution. -However, if an observer is provided the step size will be adjusted such that the algorithm always calculates /x(t)/ at ['t = t[sub 0] + n dt] and calls the observer at that point. -Note that the use of __controlled_stepper is reasonable here only if `dt` is considerably larger than typical step sizes used by the stepper. -* If `stepper` is a __dense_output_stepper then `dt` is the initial step size. -The actual step size will be adjusted during integration due to error control. -If an observer is provided dense output is used to calculate /x(t)/ at ['t = t[sub 0] + n dt]. - -[heading Integrate a given number of steps] - -This function is very similar to `integrate_const` above. The only difference -is that it does not take the end time as parameter, but rather the number of -steps. The integration is then performed until the time `t0+n*dt`. - -`integrate_n_steps( stepper , system , x0 , t0 , dt , n )` - -`integrate_n_steps( stepper , system , x0 , t0 , dt , n , observer )` - -`integrate_n_steps( stepper , system , x0 , t0 , dt , n , observer , max_step_checker )` - -Integrates the ODE given by `system` with subsequent steps from `stepper` starting at ['x[sub 0]] and ['t[sub 0]]. -If provided, `observer` is called after every step and at the beginning with -`t0`, similar as above. -Again, providing a `max_step_checker` will throw a `no_progress_error` if too many steps are performed -between observer calls. -The approximate result for ['x( t[sub 0] + n dt )] is stored in `x0`. -This function returns the end time `t0 + n*dt`. - - -[heading Observer calls at each step] - -If the observer should be called at each time step then the `integrate_adaptive` function should be used. -Note that in the case of __controlled_stepper or __dense_output_stepper this leads to non-equidistant observer calls as the step size changes. - -`integrate_adaptive( stepper , system , x0 , t0 , t1 , dt )` - -`integrate_adaptive( stepper , system , x0 , t0 , t1 , dt , observer )` - -Integrates the ODE given by `system` with subsequent steps from `stepper`. -Integration start at `t0` and `x0` and ends at ['t[sub 1]]. -`x0` is changed to the approximative solution ['x(t[sub 1])] at the end of integration. -If provided, the `observer` is called after each step (and before the first step at `t0`). -`integrate_adaptive` returns the number of steps performed during the integration. - -[note `integrate_adaptive` by design performs an observer call after each time step. Hence -there is no need for a _max_step_checker_ as only exactly one step is ever performed between -observer calls. -] - -* If `stepper` is a __stepper or __error_stepper then `dt` is the step size used for integration and `integrate_adaptive` behaves like `integrate_const` except that for the last step the step size is reduced to ensure we end exactly at `t1`. -If provided, the observer is called at each step. -* If `stepper` is a __controlled_stepper then `dt` is the initial step size. -The actual step size is changed according to error control of the stepper. -For the last step, the step size will be reduced to ensure we end exactly at `t1`. -If provided, the observer is called after each time step (and before the first step at `t0`). -* If stepper is a __dense_output_stepper then `dt` is the initial step size and `integrate_adaptive` behaves just like for __controlled_stepper above. No dense output is used. - -[heading Observer calls at given time points] - -If the observer should be called at some user given time points the `integrate_times` function should be used. -The times for observer calls are provided as a sequence of time values. -The sequence is either defined via two iterators pointing to begin and end of the sequence or in terms of a __boost_range object. - -`integrate_times( stepper , system , x0 , times_start , times_end , dt , observer )` - -`integrate_times( stepper , system , x0 , time_range , dt , observer )` - -Integrates the ODE given by `system` with subsequent steps from `stepper`. -Integration starts at `*times_start` and ends exactly at `*(times_end-1)`. -`x0` contains the approximate solution at the end point of integration. -This function requires an observer which is invoked at the subsequent times `*times_start++` until `times_start == times_end`. -If called with a __boost_range `time_range` the function behaves the same with `times_start = boost::begin( time_range )` and `times_end = boost::end( time_range )`. -Additionally, a _max_step_checker_ can be provided, e.g.: - -`integrate_times( stepper , system , x0 , times_start , times_end , dt , observer , max_step_checker)` - -As above, this will throw a `no_progress_error` if too many steps are performed between observer calls. - -`integrate_times` returns the number of steps performed during the integration. - -* If `stepper` is a __stepper or __error_stepper `dt` is the step size used for integration. -However, whenever a time point from the sequence is approached the step size `dt` will be reduced to obtain the state /x(t)/ exactly at the time point. -* If `stepper` is a __controlled_stepper then `dt` is the initial step size. -The actual step size is adjusted during integration according to error control. -However, if a time point from the sequence is approached the step size is reduced to obtain the state /x(t)/ exactly at the time point. -* If `stepper` is a __dense_output_stepper then `dt` is the initial step size. -The actual step size is adjusted during integration according to error control. -Dense output is used to obtain the states /x(t)/ at the time points from the sequence. - -[heading Convenience integrate function] - -Additionally to the sophisticated integrate function above odeint also provides a simple `integrate` routine which uses a dense output stepper based on `runge_kutta_dopri5` with standard error bounds ['10[super -6]] for the steps. - -`integrate( system , x0 , t0 , t1 , dt )` - -`integrate( system , x0 , t0 , t1 , dt , observer )` - -This function behaves exactly like `integrate_adaptive` above but no stepper has to be provided. -It also returns the number of steps performed during the integration. - -[endsect] diff --git a/libs/numeric/odeint/doc/details_iterators.qbk b/libs/numeric/odeint/doc/details_iterators.qbk deleted file mode 100644 index a4b2fa907..000000000 --- a/libs/numeric/odeint/doc/details_iterators.qbk +++ /dev/null @@ -1,195 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2012-2013 Karsten Ahnert - Copyright 2012-2013 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - - -[section Iterators and Ranges] - -[section Examples] - -odeint supports iterators that iterate along an approximate solution of an ordinary differential equation. Iterators offer you an alternative to the integrate functions. Furthermore, many of the standard algorithms in the C++ standard library and Boost.Range can be used with the odeint's iterators. - -[import ../examples/const_step_iterator.cpp] - -Several iterator types are provided, in consistence with the -__integrate_functions. Hence there are `const_step_iterator`, -`adaptive_step_iterator`, `n_step_iterator` and `times_iterator` -- each of -them in two versions: either with only the `state` or with a -`std::pair` as value type. They are all single pass iterators. In -the following, we show a few examples of how to use those iterators together -with std algorithms. - -[const_step_iterator_accumulate] - -In this example all x-values of the solution are accumulated. Note, how -dereferencing the iterator gives the current state `x` of the ODE (the second -argument of the accumulate lambda). The iterator -itself does not occur directly in this example but it is generated by the -factory functions `make_const_step_iterator_begin` and -`make_const_step_iterator_end`. odeint also supports Boost.Range, that allows -to write the above example in a more compact form with the factory function -`make_const_step_range`, but now using `boost::accumulate` from __bost_range: - -[const_step_iterator_accumulate_range] - -The second iterator type is also a iterator with const step size. But the value type of this iterator consists here of a pair of the time and the state of the solution of the ODE. An example is - -[const_step_time_iterator_accumulate_range] - -The factory functions are now `make_const_step_time_iterator_begin`, -`make_const_step_time_iterator_end` and `make_const_step_time_range`. -Note, how the lambda now expects a `std::pair` as this is the value type of -the `const_step_time_iterator`'s. - - -[import ../examples/adaptive_iterator.cpp] - -Next, we discuss the adaptive iterators which are completely -analogous to the const step iterators, but are based on adaptive stepper -routines and thus adjust the step size during the iteration. Examples are - -[adaptive_iterator_accumulate_range] - -[adaptive_time_iterator_accumulate_range] - -[note 'adaptive_iterator` and `adaptive_time_iterator' can only be used with -__controlled_stepper or __dense_output_stepper.] - -In general one can say that iterating over a range of a `const_step_iterator` -behaves like an `integrate_const` function call, and similarly for -`adaptive_iterator` and `integrate_adaptive`, `n_step_iterator` and -`integrate_n_steps`, and finally `times_iterator` and `integrate_times`. - -Below we list the most important properties of the exisiting iterators: - -[endsect] - -[section const_step_iterator] - -* Definition: `const_step_iterator< Stepper , System , State >` -* `value_type` is `State` -* `reference_type` is `State const&` -* Factory functions - * `make_const_step_iterator_begin( stepper , system , state , t_start , t_end , dt )` - * `make_const_step_iterator_end( stepper , system , state )` - * `make_const_step_range( stepper , system , state , t_start , t_end , dt )` -* This stepper works with all steppers fulfilling the Stepper concept or the DenseOutputStepper concept. -* The value of `state` is the current state of the ODE during the iteration. - -[endsect] - -[section const_step_time_iterator] - -* Definition: `const_step_time_iterator< Stepper , System , State >` -* `value_type` is `std::pair< State , Stepper::time_type >` -* `reference_type` is `std::pair< State const& , Stepper::time_type > const&` -* Factory functions - * `make_const_step_time_iterator_begin( stepper , system , state , t_start , t_end , dt )` - * `make_const_step_time_iterator_end( stepper , system , state )` - * `make_const_step_time_range( stepper , system , state , t_start , t_end , dt )` -* This stepper works with all steppers fulfilling the Stepper concept or the DenseOutputStepper concept. -* This stepper updates the value of `state`. The value of `state` is the current state of the ODE during the iteration. - - -[endsect] - - -[section adaptive_step_iterator] - -* Definition: `adaptive_iterator< Stepper , System , State >` -* `value_type` is `State` -* `reference_type` is `State const&` -* Factory functions - * `make_adaptive_iterator_begin( stepper , system , state , t_start , t_end , dt )` - * `make_adaptive_iterator_end( stepper , system , state )` - * `make_adaptive_range( stepper , system , state , t_start , t_end , dt )` -* This stepper works with all steppers fulfilling the ControlledStepper concept or the DenseOutputStepper concept. -* For steppers fulfilling the ControlledStepper concept `state` is modified according to the current state of the ODE. For DenseOutputStepper the state is not modified due to performance optimizations, but the steppers itself. - - -[endsect] - -[section adaptive_step_time_iterator] - -* Definition: `adaptive_iterator< Stepper , System , State >` -* `value_type` is `std::pair< State , Stepper::time_type >` -* `reference_type` is `std::pair< State const& , Stepper::time_type > const&` -* Factory functions - * `make_adaptive_time_iterator_begin( stepper , system , state , t_start , t_end , dt )` - * `make_adaptive_time_iterator_end( stepper , system , state )` - * `make_adaptive_time_range( stepper , system , state , t_start , t_end , dt )` -* This stepper works with all steppers fulfilling the ControlledStepper concept or the DenseOutputStepper concept. -* For steppers fulfilling the ControlledStepper concept `state` is modified according to the current state of the ODE. For DenseOutputStepper the state is not modified due to performance optimizations, but the stepper itself. - - -[endsect] - - -[section n_step_iterator] - -* Definition: `n_step_iterator< Stepper , System , State >` -* `value_type` is `State` -* `reference_type` is `State const&` -* Factory functions - * `make_n_step_iterator_begin( stepper , system , state , t_start , dt , num_of_steps )` - * `make_n_step_iterator_end( stepper , system , state )` - * `make_n_step_range( stepper , system , state , t_start , dt , num_of_steps )` -* This stepper works with all steppers fulfilling the Stepper concept or the DenseOutputStepper concept. -* The value of `state` is the current state of the ODE during the iteration. - -[endsect] - -[section n_step_time_iterator] - -* Definition: `n_step_time_iterator< Stepper , System , State >` -* `value_type` is `std::pair< State , Stepper::time_type >` -* `reference_type` is `std::pair< State const& , Stepper::time_type > const&` -* Factory functions - * `make_n_step_time_iterator_begin( stepper , system , state , t_start , dt , num_of_steps )` - * `make_n_step_time_iterator_end( stepper , system , state )` - * `make_n_step_time_range( stepper , system , state , t_start , dt , num_of_steps )` -* This stepper works with all steppers fulfilling the Stepper concept or the DenseOutputStepper concept. -* This stepper updates the value of `state`. The value of `state` is the current state of the ODE during the iteration. - - -[endsect] - - -[section times_iterator] - -* Definition: `times_iterator< Stepper , System , State , TimeIterator >` -* `value_type` is `State` -* `reference_type` is `State const&` -* Factory functions - * `make_times_iterator_begin( stepper , system , state , t_start , t_end , dt )` - * `make_times_iterator_end( stepper , system , state )` - * `make_times_range( stepper , system , state , t_start , t_end , dt )` -* This stepper works with all steppers fulfilling the Stepper concept, the ControlledStepper concept or the DenseOutputStepper concept. -* The value of `state` is the current state of the ODE during the iteration. - -[endsect] - -[section times_time_iterator] - -* Definition: `times_time_iterator< Stepper , System , State , TimeIterator>` -* `value_type` is `std::pair< State , Stepper::time_type >` -* `reference_type` is `std::pair< State const& , Stepper::time_type > const&` -* Factory functions - * `make_times_time_iterator_begin( stepper , system , state , t_start , t_end , dt )` - * `make_times_time_step_iterator_end( stepper , system , state )` - * `make_times_time_range( stepper , system , state , t_start , t_end , dt )` -* This stepper works with all steppers fulfilling the Stepper concept, the ControlledStepper concept or the DenseOutputStepper concept. -* This stepper updates the value of `state`. The value of `state` is the current state of the ODE during the iteration. - -[endsect] - - -[endsect] diff --git a/libs/numeric/odeint/doc/details_state_types_algebras_operations.qbk b/libs/numeric/odeint/doc/details_state_types_algebras_operations.qbk deleted file mode 100644 index 274306b30..000000000 --- a/libs/numeric/odeint/doc/details_state_types_algebras_operations.qbk +++ /dev/null @@ -1,482 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2013 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - -[section State types, algebras and operations] - -In odeint the stepper algorithms are implemented independently of the -underlying fundamental mathematical operations. -This is realized by giving the user full control over the state type and the -mathematical operations for this state type. -Technically, this is done by introducing three concepts: StateType, Algebra, -Operations. -Most of the steppers in odeint expect three class types fulfilling these -concepts as template parameters. -Note that these concepts are not fully independent of each other but rather a -valid combination must be provided in order to make the steppers work. -In the following we will give some examples on reasonable -state_type-algebra-operations combinations. -For the most common state types, like `vector` or `array` -the default values range_algebra and default_operations are perfectly fine and -odeint can be used as is without worrying about algebra/operations at all. - -[important state_type, algebra and operations are not independent, a valid -combination must be provided to make odeint work properly] - -Moreover, as odeint handles the memory required for intermediate temporary -objects itself, it also needs knowledge about how to create state_type objects -and maybe how to allocate memory (resizing). -All in all, the following things have to be taken care of when odeint is used -with non-standard state types: - -* construction/destruction -* resizing (if possible/required) -* algebraic operations - -Again, odeint already provides basic interfaces for most of the usual state -types. -So if you use a `std::vector`, or a `boost::array` as state type no additional -work is required, they just work out of the box. - -[section Construction/Resizing] - -We distinguish between two basic state types: fixed sized and dynamically -sized. -For fixed size state types the default constructor `state_type()` already -allocates the required memory, prominent example is `boost::array`. -Dynamically sized types have to be resized to make sure enough memory is -allocated, the standard constructor does not take care of the resizing. -Examples for this are the STL containers like `vector`. - -The most easy way of getting your own state type to work with odeint is to use -a fixed size state, base calculations on the range_algebra and provide the -following functionality: -[table - [[Name] [Expression] [Type] [Semantics]] - [[Construct State] [`State x()`] [`void`] [Creates an instance of `State` - and allocates memory.] ] - [[Begin of the sequence] [boost::begin(x)] [Iterator] [Returns an iterator - pointing to the begin of the sequence]] - [[End of the sequence] [boost::end(x)] [Iterator] [Returns an iterator - pointing to the end of the sequence]] -] - -[warning If your state type does not allocate memory by default construction, -you [*must define it as resizeable] and provide resize functionality (see -below). Otherwise segmentation faults will occur.] - -So fixed sized arrays supported by __boost_range immediately work with odeint. -For dynamically sized arrays one has to additionally supply the resize -functionality. -First, the state has to be tagged as resizeable by specializing the struct -`is_resizeable` which consists of one typedef and one bool value: -[table - [[Name] [Expression] [Type] [Semantics]] - [[Resizability] [`is_resizeable::type`] - [`boost::true_type` or `boost::false_type`] - [Determines resizeability of the state type, returns `boost::true_type` if - the state is resizeable.]] - [[Resizability] [`is_resizeable::value`] - [`bool`] - [Same as above, but with `bool` value.]] -] - -Defining `type` to be `true_type` and `value` as `true` tells odeint that your -state is resizeable. -By default, odeint now expects the support of `boost::size(x)` and a -`x.resize( boost::size(y) )` member function for resizing: -[table - [[Name] [Expression] [Type] [Semantics]] - [[Get size] [`boost::size( x )`] - [`size_type`] [Returns the current size of x.]] - [[Resize] [`x.resize( boost::size( y ) )`] - [`void`] [Resizes x to have the same size as y.]] -] - -[section Using the container interface] -[import ../examples/my_vector.cpp] - -As a first example we take the most simple case and implement our own vector -`my_vector` which will provide a container interface. -This makes __boost_range working out-of-box. -We add a little functionality to our vector which makes it allocate some -default capacity by construction. -This is helpful when using resizing as then a resize can be assured to not -require a new allocation. - -[my_vector] - - -The only thing that has to be done other than defining is thus declaring -my_vector as resizeable: - -[my_vector_resizeable] - -If we wouldn't specialize the `is_resizeable` template, the code would still -compile but odeint would not adjust the size of temporary internal instances -of my_vector and hence try to fill zero-sized vectors resulting in -segmentation faults! -The full example can be found in [github_link examples/my_vector.cpp my_vector.cpp] - -[endsect] - -[section std::list] - -If your state type does work with __boost_range, but handles resizing -differently you are required to specialize two implementations used by odeint -to check a state's size and to resize: -[table - [[Name] [Expression] [Type] [Semantics]] - [[Check size] [`same_size_impl::same_size(x , y)`] - [`bool`] [Returns true if the size of x equals the size of y.]] - [[Resize] [`resize_impl::resize(x , y)`] - [`void`] [Resizes x to have the same size as y.]] -] - -As an example we will use a `std::list` as state type in odeint. -Because `std::list` is not supported by `boost::size` we have to replace the -same_size and resize implementation to get list to work with odeint. -The following code shows the required template specializations: - -[import ../examples/list_lattice.cpp] - -[list_bindings] - -With these definitions odeint knows how to resize `std::list`s and so they can -be used as state types. -A complete example can be found in [github_link examples/list_lattice.cpp list_lattice.cpp]. - -[endsect] - -[endsect] - -[section Algebras and Operations] - -To provide maximum flexibility odeint is implemented in a highly modularized -way. This means it is possible to change the underlying mathematical -operations without touching the integration algorithms. -The fundamental mathematical operations are those of a vector space, that is -addition of `state_types` and multiplication of `state_type`s with a scalar -(`time_type`). In odeint this is realized in two concepts: _Algebra_ and -_Operations_. -The standard way how this works is by the range algebra which provides -functions that apply a specific operation to each of the individual elements -of a container based on the __boost_range library. -If your state type is not supported by __boost_range there are several -possibilities to tell odeint how to do algebraic operations: - -* Implement `boost::begin` and `boost::end` for your state type so it works -with __boost_range. -* Implement vector-vector addition operator `+` and scalar-vector -multiplication operator `*` and use the non-standard `vector_space_algebra`. -* Implement your own algebra that implements the required functions. - -[section GSL Vector] - -In the following example we will try to use the `gsl_vector` type from __gsl (GNU -Scientific Library) as state type in odeint. -We will realize this by implementing a wrapper around the gsl_vector that -takes care of construction/destruction. -Also, __boost_range is extended such that it works with `gsl_vector`s as well -which required also the implementation of a new `gsl_iterator`. - -[note odeint already includes all the code presented here, see [github_link -boost/numeric/odeint/external/gsl/gsl_wrapper.hpp gsl_wrapper.hpp], so `gsl_vector`s -can be used straight out-of-box. -The following description is just for educational purpose.] - -The GSL is a C library, so `gsl_vector` has neither constructor, nor -destructor or any `begin` or `end` function, no iterators at all. -So to make it work with odeint plenty of things have to be implemented. -Note that all of the work shown here is already included in odeint, so using -`gsl_vector`s in odeint doesn't require any further adjustments. -We present it here just as an educational example. -We start with defining appropriate constructors and destructors. -This is done by specializing the `state_wrapper` for `gsl_vector`. -State wrappers are used by the steppers internally to create and manage -temporary instances of state types: - -`` -template<> -struct state_wrapper< gsl_vector* > -{ - typedef double value_type; - typedef gsl_vector* state_type; - typedef state_wrapper< gsl_vector* > state_wrapper_type; - - state_type m_v; - - state_wrapper( ) - { - m_v = gsl_vector_alloc( 1 ); - } - - state_wrapper( const state_wrapper_type &x ) - { - resize( m_v , x.m_v ); - gsl_vector_memcpy( m_v , x.m_v ); - } - - - ~state_wrapper() - { - gsl_vector_free( m_v ); - } - -}; -`` - -This `state_wrapper` specialization tells odeint how gsl_vectors are created, -copied and destroyed. -Next we need resizing, this is required because gsl_vectors are dynamically -sized objects: -`` -template<> -struct is_resizeable< gsl_vector* > -{ - typedef boost::true_type type; - const static bool value = type::value; -}; - -template <> -struct same_size_impl< gsl_vector* , gsl_vector* > -{ - static bool same_size( const gsl_vector* x , const gsl_vector* y ) - { - return x->size == y->size; - } -}; - -template <> -struct resize_impl< gsl_vector* , gsl_vector* > -{ - static void resize( gsl_vector* x , const gsl_vector* y ) - { - gsl_vector_free( x ); - x = gsl_vector_alloc( y->size ); - } -}; -`` - -Up to now, we defined creation/destruction and resizing, but gsl_vectors also -don't support iterators, so we first implement a gsl iterator: - -`` -/* - * defines an iterator for gsl_vector - */ -class gsl_vector_iterator - : public boost::iterator_facade< gsl_vector_iterator , double , - boost::random_access_traversal_tag > -{ -public : - - gsl_vector_iterator( void ): m_p(0) , m_stride( 0 ) { } - explicit gsl_vector_iterator( gsl_vector *p ) : m_p( p->data ) , m_stride( p->stride ) { } - friend gsl_vector_iterator end_iterator( gsl_vector * ); - -private : - - friend class boost::iterator_core_access; - friend class const_gsl_vector_iterator; - - void increment( void ) { m_p += m_stride; } - void decrement( void ) { m_p -= m_stride; } - void advance( ptrdiff_t n ) { m_p += n*m_stride; } - bool equal( const gsl_vector_iterator &other ) const { return this->m_p == other.m_p; } - bool equal( const const_gsl_vector_iterator &other ) const; - double& dereference( void ) const { return *m_p; } - - double *m_p; - size_t m_stride; -}; -`` -A similar class exists for the `const` version of the iterator. -Then we have a function returning the end iterator (similarly for `const` again): -`` -gsl_vector_iterator end_iterator( gsl_vector *x ) -{ - gsl_vector_iterator iter( x ); - iter.m_p += iter.m_stride * x->size; - return iter; -} -`` - -Finally, the bindings for __boost_range are added: -`` -// template<> -inline gsl_vector_iterator range_begin( gsl_vector *x ) -{ - return gsl_vector_iterator( x ); -} - -// template<> -inline gsl_vector_iterator range_end( gsl_vector *x ) -{ - return end_iterator( x ); -} -`` -Again with similar definitions for the `const` versions. -This eventually makes odeint work with gsl vectors as state types. -The full code for these bindings is found in [github_link -boost/numeric/odeint/external/gsl/gsl_wrapper.hpp gsl_wrapper.hpp]. -It might look rather complicated but keep in mind that gsl is a pre-compiled C -library. -[endsect] - - -[section Vector Space Algebra] - -As seen above, the standard way of performing algebraic operations on -container-like state types in odeint is to iterate through the elements of the -container and perform the operations element-wise on the underlying value type. -This is realized by means of the `range_algebra` that uses __boost_range for -obtaining iterators of the state types. -However, there are other ways to implement the algebraic operations on -containers, one of which is defining the addition/multiplication operators for -the containers directly and then using the `vector_space_algebra`. -If you use this algebra, the following operators have to be defined for the -state_type: - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Addition] [`x + y`] [`state_type`] [Calculates the vector sum 'x+y'.]] - [[Assign addition] [`x += y`] [`state_type`] [Performs x+y in place.]] - [[Scalar multiplication] [`a * x `] [`state_type`] [Performs multiplication of vector x with scalar a.]] - [[Assign scalar multiplication] [`x *= a`] [`state_type`] [Performs in-place multiplication of vector x with scalar a.]] -] - -Defining these operators makes your state type work with any basic Runge-Kutta -stepper. -However, if you want to use step-size control, some more functionality is -required. -Specifically, operations like -[' max[sub i]( |err[sub i]| / (alpha * |s[sub i]|) )] -have to be performed. -['err] and ['s] are state_types, alpha is a scalar. -As you can see, we need element wise absolute value and division as well as an -reduce operation to get the maximum value. -So for controlled steppers the following things have to be implemented: - -[table - [[Name] [Expression] [Type] [Semantics]] - [[Division] [`x / y`] [`state_type`] [Calculates the element-wise division 'x/y']] - [[Absolute value] [`abs( x )`] [`state_type`] [Element wise absolute value]] - [[Reduce] [`vector_space_reduce_impl< state_type >::reduce( state , operation , init )`] [`value_type`] - [Performs the `operation` for subsequently each element of `state` and returns the aggregate value. - E.g. - -`init = operator( init , state[0] );` - -`init = operator( init , state[1] )` - -`...` - ]] -] - -[endsect] - -[/ -[section Boost.Ublas] -As an example for the employment of the `vector_space_algebra` we will adopt -`ublas::vector` from __ublas to work as a state type in odeint. -This is particularly easy because `ublas::vector` supports vector-vector -addition and scalar-vector multiplication described above as well as `boost::size`. -It also has a resize member function so all that has to be done in this case -is to declare resizability: - -[import ../examples/ublas/lorenz_ublas.cpp] - -[ublas_resizeable] - -Now ublas::vector can be used as state type for simple Runge-Kutta steppers -in odeint by specifying the `vector_space_algebra` as algebra in the template -parameter list of the stepper. -The following code shows the corresponding definitions: - -[ublas_main] - -Note again, that we haven't supported the requirements for controlled steppers, -but only for simple Runge-Kutta methods. -You can find the full example in [github_link -examples/ublas/lorenz_ublas.cpp lorenz_ublas.cpp]. - -[endsect] -/] - -[section Point type] - -[import ../examples/lorenz_point.cpp] - -Here we show how to implement the required operators on a state type. -As example we define a new class `point3D` representing a three-dimensional -vector with components x,y,z and define addition and scalar multiplication -operators for it. -We use __boost_operators to reduce the amount of code to be written. -The class for the point type looks as follows: - -[point3D] - -By deriving from __boost_operators classes we don't have to define outer class -operators like `operator+( point3D , point3D )` because that is taken care of -by the operators library. -Note that for simple Runge-Kutta schemes (like `runge_kutta4`) only the `+` -and `*` operators are required. -If, however, a controlled stepper is used one also needs to specify the -division operator `/` because calculation of the error term involves an -element wise division of the state types. -Additionally, controlled steppers require an `abs` function calculating the -element-wise absolute value for the state type: - -[point3D_abs_div] - -Finally, we have to provide a specialization to calculate the infintity norm of a state: - -[point3D_norm] - -Again, note that the two last steps were only required if you want to use -controlled steppers. -For simple steppers definition of the simple `+=` and `*=` operators are -sufficient. -Having defined such a point type, we can easily perform the integration on a Lorenz -system by explicitely configuring the `vector_space_algebra` in the stepper's -template argument list: - -[point3D_main] - -The whole example can be found in [github_link -examples/lorenz_point.cpp lorenz_point.cpp] - -[note For the most `state_types`, odeint is able to automatically determine -the correct algebra and operations. But if you want to use your own `state_type`, as in this -example with `point3D`, you have to manually configure the right -algebra/operations, unless your `state_type` works with the default choice of -`range_algebra` and `default_operations`.] - -[endsect] - -[endsect] - -gsl_vector, gsl_matrix, ublas::matrix, blitz::matrix, thrust - -[section Adapt your own operations] - -to be continued - -*thrust -*gsl_complex -*min, max, pow - -[endsect] - - - -[endsect] diff --git a/libs/numeric/odeint/doc/details_steppers.qbk b/libs/numeric/odeint/doc/details_steppers.qbk deleted file mode 100644 index 1a83f5c1e..000000000 --- a/libs/numeric/odeint/doc/details_steppers.qbk +++ /dev/null @@ -1,421 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2013 Karsten Ahnert - Copyright 2012 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - -[section Steppers] - -[import ../examples/stepper_details.cpp] - -Solving ordinary differential equation numerically is usually done iteratively, that is a given state of an ordinary differential equation is iterated forward ['x(t) -> x(t+dt) -> x(t+2dt)]. The steppers in odeint perform one single step. The most general stepper type is described by the __stepper concept. The stepper concepts of odeint are described in detail in section __concepts, here we briefly present the mathematical and numerical details of the steppers. The __stepper has two versions of the `do_step` method, one with an in-place transform of the current state and one with an out-of-place transform: - -`do_step( sys , inout , t , dt )` - -`do_step( sys , in , t , out , dt )` - -The first parameter is always the system function - a function describing the -ODE. In the first version the second parameter is the step which is here -updated in-place and the third and the fourth parameters are the time and step -size (the time step). After a call to `do_step` the state `inout` is updated -and now represents an approximate solution of the ODE at time ['t+dt]. In the -second version the second argument is the state of the ODE at time ['t], the -third argument is t, the fourth argument is the approximate solution at time -['t+dt] which is filled by `do_step` and the fifth argument is the time step. -Note that these functions do not change the time `t`. - -[* System functions] - -Up to now, we have nothing said about the system function. This function -depends on the stepper. For the explicit Runge-Kutta steppers this function -can be a simple callable object hence a simple (global) C-function or a -functor. The parameter syntax is `sys( x , dxdt , t )` and it is assumed that -it calculates ['dx/dt = f(x,t)]. -The function structure in most cases looks like: - -[system_function_structure] - -Other types of system functions might represent Hamiltonian systems or systems which also compute the Jacobian needed in implicit steppers. For information which stepper uses which system function see the stepper table below. It might be possible that odeint will introduce new system types in near future. Since the system function is strongly related to the stepper type, such an introduction of a new stepper might result in a new type of system function. - -[section Explicit steppers] - -A first specialization are the explicit steppers. Explicit means that the new -state of the ode can be computed explicitly from the current state without -solving implicit equations. Such steppers have in common that they evaluate the system at time ['t] such that the result of ['f(x,t)] can be passed to the stepper. In odeint, the explicit stepper have two additional methods - -`do_step( sys , inout , dxdtin , t , dt )` - -`do_step( sys , in , dxdtin , t , out , dt )` - -Here, the additional parameter is the value of the function ['f] at state ['x] and time ['t]. An example is the Runge-Kutta stepper of fourth order: - -[explicit_stepper_detail_example] - -In fact, you do not need to call these two methods. You can always use the -simpler `do_step( sys , inout , t , dt )`, but sometimes the derivative of the -state is needed externally to do some external computations or to perform some statistical analysis. - -A special class of the explicit steppers are the FSAL (first-same-as-last) -steppers, where the last evaluation of the system function is also the first -evaluation of the following step. For such steppers the `do_step` method are -slightly different: - -`do_step( sys , inout , dxdtinout , t , dt )` - -`do_step( sys , in , dxdtin , out , dxdtout , t , dt )` - -This method takes the derivative at time `t` and also stores -the derivative at time ['t+dt]. Calling these functions subsequently iterating -along the solution one saves one function call by passing the result for dxdt -into the next function call. -However, when using FSAL steppers without supplying derivatives: - -`do_step( sys , inout , t , dt )` - -the stepper internally satisfies the FSAL property which means it remembers -the last `dxdt` and uses it for the next step. -An example for a FSAL stepper is the Runge-Kutta-Dopri5 stepper. The FSAL trick is sometimes also referred as the Fehlberg trick. An example how the FSAL steppers can be used is - -[fsal_stepper_detail_example] - -[caution The FSAL-steppers save the derivative at time ['t+dt] internally if -they are called via `do_step( sys , in , out , t , dt )`. The first call of -`do_step` will initialize `dxdt` and for all following calls it is assumed -that the same system and the same state are used. If you use the FSAL stepper -within the integrate functions this is taken care of automatically. See the __using_steppers section for more details or look into the table below to see which stepper have an internal state.] - - -[endsect] - -[section Symplectic solvers] - -As mentioned above symplectic solvers are used for Hamiltonian systems. Symplectic solvers conserve the phase space volume exactly and if the Hamiltonian system is energy conservative they also conserve the energy approximately. A special class of symplectic systems are separable systems which can be written in the form ['dqdt/dt = f1(p)], ['dpdt/dt = f2(q)], where ['(q,p)] are the state of system. The space of ['(q,p)] is sometimes referred as the phase space and ['q] and ['p] are said the be the phase space variables. Symplectic systems in this special form occur widely in nature. For example the complete classical mechanics as written down by Newton, Lagrange and Hamilton can be formulated in this framework. The separability of the system depends on the specific choice of coordinates. - -Symplectic systems can be solved by odeint by means of the symplectic_euler stepper and a symplectic Runge-Kutta-Nystrom method of fourth order. These steppers assume that the system is autonomous, hence the time will not explicitly occur. Further they fulfill in principle the default Stepper concept, but they expect the system to be a pair of callable objects. The first entry of this pair calculates ['f1(p)] while the second calculates ['f2(q)]. The syntax is `sys.first(p,dqdt)` and `sys.second(q,dpdt)`, where the first and second part can be again simple C-functions of functors. An example is the harmonic oscillator: - -[symplectic_stepper_detail_system_function] - -The state of such an ODE consist now also of two parts, the part for q (also called the coordinates) and the part for p (the momenta). The full example for the harmonic oscillator is now: - -[symplectic_stepper_detail_example] - -If you like to represent the system with one class you can easily bind two public method: - -[symplectic_stepper_detail_system_class] - -[symplectic_stepper_detail_system_class_example] - -Many Hamiltonian system can be written as ['dq/dt=p], ['dp/dt=f(q)] which is computationally much easier than the full separable system. Very often, it is also possible to transform the original equations of motion to bring the system in this simplified form. This kind of system can be used in the symplectic solvers, by simply passing ['f(p)] to the `do_step` method, again ['f(p)] will be represented by a simple C-function or a functor. Here, the above example of the harmonic oscillator can be written as - -[simplified_symplectic_stepper_example] - -In this example the function `harm_osc_f1` is exactly the same function as in the above examples. - -Note, that the state of the ODE must not be constructed explicitly via `pair< vector_type , vector_type > x`. One can also use a combination of `make_pair` and `ref`. Furthermore, a convenience version of `do_step` exists which takes q and p without combining them into a pair: - -[symplectic_stepper_detail_ref_usage] - -[endsect] - -[section Implicit solvers] - -[caution This section is not up-to-date.] - -For some kind of systems the stability properties of the classical Runge-Kutta are not sufficient, especially if the system is said to be stiff. A stiff system possesses two or more time scales of very different order. Solvers for stiff systems are usually implicit, meaning that they solve equations like ['x(t+dt) = x(t) + dt * f(x(t+1))]. This particular scheme is the implicit Euler method. Implicit methods usually solve the system of equations by a root finding algorithm like the Newton method and therefore need to know the Jacobian of the system ['J[subl ij] = df[subl i] / dx[subl j]]. - -For implicit solvers the system is again a pair, where the first component computes ['f(x,t)] and the second the Jacobian. The syntax is `sys.first( x , dxdt , t )` and `sys.second( x , J , t )`. For the implicit solver the `state_type` is `ublas::vector` and the Jacobian is represented by `ublas::matrix`. - -[important Implicit solvers only work with ublas::vector as state type. At -the moment, no other state types are supported.] - -[endsect] - -[section Multistep methods] - -Another large class of solvers are multi-step method. They save a small part of the history of the solution and compute the next step with the help of this history. Since multi-step methods know a part of their history they do not need to compute the system function very often, usually it is only computed once. This makes multi-step methods preferable if a call of the system function is expensive. Examples are ODEs defined on networks, where the computation of the interaction is usually where expensive (and might be of order O(N^2)). - -Multi-step methods differ from the normal steppers. They save a part of their history and this part has to be explicitly calculated and initialized. In the following example an Adams-Bashforth-stepper with a history of 5 steps is instantiated and initialized; - -[multistep_detail_example] - -The initialization uses a fourth-order Runge-Kutta stepper and after the call -of `initialize` the state of `inout` has changed to the current state, such -that it can be immediately used by passing it to following calls of `do_step`. You can also use you own steppers to initialize the internal state of the Adams-Bashforth-Stepper: - -[multistep_detail_own_stepper_initialization] - -Many multi-step methods are also explicit steppers, hence the parameter of `do_step` method do not differ from the explicit steppers. - -[caution The multi-step methods have some internal variables which depend on -the explicit solution. Hence after any external changes of your state (e.g. size) or -system the initialize function has to be called again to adjust the internal -state of the stepper. If you use the integrate functions this will -be taken into account. See the __using_steppers section for more details.] - - -[endsect] - -[section Controlled steppers] - -Many of the above introduced steppers possess the possibility to use adaptive step-size control. Adaptive step size integration works in principle as follows: - -# The error of one step is calculated. This is usually done by performing two steps with different orders. The difference between these two steps is then used as a measure for the error. Stepper which can calculate the error are __error_stepper and they form an own class with an separate concept. -# This error is compared against some predefined error tolerances. Are the tolerance violated the step is reject and the step-size is decreases. Otherwise the step is accepted and possibly the step-size is increased. - -The class of controlled steppers has their own concept in odeint - the __controlled_stepper concept. They are usually constructed from the underlying error steppers. An example is the controller for the explicit Runge-Kutta steppers. The Runge-Kutta steppers enter the controller as a template argument. Additionally one can pass the Runge-Kutta stepper to the constructor, but this step is not necessary; the stepper is default-constructed if possible. - -Different step size controlling mechanism exist. They all have in common that -they somehow compare predefined error tolerance against the error and that -they might reject or accept a step. If a step is rejected the step size is -usually decreased and the step is made again with the reduced step size. This -procedure is repeated until the step is accepted. This algorithm is -implemented in the integration functions. - -A classical way to decide whether a step is rejected or accepted is to calculate - -['val = || | err[subl i] | / ( __epsilon[subl abs] + __epsilon[subl rel] * ( a[subl x] | x[subl i] | + a[subl dxdt] | | dxdt[subl i] | )|| ] - -['__epsilon[subl abs]] and ['__epsilon[subl rel]] are the absolute and the relative error tolerances, and ['|| x ||] is a norm, typically ['||x||=(__Sigma[subl i] x[subl i][super 2])[super 1/2]] or the maximum norm. The step is rejected if ['val] is greater then 1, otherwise it is accepted. For details of the used norms and error tolerance see the table below. - -For the `controlled_runge_kutta` stepper the new step size is then calculated via - -['val > 1 : dt[subl new] = dt[subl current] max( 0.9 pow( val , -1 / ( O[subl E] - 1 ) ) , 0.2 )] - -['val < 0.5 : dt[subl new] = dt[subl current] min( 0.9 pow( val , -1 / O[subl S] ) , 5 )] - -['else : dt[subl new] = dt[subl current]] - -Here, ['O[subl S]] and ['O[subl E]] are the order of the stepper and the error stepper. These formulas also contain some safety factors, avoiding that the step size is reduced or increased to much. For details of the implementations of the controlled steppers in odeint see the table below. - -[include controlled_stepper_table.qbk] - -To ease to generation of the controlled stepper, generation functions exist which take the absolute and relative error tolerances and a predefined error stepper and construct from this knowledge an appropriate controlled stepper. The generation functions are explained in detail in __generation_functions. - -[endsect] - -[section Dense output steppers] - -A fourth class of stepper exists which are the so called dense output steppers. Dense-output steppers might take larger steps and interpolate the solution between two consecutive points. This interpolated points have usually the same order as the order of the stepper. Dense-output steppers are often composite stepper which take the underlying method as a template parameter. An example is the `dense_output_runge_kutta` stepper which takes a Runge-Kutta stepper with dense-output facilities as argument. Not all Runge-Kutta steppers provide dense-output calculation; at the moment only the Dormand-Prince 5 stepper provides dense output. An example is - -[dense_output_detail_example] - -Dense output stepper have their own concept. The main difference to usual -steppers is that they manage the state and time internally. If you call -`do_step`, only the ODE is passed as argument. Furthermore `do_step` return -the last time interval: `t` and `t+dt`, hence you can interpolate the solution between these two times points. Another difference is that they must be initialized with `initialize`, otherwise the internal state of the stepper is default constructed which might produce funny errors or bugs. - -The construction of the dense output stepper looks a little bit nasty, since in the case of the `dense_output_runge_kutta` stepper a controlled stepper and an error stepper have to be nested. To simplify the generation of the dense output stepper generation functions exist: - -[dense_output_detail_generation1] - -This statement is also lengthy; it demonstrates how `make_dense_output` can be used with the `result_of` protocol. The parameters to `make_dense_output` are the absolute error tolerance, the relative error tolerance and the stepper. This explicitly assumes that the underlying stepper is a controlled stepper and that this stepper has an absolute and a relative error tolerance. For details about the generation functions see __generation_functions. The generation functions have been designed for easy use with the integrate functions: - -[dense_output_detail_generation2] - -[endsect] - -[section Using steppers] - -This section contains some general information about the usage of the steppers in odeint. - -[* Steppers are copied by value] - -The stepper in odeint are always copied by values. They are copied for the creation of the controlled steppers or the dense output steppers as well as in the integrate functions. - -[* Steppers might have a internal state] - -[caution Some of the features described in this section are not yet implemented] - -Some steppers require to store some information about the state of the ODE between two steps. Examples are the multi-step methods which store a part of the solution during the evolution of the ODE, or the FSAL steppers which store the last derivative at time ['t+dt], to be used in the next step. In both cases the steppers expect that consecutive calls of `do_step` are from the same solution and the same ODE. In this case it is absolutely necessary that you call `do_step` with the same system function and the same state, see also the examples for the FSAL steppers above. - -Stepper with an internal state support two additional methods: `reset` which resets the state and `initialize` which initializes the internal state. The parameters of `initialize` depend on the specific stepper. For example the Adams-Bashforth-Moulton stepper provides two initialize methods: `initialize( system , inout , t , dt )` which initializes the internal states with the help of the Runge-Kutta 4 stepper, and `initialize( stepper , system , inout , t , dt )` which initializes with the help of `stepper`. For the case of the FSAL steppers, `initialize` is `initialize( sys , in , t )` which simply calculates the r.h.s. of the ODE and assigns its value to the internal derivative. - -All these steppers have in common, that they initially fill their internal state by themselves. Hence you are not required to call initialize. See how this works for the Adams-Bashforth-Moulton stepper: in the example we instantiate a fourth order Adams-Bashforth-Moulton stepper, meaning that it will store 4 internal derivatives of the solution at times `(t-dt,t-2*dt,t-3*dt,t-4*dt)`. - -`` -adams_bashforth_moulton< 4 , state_type > stepper; -stepper.do_step( sys , x , t , dt ); // make one step with the classical Runge-Kutta stepper and initialize the first internal state - // the internal array is now [x(t-dt)] - -stepper.do_step( sys , x , t , dt ); // make one step with the classical Runge-Kutta stepper and initialize the second internal state - // the internal state array is now [x(t-dt), x(t-2*dt)] - -stepper.do_step( sys , x , t , dt ); // make one step with the classical Runge-Kutta stepper and initialize the third internal state - // the internal state array is now [x(t-dt), x(t-2*dt), x(t-3*dt)] - -stepper.do_step( sys , x , t , dt ); // make one step with the classical Runge-Kutta stepper and initialize the fourth internal state - // the internal state array is now [x(t-dt), x(t-2*dt), x(t-3*dt), x(t-4*dt)] - -stepper.do_step( sys , x , t , dt ); // make one step with Adam-Bashforth-Moulton, the internal array of states is now rotated -`` - -In the stepper table at the bottom of this page one can see which stepper have an internal state and hence provide the `reset` and `initialize` methods. - - -[* Stepper might be resizable] - -Nearly all steppers in odeint need to store some intermediate results of the -type `state_type` or `deriv_type`. To do so odeint need some memory management -for the internal temporaries. As this memory management is typically related -to adjusting the size of vector-like types, it is called resizing in -odeint. So, most steppers in odeint provide an additional template parameter -which controls the size adjustment of the internal variables - the resizer. In -detail odeint provides three policy classes (resizers) `always_resizer`, -`initially_resizer`, and `never_resizer`. Furthermore, all stepper have a -method `adjust_size` which takes a parameter representing a state type and -which manually adjusts the size of the internal variables matching the size of -the given instance. Before performing the actual resizing odeint always checks -if the sizes of the state and the internal variable differ and only resizes if -they are different. - -[note You only have to worry about memory allocation when using dynamically -sized vector types. If your state type is heap allocated, like `boost::array`, -no memory allocation is required whatsoever.] - -By default the resizing parameter is `initially_resizer`, meaning that the -first call to `do_step` performs the resizing, hence memory allocation. -If you have changed the size of your system and your state you have to -call `adjust_size` by hand in this case. The second resizer is the -`always_resizer` which tries to resize the internal variables at every call of -`do_step`. Typical use cases for this kind of resizer are self expanding -lattices like shown in the tutorial (__resizing_lattice_example) or partial differential equations with an -adaptive grid. Here, no calls of `adjust_size` are required, the steppers manage -everything themselves. The third class of resizer is the `never_resizer` which -means that the internal variables are never adjusted automatically and always -have to be adjusted by hand . - -There is a second mechanism which influences the resizing and which controls if a state type is at least resizeable - a meta-function `is_resizeable`. This meta-function returns a static Boolean value if any type is resizable. For example it will return `true` for `std::vector< T >` but `false` for `boost::array< T >`. By default and for unknown types `is_resizeable` returns `false`, so if you have your own type you need to specialize this meta-function. For more details on the resizing mechanism see the section __adapt_state_types. - - - -[* Which steppers should be used in which situation] - -odeint provides a quite large number of different steppers such that the user is left with the question of which stepper fits his needs. Our personal recommendations are: - -* `runge_kutta_dopri5` is maybe the best default stepper. It has step size control as well as dense-output functionality. Simple create a dense-output stepper by `make_dense_output( 1.0e-6 , 1.0e-5 , runge_kutta_dopri5< state_type >() )`. -* `runge_kutta4` is a good stepper for constant step sizes. It is widely used and very well known. If you need to create artificial time series this stepper should be the first choice. -* 'runge_kutta_fehlberg78' is similar to the 'runge_kutta4' with the advantage that it has higher precision. It can also be used with step size control. -* `adams_bashforth_moulton` is very well suited for ODEs where the r.h.s. is expensive (in terms of computation time). It will calculate the system function only once during each step. - -[endsect] - -[section Stepper overview] - -[include stepper_table.qbk] - -[endsect] - - -[section Custom steppers] - -[import ../examples/stochastic_euler.cpp] - -Finally, one can also write new steppers which are fully compatible with odeint. They only have to fulfill one or several of the stepper __concepts of odeint. - -We will illustrate how to write your own stepper with the example of the stochastic Euler method. This method is suited to solve stochastic differential equations (SDEs). A SDE has the form - -['dx/dt = f(x) + g(x) __xi(t)] - -where ['__xi] is Gaussian white noise with zero mean and a standard deviation ['__sigma(t)]. ['f(x)] is said to be the deterministic part while [' g(x) __xi] is the noisy part. In case ['g(x)] is independent of ['x] the SDE is said to have additive noise. It is not possible to solve SDE with the classical solvers for ODEs since the noisy part of the SDE has to be scaled differently then the deterministic part with respect to the time step. But there exist many solvers for SDEs. A classical and easy method is the stochastic Euler solver. It works by iterating - -['x(t+__Delta t) = x(t) + __Delta t f(x(t)) + __Delta t[super 1/2] g(x) __xi(t)] - -where __xi(t) is an independent normal distributed random variable. - -Now we will implement this method. We will call the stepper -`stochastic_euler`. It models the __stepper concept. For simplicity, we fix -the state type to be an `array< double , N >` The class definition looks like - -[stochastic_euler_class_definition] - -The types are needed in order to fulfill the stepper concept. As internal state and deriv type we use simple arrays in the stochastic Euler, they are needed for the temporaries. The stepper has the order one which is returned from the `order()` function. - -The system functions needs to calculate the deterministic and the stochastic part of our stochastic differential equation. So it might be suitable that the system function is a pair of functions. The first element of the pair computes the deterministic part and the second the stochastic one. Then, the second part also needs to calculate the random numbers in order to simulate the stochastic process. We can now implement the `do_step` method - -[stochastic_euler_do_step] - -This is all. It is quite simple and the stochastic Euler stepper implement here is quite general. Of course it can be enhanced, for example - -* use of operations and algebras as well as the resizing mechanism for maximal flexibility and portability -* use of `boost::ref` for the system functions -* use of `boost::range` for the state type in the `do_step` method -* ... - -Now, lets look how we use the new stepper. A nice example is the Ornstein-Uhlenbeck process. It consists of a simple Brownian motion overlapped with an relaxation process. Its SDE reads - -['dx/dt = - x + __xi] - -where __xi is Gaussian white noise with standard deviation ['__sigma]. Implementing the Ornstein-Uhlenbeck process is quite simple. We need two functions or functors - one for the deterministic and one for the stochastic part: - -[stochastic_euler_ornstein_uhlenbeck_def] - -In the stochastic part we have used the Mersenne twister for the random number generation and a Gaussian white noise generator `normal_distribution` with standard deviation ['__sigma]. Now, we can use the stochastic Euler stepper with the integrate functions: - -[ornstein_uhlenbeck_main] - -Note, how we have used the `make_pair` function for the generation of the system function. - -[endsect] - -[section Custom Runge-Kutta steppers] - -[import ../examples/heun.cpp] - -odeint provides a C++ template meta-algorithm for constructing arbitrary -Runge-Kutta schemes [footnote M. Mulansky, K. Ahnert, Template-Metaprogramming -applied to numerical problems, [@http://arxiv.org/abs/1110.3233 arxiv:1110.3233]]. Some schemes are predefined in odeint, for -example the classical Runge-Kutta of fourth order, or the -Runge-Kutta-Cash-Karp 54 and the Runge-Kutta-Fehlberg 78 method. -You can use this meta algorithm to construct you own solvers. This has the -advantage that you can make full use of odeint's algebra and operation system. - -Consider for example the method of Heun, defined by the following Butcher tableau: - -[pre -c1 = 0 - -c2 = 1/3, a21 = 1/3 - -c3 = 2/3, a31 = 0 , a32 = 2/3 - - b1 = 1/4, b2 = 0 , b3 = 3/4 -] - -Implementing this method is very easy. First you have to define the constants: - -[heun_define_coefficients] - -While this might look cumbersome, packing all -parameters into a templatized class which is not immediately evaluated has the -advantage that you can change the `value_type` of your stepper to any type you -like - presumably arbitrary precision types. One could also instantiate -the coefficients directly - -`` -const boost::array< double , 1 > heun_a1 = {{ 1.0 / 3.0 }}; -const boost::array< double , 2 > heun_a2 = {{ 0.0 , 2.0 / 3.0 }}; -const boost::array< double , 3 > heun_b = {{ 1.0 / 4.0 , 0.0 , 3.0 / 4.0 }}; -const boost::array< double , 3 > heun_c = {{ 0.0 , 1.0 / 3.0 , 2.0 / 3.0 }}; -`` - -But then you are nailed down to use doubles. - -Next, you need to define your stepper, note that the Heun method has 3 stages -and produces approximations of order 3: - -[heun_stepper_definition] - -That's it. Now, we have a new stepper method and we can use it, for example with the Lorenz system: - -[heun_example] - -[endsect] - - -[endsect] diff --git a/libs/numeric/odeint/doc/examples_table.qbk b/libs/numeric/odeint/doc/examples_table.qbk deleted file mode 100644 index e28b7cd7a..000000000 --- a/libs/numeric/odeint/doc/examples_table.qbk +++ /dev/null @@ -1,142 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2013 Karsten Ahnert - Copyright 2011-2012 Mario Mulansky - Copyright 2012 Sylwester Arabas - Copyright 2013 Pascal Germroth - - 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) -=============================================================================/] - - -[table Examples Overview - [[File] [Brief Description]] - - [[[github_link examples/bind_member_functions.cpp bind_member_functions.cpp]] - [This examples shows how member functions can be used as system functions in odeint.]] - - [[[github_link examples/bind_member_functions.cpp bind_member_functions_cpp11.cpp]] - [This examples shows how member functions can be used as system functions in odeint with `std::bind` in C++11.]] - - [[[github_link examples/bulirsch_stoer.cpp bulirsch_stoer.cpp]] - [Shows the usage of the Bulirsch-Stoer method.]] - - [[[github_link examples/chaotic_system.cpp chaotic_system.cpp]] - [The chaotic system examples integrates the Lorenz system and calculates the Lyapunov exponents.]] - - [[[github_link examples/elliptic_functions.cpp elliptic_functions.cpp]] - [Example calculating the elliptic functions using Bulirsch-Stoer and Runge-Kutta-Dopri5 Steppers with dense output.]] - - [[[github_link examples/fpu.cpp fpu.cpp]] - [The Fermi-Pasta-Ulam (FPU) example shows how odeint can be used to integrate lattice systems.]] - - [[[github_link examples/generation_functions.cpp generation_functions.cpp]] - [Shows skeletal code on how to implement own factory functions.]] - - [[[github_link examples/harmonic_oscillator.cpp harmonic_oscillator.cpp]] - [The harmonic oscillator examples gives a brief introduction to odeint and shows the usage of the classical Runge-Kutta-solvers.]] - - [[[github_link examples/harmonic_oscillator_units.cpp harmonic_oscillator_units.cpp]] - [This examples shows how __boost_units can be used with odeint.]] - - [[[github_link examples/heun.cpp heun.cpp]] - [The Heun example shows how an custom Runge-Kutta stepper can be created with odeint generic Runge-Kutta method.]] - - [[[github_link examples/list_lattice.cpp list_lattice.cpp]] - [Example of a phase lattice integration using `std::list` as state type.]] - - [[[github_link examples/lorenz_point.cpp lorenz_point.cpp]] - [Alternative way of integrating lorenz by using a self defined point3d data type as state type.]] - - [[[github_link examples/my_vector.cpp my_vector.cpp]] - [Simple example showing how to get odeint to work with a self-defined vector type.]] - - [[[github_link examples/phase_oscillator_ensemble.cpp phase_oscillator_ensemble.cpp]] - [The phase oscillator ensemble example shows how globally coupled oscillators can be analyzed and how statistical measures can be computed during integration.]] - - [[[github_link examples/resizing_lattice.cpp resizing_lattice.cpp]] - [Shows the strength of odeint's memory management by simulating a Hamiltonian system on an expanding lattice.]] - - [[[github_link examples/simple1d.cpp simple1d.cpp]] - [Integrating a simple, one-dimensional ODE showing the usage of integrate- and generate-functions.]] - - [[[github_link examples/solar_system.cpp solar_system.cpp]] - [The solar system example shows the usage of the symplectic solvers.]] - - [[[github_link examples/stepper_details.cpp stepper_details.cpp]] - [Trivial example showing the usability of the several stepper classes.]] - - [[[github_link examples/stiff_system.cpp stiff_system.cpp]] - [The stiff system example shows the usage of the stiff solvers using the Jacobian of the system function.]] - - [[[github_link examples/stochastic_euler.cpp stochastic_euler.cpp]] - [Implementation of a custom stepper - the stochastic euler - for solving stochastic differential equations.]] - - [[[github_link examples/stuart_landau.cpp stuart_landau.cpp]] - [The Stuart-Landau example shows how odeint can be used with complex state types.]] - - [[[github_link examples/two_dimensional_phase_lattice.cpp two_dimensional_phase_lattice.cpp]] - [The 2D phase oscillator example shows how a two-dimensional lattice works with odeint and how matrix types can be used as state types in odeint.]] - - [[[github_link examples/van_der_pol_stiff.cpp van_der_pol_stiff.cpp]] - [This stiff system example again shows the usage of the stiff solvers by integrating the van der Pol oscillator.]] - - [[[github_link examples/gmpxx/lorenz_gmpxx.cpp gmpxx/lorenz_gmpxx.cpp]] - [This examples integrates the Lorenz system by means of an arbitrary precision type.]] - - [[[github_link examples/mtl/gauss_packet.cpp mtl/gauss_packet.cpp]] - [The MTL-Gauss-packet example shows how the MTL can be easily used with odeint.]] - - [[[github_link examples/mtl/implicit_euler_mtl.cpp mtl/implicit_euler_mtl.cpp]] - [This examples shows the usage of the MTL implicit Euler method with a sparse matrix type.]] - - [[[github_link examples/thrust/phase_oscillator_ensemble.cu thrust/phase_oscillator_ensemble.cu]] - [The Thrust phase oscillator ensemble example shows how globally coupled oscillators can be analyzed with Thrust and CUDA, employing the power of modern graphic devices.]] - - [[[github_link examples/thrust/phase_oscillator_chain.cu thrust/phase_oscillator_chain.cu]] - [The Thrust phase oscillator chain example shows how chains of nearest neighbor coupled oscillators can be integrated with Thrust and odeint.]] - - [[[github_link examples/thrust/lorenz_parameters.cu thrust/lorenz_parameters.cu]] - [The Lorenz parameters examples show how ensembles of ordinary differential equations can be solved by means of Thrust to study - the dependence of an ODE on some parameters.]] - - [[[github_link examples/thrust/relaxation.cu thrust/relaxation.cu]] - [Another examples for the usage of Thrust.]] - - [[[github_link examples/ublas/lorenz_ublas.cpp ublas/lorenz_ublas.cpp]] - [This example shows how the ublas vector types can be used with odeint.]] - - [[[github_link examples/vexcl/lorenz_ensemble.cpp vexcl/lorenz_ensemble.cpp]] - [This example shows how the VexCL - a framework for OpenCL computation - can be used with odeint.]] - - [[[github_link examples/openmp/lorenz_ensemble_simple.cpp openmp/lorenz_ensemble_simple.cpp]] - [OpenMP Lorenz attractor parameter study with continuous data.]] - - [[[github_link examples/openmp/lorenz_ensemble.cpp openmp/lorenz_ensemble.cpp]] - [OpenMP Lorenz attractor parameter study with split data.]] - - [[[github_link examples/openmp/lorenz_ensemble.cpp openmp/lorenz_ensemble_nested.cpp]] - [OpenMP Lorenz attractor parameter study with nested `vector_space_algebra`.]] - - [[[github_link examples/openmp/phase_chain.cpp openmp/phase_chain.cpp]] - [OpenMP nearest neighbour coupled phase chain with continuous state.]] - - [[[github_link examples/openmp/phase_chain_omp_state.cpp openmp/phase_chain_omp_state.cpp]] - [OpenMP nearest neighbour coupled phase chain with split state.]] - - [[[github_link examples/mpi/phase_chain.cpp mpi/phase_chain.cpp]] - [MPI nearest neighbour coupled phase chain.]] - - [[[github_link examples/2d_lattice/spreading.cpp 2d_lattice/spreading.cpp]] - [This examples shows how a `vector< vector< T > >` can be used a state type for odeint and how a resizing mechanism of this state can be implemented.]] - - [[[github_link examples/quadmath/black_hole.cpp quadmath/black_hole.cpp]] - [This examples shows how gcc libquadmath can be used with odeint. It provides a high precision floating point type which is adapted to odeint in this example.]] - - [[[github_link examples/molecular_dynamics.cpp molecular_dynamics.cpp]] - [A very basic molecular dynamics simulation with the Velocity-Verlet method.]] - -] diff --git a/libs/numeric/odeint/doc/getting_started.qbk b/libs/numeric/odeint/doc/getting_started.qbk deleted file mode 100644 index 7819940da..000000000 --- a/libs/numeric/odeint/doc/getting_started.qbk +++ /dev/null @@ -1,142 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2013 Karsten Ahnert - Copyright 2011-2012 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - - - -[section Getting started] - -[section Overview] - -odeint is a library for solving initial value problems (IVP) of ordinary -differential equations. Mathematically, these problems are formulated as -follows: - -['x'(t) = f(x,t)], ['x(0) = x0]. - -['x] and ['f] can be vectors and the solution is some function ['x(t)] fulfilling both equations above. In the following we will refer to ['x'(t)] also `dxdt` which is also our notation for the derivative in the source code. - -Ordinary differential equations occur nearly everywhere in natural sciences. For example, the whole Newtonian mechanics are described by second order differential equations. Be sure, you will find them in every discipline. They also occur if partial differential equations (PDEs) are discretized. Then, a system of coupled ordinary differential occurs, sometimes also referred as lattices ODEs. - -Numerical approximations for the solution ['x(t)] are calculated iteratively. The easiest algorithm is the Euler scheme, where starting at ['x(0)] one finds ['x(dt) = x(0) + dt f(x(0),0)]. Now one can use ['x(dt)] and obtain ['x(2dt)] in a similar way and so on. The Euler method is of order 1, that means the error at each step is ['~ dt[super 2]]. This is, of course, not very satisfying, which is why the Euler method is rarely used for real life problems and serves just as illustrative example. - -The main focus of odeint is to provide numerical methods implemented in a way where the algorithm is completely independent on the data structure used to represent the state /x/. -In doing so, odeint is applicable for a broad variety of situations and it can be used with many other libraries. Besides the usual case where the state is defined as a `std::vector` or a `boost::array`, we provide native support for the following libraries: - -* __ublas -* __thrust, making odeint naturally running on CUDA devices -* gsl_vector for compatibility with the many numerical function in the GSL -* __boost_range -* __boost_fusion (the state type can be a fusion vector) -* __boost_units -* __intel_mkl for maximum performance -* __vexcl for OpenCL -* __boost_graph (still experimentally) - -In odeint, the following algorithms are implemented: - -[include stepper_table.qbk] - -[endsect] - - - -[section Usage, Compilation, Headers] - -odeint is a header-only library, no linking against pre-compiled code is required. It can be included by - -`` -#include -`` - -which includes all headers of the library. All functions and classes from odeint live in the namespace - -`` - using namespace boost::numeric::odeint; -`` - -It is also possible to include only parts of the library. This is the recommended way since it saves a lot of compilation time. - -* `#include ` - the include path for all steppers, XYZ is a placeholder for a stepper. -* `#include ` - all algebras. -* `#include ` - the utility functions like `is_resizeable`, `same_size`, or `resize`. -* `#include ` - the integrate routines. -* `#include ` - the range and iterator functions. -* `#include ` - any binders to external libraries. - - - -[endsect] - -[section Short Example] - -Imaging, you want to numerically integrate a harmonic oscillator with -friction. The equations of motion are given by ['x'' = -x + __gamma x']. -Odeint only deals with first order ODEs that have no higher derivatives than -x' involved. However, any higher order ODE can be transformed to a system of -first order ODEs by introducing the new variables ['q=x] and ['p=x'] such that ['w=(q,p)]. To apply numerical integration one first has to design the right hand side of the equation ['w' = f(w) = (p,-q+__gamma p)]: - -[import ../examples/harmonic_oscillator.cpp] -[rhs_function] - -Here we chose `vector` as the state type, but others are also -possible, for example `boost::array`. odeint is designed in such a -way that you can easily use your own state types. Next, the ODE is defined -which is in this case a simple function calculating ['f(x)]. The parameter -signature of this function is crucial: the integration methods will always -call them in the form `f(x, dxdt, t)` (there are exceptions for some special routines). So, even if there is no explicit time dependence, one has to define `t` as a function parameter. - -Now, we have to define the initial state from which the integration should start: - -[state_initialization] - -For the integration itself we'll use the `integrate` function, which is a convenient way to get quick results. It is based on the error-controlled `runge_kutta54_cash_karp` stepper (5th order) and uses adaptive step-size. - -[integration] - -The integrate function expects as parameters the rhs of the ode as defined -above, the initial state `x`, the start-and end-time of the integration as -well as the initial time step=size. Note, that `integrate` uses an adaptive step-size during -the integration steps so the time points will not be equally spaced. The -integration returns the number of steps that were applied and updates x which -is set to the approximate solution of the ODE at the end of integration. - -It is also possible to represent the ode system as a class. The -rhs must then be implemented as a functor - a class with an overloaded function call operator: - -[rhs_class] - -which can be used via - -[integration_class] - -In order to observe the solution -during the integration steps all you have to do is -to provide a reasonable observer. An example is - -[integrate_observer] - -which stores the intermediate steps in a container. -Note, the argument structure of the ()-operator: odeint calls the observer -exactly in this way, providing the current state and time. Now, you only have -to pass this container to the integration function: - -[integrate_observ] - -That is all. You can use functional libraries like __boost_lambda or __boost_phoenix to ease the creation of observer functions. - -The full cpp file for this example can be found here: [github_link examples/harmonic_oscillator.cpp harmonic_oscillator.cpp] - - - -[endsect] - -[endsect] diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/adams_bashforth.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/adams_bashforth.html deleted file mode 100644 index b10d1083f..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/adams_bashforth.html +++ /dev/null @@ -1,328 +0,0 @@ - - - -Class template adams_bashforth - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template adams_bashforth

-

boost::numeric::odeint::adams_bashforth — The Adams-Bashforth multistep algorithm.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/adams_bashforth.hpp>
-
-template<size_t Steps, typename State, typename Value = double, 
-         typename Deriv = State, typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer, 
-         typename InitializingStepper = extrapolation_stepper< order_helper<Steps>::value,                                                    State, Value, Deriv, Time,                                                   Algebra, Operations, Resizer > > 
-class adams_bashforth : public algebra_stepper_base< Algebra, Operations > {
-public:
-  // types
-  typedef State                                       state_type;               
-  typedef state_wrapper< state_type >                 wrapped_state_type;       
-  typedef Value                                       value_type;               
-  typedef Deriv                                       deriv_type;               
-  typedef state_wrapper< deriv_type >                 wrapped_deriv_type;       
-  typedef Time                                        time_type;                
-  typedef Resizer                                     resizer_type;             
-  typedef stepper_tag                                 stepper_category;         
-  typedef InitializingStepper                         initializing_stepper_type;
-  typedef algebra_stepper_base< Algebra, Operations > algebra_stepper_base_type;
-  typedef algebra_stepper_base_type::algebra_type     algebra_type;             
-  typedef algebra_stepper_base_type::operations_type  operations_type;          
-  typedef unsigned short                              order_type;               
-  typedef unspecified                                 step_storage_type;        
-
-  // construct/copy/destruct
-  adams_bashforth(const algebra_type & = algebra_type());
-
-  // public member functions
-  order_type order(void) const;
-  template<typename System, typename StateInOut> 
-    void do_step(System, StateInOut &, time_type, time_type);
-  template<typename System, typename StateInOut> 
-    void do_step(System, const StateInOut &, time_type, time_type);
-  template<typename System, typename StateIn, typename StateOut> 
-    void do_step(System, const StateIn &, time_type, StateOut &, time_type);
-  template<typename System, typename StateIn, typename StateOut> 
-    void do_step(System, const StateIn &, time_type, const StateOut &, 
-                 time_type);
-  template<typename StateType> void adjust_size(const StateType &);
-  const step_storage_type & step_storage(void) const;
-  step_storage_type & step_storage(void);
-  template<typename ExplicitStepper, typename System, typename StateIn> 
-    void initialize(ExplicitStepper, System, StateIn &, time_type &, 
-                    time_type);
-  template<typename System, typename StateIn> 
-    void initialize(System, StateIn &, time_type &, time_type);
-  void reset(void);
-  bool is_initialized(void) const;
-  const initializing_stepper_type & initializing_stepper(void) const;
-  initializing_stepper_type & initializing_stepper(void);
-
-  // private member functions
-  template<typename System, typename StateIn, typename StateOut> 
-    void do_step_impl(System, const StateIn &, time_type, StateOut &, 
-                      time_type);
-  template<typename StateIn> bool resize_impl(const StateIn &);
-
-  // public data members
-  static const size_t steps;
-  static const order_type order_value;
-};
-
-

Description

-

The Adams-Bashforth method is a multi-step algorithm with configurable step number. The step number is specified as template parameter Steps and it then uses the result from the previous Steps steps. See also en.wikipedia.org/wiki/Linear_multistep_method. Currently, a maximum of Steps=8 is supported. The method is explicit and fulfills the Stepper concept. Step size control or continuous output are not provided.

-

This class derives from algebra_base and inherits its interface via CRTP (current recurring template pattern). For more details see algebra_stepper_base.

-

-

-
-

Template Parameters

-
    -
  1. -
    size_t Steps
    -

    The number of steps (maximal 8).

    -
  2. -
  3. -
    typename State
    -

    The state type.

    -
  4. -
  5. -
    typename Value = double
    -

    The value type.

    -
  6. -
  7. -
    typename Deriv = State
    -

    The type representing the time derivative of the state.

    -
  8. -
  9. -
    typename Time = Value
    -

    The time representing the independent variable - the time.

    -
  10. -
  11. -
    typename Algebra = typename algebra_dispatcher< State >::algebra_type
    -

    The algebra type.

    -
  12. -
  13. -
    typename Operations = typename operations_dispatcher< State >::operations_type
    -

    The operations type.

    -
  14. -
  15. -
    typename Resizer = initially_resizer
    -

    The resizer policy type.

    -
  16. -
  17. -
    typename InitializingStepper = extrapolation_stepper< order_helper<Steps>::value,                                                    State, Value, Deriv, Time,                                                   Algebra, Operations, Resizer >
    -

    The stepper for the first two steps.

    -
  18. -
-
-
-

-adams_bashforth - public - construct/copy/destruct

-
  1. -
    adams_bashforth(const algebra_type & algebra = algebra_type());
    Constructs the adams_bashforth class. This constructor can be used as a default constructor if the algebra has a default constructor.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    algebra

    A copy of algebra is made and stored.

    -
-
-
-

-adams_bashforth public member functions

-
    -
  1. -
    order_type order(void) const;
    Returns the order of the algorithm, which is equal to the number of steps.

    -

    -
    ---- - - - - -

    Returns:

    order of the method.

    -
  2. -
  3. template<typename System, typename StateInOut> 
    -  void do_step(System system, StateInOut & x, time_type t, time_type dt);
  4. -
  5. -
    template<typename System, typename StateInOut> 
    -  void do_step(System system, const StateInOut & x, time_type t, time_type dt);
    Second version to solve the forwarding problem, can be called with Boost.Range as StateInOut.
  6. -
  7. template<typename System, typename StateIn, typename StateOut> 
    -  void do_step(System system, const StateIn & in, time_type t, StateOut & out, 
    -               time_type dt);
  8. -
  9. -
    template<typename System, typename StateIn, typename StateOut> 
    -  void do_step(System system, const StateIn & in, time_type t, 
    -               const StateOut & out, time_type dt);
    Second version to solve the forwarding problem, can be called with Boost.Range as StateOut.
  10. -
  11. -
    template<typename StateType> void adjust_size(const StateType & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  12. -
  13. -
    const step_storage_type & step_storage(void) const;
    Returns the storage of intermediate results.

    -

    -
    ---- - - - - -

    Returns:

    The storage of intermediate results.

    -
  14. -
  15. -
    step_storage_type & step_storage(void);
    Returns the storage of intermediate results.

    -

    -
    ---- - - - - -

    Returns:

    The storage of intermediate results.

    -
  16. -
  17. template<typename ExplicitStepper, typename System, typename StateIn> 
    -  void initialize(ExplicitStepper explicit_stepper, System system, 
    -                  StateIn & x, time_type & t, time_type dt);
  18. -
  19. template<typename System, typename StateIn> 
    -  void initialize(System system, StateIn & x, time_type & t, time_type dt);
  20. -
  21. -
    void reset(void);
    Resets the internal buffer of the stepper.
  22. -
  23. -
    bool is_initialized(void) const;
    Returns true if the stepper has been initialized.

    -

    -
    ---- - - - - -

    Returns:

    bool true if stepper is initialized, false otherwise

    -
  24. -
  25. -
    const initializing_stepper_type & initializing_stepper(void) const;
    Returns the internal initializing stepper instance.

    -

    -
    ---- - - - - -

    Returns:

    initializing_stepper

    -
  26. -
  27. -
    initializing_stepper_type & initializing_stepper(void);
    Returns the internal initializing stepper instance.

    -

    -
    ---- - - - - -

    Returns:

    initializing_stepper

    -
  28. -
-
-
-

-adams_bashforth private member functions

-
    -
  1. template<typename System, typename StateIn, typename StateOut> 
    -  void do_step_impl(System system, const StateIn & in, time_type t, 
    -                    StateOut & out, time_type dt);
  2. -
  3. template<typename StateIn> bool resize_impl(const StateIn & x);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/adams_bashforth_moulton.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/adams_bashforth_moulton.html deleted file mode 100644 index 719603c88..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/adams_bashforth_moulton.html +++ /dev/null @@ -1,257 +0,0 @@ - - - -Class template adams_bashforth_moulton - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template adams_bashforth_moulton

-

boost::numeric::odeint::adams_bashforth_moulton — The Adams-Bashforth-Moulton multistep algorithm.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/adams_bashforth_moulton.hpp>
-
-template<size_t Steps, typename State, typename Value = double, 
-         typename Deriv = State, typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer, 
-         typename InitializingStepper = runge_kutta4< State , Value , Deriv , Time , Algebra , Operations, Resizer > > 
-class adams_bashforth_moulton {
-public:
-  // types
-  typedef State                       state_type;               
-  typedef state_wrapper< state_type > wrapped_state_type;       
-  typedef Value                       value_type;               
-  typedef Deriv                       deriv_type;               
-  typedef state_wrapper< deriv_type > wrapped_deriv_type;       
-  typedef Time                        time_type;                
-  typedef Algebra                     algebra_type;             
-  typedef Operations                  operations_type;          
-  typedef Resizer                     resizer_type;             
-  typedef stepper_tag                 stepper_category;         
-  typedef InitializingStepper         initializing_stepper_type;
-  typedef unsigned short              order_type;               
-
-  // construct/copy/destruct
-  adams_bashforth_moulton(void);
-  adams_bashforth_moulton(const algebra_type &);
-
-  // public member functions
-  order_type order(void) const;
-  template<typename System, typename StateInOut> 
-    void do_step(System, StateInOut &, time_type, time_type);
-  template<typename System, typename StateInOut> 
-    void do_step(System, const StateInOut &, time_type, time_type);
-  template<typename System, typename StateIn, typename StateOut> 
-    void do_step(System, const StateIn &, time_type, const StateOut &, 
-                 time_type);
-  template<typename System, typename StateIn, typename StateOut> 
-    void do_step(System, const StateIn &, time_type, StateOut &, time_type);
-  template<typename StateType> void adjust_size(const StateType &);
-  template<typename ExplicitStepper, typename System, typename StateIn> 
-    void initialize(ExplicitStepper, System, StateIn &, time_type &, 
-                    time_type);
-  template<typename System, typename StateIn> 
-    void initialize(System, StateIn &, time_type &, time_type);
-
-  // private member functions
-  template<typename System, typename StateInOut> 
-    void do_step_impl1(System, StateInOut &, time_type, time_type);
-  template<typename System, typename StateIn, typename StateInOut> 
-    void do_step_impl2(System, StateIn const &, time_type, StateInOut &, 
-                       time_type);
-  template<typename StateIn> bool resize_impl(const StateIn &);
-
-  // public data members
-  static const size_t steps;
-  static const order_type order_value;
-};
-
-

Description

-

The Adams-Bashforth method is a multi-step predictor-corrector algorithm with configurable step number. The step number is specified as template parameter Steps and it then uses the result from the previous Steps steps. See also en.wikipedia.org/wiki/Linear_multistep_method. Currently, a maximum of Steps=8 is supported. The method is explicit and fulfills the Stepper concept. Step size control or continuous output are not provided.

-

This class derives from algebra_base and inherits its interface via CRTP (current recurring template pattern). For more details see algebra_stepper_base.

-

-

-
-

Template Parameters

-
    -
  1. -
    size_t Steps
    -

    The number of steps (maximal 8).

    -
  2. -
  3. -
    typename State
    -

    The state type.

    -
  4. -
  5. -
    typename Value = double
    -

    The value type.

    -
  6. -
  7. -
    typename Deriv = State
    -

    The type representing the time derivative of the state.

    -
  8. -
  9. -
    typename Time = Value
    -

    The time representing the independent variable - the time.

    -
  10. -
  11. -
    typename Algebra = typename algebra_dispatcher< State >::algebra_type
    -

    The algebra type.

    -
  12. -
  13. -
    typename Operations = typename operations_dispatcher< State >::operations_type
    -

    The operations type.

    -
  14. -
  15. -
    typename Resizer = initially_resizer
    -

    The resizer policy type.

    -
  16. -
  17. -
    typename InitializingStepper = runge_kutta4< State , Value , Deriv , Time , Algebra , Operations, Resizer >
    -

    The stepper for the first two steps.

    -
  18. -
-
-
-

-adams_bashforth_moulton - public - construct/copy/destruct

-
    -
  1. -
    adams_bashforth_moulton(void);
    Constructs the adams_bashforth class.
  2. -
  3. -
    adams_bashforth_moulton(const algebra_type & algebra);
    Constructs the adams_bashforth class. This constructor can be used as a default constructor if the algebra has a default constructor.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    algebra

    A copy of algebra is made and stored.

    -
  4. -
-
-
-

-adams_bashforth_moulton public member functions

-
    -
  1. -
    order_type order(void) const;
    Returns the order of the algorithm, which is equal to the number of steps+1.

    -

    -
    ---- - - - - -

    Returns:

    order of the method.

    -
  2. -
  3. template<typename System, typename StateInOut> 
    -  void do_step(System system, StateInOut & x, time_type t, time_type dt);
  4. -
  5. -
    template<typename System, typename StateInOut> 
    -  void do_step(System system, const StateInOut & x, time_type t, time_type dt);
    Second version to solve the forwarding problem, can be called with Boost.Range as StateInOut.
  6. -
  7. template<typename System, typename StateIn, typename StateOut> 
    -  void do_step(System system, const StateIn & in, time_type t, 
    -               const StateOut & out, time_type dt);
  8. -
  9. -
    template<typename System, typename StateIn, typename StateOut> 
    -  void do_step(System system, const StateIn & in, time_type t, StateOut & out, 
    -               time_type dt);
    Second version to solve the forwarding problem, can be called with Boost.Range as StateOut.
  10. -
  11. -
    template<typename StateType> void adjust_size(const StateType & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  12. -
  13. template<typename ExplicitStepper, typename System, typename StateIn> 
    -  void initialize(ExplicitStepper explicit_stepper, System system, 
    -                  StateIn & x, time_type & t, time_type dt);
  14. -
  15. template<typename System, typename StateIn> 
    -  void initialize(System system, StateIn & x, time_type & t, time_type dt);
  16. -
-
-
-

-adams_bashforth_moulton private member functions

-
    -
  1. template<typename System, typename StateInOut> 
    -  void do_step_impl1(System system, StateInOut & x, time_type t, time_type dt);
  2. -
  3. template<typename System, typename StateIn, typename StateInOut> 
    -  void do_step_impl2(System system, StateIn const & in, time_type t, 
    -                     StateInOut & out, time_type dt);
  4. -
  5. template<typename StateIn> bool resize_impl(const StateIn & x);
  6. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/adams_moulton.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/adams_moulton.html deleted file mode 100644 index cfe6bdd55..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/adams_moulton.html +++ /dev/null @@ -1,161 +0,0 @@ - - - -Class template adams_moulton - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template adams_moulton

-

boost::numeric::odeint::adams_moulton

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/adams_moulton.hpp>
-
-template<size_t Steps, typename State, typename Value = double, 
-         typename Deriv = State, typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class adams_moulton {
-public:
-  // types
-  typedef State                                                                           state_type;        
-  typedef state_wrapper< state_type >                                                     wrapped_state_type;
-  typedef Value                                                                           value_type;        
-  typedef Deriv                                                                           deriv_type;        
-  typedef state_wrapper< deriv_type >                                                     wrapped_deriv_type;
-  typedef Time                                                                            time_type;         
-  typedef Algebra                                                                         algebra_type;      
-  typedef Operations                                                                      operations_type;   
-  typedef Resizer                                                                         resizer_type;      
-  typedef stepper_tag                                                                     stepper_category;  
-  typedef adams_moulton< Steps, State, Value, Deriv, Time, Algebra, Operations, Resizer > stepper_type;      
-  typedef unsigned short                                                                  order_type;        
-  typedef unspecified                                                                     step_storage_type; 
-
-  // construct/copy/destruct
-  adams_moulton();
-  adams_moulton(algebra_type &);
-  adams_moulton & operator=(const adams_moulton &);
-
-  // public member functions
-  order_type order(void) const;
-  template<typename System, typename StateInOut, typename StateIn, 
-           typename ABBuf> 
-    void do_step(System, StateInOut &, StateIn const &, time_type, time_type, 
-                 const ABBuf &);
-  template<typename System, typename StateInOut, typename StateIn, 
-           typename ABBuf> 
-    void do_step(System, const StateInOut &, StateIn const &, time_type, 
-                 time_type, const ABBuf &);
-  template<typename System, typename StateIn, typename PredIn, 
-           typename StateOut, typename ABBuf> 
-    void do_step(System, const StateIn &, const PredIn &, time_type, 
-                 StateOut &, time_type, const ABBuf &);
-  template<typename System, typename StateIn, typename PredIn, 
-           typename StateOut, typename ABBuf> 
-    void do_step(System, const StateIn &, const PredIn &, time_type, 
-                 const StateOut &, time_type, const ABBuf &);
-  template<typename StateType> void adjust_size(const StateType &);
-  algebra_type & algebra();
-  const algebra_type & algebra() const;
-
-  // private member functions
-  template<typename System, typename StateIn, typename PredIn, 
-           typename StateOut, typename ABBuf> 
-    void do_step_impl(System, const StateIn &, const PredIn &, time_type, 
-                      StateOut &, time_type, const ABBuf &);
-  template<typename StateIn> bool resize_impl(const StateIn &);
-
-  // public data members
-  static const size_t steps;
-  static const order_type order_value;
-};
-
-

Description

-
-

-adams_moulton - public - construct/copy/destruct

-
    -
  1. adams_moulton();
  2. -
  3. adams_moulton(algebra_type & algebra);
  4. -
  5. adams_moulton & operator=(const adams_moulton & stepper);
  6. -
-
-
-

-adams_moulton public member functions

-
    -
  1. order_type order(void) const;
  2. -
  3. template<typename System, typename StateInOut, typename StateIn, 
    -         typename ABBuf> 
    -  void do_step(System system, StateInOut & x, StateIn const & pred, 
    -               time_type t, time_type dt, const ABBuf & buf);
  4. -
  5. template<typename System, typename StateInOut, typename StateIn, 
    -         typename ABBuf> 
    -  void do_step(System system, const StateInOut & x, StateIn const & pred, 
    -               time_type t, time_type dt, const ABBuf & buf);
  6. -
  7. template<typename System, typename StateIn, typename PredIn, 
    -         typename StateOut, typename ABBuf> 
    -  void do_step(System system, const StateIn & in, const PredIn & pred, 
    -               time_type t, StateOut & out, time_type dt, const ABBuf & buf);
  8. -
  9. template<typename System, typename StateIn, typename PredIn, 
    -         typename StateOut, typename ABBuf> 
    -  void do_step(System system, const StateIn & in, const PredIn & pred, 
    -               time_type t, const StateOut & out, time_type dt, 
    -               const ABBuf & buf);
  10. -
  11. template<typename StateType> void adjust_size(const StateType & x);
  12. -
  13. algebra_type & algebra();
  14. -
  15. const algebra_type & algebra() const;
  16. -
-
-
-

-adams_moulton private member functions

-
    -
  1. template<typename System, typename StateIn, typename PredIn, 
    -         typename StateOut, typename ABBuf> 
    -  void do_step_impl(System system, const StateIn & in, const PredIn & pred, 
    -                    time_type t, StateOut & out, time_type dt, 
    -                    const ABBuf & buf);
  2. -
  3. template<typename StateIn> bool resize_impl(const StateIn & x);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/adaptive_iterator.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/adaptive_iterator.html deleted file mode 100644 index 8bc72f914..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/adaptive_iterator.html +++ /dev/null @@ -1,91 +0,0 @@ - - - -Class template adaptive_iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template adaptive_iterator

-

boost::numeric::odeint::adaptive_iterator — ODE Iterator with adaptive step size. The value type of this iterator is the state type of the stepper.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/adaptive_iterator.hpp>
-
-template<typename Stepper, typename System, typename State> 
-class adaptive_iterator {
-public:
-  // construct/copy/destruct
-  adaptive_iterator(Stepper, System, State &, time_type, time_type, time_type);
-  adaptive_iterator(Stepper, System, State &);
-};
-
-

Description

-

Implements an iterator representing the solution of an ODE from t_start to t_end evaluated at steps with an adaptive step size dt. After each iteration the iterator dereferences to the state x at the next time t+dt where dt is controlled by the stepper. This iterator can be used with ControlledSteppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_adaptive routine.

-

adaptive_iterator is a model of single-pass iterator.

-

The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename Stepper
    -

    The stepper type which should be used during the iteration.

    -
  2. -
  3. -
    typename System
    -

    The type of the system function (ODE) which should be solved.

    -
  4. -
  5. -
    typename State
    -

    The state type of the ODE.

    -
  6. -
-
-
-

-adaptive_iterator - public - construct/copy/destruct

-
    -
  1. adaptive_iterator(Stepper stepper, System sys, State & s, time_type t_start, 
    -                  time_type t_end, time_type dt);
  2. -
  3. adaptive_iterator(Stepper stepper, System sys, State & s);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/adaptive_time_iterator.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/adaptive_time_iterator.html deleted file mode 100644 index 1b18c0ab9..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/adaptive_time_iterator.html +++ /dev/null @@ -1,92 +0,0 @@ - - - -Class template adaptive_time_iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template adaptive_time_iterator

-

boost::numeric::odeint::adaptive_time_iterator — ODE Iterator with adaptive step size. The value type of this iterator is a std::pair containing state and time.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/adaptive_time_iterator.hpp>
-
-template<typename Stepper, typename System, typename State> 
-class adaptive_time_iterator {
-public:
-  // construct/copy/destruct
-  adaptive_time_iterator(Stepper, System, State &, time_type, time_type, 
-                         time_type);
-  adaptive_time_iterator(Stepper, System, State &);
-};
-
-

Description

-

Implements an iterator representing the solution of an ODE from t_start to t_end evaluated at steps with an adaptive step size dt. After each iteration the iterator dereferences to a pair containing state and time at the next time point t+dt where dt is controlled by the stepper. This iterator can be used with ControlledSteppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_adaptive routine.

-

adaptive_iterator is a model of single-pass iterator.

-

The value type of this iterator is a std::pair of state and time of the stepper.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename Stepper
    -

    The stepper type which should be used during the iteration.

    -
  2. -
  3. -
    typename System
    -

    The type of the system function (ODE) which should be solved.

    -
  4. -
  5. -
    typename State
    -

    The state type of the ODE.

    -
  6. -
-
-
-

-adaptive_time_iterator - public - construct/copy/destruct

-
    -
  1. adaptive_time_iterator(Stepper stepper, System sys, State & s, 
    -                       time_type t_start, time_type t_end, time_type dt);
  2. -
  3. adaptive_time_iterator(Stepper stepper, System sys, State & s);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag.html deleted file mode 100644 index eb36d5c31..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag.html +++ /dev/null @@ -1,51 +0,0 @@ - - - -Struct template base_tag - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct template base_tag

-

boost::numeric::odeint::base_tag

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-template<typename tag> 
-struct base_tag {
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_contr_idp64221824.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_contr_idp64221824.html deleted file mode 100644 index dad8e0633..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_contr_idp64221824.html +++ /dev/null @@ -1,53 +0,0 @@ - - - -Struct base_tag<controlled_stepper_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct base_tag<controlled_stepper_tag>

-

boost::numeric::odeint::base_tag<controlled_stepper_tag>

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-
-struct base_tag<controlled_stepper_tag> {
-  // types
-  typedef controlled_stepper_tag type;
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_dense_idp64227712.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_dense_idp64227712.html deleted file mode 100644 index b8b27c132..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_dense_idp64227712.html +++ /dev/null @@ -1,53 +0,0 @@ - - - -Struct base_tag<dense_output_stepper_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct base_tag<dense_output_stepper_tag>

-

boost::numeric::odeint::base_tag<dense_output_stepper_tag>

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-
-struct base_tag<dense_output_stepper_tag> {
-  // types
-  typedef dense_output_stepper_tag type;
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_error_idp64215936.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_error_idp64215936.html deleted file mode 100644 index 787583c56..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_error_idp64215936.html +++ /dev/null @@ -1,53 +0,0 @@ - - - -Struct base_tag<error_stepper_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct base_tag<error_stepper_tag>

-

boost::numeric::odeint::base_tag<error_stepper_tag>

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-
-struct base_tag<error_stepper_tag> {
-  // types
-  typedef stepper_tag type;
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64217888.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64217888.html deleted file mode 100644 index 719374659..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64217888.html +++ /dev/null @@ -1,53 +0,0 @@ - - - -Struct base_tag<explicit_error_stepper_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct base_tag<explicit_error_stepper_tag>

-

boost::numeric::odeint::base_tag<explicit_error_stepper_tag>

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-
-struct base_tag<explicit_error_stepper_tag> {
-  // types
-  typedef stepper_tag type;
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64219856.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64219856.html deleted file mode 100644 index bd0cbb181..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64219856.html +++ /dev/null @@ -1,53 +0,0 @@ - - - -Struct base_tag<explicit_error_stepper_fsal_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct base_tag<explicit_error_stepper_fsal_tag>

-

boost::numeric::odeint::base_tag<explicit_error_stepper_fsal_tag>

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-
-struct base_tag<explicit_error_stepper_fsal_tag> {
-  // types
-  typedef stepper_tag type;
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64223776.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64223776.html deleted file mode 100644 index 9846a18fd..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64223776.html +++ /dev/null @@ -1,53 +0,0 @@ - - - -Struct base_tag<explicit_controlled_stepper_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct base_tag<explicit_controlled_stepper_tag>

-

boost::numeric::odeint::base_tag<explicit_controlled_stepper_tag>

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-
-struct base_tag<explicit_controlled_stepper_tag> {
-  // types
-  typedef controlled_stepper_tag type;
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64225744.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64225744.html deleted file mode 100644 index e6713b387..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_expli_idp64225744.html +++ /dev/null @@ -1,53 +0,0 @@ - - - -Struct base_tag<explicit_controlled_stepper_fsal_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct base_tag<explicit_controlled_stepper_fsal_tag>

-

boost::numeric::odeint::base_tag<explicit_controlled_stepper_fsal_tag>

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-
-struct base_tag<explicit_controlled_stepper_fsal_tag> {
-  // types
-  typedef controlled_stepper_tag type;
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_stepp_idp64213984.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_stepp_idp64213984.html deleted file mode 100644 index 845ea5a17..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/base_tag_stepp_idp64213984.html +++ /dev/null @@ -1,53 +0,0 @@ - - - -Struct base_tag<stepper_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct base_tag<stepper_tag>

-

boost::numeric::odeint::base_tag<stepper_tag>

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-
-struct base_tag<stepper_tag> {
-  // types
-  typedef stepper_tag type;
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/bulirsch_stoer.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/bulirsch_stoer.html deleted file mode 100644 index 4df21e0e7..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/bulirsch_stoer.html +++ /dev/null @@ -1,264 +0,0 @@ - - - -Class template bulirsch_stoer - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template bulirsch_stoer

-

boost::numeric::odeint::bulirsch_stoer — The Bulirsch-Stoer algorithm.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/bulirsch_stoer.hpp>
-
-template<typename State, typename Value = double, typename Deriv = State, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class bulirsch_stoer {
-public:
-  // types
-  typedef State      state_type;     
-  typedef Value      value_type;     
-  typedef Deriv      deriv_type;     
-  typedef Time       time_type;      
-  typedef Algebra    algebra_type;   
-  typedef Operations operations_type;
-  typedef Resizer    resizer_type;   
-
-  // construct/copy/destruct
-  bulirsch_stoer(value_type = 1E-6, value_type = 1E-6, value_type = 1.0, 
-                 value_type = 1.0, time_type = static_cast< time_type >(0));
-
-  // public member functions
-  template<typename System, typename StateInOut> 
-    controlled_step_result 
-    try_step(System, StateInOut &, time_type &, time_type &);
-  template<typename System, typename StateInOut> 
-    controlled_step_result 
-    try_step(System, const StateInOut &, time_type &, time_type &);
-  template<typename System, typename StateInOut, typename DerivIn> 
-    controlled_step_result 
-    try_step(System, StateInOut &, const DerivIn &, time_type &, time_type &);
-  template<typename System, typename StateIn, typename StateOut> 
-    boost::disable_if< boost::is_same< StateIn, time_type >, controlled_step_result >::type 
-    try_step(System, const StateIn &, time_type &, StateOut &, time_type &);
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    controlled_step_result 
-    try_step(System, const StateIn &, const DerivIn &, time_type &, 
-             StateOut &, time_type &);
-  void reset();
-  template<typename StateIn> void adjust_size(const StateIn &);
-
-  // private member functions
-  template<typename StateIn> bool resize_m_dxdt(const StateIn &);
-  template<typename StateIn> bool resize_m_xnew(const StateIn &);
-  template<typename StateIn> bool resize_impl(const StateIn &);
-  template<typename System, typename StateInOut> 
-    controlled_step_result 
-    try_step_v1(System, StateInOut &, time_type &, time_type &);
-  template<typename StateInOut> 
-    void extrapolate(size_t, state_table_type &, const value_matrix &, 
-                     StateInOut &);
-  time_type calc_h_opt(time_type, value_type, size_t) const;
-  controlled_step_result 
-  set_k_opt(size_t, const inv_time_vector &, const time_vector &, time_type &);
-  bool in_convergence_window(size_t) const;
-  bool should_reject(value_type, size_t) const;
-
-  // public data members
-  static const size_t m_k_max;
-};
-
-

Description

-

The Bulirsch-Stoer is a controlled stepper that adjusts both step size and order of the method. The algorithm uses the modified midpoint and a polynomial extrapolation compute the solution.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename State
    -

    The state type.

    -
  2. -
  3. -
    typename Value = double
    -

    The value type.

    -
  4. -
  5. -
    typename Deriv = State
    -

    The type representing the time derivative of the state.

    -
  6. -
  7. -
    typename Time = Value
    -

    The time representing the independent variable - the time.

    -
  8. -
  9. -
    typename Algebra = typename algebra_dispatcher< State >::algebra_type
    -

    The algebra type.

    -
  10. -
  11. -
    typename Operations = typename operations_dispatcher< State >::operations_type
    -

    The operations type.

    -
  12. -
  13. -
    typename Resizer = initially_resizer
    -

    The resizer policy type.

    -
  14. -
-
-
-

-bulirsch_stoer - public - construct/copy/destruct

-
  1. -
    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, 
    -               time_type max_dt = static_cast< time_type >(0));
    Constructs the bulirsch_stoer class, including initialization of the error bounds.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - -

    eps_abs

    Absolute tolerance level.

    eps_rel

    Relative tolerance level.

    factor_dxdt

    Factor for the weight of the derivative.

    factor_x

    Factor for the weight of the state.

    -
-
-
-

-bulirsch_stoer public member functions

-
    -
  1. template<typename System, typename StateInOut> 
    -  controlled_step_result 
    -  try_step(System system, StateInOut & x, time_type & t, time_type & dt);
  2. -
  3. -
    template<typename System, typename StateInOut> 
    -  controlled_step_result 
    -  try_step(System system, const StateInOut & x, time_type & t, time_type & dt);
    Second version to solve the forwarding problem, can be used with Boost.Range as StateInOut.
  4. -
  5. template<typename System, typename StateInOut, typename DerivIn> 
    -  controlled_step_result 
    -  try_step(System system, StateInOut & x, const DerivIn & dxdt, time_type & t, 
    -           time_type & dt);
  6. -
  7. template<typename System, typename StateIn, typename StateOut> 
    -  boost::disable_if< boost::is_same< StateIn, time_type >, controlled_step_result >::type 
    -  try_step(System system, const StateIn & in, time_type & t, StateOut & out, 
    -           time_type & dt);
  8. -
  9. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  controlled_step_result 
    -  try_step(System system, const StateIn & in, const DerivIn & dxdt, 
    -           time_type & t, StateOut & out, time_type & dt);
  10. -
  11. -
    void reset();
    Resets the internal state of the stepper.
  12. -
  13. -
    template<typename StateIn> void adjust_size(const StateIn & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  14. -
-
-
-

-bulirsch_stoer private member functions

-
    -
  1. template<typename StateIn> bool resize_m_dxdt(const StateIn & x);
  2. -
  3. template<typename StateIn> bool resize_m_xnew(const StateIn & x);
  4. -
  5. template<typename StateIn> bool resize_impl(const StateIn & x);
  6. -
  7. template<typename System, typename StateInOut> 
    -  controlled_step_result 
    -  try_step_v1(System system, StateInOut & x, time_type & t, time_type & dt);
  8. -
  9. template<typename StateInOut> 
    -  void extrapolate(size_t k, state_table_type & table, 
    -                   const value_matrix & coeff, StateInOut & xest);
  10. -
  11. time_type calc_h_opt(time_type h, value_type error, size_t k) const;
  12. -
  13. controlled_step_result 
    -set_k_opt(size_t k, const inv_time_vector & work, const time_vector & h_opt, 
    -          time_type & dt);
  14. -
  15. bool in_convergence_window(size_t k) const;
  16. -
  17. bool should_reject(value_type error, size_t k) const;
  18. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/bulirsch_stoer_dense_out.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/bulirsch_stoer_dense_out.html deleted file mode 100644 index 9198bb2f4..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/bulirsch_stoer_dense_out.html +++ /dev/null @@ -1,512 +0,0 @@ - - - -Class template bulirsch_stoer_dense_out - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template bulirsch_stoer_dense_out

-

boost::numeric::odeint::bulirsch_stoer_dense_out — The Bulirsch-Stoer algorithm.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/bulirsch_stoer_dense_out.hpp>
-
-template<typename State, typename Value = double, typename Deriv = State, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class bulirsch_stoer_dense_out {
-public:
-  // types
-  typedef State                    state_type;      
-  typedef Value                    value_type;      
-  typedef Deriv                    deriv_type;      
-  typedef Time                     time_type;       
-  typedef Algebra                  algebra_type;    
-  typedef Operations               operations_type; 
-  typedef Resizer                  resizer_type;    
-  typedef dense_output_stepper_tag stepper_category;
-
-  // construct/copy/destruct
-  bulirsch_stoer_dense_out(value_type = 1E-6, value_type = 1E-6, 
-                           value_type = 1.0, value_type = 1.0, 
-                           time_type = static_cast< time_type >(0), 
-                           bool = false);
-
-  // public member functions
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut, typename DerivOut> 
-    controlled_step_result 
-    try_step(System, const StateIn &, const DerivIn &, time_type &, 
-             StateOut &, DerivOut &, time_type &);
-  template<typename StateType> 
-    void initialize(const StateType &, const time_type &, const time_type &);
-  template<typename System> std::pair< time_type, time_type > do_step(System);
-  template<typename StateOut> void calc_state(time_type, StateOut &) const;
-  const state_type & current_state(void) const;
-  time_type current_time(void) const;
-  const state_type & previous_state(void) const;
-  time_type previous_time(void) const;
-  time_type current_time_step(void) const;
-  void reset();
-  template<typename StateIn> void adjust_size(const StateIn &);
-
-  // private member functions
-  template<typename StateInOut, typename StateVector> 
-    void extrapolate(size_t, StateVector &, const value_matrix &, 
-                     StateInOut &, size_t = 0);
-  template<typename StateVector> 
-    void extrapolate_dense_out(size_t, StateVector &, const value_matrix &, 
-                               size_t = 0);
-  time_type calc_h_opt(time_type, value_type, size_t) const;
-  bool in_convergence_window(size_t) const;
-  bool should_reject(value_type, size_t) const;
-  template<typename StateIn1, typename DerivIn1, typename StateIn2, 
-           typename DerivIn2> 
-    value_type prepare_dense_output(int, const StateIn1 &, const DerivIn1 &, 
-                                    const StateIn2 &, const DerivIn2 &, 
-                                    time_type);
-  template<typename DerivIn> 
-    void calculate_finite_difference(size_t, size_t, value_type, 
-                                     const DerivIn &);
-  template<typename StateOut> 
-    void do_interpolation(time_type, StateOut &) const;
-  template<typename StateIn> bool resize_impl(const StateIn &);
-  state_type & get_current_state(void);
-  const state_type & get_current_state(void) const;
-  state_type & get_old_state(void);
-  const state_type & get_old_state(void) const;
-  deriv_type & get_current_deriv(void);
-  const deriv_type & get_current_deriv(void) const;
-  deriv_type & get_old_deriv(void);
-  const deriv_type & get_old_deriv(void) const;
-  void toggle_current_state(void);
-
-  // public data members
-  static const size_t m_k_max;
-};
-
-

Description

-

The Bulirsch-Stoer is a controlled stepper that adjusts both step size and order of the method. The algorithm uses the modified midpoint and a polynomial extrapolation compute the solution. This class also provides dense output facility.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename State
    -

    The state type.

    -
  2. -
  3. -
    typename Value = double
    -

    The value type.

    -
  4. -
  5. -
    typename Deriv = State
    -

    The type representing the time derivative of the state.

    -
  6. -
  7. -
    typename Time = Value
    -

    The time representing the independent variable - the time.

    -
  8. -
  9. -
    typename Algebra = typename algebra_dispatcher< State >::algebra_type
    -

    The algebra type.

    -
  10. -
  11. -
    typename Operations = typename operations_dispatcher< State >::operations_type
    -

    The operations type.

    -
  12. -
  13. -
    typename Resizer = initially_resizer
    -

    The resizer policy type.

    -
  14. -
-
-
-

-bulirsch_stoer_dense_out - public - construct/copy/destruct

-
  1. -
    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);
    Constructs the bulirsch_stoer class, including initialization of the error bounds.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - - - - - -

    control_interpolation

    Set true to additionally control the error of the interpolation.

    eps_abs

    Absolute tolerance level.

    eps_rel

    Relative tolerance level.

    factor_dxdt

    Factor for the weight of the derivative.

    factor_x

    Factor for the weight of the state.

    -
-
-
-

-bulirsch_stoer_dense_out public member functions

-
    -
  1. -
    template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut, typename 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);
    Tries to perform one step.

    This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed. Also, the internal order of the stepper is adjusted if required.

    -

    - -

    -
    ---- - - - - - - - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

    dt

    The step size. Updated.

    dxdt

    The derivative of state.

    in

    The state of the ODE which should be solved.

    out

    Used to store the result of the step.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time. Updated if the step is successful.

    Returns:

    success if the step was accepted, fail otherwise.

    -
  2. -
  3. -
    template<typename StateType> 
    -  void initialize(const StateType & x0, const time_type & t0, 
    -                  const time_type & dt0);
    Initializes the dense output stepper.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - -

    dt0

    The initial time step.

    t0

    The initial time.

    x0

    The initial state.

    -
  4. -
  5. -
    template<typename System> 
    -  std::pair< time_type, time_type > do_step(System system);
    Does one time step. This is the main method that should be used to integrate an ODE with this stepper.
    - - - - - -
    [Note]Note

    initialize has to be called before using this method to set the initial conditions x,t and the stepsize.

    -

    - - -

    -
    ---- - - - - - - - - - - -

    Parameters:

    ---- - - - - -

    system

    The system function to solve, hence the r.h.s. of the ordinary differential equation. It must fulfill the Simple System concept.

    Returns:

    Pair with start and end time of the integration step.

    -
  6. -
  7. -
    template<typename StateOut> void calc_state(time_type t, StateOut & x) const;
    Calculates the solution at an intermediate point within the last step.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - -

    t

    The time at which the solution should be calculated, has to be in the current time interval.

    x

    The output variable where the result is written into.

    -
  8. -
  9. -
    const state_type & current_state(void) const;
    Returns the current state of the solution.

    -

    -
    ---- - - - - -

    Returns:

    The current state of the solution x(t).

    -
  10. -
  11. -
    time_type current_time(void) const;
    Returns the current time of the solution.

    -

    -
    ---- - - - - -

    Returns:

    The current time of the solution t.

    -
  12. -
  13. -
    const state_type & previous_state(void) const;
    Returns the last state of the solution.

    -

    -
    ---- - - - - -

    Returns:

    The last state of the solution x(t-dt).

    -
  14. -
  15. -
    time_type previous_time(void) const;
    Returns the last time of the solution.

    -

    -
    ---- - - - - -

    Returns:

    The last time of the solution t-dt.

    -
  16. -
  17. -
    time_type current_time_step(void) const;
    Returns the current step size.

    -

    -
    ---- - - - - -

    Returns:

    The current step size.

    -
  18. -
  19. -
    void reset();
    Resets the internal state of the stepper.
  20. -
  21. -
    template<typename StateIn> void adjust_size(const StateIn & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  22. -
-
-
-

-bulirsch_stoer_dense_out private member functions

-
    -
  1. template<typename StateInOut, typename StateVector> 
    -  void extrapolate(size_t k, StateVector & table, const value_matrix & coeff, 
    -                   StateInOut & xest, size_t order_start_index = 0);
  2. -
  3. template<typename StateVector> 
    -  void extrapolate_dense_out(size_t k, StateVector & table, 
    -                             const value_matrix & coeff, 
    -                             size_t order_start_index = 0);
  4. -
  5. time_type calc_h_opt(time_type h, value_type error, size_t k) const;
  6. -
  7. bool in_convergence_window(size_t k) const;
  8. -
  9. bool should_reject(value_type error, size_t k) const;
  10. -
  11. template<typename StateIn1, typename DerivIn1, typename StateIn2, 
    -         typename DerivIn2> 
    -  value_type prepare_dense_output(int k, const StateIn1 & x_start, 
    -                                  const DerivIn1 & dxdt_start, 
    -                                  const StateIn2 &, const DerivIn2 &, 
    -                                  time_type dt);
  12. -
  13. template<typename DerivIn> 
    -  void calculate_finite_difference(size_t j, size_t kappa, value_type fac, 
    -                                   const DerivIn & dxdt);
  14. -
  15. template<typename StateOut> 
    -  void do_interpolation(time_type t, StateOut & out) const;
  16. -
  17. template<typename StateIn> bool resize_impl(const StateIn & x);
  18. -
  19. state_type & get_current_state(void);
  20. -
  21. const state_type & get_current_state(void) const;
  22. -
  23. state_type & get_old_state(void);
  24. -
  25. const state_type & get_old_state(void) const;
  26. -
  27. deriv_type & get_current_deriv(void);
  28. -
  29. const deriv_type & get_current_deriv(void) const;
  30. -
  31. deriv_type & get_old_deriv(void);
  32. -
  33. const deriv_type & get_old_deriv(void) const;
  34. -
  35. void toggle_current_state(void);
  36. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_observer.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_observer.html deleted file mode 100644 index 23682eed8..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_observer.html +++ /dev/null @@ -1,78 +0,0 @@ - - - -Class template checked_observer - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template checked_observer

-

boost::numeric::odeint::checked_observer — Adapter to combine observer and checker.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/integrate/check_adapter.hpp>
-
-template<typename Observer, typename Checker> 
-class checked_observer {
-public:
-  // types
-  typedef Observer observer_type;
-  typedef Checker  checker_type; 
-
-  // construct/copy/destruct
-  checked_observer(observer_type &, checker_type &);
-
-  // public member functions
-  template<typename State, typename Time> 
-    void operator()(const State &, Time) const;
-};
-
-

Description

-
-

-checked_observer - public - construct/copy/destruct

-
  1. checked_observer(observer_type & observer, checker_type & checker);
-
-
-

-checked_observer public member functions

-
  1. template<typename State, typename Time> 
    -  void operator()(const State & state, Time t) const;
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_steppe_idp40575584.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_steppe_idp40575584.html deleted file mode 100644 index 81fb3936c..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_steppe_idp40575584.html +++ /dev/null @@ -1,86 +0,0 @@ - - - -Class template checked_stepper<ControlledStepper, Checker, controlled_stepper_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template checked_stepper<ControlledStepper, Checker, controlled_stepper_tag>

-

boost::numeric::odeint::checked_stepper<ControlledStepper, Checker, controlled_stepper_tag> — Adapter to combine controlled stepper and checker.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/integrate/check_adapter.hpp>
-
-template<typename ControlledStepper, typename Checker> 
-class checked_stepper<ControlledStepper, Checker, controlled_stepper_tag> {
-public:
-  // types
-  typedef ControlledStepper        stepper_type;
-  typedef Checker                  checker_type;
-  typedef stepper_type::state_type state_type;  
-  typedef stepper_type::value_type value_type;  
-  typedef stepper_type::deriv_type deriv_type;  
-  typedef stepper_type::time_type  time_type;   
-
-  // construct/copy/destruct
-  checked_stepper(stepper_type &, checker_type &);
-
-  // public member functions
-  template<typename System, typename StateInOut> 
-    controlled_step_result 
-    try_step(System, StateInOut &, time_type &, time_type &);
-};
-
-

Description

-
-

-checked_stepper - public - construct/copy/destruct

-
  1. -
    checked_stepper(stepper_type & stepper, checker_type & checker);
    Construct the checked_stepper.
-
-
-

-checked_stepper public member functions

-
  1. -
    template<typename System, typename StateInOut> 
    -  controlled_step_result 
    -  try_step(System system, StateInOut & state, time_type & t, time_type & dt);
    forward of the do_step method
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_steppe_idp40591776.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_steppe_idp40591776.html deleted file mode 100644 index 818d332b5..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_steppe_idp40591776.html +++ /dev/null @@ -1,104 +0,0 @@ - - - -Class template checked_stepper<DenseOutStepper, Checker, dense_output_stepper_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template checked_stepper<DenseOutStepper, Checker, dense_output_stepper_tag>

-

boost::numeric::odeint::checked_stepper<DenseOutStepper, Checker, dense_output_stepper_tag> — Adapter to combine dense out stepper and checker.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/integrate/check_adapter.hpp>
-
-template<typename DenseOutStepper, typename Checker> 
-class checked_stepper<DenseOutStepper, Checker, dense_output_stepper_tag> {
-public:
-  // types
-  typedef DenseOutStepper          stepper_type;
-  typedef Checker                  checker_type;
-  typedef stepper_type::state_type state_type;  
-  typedef stepper_type::value_type value_type;  
-  typedef stepper_type::deriv_type deriv_type;  
-  typedef stepper_type::time_type  time_type;   
-
-  // construct/copy/destruct
-  checked_stepper(stepper_type &, checker_type &);
-
-  // public member functions
-  template<typename System> std::pair< time_type, time_type > do_step(System);
-  template<typename StateType> 
-    void initialize(const StateType &, time_type, time_type);
-  template<typename StateOut> void calc_state(time_type, StateOut &) const;
-  template<typename StateOut> 
-    void calc_state(time_type, const StateOut &) const;
-  const state_type & current_state(void) const;
-  time_type current_time(void) const;
-  const state_type & previous_state(void) const;
-  time_type previous_time(void) const;
-  time_type current_time_step(void) const;
-};
-
-

Description

-
-

-checked_stepper - public - construct/copy/destruct

-
  1. -
    checked_stepper(stepper_type & stepper, checker_type & checker);
    Construct the checked_stepper.
-
-
-

-checked_stepper public member functions

-
    -
  1. template<typename System> 
    -  std::pair< time_type, time_type > do_step(System system);
  2. -
  3. template<typename StateType> 
    -  void initialize(const StateType & x0, time_type t0, time_type dt0);
  4. -
  5. template<typename StateOut> void calc_state(time_type t, StateOut & x) const;
  6. -
  7. template<typename StateOut> 
    -  void calc_state(time_type t, const StateOut & x) const;
  8. -
  9. const state_type & current_state(void) const;
  10. -
  11. time_type current_time(void) const;
  12. -
  13. const state_type & previous_state(void) const;
  14. -
  15. time_type previous_time(void) const;
  16. -
  17. time_type current_time_step(void) const;
  18. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_steppe_idp59310512.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_steppe_idp59310512.html deleted file mode 100644 index de60c3d2b..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_steppe_idp59310512.html +++ /dev/null @@ -1,85 +0,0 @@ - - - -Class template checked_stepper<Stepper, Checker, stepper_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template checked_stepper<Stepper, Checker, stepper_tag>

-

boost::numeric::odeint::checked_stepper<Stepper, Checker, stepper_tag> — Adapter to combine basic stepper and checker.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/integrate/check_adapter.hpp>
-
-template<typename Stepper, typename Checker> 
-class checked_stepper<Stepper, Checker, stepper_tag> {
-public:
-  // types
-  typedef Stepper                  stepper_type;
-  typedef Checker                  checker_type;
-  typedef stepper_type::state_type state_type;  
-  typedef stepper_type::value_type value_type;  
-  typedef stepper_type::deriv_type deriv_type;  
-  typedef stepper_type::time_type  time_type;   
-
-  // construct/copy/destruct
-  checked_stepper(stepper_type &, checker_type &);
-
-  // public member functions
-  template<typename System, typename StateInOut> 
-    void do_step(System, StateInOut &, const time_type, const time_type);
-};
-
-

Description

-
-

-checked_stepper - public - construct/copy/destruct

-
  1. -
    checked_stepper(stepper_type & stepper, checker_type & checker);
    Construct the checked_stepper.
-
-
-

-checked_stepper public member functions

-
  1. -
    template<typename System, typename StateInOut> 
    -  void do_step(System system, StateInOut & state, const time_type t, 
    -               const time_type dt);
    forward of the do_step method
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_stepper.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_stepper.html deleted file mode 100644 index d8930a2f5..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/checked_stepper.html +++ /dev/null @@ -1,63 +0,0 @@ - - - -Class template checked_stepper - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template checked_stepper

-

boost::numeric::odeint::checked_stepper

-
-

Synopsis

-
// In header: <boost/numeric/odeint/integrate/check_adapter.hpp>
-
-template<typename Stepper, typename Checker, 
-         typename StepperCategory = typename base_tag<typename Stepper::stepper_category>::type> 
-class checked_stepper {
-};
- -
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/const_step_iterator.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/const_step_iterator.html deleted file mode 100644 index 24d490c22..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/const_step_iterator.html +++ /dev/null @@ -1,92 +0,0 @@ - - - -Class template const_step_iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template const_step_iterator

-

boost::numeric::odeint::const_step_iterator — ODE Iterator with constant step size. The value type of this iterator is the state type of the stepper.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/const_step_iterator.hpp>
-
-template<typename Stepper, typename System, typename State> 
-class const_step_iterator {
-public:
-  // construct/copy/destruct
-  const_step_iterator(Stepper, System, State &, time_type, time_type, 
-                      time_type);
-  const_step_iterator(Stepper, System, State &);
-};
-
-

Description

-

Implements an iterator representing the solution of an ODE from t_start to t_end evaluated at steps with constant step size dt. After each iteration the iterator dereferences to the state x at the next time t+dt. This iterator can be used with Steppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_const routine.

-

const_step_iterator is a model of single-pass iterator.

-

The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename Stepper
    -

    The stepper type which should be used during the iteration.

    -
  2. -
  3. -
    typename System
    -

    The type of the system function (ODE) which should be solved.

    -
  4. -
  5. -
    typename State
    -

    The state type of the ODE.

    -
  6. -
-
-
-

-const_step_iterator - public - construct/copy/destruct

-
    -
  1. const_step_iterator(Stepper stepper, System sys, State & s, time_type t_start, 
    -                    time_type t_end, time_type dt);
  2. -
  3. const_step_iterator(Stepper stepper, System sys, State & s);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/const_step_time_iterator.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/const_step_time_iterator.html deleted file mode 100644 index 553c85624..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/const_step_time_iterator.html +++ /dev/null @@ -1,92 +0,0 @@ - - - -Class template const_step_time_iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template const_step_time_iterator

-

boost::numeric::odeint::const_step_time_iterator — ODE Iterator with constant step size. The value type of this iterator is a std::pair containing state and time.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/const_step_time_iterator.hpp>
-
-template<typename Stepper, typename System, typename State> 
-class const_step_time_iterator {
-public:
-  // construct/copy/destruct
-  const_step_time_iterator(Stepper, System, State &, time_type, time_type, 
-                           time_type);
-  const_step_time_iterator(Stepper, System, State &);
-};
-
-

Description

-

Implements an iterator representing the solution of an ODE from t_start to t_end evaluated at steps with constant step size dt. After each iteration the iterator dereferences to a pair containing state and time at the next time point t+dt.. This iterator can be used with Steppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_const routine.

-

const_step_time_iterator is a model of single-pass iterator.

-

The value type of this iterator is a pair with the state type and time type of the stepper.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename Stepper
    -

    The stepper type which should be used during the iteration.

    -
  2. -
  3. -
    typename System
    -

    The type of the system function (ODE) which should be solved.

    -
  4. -
  5. -
    typename State
    -

    The state type of the ODE.

    -
  6. -
-
-
-

-const_step_time_iterator - public - construct/copy/destruct

-
    -
  1. const_step_time_iterator(Stepper stepper, System sys, State & s, 
    -                         time_type t_start, time_type t_end, time_type dt);
  2. -
  3. const_step_time_iterator(Stepper stepper, System sys, State & s);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_run_idp62987792.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_run_idp62987792.html deleted file mode 100644 index 52c7f169e..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_run_idp62987792.html +++ /dev/null @@ -1,493 +0,0 @@ - - - -Class template controlled_runge_kutta<ErrorStepper, ErrorChecker, StepAdjuster, Resizer, explicit_error_stepper_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template controlled_runge_kutta<ErrorStepper, ErrorChecker, StepAdjuster, Resizer, explicit_error_stepper_tag>

-

boost::numeric::odeint::controlled_runge_kutta<ErrorStepper, ErrorChecker, StepAdjuster, Resizer, explicit_error_stepper_tag> — Implements step size control for Runge-Kutta steppers with error estimation.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/controlled_runge_kutta.hpp>
-
-template<typename ErrorStepper, typename ErrorChecker, typename StepAdjuster, 
-         typename Resizer> 
-class controlled_runge_kutta<ErrorStepper, ErrorChecker, StepAdjuster, Resizer, explicit_error_stepper_tag> {
-public:
-  // types
-  typedef ErrorStepper                    stepper_type;      
-  typedef stepper_type::state_type        state_type;        
-  typedef stepper_type::value_type        value_type;        
-  typedef stepper_type::deriv_type        deriv_type;        
-  typedef stepper_type::time_type         time_type;         
-  typedef stepper_type::algebra_type      algebra_type;      
-  typedef 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;  
-
-  // construct/copy/destruct
-  controlled_runge_kutta(const error_checker_type & = error_checker_type(), 
-                         const step_adjuster_type & = step_adjuster_type(), 
-                         const stepper_type & = stepper_type());
-
-  // public member functions
-  template<typename System, typename StateInOut> 
-    controlled_step_result 
-    try_step(System, StateInOut &, time_type &, time_type &);
-  template<typename System, typename StateInOut> 
-    controlled_step_result 
-    try_step(System, const StateInOut &, time_type &, time_type &);
-  template<typename System, typename StateInOut, typename DerivIn> 
-    controlled_step_result 
-    try_step(System, StateInOut &, const DerivIn &, time_type &, time_type &);
-  template<typename System, typename StateIn, typename StateOut> 
-    boost::disable_if< boost::is_same< StateIn, time_type >, controlled_step_result >::type 
-    try_step(System, const StateIn &, time_type &, StateOut &, time_type &);
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    controlled_step_result 
-    try_step(System, const StateIn &, const DerivIn &, time_type &, 
-             StateOut &, time_type &);
-  template<typename StateType> void adjust_size(const StateType &);
-  stepper_type & stepper(void);
-  const stepper_type & stepper(void) const;
-
-  // private member functions
-  template<typename System, typename StateInOut> 
-    controlled_step_result 
-    try_step_v1(System, StateInOut &, time_type &, time_type &);
-  template<typename StateIn> bool resize_m_xerr_impl(const StateIn &);
-  template<typename StateIn> bool resize_m_dxdt_impl(const StateIn &);
-  template<typename StateIn> bool resize_m_xnew_impl(const StateIn &);
-};
-
-

Description

-

This class implements the step size control for standard Runge-Kutta steppers with error estimation.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename ErrorStepper
    -

    The stepper type with error estimation, has to fulfill the ErrorStepper concept.

    -
  2. -
  3. -
    typename ErrorChecker
    -

    The error checker

    -
  4. -
  5. typename StepAdjuster
  6. -
  7. -
    typename Resizer
    -

    The resizer policy type.

    -
  8. -
-
-
-

-controlled_runge_kutta - public - construct/copy/destruct

-
  1. -
    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());
    Constructs the controlled Runge-Kutta stepper.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - -

    error_checker

    An instance of the error checker.

    stepper

    An instance of the underlying stepper.

    -
-
-
-

-controlled_runge_kutta public member functions

-
    -
  1. -
    template<typename System, typename StateInOut> 
    -  controlled_step_result 
    -  try_step(System system, StateInOut & x, time_type & t, time_type & dt);
    Tries to perform one step.

    This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed.

    -

    - -

    -
    ---- - - - - - - - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - -

    dt

    The step size. Updated.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time. Updated if the step is successful.

    x

    The state of the ODE which should be solved. Overwritten if the step is successful.

    Returns:

    success if the step was accepted, fail otherwise.

    -
  2. -
  3. -
    template<typename System, typename StateInOut> 
    -  controlled_step_result 
    -  try_step(System system, const StateInOut & x, time_type & t, time_type & dt);
    Tries to perform one step. Solves the forwarding problem and allows for using boost range as state_type.

    This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed.

    -

    - -

    -
    ---- - - - - - - - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - -

    dt

    The step size. Updated.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time. Updated if the step is successful.

    x

    The state of the ODE which should be solved. Overwritten if the step is successful. Can be a boost range.

    Returns:

    success if the step was accepted, fail otherwise.

    -
  4. -
  5. -
    template<typename System, typename StateInOut, typename DerivIn> 
    -  controlled_step_result 
    -  try_step(System system, StateInOut & x, const DerivIn & dxdt, time_type & t, 
    -           time_type & dt);
    Tries to perform one step.

    This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed.

    -

    - -

    -
    ---- - - - - - - - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - - - - - -

    dt

    The step size. Updated.

    dxdt

    The derivative of state.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time. Updated if the step is successful.

    x

    The state of the ODE which should be solved. Overwritten if the step is successful.

    Returns:

    success if the step was accepted, fail otherwise.

    -
  6. -
  7. -
    template<typename System, typename StateIn, typename StateOut> 
    -  boost::disable_if< boost::is_same< StateIn, time_type >, controlled_step_result >::type 
    -  try_step(System system, const StateIn & in, time_type & t, StateOut & out, 
    -           time_type & dt);
    Tries to perform one step.
    - - - - - -
    [Note]Note

    This method is disabled if state_type=time_type to avoid ambiguity.

    -

    -This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed.

    -

    - -

    -
    ---- - - - - - - - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - - - - - -

    dt

    The step size. Updated.

    in

    The state of the ODE which should be solved.

    out

    Used to store the result of the step.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time. Updated if the step is successful.

    Returns:

    success if the step was accepted, fail otherwise.

    -
  8. -
  9. -
    template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  controlled_step_result 
    -  try_step(System system, const StateIn & in, const DerivIn & dxdt, 
    -           time_type & t, StateOut & out, time_type & dt);
    Tries to perform one step.

    This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed.

    -

    - -

    -
    ---- - - - - - - - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

    dt

    The step size. Updated.

    dxdt

    The derivative of state.

    in

    The state of the ODE which should be solved.

    out

    Used to store the result of the step.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time. Updated if the step is successful.

    Returns:

    success if the step was accepted, fail otherwise.

    -
  10. -
  11. -
    template<typename StateType> void adjust_size(const StateType & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  12. -
  13. -
    stepper_type & stepper(void);
    Returns the instance of the underlying stepper.

    -

    -
    ---- - - - - -

    Returns:

    The instance of the underlying stepper.

    -
  14. -
  15. -
    const stepper_type & stepper(void) const;
    Returns the instance of the underlying stepper.

    -

    -
    ---- - - - - -

    Returns:

    The instance of the underlying stepper.

    -
  16. -
-
-
-

-controlled_runge_kutta private member functions

-
    -
  1. template<typename System, typename StateInOut> 
    -  controlled_step_result 
    -  try_step_v1(System system, StateInOut & x, time_type & t, time_type & dt);
  2. -
  3. template<typename StateIn> bool resize_m_xerr_impl(const StateIn & x);
  4. -
  5. template<typename StateIn> bool resize_m_dxdt_impl(const StateIn & x);
  6. -
  7. template<typename StateIn> bool resize_m_xnew_impl(const StateIn & x);
  8. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_run_idp63082720.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_run_idp63082720.html deleted file mode 100644 index abcd66727..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_run_idp63082720.html +++ /dev/null @@ -1,570 +0,0 @@ - - - -Class template controlled_runge_kutta<ErrorStepper, ErrorChecker, StepAdjuster, Resizer, explicit_error_stepper_fsal_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template controlled_runge_kutta<ErrorStepper, ErrorChecker, StepAdjuster, Resizer, explicit_error_stepper_fsal_tag>

-

boost::numeric::odeint::controlled_runge_kutta<ErrorStepper, ErrorChecker, StepAdjuster, Resizer, explicit_error_stepper_fsal_tag> — Implements step size control for Runge-Kutta FSAL steppers with error estimation.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/controlled_runge_kutta.hpp>
-
-template<typename ErrorStepper, typename ErrorChecker, typename StepAdjuster, 
-         typename Resizer> 
-class controlled_runge_kutta<ErrorStepper, ErrorChecker, StepAdjuster, Resizer, explicit_error_stepper_fsal_tag> {
-public:
-  // types
-  typedef ErrorStepper                         stepper_type;      
-  typedef stepper_type::state_type             state_type;        
-  typedef stepper_type::value_type             value_type;        
-  typedef stepper_type::deriv_type             deriv_type;        
-  typedef stepper_type::time_type              time_type;         
-  typedef stepper_type::algebra_type           algebra_type;      
-  typedef 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;  
-
-  // construct/copy/destruct
-  controlled_runge_kutta(const error_checker_type & = error_checker_type(), 
-                         const step_adjuster_type & = step_adjuster_type(), 
-                         const stepper_type & = stepper_type());
-
-  // public member functions
-  template<typename System, typename StateInOut> 
-    controlled_step_result 
-    try_step(System, StateInOut &, time_type &, time_type &);
-  template<typename System, typename StateInOut> 
-    controlled_step_result 
-    try_step(System, const StateInOut &, time_type &, time_type &);
-  template<typename System, typename StateIn, typename StateOut> 
-    boost::disable_if< boost::is_same< StateIn, time_type >, controlled_step_result >::type 
-    try_step(System, const StateIn &, time_type &, StateOut &, time_type &);
-  template<typename System, typename StateInOut, typename DerivInOut> 
-    controlled_step_result 
-    try_step(System, StateInOut &, DerivInOut &, time_type &, time_type &);
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut, typename DerivOut> 
-    controlled_step_result 
-    try_step(System, const StateIn &, const DerivIn &, time_type &, 
-             StateOut &, DerivOut &, time_type &);
-  void reset(void);
-  template<typename DerivIn> void initialize(const DerivIn &);
-  template<typename System, typename StateIn> 
-    void initialize(System, const StateIn &, time_type);
-  bool is_initialized(void) const;
-  template<typename StateType> void adjust_size(const StateType &);
-  stepper_type & stepper(void);
-  const stepper_type & stepper(void) const;
-
-  // private member functions
-  template<typename StateIn> bool resize_m_xerr_impl(const StateIn &);
-  template<typename StateIn> bool resize_m_dxdt_impl(const StateIn &);
-  template<typename StateIn> bool resize_m_dxdt_new_impl(const StateIn &);
-  template<typename StateIn> bool resize_m_xnew_impl(const StateIn &);
-  template<typename System, typename StateInOut> 
-    controlled_step_result 
-    try_step_v1(System, StateInOut &, time_type &, time_type &);
-};
-
-

Description

-

This class implements the step size control for FSAL Runge-Kutta steppers with error estimation.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename ErrorStepper
    -

    The stepper type with error estimation, has to fulfill the ErrorStepper concept.

    -
  2. -
  3. -
    typename ErrorChecker
    -

    The error checker

    -
  4. -
  5. typename StepAdjuster
  6. -
  7. -
    typename Resizer
    -

    The resizer policy type.

    -
  8. -
-
-
-

-controlled_runge_kutta - public - construct/copy/destruct

-
  1. -
    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());
    Constructs the controlled Runge-Kutta stepper.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - -

    error_checker

    An instance of the error checker.

    stepper

    An instance of the underlying stepper.

    -
-
-
-

-controlled_runge_kutta public member functions

-
    -
  1. -
    template<typename System, typename StateInOut> 
    -  controlled_step_result 
    -  try_step(System system, StateInOut & x, time_type & t, time_type & dt);
    Tries to perform one step.

    This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed.

    -

    - -

    -
    ---- - - - - - - - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - -

    dt

    The step size. Updated.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time. Updated if the step is successful.

    x

    The state of the ODE which should be solved. Overwritten if the step is successful.

    Returns:

    success if the step was accepted, fail otherwise.

    -
  2. -
  3. -
    template<typename System, typename StateInOut> 
    -  controlled_step_result 
    -  try_step(System system, const StateInOut & x, time_type & t, time_type & dt);
    Tries to perform one step. Solves the forwarding problem and allows for using boost range as state_type.

    This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed.

    -

    - -

    -
    ---- - - - - - - - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - -

    dt

    The step size. Updated.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time. Updated if the step is successful.

    x

    The state of the ODE which should be solved. Overwritten if the step is successful. Can be a boost range.

    Returns:

    success if the step was accepted, fail otherwise.

    -
  4. -
  5. -
    template<typename System, typename StateIn, typename StateOut> 
    -  boost::disable_if< boost::is_same< StateIn, time_type >, controlled_step_result >::type 
    -  try_step(System system, const StateIn & in, time_type & t, StateOut & out, 
    -           time_type & dt);
    Tries to perform one step.
    - - - - - -
    [Note]Note

    This method is disabled if state_type=time_type to avoid ambiguity.

    -

    -This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed.

    -

    - -

    -
    ---- - - - - - - - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - - - - - -

    dt

    The step size. Updated.

    in

    The state of the ODE which should be solved.

    out

    Used to store the result of the step.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time. Updated if the step is successful.

    Returns:

    success if the step was accepted, fail otherwise.

    -
  6. -
  7. -
    template<typename System, typename StateInOut, typename DerivInOut> 
    -  controlled_step_result 
    -  try_step(System system, StateInOut & x, DerivInOut & dxdt, time_type & t, 
    -           time_type & dt);
    Tries to perform one step.

    This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed.

    -

    - -

    -
    ---- - - - - - - - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - - - - - -

    dt

    The step size. Updated.

    dxdt

    The derivative of state.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time. Updated if the step is successful.

    x

    The state of the ODE which should be solved. Overwritten if the step is successful.

    Returns:

    success if the step was accepted, fail otherwise.

    -
  8. -
  9. -
    template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut, typename DerivOut> 
    -  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);
    Tries to perform one step.

    This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed.

    -

    - -

    -
    ---- - - - - - - - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - - - - - -

    dt

    The step size. Updated.

    in

    The state of the ODE which should be solved.

    out

    Used to store the result of the step.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time. Updated if the step is successful.

    Returns:

    success if the step was accepted, fail otherwise.

    -
  10. -
  11. -
    void reset(void);
    Resets the internal state of the underlying FSAL stepper.
  12. -
  13. -
    template<typename DerivIn> void initialize(const DerivIn & deriv);
    Initializes the internal state storing an internal copy of the derivative.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    deriv

    The initial derivative of the ODE.

    -
  14. -
  15. -
    template<typename System, typename StateIn> 
    -  void initialize(System system, const StateIn & x, time_type t);
    Initializes the internal state storing an internal copy of the derivative.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - -

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The initial time.

    x

    The initial state of the ODE which should be solved.

    -
  16. -
  17. -
    bool is_initialized(void) const;
    Returns true if the stepper has been initialized, false otherwise.

    -

    -
    ---- - - - - -

    Returns:

    true, if the stepper has been initialized, false otherwise.

    -
  18. -
  19. -
    template<typename StateType> void adjust_size(const StateType & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  20. -
  21. -
    stepper_type & stepper(void);
    Returns the instance of the underlying stepper.

    -

    -
    ---- - - - - -

    Returns:

    The instance of the underlying stepper.

    -
  22. -
  23. -
    const stepper_type & stepper(void) const;
    Returns the instance of the underlying stepper.

    -

    -
    ---- - - - - -

    Returns:

    The instance of the underlying stepper.

    -
  24. -
-
-
-

-controlled_runge_kutta private member functions

-
    -
  1. template<typename StateIn> bool resize_m_xerr_impl(const StateIn & x);
  2. -
  3. template<typename StateIn> bool resize_m_dxdt_impl(const StateIn & x);
  4. -
  5. template<typename StateIn> bool resize_m_dxdt_new_impl(const StateIn & x);
  6. -
  7. template<typename StateIn> bool resize_m_xnew_impl(const StateIn & x);
  8. -
  9. template<typename System, typename StateInOut> 
    -  controlled_step_result 
    -  try_step_v1(System system, StateInOut & x, time_type & t, time_type & dt);
  10. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_runge_kutta.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_runge_kutta.html deleted file mode 100644 index 870c40b9d..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_runge_kutta.html +++ /dev/null @@ -1,65 +0,0 @@ - - - -Class template controlled_runge_kutta - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template controlled_runge_kutta

-

boost::numeric::odeint::controlled_runge_kutta

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/controlled_runge_kutta.hpp>
-
-template<typename ErrorStepper, 
-         typename ErrorChecker = default_error_checker< typename ErrorStepper::value_type ,    typename ErrorStepper::algebra_type ,    typename ErrorStepper::operations_type >, 
-         typename StepAdjuster = default_step_adjuster< typename ErrorStepper::value_type ,    typename ErrorStepper::time_type >, 
-         typename Resizer = typename ErrorStepper::resizer_type, 
-         typename ErrorStepperCategory = typename ErrorStepper::stepper_category> 
-class controlled_runge_kutta {
-};
- -
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_stepper_tag.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_stepper_tag.html deleted file mode 100644 index 430035d17..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/controlled_stepper_tag.html +++ /dev/null @@ -1,51 +0,0 @@ - - - -Struct controlled_stepper_tag - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct controlled_stepper_tag

-

boost::numeric::odeint::controlled_stepper_tag

-
-

Synopsis

- -
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/default_error_checker.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/default_error_checker.html deleted file mode 100644 index ba41bf7c6..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/default_error_checker.html +++ /dev/null @@ -1,114 +0,0 @@ - - - -Class template default_error_checker - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template default_error_checker

-

boost::numeric::odeint::default_error_checker — The default error checker to be used with Runge-Kutta error steppers.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/controlled_runge_kutta.hpp>
-
-template<typename Value, typename Algebra, typename Operations> 
-class default_error_checker {
-public:
-  // types
-  typedef Value      value_type;     
-  typedef Algebra    algebra_type;   
-  typedef Operations operations_type;
-
-  // construct/copy/destruct
-  default_error_checker(value_type = static_cast< value_type >(1.0e-6), 
-                        value_type = static_cast< value_type >(1.0e-6), 
-                        value_type = static_cast< value_type >(1), 
-                        value_type = static_cast< value_type >(1));
-
-  // public member functions
-  template<typename State, typename Deriv, typename Err, typename Time> 
-    value_type error(const State &, const Deriv &, Err &, Time) const;
-  template<typename State, typename Deriv, typename Err, typename Time> 
-    value_type error(algebra_type &, const State &, const Deriv &, Err &, 
-                     Time) const;
-};
-
-

Description

-

This class provides the default mechanism to compare the error estimates reported by Runge-Kutta error steppers with user defined error bounds. It is used by the controlled_runge_kutta steppers.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename Value
    -

    The value type.

    -
  2. -
  3. -
    typename Algebra
    -

    The algebra type.

    -
  4. -
  5. -
    typename Operations
    -

    The operations type.

    -
  6. -
-
-
-

-default_error_checker - public - construct/copy/destruct

-
  1. default_error_checker(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));
-
-
-

-default_error_checker public member functions

-
    -
  1. template<typename State, typename Deriv, typename Err, typename Time> 
    -  value_type error(const State & x_old, const Deriv & dxdt_old, Err & x_err, 
    -                   Time dt) const;
  2. -
  3. template<typename State, typename Deriv, typename Err, typename Time> 
    -  value_type error(algebra_type & algebra, const State & x_old, 
    -                   const Deriv & dxdt_old, Err & x_err, Time dt) const;
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/default_rosenb_idp63704736.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/default_rosenb_idp63704736.html deleted file mode 100644 index 736c6381b..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/default_rosenb_idp63704736.html +++ /dev/null @@ -1,114 +0,0 @@ - - - -Struct template default_rosenbrock_coefficients - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct template default_rosenbrock_coefficients

-

boost::numeric::odeint::default_rosenbrock_coefficients

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/rosenbrock4.hpp>
-
-template<typename Value> 
-struct default_rosenbrock_coefficients {
-  // types
-  typedef Value          value_type;
-  typedef unsigned short order_type;
-
-  // construct/copy/destruct
-  default_rosenbrock_coefficients(void);
-
-  // public data members
-  const value_type gamma;
-  const value_type d1;
-  const value_type d2;
-  const value_type d3;
-  const value_type d4;
-  const value_type c2;
-  const value_type c3;
-  const value_type c4;
-  const value_type c21;
-  const value_type a21;
-  const value_type c31;
-  const value_type c32;
-  const value_type a31;
-  const value_type a32;
-  const value_type c41;
-  const value_type c42;
-  const value_type c43;
-  const value_type a41;
-  const value_type a42;
-  const value_type a43;
-  const value_type c51;
-  const value_type c52;
-  const value_type c53;
-  const value_type c54;
-  const value_type a51;
-  const value_type a52;
-  const value_type a53;
-  const value_type a54;
-  const value_type c61;
-  const value_type c62;
-  const value_type c63;
-  const value_type c64;
-  const value_type c65;
-  const value_type d21;
-  const value_type d22;
-  const value_type d23;
-  const value_type d24;
-  const value_type d25;
-  const value_type d31;
-  const value_type d32;
-  const value_type d33;
-  const value_type d34;
-  const value_type d35;
-  static const order_type stepper_order;
-  static const order_type error_order;
-};
-
-

Description

-
-

-default_rosenbrock_coefficients - public - construct/copy/destruct

-
  1. default_rosenbrock_coefficients(void);
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/default_step_adjuster.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/default_step_adjuster.html deleted file mode 100644 index 3a9c47a2a..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/default_step_adjuster.html +++ /dev/null @@ -1,86 +0,0 @@ - - - -Class template default_step_adjuster - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template default_step_adjuster

-

boost::numeric::odeint::default_step_adjuster

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/controlled_runge_kutta.hpp>
-
-template<typename Value, typename Time> 
-class default_step_adjuster {
-public:
-  // types
-  typedef Time  time_type; 
-  typedef Value value_type;
-
-  // construct/copy/destruct
-  default_step_adjuster(const time_type = static_cast< time_type >(0));
-
-  // public member functions
-  time_type decrease_step(time_type, const value_type, const int) const;
-  time_type increase_step(time_type, value_type, const int) const;
-  bool check_step_size_limit(const time_type);
-  time_type get_max_dt();
-};
-
-

Description

-
-

-default_step_adjuster - public - construct/copy/destruct

-
  1. default_step_adjuster(const time_type max_dt = static_cast< time_type >(0));
-
-
-

-default_step_adjuster public member functions

-
    -
  1. time_type decrease_step(time_type dt, const value_type error, 
    -                        const int error_order) const;
  2. -
  3. time_type increase_step(time_type dt, value_type error, 
    -                        const int stepper_order) const;
  4. -
  5. bool check_step_size_limit(const time_type dt);
  6. -
  7. time_type get_max_dt();
  8. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_r_idp63206624.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_r_idp63206624.html deleted file mode 100644 index 9411a312a..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_r_idp63206624.html +++ /dev/null @@ -1,383 +0,0 @@ - - - -Class template dense_output_runge_kutta<Stepper, stepper_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template dense_output_runge_kutta<Stepper, stepper_tag>

-

boost::numeric::odeint::dense_output_runge_kutta<Stepper, stepper_tag> — The class representing dense-output Runge-Kutta steppers.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/dense_output_runge_kutta.hpp>
-
-template<typename Stepper> 
-class dense_output_runge_kutta<Stepper, stepper_tag> {
-public:
-  // types
-  typedef Stepper                             stepper_type;             
-  typedef stepper_type::state_type            state_type;               
-  typedef stepper_type::wrapped_state_type    wrapped_state_type;       
-  typedef stepper_type::value_type            value_type;               
-  typedef stepper_type::deriv_type            deriv_type;               
-  typedef stepper_type::wrapped_deriv_type    wrapped_deriv_type;       
-  typedef stepper_type::time_type             time_type;                
-  typedef stepper_type::algebra_type          algebra_type;             
-  typedef stepper_type::operations_type       operations_type;          
-  typedef stepper_type::resizer_type          resizer_type;             
-  typedef dense_output_stepper_tag            stepper_category;         
-  typedef dense_output_runge_kutta< Stepper > dense_output_stepper_type;
-
-  // construct/copy/destruct
-  dense_output_runge_kutta(const stepper_type & = stepper_type());
-
-  // public member functions
-  template<typename StateType> 
-    void initialize(const StateType &, time_type, time_type);
-  template<typename System> std::pair< time_type, time_type > do_step(System);
-  template<typename StateOut> void calc_state(time_type, StateOut &) const;
-  template<typename StateOut> 
-    void calc_state(time_type, const StateOut &) const;
-  template<typename StateType> void adjust_size(const StateType &);
-  const state_type & current_state(void) const;
-  time_type current_time(void) const;
-  const state_type & previous_state(void) const;
-  time_type previous_time(void) const;
-  time_type current_time_step(void) const;
-
-  // private member functions
-  state_type & get_current_state(void);
-  const state_type & get_current_state(void) const;
-  state_type & get_old_state(void);
-  const state_type & get_old_state(void) const;
-  void toggle_current_state(void);
-  template<typename StateIn> bool resize_impl(const StateIn &);
-};
-
-

Description

-
- - - - - -
[Note]Note

In this stepper, the initialize method has to be called before using the do_step method.

-

-The dense-output functionality allows to interpolate the solution between subsequent integration points using intermediate results obtained during the computation. This version works based on a normal stepper without step-size control.

-

-

-
-

Template Parameters

-
  1. -
    typename Stepper
    -

    The stepper type of the underlying algorithm.

    -
-
-
-

-dense_output_runge_kutta - public - construct/copy/destruct

-
  1. -
    dense_output_runge_kutta(const stepper_type & stepper = stepper_type());
    Constructs the dense_output_runge_kutta class. An instance of the underlying stepper can be provided.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    stepper

    An instance of the underlying stepper.

    -
-
-
-

-dense_output_runge_kutta public member functions

-
    -
  1. -
    template<typename StateType> 
    -  void initialize(const StateType & x0, time_type t0, time_type dt0);
    Initializes the stepper. Has to be called before do_step can be used to set the initial conditions and the step size.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - -

    dt0

    The step size.

    t0

    The initial time, at which the step should be performed.

    x0

    The initial state of the ODE which should be solved.

    -
  2. -
  3. -
    template<typename System> 
    -  std::pair< time_type, time_type > do_step(System system);
    Does one time step.
    - - - - - -
    [Note]Note

    initialize has to be called before using this method to set the initial conditions x,t and the stepsize.

    -

    - - -

    -
    ---- - - - - - - - - - - -

    Parameters:

    ---- - - - - -

    system

    The system function to solve, hence the r.h.s. of the ordinary differential equation. It must fulfill the Simple System concept.

    Returns:

    Pair with start and end time of the integration step.

    -
  4. -
  5. -
    template<typename StateOut> void calc_state(time_type t, StateOut & x) const;
    Calculates the solution at an intermediate point.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - -

    t

    The time at which the solution should be calculated, has to be in the current time interval.

    x

    The output variable where the result is written into.

    -
  6. -
  7. -
    template<typename StateOut> 
    -  void calc_state(time_type t, const StateOut & x) const;
    Calculates the solution at an intermediate point. Solves the forwarding problem.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - -

    t

    The time at which the solution should be calculated, has to be in the current time interval.

    x

    The output variable where the result is written into, can be a boost range.

    -
  8. -
  9. -
    template<typename StateType> void adjust_size(const StateType & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  10. -
  11. -
    const state_type & current_state(void) const;
    Returns the current state of the solution.

    -

    -
    ---- - - - - -

    Returns:

    The current state of the solution x(t).

    -
  12. -
  13. -
    time_type current_time(void) const;
    Returns the current time of the solution.

    -

    -
    ---- - - - - -

    Returns:

    The current time of the solution t.

    -
  14. -
  15. -
    const state_type & previous_state(void) const;
    Returns the last state of the solution.

    -

    -
    ---- - - - - -

    Returns:

    The last state of the solution x(t-dt).

    -
  16. -
  17. -
    time_type previous_time(void) const;
    Returns the last time of the solution.

    -

    -
    ---- - - - - -

    Returns:

    The last time of the solution t-dt.

    -
  18. -
  19. -
    time_type current_time_step(void) const;
    Returns the current time step.

    -

    -
    ---- - - - - -

    Returns:

    dt.

    -
  20. -
-
-
-

-dense_output_runge_kutta private member functions

-
    -
  1. state_type & get_current_state(void);
  2. -
  3. const state_type & get_current_state(void) const;
  4. -
  5. state_type & get_old_state(void);
  6. -
  7. const state_type & get_old_state(void) const;
  8. -
  9. void toggle_current_state(void);
  10. -
  11. template<typename StateIn> bool resize_impl(const StateIn & x);
  12. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_r_idp63274768.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_r_idp63274768.html deleted file mode 100644 index 440cfcd6d..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_r_idp63274768.html +++ /dev/null @@ -1,150 +0,0 @@ - - - -Class template dense_output_runge_kutta<Stepper, explicit_controlled_stepper_fsal_tag> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template dense_output_runge_kutta<Stepper, explicit_controlled_stepper_fsal_tag>

-

boost::numeric::odeint::dense_output_runge_kutta<Stepper, explicit_controlled_stepper_fsal_tag> — The class representing dense-output Runge-Kutta steppers with FSAL property.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/dense_output_runge_kutta.hpp>
-
-template<typename Stepper> 
-class dense_output_runge_kutta<Stepper, explicit_controlled_stepper_fsal_tag> {
-public:
-  // types
-  typedef Stepper                               controlled_stepper_type;  
-  typedef controlled_stepper_type::stepper_type stepper_type;             
-  typedef stepper_type::state_type              state_type;               
-  typedef stepper_type::wrapped_state_type      wrapped_state_type;       
-  typedef stepper_type::value_type              value_type;               
-  typedef stepper_type::deriv_type              deriv_type;               
-  typedef stepper_type::wrapped_deriv_type      wrapped_deriv_type;       
-  typedef stepper_type::time_type               time_type;                
-  typedef stepper_type::algebra_type            algebra_type;             
-  typedef stepper_type::operations_type         operations_type;          
-  typedef stepper_type::resizer_type            resizer_type;             
-  typedef dense_output_stepper_tag              stepper_category;         
-  typedef dense_output_runge_kutta< Stepper >   dense_output_stepper_type;
-
-  // construct/copy/destruct
-  dense_output_runge_kutta(const controlled_stepper_type & = controlled_stepper_type());
-
-  // public member functions
-  template<typename StateType> 
-    void initialize(const StateType &, time_type, time_type);
-  template<typename System> std::pair< time_type, time_type > do_step(System);
-  template<typename StateOut> void calc_state(time_type, StateOut &) const;
-  template<typename StateOut> 
-    void calc_state(time_type, const StateOut &) const;
-  template<typename StateIn> bool resize(const StateIn &);
-  template<typename StateType> void adjust_size(const StateType &);
-  const state_type & current_state(void) const;
-  time_type current_time(void) const;
-  const state_type & previous_state(void) const;
-  time_type previous_time(void) const;
-  time_type current_time_step(void) const;
-
-  // private member functions
-  state_type & get_current_state(void);
-  const state_type & get_current_state(void) const;
-  state_type & get_old_state(void);
-  const state_type & get_old_state(void) const;
-  deriv_type & get_current_deriv(void);
-  const deriv_type & get_current_deriv(void) const;
-  deriv_type & get_old_deriv(void);
-  const deriv_type & get_old_deriv(void) const;
-  void toggle_current_state(void);
-};
-
-

Description

-

The interface is the same as for dense_output_runge_kutta< Stepper , stepper_tag >. This class provides dense output functionality based on methods with step size controlled

-

-

-
-

Template Parameters

-
  1. -
    typename Stepper
    -

    The stepper type of the underlying algorithm.

    -
-
-
-

-dense_output_runge_kutta - public - construct/copy/destruct

-
  1. dense_output_runge_kutta(const controlled_stepper_type & stepper = controlled_stepper_type());
-
-
-

-dense_output_runge_kutta public member functions

-
    -
  1. template<typename StateType> 
    -  void initialize(const StateType & x0, time_type t0, time_type dt0);
  2. -
  3. template<typename System> 
    -  std::pair< time_type, time_type > do_step(System system);
  4. -
  5. template<typename StateOut> void calc_state(time_type t, StateOut & x) const;
  6. -
  7. template<typename StateOut> 
    -  void calc_state(time_type t, const StateOut & x) const;
  8. -
  9. template<typename StateIn> bool resize(const StateIn & x);
  10. -
  11. template<typename StateType> void adjust_size(const StateType & x);
  12. -
  13. const state_type & current_state(void) const;
  14. -
  15. time_type current_time(void) const;
  16. -
  17. const state_type & previous_state(void) const;
  18. -
  19. time_type previous_time(void) const;
  20. -
  21. time_type current_time_step(void) const;
  22. -
-
-
-

-dense_output_runge_kutta private member functions

-
    -
  1. state_type & get_current_state(void);
  2. -
  3. const state_type & get_current_state(void) const;
  4. -
  5. state_type & get_old_state(void);
  6. -
  7. const state_type & get_old_state(void) const;
  8. -
  9. deriv_type & get_current_deriv(void);
  10. -
  11. const deriv_type & get_current_deriv(void) const;
  12. -
  13. deriv_type & get_old_deriv(void);
  14. -
  15. const deriv_type & get_old_deriv(void) const;
  16. -
  17. void toggle_current_state(void);
  18. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_runge_kutta.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_runge_kutta.html deleted file mode 100644 index fd4bf9f80..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_runge_kutta.html +++ /dev/null @@ -1,62 +0,0 @@ - - - -Class template dense_output_runge_kutta - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template dense_output_runge_kutta

-

boost::numeric::odeint::dense_output_runge_kutta

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/dense_output_runge_kutta.hpp>
-
-template<typename Stepper, 
-         typename StepperCategory = typename Stepper::stepper_category> 
-class dense_output_runge_kutta {
-};
- -
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_stepper_tag.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_stepper_tag.html deleted file mode 100644 index f900caa78..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/dense_output_stepper_tag.html +++ /dev/null @@ -1,51 +0,0 @@ - - - -Struct dense_output_stepper_tag - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct dense_output_stepper_tag

-

boost::numeric::odeint::dense_output_stepper_tag

-
-

Synopsis

- -
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/error_stepper_tag.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/error_stepper_tag.html deleted file mode 100644 index 5ed7c1e4f..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/error_stepper_tag.html +++ /dev/null @@ -1,51 +0,0 @@ - - - -Struct error_stepper_tag - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct error_stepper_tag

-

boost::numeric::odeint::error_stepper_tag

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-
-struct error_stepper_tag : public boost::numeric::odeint::stepper_tag {
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/euler.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/euler.html deleted file mode 100644 index 5f3657369..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/euler.html +++ /dev/null @@ -1,220 +0,0 @@ - - - -Class template euler - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template euler

-

boost::numeric::odeint::euler — An implementation of the Euler method.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/euler.hpp>
-
-template<typename State, typename Value = double, typename Deriv = State, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class euler : public explicit_stepper_base {
-public:
-  // types
-  typedef explicit_stepper_base< euler< ... >,... > stepper_base_type;
-  typedef stepper_base_type::state_type             state_type;       
-  typedef stepper_base_type::value_type             value_type;       
-  typedef stepper_base_type::deriv_type             deriv_type;       
-  typedef stepper_base_type::time_type              time_type;        
-  typedef stepper_base_type::algebra_type           algebra_type;     
-  typedef stepper_base_type::operations_type        operations_type;  
-  typedef stepper_base_type::resizer_type           resizer_type;     
-
-  // construct/copy/destruct
-  euler(const algebra_type & = algebra_type());
-
-  // public member functions
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type);
-  template<typename StateOut, typename StateIn1, typename StateIn2> 
-    void calc_state(StateOut &, time_type, const StateIn1 &, time_type, 
-                    const StateIn2 &, time_type) const;
-  template<typename StateType> void adjust_size(const StateType &);
-};
-
-

Description

-

The Euler method is a very simply solver for ordinary differential equations. This method should not be used for real applications. It is only useful for demonstration purposes. Step size control is not provided but trivial continuous output is available.

-

This class derives from explicit_stepper_base and inherits its interface via CRTP (current recurring template pattern), see explicit_stepper_base

-

-

-
-

Template Parameters

-
    -
  1. -
    typename State
    -

    The state type.

    -
  2. -
  3. -
    typename Value = double
    -

    The value type.

    -
  4. -
  5. -
    typename Deriv = State
    -

    The type representing the time derivative of the state.

    -
  6. -
  7. -
    typename Time = Value
    -

    The time representing the independent variable - the time.

    -
  8. -
  9. -
    typename Algebra = typename algebra_dispatcher< State >::algebra_type
    -

    The algebra type.

    -
  10. -
  11. -
    typename Operations = typename operations_dispatcher< State >::operations_type
    -

    The operations type.

    -
  12. -
  13. -
    typename Resizer = initially_resizer
    -

    The resizer policy type.

    -
  14. -
-
-
-

-euler - public - construct/copy/destruct

-
  1. -
    euler(const algebra_type & algebra = algebra_type());
    Constructs the euler class. This constructor can be used as a default constructor of the algebra has a default constructor.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    algebra

    A copy of algebra is made and stored inside explicit_stepper_base.

    -
-
-
-

-euler public member functions

-
    -
  1. -
    template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  void do_step_impl(System, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type, StateOut & out, time_type dt);
    This method performs one step. The derivative dxdt of in at the time t is passed to the method. The result is updated out of place, hence the input is in in and the output in out. Access to this step functionality is provided by explicit_stepper_base and do_step_impl should not be called directly.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - -

    dt

    The step size.

    dxdt

    The derivative of x at t.

    in

    The state of the ODE which should be solved. in is not modified in this method

    out

    The result of the step is written in out.

    -
  2. -
  3. -
    template<typename StateOut, typename StateIn1, typename StateIn2> 
    -  void calc_state(StateOut & x, time_type t, const StateIn1 & old_state, 
    -                  time_type t_old, const StateIn2 &, time_type) const;
    This method is used for continuous output and it calculates the state x at a time t from the knowledge of two states old_state and current_state at time points t_old and t_new.
  4. -
  5. -
    template<typename StateType> void adjust_size(const StateType & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  6. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_contr_idp64210304.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_contr_idp64210304.html deleted file mode 100644 index d0afd32be..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_contr_idp64210304.html +++ /dev/null @@ -1,53 +0,0 @@ - - - -Struct explicit_controlled_stepper_tag - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct explicit_controlled_stepper_tag

-

boost::numeric::odeint::explicit_controlled_stepper_tag

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-
-struct explicit_controlled_stepper_tag :
-  public boost::numeric::odeint::controlled_stepper_tag
-{
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_contr_idp64211312.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_contr_idp64211312.html deleted file mode 100644 index ff42ccfb6..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_contr_idp64211312.html +++ /dev/null @@ -1,53 +0,0 @@ - - - -Struct explicit_controlled_stepper_fsal_tag - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct explicit_controlled_stepper_fsal_tag

-

boost::numeric::odeint::explicit_controlled_stepper_fsal_tag

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-
-struct explicit_controlled_stepper_fsal_tag :
-  public boost::numeric::odeint::controlled_stepper_tag
-{
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_error_generic_rk.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_error_generic_rk.html deleted file mode 100644 index 6ff48ed29..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_error_generic_rk.html +++ /dev/null @@ -1,238 +0,0 @@ - - - -Class template explicit_error_generic_rk - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template explicit_error_generic_rk

-

boost::numeric::odeint::explicit_error_generic_rk — A generic implementation of explicit Runge-Kutta algorithms with error estimation. This class is as a base class for all explicit Runge-Kutta steppers with error estimation.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/explicit_error_generic_rk.hpp>
-
-template<size_t StageCount, size_t Order, size_t StepperOrder, 
-         size_t ErrorOrder, typename State, typename Value = double, 
-         typename Deriv = State, typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class explicit_error_generic_rk : public explicit_error_stepper_base {
-public:
-  // types
-  typedef explicit_stepper_base< ... >          stepper_base_type; 
-  typedef stepper_base_type::state_type         state_type;        
-  typedef stepper_base_type::wrapped_state_type wrapped_state_type;
-  typedef stepper_base_type::value_type         value_type;        
-  typedef stepper_base_type::deriv_type         deriv_type;        
-  typedef stepper_base_type::wrapped_deriv_type wrapped_deriv_type;
-  typedef stepper_base_type::time_type          time_type;         
-  typedef stepper_base_type::algebra_type       algebra_type;      
-  typedef stepper_base_type::operations_type    operations_type;   
-  typedef stepper_base_type::resizer_type       resizer_type;      
-  typedef unspecified                           rk_algorithm_type; 
-  typedef rk_algorithm_type::coef_a_type        coef_a_type;       
-  typedef rk_algorithm_type::coef_b_type        coef_b_type;       
-  typedef rk_algorithm_type::coef_c_type        coef_c_type;       
-
-  // construct/copy/destruct
-  explicit_error_generic_rk(const coef_a_type &, const coef_b_type &, 
-                            const coef_b_type &, const coef_c_type &, 
-                            const algebra_type & = algebra_type());
-
-  // public member functions
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut, typename Err> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type, Err &);
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type);
-  template<typename StateIn> void adjust_size(const StateIn &);
-
-  // private member functions
-  template<typename StateIn> bool resize_impl(const StateIn &);
-
-  // public data members
-  static const size_t stage_count;
-};
-
-

Description

-

This class implements the explicit Runge-Kutta algorithms with error estimation in a generic way. The Butcher tableau is passed to the stepper which constructs the stepper scheme with the help of a template-metaprogramming algorithm. ToDo : Add example!

-

This class derives explicit_error_stepper_base which provides the stepper interface.

-

-

-
-

Template Parameters

-
    -
  1. -
    size_t StageCount
    -

    The number of stages of the Runge-Kutta algorithm.

    -
  2. -
  3. -
    size_t Order
    -

    The order of a stepper if the stepper is used without error estimation.

    -
  4. -
  5. -
    size_t StepperOrder
    -

    The order of a step if the stepper is used with error estimation. Usually Order and StepperOrder have the same value.

    -
  6. -
  7. -
    size_t ErrorOrder
    -

    The order of the error step if the stepper is used with error estimation.

    -
  8. -
  9. -
    typename State
    -

    The type representing the state of the ODE.

    -
  10. -
  11. -
    typename Value = double
    -

    The floating point type which is used in the computations.

    -
  12. -
  13. typename Deriv = State
  14. -
  15. -
    typename Time = Value
    -

    The type representing the independent variable - the time - of the ODE.

    -
  16. -
  17. -
    typename Algebra = typename algebra_dispatcher< State >::algebra_type
    -

    The algebra type.

    -
  18. -
  19. -
    typename Operations = typename operations_dispatcher< State >::operations_type
    -

    The operations type.

    -
  20. -
  21. -
    typename Resizer = initially_resizer
    -

    The resizer policy type.

    -
  22. -
-
-
-

-explicit_error_generic_rk - public - construct/copy/destruct

-
  1. -
    explicit_error_generic_rk(const coef_a_type & a, const coef_b_type & b, 
    -                          const coef_b_type & b2, const coef_c_type & c, 
    -                          const algebra_type & algebra = algebra_type());
    Constructs the explicit_error_generik_rk class with the given parameters a, b, b2 and c. See examples section for details on the coefficients.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - - - - - -

    a

    Triangular matrix of parameters b in the Butcher tableau.

    algebra

    A copy of algebra is made and stored inside explicit_stepper_base.

    b

    Last row of the butcher tableau.

    b2

    Parameters for lower-order evaluation to estimate the error.

    c

    Parameters to calculate the time points in the Butcher tableau.

    -
-
-
-

-explicit_error_generic_rk public member functions

-
    -
  1. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut, typename Err> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt, Err & xerr);
  2. -
  3. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt);
  4. -
  5. -
    template<typename StateIn> void adjust_size(const StateIn & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  6. -
-
-
-

-explicit_error_generic_rk private member functions

-
  1. template<typename StateIn> bool resize_impl(const StateIn & x);
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_error_idp64208896.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_error_idp64208896.html deleted file mode 100644 index 195b7c791..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_error_idp64208896.html +++ /dev/null @@ -1,53 +0,0 @@ - - - -Struct explicit_error_stepper_fsal_tag - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct explicit_error_stepper_fsal_tag

-

boost::numeric::odeint::explicit_error_stepper_fsal_tag

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-
-struct explicit_error_stepper_fsal_tag :
-  public boost::numeric::odeint::error_stepper_tag
-{
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_error_stepper_tag.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_error_stepper_tag.html deleted file mode 100644 index cfbf56464..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_error_stepper_tag.html +++ /dev/null @@ -1,53 +0,0 @@ - - - -Struct explicit_error_stepper_tag - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct explicit_error_stepper_tag

-

boost::numeric::odeint::explicit_error_stepper_tag

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
-
-struct explicit_error_stepper_tag :
-  public boost::numeric::odeint::error_stepper_tag
-{
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_generic_rk.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_generic_rk.html deleted file mode 100644 index 6bb9ba5a8..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/explicit_generic_rk.html +++ /dev/null @@ -1,256 +0,0 @@ - - - -Class template explicit_generic_rk - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template explicit_generic_rk

-

boost::numeric::odeint::explicit_generic_rk — A generic implementation of explicit Runge-Kutta algorithms. This class is as a base class for all explicit Runge-Kutta steppers.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/explicit_generic_rk.hpp>
-
-template<size_t StageCount, size_t Order, typename State, typename Value, 
-         typename Deriv, typename Time, typename Algebra, typename Operations, 
-         typename Resizer> 
-class explicit_generic_rk : public explicit_stepper_base {
-public:
-  // types
-  typedef explicit_stepper_base< ... >          stepper_base_type; 
-  typedef stepper_base_type::state_type         state_type;        
-  typedef stepper_base_type::wrapped_state_type wrapped_state_type;
-  typedef stepper_base_type::value_type         value_type;        
-  typedef stepper_base_type::deriv_type         deriv_type;        
-  typedef stepper_base_type::wrapped_deriv_type wrapped_deriv_type;
-  typedef stepper_base_type::time_type          time_type;         
-  typedef stepper_base_type::algebra_type       algebra_type;      
-  typedef stepper_base_type::operations_type    operations_type;   
-  typedef stepper_base_type::resizer_type       resizer_type;      
-  typedef unspecified                           rk_algorithm_type; 
-  typedef rk_algorithm_type::coef_a_type        coef_a_type;       
-  typedef rk_algorithm_type::coef_b_type        coef_b_type;       
-  typedef rk_algorithm_type::coef_c_type        coef_c_type;       
-
-  // construct/copy/destruct
-  explicit_generic_rk(const coef_a_type &, const coef_b_type &, 
-                      const coef_c_type &, 
-                      const algebra_type & = algebra_type());
-
-  // public member functions
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type);
-  template<typename StateIn> void adjust_size(const StateIn &);
-
-  // private member functions
-  template<typename StateIn> bool resize_impl(const StateIn &);
-};
-
-

Description

-

This class implements the explicit Runge-Kutta algorithms without error estimation in a generic way. The Butcher tableau is passed to the stepper which constructs the stepper scheme with the help of a template-metaprogramming algorithm. ToDo : Add example!

-

This class derives explicit_stepper_base which provides the stepper interface.

-

-

-
-

Template Parameters

-
    -
  1. -
    size_t StageCount
    -

    The number of stages of the Runge-Kutta algorithm.

    -
  2. -
  3. -
    size_t Order
    -

    The order of the stepper.

    -
  4. -
  5. -
    typename State
    -

    The type representing the state of the ODE.

    -
  6. -
  7. -
    typename Value
    -

    The floating point type which is used in the computations.

    -
  8. -
  9. typename Deriv
  10. -
  11. -
    typename Time
    -

    The type representing the independent variable - the time - of the ODE.

    -
  12. -
  13. -
    typename Algebra
    -

    The algebra type.

    -
  14. -
  15. -
    typename Operations
    -

    The operations type.

    -
  16. -
  17. -
    typename Resizer
    -

    The resizer policy type.

    -
  18. -
-
-
-

-explicit_generic_rk - public - construct/copy/destruct

-
  1. -
    explicit_generic_rk(const coef_a_type & a, const coef_b_type & b, 
    -                    const coef_c_type & c, 
    -                    const algebra_type & algebra = algebra_type());
    Constructs the explicit_generic_rk class. See examples section for details on the coefficients.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - -

    a

    Triangular matrix of parameters b in the Butcher tableau.

    algebra

    A copy of algebra is made and stored inside explicit_stepper_base.

    b

    Last row of the butcher tableau.

    c

    Parameters to calculate the time points in the Butcher tableau.

    -
-
-
-

-explicit_generic_rk public member functions

-
    -
  1. -
    template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt);
    This method performs one step. The derivative dxdt of in at the time t is passed to the method. The result is updated out of place, hence the input is in in and the output in out. Access to this step functionality is provided by explicit_stepper_base and do_step_impl should not be called directly.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

    dt

    The step size.

    dxdt

    The derivative of x at t.

    in

    The state of the ODE which should be solved. in is not modified in this method

    out

    The result of the step is written in out.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time, at which the step should be performed.

    -
  2. -
  3. -
    template<typename StateIn> void adjust_size(const StateIn & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  4. -
-
-
-

-explicit_generic_rk private member functions

-
  1. template<typename StateIn> bool resize_impl(const StateIn & x);
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/extrapolation_stepper.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/extrapolation_stepper.html deleted file mode 100644 index a08952f16..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/extrapolation_stepper.html +++ /dev/null @@ -1,172 +0,0 @@ - - - -Class template extrapolation_stepper - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template extrapolation_stepper

-

boost::numeric::odeint::extrapolation_stepper — Extrapolation stepper with configurable order, and error estimation.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/extrapolation_stepper.hpp>
-
-template<unsigned short Order, typename State, typename Value = double, 
-         typename Deriv = State, typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class extrapolation_stepper : public explicit_error_stepper_base {
-public:
-  // types
-  typedef explicit_error_stepper_base< extrapolation_stepper< ... >,... > stepper_base_type;
-  typedef stepper_base_type::state_type                                   state_type;       
-  typedef stepper_base_type::value_type                                   value_type;       
-  typedef stepper_base_type::deriv_type                                   deriv_type;       
-  typedef stepper_base_type::time_type                                    time_type;        
-  typedef stepper_base_type::algebra_type                                 algebra_type;     
-  typedef stepper_base_type::operations_type                              operations_type;  
-  typedef stepper_base_type::resizer_type                                 resizer_type;     
-  typedef unsigned short                                                  order_type;       
-
-  // construct/copy/destruct
-  extrapolation_stepper(const algebra_type & = algebra_type());
-
-  // private member functions
-   BOOST_STATIC_ASSERT_MSG(((Order%2)==0)&&(Order > 2), 
-                           "extrapolation_stepper requires even Order larger than 2");
-  template<typename StateIn> bool resize_impl(const StateIn &);
-  template<typename StateIn> bool resize_m_xout(const StateIn &);
-  template<typename StateInOut> 
-    void extrapolate(size_t, state_table_type &, const value_matrix &, 
-                     StateInOut &);
-
-  // public member functions
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut, typename Err> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type, Err &);
-  template<typename System, typename StateInOut, typename DerivIn, 
-           typename Err> 
-    void do_step_impl_io(System, StateInOut &, const DerivIn &, time_type, 
-                         time_type, Err &);
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type);
-  template<typename System, typename StateInOut, typename DerivIn> 
-    void do_step_impl_io(System, StateInOut &, const DerivIn &, time_type, 
-                         time_type);
-  template<typename System, typename StateInOut, typename DerivIn> 
-    void do_step_dxdt_impl(System, StateInOut &, const DerivIn &, time_type, 
-                           time_type);
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    void do_step_dxdt_impl(System, const StateIn &, const DerivIn &, 
-                           time_type, StateOut &, time_type);
-  template<typename StateIn> void adjust_size(const StateIn &);
-
-  // public data members
-  static const order_type order_value;
-  static const order_type stepper_order_value;
-  static const order_type error_order_value;
-  static const size_t m_k_max;
-};
-
-

Description

-

The extrapolation stepper is a stepper with error estimation and configurable order. The order is given as template parameter and needs to be an odd number. The stepper is based on several executions of the modified midpoint method and a Richardson extrapolation. This is essentially the same technique as for bulirsch_stoer, but without the variable order.

-
- - - - - -
[Note]Note

The Order parameter has to be an even number greater 2.

-

-

-
-

-extrapolation_stepper - public - construct/copy/destruct

-
  1. extrapolation_stepper(const algebra_type & algebra = algebra_type());
-
-
-

-extrapolation_stepper private member functions

-
    -
  1.  BOOST_STATIC_ASSERT_MSG(((Order%2)==0)&&(Order > 2), 
    -                         "extrapolation_stepper requires even Order larger than 2");
  2. -
  3. template<typename StateIn> bool resize_impl(const StateIn & x);
  4. -
  5. template<typename StateIn> bool resize_m_xout(const StateIn & x);
  6. -
  7. template<typename StateInOut> 
    -  void extrapolate(size_t k, state_table_type & table, 
    -                   const value_matrix & coeff, StateInOut & xest);
  8. -
-
-
-

-extrapolation_stepper public member functions

-
    -
  1. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut, typename Err> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt, Err & xerr);
  2. -
  3. template<typename System, typename StateInOut, typename DerivIn, typename Err> 
    -  void do_step_impl_io(System system, StateInOut & inout, 
    -                       const DerivIn & dxdt, time_type t, time_type dt, 
    -                       Err & xerr);
  4. -
  5. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt);
  6. -
  7. template<typename System, typename StateInOut, typename DerivIn> 
    -  void do_step_impl_io(System system, StateInOut & inout, 
    -                       const DerivIn & dxdt, time_type t, time_type dt);
  8. -
  9. template<typename System, typename StateInOut, typename DerivIn> 
    -  void do_step_dxdt_impl(System system, StateInOut & x, const DerivIn & dxdt, 
    -                         time_type t, time_type dt);
  10. -
  11. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  void do_step_dxdt_impl(System system, const StateIn & in, 
    -                         const DerivIn & dxdt, time_type t, StateOut & out, 
    -                         time_type dt);
  12. -
  13. template<typename StateIn> void adjust_size(const StateIn & x);
  14. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/failed_step_checker.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/failed_step_checker.html deleted file mode 100644 index a04b6a337..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/failed_step_checker.html +++ /dev/null @@ -1,80 +0,0 @@ - - - -Class failed_step_checker - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class failed_step_checker

-

boost::numeric::odeint::failed_step_checker — A class for performing overflow checks on the failed step count in step size adjustments.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/integrate/max_step_checker.hpp>
-
-
-class failed_step_checker : public boost::numeric::odeint::max_step_checker {
-public:
-  // construct/copy/destruct
-  failed_step_checker(const int = 500);
-
-  // public member functions
-  void operator()(void);
-  void reset();
-};
-
-

Description

-

Used internally within the dense output stepper and integrate routines.

-
-

-failed_step_checker - public - construct/copy/destruct

-
  1. -
    failed_step_checker(const int max_steps = 500);
    Construct the failed_step_checker. max_steps is the maximal number of iterations allowed before runtime_error is thrown.
-
-
-

-failed_step_checker public member functions

-
    -
  1. -
    void operator()(void);
    Increases the counter and performs the iteration check.
  2. -
  3. -
    void reset();
    Resets the max_step_checker by setting the internal counter to 0.
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/implicit_euler.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/implicit_euler.html deleted file mode 100644 index 2d73d2a31..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/implicit_euler.html +++ /dev/null @@ -1,105 +0,0 @@ - - - -Class template implicit_euler - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template implicit_euler

-

boost::numeric::odeint::implicit_euler

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/implicit_euler.hpp>
-
-template<typename ValueType, typename Resizer = initially_resizer> 
-class implicit_euler {
-public:
-  // types
-  typedef ValueType                                           value_type;          
-  typedef value_type                                          time_type;           
-  typedef boost::numeric::ublas::vector< value_type >         state_type;          
-  typedef state_wrapper< state_type >                         wrapped_state_type;  
-  typedef state_type                                          deriv_type;          
-  typedef state_wrapper< deriv_type >                         wrapped_deriv_type;  
-  typedef boost::numeric::ublas::matrix< value_type >         matrix_type;         
-  typedef state_wrapper< matrix_type >                        wrapped_matrix_type; 
-  typedef boost::numeric::ublas::permutation_matrix< size_t > pmatrix_type;        
-  typedef state_wrapper< pmatrix_type >                       wrapped_pmatrix_type;
-  typedef Resizer                                             resizer_type;        
-  typedef stepper_tag                                         stepper_category;    
-  typedef implicit_euler< ValueType, Resizer >                stepper_type;        
-
-  // construct/copy/destruct
-  implicit_euler(value_type = 1E-6);
-
-  // public member functions
-  template<typename System> 
-    void do_step(System, state_type &, time_type, time_type);
-  template<typename StateType> void adjust_size(const StateType &);
-
-  // private member functions
-  template<typename StateIn> bool resize_impl(const StateIn &);
-  void solve(state_type &, matrix_type &);
-};
-
-

Description

-
-

-implicit_euler - public - construct/copy/destruct

-
  1. implicit_euler(value_type epsilon = 1E-6);
-
-
-

-implicit_euler public member functions

-
    -
  1. template<typename System> 
    -  void do_step(System system, state_type & x, time_type t, time_type dt);
  2. -
  3. template<typename StateType> void adjust_size(const StateType & x);
  4. -
-
-
-

-implicit_euler private member functions

-
    -
  1. template<typename StateIn> bool resize_impl(const StateIn & x);
  2. -
  3. void solve(state_type & x, matrix_type & m);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_adap_idp61738944.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_adap_idp61738944.html deleted file mode 100644 index f6b3a68f3..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_adap_idp61738944.html +++ /dev/null @@ -1,112 +0,0 @@ - - - -Function template integrate_adaptive - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template integrate_adaptive

-

boost::numeric::odeint::integrate_adaptive — Integrates the ODE with adaptive step size.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/integrate/integrate_adaptive.hpp>
-
-
-template<typename Stepper, typename System, typename State, typename Time, 
-         typename Observer> 
-  size_t integrate_adaptive(Stepper stepper, System system, 
-                            State & start_state, Time start_time, 
-                            Time end_time, Time dt, Observer observer);
-
-

Description

-

This function integrates the ODE given by system with the given stepper. The observer is called after each step. If the stepper has no error control, the step size remains constant and the observer is called at equidistant time points t0+n*dt. If the stepper is a ControlledStepper, the step size is adjusted and the observer is called in non-equidistant intervals.

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The time step between observer calls, not necessarily the time step of the integration.

end_time

The final integration time tend.

observer

Function/Functor called at equidistant time intervals.

start_state

The initial condition x0.

start_time

The initial time t0.

stepper

The stepper to be used for numerical integration.

system

Function/Functor defining the rhs of the ODE.

Returns:

The number of steps performed.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_cons_idp61780800.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_cons_idp61780800.html deleted file mode 100644 index 157d66a18..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_cons_idp61780800.html +++ /dev/null @@ -1,116 +0,0 @@ - - - -Function template integrate_const - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template integrate_const

-

boost::numeric::odeint::integrate_const — Integrates the ODE with constant step size.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/integrate/integrate_const.hpp>
-
-
-template<typename Stepper, typename System, typename State, typename Time, 
-         typename Observer, typename StepOverflowChecker> 
-  size_t integrate_const(Stepper stepper, System system, State & start_state, 
-                         Time start_time, Time end_time, Time dt, 
-                         Observer observer, StepOverflowChecker checker);
-
-

Description

-

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.

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

checker

[optional] Functor to check for step count overflows, if no checker is provided, no exception is thrown.

dt

The time step between observer calls, not necessarily the time step of the integration.

end_time

The final integration time tend.

observer

[optional] Function/Functor called at equidistant time intervals.

start_state

The initial condition x0.

start_time

The initial time t0.

stepper

The stepper to be used for numerical integration.

system

Function/Functor defining the rhs of the ODE.

Returns:

The number of steps performed.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_idp61698176.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_idp61698176.html deleted file mode 100644 index 74adddeed..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_idp61698176.html +++ /dev/null @@ -1,115 +0,0 @@ - - - -Function template integrate - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template integrate

-

boost::numeric::odeint::integrate — Integrates the ODE.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/integrate/integrate.hpp>
-
-
-template<typename System, typename State, typename Time, typename Observer> 
-  boost::enable_if< typename has_value_type< State >::type, size_t >::type 
-  integrate(System system, State & start_state, Time start_time, 
-            Time end_time, Time dt, Observer observer);
-
-

Description

-

Integrates the ODE given by system from start_time to end_time starting with start_state as initial condition and dt as initial time step. This function uses a dense output dopri5 stepper and performs an adaptive integration with step size control, thus dt changes during the integration. This method uses standard error bounds of 1E-6. After each step, the observer is called.

-
- - - - - -
[Note]Note

A second version of this function template exists which explicitly expects the value type as template parameter, i.e. integrate< double >( sys , x , t0 , t1 , dt , obs );

-

- - -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

Initial step size, will be adjusted during the integration.

end_time

End time of the integration.

observer

Observer that will be called after each time step.

start_state

The initial state.

start_time

Start time of the integration.

system

The system function to solve, hence the r.h.s. of the ordinary differential equation.

Returns:

The number of steps performed.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_idp61718352.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_idp61718352.html deleted file mode 100644 index f5ec919c5..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_idp61718352.html +++ /dev/null @@ -1,110 +0,0 @@ - - - -Function template integrate - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template integrate

-

boost::numeric::odeint::integrate — Integrates the ODE without observer calls.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/integrate/integrate.hpp>
-
-
-template<typename System, typename State, typename Time> 
-  size_t integrate(System system, State & start_state, Time start_time, 
-                   Time end_time, Time dt);
-
-

Description

-

Integrates the ODE given by system from start_time to end_time starting with start_state as initial condition and dt as initial time step. This function uses a dense output dopri5 stepper and performs an adaptive integration with step size control, thus dt changes during the integration. This method uses standard error bounds of 1E-6. No observer is called.

-
- - - - - -
[Note]Note

A second version of this function template exists which explicitly expects the value type as template parameter, i.e. integrate< double >( sys , x , t0 , t1 , dt );

-

- - -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - -

dt

Initial step size, will be adjusted during the integration.

end_time

End time of the integration.

start_state

The initial state.

start_time

Start time of the integration.

system

The system function to solve, hence the r.h.s. of the ordinary differential equation.

Returns:

The number of steps performed.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_n_st_idp61865360.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_n_st_idp61865360.html deleted file mode 100644 index 2a0d7120b..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_n_st_idp61865360.html +++ /dev/null @@ -1,113 +0,0 @@ - - - -Function template integrate_n_steps - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template integrate_n_steps

-

boost::numeric::odeint::integrate_n_steps — The same function as above, but without checker.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/integrate/integrate_n_steps.hpp>
-
-
-template<typename Stepper, typename System, typename State, typename Time, 
-         typename Observer> 
-  Time integrate_n_steps(Stepper stepper, System system, State & start_state, 
-                         Time start_time, Time dt, size_t num_of_steps, 
-                         Observer observer);
-
-

Description

-

Integrates the ODE with constant step size.

-

This function is similar to integrate_const. The observer is called at equidistant time intervals t0 + n*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. 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.

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The time step between observer calls, not necessarily the time step of the integration.

num_of_steps

Number of steps to be performed

observer

Function/Functor called at equidistant time intervals.

start_state

The initial condition x0.

start_time

The initial time t0.

stepper

The stepper to be used for numerical integration.

system

Function/Functor defining the rhs of the ODE.

Returns:

The number of steps performed.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_time_idp61950624.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_time_idp61950624.html deleted file mode 100644 index 8346fa976..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/integrate_time_idp61950624.html +++ /dev/null @@ -1,112 +0,0 @@ - - - -Function template integrate_times - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template integrate_times

-

boost::numeric::odeint::integrate_times — Integrates the ODE with observer calls at given time points.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/integrate/integrate_times.hpp>
-
-
-template<typename Stepper, typename System, typename State, 
-         typename TimeIterator, typename Time, typename Observer> 
-  size_t integrate_times(Stepper stepper, System system, State & start_state, 
-                         TimeIterator times_start, TimeIterator times_end, 
-                         Time dt, Observer observer);
-
-

Description

-

Integrates the ODE given by system using the given stepper. This function does observer calls at the subsequent time points given by the range times_start, times_end. If the stepper has not step size control, the step size might be reduced occasionally to ensure observer calls exactly at the time points from the given sequence. If the stepper is a ControlledStepper, the step size is adjusted to meet the error bounds, but also might be reduced occasionally to ensure correct observer calls. 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.

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The time step between observer calls, not necessarily the time step of the integration.

observer

Function/Functor called at equidistant time intervals.

start_state

The initial condition x0.

stepper

The stepper to be used for numerical integration.

system

Function/Functor defining the rhs of the ODE.

times_end

Iterator to the end time

times_start

Iterator to the start time

Returns:

The number of steps performed.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive__idp62031392.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive__idp62031392.html deleted file mode 100644 index 7d164c5e6..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive__idp62031392.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_adaptive_iterator_begin - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_adaptive_iterator_begin

-

boost::numeric::odeint::make_adaptive_iterator_begin — Factory function for adaptive_iterator. Constructs a begin iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/adaptive_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  adaptive_iterator< Stepper, System, State > 
-  make_adaptive_iterator_begin(Stepper stepper, System system, State & x, 
-                               typename traits::time_type< Stepper >::type t_start, 
-                               typename traits::time_type< Stepper >::type t_end, 
-                               typename traits::time_type< Stepper >::type dt);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t_end

The end time, at which the iteration should stop.

t_start

The initial time.

x

The initial state.

Returns:

The adaptive iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive__idp62081248.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive__idp62081248.html deleted file mode 100644 index 5d0ec7f81..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive__idp62081248.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_adaptive_time_iterator_begin - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_adaptive_time_iterator_begin

-

boost::numeric::odeint::make_adaptive_time_iterator_begin — Factory function for adaptive_time_iterator. Constructs a begin iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/adaptive_time_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  adaptive_time_iterator< Stepper, System, State > 
-  make_adaptive_time_iterator_begin(Stepper stepper, System system, State & x, 
-                                    typename traits::time_type< Stepper >::type t_start, 
-                                    typename traits::time_type< Stepper >::type t_end, 
-                                    typename traits::time_type< Stepper >::type dt);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t_end

The end time, at which the iteration should stop.

t_start

The initial time.

x

The initial state. adaptive_time_iterator stores a reference of s and changes its value during the iteration.

Returns:

The adaptive time iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive__idp62093888.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive__idp62093888.html deleted file mode 100644 index a8846e248..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive__idp62093888.html +++ /dev/null @@ -1,93 +0,0 @@ - - - -Function template make_adaptive_time_iterator_end - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_adaptive_time_iterator_end

-

boost::numeric::odeint::make_adaptive_time_iterator_end — Factory function for adaptive_time_iterator. Constructs a end iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/adaptive_time_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  adaptive_time_iterator< Stepper, System, State > 
-  make_adaptive_time_iterator_end(Stepper stepper, System system, State & x);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - -

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

x

The initial state. adaptive_time_iterator stores a reference of s and changes its value during the iteration.

Returns:

The adaptive time iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive_iterator_end.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive_iterator_end.html deleted file mode 100644 index 9b6607dd1..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive_iterator_end.html +++ /dev/null @@ -1,93 +0,0 @@ - - - -Function template make_adaptive_iterator_end - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_adaptive_iterator_end

-

boost::numeric::odeint::make_adaptive_iterator_end — Factory function for adaptive_iterator. Constructs a end iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/adaptive_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  adaptive_iterator< Stepper, System, State > 
-  make_adaptive_iterator_end(Stepper stepper, System system, State & x);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - -

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

x

The initial state.

Returns:

The adaptive iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive_range.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive_range.html deleted file mode 100644 index 20ed848b0..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive_range.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_adaptive_range - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_adaptive_range

-

boost::numeric::odeint::make_adaptive_range — Factory function to construct a single pass range of adaptive iterators. A range is here a pair of adaptive_iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/adaptive_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  std::pair< adaptive_iterator< Stepper, System, State >, adaptive_iterator< Stepper, System, State > > 
-  make_adaptive_range(Stepper stepper, System system, State & x, 
-                      typename traits::time_type< Stepper >::type t_start, 
-                      typename traits::time_type< Stepper >::type t_end, 
-                      typename traits::time_type< Stepper >::type dt);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t_end

The end time, at which the iteration should stop.

t_start

The initial time.

x

The initial state.

Returns:

The adaptive range.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive_time_range.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive_time_range.html deleted file mode 100644 index 9b38b922b..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_adaptive_time_range.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_adaptive_time_range - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_adaptive_time_range

-

boost::numeric::odeint::make_adaptive_time_range — Factory function to construct a single pass range of adaptive time iterators. A range is here a pair of adaptive_time_iterators.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/adaptive_time_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  std::pair< adaptive_time_iterator< Stepper, System, State >, adaptive_time_iterator< Stepper, System, State > > 
-  make_adaptive_time_range(Stepper stepper, System system, State & x, 
-                           typename traits::time_type< Stepper >::type t_start, 
-                           typename traits::time_type< Stepper >::type t_end, 
-                           typename traits::time_type< Stepper >::type dt);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t_end

The end time, at which the iteration should stop.

t_start

The initial time.

x

The initial state. adaptive_time_iterator stores a reference of s and changes its value during the iteration.

Returns:

The adaptive time range.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62132800.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62132800.html deleted file mode 100644 index 696959661..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62132800.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_const_step_iterator_begin - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_const_step_iterator_begin

-

boost::numeric::odeint::make_const_step_iterator_begin — Factory function for const_step_iterator. Constructs a begin iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/const_step_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  const_step_iterator< Stepper, System, State > 
-  make_const_step_iterator_begin(Stepper stepper, System system, State & x, 
-                                 typename traits::time_type< Stepper >::type t_start, 
-                                 typename traits::time_type< Stepper >::type t_end, 
-                                 typename traits::time_type< Stepper >::type dt);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t_end

The end time, at which the iteration should stop.

t_start

The initial time.

x

The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.

Returns:

The const step iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62145440.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62145440.html deleted file mode 100644 index 01720a9d1..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62145440.html +++ /dev/null @@ -1,93 +0,0 @@ - - - -Function template make_const_step_iterator_end - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_const_step_iterator_end

-

boost::numeric::odeint::make_const_step_iterator_end — Factory function for const_step_iterator. Constructs a end iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/const_step_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  const_step_iterator< Stepper, System, State > 
-  make_const_step_iterator_end(Stepper stepper, System system, State & x);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - -

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

x

The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.

Returns:

The const_step_iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62185824.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62185824.html deleted file mode 100644 index 117c9b32a..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62185824.html +++ /dev/null @@ -1,109 +0,0 @@ - - - -Function template make_const_step_time_iterator_begin - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_const_step_time_iterator_begin

-

boost::numeric::odeint::make_const_step_time_iterator_begin — Factory function for const_step_time_iterator. Constructs a begin iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/const_step_time_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  const_step_time_iterator< Stepper, System, State > 
-  make_const_step_time_iterator_begin(Stepper stepper, System system, 
-                                      State & x, 
-                                      typename traits::time_type< Stepper >::type t_start, 
-                                      typename traits::time_type< Stepper >::type t_end, 
-                                      typename traits::time_type< Stepper >::type dt);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t_end

The end time, at which the iteration should stop.

t_start

The initial time.

x

The initial state. const_step_time_iterator stores a reference of s and changes its value during the iteration.

Returns:

The const step time iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62198512.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62198512.html deleted file mode 100644 index 2ef9d0340..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_ste_idp62198512.html +++ /dev/null @@ -1,93 +0,0 @@ - - - -Function template make_const_step_time_iterator_end - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_const_step_time_iterator_end

-

boost::numeric::odeint::make_const_step_time_iterator_end — Factory function for const_step_time_iterator. Constructs a end iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/const_step_time_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  const_step_time_iterator< Stepper, System, State > 
-  make_const_step_time_iterator_end(Stepper stepper, System system, State & x);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - -

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

x

The initial state. const_step_time_iterator store a reference of s and changes its value during the iteration.

Returns:

The const step time iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_step_range.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_step_range.html deleted file mode 100644 index cda27bb5f..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_step_range.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_const_step_range - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_const_step_range

-

boost::numeric::odeint::make_const_step_range — Factory function to construct a single pass range of const step iterators. A range is here a pair of const_step_iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/const_step_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  std::pair< const_step_iterator< Stepper, System, State >, const_step_iterator< Stepper, System, State > > 
-  make_const_step_range(Stepper stepper, System system, State & x, 
-                        typename traits::time_type< Stepper >::type t_start, 
-                        typename traits::time_type< Stepper >::type t_end, 
-                        typename traits::time_type< Stepper >::type dt);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t_end

The end time, at which the iteration should stop.

t_start

The initial time.

x

The initial state. const_step_iterator store a reference of s and changes its value during the iteration.

Returns:

The const step range.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_step_time_range.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_step_time_range.html deleted file mode 100644 index 3cd233e91..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_const_step_time_range.html +++ /dev/null @@ -1,104 +0,0 @@ - - - -Function template make_const_step_time_range - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_const_step_time_range

-

boost::numeric::odeint::make_const_step_time_range — Factory function to construct a single pass range of const_step_time_iterator. A range is here a pair of const_step_time_iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/const_step_time_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  std::pair< const_step_time_iterator< Stepper, System, State >, const_step_time_iterator< Stepper, System, State > > 
-  make_const_step_time_range(Stepper stepper, System system, State & x, 
-                             typename traits::time_type< Stepper >::type t_start, 
-                             typename traits::time_type< Stepper >::type t_end, 
-                             typename traits::time_type< Stepper >::type dt);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t_end

The end time, at which the iteration should stop.

x

The initial state. const_step_time_iterator stores a reference of s and changes its value during the iteration.

Returns:

The const step time range.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_iterator_begin.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_iterator_begin.html deleted file mode 100644 index 9e74a1025..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_iterator_begin.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_n_step_iterator_begin - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_n_step_iterator_begin

-

boost::numeric::odeint::make_n_step_iterator_begin — Factory function for n_step_iterator. Constructs a begin iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/n_step_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  n_step_iterator< Stepper, System, State > 
-  make_n_step_iterator_begin(Stepper stepper, System system, State & x, 
-                             typename traits::time_type< Stepper >::type t, 
-                             typename traits::time_type< Stepper >::type dt, 
-                             size_t num_of_steps);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

num_of_steps

The number of steps to be executed.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t

The initial time.

x

The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.

Returns:

The n-step iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_iterator_end.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_iterator_end.html deleted file mode 100644 index a61954294..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_iterator_end.html +++ /dev/null @@ -1,93 +0,0 @@ - - - -Function template make_n_step_iterator_end - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_n_step_iterator_end

-

boost::numeric::odeint::make_n_step_iterator_end — Factory function for n_step_iterator. Constructs an end iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/n_step_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  n_step_iterator< Stepper, System, State > 
-  make_n_step_iterator_end(Stepper stepper, System system, State & x);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - -

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

x

The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.

Returns:

The const_step_iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_range.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_range.html deleted file mode 100644 index 39a4b4693..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_range.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_n_step_range - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_n_step_range

-

boost::numeric::odeint::make_n_step_range — Factory function to construct a single pass range of n-step iterators. A range is here a pair of n_step_iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/n_step_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  std::pair< n_step_iterator< Stepper, System, State >, n_step_iterator< Stepper, System, State > > 
-  make_n_step_range(Stepper stepper, System system, State & x, 
-                    typename traits::time_type< Stepper >::type t, 
-                    typename traits::time_type< Stepper >::type dt, 
-                    size_t num_of_steps);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

num_of_steps

The number of steps to be executed.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t

The initial time.

x

The initial state. const_step_iterator store a reference of s and changes its value during the iteration.

Returns:

The n-step range.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_ti_idp62291328.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_ti_idp62291328.html deleted file mode 100644 index 532424494..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_ti_idp62291328.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_n_step_time_iterator_begin - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_n_step_time_iterator_begin

-

boost::numeric::odeint::make_n_step_time_iterator_begin — Factory function for n_step_time_iterator. Constructs a begin iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/n_step_time_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  n_step_time_iterator< Stepper, System, State > 
-  make_n_step_time_iterator_begin(Stepper stepper, System system, State & x, 
-                                  typename traits::time_type< Stepper >::type t, 
-                                  typename traits::time_type< Stepper >::type dt, 
-                                  size_t num_of_steps);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

num_of_steps

The number of steps to be executed.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t

The initial time.

x

The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.

Returns:

The n-step iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_ti_idp62303904.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_ti_idp62303904.html deleted file mode 100644 index a419237ad..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_ti_idp62303904.html +++ /dev/null @@ -1,93 +0,0 @@ - - - -Function template make_n_step_time_iterator_end - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_n_step_time_iterator_end

-

boost::numeric::odeint::make_n_step_time_iterator_end — Factory function for n_step_time_iterator. Constructs an end iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/n_step_time_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  n_step_time_iterator< Stepper, System, State > 
-  make_n_step_time_iterator_end(Stepper stepper, System system, State & x);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - -

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

x

The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.

Returns:

The const_step_iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_time_range.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_time_range.html deleted file mode 100644 index e3a7820da..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_n_step_time_range.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_n_step_time_range - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_n_step_time_range

-

boost::numeric::odeint::make_n_step_time_range — Factory function to construct a single pass range of n-step iterators. A range is here a pair of n_step_time_iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/n_step_time_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State> 
-  std::pair< n_step_time_iterator< Stepper, System, State >, n_step_time_iterator< Stepper, System, State > > 
-  make_n_step_time_range(Stepper stepper, System system, State & x, 
-                         typename traits::time_type< Stepper >::type t, 
-                         typename traits::time_type< Stepper >::type dt, 
-                         size_t num_of_steps);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

num_of_steps

The number of steps to be executed.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t

The initial time.

x

The initial state. const_step_iterator store a reference of s and changes its value during the iteration.

Returns:

The n-step range.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_iterator_begin.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_iterator_begin.html deleted file mode 100644 index b80e815c2..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_iterator_begin.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_times_iterator_begin - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_times_iterator_begin

-

boost::numeric::odeint::make_times_iterator_begin — Factory function for times_iterator. Constructs a begin iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/times_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State, 
-         typename TimeIterator> 
-  times_iterator< Stepper, System, State, TimeIterator > 
-  make_times_iterator_begin(Stepper stepper, System system, State & x, 
-                            TimeIterator t_start, TimeIterator t_end, 
-                            typename traits::time_type< Stepper >::type dt);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t_end

End iterator of the sequence of evaluation time points.

t_start

Begin iterator of the sequence of evaluation time points.

x

The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.

Returns:

The times iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_iterator_end.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_iterator_end.html deleted file mode 100644 index 78061b0dd..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_iterator_end.html +++ /dev/null @@ -1,95 +0,0 @@ - - - -Function template make_times_iterator_end - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_times_iterator_end

-

boost::numeric::odeint::make_times_iterator_end — Factory function for times_iterator. Constructs an end iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/times_iterator.hpp>
-
-
-template<typename TimeIterator, typename Stepper, typename System, 
-         typename State> 
-  times_iterator< Stepper, System, State, TimeIterator > 
-  make_times_iterator_end(Stepper stepper, System system, State & x);
-
-

Description

-

- - -This function needs the TimeIterator type specifically defined as a template parameter.

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - -

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

x

The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.

Returns:

The times iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_range.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_range.html deleted file mode 100644 index 184418d70..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_range.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_times_range - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_times_range

-

boost::numeric::odeint::make_times_range — Factory function to construct a single pass range of times iterators. A range is here a pair of times_iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/times_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State, 
-         typename TimeIterator> 
-  std::pair< times_iterator< Stepper, System, State, TimeIterator >, times_iterator< Stepper, System, State, TimeIterator > > 
-  make_times_range(Stepper stepper, System system, State & x, 
-                   TimeIterator t_start, TimeIterator t_end, 
-                   typename traits::time_type< Stepper >::type dt);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t_end

End iterator of the sequence of evaluation time points.

t_start

Begin iterator of the sequence of evaluation time points.

x

The initial state. const_step_iterator store a reference of s and changes its value during the iteration.

Returns:

The times iterator range.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_tim_idp62400560.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_tim_idp62400560.html deleted file mode 100644 index a2dfb429d..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_tim_idp62400560.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_times_time_iterator_begin - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_times_time_iterator_begin

-

boost::numeric::odeint::make_times_time_iterator_begin — Factory function for times_time_iterator. Constructs a begin iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/times_time_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State, 
-         typename TimeIterator> 
-  times_time_iterator< Stepper, System, State, TimeIterator > 
-  make_times_time_iterator_begin(Stepper stepper, System system, State & x, 
-                                 TimeIterator t_start, TimeIterator t_end, 
-                                 typename traits::time_type< Stepper >::type dt);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t_end

End iterator of the sequence of evaluation time points.

t_start

Begin iterator of the sequence of evaluation time points.

x

The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.

Returns:

The times_time iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_tim_idp62413776.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_tim_idp62413776.html deleted file mode 100644 index f6cde4214..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_tim_idp62413776.html +++ /dev/null @@ -1,95 +0,0 @@ - - - -Function template make_times_time_iterator_end - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_times_time_iterator_end

-

boost::numeric::odeint::make_times_time_iterator_end — Factory function for times_time_iterator. Constructs an end iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/times_time_iterator.hpp>
-
-
-template<typename TimeIterator, typename Stepper, typename System, 
-         typename State> 
-  times_time_iterator< Stepper, System, State, TimeIterator > 
-  make_times_time_iterator_end(Stepper stepper, System system, State & x);
-
-

Description

-

- - -This function needs the TimeIterator type specifically defined as a template parameter.

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - -

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

x

The initial state. const_step_iterator stores a reference of s and changes its value during the iteration.

Returns:

The times_time iterator.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_time_range.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_time_range.html deleted file mode 100644 index d2440a95c..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/make_times_time_range.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Function template make_times_time_range - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Function template make_times_time_range

-

boost::numeric::odeint::make_times_time_range — Factory function to construct a single pass range of times_time iterators. A range is here a pair of times_iterator.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/times_time_iterator.hpp>
-
-
-template<typename Stepper, typename System, typename State, 
-         typename TimeIterator> 
-  std::pair< times_time_iterator< Stepper, System, State, TimeIterator >, times_time_iterator< Stepper, System, State, TimeIterator > > 
-  make_times_time_range(Stepper stepper, System system, State & x, 
-                        TimeIterator t_start, TimeIterator t_end, 
-                        typename traits::time_type< Stepper >::type dt);
-
-

Description

-

- -

-
---- - - - - - - - - - - -

Parameters:

---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

dt

The initial time step.

stepper

The stepper to use during the iteration.

system

The system function (ODE) to solve.

t_end

End iterator of the sequence of evaluation time points.

t_start

Begin iterator of the sequence of evaluation time points.

x

The initial state. const_step_iterator store a reference of s and changes its value during the iteration.

Returns:

The times_time iterator range.

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/max_step_checker.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/max_step_checker.html deleted file mode 100644 index c1fee8d0e..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/max_step_checker.html +++ /dev/null @@ -1,80 +0,0 @@ - - - -Class max_step_checker - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class max_step_checker

-

boost::numeric::odeint::max_step_checker — A class for performing overflow checks on the step count in integrate functions.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/integrate/max_step_checker.hpp>
-
-
-class max_step_checker {
-public:
-  // construct/copy/destruct
-  max_step_checker(const int = 500);
-
-  // public member functions
-  void reset();
-  void operator()(void);
-};
-
-

Description

-

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.

-
-

-max_step_checker - public - construct/copy/destruct

-
  1. -
    max_step_checker(const int max_steps = 500);
    Construct the max_step_checker. max_steps is the maximal number of iterations allowed before runtime_error is thrown.
-
-
-

-max_step_checker public member functions

-
    -
  1. -
    void reset();
    Resets the max_step_checker by setting the internal counter to 0.
  2. -
  3. -
    void operator()(void);
    Increases the counter and performs the iteration check.
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/modified_midpo_idp63664288.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/modified_midpo_idp63664288.html deleted file mode 100644 index 86260d04f..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/modified_midpo_idp63664288.html +++ /dev/null @@ -1,118 +0,0 @@ - - - -Class template modified_midpoint_dense_out - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template modified_midpoint_dense_out

-

boost::numeric::odeint::modified_midpoint_dense_out

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/modified_midpoint.hpp>
-
-template<typename State, typename Value = double, typename Deriv = State, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class modified_midpoint_dense_out {
-public:
-  // types
-  typedef State                                                                                  state_type;        
-  typedef Value                                                                                  value_type;        
-  typedef Deriv                                                                                  deriv_type;        
-  typedef Time                                                                                   time_type;         
-  typedef Algebra                                                                                algebra_type;      
-  typedef Operations                                                                             operations_type;   
-  typedef Resizer                                                                                resizer_type;      
-  typedef state_wrapper< state_type >                                                            wrapped_state_type;
-  typedef state_wrapper< deriv_type >                                                            wrapped_deriv_type;
-  typedef modified_midpoint_dense_out< State, Value, Deriv, Time, Algebra, Operations, Resizer > stepper_type;      
-  typedef std::vector< wrapped_deriv_type >                                                      deriv_table_type;  
-
-  // construct/copy/destruct
-  modified_midpoint_dense_out(unsigned short = 2, 
-                              const algebra_type & = algebra_type());
-
-  // public member functions
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    void do_step(System, const StateIn &, const DerivIn &, time_type, 
-                 StateOut &, time_type, state_type &, deriv_table_type &);
-  void set_steps(unsigned short);
-  unsigned short steps(void) const;
-  template<typename StateIn> bool resize(const StateIn &);
-  template<typename StateIn> void adjust_size(const StateIn &);
-};
-
-

Description

-

Implementation of the modified midpoint method with a configurable number of intermediate steps. This class is used by the dense output Bulirsch-Stoer algorithm and is not meant for direct usage.

-
- - - - - -
[Note]Note

This stepper is for internal use only and does not meet any stepper concept.

-

-

-
-

-modified_midpoint_dense_out - public - construct/copy/destruct

-
  1. modified_midpoint_dense_out(unsigned short steps = 2, 
    -                            const algebra_type & algebra = algebra_type());
-
-
-

-modified_midpoint_dense_out public member functions

-
    -
  1. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  void do_step(System system, const StateIn & in, const DerivIn & dxdt, 
    -               time_type t, StateOut & out, time_type dt, state_type & x_mp, 
    -               deriv_table_type & derivs);
  2. -
  3. void set_steps(unsigned short steps);
  4. -
  5. unsigned short steps(void) const;
  6. -
  7. template<typename StateIn> bool resize(const StateIn & x);
  8. -
  9. template<typename StateIn> void adjust_size(const StateIn & x);
  10. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/modified_midpoint.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/modified_midpoint.html deleted file mode 100644 index f93cb12e3..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/modified_midpoint.html +++ /dev/null @@ -1,113 +0,0 @@ - - - -Class template modified_midpoint - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template modified_midpoint

-

boost::numeric::odeint::modified_midpoint

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/modified_midpoint.hpp>
-
-template<typename State, typename Value = double, typename Deriv = State, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class modified_midpoint : public explicit_stepper_base {
-public:
-  // types
-  typedef explicit_stepper_base< modified_midpoint< State, Value, Deriv, Time, Algebra, Operations, Resizer >, 2, State, Value, Deriv, Time, Algebra, Operations, Resizer > stepper_base_type; 
-  typedef stepper_base_type::state_type                                                                                                                                     state_type;        
-  typedef stepper_base_type::wrapped_state_type                                                                                                                             wrapped_state_type;
-  typedef stepper_base_type::value_type                                                                                                                                     value_type;        
-  typedef stepper_base_type::deriv_type                                                                                                                                     deriv_type;        
-  typedef stepper_base_type::wrapped_deriv_type                                                                                                                             wrapped_deriv_type;
-  typedef stepper_base_type::time_type                                                                                                                                      time_type;         
-  typedef stepper_base_type::algebra_type                                                                                                                                   algebra_type;      
-  typedef stepper_base_type::operations_type                                                                                                                                operations_type;   
-  typedef stepper_base_type::resizer_type                                                                                                                                   resizer_type;      
-  typedef stepper_base_type::stepper_type                                                                                                                                   stepper_type;      
-
-  // construct/copy/destruct
-  modified_midpoint(unsigned short = 2, const algebra_type & = algebra_type());
-
-  // public member functions
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type);
-  void set_steps(unsigned short);
-  unsigned short steps(void) const;
-  template<typename StateIn> void adjust_size(const StateIn &);
-
-  // private member functions
-  template<typename StateIn> bool resize_impl(const StateIn &);
-};
-
-

Description

-

Implementation of the modified midpoint method with a configurable number of intermediate steps. This class is used by the Bulirsch-Stoer algorithm and is not meant for direct usage.

-
-

-modified_midpoint - public - construct/copy/destruct

-
  1. modified_midpoint(unsigned short steps = 2, 
    -                  const algebra_type & algebra = algebra_type());
-
-
-

-modified_midpoint public member functions

-
    -
  1. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt);
  2. -
  3. void set_steps(unsigned short steps);
  4. -
  5. unsigned short steps(void) const;
  6. -
  7. template<typename StateIn> void adjust_size(const StateIn & x);
  8. -
-
-
-

-modified_midpoint private member functions

-
  1. template<typename StateIn> bool resize_impl(const StateIn & x);
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/n_step_iterator.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/n_step_iterator.html deleted file mode 100644 index 1eae8464e..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/n_step_iterator.html +++ /dev/null @@ -1,91 +0,0 @@ - - - -Class template n_step_iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template n_step_iterator

-

boost::numeric::odeint::n_step_iterator — ODE Iterator with constant step size. The value type of this iterator is the state type of the stepper.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/n_step_iterator.hpp>
-
-template<typename Stepper, typename System, typename State> 
-class n_step_iterator {
-public:
-  // construct/copy/destruct
-  n_step_iterator(Stepper, System, State &, time_type, time_type, size_t);
-  n_step_iterator(Stepper, System, State &);
-};
-
-

Description

-

Implements an iterator representing the solution of an ODE starting from t with n steps and a constant step size dt. After each iteration the iterator dereferences to the state x at the next time t+dt. This iterator can be used with Steppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_n_steps routine.

-

n_step_iterator is a model of single-pass iterator.

-

The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename Stepper
    -

    The stepper type which should be used during the iteration.

    -
  2. -
  3. -
    typename System
    -

    The type of the system function (ODE) which should be solved.

    -
  4. -
  5. -
    typename State
    -

    The state type of the ODE.

    -
  6. -
-
-
-

-n_step_iterator - public - construct/copy/destruct

-
    -
  1. n_step_iterator(Stepper stepper, System sys, State & s, time_type t, 
    -                time_type dt, size_t num_of_steps);
  2. -
  3. n_step_iterator(Stepper stepper, System sys, State & s);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/n_step_time_iterator.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/n_step_time_iterator.html deleted file mode 100644 index 042e7f975..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/n_step_time_iterator.html +++ /dev/null @@ -1,91 +0,0 @@ - - - -Class template n_step_time_iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template n_step_time_iterator

-

boost::numeric::odeint::n_step_time_iterator — ODE Iterator with constant step size. The value type of this iterator is a std::pair containing state and time.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/n_step_time_iterator.hpp>
-
-template<typename Stepper, typename System, typename State> 
-class n_step_time_iterator {
-public:
-  // construct/copy/destruct
-  n_step_time_iterator(Stepper, System, State &, time_type, time_type, size_t);
-  n_step_time_iterator(Stepper, System, State &);
-};
-
-

Description

-

Implements an iterator representing the solution of an ODE starting from t with n steps and a constant step size dt. After each iteration the iterator dereferences to a pair of state and time at the next time t+dt. This iterator can be used with Steppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_n_steps routine.

-

n_step_time_iterator is a model of single-pass iterator.

-

The value type of this iterator is pair of state and time.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename Stepper
    -

    The stepper type which should be used during the iteration.

    -
  2. -
  3. -
    typename System
    -

    The type of the system function (ODE) which should be solved.

    -
  4. -
  5. -
    typename State
    -

    The state type of the ODE.

    -
  6. -
-
-
-

-n_step_time_iterator - public - construct/copy/destruct

-
    -
  1. n_step_time_iterator(Stepper stepper, System sys, State & s, time_type t, 
    -                     time_type dt, size_t num_of_steps);
  2. -
  3. n_step_time_iterator(Stepper stepper, System sys, State & s);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/order_helper.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/order_helper.html deleted file mode 100644 index 3605ac113..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/order_helper.html +++ /dev/null @@ -1,52 +0,0 @@ - - - -Struct template order_helper - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct template order_helper

-

boost::numeric::odeint::order_helper

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/adams_bashforth.hpp>
-
-template<int N> 
-struct order_helper : public boost::mpl::max::type< mpl::eval_if< mpl::equal_to< mpl::modulus< int_< N >, int_< 2 > >, int_< 0 > >, int_< N >, int_< N+1 > >::type, int_< 4 > >
-{
-};
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/rosenbrock4.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/rosenbrock4.html deleted file mode 100644 index af1e3e7f4..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/rosenbrock4.html +++ /dev/null @@ -1,138 +0,0 @@ - - - -Class template rosenbrock4 - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template rosenbrock4

-

boost::numeric::odeint::rosenbrock4

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/rosenbrock4.hpp>
-
-template<typename Value, 
-         typename Coefficients = default_rosenbrock_coefficients< Value >, 
-         typename Resizer = initially_resizer> 
-class rosenbrock4 {
-public:
-  // types
-  typedef Value                                               value_type;             
-  typedef boost::numeric::ublas::vector< value_type >         state_type;             
-  typedef state_type                                          deriv_type;             
-  typedef value_type                                          time_type;              
-  typedef boost::numeric::ublas::matrix< value_type >         matrix_type;            
-  typedef boost::numeric::ublas::permutation_matrix< size_t > pmatrix_type;           
-  typedef Resizer                                             resizer_type;           
-  typedef Coefficients                                        rosenbrock_coefficients;
-  typedef stepper_tag                                         stepper_category;       
-  typedef unsigned short                                      order_type;             
-  typedef state_wrapper< state_type >                         wrapped_state_type;     
-  typedef state_wrapper< deriv_type >                         wrapped_deriv_type;     
-  typedef state_wrapper< matrix_type >                        wrapped_matrix_type;    
-  typedef state_wrapper< pmatrix_type >                       wrapped_pmatrix_type;   
-  typedef rosenbrock4< Value, Coefficients, Resizer >         stepper_type;           
-
-  // construct/copy/destruct
-  rosenbrock4(void);
-
-  // public member functions
-  order_type order() const;
-  template<typename System> 
-    void do_step(System, const state_type &, time_type, state_type &, 
-                 time_type, state_type &);
-  template<typename System> 
-    void do_step(System, state_type &, time_type, time_type, state_type &);
-  template<typename System> 
-    void do_step(System, const state_type &, time_type, state_type &, 
-                 time_type);
-  template<typename System> 
-    void do_step(System, state_type &, time_type, time_type);
-  void prepare_dense_output();
-  void calc_state(time_type, state_type &, const state_type &, time_type, 
-                  const state_type &, time_type);
-  template<typename StateType> void adjust_size(const StateType &);
-
-  // protected member functions
-  template<typename StateIn> bool resize_impl(const StateIn &);
-  template<typename StateIn> bool resize_x_err(const StateIn &);
-
-  // public data members
-  static const order_type stepper_order;
-  static const order_type error_order;
-};
-
-

Description

-
-

-rosenbrock4 - public - construct/copy/destruct

-
  1. rosenbrock4(void);
-
-
-

-rosenbrock4 public member functions

-
    -
  1. order_type order() const;
  2. -
  3. template<typename System> 
    -  void do_step(System system, const state_type & x, time_type t, 
    -               state_type & xout, time_type dt, state_type & xerr);
  4. -
  5. template<typename System> 
    -  void do_step(System system, state_type & x, time_type t, time_type dt, 
    -               state_type & xerr);
  6. -
  7. template<typename System> 
    -  void do_step(System system, const state_type & x, time_type t, 
    -               state_type & xout, time_type dt);
  8. -
  9. template<typename System> 
    -  void do_step(System system, state_type & x, time_type t, time_type dt);
  10. -
  11. void prepare_dense_output();
  12. -
  13. void calc_state(time_type t, state_type & x, const state_type & x_old, 
    -                time_type t_old, const state_type & x_new, time_type t_new);
  14. -
  15. template<typename StateType> void adjust_size(const StateType & x);
  16. -
-
-
-

-rosenbrock4 protected member functions

-
    -
  1. template<typename StateIn> bool resize_impl(const StateIn & x);
  2. -
  3. template<typename StateIn> bool resize_x_err(const StateIn & x);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/rosenbrock4_controller.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/rosenbrock4_controller.html deleted file mode 100644 index edec8b004..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/rosenbrock4_controller.html +++ /dev/null @@ -1,129 +0,0 @@ - - - -Class template rosenbrock4_controller - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template rosenbrock4_controller

-

boost::numeric::odeint::rosenbrock4_controller

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/rosenbrock4_controller.hpp>
-
-template<typename Stepper> 
-class rosenbrock4_controller {
-public:
-  // types
-  typedef Stepper                           stepper_type;      
-  typedef stepper_type::value_type          value_type;        
-  typedef stepper_type::state_type          state_type;        
-  typedef stepper_type::wrapped_state_type  wrapped_state_type;
-  typedef stepper_type::time_type           time_type;         
-  typedef stepper_type::deriv_type          deriv_type;        
-  typedef stepper_type::wrapped_deriv_type  wrapped_deriv_type;
-  typedef stepper_type::resizer_type        resizer_type;      
-  typedef controlled_stepper_tag            stepper_category;  
-  typedef rosenbrock4_controller< Stepper > controller_type;   
-
-  // construct/copy/destruct
-  rosenbrock4_controller(value_type = 1.0e-6, value_type = 1.0e-6, 
-                         const stepper_type & = stepper_type());
-  rosenbrock4_controller(value_type, value_type, time_type, 
-                         const stepper_type & = stepper_type());
-
-  // public member functions
-  value_type error(const state_type &, const state_type &, const state_type &);
-  value_type last_error(void) const;
-  template<typename System> 
-    boost::numeric::odeint::controlled_step_result 
-    try_step(System, state_type &, time_type &, time_type &);
-  template<typename System> 
-    boost::numeric::odeint::controlled_step_result 
-    try_step(System, const state_type &, time_type &, state_type &, 
-             time_type &);
-  template<typename StateType> void adjust_size(const StateType &);
-  stepper_type & stepper(void);
-  const stepper_type & stepper(void) const;
-
-  // private member functions
-  template<typename StateIn> bool resize_m_xerr(const StateIn &);
-  template<typename StateIn> bool resize_m_xnew(const StateIn &);
-};
-
-

Description

-
-

-rosenbrock4_controller - public - construct/copy/destruct

-
    -
  1. rosenbrock4_controller(value_type atol = 1.0e-6, value_type rtol = 1.0e-6, 
    -                       const stepper_type & stepper = stepper_type());
  2. -
  3. rosenbrock4_controller(value_type atol, value_type rtol, time_type max_dt, 
    -                       const stepper_type & stepper = stepper_type());
  4. -
-
-
-

-rosenbrock4_controller public member functions

-
    -
  1. value_type error(const state_type & x, const state_type & xold, 
    -                 const state_type & xerr);
  2. -
  3. value_type last_error(void) const;
  4. -
  5. template<typename System> 
    -  boost::numeric::odeint::controlled_step_result 
    -  try_step(System sys, state_type & x, time_type & t, time_type & dt);
  6. -
  7. template<typename System> 
    -  boost::numeric::odeint::controlled_step_result 
    -  try_step(System sys, const state_type & x, time_type & t, state_type & xout, 
    -           time_type & dt);
  8. -
  9. template<typename StateType> void adjust_size(const StateType & x);
  10. -
  11. stepper_type & stepper(void);
  12. -
  13. const stepper_type & stepper(void) const;
  14. -
-
-
-

-rosenbrock4_controller private member functions

-
    -
  1. template<typename StateIn> bool resize_m_xerr(const StateIn & x);
  2. -
  3. template<typename StateIn> bool resize_m_xnew(const StateIn & x);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/rosenbrock4_dense_output.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/rosenbrock4_dense_output.html deleted file mode 100644 index 14e719f43..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/rosenbrock4_dense_output.html +++ /dev/null @@ -1,128 +0,0 @@ - - - -Class template rosenbrock4_dense_output - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template rosenbrock4_dense_output

-

boost::numeric::odeint::rosenbrock4_dense_output

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/rosenbrock4_dense_output.hpp>
-
-template<typename ControlledStepper> 
-class rosenbrock4_dense_output {
-public:
-  // types
-  typedef ControlledStepper                             controlled_stepper_type;  
-  typedef controlled_stepper_type::stepper_type         stepper_type;             
-  typedef stepper_type::value_type                      value_type;               
-  typedef stepper_type::state_type                      state_type;               
-  typedef stepper_type::wrapped_state_type              wrapped_state_type;       
-  typedef stepper_type::time_type                       time_type;                
-  typedef stepper_type::deriv_type                      deriv_type;               
-  typedef stepper_type::wrapped_deriv_type              wrapped_deriv_type;       
-  typedef stepper_type::resizer_type                    resizer_type;             
-  typedef dense_output_stepper_tag                      stepper_category;         
-  typedef rosenbrock4_dense_output< ControlledStepper > dense_output_stepper_type;
-
-  // construct/copy/destruct
-  rosenbrock4_dense_output(const controlled_stepper_type & = controlled_stepper_type());
-
-  // public member functions
-  template<typename StateType> 
-    void initialize(const StateType &, time_type, time_type);
-  template<typename System> std::pair< time_type, time_type > do_step(System);
-  template<typename StateOut> void calc_state(time_type, StateOut &);
-  template<typename StateOut> void calc_state(time_type, const StateOut &);
-  template<typename StateType> void adjust_size(const StateType &);
-  const state_type & current_state(void) const;
-  time_type current_time(void) const;
-  const state_type & previous_state(void) const;
-  time_type previous_time(void) const;
-  time_type current_time_step(void) const;
-
-  // private member functions
-  state_type & get_current_state(void);
-  const state_type & get_current_state(void) const;
-  state_type & get_old_state(void);
-  const state_type & get_old_state(void) const;
-  void toggle_current_state(void);
-  template<typename StateIn> bool resize_impl(const StateIn &);
-};
-
-

Description

-
-

-rosenbrock4_dense_output - public - construct/copy/destruct

-
  1. rosenbrock4_dense_output(const controlled_stepper_type & stepper = controlled_stepper_type());
-
-
-

-rosenbrock4_dense_output public member functions

-
    -
  1. template<typename StateType> 
    -  void initialize(const StateType & x0, time_type t0, time_type dt0);
  2. -
  3. template<typename System> 
    -  std::pair< time_type, time_type > do_step(System system);
  4. -
  5. template<typename StateOut> void calc_state(time_type t, StateOut & x);
  6. -
  7. template<typename StateOut> void calc_state(time_type t, const StateOut & x);
  8. -
  9. template<typename StateType> void adjust_size(const StateType & x);
  10. -
  11. const state_type & current_state(void) const;
  12. -
  13. time_type current_time(void) const;
  14. -
  15. const state_type & previous_state(void) const;
  16. -
  17. time_type previous_time(void) const;
  18. -
  19. time_type current_time_step(void) const;
  20. -
-
-
-

-rosenbrock4_dense_output private member functions

-
    -
  1. state_type & get_current_state(void);
  2. -
  3. const state_type & get_current_state(void) const;
  4. -
  5. state_type & get_old_state(void);
  6. -
  7. const state_type & get_old_state(void) const;
  8. -
  9. void toggle_current_state(void);
  10. -
  11. template<typename StateIn> bool resize_impl(const StateIn & x);
  12. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta4.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta4.html deleted file mode 100644 index 3b5575c73..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta4.html +++ /dev/null @@ -1,221 +0,0 @@ - - - -Class template runge_kutta4 - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template runge_kutta4

-

boost::numeric::odeint::runge_kutta4 — The classical Runge-Kutta stepper of fourth order.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/runge_kutta4.hpp>
-
-template<typename State, typename Value = double, typename Deriv = State, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class runge_kutta4 : public boost::numeric::odeint::explicit_generic_rk< StageCount, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >
-{
-public:
-  // types
-  typedef stepper_base_type::state_type      state_type;     
-  typedef stepper_base_type::value_type      value_type;     
-  typedef stepper_base_type::deriv_type      deriv_type;     
-  typedef stepper_base_type::time_type       time_type;      
-  typedef stepper_base_type::algebra_type    algebra_type;   
-  typedef stepper_base_type::operations_type operations_type;
-  typedef stepper_base_type::resizer_type    resizer_type;   
-
-  // construct/copy/destruct
-  runge_kutta4(const algebra_type & = algebra_type());
-
-  // public member functions
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type);
-  template<typename StateIn> void adjust_size(const StateIn &);
-};
-
-

Description

-

The Runge-Kutta method of fourth order is one standard method for solving ordinary differential equations and is widely used, see also en.wikipedia.org/wiki/Runge-Kutta_methods The method is explicit and fulfills the Stepper concept. Step size control or continuous output are not provided.

-

This class derives from explicit_stepper_base and inherits its interface via CRTP (current recurring template pattern). Furthermore, it derivs from explicit_generic_rk which is a generic Runge-Kutta algorithm. For more details see explicit_stepper_base and explicit_generic_rk.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename State
    -

    The state type.

    -
  2. -
  3. -
    typename Value = double
    -

    The value type.

    -
  4. -
  5. -
    typename Deriv = State
    -

    The type representing the time derivative of the state.

    -
  6. -
  7. -
    typename Time = Value
    -

    The time representing the independent variable - the time.

    -
  8. -
  9. -
    typename Algebra = typename algebra_dispatcher< State >::algebra_type
    -

    The algebra type.

    -
  10. -
  11. -
    typename Operations = typename operations_dispatcher< State >::operations_type
    -

    The operations type.

    -
  12. -
  13. -
    typename Resizer = initially_resizer
    -

    The resizer policy type.

    -
  14. -
-
-
-

-runge_kutta4 - public - construct/copy/destruct

-
  1. -
    runge_kutta4(const algebra_type & algebra = algebra_type());
    Constructs the runge_kutta4 class. This constructor can be used as a default constructor if the algebra has a default constructor.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    algebra

    A copy of algebra is made and stored inside explicit_stepper_base.

    -
-
-
-

-runge_kutta4 public member functions

-
    -
  1. -
    template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt);
    This method performs one step. The derivative dxdt of in at the time t is passed to the method. The result is updated out of place, hence the input is in in and the output in out. Access to this step functionality is provided by explicit_stepper_base and do_step_impl should not be called directly.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

    dt

    The step size.

    dxdt

    The derivative of x at t.

    in

    The state of the ODE which should be solved. in is not modified in this method

    out

    The result of the step is written in out.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time, at which the step should be performed.

    -
  2. -
  3. -
    template<typename StateIn> void adjust_size(const StateIn & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta4_classic.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta4_classic.html deleted file mode 100644 index f85d60a7b..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta4_classic.html +++ /dev/null @@ -1,229 +0,0 @@ - - - -Class template runge_kutta4_classic - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template runge_kutta4_classic

-

boost::numeric::odeint::runge_kutta4_classic — The classical Runge-Kutta stepper of fourth order.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/runge_kutta4_classic.hpp>
-
-template<typename State, typename Value = double, typename Deriv = State, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class runge_kutta4_classic : public explicit_stepper_base {
-public:
-  // types
-  typedef explicit_stepper_base< runge_kutta4_classic< ... >,... > stepper_base_type;
-  typedef stepper_base_type::state_type                            state_type;       
-  typedef stepper_base_type::value_type                            value_type;       
-  typedef stepper_base_type::deriv_type                            deriv_type;       
-  typedef stepper_base_type::time_type                             time_type;        
-  typedef stepper_base_type::algebra_type                          algebra_type;     
-  typedef stepper_base_type::operations_type                       operations_type;  
-  typedef stepper_base_type::resizer_type                          resizer_type;     
-
-  // construct/copy/destruct
-  runge_kutta4_classic(const algebra_type & = algebra_type());
-
-  // public member functions
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type);
-  template<typename StateType> void adjust_size(const StateType &);
-
-  // private member functions
-  template<typename StateIn> bool resize_impl(const StateIn &);
-};
-
-

Description

-

The Runge-Kutta method of fourth order is one standard method for solving ordinary differential equations and is widely used, see also en.wikipedia.org/wiki/Runge-Kutta_methods The method is explicit and fulfills the Stepper concept. Step size control or continuous output are not provided. This class implements the method directly, hence the generic Runge-Kutta algorithm is not used.

-

This class derives from explicit_stepper_base and inherits its interface via CRTP (current recurring template pattern). For more details see explicit_stepper_base.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename State
    -

    The state type.

    -
  2. -
  3. -
    typename Value = double
    -

    The value type.

    -
  4. -
  5. -
    typename Deriv = State
    -

    The type representing the time derivative of the state.

    -
  6. -
  7. -
    typename Time = Value
    -

    The time representing the independent variable - the time.

    -
  8. -
  9. -
    typename Algebra = typename algebra_dispatcher< State >::algebra_type
    -

    The algebra type.

    -
  10. -
  11. -
    typename Operations = typename operations_dispatcher< State >::operations_type
    -

    The operations type.

    -
  12. -
  13. -
    typename Resizer = initially_resizer
    -

    The resizer policy type.

    -
  14. -
-
-
-

-runge_kutta4_classic - public - construct/copy/destruct

-
  1. -
    runge_kutta4_classic(const algebra_type & algebra = algebra_type());
    Constructs the runge_kutta4_classic class. This constructor can be used as a default constructor if the algebra has a default constructor.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    algebra

    A copy of algebra is made and stored inside explicit_stepper_base.

    -
-
-
-

-runge_kutta4_classic public member functions

-
    -
  1. -
    template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt);
    This method performs one step. The derivative dxdt of in at the time t is passed to the method. The result is updated out of place, hence the input is in in and the output in out. Access to this step functionality is provided by explicit_stepper_base and do_step_impl should not be called directly.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - - - - - - - - - - - - - - - - - - - - - - - -

    dt

    The step size.

    dxdt

    The derivative of x at t.

    in

    The state of the ODE which should be solved. in is not modified in this method

    out

    The result of the step is written in out.

    system

    The system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept.

    t

    The value of the time, at which the step should be performed.

    -
  2. -
  3. -
    template<typename StateType> void adjust_size(const StateType & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  4. -
-
-
-

-runge_kutta4_classic private member functions

-
  1. template<typename StateIn> bool resize_impl(const StateIn & x);
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_ca_idp64042704.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_ca_idp64042704.html deleted file mode 100644 index d6f1d4165..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_ca_idp64042704.html +++ /dev/null @@ -1,193 +0,0 @@ - - - -Class template runge_kutta_cash_karp54_classic - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template runge_kutta_cash_karp54_classic

-

boost::numeric::odeint::runge_kutta_cash_karp54_classic — The Runge-Kutta Cash-Karp method implemented without the generic Runge-Kutta algorithm.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/runge_kutta_cash_karp54_classic.hpp>
-
-template<typename State, typename Value = double, typename Deriv = State, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class runge_kutta_cash_karp54_classic : public explicit_error_stepper_base {
-public:
-  // types
-  typedef explicit_error_stepper_base< runge_kutta_cash_karp54_classic< ... >,... > stepper_base_type;
-  typedef stepper_base_type::state_type                                             state_type;       
-  typedef stepper_base_type::value_type                                             value_type;       
-  typedef stepper_base_type::deriv_type                                             deriv_type;       
-  typedef stepper_base_type::time_type                                              time_type;        
-  typedef stepper_base_type::algebra_type                                           algebra_type;     
-  typedef stepper_base_type::operations_type                                        operations_type;  
-  typedef stepper_base_type::resizer_type                                           resizer_type;     
-
-  // construct/copy/destruct
-  runge_kutta_cash_karp54_classic(const algebra_type & = algebra_type());
-
-  // public member functions
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut, typename Err> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type, Err &);
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type);
-  template<typename StateIn> void adjust_size(const StateIn &);
-
-  // private member functions
-  template<typename StateIn> bool resize_impl(const StateIn &);
-};
-
-

Description

-

The Runge-Kutta Cash-Karp method is one of the standard methods for solving ordinary differential equations, see en.wikipedia.org/wiki/Cash-Karp_method. The method is explicit and fulfills the Error Stepper concept. Step size control is provided but continuous output is not available for this method.

-

This class derives from explicit_error_stepper_base and inherits its interface via CRTP (current recurring template pattern). This class implements the method directly, hence the generic Runge-Kutta algorithm is not used.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename State
    -

    The state type.

    -
  2. -
  3. -
    typename Value = double
    -

    The value type.

    -
  4. -
  5. -
    typename Deriv = State
    -

    The type representing the time derivative of the state.

    -
  6. -
  7. -
    typename Time = Value
    -

    The time representing the independent variable - the time.

    -
  8. -
  9. -
    typename Algebra = typename algebra_dispatcher< State >::algebra_type
    -

    The algebra type.

    -
  10. -
  11. -
    typename Operations = typename operations_dispatcher< State >::operations_type
    -

    The operations type.

    -
  12. -
  13. -
    typename Resizer = initially_resizer
    -

    The resizer policy type.

    -
  14. -
-
-
-

-runge_kutta_cash_karp54_classic - public - construct/copy/destruct

-
  1. -
    runge_kutta_cash_karp54_classic(const algebra_type & algebra = algebra_type());
    Constructs the runge_kutta_cash_karp54_classic class. This constructor can be used as a default constructor if the algebra has a default constructor.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    algebra

    A copy of algebra is made and stored inside explicit_stepper_base.

    -
-
-
-

-runge_kutta_cash_karp54_classic public member functions

-
    -
  1. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut, typename Err> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt, Err & xerr);
  2. -
  3. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt);
  4. -
  5. -
    template<typename StateIn> void adjust_size(const StateIn & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  6. -
-
-
-

-runge_kutta_cash_karp54_classic private member functions

-
  1. template<typename StateIn> bool resize_impl(const StateIn & x);
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_cash_karp54.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_cash_karp54.html deleted file mode 100644 index cfddbec89..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_cash_karp54.html +++ /dev/null @@ -1,185 +0,0 @@ - - - -Class template runge_kutta_cash_karp54 - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template runge_kutta_cash_karp54

-

boost::numeric::odeint::runge_kutta_cash_karp54 — The Runge-Kutta Cash-Karp method.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/runge_kutta_cash_karp54.hpp>
-
-template<typename State, typename Value = double, typename Deriv = State, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class runge_kutta_cash_karp54 : public boost::numeric::odeint::explicit_error_generic_rk< StageCount, Order, StepperOrder, ErrorOrder, State, Value, Deriv, Time, Algebra, Operations, Resizer >
-{
-public:
-  // types
-  typedef stepper_base_type::state_type      state_type;     
-  typedef stepper_base_type::value_type      value_type;     
-  typedef stepper_base_type::deriv_type      deriv_type;     
-  typedef stepper_base_type::time_type       time_type;      
-  typedef stepper_base_type::algebra_type    algebra_type;   
-  typedef stepper_base_type::operations_type operations_type;
-  typedef stepper_base_type::resizer_type    resizer_typ;    
-
-  // construct/copy/destruct
-  runge_kutta_cash_karp54(const algebra_type & = algebra_type());
-
-  // public member functions
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut, typename Err> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type, Err &);
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type);
-  template<typename StateIn> void adjust_size(const StateIn &);
-};
-
-

Description

-

The Runge-Kutta Cash-Karp method is one of the standard methods for solving ordinary differential equations, see en.wikipedia.org/wiki/Cash-Karp_methods. The method is explicit and fulfills the Error Stepper concept. Step size control is provided but continuous output is not available for this method.

-

This class derives from explicit_error_stepper_base and inherits its interface via CRTP (current recurring template pattern). Furthermore, it derivs from explicit_error_generic_rk which is a generic Runge-Kutta algorithm with error estimation. For more details see explicit_error_stepper_base and explicit_error_generic_rk.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename State
    -

    The state type.

    -
  2. -
  3. -
    typename Value = double
    -

    The value type.

    -
  4. -
  5. -
    typename Deriv = State
    -

    The type representing the time derivative of the state.

    -
  6. -
  7. -
    typename Time = Value
    -

    The time representing the independent variable - the time.

    -
  8. -
  9. -
    typename Algebra = typename algebra_dispatcher< State >::algebra_type
    -

    The algebra type.

    -
  10. -
  11. -
    typename Operations = typename operations_dispatcher< State >::operations_type
    -

    The operations type.

    -
  12. -
  13. -
    typename Resizer = initially_resizer
    -

    The resizer policy type.

    -
  14. -
-
-
-

-runge_kutta_cash_karp54 - public - construct/copy/destruct

-
  1. -
    runge_kutta_cash_karp54(const algebra_type & algebra = algebra_type());
    Constructs the runge_kutta_cash_karp54 class. This constructor can be used as a default constructor if the algebra has a default constructor.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    algebra

    A copy of algebra is made and stored inside explicit_stepper_base.

    -
-
-
-

-runge_kutta_cash_karp54 public member functions

-
    -
  1. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut, typename Err> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt, Err & xerr);
  2. -
  3. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt);
  4. -
  5. -
    template<typename StateIn> void adjust_size(const StateIn & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  6. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_dopri5.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_dopri5.html deleted file mode 100644 index 471623db5..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_dopri5.html +++ /dev/null @@ -1,210 +0,0 @@ - - - -Class template runge_kutta_dopri5 - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template runge_kutta_dopri5

-

boost::numeric::odeint::runge_kutta_dopri5 — The Runge-Kutta Dormand-Prince 5 method.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp>
-
-template<typename State, typename Value = double, typename Deriv = State, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class runge_kutta_dopri5 : public explicit_error_stepper_fsal_base {
-public:
-  // types
-  typedef explicit_error_stepper_fsal_base< runge_kutta_dopri5< ... >,... > stepper_base_type;
-  typedef stepper_base_type::state_type                                     state_type;       
-  typedef stepper_base_type::value_type                                     value_type;       
-  typedef stepper_base_type::deriv_type                                     deriv_type;       
-  typedef stepper_base_type::time_type                                      time_type;        
-  typedef stepper_base_type::algebra_type                                   algebra_type;     
-  typedef stepper_base_type::operations_type                                operations_type;  
-  typedef stepper_base_type::resizer_type                                   resizer_type;     
-
-  // construct/copy/destruct
-  runge_kutta_dopri5(const algebra_type & = algebra_type());
-
-  // public member functions
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut, typename DerivOut> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, DerivOut &, time_type);
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut, typename DerivOut, typename Err> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, DerivOut &, time_type, Err &);
-  template<typename StateOut, typename StateIn1, typename DerivIn1, 
-           typename StateIn2, typename DerivIn2> 
-    void calc_state(time_type, StateOut &, const StateIn1 &, const DerivIn1 &, 
-                    time_type, const StateIn2 &, const DerivIn2 &, time_type) const;
-  template<typename StateIn> void adjust_size(const StateIn &);
-
-  // private member functions
-  template<typename StateIn> bool resize_k_x_tmp_impl(const StateIn &);
-  template<typename StateIn> bool resize_dxdt_tmp_impl(const StateIn &);
-};
-
-

Description

-

The Runge-Kutta Dormand-Prince 5 method is a very popular method for solving ODEs, see . The method is explicit and fulfills the Error Stepper concept. Step size control is provided but continuous output is available which make this method favourable for many applications.

-

This class derives from explicit_error_stepper_fsal_base and inherits its interface via CRTP (current recurring template pattern). The method possesses the FSAL (first-same-as-last) property. See explicit_error_stepper_fsal_base for more details.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename State
    -

    The state type.

    -
  2. -
  3. -
    typename Value = double
    -

    The value type.

    -
  4. -
  5. -
    typename Deriv = State
    -

    The type representing the time derivative of the state.

    -
  6. -
  7. -
    typename Time = Value
    -

    The time representing the independent variable - the time.

    -
  8. -
  9. -
    typename Algebra = typename algebra_dispatcher< State >::algebra_type
    -

    The algebra type.

    -
  10. -
  11. -
    typename Operations = typename operations_dispatcher< State >::operations_type
    -

    The operations type.

    -
  12. -
  13. -
    typename Resizer = initially_resizer
    -

    The resizer policy type.

    -
  14. -
-
-
-

-runge_kutta_dopri5 - public - construct/copy/destruct

-
  1. -
    runge_kutta_dopri5(const algebra_type & algebra = algebra_type());
    Constructs the runge_kutta_dopri5 class. This constructor can be used as a default constructor if the algebra has a default constructor.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    algebra

    A copy of algebra is made and stored inside explicit_stepper_base.

    -
-
-
-

-runge_kutta_dopri5 public member functions

-
    -
  1. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut, typename DerivOut> 
    -  void do_step_impl(System system, const StateIn & in, 
    -                    const DerivIn & dxdt_in, time_type t, StateOut & out, 
    -                    DerivOut & dxdt_out, time_type dt);
  2. -
  3. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut, typename DerivOut, typename Err> 
    -  void do_step_impl(System system, const StateIn & in, 
    -                    const DerivIn & dxdt_in, time_type t, StateOut & out, 
    -                    DerivOut & dxdt_out, time_type dt, Err & xerr);
  4. -
  5. -
    template<typename StateOut, typename StateIn1, typename DerivIn1, 
    -         typename StateIn2, typename DerivIn2> 
    -  void calc_state(time_type t, StateOut & x, const StateIn1 & x_old, 
    -                  const DerivIn1 & deriv_old, time_type t_old, 
    -                  const StateIn2 &, const DerivIn2 & deriv_new, 
    -                  time_type t_new) const;
    This method is used for continuous output and it calculates the state x at a time t from the knowledge of two states old_state and current_state at time points t_old and t_new. It also uses internal variables to calculate the result. Hence this method must be called after two successful do_step calls.
  6. -
  7. -
    template<typename StateIn> void adjust_size(const StateIn & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  8. -
-
-
-

-runge_kutta_dopri5 private member functions

-
    -
  1. template<typename StateIn> bool resize_k_x_tmp_impl(const StateIn & x);
  2. -
  3. template<typename StateIn> bool resize_dxdt_tmp_impl(const StateIn & x);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_fehlberg78.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_fehlberg78.html deleted file mode 100644 index e90050977..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/runge_kutta_fehlberg78.html +++ /dev/null @@ -1,185 +0,0 @@ - - - -Class template runge_kutta_fehlberg78 - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template runge_kutta_fehlberg78

-

boost::numeric::odeint::runge_kutta_fehlberg78 — The Runge-Kutta Fehlberg 78 method.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/runge_kutta_fehlberg78.hpp>
-
-template<typename State, typename Value = double, typename Deriv = State, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-         typename Operations = typename operations_dispatcher< State >::operations_type, 
-         typename Resizer = initially_resizer> 
-class runge_kutta_fehlberg78 : public boost::numeric::odeint::explicit_error_generic_rk< StageCount, Order, StepperOrder, ErrorOrder, State, Value, Deriv, Time, Algebra, Operations, Resizer >
-{
-public:
-  // types
-  typedef stepper_base_type::state_type      state_type;     
-  typedef stepper_base_type::value_type      value_type;     
-  typedef stepper_base_type::deriv_type      deriv_type;     
-  typedef stepper_base_type::time_type       time_type;      
-  typedef stepper_base_type::algebra_type    algebra_type;   
-  typedef stepper_base_type::operations_type operations_type;
-  typedef stepper_base_type::resizer_type    resizer_type;   
-
-  // construct/copy/destruct
-  runge_kutta_fehlberg78(const algebra_type & = algebra_type());
-
-  // public member functions
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut, typename Err> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type, Err &);
-  template<typename System, typename StateIn, typename DerivIn, 
-           typename StateOut> 
-    void do_step_impl(System, const StateIn &, const DerivIn &, time_type, 
-                      StateOut &, time_type);
-  template<typename StateIn> void adjust_size(const StateIn &);
-};
-
-

Description

-

The Runge-Kutta Fehlberg 78 method is a standard method for high-precision applications. The method is explicit and fulfills the Error Stepper concept. Step size control is provided but continuous output is not available for this method.

-

This class derives from explicit_error_stepper_base and inherits its interface via CRTP (current recurring template pattern). Furthermore, it derivs from explicit_error_generic_rk which is a generic Runge-Kutta algorithm with error estimation. For more details see explicit_error_stepper_base and explicit_error_generic_rk.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename State
    -

    The state type.

    -
  2. -
  3. -
    typename Value = double
    -

    The value type.

    -
  4. -
  5. -
    typename Deriv = State
    -

    The type representing the time derivative of the state.

    -
  6. -
  7. -
    typename Time = Value
    -

    The time representing the independent variable - the time.

    -
  8. -
  9. -
    typename Algebra = typename algebra_dispatcher< State >::algebra_type
    -

    The algebra type.

    -
  10. -
  11. -
    typename Operations = typename operations_dispatcher< State >::operations_type
    -

    The operations type.

    -
  12. -
  13. -
    typename Resizer = initially_resizer
    -

    The resizer policy type.

    -
  14. -
-
-
-

-runge_kutta_fehlberg78 - public - construct/copy/destruct

-
  1. -
    runge_kutta_fehlberg78(const algebra_type & algebra = algebra_type());
    Constructs the runge_kutta_cash_fehlberg78 class. This constructor can be used as a default constructor if the algebra has a default constructor.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    algebra

    A copy of algebra is made and stored inside explicit_stepper_base.

    -
-
-
-

-runge_kutta_fehlberg78 public member functions

-
    -
  1. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut, typename Err> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt, Err & xerr);
  2. -
  3. template<typename System, typename StateIn, typename DerivIn, 
    -         typename StateOut> 
    -  void do_step_impl(System system, const StateIn & in, const DerivIn & dxdt, 
    -                    time_type t, StateOut & out, time_type dt);
  4. -
  5. -
    template<typename StateIn> void adjust_size(const StateIn & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  6. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/stepper_tag.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/stepper_tag.html deleted file mode 100644 index c917a921e..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/stepper_tag.html +++ /dev/null @@ -1,51 +0,0 @@ - - - -Struct stepper_tag - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Struct stepper_tag

-

boost::numeric::odeint::stepper_tag

-
-

Synopsis

- -
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/symplectic_euler.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/symplectic_euler.html deleted file mode 100644 index ddb540016..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/symplectic_euler.html +++ /dev/null @@ -1,136 +0,0 @@ - - - -Class template symplectic_euler - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template symplectic_euler

-

boost::numeric::odeint::symplectic_euler — Implementation of the symplectic Euler method.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/symplectic_euler.hpp>
-
-template<typename Coor, typename Momentum = Coor, typename Value = double, 
-         typename CoorDeriv = Coor, typename MomentumDeriv = Coor, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< Coor >::algebra_type, 
-         typename Operations = typename operations_dispatcher< Coor >::operations_type, 
-         typename Resizer = initially_resizer> 
-class symplectic_euler : public symplectic_nystroem_stepper_base {
-public:
-  // types
-  typedef stepper_base_type::algebra_type algebra_type;
-  typedef stepper_base_type::value_type   value_type;  
-
-  // construct/copy/destruct
-  symplectic_euler(const algebra_type & = algebra_type());
-};
-
-

Description

-

The method is of first order and has one stage. It is described HERE.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename Coor
    -

    The type representing the coordinates q.

    -
  2. -
  3. -
    typename Momentum = Coor
    -

    The type representing the coordinates p.

    -
  4. -
  5. -
    typename Value = double
    -

    The basic value type. Should be something like float, double or a high-precision type.

    -
  6. -
  7. -
    typename CoorDeriv = Coor
    -

    The type representing the time derivative of the coordinate dq/dt.

    -
  8. -
  9. typename MomentumDeriv = Coor
  10. -
  11. -
    typename Time = Value
    -

    The type representing the time t.

    -
  12. -
  13. -
    typename Algebra = typename algebra_dispatcher< Coor >::algebra_type
    -

    The algebra.

    -
  14. -
  15. -
    typename Operations = typename operations_dispatcher< Coor >::operations_type
    -

    The operations.

    -
  16. -
  17. -
    typename Resizer = initially_resizer
    -

    The resizer policy.

    -
  18. -
-
-
-

-symplectic_euler - public - construct/copy/destruct

-
  1. -
    symplectic_euler(const algebra_type & algebra = algebra_type());
    Constructs the symplectic_euler. This constructor can be used as a default constructor if the algebra has a default constructor.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    algebra

    A copy of algebra is made and stored inside explicit_stepper_base.

    -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/symplectic_rkn_idp64254896.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/symplectic_rkn_idp64254896.html deleted file mode 100644 index 65049a4be..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/symplectic_rkn_idp64254896.html +++ /dev/null @@ -1,139 +0,0 @@ - - - -Class template symplectic_rkn_sb3a_m4_mclachlan - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template symplectic_rkn_sb3a_m4_mclachlan

-

boost::numeric::odeint::symplectic_rkn_sb3a_m4_mclachlan — Implementation of the symmetric B3A Runge-Kutta Nystroem method of fifth order.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/symplectic_rkn_sb3a_m4_mclachlan.hpp>
-
-template<typename Coor, typename Momentum = Coor, typename Value = double, 
-         typename CoorDeriv = Coor, typename MomentumDeriv = Coor, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< Coor >::algebra_type, 
-         typename Operations = typename operations_dispatcher< Coor >::operations_type, 
-         typename Resizer = initially_resizer> 
-class symplectic_rkn_sb3a_m4_mclachlan :
-  public symplectic_nystroem_stepper_base
-{
-public:
-  // types
-  typedef stepper_base_type::algebra_type algebra_type;
-  typedef stepper_base_type::value_type   value_type;  
-
-  // construct/copy/destruct
-  symplectic_rkn_sb3a_m4_mclachlan(const algebra_type & = algebra_type());
-};
-
-

Description

-

The method is of fourth order and has five stages. It is described HERE. This method can be used with multiprecision types since the coefficients are defined analytically.

-

ToDo: add reference to paper.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename Coor
    -

    The type representing the coordinates q.

    -
  2. -
  3. -
    typename Momentum = Coor
    -

    The type representing the coordinates p.

    -
  4. -
  5. -
    typename Value = double
    -

    The basic value type. Should be something like float, double or a high-precision type.

    -
  6. -
  7. -
    typename CoorDeriv = Coor
    -

    The type representing the time derivative of the coordinate dq/dt.

    -
  8. -
  9. typename MomentumDeriv = Coor
  10. -
  11. -
    typename Time = Value
    -

    The type representing the time t.

    -
  12. -
  13. -
    typename Algebra = typename algebra_dispatcher< Coor >::algebra_type
    -

    The algebra.

    -
  14. -
  15. -
    typename Operations = typename operations_dispatcher< Coor >::operations_type
    -

    The operations.

    -
  16. -
  17. -
    typename Resizer = initially_resizer
    -

    The resizer policy.

    -
  18. -
-
-
-

-symplectic_rkn_sb3a_m4_mclachlan - public - construct/copy/destruct

-
  1. -
    symplectic_rkn_sb3a_m4_mclachlan(const algebra_type & algebra = algebra_type());
    Constructs the symplectic_rkn_sb3a_m4_mclachlan. This constructor can be used as a default constructor if the algebra has a default constructor.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    algebra

    A copy of algebra is made and stored inside explicit_stepper_base.

    -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/symplectic_rkn_idp64277488.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/symplectic_rkn_idp64277488.html deleted file mode 100644 index 040492f83..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/symplectic_rkn_idp64277488.html +++ /dev/null @@ -1,137 +0,0 @@ - - - -Class template symplectic_rkn_sb3a_mclachlan - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template symplectic_rkn_sb3a_mclachlan

-

boost::numeric::odeint::symplectic_rkn_sb3a_mclachlan — Implement of the symmetric B3A method of Runge-Kutta-Nystroem method of sixth order.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/symplectic_rkn_sb3a_mclachlan.hpp>
-
-template<typename Coor, typename Momentum = Coor, typename Value = double, 
-         typename CoorDeriv = Coor, typename MomentumDeriv = Coor, 
-         typename Time = Value, 
-         typename Algebra = typename algebra_dispatcher< Coor >::algebra_type, 
-         typename Operations = typename operations_dispatcher< Coor >::operations_type, 
-         typename Resizer = initially_resizer> 
-class symplectic_rkn_sb3a_mclachlan : public symplectic_nystroem_stepper_base {
-public:
-  // types
-  typedef stepper_base_type::algebra_type algebra_type;
-  typedef stepper_base_type::value_type   value_type;  
-
-  // construct/copy/destruct
-  symplectic_rkn_sb3a_mclachlan(const algebra_type & = algebra_type());
-};
-
-

Description

-

The method is of fourth order and has six stages. It is described HERE. This method cannot be used with multiprecision types since the coefficients are not defined analytically.

-

ToDo Add reference to the paper.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename Coor
    -

    The type representing the coordinates q.

    -
  2. -
  3. -
    typename Momentum = Coor
    -

    The type representing the coordinates p.

    -
  4. -
  5. -
    typename Value = double
    -

    The basic value type. Should be something like float, double or a high-precision type.

    -
  6. -
  7. -
    typename CoorDeriv = Coor
    -

    The type representing the time derivative of the coordinate dq/dt.

    -
  8. -
  9. typename MomentumDeriv = Coor
  10. -
  11. -
    typename Time = Value
    -

    The type representing the time t.

    -
  12. -
  13. -
    typename Algebra = typename algebra_dispatcher< Coor >::algebra_type
    -

    The algebra.

    -
  14. -
  15. -
    typename Operations = typename operations_dispatcher< Coor >::operations_type
    -

    The operations.

    -
  16. -
  17. -
    typename Resizer = initially_resizer
    -

    The resizer policy.

    -
  18. -
-
-
-

-symplectic_rkn_sb3a_mclachlan - public - construct/copy/destruct

-
  1. -
    symplectic_rkn_sb3a_mclachlan(const algebra_type & algebra = algebra_type());
    Constructs the symplectic_rkn_sb3a_mclachlan. This constructor can be used as a default constructor if the algebra has a default constructor.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    algebra

    A copy of algebra is made and stored inside explicit_stepper_base.

    -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/times_iterator.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/times_iterator.html deleted file mode 100644 index 1d2f5469d..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/times_iterator.html +++ /dev/null @@ -1,97 +0,0 @@ - - - -Class template times_iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template times_iterator

-

boost::numeric::odeint::times_iterator — ODE Iterator with given evaluation points. The value type of this iterator is the state type of the stepper.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/times_iterator.hpp>
-
-template<typename Stepper, typename System, typename State, 
-         typename TimeIterator> 
-class times_iterator {
-public:
-  // construct/copy/destruct
-  times_iterator(Stepper, System, State &, TimeIterator, TimeIterator, 
-                 time_type);
-  times_iterator(Stepper, System, State &);
-};
-
-

Description

-

Implements an iterator representing the solution of an ODE from *t_start to *t_end evaluated at time points given by the sequence t_start to t_end. t_start and t_end are iterators representing a sequence of time points where the solution of the ODE should be evaluated. After each iteration the iterator dereferences to the state x at the next time *t_start++ until t_end is reached. This iterator can be used with Steppers, ControlledSteppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_times routine.

-

times_iterator is a model of single-pass iterator.

-

The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename Stepper
    -

    The stepper type which should be used during the iteration.

    -
  2. -
  3. -
    typename System
    -

    The type of the system function (ODE) which should be solved.

    -
  4. -
  5. -
    typename State
    -

    The state type of the ODE.

    -
  6. -
  7. -
    typename TimeIterator
    -

    The iterator type for the sequence of time points.

    -
  8. -
-
-
-

-times_iterator - public - construct/copy/destruct

-
    -
  1. times_iterator(Stepper stepper, System sys, State & s, TimeIterator t_start, 
    -               TimeIterator t_end, time_type dt);
  2. -
  3. times_iterator(Stepper stepper, System sys, State & s);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/times_time_iterator.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/times_time_iterator.html deleted file mode 100644 index b243b1aed..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/times_time_iterator.html +++ /dev/null @@ -1,97 +0,0 @@ - - - -Class template times_time_iterator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template times_time_iterator

-

boost::numeric::odeint::times_time_iterator — ODE Iterator with given evaluation points. The value type of this iterator is a std::pair containing state and time.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/iterator/times_time_iterator.hpp>
-
-template<typename Stepper, typename System, typename State, 
-         typename TimeIterator> 
-class times_time_iterator {
-public:
-  // construct/copy/destruct
-  times_time_iterator(Stepper, System, State &, TimeIterator, TimeIterator, 
-                      time_type);
-  times_time_iterator(Stepper, System, State &);
-};
-
-

Description

-

Implements an iterator representing the solution of an ODE from *t_start to *t_end evaluated at time points given by the sequence t_start to t_end. t_start and t_end are iterators representing a sequence of time points where the solution of the ODE should be evaluated. After each iteration the iterator dereferences to a pair with the state and the time at the next evaluation point *t_start++ until t_end is reached. This iterator can be used with Steppers, ControlledSteppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_times routine.

-

times_time_iterator is a model of single-pass iterator.

-

The value type of this iterator is a pair of state and time type.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename Stepper
    -

    The stepper type which should be used during the iteration.

    -
  2. -
  3. -
    typename System
    -

    The type of the system function (ODE) which should be solved.

    -
  4. -
  5. -
    typename State
    -

    The state type of the ODE.

    -
  6. -
  7. -
    typename TimeIterator
    -

    The iterator type for the sequence of time points.

    -
  8. -
-
-
-

-times_time_iterator - public - construct/copy/destruct

-
    -
  1. times_time_iterator(Stepper stepper, System sys, State & s, 
    -                    TimeIterator t_start, TimeIterator t_end, time_type dt);
  2. -
  3. times_time_iterator(Stepper stepper, System sys, State & s);
  4. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost/numeric/odeint/velocity_verlet.html b/libs/numeric/odeint/doc/html/boost/numeric/odeint/velocity_verlet.html deleted file mode 100644 index 3a37dcd9f..000000000 --- a/libs/numeric/odeint/doc/html/boost/numeric/odeint/velocity_verlet.html +++ /dev/null @@ -1,279 +0,0 @@ - - - -Class template velocity_verlet - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-
-
-

Class template velocity_verlet

-

boost::numeric::odeint::velocity_verlet — The Velocity-Verlet algorithm.

-
-

Synopsis

-
// In header: <boost/numeric/odeint/stepper/velocity_verlet.hpp>
-
-template<typename Coor, typename Velocity = Coor, typename Value = double, 
-         typename Acceleration = Coor, typename Time = Value, 
-         typename TimeSq = Time, 
-         typename Algebra = typename algebra_dispatcher< Coor >::algebra_type, 
-         typename Operations = typename operations_dispatcher< Coor >::operations_type, 
-         typename Resizer = initially_resizer> 
-class velocity_verlet : public algebra_stepper_base< Algebra, Operations > {
-public:
-  // types
-  typedef algebra_stepper_base< Algebra, Operations >   algebra_stepper_base_type;
-  typedef algebra_stepper_base_type::algebra_type       algebra_type;             
-  typedef algebra_stepper_base_type::operations_type    operations_type;          
-  typedef Coor                                          coor_type;                
-  typedef Velocity                                      velocity_type;            
-  typedef Acceleration                                  acceleration_type;        
-  typedef std::pair< coor_type, velocity_type >         state_type;               
-  typedef std::pair< velocity_type, acceleration_type > deriv_type;               
-  typedef state_wrapper< acceleration_type >            wrapped_acceleration_type;
-  typedef Value                                         value_type;               
-  typedef Time                                          time_type;                
-  typedef TimeSq                                        time_square_type;         
-  typedef Resizer                                       resizer_type;             
-  typedef stepper_tag                                   stepper_category;         
-  typedef unsigned short                                order_type;               
-
-  // construct/copy/destruct
-  velocity_verlet(const algebra_type & = algebra_type());
-
-  // public member functions
-  order_type order(void) const;
-  template<typename System, typename StateInOut> 
-    void do_step(System, StateInOut &, time_type, time_type);
-  template<typename System, typename StateInOut> 
-    void do_step(System, const StateInOut &, time_type, time_type);
-  template<typename System, typename CoorIn, typename VelocityIn, 
-           typename AccelerationIn, typename CoorOut, typename VelocityOut, 
-           typename AccelerationOut> 
-    void do_step(System, CoorIn const &, VelocityIn const &, 
-                 AccelerationIn const &, CoorOut &, VelocityOut &, 
-                 AccelerationOut &, time_type, time_type);
-  template<typename StateIn> void adjust_size(const StateIn &);
-  void reset(void);
-  template<typename AccelerationIn> void initialize(const AccelerationIn &);
-  template<typename System, typename CoorIn, typename VelocityIn> 
-    void initialize(System, const CoorIn &, const VelocityIn &, time_type);
-  bool is_initialized(void) const;
-
-  // private member functions
-  template<typename System, typename CoorIn, typename VelocityIn> 
-    void initialize_acc(System, const CoorIn &, const VelocityIn &, time_type);
-  template<typename System, typename StateInOut> 
-    void do_step_v1(System, StateInOut &, time_type, time_type);
-  template<typename StateIn> bool resize_impl(const StateIn &);
-  acceleration_type & get_current_acc(void);
-  const acceleration_type & get_current_acc(void) const;
-  acceleration_type & get_old_acc(void);
-  const acceleration_type & get_old_acc(void) const;
-  void toggle_current_acc(void);
-
-  // public data members
-  static const order_type order_value;
-};
-
-

Description

-

The Velocity-Verlet algorithm is a method for simulation of molecular dynamics systems. It solves the ODE a=f(r,v',t) where r are the coordinates, v are the velocities and a are the accelerations, hence v = dr/dt, a=dv/dt.

-

-

-
-

Template Parameters

-
    -
  1. -
    typename Coor
    -

    The type representing the coordinates.

    -
  2. -
  3. -
    typename Velocity = Coor
    -

    The type representing the velocities.

    -
  4. -
  5. -
    typename Value = double
    -

    The type value type.

    -
  6. -
  7. -
    typename Acceleration = Coor
    -

    The type representing the acceleration.

    -
  8. -
  9. -
    typename Time = Value
    -

    The time representing the independent variable - the time.

    -
  10. -
  11. -
    typename TimeSq = Time
    -

    The time representing the square of the time.

    -
  12. -
  13. -
    typename Algebra = typename algebra_dispatcher< Coor >::algebra_type
    -

    The algebra.

    -
  14. -
  15. -
    typename Operations = typename operations_dispatcher< Coor >::operations_type
    -

    The operations type.

    -
  16. -
  17. -
    typename Resizer = initially_resizer
    -

    The resizer policy type.

    -
  18. -
-
-
-

-velocity_verlet - public - construct/copy/destruct

-
  1. -
    velocity_verlet(const algebra_type & algebra = algebra_type());
    Constructs the velocity_verlet class. This constructor can be used as a default constructor if the algebra has a default constructor.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    algebra

    A copy of algebra is made and stored.

    -
-
-
-

-velocity_verlet public member functions

-
    -
  1. -
    order_type order(void) const;
    -

    -

    -
    ---- - - - - -

    Returns:

    Returns the order of the stepper.

    -
  2. -
  3. template<typename System, typename StateInOut> 
    -  void do_step(System system, StateInOut & x, time_type t, time_type dt);
  4. -
  5. template<typename System, typename StateInOut> 
    -  void do_step(System system, const StateInOut & x, time_type t, time_type dt);
  6. -
  7. template<typename System, typename CoorIn, typename VelocityIn, 
    -         typename AccelerationIn, typename CoorOut, typename VelocityOut, 
    -         typename AccelerationOut> 
    -  void do_step(System system, CoorIn const & qin, VelocityIn const & pin, 
    -               AccelerationIn const & ain, CoorOut & qout, 
    -               VelocityOut & pout, AccelerationOut & aout, time_type t, 
    -               time_type dt);
  8. -
  9. -
    template<typename StateIn> void adjust_size(const StateIn & x);
    Adjust the size of all temporaries in the stepper manually.

    -

    -
    ---- - - - - -

    Parameters:

    ---- - - - - -

    x

    A state from which the size of the temporaries to be resized is deduced.

    -
  10. -
  11. -
    void reset(void);
    Resets the internal state of this stepper. After calling this method it is safe to use all do_step method without explicitly initializing the stepper.
  12. -
  13. template<typename AccelerationIn> void initialize(const AccelerationIn & ain);
  14. -
  15. template<typename System, typename CoorIn, typename VelocityIn> 
    -  void initialize(System system, const CoorIn & qin, const VelocityIn & pin, 
    -                  time_type t);
  16. -
  17. -
    bool is_initialized(void) const;
    -

    -

    -
    ---- - - - - -

    Returns:

    Returns if the stepper is initialized.

    -
  18. -
-
-
-

-velocity_verlet private member functions

-
    -
  1. template<typename System, typename CoorIn, typename VelocityIn> 
    -  void initialize_acc(System system, const CoorIn & qin, 
    -                      const VelocityIn & pin, time_type t);
  2. -
  3. template<typename System, typename StateInOut> 
    -  void do_step_v1(System system, StateInOut & x, time_type t, time_type dt);
  4. -
  5. template<typename StateIn> bool resize_impl(const StateIn & x);
  6. -
  7. acceleration_type & get_current_acc(void);
  8. -
  9. const acceleration_type & get_current_acc(void) const;
  10. -
  11. acceleration_type & get_old_acc(void);
  12. -
  13. const acceleration_type & get_old_acc(void) const;
  14. -
  15. void toggle_current_acc(void);
  16. -
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/acknowledgments.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/acknowledgments.html deleted file mode 100644 index c031e8369..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/acknowledgments.html +++ /dev/null @@ -1,41 +0,0 @@ - - - -Acknowledgments - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
- - - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts.html deleted file mode 100644 index 739a13b48..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts.html +++ /dev/null @@ -1,64 +0,0 @@ - - - -Concepts - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
- - - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/controlled_stepper.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/controlled_stepper.html deleted file mode 100644 index 9f6b855b3..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/controlled_stepper.html +++ /dev/null @@ -1,235 +0,0 @@ - - - -Controlled Stepper - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- This concept specifies the interface a controlled stepper has to fulfill - to be used within integrate - functions. -

-
- - Description -
-

- A controlled stepper following this Controlled Stepper concept provides the - possibility to perform one step of the solution x(t) - of an ODE with step-size dt to obtain x(t+dt) - with a given step-size dt. Depending on an error estimate - of the solution the step might be rejected and a smaller step-size is suggested. -

-
- - Associated - types -
-
    -
  • -

    state_type

    -

    Stepper::state_type

    -

    The - type characterizing the state of the ODE, hence x.

    -
  • -
  • -

    deriv_type

    -

    Stepper::deriv_type

    -

    The - type characterizing the derivative of the ODE, hence d x/dt.

    -
  • -
  • -

    time_type

    -

    Stepper::time_type

    -

    The - type characterizing the dependent variable of the ODE, hence the time - t.

    -
  • -
  • -

    value_type

    -

    Stepper::value_type

    -

    The - numerical data type which is used within the stepper, something like - float, double, - complex&lt; double &gt;.

    -
  • -
  • -

    stepper_category

    -

    Stepper::stepper_category

    -

    A - tag type characterizing the category of the stepper. This type must be - convertible to controlled_stepper_tag.

    -
  • -
-
- - Notation -
-
-

-
-
ControlledStepper
-

- A type that is a model of Controlled Stepper -

-
State
-

- A type representing the state x of the ODE -

-
Time
-

- A type representing the time t of the ODE -

-
stepper
-

- An object of type ControlledStepper -

-
x
-

- Object of type State -

-
t, dt
-

- Objects of type Time -

-
sys
-

- An object defining the ODE, should be a model of System, - Symplectic - System, Simple - Symplectic System or Implicit - System. -

-
-
-
- - Valid - Expressions -
-
------ - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Do step -

-
-

-

-
stepper.try_step( sys , x , t , dt )
-

-

-
-

- controlled_step_result -

-
-

- Tries one step of step size dt. - If the step was successful, success - is returned, the resulting state is written to x, - the new time is stored in t - and dt now contains - a new (possibly larger) step-size for the next step. If the error - was too big, rejected - is returned and the results are neglected - x - and t are unchanged - and dt now contains - a reduced step-size to be used for the next try. -

-
-
- - Models -
-
    -
  • - controlled_error_stepper< runge_kutta_cash_karp54 - > -
  • -
  • - controlled_error_stepper_fsal< runge_kutta_dopri5 - > -
  • -
  • - controlled_error_stepper< runge_kutta_fehlberg78 - > -
  • -
  • - rosenbrock4_controller -
  • -
  • - bulirsch_stoer -
  • -
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/dense_output_stepper.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/dense_output_stepper.html deleted file mode 100644 index 6cb0667c0..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/dense_output_stepper.html +++ /dev/null @@ -1,341 +0,0 @@ - - - -Dense Output Stepper - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- This concept specifies the interface a dense output stepper has to fulfill - to be used within integrate - functions. -

-
- - Description -
-

- A dense output stepper following this Dense Output Stepper concept provides - the possibility to perform a single step of the solution x(t) - of an ODE to obtain x(t+dt). The step-size dt might be adjusted automatically due - to error control. Dense output steppers also can interpolate the solution - to calculate the state x(t') at any point t - <= t' <= t+dt. -

-
- - Associated - types -
-
    -
  • -

    state_type

    -

    Stepper::state_type

    -

    The - type characterizing the state of the ODE, hence x.

    -
  • -
  • -

    deriv_type

    -

    Stepper::deriv_type

    -

    The - type characterizing the derivative of the ODE, hence d x/dt.

    -
  • -
  • -

    time_type

    -

    Stepper::time_type

    -

    The - type characterizing the dependent variable of the ODE, hence the time - t.

    -
  • -
  • -

    value_type

    -

    Stepper::value_type

    -

    The - numerical data type which is used within the stepper, something like - float, double, - complex&lt; double &gt;.

    -
  • -
  • -

    stepper_category

    -

    Stepper::stepper_category

    -

    A - tag type characterizing the category of the stepper. This type must be - convertible to dense_output_stepper_tag.

    -
  • -
-
- - Notation -
-
-

-
-
Stepper
-

- A type that is a model of Dense Output Stepper -

-
State
-

- A type representing the state x of the ODE -

-
stepper
-

- An object of type Stepper -

-
x0, x
-

- Object of type State -

-
t0, dt0, t
-

- Objects of type Stepper::time_type -

-
sys
-

- An object defining the ODE, should be a model of System, - Symplectic - System, Simple - Symplectic System or Implicit - System. -

-
-
-
- - Valid - Expressions -
-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Initialize integration -

-
-

- stepper.initialize( - x0 , - t0 , - dt0 ) -

-
-

- void -

-
-

- Initializes the stepper with initial values x0, - t0 and dt0. -

-
-

- Do step -

-
-

- stepper.do_step( - sys ) -

-
-

- std::pair< - Stepper::time_type , - Stepper::time_type > -

-
-

- Performs one step using the ODE defined by sys. - The step-size might be changed internally due to error control. - This function returns a pair containing t - and t+dt representing the interval - for which interpolation can be performed. -

-
-

- Do interpolation -

-
-

- stepper.calc_state( - t_inter , - x ) -

-
-

- void -

-
-

- Performs the interpolation to calculate /x(tinter/) where /t <= - tinter <= t+dt/. -

-
-

- Get current time -

-
-

- stepper.current_time() -

-
-

- const Stepper::time_type& -

-
-

- Returns the current time t+dt of the stepper, - that is the end time of the last step and the starting time for - the next call of do_step -

-
-

- Get current state -

-
-

- stepper.current_state() -

-
-

- const Stepper::state_type& -

-
-

- Returns the current state of the stepper, that is x(t+dt), - the state at the time returned by stepper.current_time() -

-
-

- Get current time step -

-
-

- stepper.current_time_step() -

-
-

- const Stepper::time_type& -

-
-

- Returns the current step size of the stepper, that is dt -

-
-
- - Models -
-
    -
  • - dense_output_controlled_explicit_fsal< controlled_error_stepper_fsal< runge_kutta_dopri5 - > -
  • -
  • - bulirsch_stoer_dense_out -
  • -
  • - rosenbrock4_dense_output -
  • -
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/error_stepper.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/error_stepper.html deleted file mode 100644 index 065f41121..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/error_stepper.html +++ /dev/null @@ -1,369 +0,0 @@ - - - -Error Stepper - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- This concepts specifies the interface an error stepper has to fulfill to - be used within a ControlledErrorStepper. An error stepper must always fulfill - the stepper concept. This can trivially implemented by -

-

-

-
template< class System >
-error_stepper::do_step( System sys , state_type &x , time_type t , time_type dt )
-{
-    state_type xerr;
-    // allocate xerr
-    do_step( sys , x , t , dt , xerr );
-}
-
-

-

-
- - Description -
-

- An error stepper following this Error Stepper concept is capable of doing - one step of the solution x(t) of an ODE with step-size - dt to obtain x(t+dt) and also computing - an error estimate xerr of the result. Error Steppers - can be Runge-Kutta steppers, symplectic steppers as well as implicit steppers. - Based on the stepper type, the ODE is defined as System, - Symplectic - System, Simple - Symplectic System or Implicit - System. -

-
- - Refinement - of -
-
    -
  • - DefaultConstructable -
  • -
  • - CopyConstructable -
  • -
  • - Stepper -
  • -
-
- - Associated - types -
-
    -
  • -

    state_type

    -

    Stepper::state_type

    -

    The - type characterizing the state of the ODE, hence x.

    -
  • -
  • -

    deriv_type

    -

    Stepper::deriv_type

    -

    The - type characterizing the derivative of the ODE, hence d x/dt.

    -
  • -
  • -

    time_type

    -

    Stepper::time_type

    -

    The - type characterizing the dependent variable of the ODE, hence the time - t.

    -
  • -
  • -

    value_type

    -

    Stepper::value_type

    -

    The - numerical data type which is used within the stepper, something like - float, double, - complex&lt; double &gt;.

    -
  • -
  • -

    order_type

    -

    Stepper::order_type

    -

    The - type characterizing the order of the ODE, typically unsigned - short.

    -
  • -
  • -

    stepper_category

    -

    Stepper::stepper_category

    -

    A - tag type characterizing the category of the stepper. This type must be - convertible to error_stepper_tag.

    -
  • -
-
- - Notation -
-
-

-
-
ErrorStepper
-

- A type that is a model of Error Stepper -

-
State
-

- A type representing the state x of the ODE -

-
Error
-

- A type representing the error calculated by the stepper, usually same - as State -

-
Time
-

- A type representing the time t of the ODE -

-
stepper
-

- An object of type ErrorStepper -

-
x
-

- Object of type State -

-
xerr
-

- Object of type Error -

-
t, dt
-

- Objects of type Time -

-
sys
-

- An object defining the ODE, should be a model of either System, - Symplectic - System, Simple - Symplectic System or Implicit - System. -

-
-
-
- - Valid - Expressions -
-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Get the stepper order -

-
-

- stepper.order() -

-
-

- order_type -

-
-

- Returns the order of the stepper for one step without error estimation. -

-
-

- Get the stepper order -

-
-

- stepper.stepper_order() -

-
-

- order_type -

-
-

- Returns the order of the stepper for one error estimation step - which is used for error calculation. -

-
-

- Get the error order -

-
-

- stepper.errorr_order() -

-
-

- order_type -

-
-

- Returns the order of the error step which is used for error calculation. -

-
-

- Do step -

-
-

- stepper.do_step( - sys , - x , - t , - dt ) -

-
-

- void -

-
-

- Performs one step of step size dt. - The newly obtained state is written in-place to x. -

-
-

- Do step with error estimation -

-
-

- stepper.do_step( - sys , - x , - t , - dt , - xerr ) -

-
-

- void -

-
-

- Performs one step of step size dt - with error estimation. The newly obtained state is written in-place - to x and the estimated - error to xerr. -

-
-
- - Models -
-
    -
  • - runge_kutta_cash_karp54 -
  • -
  • - runge_kutta_dopri5 -
  • -
  • - runge_kutta_fehlberg78 -
  • -
  • - rosenbrock4 -
  • -
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/implicit_system.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/implicit_system.html deleted file mode 100644 index 3f7dd4a98..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/implicit_system.html +++ /dev/null @@ -1,184 +0,0 @@ - - - -Implicit System - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
- - Description -
-

- This concept describes how to define a ODE that can be solved by an implicit - routine. Implicit routines need not only the function f(x,t) - but also the Jacobian df/dx = A(x,t). A - is a matrix and implicit routines need to solve the linear problem Ax - = b. In odeint this is implemented with use of Boost.uBLAS, - therefore, the state_type implicit routines is ublas::vector - and the matrix is defined as ublas::matrix. -

-
- - Notation -
-
-

-
-
System
-

- A type that is a model of Implicit - System -

-
Time
-

- A type representing the time of the ODE -

-
sys
-

- An object of type System -

-
x
-

- Object of type ublas::vector -

-
dxdt
-

- Object of type ublas::vector -

-
jacobi
-

- Object of type ublas::matrix -

-
t
-

- Object of type Time -

-
-
-
- - Valid - Expressions -
-
------ - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Calculate dx/dt := f(x,t) -

-
-

- sys.first( - x , - dxdt , - t ) -

-
-

- void -

-
-

- Calculates f(x,t), - the result is stored into dxdt -

-
-

- Calculate A := df/dx (x,t) -

-
-

- sys.second( - x , - jacobi , - t ) -

-
-

- void -

-
-

- Calculates the Jacobian of f at x,t, - the result is stored into jacobi -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/second_order_system.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/second_order_system.html deleted file mode 100644 index a34e348b0..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/second_order_system.html +++ /dev/null @@ -1,168 +0,0 @@ - - - -Second Order System - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
- - Description -
-

- The Second Order System concept models the algorithmic implementation of - the rhs for steppers requirering the second order derivative, hence the r.h.s. - of the ODE x'' = f(x,x',t). The only requirement for - this concept is that it should be callable with a specific parameter syntax - (see below). A Second Order System is typically implemented as a function - or a functor. Systems fulfilling this concept are required by the Velocity - Verlet method. -

-
- - Notation -
-
-

-
-
System
-

- A type that is a model of Second Order System -

-
Space
-

- A type representing the state x of the ODE -

-
Velocity
-

- A type representing the derivative x' of the ODE -

-
Acceleration
-

- A type representing the second order derivative x'' - of the ODE -

-
Time
-

- A type representing the time -

-
sys
-

- An object of type System -

-
x
-

- Object of type Space -

-
v
-

- Object of type Velocity -

-
a
-

- Object of type Acceleration -

-
t
-

- Object of type Time -

-
-
-
- - Valid - expressions -
-
------ - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Calculate x'' := f(x,x',t) -

-
-

- sys( - x , - v , - a , - t ) -

-
-

- void -

-
-

- Calculates f(x,x',t), the result is stored into a. -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/simple_symplectic_system.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/simple_symplectic_system.html deleted file mode 100644 index b24467fe7..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/simple_symplectic_system.html +++ /dev/null @@ -1,187 +0,0 @@ - - - -Simple Symplectic System - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
- - Description -
-

- In most Hamiltonian systems the kinetic term is a quadratic term in the momentum - Hkin = p^2 / 2m and in many cases it is possible to rescale - coordinates and set m=1 which leads to a trivial equation - of motion: -

-

- q'(t) = f(p) = p. -

-

- while for p' we still have the general form -

-

- p'(t) = g(q) -

-

- As this case is very frequent we introduced a concept where only the nontrivial - equation for p' has to be provided to the symplectic - stepper. We call this concept SimpleSymplecticSystem -

-
- - Notation -
-
-

-
-
System
-

- A type that is a model of SimpleSymplecticSystem -

-
Coor
-

- The type of the coordinate q -

-
MomentumDeriv
-

- The type of the derivative of momentum p' -

-
sys
-

- An object that models System -

-
q
-

- Object of type Coor -

-
dpdt
-

- Object of type MomentumDeriv -

-
-
-
- - Valid - Expressions -
-
------ - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Check for pair -

-
-

- boost::is_pair< - System >::type -

-
-

- boost::mpl::false_ -

-
-

- Check if System is a pair, should be evaluated to false in this - case. -

-
-

- Calculate dp/dt = g(q) -

-
-

- sys( - q , - dpdt ) -

-
-

- void -

-
-

- Calculates g(q), the result is stored into - dpdt -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/state_algebra_operations.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/state_algebra_operations.html deleted file mode 100644 index 6781bacd9..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/state_algebra_operations.html +++ /dev/null @@ -1,882 +0,0 @@ - - - -State Algebra Operations - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
- - - - - -
[Note]Note

- The following does not apply to implicit steppers like implicit_euler or - Rosenbrock 4 as there the state_type - can not be changed from ublas::vector - and no algebra/operations are used. -

-
- - Description -
-

- The State, Algebra and Operations - together define a concept describing how the mathematical vector operations - required for the stepper algorithms are performed. The typical vector operation - done within steppers is -

-

- y = Σ αi xi. -

-

- The State represents the - state variable of an ODE, usually denoted with x. Algorithmically, - the state is often realized as a vector< double > or array< double , N >, - however, the genericity of odeint enables you to basically use anything as - a state type. The algorithmic counterpart of such mathematical expressions - is divided into two parts. First, the Algebra - is used to account for the vector character of the equation. In the case - of a vector as state type - this means the Algebra is - responsible for iteration over all vector elements. Second, the Operations are used to represent the actual - operation applied to each of the vector elements. So the Algebra - iterates over all elements of the States - and calls an operation taken from the Operations - for each element. This is where State, - Algebra and Operations have to work together to make - odeint running. Please have a look at the range_algebra - and default_operations to - see an example how this is implemented. -

-

- In the following we describe how State, - Algebra and Operations are used together within the - stepper implementations. -

-
- -
- - Notation -
-
-

-
-
Operations
-

- The operations type -

-
Value1, ... , - ValueN
-

- Types representing the value or time type of stepper -

-
Scale
-

- Type of the scale operation -

-
scale
-

- Object of type Scale -

-
ScaleSumN
-

- Type that represents a general scale_sum operation, N - should be replaced by a number from 1 to 14. -

-
scale_sumN
-

- Object of type ScaleSumN, - N should be replaced by a - number from 1 to 14. -

-
ScaleSumSwap2
-

- Type of the scale sum swap operation -

-
scale_sum_swap2
-

- Object of type ScaleSumSwap2 -

-
a1, - a2, - ...
-

- Objects of type Value1, - Value2, ... -

-
y, - x1, - x2, - ...
-

- Objects of State's - value type -

-
-
-
- - Valid - Expressions -
-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Get scale operation -

-
-

- Operations::scale< - Value > -

-
-

- Scale -

-
-

- Get Scale from - Operations -

-
-

- Scale constructor -

-
-

- Scale< - Value >( - a ) -

-
-

- Scale -

-
-

- Constructs a Scale - object -

-
-

- Scale operation -

-
-

- scale( - x ) -

-
-

- void -

-
-

- Calculates x *= a -

-
-

- Get general scale_sum - operation -

-
-

- Operations::scale_sumN< Value1 - , ... , ValueN > -

-
-

- ScaleSumN -

-
-

- Get the ScaleSumN type - from Operations, - N should be replaced - by a number from 1 to 14. -

-
-

- scale_sum constructor -

-
-

- ScaleSumN< Value1 , ... , ValueN - >( a1 , ... , aN ) -

-
-

- ScaleSumN -

-
-

- Constructs a scale_sum - object given N parameter - values with N between - 1 and 14. -

-
-

- scale_sum operation -

-
-

- scale_sumN( y , x1 , ... , xN ) -

-
-

- void -

-
-

- Calculates y = a1*x1 - + a2*x2 - + ... - + aN*xN. - Note that this is an N+1-ary - function call. -

-
-

- Get scale sum swap operation -

-
-

- Operations::scale_sum_swap2< - Value1 , - Value2 > -

-
-

- ScaleSumSwap2 -

-
-

- Get scale sum swap from operations -

-
-

- ScaleSumSwap2 - constructor -

-
-

- ScaleSumSwap2< Value1 - , Value2 - >( a1 - , a2 - ) -

-
-

- ScaleSumSwap2 -

-
-

- Constructor -

-
-

- ScaleSumSwap2 - operation -

-
-

- scale_sum_swap2( x1 - , x2 - , x3 - ) -

-
-

- void -

-
-

- Calculates tmp = x1, - x1 = - a1*x2 + - a2*x3 and x2 - = tmp. -

-
-
-
- -
- - Notation -
-
-

-
-
State
-

- The state type -

-
Algebra
-

- The algebra type -

-
OperationN
-

- An N-ary operation type, - N should be a number from - 1 to 14. -

-
algebra
-

- Object of type Algebra -

-
operationN
-

- Object of type OperationN -

-
y, - x1, - x2, - ...
-

- Objects of type State -

-
-
-
- - Valid - Expressions -
-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Vector Operation with arity 2 -

-
-

- algebra.for_each2( - y , - x , - operation2 ) -

-
-

- void -

-
-

- Calls operation2( y_i - , x_i - ) for each element y_i of y - and x_i of x. -

-
-

- Vector Operation with arity 3 -

-
-

- algebra.for_each3( - y , - x1 , - x2 , - operation3 ) -

-
-

- void -

-
-

- Calls operation3( y_i - , x1_i - , x2_i - ) for each element y_i of y - and x1_i of - x1 and x2_i of x2. -

-
-

- Vector Operation with arity N -

-
-

- algebra.for_eachN( y , x1 , ... - , xN , operationN ) -

-
-

- void -

-
-

- Calls operationN( y_i , x1_i , - ... , xN_i ) for each element y_i - of y and x1_i of x1 - and so on. N should be - replaced by a number between 1 and 14. -

-
-
-
- -

- As standard configuration odeint uses the range_algebra - and default_operations - which suffices most situations. However, a few more possibilities exist - either to gain better performance or to ensure interoperability with other - libraries. In the following we list the existing Algebra/Operations configurations that can be - used in the steppers. -

-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- State -

-
-

- Algebra -

-
-

- Operations -

-
-

- Remarks -

-
-

- Anything supporting Boost.Range, - like std::vector, std::list, - boost::array,... based on a value_type that supports operators - +,* (typically double) -

-
-

- range_algebra -

-
-

- default_operations -

-
-

- Standard implementation, applicable for most typical situations. -

-
-

- boost::array based on a value_type that supports operators - +,* -

-
-

- array_algebra -

-
-

- default_operations -

-
-

- Special implementation for boost::array with better performance - than range_algebra -

-
-

- Anything that defines operators + within itself and * with scalar - (Mathematically spoken, anything that is a vector space). -

-
-

- vector_space_algebra -

-
-

- default_operations -

-
-

- For the use of Controlled - Stepper, the template vector_space_reduce - has to be instantiated. -

-
-

- thrust::device_vector, thrust::host_vector -

-
-

- thrust_algebra -

-
-

- thrust_operations -

-
-

- For running odeint on CUDA devices by using Thrust -

-
-

- Any RandomAccessRange -

-
-

- openmp_range_algebra -

-
-

- default_operations -

-
-

- OpenMP-parallelised range algebra -

-
-

- openmp_state -

-
-

- openmp_algebra -

-
-

- default_operations -

-
-

- OpenMP-parallelised algebra for split data -

-
-

- boost::array or anything which allocates - the elements in a C-like manner -

-
-

- vector_space_algebra -

-
-

- mkl_operations -

-
-

- Using the Intel - Math Kernel Library in odeint for maximum performance. - Currently, only the RK4 stepper is supported. -

-
-
-
- -
------ - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Vector operation -

-
-

- algebra.for_each3( - y , - x1 , - x2 , - Operations::scale_sum2< - Value1 , - Value2 >( - a1 , - a2 ) - ) -

-
-

- void -

-
-

- Calculates y = a1 - x1 + a2 x2 -

-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/state_wrapper.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/state_wrapper.html deleted file mode 100644 index 2516fb4e6..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/state_wrapper.html +++ /dev/null @@ -1,233 +0,0 @@ - - - -State Wrapper - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
- - Description -
-

- The State Wrapper - concept describes the way odeint creates temporary state objects to store - intermediate results within the stepper's do_step - methods. -

-
- - Notation -
-
-

-
-
State
-

- A type that is the state_type - of the ODE -

-
WrappedState
-

- A type that is a model of State Wrapper for the state type State. -

-
x
-

- Object of type State -

-
w
-

- Object of type WrappedState -

-
-
-
- - Valid - Expressions -
-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Get resizeability -

-
-

- is_resizeable< - State > -

-
-

- boost::false_type or boost::true_type -

-
-

- Returns boost::true_type if the State is resizeable, boost::false_type otherwise. -

-
-

- Create WrappedState - type -

-
-

- state_wrapper< - State > -

-
-

- WrappedState -

-
-

- Creates the type for a WrappedState - for the state type State -

-
-

- Constructor -

-
-

- WrappedState() -

-
-

- WrappedState -

-
-

- Constructs a state wrapper with an empty state -

-
-

- Copy Constructor -

-
-

- WrappedState( - w ) -

-
-

- WrappedState -

-
-

- Constructs a state wrapper with a state of the same size as the - state in w -

-
-

- Get state -

-
-

- w.m_v -

-
-

- State -

-
-

- Returns the State - object of this state wrapper. -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/stepper.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/stepper.html deleted file mode 100644 index f7935cdc8..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/stepper.html +++ /dev/null @@ -1,279 +0,0 @@ - - - -Stepper - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- This concepts specifies the interface a simple stepper has to fulfill to - be used within the integrate - functions. -

-
- - Description -
-

- The basic stepper concept. A basic stepper following this Stepper concept - is able to perform a single step of the solution x(t) - of an ODE to obtain x(t+dt) using a given step size - dt. Basic steppers can be Runge-Kutta steppers, symplectic - steppers as well as implicit steppers. Depending on the actual stepper, the - ODE is defined as System, - Symplectic - System, Simple - Symplectic System or Implicit - System. Note that all error steppers are also basic steppers. -

-
- - Refinement - of -
-
    -
  • - DefaultConstructable -
  • -
  • - CopyConstructable -
  • -
-
- - Associated - types -
-
    -
  • -

    state_type

    -

    Stepper::state_type

    -

    The - type characterizing the state of the ODE, hence x.

    -
  • -
  • -

    deriv_type

    -

    Stepper::deriv_type

    -

    The - type characterizing the derivative of the ODE, hence d x/dt.

    -
  • -
  • -

    time_type

    -

    Stepper::time_type

    -

    The - type characterizing the dependent variable of the ODE, hence the time - t.

    -
  • -
  • -

    value_type

    -

    Stepper::value_type

    -

    The - numerical data type which is used within the stepper, something like - float, double, - complex&lt; double &gt;.

    -
  • -
  • -

    order_type

    -

    Stepper::order_type

    -

    The - type characterizing the order of the ODE, typically unsigned - short.

    -
  • -
  • -

    stepper_category

    -

    Stepper::stepper_category

    -

    A - tag type characterizing the category of the stepper. This type must be - convertible to stepper_tag.

    -
  • -
-
- - Notation -
-
-

-
-
Stepper
-

- A type that is a model of Stepper -

-
State
-

- A type representing the state x of the ODE -

-
Time
-

- A type representing the time t of the ODE -

-
stepper
-

- An object of type Stepper -

-
x
-

- Object of type State -

-
t, dt
-

- Objects of type Time -

-
sys
-

- An object defining the ODE. Depending on the Stepper this might be - a model of System, - Symplectic - System, Simple - Symplectic System or Implicit - System -

-
-
-
- - Valid Expressions -
-
------ - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Get the order -

-
-

- stepper.order() -

-
-

- order_type -

-
-

- Returns the order of the stepper. -

-
-

- Do step -

-
-

- stepper.do_step( - sys , - x , - t , - dt ) -

-
-

- void -

-
-

- Performs one step of step size dt. - The newly obtained state is written in place in x. -

-
-
- - Models -
-
    -
  • - runge_kutta4 -
  • -
  • - euler -
  • -
  • - runge_kutta_cash_karp54 -
  • -
  • - runge_kutta_dopri5 -
  • -
  • - runge_kutta_fehlberg78 -
  • -
  • - modified_midpoint -
  • -
  • - rosenbrock4 -
  • -
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/symplectic_system.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/symplectic_system.html deleted file mode 100644 index b2a012ea4..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/symplectic_system.html +++ /dev/null @@ -1,241 +0,0 @@ - - - -Symplectic System - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
- - Description -
-

- This concept describes how to define a symplectic system written with generalized - coordinate q and generalized - momentum p: -

-

- q'(t) = f(p) -

-

- p'(t) = g(q) -

-

- Such a situation is typically found for Hamiltonian systems with a separable - Hamiltonian: -

-

- H(p,q) = Hkin(p) + V(q) -

-

- which gives the equations of motion: -

-

- q'(t) = dHkin / dp = f(p) -

-

- p'(t) = dV / dq = g(q) -

-

- The algorithmic implementation of this situation is described by a pair of - callable objects for f and g with - a specific parameter signature. Such a system should be implemented as a - std::pair of functions or a functors. Symplectic systems are used in symplectic - steppers like symplectic_rkn_sb3a_mclachlan. -

-
- - Notation -
-
-

-
-
System
-

- A type that is a model of SymplecticSystem -

-
Coor
-

- The type of the coordinate q -

-
Momentum
-

- The type of the momentum p -

-
CoorDeriv
-

- The type of the derivative of coordinate q' -

-
MomentumDeriv
-

- The type of the derivative of momentum p' -

-
sys
-

- An object of the type System -

-
q
-

- Object of type Coor -

-
p
-

- Object of type Momentum -

-
dqdt
-

- Object of type CoorDeriv -

-
dpdt
-

- Object of type MomentumDeriv -

-
-
-
- - Valid - expressions -
-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Check for pair -

-
-

- boost::is_pair< - System >::type -

-
-

- boost::mpl::true_ -

-
-

- Check if System is a pair -

-
-

- Calculate dq/dt = f(p) -

-
-

- sys.first( - p , - dqdt ) -

-
-

- void -

-
-

- Calculates f(p), the result is stored into - dqdt -

-
-

- Calculate dp/dt = g(q) -

-
-

- sys.second( - q , - dpdt ) -

-
-

- void -

-
-

- Calculates g(q), the result is stored into - dpdt -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/system.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/system.html deleted file mode 100644 index b1c00f68e..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/concepts/system.html +++ /dev/null @@ -1,158 +0,0 @@ - - - -System - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-

-System -

-
- - Description -
-

- The System concept models the algorithmic implementation of the rhs. of the - ODE x' = f(x,t). The only requirement for this concept - is that it should be callable with a specific parameter syntax (see below). - A System is typically implemented as a function or a functor. Systems fulfilling - this concept are required by all Runge-Kutta steppers as well as the Bulirsch-Stoer - steppers. However, symplectic and implicit steppers work with other system - concepts, see Symplectic - System and Implicit - System. -

-
- - Notation -
-
-

-
-
System
-

- A type that is a model of System -

-
State
-

- A type representing the state x of the ODE -

-
Deriv
-

- A type representing the derivative x' of the ODE -

-
Time
-

- A type representing the time -

-
sys
-

- An object of type System -

-
x
-

- Object of type State -

-
dxdt
-

- Object of type Deriv -

-
t
-

- Object of type Time -

-
-
-
- - Valid expressions -
-
------ - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Calculate dx/dt := f(x,t) -

-
-

- sys( - x , - dxdt , - t ) -

-
-

- void -

-
-

- Calculates f(x,t), the result is stored into dxdt -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started.html deleted file mode 100644 index 3dbf60ac2..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started.html +++ /dev/null @@ -1,50 +0,0 @@ - - - -Getting started - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
- - - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started/overview.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started/overview.html deleted file mode 100644 index 16dc0f6ff..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started/overview.html +++ /dev/null @@ -1,1168 +0,0 @@ - - - -Overview - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- odeint is a library for solving initial value problems (IVP) of ordinary - differential equations. Mathematically, these problems are formulated as - follows: -

-

- x'(t) = f(x,t), x(0) = x0. -

-

- x and f can be vectors and the - solution is some function x(t) fulfilling both equations - above. In the following we will refer to x'(t) also - dxdt which is also our notation - for the derivative in the source code. -

-

- Ordinary differential equations occur nearly everywhere in natural sciences. - For example, the whole Newtonian mechanics are described by second order - differential equations. Be sure, you will find them in every discipline. - They also occur if partial differential equations (PDEs) are discretized. - Then, a system of coupled ordinary differential occurs, sometimes also referred - as lattices ODEs. -

-

- Numerical approximations for the solution x(t) are calculated - iteratively. The easiest algorithm is the Euler scheme, where starting at - x(0) one finds x(dt) = x(0) + dt f(x(0),0). - Now one can use x(dt) and obtain x(2dt) - in a similar way and so on. The Euler method is of order 1, that means the - error at each step is ~ dt2. This is, of course, not - very satisfying, which is why the Euler method is rarely used for real life - problems and serves just as illustrative example. -

-

- The main focus of odeint is to provide numerical methods implemented in a - way where the algorithm is completely independent on the data structure used - to represent the state x. In doing so, odeint is applicable - for a broad variety of situations and it can be used with many other libraries. - Besides the usual case where the state is defined as a std::vector - or a boost::array, we provide native support for the - following libraries: -

-
-

- In odeint, the following algorithms are implemented: -

-
-

Table 1.1. Stepper Algorithms

-
----------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Algorithm -

-
-

- Class -

-
-

- Concept -

-
-

- System Concept -

-
-

- Order -

-
-

- Error Estimation -

-
-

- Dense Output -

-
-

- Internal state -

-
-

- Remarks -

-
-

- Explicit Euler -

-
-

- euler -

-
-

- Dense - Output Stepper -

-
-

- System -

-
-

- 1 -

-
-

- No -

-
-

- Yes -

-
-

- No -

-
-

- Very simple, only for demonstrating purpose -

-
-

- Modified Midpoint -

-
-

- modified_midpoint -

-
-

- Stepper -

-
-

- System -

-
-

- configurable (2) -

-
-

- No -

-
-

- No -

-
-

- No -

-
-

- Used in Bulirsch-Stoer implementation -

-
-

- Runge-Kutta 4 -

-
-

- runge_kutta4 -

-
-

- Stepper -

-
-

- System -

-
-

- 4 -

-
-

- No -

-
-

- No -

-
-

- No -

-
-

- The classical Runge-Kutta scheme, good general scheme without error - control -

-
-

- Cash-Karp -

-
-

- runge_kutta_cash_karp54 -

-
-

- Error - Stepper -

-
-

- System -

-
-

- 5 -

-
-

- Yes (4) -

-
-

- No -

-
-

- No -

-
-

- Good general scheme with error estimation, to be used in controlled_error_stepper -

-
-

- Dormand-Prince 5 -

-
-

- runge_kutta_dopri5 -

-
-

- Error - Stepper -

-
-

- System -

-
-

- 5 -

-
-

- Yes (4) -

-
-

- Yes -

-
-

- Yes -

-
-

- Standard method with error control and dense output, to be used - in controlled_error_stepper and in dense_output_controlled_explicit_fsal. -

-
-

- Fehlberg 78 -

-
-

- runge_kutta_fehlberg78 -

-
-

- Error - Stepper -

-
-

- System -

-
-

- 8 -

-
-

- Yes (7) -

-
-

- No -

-
-

- No -

-
-

- Good high order method with error estimation, to be used in controlled_error_stepper. -

-
-

- Adams Bashforth -

-
-

- adams_bashforth -

-
-

- Stepper -

-
-

- System -

-
-

- configurable -

-
-

- No -

-
-

- No -

-
-

- Yes -

-
-

- Multistep method -

-
-

- Adams Bashforth Moulton -

-
-

- adams_bashforth_moulton -

-
-

- Stepper -

-
-

- System -

-
-

- configurable -

-
-

- No -

-
-

- No -

-
-

- Yes -

-
-

- Combined multistep method -

-
-

- Controlled Runge-Kutta -

-
-

- controlled_runge_kutta -

-
-

- Controlled - Stepper -

-
-

- System -

-
-

- depends -

-
-

- Yes -

-
-

- No -

-
-

- depends -

-
-

- Error control for Error - Stepper. Requires an Error - Stepper from above. Order depends on the given ErrorStepper -

-
-

- Dense Output Runge-Kutta -

-
-

- dense_output_runge_kutta -

-
-

- Dense - Output Stepper -

-
-

- System -

-
-

- depends -

-
-

- No -

-
-

- Yes -

-
-

- Yes -

-
-

- Dense output for Stepper - and Error - Stepper from above if they provide dense output functionality - (like euler and - runge_kutta_dopri5). - Order depends on the given stepper. -

-
-

- Bulirsch-Stoer -

-
-

- bulirsch_stoer -

-
-

- Controlled - Stepper -

-
-

- System -

-
-

- variable -

-
-

- Yes -

-
-

- No -

-
-

- No -

-
-

- Stepper with step size and order control. Very good if high precision - is required. -

-
-

- Bulirsch-Stoer Dense Output -

-
-

- bulirsch_stoer_dense_out -

-
-

- Dense - Output Stepper -

-
-

- System -

-
-

- variable -

-
-

- Yes -

-
-

- Yes -

-
-

- No -

-
-

- Stepper with step size and order control as well as dense output. - Very good if high precision and dense output is required. -

-
-

- Implicit Euler -

-
-

- implicit_euler -

-
-

- Stepper -

-
-

- Implicit - System -

-
-

- 1 -

-
-

- No -

-
-

- No -

-
-

- No -

-
-

- Basic implicit routine. Requires the Jacobian. Works only with - Boost.uBLAS - vectors as state types. -

-
-

- Rosenbrock 4 -

-
-

- rosenbrock4 -

-
-

- Error - Stepper -

-
-

- Implicit - System -

-
-

- 4 -

-
-

- Yes -

-
-

- Yes -

-
-

- No -

-
-

- Good for stiff systems. Works only with Boost.uBLAS - vectors as state types. -

-
-

- Controlled Rosenbrock 4 -

-
-

- rosenbrock4_controller -

-
-

- Controlled - Stepper -

-
-

- Implicit - System -

-
-

- 4 -

-
-

- Yes -

-
-

- Yes -

-
-

- No -

-
-

- Rosenbrock 4 with error control. Works only with Boost.uBLAS - vectors as state types. -

-
-

- Dense Output Rosenbrock 4 -

-
-

- rosenbrock4_dense_output -

-
-

- Dense - Output Stepper -

-
-

- Implicit - System -

-
-

- 4 -

-
-

- Yes -

-
-

- Yes -

-
-

- No -

-
-

- Controlled Rosenbrock 4 with dense output. Works only with Boost.uBLAS - vectors as state types. -

-
-

- Symplectic Euler -

-
-

- symplectic_euler -

-
-

- Stepper -

-
-

- Symplectic - System Simple - Symplectic System -

-
-

- 1 -

-
-

- No -

-
-

- No -

-
-

- No -

-
-

- Basic symplectic solver for separable Hamiltonian system -

-
-

- Symplectic RKN McLachlan -

-
-

- symplectic_rkn_sb3a_mclachlan -

-
-

- Stepper -

-
-

- Symplectic - System Simple - Symplectic System -

-
-

- 4 -

-
-

- No -

-
-

- No -

-
-

- No -

-
-

- Symplectic solver for separable Hamiltonian system with 6 stages - and order 4. -

-
-

- Symplectic RKN McLachlan -

-
-

- symplectic_rkn_sb3a_m4_mclachlan -

-
-

- Stepper -

-
-

- Symplectic - System Simple - Symplectic System -

-
-

- 4 -

-
-

- No -

-
-

- No -

-
-

- No -

-
-

- Symplectic solver with 5 stages and order 4, can be used with arbitrary - precision types. -

-
-

- Velocity Verlet -

-
-

- velocity_verlet -

-
-

- Stepper -

-
-

- Second - Order System -

-
-

- 1 -

-
-

- No -

-
-

- No -

-
-

- Yes -

-
-

- Velocity verlet method suitable for molecular dynamics simulation. -

-
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started/short_example.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started/short_example.html deleted file mode 100644 index 53021eba6..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started/short_example.html +++ /dev/null @@ -1,207 +0,0 @@ - - - -Short Example - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- Imaging, you want to numerically integrate a harmonic oscillator with friction. - The equations of motion are given by x'' = -x + γ x'. - Odeint only deals with first order ODEs that have no higher derivatives than - x' involved. However, any higher order ODE can be transformed to a system - of first order ODEs by introducing the new variables q=x - and p=x' such that w=(q,p). To - apply numerical integration one first has to design the right hand side of - the equation w' = f(w) = (p,-q+γ p): -

-

-

-
/* The type of container used to hold the state vector */
-typedef std::vector< double > state_type;
-
-const double gam = 0.15;
-
-/* The rhs of x' = f(x) */
-void harmonic_oscillator( const state_type &x , state_type &dxdt , const double /* t */ )
-{
-    dxdt[0] = x[1];
-    dxdt[1] = -x[0] - gam*x[1];
-}
-
-

-

-

- Here we chose vector<double> - as the state type, but others are also possible, for example boost::array<double,2>. odeint is designed in such a way that - you can easily use your own state types. Next, the ODE is defined which is - in this case a simple function calculating f(x). The - parameter signature of this function is crucial: the integration methods - will always call them in the form f(x, - dxdt, - t) - (there are exceptions for some special routines). So, even if there is no - explicit time dependence, one has to define t - as a function parameter. -

-

- Now, we have to define the initial state from which the integration should - start: -

-

-

-
state_type x(2);
-x[0] = 1.0; // start at x=1.0, p=0.0
-x[1] = 0.0;
-
-

-

-

- For the integration itself we'll use the integrate - function, which is a convenient way to get quick results. It is based on - the error-controlled runge_kutta54_cash_karp - stepper (5th order) and uses adaptive step-size. -

-

-

-
size_t steps = integrate( harmonic_oscillator ,
-        x , 0.0 , 10.0 , 0.1 );
-
-

-

-

- The integrate function expects as parameters the rhs of the ode as defined - above, the initial state x, - the start-and end-time of the integration as well as the initial time step=size. - Note, that integrate uses - an adaptive step-size during the integration steps so the time points will - not be equally spaced. The integration returns the number of steps that were - applied and updates x which is set to the approximate solution of the ODE - at the end of integration. -

-

- It is also possible to represent the ode system as a class. The rhs must - then be implemented as a functor - a class with an overloaded function call - operator: -

-

-

-
/* The rhs of x' = f(x) defined as a class */
-class harm_osc {
-
-    double m_gam;
-
-public:
-    harm_osc( double gam ) : m_gam(gam) { }
-
-    void operator() ( const state_type &x , state_type &dxdt , const double /* t */ )
-    {
-        dxdt[0] = x[1];
-        dxdt[1] = -x[0] - m_gam*x[1];
-    }
-};
-
-

-

-

- which can be used via -

-

-

-
harm_osc ho(0.15);
-steps = integrate( ho ,
-        x , 0.0 , 10.0 , 0.1 );
-
-

-

-

- In order to observe the solution during the integration steps all you have - to do is to provide a reasonable observer. An example is -

-

-

-
struct push_back_state_and_time
-{
-    std::vector< state_type >& m_states;
-    std::vector< double >& m_times;
-
-    push_back_state_and_time( std::vector< state_type > &states , std::vector< double > &times )
-    : m_states( states ) , m_times( times ) { }
-
-    void operator()( const state_type &x , double t )
-    {
-        m_states.push_back( x );
-        m_times.push_back( t );
-    }
-};
-
-

-

-

- which stores the intermediate steps in a container. Note, the argument structure - of the ()-operator: odeint calls the observer exactly in this way, providing - the current state and time. Now, you only have to pass this container to - the integration function: -

-

-

-
vector<state_type> x_vec;
-vector<double> times;
-
-steps = integrate( harmonic_oscillator ,
-        x , 0.0 , 10.0 , 0.1 ,
-        push_back_state_and_time( x_vec , times ) );
-
-/* output */
-for( size_t i=0; i<=steps; i++ )
-{
-    cout << times[i] << '\t' << x_vec[i][0] << '\t' << x_vec[i][1] << '\n';
-}
-
-

-

-

- That is all. You can use functional libraries like Boost.Lambda - or Boost.Phoenix - to ease the creation of observer functions. -

-

- The full cpp file for this example can be found here: harmonic_oscillator.cpp -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started/usage__compilation__headers.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started/usage__compilation__headers.html deleted file mode 100644 index 818db97fc..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/getting_started/usage__compilation__headers.html +++ /dev/null @@ -1,95 +0,0 @@ - - - -Usage, Compilation, Headers - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- odeint is a header-only library, no linking against pre-compiled code is - required. It can be included by -

-

-

-
#include <boost/numeric/odeint.hpp>
-
-

-

-

- which includes all headers of the library. All functions and classes from - odeint live in the namespace -

-

-

-
using namespace boost::numeric::odeint;
-
-

-

-

- It is also possible to include only parts of the library. This is the recommended - way since it saves a lot of compilation time. -

-
    -
  • - #include <boost/numeric/odeint/stepper/XYZ.hpp> - - the include path for all steppers, XYZ is a placeholder for a stepper. -
  • -
  • - #include <boost/numeric/odeint/algebra/XYZ.hpp> - - all algebras. -
  • -
  • - #include <boost/numeric/odeint/util/XYZ.hpp> - - the utility functions like is_resizeable, - same_size, or resize. -
  • -
  • - #include <boost/numeric/odeint/integrate/XYZ.hpp> - - the integrate routines. -
  • -
  • - #include <boost/numeric/odeint/iterator/XYZ.hpp> - - the range and iterator functions. -
  • -
  • - #include <boost/numeric/odeint/external/XYZ.hpp> - - any binders to external libraries. -
  • -
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/literature.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/literature.html deleted file mode 100644 index 93c0a2003..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/literature.html +++ /dev/null @@ -1,102 +0,0 @@ - - - -Literature - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- General information about numerical integration of ordinary - differential equations: -

-

- [1] Press William H et al., Numerical Recipes - 3rd Edition: The Art of Scientific Computing, 3rd ed. (Cambridge University - Press, 2007). -

-

- [2] Ernst Hairer, Syvert P. Nørsett, and - Gerhard Wanner, Solving Ordinary Differential Equations I: Nonstiff Problems, - 2nd ed. (Springer, Berlin, 2009). -

-

- [3] Ernst Hairer and Gerhard Wanner, Solving - Ordinary Differential Equations II: Stiff and Differential-Algebraic Problems, - 2nd ed. (Springer, Berlin, 2010). -

-

- Symplectic integration of numerical integration: -

-

- [4] Ernst Hairer, Gerhard - Wanner, and Christian Lubich, Geometric Numerical Integration: Structure-Preserving - Algorithms for Ordinary Differential Equations, 2nd ed. (Springer-Verlag Gmbh, - 2006). -

-

- [5] Leimkuhler - Benedict and Reich Sebastian, Simulating Hamiltonian Dynamics (Cambridge University - Press, 2005). -

-

- Special symplectic methods: -

-

- [6] Haruo Yoshida, - “Construction of higher order symplectic integrators,” Physics Letters - A 150, no. 5 (November 12, 1990): 262-268. -

-

- [7] Robert - I. McLachlan, “On the numerical integration of ordinary differential equations - by symmetric composition methods,” SIAM J. Sci. Comput. 16, no. 1 (1995): - 151-168. -

-

- Special systems: -

-

- [8] Fermi-Pasta-Ulam - nonlinear lattice oscillations -

-

- [9] Arkady Pikovsky, Michael - Rosemblum, and Jürgen Kurths, Synchronization: A Universal Concept in Nonlinear - Sciences. (Cambridge University Press, 2001). -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail.html deleted file mode 100644 index 5b2a803cb..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail.html +++ /dev/null @@ -1,60 +0,0 @@ - - - -odeint in detail - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
- - - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/binding_member_functions.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/binding_member_functions.html deleted file mode 100644 index f2f299131..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/binding_member_functions.html +++ /dev/null @@ -1,130 +0,0 @@ - - - -Binding member functions - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -

- Binding member functions to a function objects suitable for odeint system - function is not easy, at least in C++03. The usual way of using __boost_bind - does not work because of the forwarding problem. odeint provides two do_step method which only differ in the - const specifiers of the arguments and __boost_bind binders only provide the - specializations up to two argument which is not enough for odeint. -

-

- But one can easily implement the according binders themself: -

-

-

-
template< class Obj , class Mem >
-class ode_wrapper
-{
-    Obj m_obj;
-    Mem m_mem;
-
-public:
-
-    ode_wrapper( Obj obj , Mem mem ) : m_obj( obj ) , m_mem( mem ) { }
-
-    template< class State , class Deriv , class Time >
-    void operator()( const State &x , Deriv &dxdt , Time t )
-    {
-        (m_obj.*m_mem)( x , dxdt , t );
-    }
-};
-
-template< class Obj , class Mem >
-ode_wrapper< Obj , Mem > make_ode_wrapper( Obj obj , Mem mem )
-{
-    return ode_wrapper< Obj , Mem >( obj , mem );
-}
-
-

-

-

- One can use this binder as follows -

-

-

-
struct lorenz
-{
-    void ode( const state_type &x , state_type &dxdt , double t ) const
-    {
-        dxdt[0] = 10.0 * ( x[1] - x[0] );
-        dxdt[1] = 28.0 * x[0] - x[1] - x[0] * x[2];
-        dxdt[2] = -8.0 / 3.0 * x[2] + x[0] * x[1];
-    }
-};
-
-int main( int argc , char *argv[] )
-{
-    using namespace boost::numeric::odeint;
-    state_type x = {{ 10.0 , 10.0 , 10.0 }};
-    integrate_const( runge_kutta4< state_type >() , make_ode_wrapper( lorenz() , &lorenz::ode ) ,
-                     x , 0.0 , 10.0 , 0.01 );
-    return 0;
-}
-
-

-

-
- -

- In C++11 one can use std::bind - and one does not need to implement the bind themself: -

-

-

-
namespace pl = std::placeholders;
-
-state_type x = {{ 10.0 , 10.0 , 10.0 }};
-integrate_const( runge_kutta4< state_type >() ,
-                 std::bind( &lorenz::ode , lorenz() , pl::_1 , pl::_2 , pl::_3 ) ,
-                 x , 0.0 , 10.0 , 0.01  );
-
-

-

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/generation_functions.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/generation_functions.html deleted file mode 100644 index 10227d65b..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/generation_functions.html +++ /dev/null @@ -1,323 +0,0 @@ - - - -Generation functions - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- In the Tutorial we have - learned how we can use the generation functions make_controlled - and make_dense_output to - create controlled and dense output stepper from a simple stepper or an error - stepper. The syntax of these two functions is very simple: -

-

-

-
auto stepper1 = make_controlled( 1.0e-6 , 1.0e-6 , stepper_type() );
-// or with max step size limit:
-// auto stepper1 = make_controlled( 1.0e-6 , 1.0e-6 , 0.01, stepper_type() );
-
-auto stepper2 = make_dense_output( 1.0e-6 , 1.0e-6 , stepper_type() );
-
-

-

-

- The first two parameters are the absolute and the relative error tolerances - and the third parameter is the stepper. Additionally, a second version exists - where additionally a maximal step size is supplied which ensures the the - step size is not increased above this value. In C++03 you can infer the type - from the result_of mechanism: -

-

-

-
boost::numeric::odeint::result_of::make_controlled< stepper_type >::type stepper3 = make_controlled( 1.0e-6 , 1.0e-6 , stepper_type() );
-(void)stepper3;
-boost::numeric::odeint::result_of::make_dense_output< stepper_type >::type stepper4 = make_dense_output( 1.0e-6 , 1.0e-6 , stepper_type() );
-(void)stepper4;
-
-

-

-

- To use your own steppers with the make_controlled - or make_dense_output you - need to specialize two class templates. Suppose your steppers are called - custom_stepper, custom_controller and custom_dense_output. - Then, the first class you need to specialize is boost::numeric::get_controller, - a meta function returning the type of the controller: -

-

-

-
namespace boost { namespace numeric { namespace odeint {
-
-template<>
-struct get_controller< custom_stepper >
-{
-    typedef custom_controller type;
-};
-
-} } }
-
-

-

-

- The second one is a factory class boost::numeric::odeint::controller_factory - which constructs the controller from the tolerances and the stepper. In our - dummy implementation this class is -

-

-

-
namespace boost { namespace numeric { namespace odeint {
-
-template<>
-struct controller_factory< custom_stepper , custom_controller >
-{
-    custom_controller operator()( double abs_tol , double rel_tol , const custom_stepper & ) const
-    {
-        return custom_controller();
-    }
-
-    custom_controller operator()( double abs_tol , double rel_tol , double max_dt ,
-                                  const custom_stepper & ) const
-    {
-        // version with maximal allowed step size max_dt
-        return custom_controller();
-    }
-};
-
-} } }
-
-

-

-

- This is all to use the make_controlled - mechanism. Now you can use your controller via -

-

-

-
auto stepper5 = make_controlled( 1.0e-6 , 1.0e-6 , custom_stepper() );
-
-

-

-

- For the dense_output_stepper everything works similar. Here you have to specialize - boost::numeric::odeint::get_dense_output and boost::numeric::odeint::dense_output_factory. - These two classes have the same syntax as their relatives get_controller - and controller_factory. -

-

- All controllers and dense-output steppers in odeint can be used with these - mechanisms. In the table below you will find, which steppers is constructed - from make_controlled or - make_dense_output if applied - on a stepper from odeint: -

-
-

Table 1.7. Generation functions make_controlled( abs_error , rel_error , stepper - )

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Stepper -

-
-

- Result of make_controlled -

-
-

- Remarks -

-
-

- runge_kutta_cash_karp54 -

-
-

- controlled_runge_kutta< runge_kutta_cash_karp54 - , default_error_checker<...> > -

-
-

- ax=1, adxdt=1 -

-
-

- runge_kutta_fehlberg78 -

-
-

- controlled_runge_kutta< runge_kutta_fehlberg78 - , default_error_checker<...> > -

-
-

- ax=1, adxdt=1 -

-
-

- runge_kutta_dopri5 -

-
-

- controlled_runge_kutta< runge_kutta_dopri5 - , default_error_checker<...> > -

-
-

- a x=1, adxdt=1 -

-
-

- rosenbrock4 -

-
-

- rosenbrock4_controlled< rosenbrock4 - > -

-
-

- - -

-
-
-
-

Table 1.8. Generation functions make_dense_output( abs_error , rel_error , stepper - )

-
----- - - - - - - - - - - - - - - - - - -
-

- Stepper -

-
-

- Result of make_dense_output -

-
-

- Remarks -

-
-

- runge_kutta_dopri5 -

-
-

- dense_output_runge_kutta< controlled_runge_kutta< runge_kutta_dopri5 - , default_error_checker<...> > - > -

-
-

- a x=1, adxdt=1 -

-
-

- rosenbrock4 -

-
-

- rosenbrock4_dense_output< rosenbrock4_controller< rosenbrock4 - > > -

-
-

- - -

-
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/integrate_functions.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/integrate_functions.html deleted file mode 100644 index 7bbf96de8..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/integrate_functions.html +++ /dev/null @@ -1,409 +0,0 @@ - - - -Integrate functions - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- Integrate functions perform the time evolution of a given ODE from some starting - time t0 to a given end time t1 - and starting at state x0 by subsequent calls of a given - stepper's do_step function. - Additionally, the user can provide an __observer to analyze the state during - time evolution, and a max_step_checker to throw an - exception if too many steps are taken between observer calls (i.e. too small - step size). There are five different integrate functions which have different - strategies on when to call the observer function during integration. All - of the integrate functions except integrate_n_steps - can be called with any stepper following one of the stepper concepts: Stepper , Error - Stepper , Controlled - Stepper , Dense - Output Stepper. Depending on the abilities of the stepper, the integrate - functions make use of step-size control or dense output. -

-
- - Equidistant - observer calls -
-

- If observer calls at equidistant time intervals dt are - needed, the integrate_const - or integrate_n_steps function - should be used. We start with explaining integrate_const: -

-

- integrate_const( - stepper , - system , - x0 , - t0 , - t1 , - dt ) -

-

- integrate_const( - stepper , - system , - x0 , - t0 , - t1 , - dt , - observer ) -

-

- integrate_const( - stepper , - system , - x0 , - t0 , - t1 , - dt , - observer , - max_step_checker ) -

-

- These integrate the ODE given by system - with subsequent steps from stepper. - Integration start at t0 and - x0 and ends at some t' - = t0 + n dt with n such that t1 - - dt < t' <= t1. x0 - is changed to the approximative solution x(t') at the - end of integration. If provided, the observer - is invoked at times t0, t0 + dt, - t0 + 2dt, ... ,t'. If provided, - the max_step_checker counts - the number of steps between observer calls and throws a no_progress_error - this exceeds some limit (default: 500). integrate_const - returns the number of steps performed during the integration. Note that if - you are using a simple Stepper - or Error Stepper - and want to make exactly n - steps you should prefer the integrate_n_steps - function below. -

-
    -
  • - If stepper is a Stepper or Error Stepper - then dt is also the step - size used for integration and the observer is called just after every - step. -
  • -
  • - If stepper is a Controlled - Stepper then dt - is the initial step size. The actual step size will change due to error - control during time evolution. However, if an observer is provided the - step size will be adjusted such that the algorithm always calculates - x(t) at t = t0 + n dt and calls - the observer at that point. Note that the use of Controlled - Stepper is reasonable here only if dt - is considerably larger than typical step sizes used by the stepper. -
  • -
  • - If stepper is a Dense Output - Stepper then dt - is the initial step size. The actual step size will be adjusted during - integration due to error control. If an observer is provided dense output - is used to calculate x(t) at t = t0 + n - dt. -
  • -
-
- - Integrate - a given number of steps -
-

- This function is very similar to integrate_const - above. The only difference is that it does not take the end time as parameter, - but rather the number of steps. The integration is then performed until the - time t0+n*dt. -

-

- integrate_n_steps( - stepper , - system , - x0 , - t0 , - dt , - n ) -

-

- integrate_n_steps( - stepper , - system , - x0 , - t0 , - dt , - n , observer ) -

-

- integrate_n_steps( - stepper , - system , - x0 , - t0 , - dt , - n , observer , max_step_checker ) -

-

- Integrates the ODE given by system - with subsequent steps from stepper - starting at x0 and t0. If provided, - observer is called after - every step and at the beginning with t0, - similar as above. Again, providing a max_step_checker - will throw a no_progress_error - if too many steps are performed between observer calls. The approximate result - for x( t0 + n dt ) is stored in x0. - This function returns the end time t0 - + n*dt. -

-
- - Observer - calls at each step -
-

- If the observer should be called at each time step then the integrate_adaptive function should be used. - Note that in the case of Controlled - Stepper or Dense - Output Stepper this leads to non-equidistant observer calls as the - step size changes. -

-

- integrate_adaptive( - stepper , - system , - x0 , - t0 , - t1 , - dt ) -

-

- integrate_adaptive( - stepper , - system , - x0 , - t0 , - t1 , - dt , - observer ) -

-

- Integrates the ODE given by system - with subsequent steps from stepper. - Integration start at t0 and - x0 and ends at t1. - x0 is changed to the approximative - solution x(t1) at the end of integration. If provided, - the observer is called after - each step (and before the first step at t0). - integrate_adaptive returns - the number of steps performed during the integration. -

-
- - - - - -
[Note]Note

- integrate_adaptive by design - performs an observer call after each time step. Hence there is no need - for a max_step_checker as only - exactly one step is ever performed between observer calls. -

-
    -
  • - If stepper is a Stepper or Error Stepper - then dt is the step size - used for integration and integrate_adaptive - behaves like integrate_const - except that for the last step the step size is reduced to ensure we end - exactly at t1. If provided, - the observer is called at each step. -
  • -
  • - If stepper is a Controlled - Stepper then dt - is the initial step size. The actual step size is changed according to - error control of the stepper. For the last step, the step size will be - reduced to ensure we end exactly at t1. - If provided, the observer is called after each time step (and before - the first step at t0). -
  • -
  • - If stepper is a Dense - Output Stepper then dt - is the initial step size and integrate_adaptive - behaves just like for Controlled - Stepper above. No dense output is used. -
  • -
-
- - Observer - calls at given time points -
-

- If the observer should be called at some user given time points the integrate_times function should be used. - The times for observer calls are provided as a sequence of time values. The - sequence is either defined via two iterators pointing to begin and end of - the sequence or in terms of a Boost.Range - object. -

-

- integrate_times( - stepper , - system , - x0 , - times_start , - times_end , - dt , - observer ) -

-

- integrate_times( - stepper , - system , - x0 , - time_range , - dt , - observer ) -

-

- Integrates the ODE given by system - with subsequent steps from stepper. - Integration starts at *times_start - and ends exactly at *(times_end-1). - x0 contains the approximate - solution at the end point of integration. This function requires an observer - which is invoked at the subsequent times *times_start++ - until times_start == - times_end. If called with a Boost.Range - time_range the function behaves - the same with times_start = boost::begin( time_range - ) and times_end - = boost::end( - time_range ). - Additionally, a max_step_checker can be provided, - e.g.: -

-

- integrate_times( - stepper , - system , - x0 , - times_start , - times_end , - dt , - observer , - max_step_checker) -

-

- As above, this will throw a no_progress_error - if too many steps are performed between observer calls. -

-

- integrate_times returns the - number of steps performed during the integration. -

-
    -
  • - If stepper is a Stepper or Error Stepper - dt is the step size used - for integration. However, whenever a time point from the sequence is - approached the step size dt - will be reduced to obtain the state x(t) exactly - at the time point. -
  • -
  • - If stepper is a Controlled - Stepper then dt - is the initial step size. The actual step size is adjusted during integration - according to error control. However, if a time point from the sequence - is approached the step size is reduced to obtain the state x(t) - exactly at the time point. -
  • -
  • - If stepper is a Dense Output - Stepper then dt - is the initial step size. The actual step size is adjusted during integration - according to error control. Dense output is used to obtain the states - x(t) at the time points from the sequence. -
  • -
-
- - Convenience - integrate function -
-

- Additionally to the sophisticated integrate function above odeint also provides - a simple integrate routine - which uses a dense output stepper based on runge_kutta_dopri5 - with standard error bounds 10-6 for the steps. -

-

- integrate( - system , - x0 , - t0 , - t1 , - dt ) -

-

- integrate( - system , - x0 , - t0 , - t1 , - dt , - observer ) -

-

- This function behaves exactly like integrate_adaptive - above but no stepper has to be provided. It also returns the number of steps - performed during the integration. -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/iterators_and_ranges.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/iterators_and_ranges.html deleted file mode 100644 index 514b361e4..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/iterators_and_ranges.html +++ /dev/null @@ -1,662 +0,0 @@ - - - -Iterators and Ranges - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
- -

- odeint supports iterators that iterate along an approximate solution of - an ordinary differential equation. Iterators offer you an alternative to - the integrate functions. Furthermore, many of the standard algorithms in - the C++ standard library and Boost.Range can be used with the odeint's - iterators. -

-

- Several iterator types are provided, in consistence with the integrate - functions. Hence there are const_step_iterator, - adaptive_step_iterator, - n_step_iterator and times_iterator -- each of them in two - versions: either with only the state - or with a std::pair<state,time> - as value type. They are all single pass iterators. In the following, we - show a few examples of how to use those iterators together with std algorithms. -

-

-

-
runge_kutta4< state_type > stepper;
-state_type x = {{ 10.0 , 10.0 , 10.0 }};
-double res = std::accumulate( make_const_step_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) ,
-                              make_const_step_iterator_end( stepper , lorenz() , x ) ,
-                              0.0 ,
-                              []( double sum , const state_type &x ) {
-                                  return sum + x[0]; } );
-cout << res << endl;
-
-

-

-

- In this example all x-values of the solution are accumulated. Note, how - dereferencing the iterator gives the current state x - of the ODE (the second argument of the accumulate lambda). The iterator - itself does not occur directly in this example but it is generated by the - factory functions make_const_step_iterator_begin - and make_const_step_iterator_end. - odeint also supports Boost.Range, that allows to write the above example - in a more compact form with the factory function make_const_step_range, - but now using boost::accumulate from __bost_range: -

-

-

-
runge_kutta4< state_type > stepper;
-state_type x = {{ 10.0 , 10.0 , 10.0 }};
-double res = boost::accumulate( make_const_step_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , 0.0 ,
-                                []( double sum , const state_type &x ) {
-                                    return sum + x[0]; } );
-cout << res << endl;
-
-

-

-

- The second iterator type is also a iterator with const step size. But the - value type of this iterator consists here of a pair of the time and the - state of the solution of the ODE. An example is -

-

-

-
runge_kutta4< state_type > stepper;
-state_type x = {{ 10.0 , 10.0 , 10.0 }};
-double res = boost::accumulate( make_const_step_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , 0.0 ,
-                                []( double sum , const std::pair< const state_type &, double > &x ) {
-                                    return sum + x.first[0]; } );
-cout << res << endl;
-
-

-

-

- The factory functions are now make_const_step_time_iterator_begin, - make_const_step_time_iterator_end - and make_const_step_time_range. - Note, how the lambda now expects a std::pair - as this is the value type of the const_step_time_iterator's. -

-

- Next, we discuss the adaptive iterators which are completely analogous - to the const step iterators, but are based on adaptive stepper routines - and thus adjust the step size during the iteration. Examples are -

-

-

-
auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() );
-state_type x = {{ 10.0 , 10.0 , 10.0 }};
-double res = boost::accumulate( make_adaptive_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , 0.0 ,
-                                []( double sum , const state_type& x ) {
-                                    return sum + x[0]; } );
-cout << res << endl;
-
-

-

-

-

-
auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() );
-state_type x = {{ 10.0 , 10.0 , 10.0 }};
-double res = boost::accumulate( make_adaptive_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , 0.0 ,
-                                []( double sum , const pair< const state_type& , double > &x ) {
-                                    return sum + x.first[0]; } );
-cout << res << endl;
-
-

-

-
- - - - - -
[Note]Note

- 'adaptive_iterator and adaptive_time_iterator' - can only be used with Controlled - Stepper or Dense - Output Stepper. -

-

- In general one can say that iterating over a range of a const_step_iterator - behaves like an integrate_const - function call, and similarly for adaptive_iterator - and integrate_adaptive, - n_step_iterator and integrate_n_steps, and finally times_iterator and integrate_times. -

-

- Below we list the most important properties of the exisiting iterators: -

-
-
- -
    -
  • - Definition: const_step_iterator< Stepper - , System - , State - > -
  • -
  • - value_type is State -
  • -
  • - reference_type is - State const& -
  • -
  • - Factory functions -
      -
    • - make_const_step_iterator_begin( stepper - , system - , state - , t_start - , t_end - , dt - ) -
    • -
    • - make_const_step_iterator_end( stepper - , system - , state - ) -
    • -
    • - make_const_step_range( stepper - , system - , state - , t_start - , t_end - , dt - ) -
    • -
    -
  • -
  • - This stepper works with all steppers fulfilling the Stepper concept - or the DenseOutputStepper concept. -
  • -
  • - The value of state - is the current state of the ODE during the iteration. -
  • -
-
-
- -
    -
  • - Definition: const_step_time_iterator< Stepper - , System - , State - > -
  • -
  • - value_type is std::pair< - State , - Stepper::time_type > -
  • -
  • - reference_type is - std::pair< - State const& , Stepper::time_type > - const& -
  • -
  • - Factory functions -
      -
    • - make_const_step_time_iterator_begin( stepper - , system - , state - , t_start - , t_end - , dt - ) -
    • -
    • - make_const_step_time_iterator_end( stepper - , system - , state - ) -
    • -
    • - make_const_step_time_range( stepper - , system - , state - , t_start - , t_end - , dt - ) -
    • -
    -
  • -
  • - This stepper works with all steppers fulfilling the Stepper concept - or the DenseOutputStepper concept. -
  • -
  • - This stepper updates the value of state. - The value of state - is the current state of the ODE during the iteration. -
  • -
-
-
- -
    -
  • - Definition: adaptive_iterator< Stepper - , System - , State - > -
  • -
  • - value_type is State -
  • -
  • - reference_type is - State const& -
  • -
  • - Factory functions -
      -
    • - make_adaptive_iterator_begin( stepper - , system - , state - , t_start - , t_end - , dt - ) -
    • -
    • - make_adaptive_iterator_end( stepper - , system - , state - ) -
    • -
    • - make_adaptive_range( stepper - , system - , state - , t_start - , t_end - , dt - ) -
    • -
    -
  • -
  • - This stepper works with all steppers fulfilling the ControlledStepper - concept or the DenseOutputStepper concept. -
  • -
  • - For steppers fulfilling the ControlledStepper concept state is modified according to the - current state of the ODE. For DenseOutputStepper the state is not modified - due to performance optimizations, but the steppers itself. -
  • -
-
-
- -
    -
  • - Definition: adaptive_iterator< Stepper - , System - , State - > -
  • -
  • - value_type is std::pair< - State , - Stepper::time_type > -
  • -
  • - reference_type is - std::pair< - State const& , Stepper::time_type > - const& -
  • -
  • - Factory functions -
      -
    • - make_adaptive_time_iterator_begin( stepper - , system - , state - , t_start - , t_end - , dt - ) -
    • -
    • - make_adaptive_time_iterator_end( stepper - , system - , state - ) -
    • -
    • - make_adaptive_time_range( stepper - , system - , state - , t_start - , t_end - , dt - ) -
    • -
    -
  • -
  • - This stepper works with all steppers fulfilling the ControlledStepper - concept or the DenseOutputStepper concept. -
  • -
  • - For steppers fulfilling the ControlledStepper concept state is modified according to the - current state of the ODE. For DenseOutputStepper the state is not modified - due to performance optimizations, but the stepper itself. -
  • -
-
-
- -
    -
  • - Definition: n_step_iterator< Stepper - , System - , State - > -
  • -
  • - value_type is State -
  • -
  • - reference_type is - State const& -
  • -
  • - Factory functions -
      -
    • - make_n_step_iterator_begin( stepper - , system - , state - , t_start - , dt - , num_of_steps - ) -
    • -
    • - make_n_step_iterator_end( stepper - , system - , state - ) -
    • -
    • - make_n_step_range( stepper - , system - , state - , t_start - , dt - , num_of_steps - ) -
    • -
    -
  • -
  • - This stepper works with all steppers fulfilling the Stepper concept - or the DenseOutputStepper concept. -
  • -
  • - The value of state - is the current state of the ODE during the iteration. -
  • -
-
-
- -
    -
  • - Definition: n_step_time_iterator< Stepper - , System - , State - > -
  • -
  • - value_type is std::pair< - State , - Stepper::time_type > -
  • -
  • - reference_type is - std::pair< - State const& , Stepper::time_type > - const& -
  • -
  • - Factory functions -
      -
    • - make_n_step_time_iterator_begin( stepper - , system - , state - , t_start - , dt - , num_of_steps - ) -
    • -
    • - make_n_step_time_iterator_end( stepper - , system - , state - ) -
    • -
    • - make_n_step_time_range( stepper - , system - , state - , t_start - , dt - , num_of_steps - ) -
    • -
    -
  • -
  • - This stepper works with all steppers fulfilling the Stepper concept - or the DenseOutputStepper concept. -
  • -
  • - This stepper updates the value of state. - The value of state - is the current state of the ODE during the iteration. -
  • -
-
-
- -
    -
  • - Definition: times_iterator< Stepper - , System - , State - , TimeIterator - > -
  • -
  • - value_type is State -
  • -
  • - reference_type is - State const& -
  • -
  • - Factory functions -
      -
    • - make_times_iterator_begin( stepper - , system - , state - , t_start - , t_end - , dt - ) -
    • -
    • - make_times_iterator_end( stepper - , system - , state - ) -
    • -
    • - make_times_range( stepper - , system - , state - , t_start - , t_end - , dt - ) -
    • -
    -
  • -
  • - This stepper works with all steppers fulfilling the Stepper concept, - the ControlledStepper concept or the DenseOutputStepper concept. -
  • -
  • - The value of state - is the current state of the ODE during the iteration. -
  • -
-
-
- -
    -
  • - Definition: times_time_iterator< Stepper - , System - , State - , TimeIterator> -
  • -
  • - value_type is std::pair< - State , - Stepper::time_type > -
  • -
  • - reference_type is - std::pair< - State const& , Stepper::time_type > - const& -
  • -
  • - Factory functions -
      -
    • - make_times_time_iterator_begin( stepper - , system - , state - , t_start - , t_end - , dt - ) -
    • -
    • - make_times_time_step_iterator_end( stepper - , system - , state - ) -
    • -
    • - make_times_time_range( stepper - , system - , state - , t_start - , t_end - , dt - ) -
    • -
    -
  • -
  • - This stepper works with all steppers fulfilling the Stepper concept, - the ControlledStepper concept or the DenseOutputStepper concept. -
  • -
  • - This stepper updates the value of state. - The value of state - is the current state of the ODE during the iteration. -
  • -
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/state_types__algebras_and_operations.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/state_types__algebras_and_operations.html deleted file mode 100644 index b70f3a8c4..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/state_types__algebras_and_operations.html +++ /dev/null @@ -1,1293 +0,0 @@ - - - -State types, algebras and operations - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -

- In odeint the stepper algorithms are implemented independently of the underlying - fundamental mathematical operations. This is realized by giving the user - full control over the state type and the mathematical operations for this - state type. Technically, this is done by introducing three concepts: StateType, - Algebra, Operations. Most of the steppers in odeint expect three class types - fulfilling these concepts as template parameters. Note that these concepts - are not fully independent of each other but rather a valid combination must - be provided in order to make the steppers work. In the following we will - give some examples on reasonable state_type-algebra-operations combinations. - For the most common state types, like vector<double> or array<double,N> - the default values range_algebra and default_operations are perfectly fine - and odeint can be used as is without worrying about algebra/operations at - all. -

-
- - - - - -
[Important]Important

- state_type, algebra and operations are not independent, a valid combination - must be provided to make odeint work properly -

-

- Moreover, as odeint handles the memory required for intermediate temporary - objects itself, it also needs knowledge about how to create state_type objects - and maybe how to allocate memory (resizing). All in all, the following things - have to be taken care of when odeint is used with non-standard state types: -

-
    -
  • - construction/destruction -
  • -
  • - resizing (if possible/required) -
  • -
  • - algebraic operations -
  • -
-

- Again, odeint already provides basic interfaces for most of the usual state - types. So if you use a std::vector, - or a boost::array as state type no additional work - is required, they just work out of the box. -

-
- - -

- We distinguish between two basic state types: fixed sized and dynamically - sized. For fixed size state types the default constructor state_type() - already allocates the required memory, prominent example is boost::array<T,N>. Dynamically sized types have to be - resized to make sure enough memory is allocated, the standard constructor - does not take care of the resizing. Examples for this are the STL containers - like vector<double>. -

-

- The most easy way of getting your own state type to work with odeint is - to use a fixed size state, base calculations on the range_algebra and provide - the following functionality: -

-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Construct State -

-
-

- State x() -

-
-

- void -

-
-

- Creates an instance of State - and allocates memory. -

-
-

- Begin of the sequence -

-
-

- boost::begin(x) -

-
-

- Iterator -

-
-

- Returns an iterator pointing to the begin of the sequence -

-
-

- End of the sequence -

-
-

- boost::end(x) -

-
-

- Iterator -

-
-

- Returns an iterator pointing to the end of the sequence -

-
-
- - - - - -
[Warning]Warning

- If your state type does not allocate memory by default construction, - you must define it as resizeable and - provide resize functionality (see below). Otherwise segmentation faults - will occur. -

-

- So fixed sized arrays supported by Boost.Range - immediately work with odeint. For dynamically sized arrays one has to additionally - supply the resize functionality. First, the state has to be tagged as resizeable - by specializing the struct is_resizeable - which consists of one typedef and one bool value: -

-
------ - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Resizability -

-
-

- is_resizeable<State>::type -

-
-

- boost::true_type or boost::false_type -

-
-

- Determines resizeability of the state type, returns boost::true_type if the state is resizeable. -

-
-

- Resizability -

-
-

- is_resizeable<State>::value -

-
-

- bool -

-
-

- Same as above, but with bool - value. -

-
-

- Defining type to be true_type and value - as true tells odeint that - your state is resizeable. By default, odeint now expects the support of - boost::size(x) and - a x.resize( boost::size(y) ) - member function for resizing: -

-
------ - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Get size -

-
-

- boost::size( - x ) -

-
-

- size_type -

-
-

- Returns the current size of x. -

-
-

- Resize -

-
-

- x.resize( - boost::size( - y ) - ) -

-
-

- void -

-
-

- Resizes x to have the same size as y. -

-
-
- -

- As a first example we take the most simple case and implement our own - vector my_vector which - will provide a container interface. This makes Boost.Range - working out-of-box. We add a little functionality to our vector which - makes it allocate some default capacity by construction. This is helpful - when using resizing as then a resize can be assured to not require a - new allocation. -

-

-

-
template< size_t MAX_N >
-class my_vector
-{
-    typedef std::vector< double > vector;
-
-public:
-    typedef vector::iterator iterator;
-    typedef vector::const_iterator const_iterator;
-
-public:
-    my_vector( const size_t N )
-        : m_v( N )
-    {
-        m_v.reserve( MAX_N );
-    }
-
-    my_vector()
-        : m_v()
-    {
-        m_v.reserve( MAX_N );
-    }
-
-// ... [ implement container interface ]
-
-

-

-

- The only thing that has to be done other than defining is thus declaring - my_vector as resizeable: -

-

-

-
// define my_vector as resizeable
-
-namespace boost { namespace numeric { namespace odeint {
-
-template<size_t N>
-struct is_resizeable< my_vector<N> >
-{
-    typedef boost::true_type type;
-    static const bool value = type::value;
-};
-
-} } }
-
-

-

-

- If we wouldn't specialize the is_resizeable - template, the code would still compile but odeint would not adjust the - size of temporary internal instances of my_vector and hence try to fill - zero-sized vectors resulting in segmentation faults! The full example - can be found in my_vector.cpp -

-
-
- -

- If your state type does work with Boost.Range, - but handles resizing differently you are required to specialize two implementations - used by odeint to check a state's size and to resize: -

-
------ - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Check size -

-
-

- same_size_impl<State,State>::same_size(x - , y) -

-
-

- bool -

-
-

- Returns true if the size of x equals the size of y. -

-
-

- Resize -

-
-

- resize_impl<State,State>::resize(x - , y) -

-
-

- void -

-
-

- Resizes x to have the same size as y. -

-
-

- As an example we will use a std::list - as state type in odeint. Because std::list - is not supported by boost::size - we have to replace the same_size and resize implementation to get list - to work with odeint. The following code shows the required template specializations: -

-

-

-
typedef std::list< double > state_type;
-
-namespace boost { namespace numeric { namespace odeint {
-
-template< >
-struct is_resizeable< state_type >
-{ // declare resizeability
-    typedef boost::true_type type;
-    const static bool value = type::value;
-};
-
-template< >
-struct same_size_impl< state_type , state_type >
-{ // define how to check size
-    static bool same_size( const state_type &v1 ,
-                           const state_type &v2 )
-    {
-        return v1.size() == v2.size();
-    }
-};
-
-template< >
-struct resize_impl< state_type , state_type >
-{ // define how to resize
-    static void resize( state_type &v1 ,
-                        const state_type &v2 )
-    {
-        v1.resize( v2.size() );
-    }
-};
-
-} } }
-
-

-

-

- With these definitions odeint knows how to resize std::lists - and so they can be used as state types. A complete example can be found - in list_lattice.cpp. -

-
-
-
- - -

- To provide maximum flexibility odeint is implemented in a highly modularized - way. This means it is possible to change the underlying mathematical operations - without touching the integration algorithms. The fundamental mathematical - operations are those of a vector space, that is addition of state_types and multiplication of state_types with a scalar (time_type). In odeint this is realized - in two concepts: Algebra and Operations. The standard way how this works - is by the range algebra which provides functions that apply a specific - operation to each of the individual elements of a container based on the - Boost.Range - library. If your state type is not supported by Boost.Range - there are several possibilities to tell odeint how to do algebraic operations: -

-
    -
  • - Implement boost::begin and boost::end - for your state type so it works with Boost.Range. -
  • -
  • - Implement vector-vector addition operator + - and scalar-vector multiplication operator * - and use the non-standard vector_space_algebra. -
  • -
  • - Implement your own algebra that implements the required functions. -
  • -
-
- -

- In the following example we will try to use the gsl_vector - type from GSL (GNU Scientific - Library) as state type in odeint. We will realize this by implementing - a wrapper around the gsl_vector that takes care of construction/destruction. - Also, Boost.Range - is extended such that it works with gsl_vectors - as well which required also the implementation of a new gsl_iterator. -

-
- - - - - -
[Note]Note

- odeint already includes all the code presented here, see gsl_wrapper.hpp, - so gsl_vectors can - be used straight out-of-box. The following description is just for - educational purpose. -

-

- The GSL is a C library, so gsl_vector - has neither constructor, nor destructor or any begin - or end function, no iterators - at all. So to make it work with odeint plenty of things have to be implemented. - Note that all of the work shown here is already included in odeint, so - using gsl_vectors in - odeint doesn't require any further adjustments. We present it here just - as an educational example. We start with defining appropriate constructors - and destructors. This is done by specializing the state_wrapper - for gsl_vector. State - wrappers are used by the steppers internally to create and manage temporary - instances of state types: -

-

-

-
template<>
-struct state_wrapper< gsl_vector* >
-{
-    typedef double value_type;
-    typedef gsl_vector* state_type;
-    typedef state_wrapper< gsl_vector* > state_wrapper_type;
-
-    state_type m_v;
-
-    state_wrapper( )
-    {
-        m_v = gsl_vector_alloc( 1 );
-    }
-
-    state_wrapper( const state_wrapper_type &x )
-    {
-        resize( m_v , x.m_v );
-        gsl_vector_memcpy( m_v , x.m_v );
-    }
-
-
-    ~state_wrapper()
-    {
-        gsl_vector_free( m_v );
-    }
-
-};
-
-

-

-

- This state_wrapper specialization - tells odeint how gsl_vectors are created, copied and destroyed. Next - we need resizing, this is required because gsl_vectors are dynamically - sized objects: -

-
template<>
-struct is_resizeable< gsl_vector* >
-{
-    typedef boost::true_type type;
-    const static bool value = type::value;
-};
-
-template <>
-struct same_size_impl< gsl_vector* , gsl_vector* >
-{
-    static bool same_size( const gsl_vector* x , const gsl_vector* y )
-    {
-        return x->size == y->size;
-    }
-};
-
-template <>
-struct resize_impl< gsl_vector* , gsl_vector* >
-{
-    static void resize( gsl_vector* x , const gsl_vector* y )
-    {
-        gsl_vector_free( x );
-        x = gsl_vector_alloc( y->size );
-    }
-};
-
-

-

-

- Up to now, we defined creation/destruction and resizing, but gsl_vectors - also don't support iterators, so we first implement a gsl iterator: -

-

-

-
/*
- * defines an iterator for gsl_vector
- */
-class gsl_vector_iterator
-      : public boost::iterator_facade< gsl_vector_iterator , double ,
-                                       boost::random_access_traversal_tag >
-{
-public :
-
-    gsl_vector_iterator( void ): m_p(0) , m_stride( 0 ) { }
-    explicit gsl_vector_iterator( gsl_vector *p ) : m_p( p->data ) , m_stride( p->stride ) { }
-    friend gsl_vector_iterator end_iterator( gsl_vector * );
-
-private :
-
-    friend class boost::iterator_core_access;
-    friend class const_gsl_vector_iterator;
-
-    void increment( void ) { m_p += m_stride; }
-    void decrement( void ) { m_p -= m_stride; }
-    void advance( ptrdiff_t n ) { m_p += n*m_stride; }
-    bool equal( const gsl_vector_iterator &other ) const { return this->m_p == other.m_p; }
-    bool equal( const const_gsl_vector_iterator &other ) const;
-    double& dereference( void ) const { return *m_p; }
-
-    double *m_p;
-    size_t m_stride;
-};
-
-

- A similar class exists for the const - version of the iterator. Then we have a function returning the end iterator - (similarly for const again): -

-
gsl_vector_iterator end_iterator( gsl_vector *x )
-{
-    gsl_vector_iterator iter( x );
-    iter.m_p += iter.m_stride * x->size;
-    return iter;
-}
-
-

-

-

- Finally, the bindings for Boost.Range - are added: -

-
// template<>
-inline gsl_vector_iterator range_begin( gsl_vector *x )
-{
-    return gsl_vector_iterator( x );
-}
-
-// template<>
-inline gsl_vector_iterator range_end( gsl_vector *x )
-{
-    return end_iterator( x );
-}
-
-

- Again with similar definitions for the const - versions. This eventually makes odeint work with gsl vectors as state - types. The full code for these bindings is found in gsl_wrapper.hpp. - It might look rather complicated but keep in mind that gsl is a pre-compiled - C library. -

-
-
- -

- As seen above, the standard way of performing algebraic operations on - container-like state types in odeint is to iterate through the elements - of the container and perform the operations element-wise on the underlying - value type. This is realized by means of the range_algebra - that uses Boost.Range - for obtaining iterators of the state types. However, there are other - ways to implement the algebraic operations on containers, one of which - is defining the addition/multiplication operators for the containers - directly and then using the vector_space_algebra. - If you use this algebra, the following operators have to be defined for - the state_type: -

-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Addition -

-
-

- x + - y -

-
-

- state_type -

-
-

- Calculates the vector sum 'x+y'. -

-
-

- Assign addition -

-
-

- x += - y -

-
-

- state_type -

-
-

- Performs x+y in place. -

-
-

- Scalar multiplication -

-
-

- a * - x -

-
-

- state_type -

-
-

- Performs multiplication of vector x with scalar a. -

-
-

- Assign scalar multiplication -

-
-

- x *= - a -

-
-

- state_type -

-
-

- Performs in-place multiplication of vector x with scalar a. -

-
-

- Defining these operators makes your state type work with any basic Runge-Kutta - stepper. However, if you want to use step-size control, some more functionality - is required. Specifically, operations like maxi( |erri| / (alpha - * |si|) ) have to be performed. err and - s are state_types, alpha is a scalar. As you can - see, we need element wise absolute value and division as well as an reduce - operation to get the maximum value. So for controlled steppers the following - things have to be implemented: -

-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Division -

-
-

- x / - y -

-
-

- state_type -

-
-

- Calculates the element-wise division 'x/y' -

-
-

- Absolute value -

-
-

- abs( - x ) -

-
-

- state_type -

-
-

- Element wise absolute value -

-
-

- Reduce -

-
-

- vector_space_reduce_impl< state_type - >::reduce( state - , operation - , init - ) -

-
-

- value_type -

-
-

- Performs the operation - for subsequently each element of state - and returns the aggregate value. E.g. -

-

- init = - operator( - init , - state[0] - ); -

-

- init = - operator( - init , - state[1] - ) -

-

- ... -

-
-
-
- -

- Here we show how to implement the required operators on a state type. - As example we define a new class point3D - representing a three-dimensional vector with components x,y,z and define - addition and scalar multiplication operators for it. We use Boost.Operators - to reduce the amount of code to be written. The class for the point type - looks as follows: -

-

-

-
class point3D :
-    boost::additive1< point3D ,
-    boost::additive2< point3D , double ,
-    boost::multiplicative2< point3D , double > > >
-{
-public:
-
-    double x , y , z;
-
-    point3D()
-        : x( 0.0 ) , y( 0.0 ) , z( 0.0 )
-    { }
-
-    point3D( const double val )
-        : x( val ) , y( val ) , z( val )
-    { }
-
-    point3D( const double _x , const double _y , const double _z  )
-        : x( _x ) , y( _y ) , z( _z )
-    { }
-
-    point3D& operator+=( const point3D &p )
-    {
-        x += p.x; y += p.y; z += p.z;
-        return *this;
-    }
-
-    point3D& operator*=( const double a )
-    {
-        x *= a; y *= a; z *= a;
-        return *this;
-    }
-
-};
-
-

-

-

- By deriving from Boost.Operators - classes we don't have to define outer class operators like operator+( point3D , - point3D ) - because that is taken care of by the operators library. Note that for - simple Runge-Kutta schemes (like runge_kutta4) - only the + and * operators are required. If, however, - a controlled stepper is used one also needs to specify the division operator - / because calculation of - the error term involves an element wise division of the state types. - Additionally, controlled steppers require an abs - function calculating the element-wise absolute value for the state type: -

-

-

-
// only required for steppers with error control
-point3D operator/( const point3D &p1 , const point3D &p2 )
-{
-    return point3D( p1.x/p2.x , p1.y/p2.y , p1.z/p2.z );
-}
-
-point3D abs( const point3D &p )
-{
-    return point3D( std::abs(p.x) , std::abs(p.y) , std::abs(p.z) );
-}
-
-

-

-

- Finally, we have to provide a specialization to calculate the infintity - norm of a state: -

-

-

-
// also only for steppers with error control
-namespace boost { namespace numeric { namespace odeint {
-template<>
-struct vector_space_norm_inf< point3D >
-{
-    typedef double result_type;
-    double operator()( const point3D &p ) const
-    {
-        using std::max;
-        using std::abs;
-        return max( max( abs( p.x ) , abs( p.y ) ) , abs( p.z ) );
-    }
-};
-} } }
-
-

-

-

- Again, note that the two last steps were only required if you want to - use controlled steppers. For simple steppers definition of the simple - += and *= - operators are sufficient. Having defined such a point type, we can easily - perform the integration on a Lorenz system by explicitely configuring - the vector_space_algebra - in the stepper's template argument list: -

-

-

-
const double sigma = 10.0;
-const double R = 28.0;
-const double b = 8.0 / 3.0;
-
-void lorenz( const point3D &x , point3D &dxdt , const double t )
-{
-    dxdt.x = sigma * ( x.y - x.x );
-    dxdt.y = R * x.x - x.y - x.x * x.z;
-    dxdt.z = -b * x.z + x.x * x.y;
-}
-
-using namespace boost::numeric::odeint;
-
-int main()
-{
-
-    point3D x( 10.0 , 5.0 , 5.0 );
-    // point type defines it's own operators -> use vector_space_algebra !
-    typedef runge_kutta_dopri5< point3D , double , point3D ,
-                                double , vector_space_algebra > stepper;
-    int steps = integrate_adaptive( make_controlled<stepper>( 1E-10 , 1E-10 ) , lorenz , x ,
-                                    0.0 , 10.0 , 0.1 );
-    std::cout << x << std::endl;
-    std::cout << "steps: " << steps << std::endl;
-}
-
-

-

-

- The whole example can be found in lorenz_point.cpp -

-
- - - - - -
[Note]Note

- For the most state_types, - odeint is able to automatically determine the correct algebra and operations. - But if you want to use your own state_type, - as in this example with point3D, - you have to manually configure the right algebra/operations, unless - your state_type works - with the default choice of range_algebra - and default_operations. -

-
-
-

- gsl_vector, gsl_matrix, ublas::matrix, blitz::matrix, thrust -

-
- -

- to be continued -

-
    -
  • - thrust -
  • -
  • - gsl_complex -
  • -
  • - min, max, pow -
  • -
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/steppers.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/steppers.html deleted file mode 100644 index e79f76814..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/steppers.html +++ /dev/null @@ -1,2367 +0,0 @@ - - - -Steppers - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -

- Solving ordinary differential equation numerically is usually done iteratively, - that is a given state of an ordinary differential equation is iterated forward - x(t) -> x(t+dt) -> x(t+2dt). The steppers in odeint - perform one single step. The most general stepper type is described by the - Stepper concept. - The stepper concepts of odeint are described in detail in section Concepts, - here we briefly present the mathematical and numerical details of the steppers. - The Stepper - has two versions of the do_step - method, one with an in-place transform of the current state and one with - an out-of-place transform: -

-

- do_step( - sys , - inout , - t , dt ) -

-

- do_step( - sys , - in , - t , out , dt ) -

-

- The first parameter is always the system function - a function describing - the ODE. In the first version the second parameter is the step which is here - updated in-place and the third and the fourth parameters are the time and - step size (the time step). After a call to do_step - the state inout is updated - and now represents an approximate solution of the ODE at time t+dt. - In the second version the second argument is the state of the ODE at time - t, the third argument is t, the fourth argument is the - approximate solution at time t+dt which is filled by - do_step and the fifth argument - is the time step. Note that these functions do not change the time t. -

-

- System functions -

-

- Up to now, we have nothing said about the system function. This function - depends on the stepper. For the explicit Runge-Kutta steppers this function - can be a simple callable object hence a simple (global) C-function or a functor. - The parameter syntax is sys( x , - dxdt , - t ) - and it is assumed that it calculates dx/dt = f(x,t). - The function structure in most cases looks like: -

-

-

-
void sys( const state_type & /*x*/ , state_type & /*dxdt*/ , const double /*t*/ )
-{
-    // ...
-}
-
-

-

-

- Other types of system functions might represent Hamiltonian systems or systems - which also compute the Jacobian needed in implicit steppers. For information - which stepper uses which system function see the stepper table below. It - might be possible that odeint will introduce new system types in near future. - Since the system function is strongly related to the stepper type, such an - introduction of a new stepper might result in a new type of system function. -

-
- -

- A first specialization are the explicit steppers. Explicit means that the - new state of the ode can be computed explicitly from the current state - without solving implicit equations. Such steppers have in common that they - evaluate the system at time t such that the result - of f(x,t) can be passed to the stepper. In odeint, - the explicit stepper have two additional methods -

-

- do_step( - sys , - inout , - dxdtin , - t , - dt ) -

-

- do_step( - sys , - in , - dxdtin , - t , - out , - dt ) -

-

- Here, the additional parameter is the value of the function f - at state x and time t. An example - is the Runge-Kutta stepper of fourth order: -

-

-

-
runge_kutta4< state_type > rk;
-rk.do_step( sys1 , inout , t , dt );               // In-place transformation of inout
-rk.do_step( sys2 , inout , t , dt );               // call with different system: Ok
-rk.do_step( sys1 , in , t , out , dt );            // Out-of-place transformation
-rk.do_step( sys1 , inout , dxdtin , t , dt );      // In-place tranformation of inout
-rk.do_step( sys1 , in , dxdtin , t , out , dt );   // Out-of-place transformation
-
-

-

-

- In fact, you do not need to call these two methods. You can always use - the simpler do_step( - sys , - inout , - t , - dt ), - but sometimes the derivative of the state is needed externally to do some - external computations or to perform some statistical analysis. -

-

- A special class of the explicit steppers are the FSAL (first-same-as-last) - steppers, where the last evaluation of the system function is also the - first evaluation of the following step. For such steppers the do_step method are slightly different: -

-

- do_step( - sys , - inout , - dxdtinout , - t , - dt ) -

-

- do_step( - sys , - in , - dxdtin , - out , - dxdtout , - t , - dt ) -

-

- This method takes the derivative at time t - and also stores the derivative at time t+dt. Calling - these functions subsequently iterating along the solution one saves one - function call by passing the result for dxdt into the next function call. - However, when using FSAL steppers without supplying derivatives: -

-

- do_step( - sys , - inout , - t , - dt ) -

-

- the stepper internally satisfies the FSAL property which means it remembers - the last dxdt and uses - it for the next step. An example for a FSAL stepper is the Runge-Kutta-Dopri5 - stepper. The FSAL trick is sometimes also referred as the Fehlberg trick. - An example how the FSAL steppers can be used is -

-

-

-
runge_kutta_dopri5< state_type > rk;
-rk.do_step( sys1 , in , t , out , dt );
-rk.do_step( sys2 , in , t , out , dt );         // DONT do this, sys1 is assumed
-
-rk.do_step( sys2 , in2 , t , out , dt );
-rk.do_step( sys2 , in3 , t , out , dt );        // DONT do this, in2 is assumed
-
-rk.do_step( sys1 , inout , dxdtinout , t , dt );
-rk.do_step( sys2 , inout , dxdtinout , t , dt );           // Ok, internal derivative is not used, dxdtinout is updated
-
-rk.do_step( sys1 , in , dxdtin , t , out , dxdtout , dt );
-rk.do_step( sys2 , in , dxdtin , t , out , dxdtout , dt ); // Ok, internal derivative is not used
-
-

-

-
- - - - - -
[Caution]Caution

- The FSAL-steppers save the derivative at time t+dt - internally if they are called via do_step( sys , in , out , t , dt ). The first call of do_step - will initialize dxdt - and for all following calls it is assumed that the same system and the - same state are used. If you use the FSAL stepper within the integrate - functions this is taken care of automatically. See the Using - steppers section for more details or look into the table below - to see which stepper have an internal state. -

-
-
- -

- As mentioned above symplectic solvers are used for Hamiltonian systems. - Symplectic solvers conserve the phase space volume exactly and if the Hamiltonian - system is energy conservative they also conserve the energy approximately. - A special class of symplectic systems are separable systems which can be - written in the form dqdt/dt = f1(p), dpdt/dt - = f2(q), where (q,p) are the state of system. - The space of (q,p) is sometimes referred as the phase - space and q and p are said the - be the phase space variables. Symplectic systems in this special form occur - widely in nature. For example the complete classical mechanics as written - down by Newton, Lagrange and Hamilton can be formulated in this framework. - The separability of the system depends on the specific choice of coordinates. -

-

- Symplectic systems can be solved by odeint by means of the symplectic_euler - stepper and a symplectic Runge-Kutta-Nystrom method of fourth order. These - steppers assume that the system is autonomous, hence the time will not - explicitly occur. Further they fulfill in principle the default Stepper - concept, but they expect the system to be a pair of callable objects. The - first entry of this pair calculates f1(p) while the - second calculates f2(q). The syntax is sys.first(p,dqdt) and sys.second(q,dpdt), - where the first and second part can be again simple C-functions of functors. - An example is the harmonic oscillator: -

-

-

-
typedef boost::array< double , 1 > vector_type;
-
-
-struct harm_osc_f1
-{
-    void operator()( const vector_type &p , vector_type &dqdt )
-    {
-        dqdt[0] = p[0];
-    }
-};
-
-struct harm_osc_f2
-{
-    void operator()( const vector_type &q , vector_type &dpdt )
-    {
-        dpdt[0] = -q[0];
-    }
-};
-
-

-

-

- The state of such an ODE consist now also of two parts, the part for q - (also called the coordinates) and the part for p (the momenta). The full - example for the harmonic oscillator is now: -

-

-

-
pair< vector_type , vector_type > x;
-x.first[0] = 1.0; x.second[0] = 0.0;
-symplectic_rkn_sb3a_mclachlan< vector_type > rkn;
-rkn.do_step( make_pair( harm_osc_f1() , harm_osc_f2() ) , x , t , dt );
-
-

-

-

- If you like to represent the system with one class you can easily bind - two public method: -

-

-

-
struct harm_osc
-{
-    void f1( const vector_type &p , vector_type &dqdt ) const
-    {
-        dqdt[0] = p[0];
-    }
-
-    void f2( const vector_type &q , vector_type &dpdt ) const
-    {
-        dpdt[0] = -q[0];
-    }
-};
-
-

-

-

-

-
harm_osc h;
-rkn.do_step( make_pair( boost::bind( &harm_osc::f1 , h , _1 , _2 ) , boost::bind( &harm_osc::f2 , h , _1 , _2 ) ) ,
-        x , t , dt );
-
-

-

-

- Many Hamiltonian system can be written as dq/dt=p, - dp/dt=f(q) which is computationally much easier than - the full separable system. Very often, it is also possible to transform - the original equations of motion to bring the system in this simplified - form. This kind of system can be used in the symplectic solvers, by simply - passing f(p) to the do_step - method, again f(p) will be represented by a simple - C-function or a functor. Here, the above example of the harmonic oscillator - can be written as -

-

-

-
pair< vector_type , vector_type > x;
-x.first[0] = 1.0; x.second[0] = 0.0;
-symplectic_rkn_sb3a_mclachlan< vector_type > rkn;
-rkn.do_step( harm_osc_f1() , x , t , dt );
-
-

-

-

- In this example the function harm_osc_f1 - is exactly the same function as in the above examples. -

-

- Note, that the state of the ODE must not be constructed explicitly via - pair< - vector_type , - vector_type > - x. One can also use a combination - of make_pair and ref. Furthermore, a convenience version - of do_step exists which - takes q and p without combining them into a pair: -

-

-

-
rkn.do_step( harm_osc_f1() , make_pair( boost::ref( q ) , boost::ref( p ) ) , t , dt );
-rkn.do_step( harm_osc_f1() , q , p , t , dt );
-rkn.do_step( make_pair( harm_osc_f1() , harm_osc_f2() ) , q , p , t , dt );
-
-

-

-
-
- -
- - - - - -
[Caution]Caution

- This section is not up-to-date. -

-

- For some kind of systems the stability properties of the classical Runge-Kutta - are not sufficient, especially if the system is said to be stiff. A stiff - system possesses two or more time scales of very different order. Solvers - for stiff systems are usually implicit, meaning that they solve equations - like x(t+dt) = x(t) + dt * f(x(t+1)). This particular - scheme is the implicit Euler method. Implicit methods usually solve the - system of equations by a root finding algorithm like the Newton method - and therefore need to know the Jacobian of the system J​ij = df​i / - dx​j. -

-

- For implicit solvers the system is again a pair, where the first component - computes f(x,t) and the second the Jacobian. The syntax - is sys.first( x , dxdt , t ) and - sys.second( x , J , t ). - For the implicit solver the state_type - is ublas::vector and the Jacobian is represented - by ublas::matrix. -

-
- - - - - -
[Important]Important

- Implicit solvers only work with ublas::vector as state type. At the moment, - no other state types are supported. -

-
-
- -

- Another large class of solvers are multi-step method. They save a small - part of the history of the solution and compute the next step with the - help of this history. Since multi-step methods know a part of their history - they do not need to compute the system function very often, usually it - is only computed once. This makes multi-step methods preferable if a call - of the system function is expensive. Examples are ODEs defined on networks, - where the computation of the interaction is usually where expensive (and - might be of order O(N^2)). -

-

- Multi-step methods differ from the normal steppers. They save a part of - their history and this part has to be explicitly calculated and initialized. - In the following example an Adams-Bashforth-stepper with a history of 5 - steps is instantiated and initialized; -

-

-

-
adams_bashforth_moulton< 5 , state_type > abm;
-abm.initialize( sys , inout , t , dt );
-abm.do_step( sys , inout , t , dt );
-
-

-

-

- The initialization uses a fourth-order Runge-Kutta stepper and after the - call of initialize the - state of inout has changed - to the current state, such that it can be immediately used by passing it - to following calls of do_step. - You can also use you own steppers to initialize the internal state of the - Adams-Bashforth-Stepper: -

-

-

-
abm.initialize( runge_kutta_fehlberg78< state_type >() , sys , inout , t , dt );
-
-

-

-

- Many multi-step methods are also explicit steppers, hence the parameter - of do_step method do not - differ from the explicit steppers. -

-
- - - - - -
[Caution]Caution

- The multi-step methods have some internal variables which depend on the - explicit solution. Hence after any external changes of your state (e.g. - size) or system the initialize function has to be called again to adjust - the internal state of the stepper. If you use the integrate functions - this will be taken into account. See the Using - steppers section for more details. -

-
-
- -

- Many of the above introduced steppers possess the possibility to use adaptive - step-size control. Adaptive step size integration works in principle as - follows: -

-
    -
  1. - The error of one step is calculated. This is usually done by performing - two steps with different orders. The difference between these two steps - is then used as a measure for the error. Stepper which can calculate - the error are Error - Stepper and they form an own class with an separate concept. -
  2. -
  3. - This error is compared against some predefined error tolerances. Are - the tolerance violated the step is reject and the step-size is decreases. - Otherwise the step is accepted and possibly the step-size is increased. -
  4. -
-

- The class of controlled steppers has their own concept in odeint - the - Controlled - Stepper concept. They are usually constructed from the underlying - error steppers. An example is the controller for the explicit Runge-Kutta - steppers. The Runge-Kutta steppers enter the controller as a template argument. - Additionally one can pass the Runge-Kutta stepper to the constructor, but - this step is not necessary; the stepper is default-constructed if possible. -

-

- Different step size controlling mechanism exist. They all have in common - that they somehow compare predefined error tolerance against the error - and that they might reject or accept a step. If a step is rejected the - step size is usually decreased and the step is made again with the reduced - step size. This procedure is repeated until the step is accepted. This - algorithm is implemented in the integration functions. -

-

- A classical way to decide whether a step is rejected or accepted is to - calculate -

-

- val = || | err​i | / ( ε​abs + ε​rel * ( a​x | x​i | + a​dxdt | | dxdt​i | )|| - -

-

- ε​abs and ε​rel are the absolute - and the relative error tolerances, and || x || is - a norm, typically ||x||=(Σ​i x​i2)1/2 or the maximum norm. - The step is rejected if val is greater then 1, otherwise - it is accepted. For details of the used norms and error tolerance see the - table below. -

-

- For the controlled_runge_kutta - stepper the new step size is then calculated via -

-

- val > 1 : dt​new = dt​current max( 0.9 pow( val , -1 / ( O​E - 1 - ) ) , 0.2 ) -

-

- val < 0.5 : dt​new = dt​current min( 0.9 pow( val , -1 / O​S ) , - 5 ) -

-

- else : dt​new = dt​current -

-

- Here, O​S and O​E are the order - of the stepper and the error stepper. These formulas also contain some - safety factors, avoiding that the step size is reduced or increased to - much. For details of the implementations of the controlled steppers in - odeint see the table below. -

-
-

Table 1.5. Adaptive step size algorithms

-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Stepper -

-
-

- Tolerance formula -

-
-

- Norm -

-
-

- Step size adaption -

-
-

- controlled_runge_kutta -

-
-

- val = || | err​i | / ( ε​abs + ε​rel * ( a​x | x​i | + a​dxdt | | - dxdt​i | )|| -

-
-

- ||x|| = max( x​i ) -

-
-

- val > 1 : dt​new = dt​current max( 0.9 pow( val , -1 - / ( O​E - 1 ) ) , 0.2 ) -

-

- val < 0.5 : dt​new = dt​current min( 0.9 pow( val , - -1 / O​S ) , 5 ) -

-

- else : dt​new = dt​current -

-
-

- rosenbrock4_controller -

-
-

- val = || err​i / ( ε​abs + ε​rel max( | x​i | , | xold​i | ) ) - || -

-
-

- ||x||=(Σ​i x​i2)1/2 -

-
-

- fac = max( 1 / 6 , min( 5 , pow( val , 1 / 4 ) / 0.9 - ) -

-

- fac2 = max( 1 / 6 , min( 5 , dt​old / dt​current pow( val2 / - val​old , 1 / 4 ) / 0.9 ) -

-

- val > 1 : dt​new = dt​current / fac -

-

- val < 1 : dt​new = dt​current / max( fac , fac2 ) -

-
-

- bulirsch_stoer -

-
-

- tol=1/2 -

-
-

- - -

-
-

- dt​new = dt​old1/a -

-
-
-

- To ease to generation of the controlled stepper, generation functions exist - which take the absolute and relative error tolerances and a predefined - error stepper and construct from this knowledge an appropriate controlled - stepper. The generation functions are explained in detail in Generation - functions. -

-
-
- -

- A fourth class of stepper exists which are the so called dense output steppers. - Dense-output steppers might take larger steps and interpolate the solution - between two consecutive points. This interpolated points have usually the - same order as the order of the stepper. Dense-output steppers are often - composite stepper which take the underlying method as a template parameter. - An example is the dense_output_runge_kutta - stepper which takes a Runge-Kutta stepper with dense-output facilities - as argument. Not all Runge-Kutta steppers provide dense-output calculation; - at the moment only the Dormand-Prince 5 stepper provides dense output. - An example is -

-

-

-
dense_output_runge_kutta< controlled_runge_kutta< runge_kutta_dopri5< state_type > > > dense;
-dense.initialize( in , t , dt );
-pair< double , double > times = dense.do_step( sys );
-(void)times;
-
-

-

-

- Dense output stepper have their own concept. The main difference to usual - steppers is that they manage the state and time internally. If you call - do_step, only the ODE is - passed as argument. Furthermore do_step - return the last time interval: t - and t+dt, hence you can interpolate the solution - between these two times points. Another difference is that they must be - initialized with initialize, - otherwise the internal state of the stepper is default constructed which - might produce funny errors or bugs. -

-

- The construction of the dense output stepper looks a little bit nasty, - since in the case of the dense_output_runge_kutta - stepper a controlled stepper and an error stepper have to be nested. To - simplify the generation of the dense output stepper generation functions - exist: -

-

-

-
typedef boost::numeric::odeint::result_of::make_dense_output<
-    runge_kutta_dopri5< state_type > >::type dense_stepper_type;
-dense_stepper_type dense2 = make_dense_output( 1.0e-6 , 1.0e-6 , runge_kutta_dopri5< state_type >() );
-(void)dense2;
-
-

-

-

- This statement is also lengthy; it demonstrates how make_dense_output - can be used with the result_of - protocol. The parameters to make_dense_output - are the absolute error tolerance, the relative error tolerance and the - stepper. This explicitly assumes that the underlying stepper is a controlled - stepper and that this stepper has an absolute and a relative error tolerance. - For details about the generation functions see Generation - functions. The generation functions have been designed for easy - use with the integrate functions: -

-

-

-
integrate_const( make_dense_output( 1.0e-6 , 1.0e-6 , runge_kutta_dopri5< state_type >() ) , sys , inout , t_start , t_end , dt );
-
-

-

-
-
- -

- This section contains some general information about the usage of the steppers - in odeint. -

-

- Steppers are copied by value -

-

- The stepper in odeint are always copied by values. They are copied for - the creation of the controlled steppers or the dense output steppers as - well as in the integrate functions. -

-

- Steppers might have a internal state -

-
- - - - - -
[Caution]Caution

- Some of the features described in this section are not yet implemented -

-

- Some steppers require to store some information about the state of the - ODE between two steps. Examples are the multi-step methods which store - a part of the solution during the evolution of the ODE, or the FSAL steppers - which store the last derivative at time t+dt, to be - used in the next step. In both cases the steppers expect that consecutive - calls of do_step are from - the same solution and the same ODE. In this case it is absolutely necessary - that you call do_step with - the same system function and the same state, see also the examples for - the FSAL steppers above. -

-

- Stepper with an internal state support two additional methods: reset which resets the state and initialize which initializes the internal - state. The parameters of initialize - depend on the specific stepper. For example the Adams-Bashforth-Moulton - stepper provides two initialize methods: initialize( system , inout , t , dt ) which initializes the internal states - with the help of the Runge-Kutta 4 stepper, and initialize( stepper , system , inout , t , dt ) which initializes with the help of stepper. For the case of the FSAL steppers, - initialize is initialize( - sys , - in , - t ) - which simply calculates the r.h.s. of the ODE and assigns its value to - the internal derivative. -

-

- All these steppers have in common, that they initially fill their internal - state by themselves. Hence you are not required to call initialize. See - how this works for the Adams-Bashforth-Moulton stepper: in the example - we instantiate a fourth order Adams-Bashforth-Moulton stepper, meaning - that it will store 4 internal derivatives of the solution at times (t-dt,t-2*dt,t-3*dt,t-4*dt). -

-

-

-
adams_bashforth_moulton< 4 , state_type > stepper;
-stepper.do_step( sys , x , t , dt );   // make one step with the classical Runge-Kutta stepper and initialize the first internal state
-                                       // the internal array is now [x(t-dt)]
-
-stepper.do_step( sys , x , t , dt );   // make one step with the classical Runge-Kutta stepper and initialize the second internal state
-                                       // the internal state array is now [x(t-dt), x(t-2*dt)]
-
-stepper.do_step( sys , x , t , dt );   // make one step with the classical Runge-Kutta stepper and initialize the third internal state
-                                       // the internal state array is now [x(t-dt), x(t-2*dt), x(t-3*dt)]
-
-stepper.do_step( sys , x , t , dt );   // make one step with the classical Runge-Kutta stepper and initialize the fourth internal state
-                                       // the internal state array is now [x(t-dt), x(t-2*dt), x(t-3*dt), x(t-4*dt)]
-
-stepper.do_step( sys , x , t , dt );   // make one step with Adam-Bashforth-Moulton, the internal array of states is now rotated
-
-

-

-

- In the stepper table at the bottom of this page one can see which stepper - have an internal state and hence provide the reset - and initialize methods. -

-

- Stepper might be resizable -

-

- Nearly all steppers in odeint need to store some intermediate results of - the type state_type or - deriv_type. To do so odeint - need some memory management for the internal temporaries. As this memory - management is typically related to adjusting the size of vector-like types, - it is called resizing in odeint. So, most steppers in odeint provide an - additional template parameter which controls the size adjustment of the - internal variables - the resizer. In detail odeint provides three policy - classes (resizers) always_resizer, - initially_resizer, and - never_resizer. Furthermore, - all stepper have a method adjust_size - which takes a parameter representing a state type and which manually adjusts - the size of the internal variables matching the size of the given instance. - Before performing the actual resizing odeint always checks if the sizes - of the state and the internal variable differ and only resizes if they - are different. -

-
- - - - - -
[Note]Note

- You only have to worry about memory allocation when using dynamically - sized vector types. If your state type is heap allocated, like boost::array, no memory allocation is required - whatsoever. -

-

- By default the resizing parameter is initially_resizer, - meaning that the first call to do_step - performs the resizing, hence memory allocation. If you have changed the - size of your system and your state you have to call adjust_size - by hand in this case. The second resizer is the always_resizer - which tries to resize the internal variables at every call of do_step. Typical use cases for this kind - of resizer are self expanding lattices like shown in the tutorial ( Self expanding - lattices) or partial differential equations with an adaptive grid. - Here, no calls of adjust_size - are required, the steppers manage everything themselves. The third class - of resizer is the never_resizer - which means that the internal variables are never adjusted automatically - and always have to be adjusted by hand . -

-

- There is a second mechanism which influences the resizing and which controls - if a state type is at least resizeable - a meta-function is_resizeable. This meta-function returns - a static Boolean value if any type is resizable. For example it will return - true for std::vector< T > but false - for boost::array< T >. - By default and for unknown types is_resizeable - returns false, so if you have - your own type you need to specialize this meta-function. For more details - on the resizing mechanism see the section Adapt - your own state types. -

-

- Which steppers should be used in which situation -

-

- odeint provides a quite large number of different steppers such that the - user is left with the question of which stepper fits his needs. Our personal - recommendations are: -

-
    -
  • - runge_kutta_dopri5 - is maybe the best default stepper. It has step size control as well - as dense-output functionality. Simple create a dense-output stepper - by make_dense_output( 1.0e-6 , 1.0e-5 , runge_kutta_dopri5< state_type - >() ). -
  • -
  • - runge_kutta4 is a good - stepper for constant step sizes. It is widely used and very well known. - If you need to create artificial time series this stepper should be - the first choice. -
  • -
  • - 'runge_kutta_fehlberg78' is similar to the 'runge_kutta4' with the - advantage that it has higher precision. It can also be used with step - size control. -
  • -
  • - adams_bashforth_moulton - is very well suited for ODEs where the r.h.s. is expensive (in terms - of computation time). It will calculate the system function only once - during each step. -
  • -
-
-
- -
-

Table 1.6. Stepper Algorithms

-
----------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Algorithm -

-
-

- Class -

-
-

- Concept -

-
-

- System Concept -

-
-

- Order -

-
-

- Error Estimation -

-
-

- Dense Output -

-
-

- Internal state -

-
-

- Remarks -

-
-

- Explicit Euler -

-
-

- euler -

-
-

- Dense - Output Stepper -

-
-

- System -

-
-

- 1 -

-
-

- No -

-
-

- Yes -

-
-

- No -

-
-

- Very simple, only for demonstrating purpose -

-
-

- Modified Midpoint -

-
-

- modified_midpoint -

-
-

- Stepper -

-
-

- System -

-
-

- configurable (2) -

-
-

- No -

-
-

- No -

-
-

- No -

-
-

- Used in Bulirsch-Stoer implementation -

-
-

- Runge-Kutta 4 -

-
-

- runge_kutta4 -

-
-

- Stepper -

-
-

- System -

-
-

- 4 -

-
-

- No -

-
-

- No -

-
-

- No -

-
-

- The classical Runge-Kutta scheme, good general scheme without - error control -

-
-

- Cash-Karp -

-
-

- runge_kutta_cash_karp54 -

-
-

- Error - Stepper -

-
-

- System -

-
-

- 5 -

-
-

- Yes (4) -

-
-

- No -

-
-

- No -

-
-

- Good general scheme with error estimation, to be used in controlled_error_stepper -

-
-

- Dormand-Prince 5 -

-
-

- runge_kutta_dopri5 -

-
-

- Error - Stepper -

-
-

- System -

-
-

- 5 -

-
-

- Yes (4) -

-
-

- Yes -

-
-

- Yes -

-
-

- Standard method with error control and dense output, to be used - in controlled_error_stepper and in dense_output_controlled_explicit_fsal. -

-
-

- Fehlberg 78 -

-
-

- runge_kutta_fehlberg78 -

-
-

- Error - Stepper -

-
-

- System -

-
-

- 8 -

-
-

- Yes (7) -

-
-

- No -

-
-

- No -

-
-

- Good high order method with error estimation, to be used in controlled_error_stepper. -

-
-

- Adams Bashforth -

-
-

- adams_bashforth -

-
-

- Stepper -

-
-

- System -

-
-

- configurable -

-
-

- No -

-
-

- No -

-
-

- Yes -

-
-

- Multistep method -

-
-

- Adams Bashforth Moulton -

-
-

- adams_bashforth_moulton -

-
-

- Stepper -

-
-

- System -

-
-

- configurable -

-
-

- No -

-
-

- No -

-
-

- Yes -

-
-

- Combined multistep method -

-
-

- Controlled Runge-Kutta -

-
-

- controlled_runge_kutta -

-
-

- Controlled - Stepper -

-
-

- System -

-
-

- depends -

-
-

- Yes -

-
-

- No -

-
-

- depends -

-
-

- Error control for Error - Stepper. Requires an Error - Stepper from above. Order depends on the given ErrorStepper -

-
-

- Dense Output Runge-Kutta -

-
-

- dense_output_runge_kutta -

-
-

- Dense - Output Stepper -

-
-

- System -

-
-

- depends -

-
-

- No -

-
-

- Yes -

-
-

- Yes -

-
-

- Dense output for Stepper - and Error - Stepper from above if they provide dense output functionality - (like euler and - runge_kutta_dopri5). - Order depends on the given stepper. -

-
-

- Bulirsch-Stoer -

-
-

- bulirsch_stoer -

-
-

- Controlled - Stepper -

-
-

- System -

-
-

- variable -

-
-

- Yes -

-
-

- No -

-
-

- No -

-
-

- Stepper with step size and order control. Very good if high precision - is required. -

-
-

- Bulirsch-Stoer Dense Output -

-
-

- bulirsch_stoer_dense_out -

-
-

- Dense - Output Stepper -

-
-

- System -

-
-

- variable -

-
-

- Yes -

-
-

- Yes -

-
-

- No -

-
-

- Stepper with step size and order control as well as dense output. - Very good if high precision and dense output is required. -

-
-

- Implicit Euler -

-
-

- implicit_euler -

-
-

- Stepper -

-
-

- Implicit - System -

-
-

- 1 -

-
-

- No -

-
-

- No -

-
-

- No -

-
-

- Basic implicit routine. Requires the Jacobian. Works only with - Boost.uBLAS - vectors as state types. -

-
-

- Rosenbrock 4 -

-
-

- rosenbrock4 -

-
-

- Error - Stepper -

-
-

- Implicit - System -

-
-

- 4 -

-
-

- Yes -

-
-

- Yes -

-
-

- No -

-
-

- Good for stiff systems. Works only with Boost.uBLAS - vectors as state types. -

-
-

- Controlled Rosenbrock 4 -

-
-

- rosenbrock4_controller -

-
-

- Controlled - Stepper -

-
-

- Implicit - System -

-
-

- 4 -

-
-

- Yes -

-
-

- Yes -

-
-

- No -

-
-

- Rosenbrock 4 with error control. Works only with Boost.uBLAS - vectors as state types. -

-
-

- Dense Output Rosenbrock 4 -

-
-

- rosenbrock4_dense_output -

-
-

- Dense - Output Stepper -

-
-

- Implicit - System -

-
-

- 4 -

-
-

- Yes -

-
-

- Yes -

-
-

- No -

-
-

- Controlled Rosenbrock 4 with dense output. Works only with Boost.uBLAS - vectors as state types. -

-
-

- Symplectic Euler -

-
-

- symplectic_euler -

-
-

- Stepper -

-
-

- Symplectic - System Simple - Symplectic System -

-
-

- 1 -

-
-

- No -

-
-

- No -

-
-

- No -

-
-

- Basic symplectic solver for separable Hamiltonian system -

-
-

- Symplectic RKN McLachlan -

-
-

- symplectic_rkn_sb3a_mclachlan -

-
-

- Stepper -

-
-

- Symplectic - System Simple - Symplectic System -

-
-

- 4 -

-
-

- No -

-
-

- No -

-
-

- No -

-
-

- Symplectic solver for separable Hamiltonian system with 6 stages - and order 4. -

-
-

- Symplectic RKN McLachlan -

-
-

- symplectic_rkn_sb3a_m4_mclachlan -

-
-

- Stepper -

-
-

- Symplectic - System Simple - Symplectic System -

-
-

- 4 -

-
-

- No -

-
-

- No -

-
-

- No -

-
-

- Symplectic solver with 5 stages and order 4, can be used with - arbitrary precision types. -

-
-

- Velocity Verlet -

-
-

- velocity_verlet -

-
-

- Stepper -

-
-

- Second - Order System -

-
-

- 1 -

-
-

- No -

-
-

- No -

-
-

- Yes -

-
-

- Velocity verlet method suitable for molecular dynamics simulation. -

-
-
-
-
-
- -

- Finally, one can also write new steppers which are fully compatible with - odeint. They only have to fulfill one or several of the stepper Concepts - of odeint. -

-

- We will illustrate how to write your own stepper with the example of the - stochastic Euler method. This method is suited to solve stochastic differential - equations (SDEs). A SDE has the form -

-

- dx/dt = f(x) + g(x) ξ(t) -

-

- where ξ is Gaussian white noise with zero mean and - a standard deviation σ(t). f(x) - is said to be the deterministic part while g(x) ξ is - the noisy part. In case g(x) is independent of x - the SDE is said to have additive noise. It is not possible to solve SDE - with the classical solvers for ODEs since the noisy part of the SDE has - to be scaled differently then the deterministic part with respect to the - time step. But there exist many solvers for SDEs. A classical and easy - method is the stochastic Euler solver. It works by iterating -

-

- x(t+Δ t) = x(t) + Δ t f(x(t)) + Δ t1/2 g(x) ξ(t) -

-

- where ξ(t) is an independent normal distributed random variable. -

-

- Now we will implement this method. We will call the stepper stochastic_euler. It models the Stepper concept. - For simplicity, we fix the state type to be an array< double , N > The class definition looks like -

-

-

-
template< size_t N > class stochastic_euler
-{
-public:
-
-    typedef boost::array< double , N > state_type;
-    typedef boost::array< double , N > deriv_type;
-    typedef double value_type;
-    typedef double time_type;
-    typedef unsigned short order_type;
-    typedef boost::numeric::odeint::stepper_tag stepper_category;
-
-    static order_type order( void ) { return 1; }
-
-    // ...
-};
-
-

-

-

- The types are needed in order to fulfill the stepper concept. As internal - state and deriv type we use simple arrays in the stochastic Euler, they - are needed for the temporaries. The stepper has the order one which is - returned from the order() function. -

-

- The system functions needs to calculate the deterministic and the stochastic - part of our stochastic differential equation. So it might be suitable that - the system function is a pair of functions. The first element of the pair - computes the deterministic part and the second the stochastic one. Then, - the second part also needs to calculate the random numbers in order to - simulate the stochastic process. We can now implement the do_step method -

-

-

-
template< size_t N > class stochastic_euler
-{
-public:
-
-    // ...
-
-    template< class System >
-    void do_step( System system , state_type &x , time_type t , time_type dt ) const
-    {
-        deriv_type det , stoch ;
-        system.first( x , det );
-        system.second( x , stoch );
-        for( size_t i=0 ; i<x.size() ; ++i )
-            x[i] += dt * det[i] + sqrt( dt ) * stoch[i];
-    }
-};
-
-

-

-

- This is all. It is quite simple and the stochastic Euler stepper implement - here is quite general. Of course it can be enhanced, for example -

-
    -
  • - use of operations and algebras as well as the resizing mechanism for - maximal flexibility and portability -
  • -
  • - use of boost::ref for the system functions -
  • -
  • - use of boost::range for the state type in the - do_step method -
  • -
  • - ... -
  • -
-

- Now, lets look how we use the new stepper. A nice example is the Ornstein-Uhlenbeck - process. It consists of a simple Brownian motion overlapped with an relaxation - process. Its SDE reads -

-

- dx/dt = - x + ξ -

-

- where ξ is Gaussian white noise with standard deviation σ. - Implementing the Ornstein-Uhlenbeck process is quite simple. We need two - functions or functors - one for the deterministic and one for the stochastic - part: -

-

-

-
const static size_t N = 1;
-typedef boost::array< double , N > state_type;
-
-struct ornstein_det
-{
-    void operator()( const state_type &x , state_type &dxdt ) const
-    {
-        dxdt[0] = -x[0];
-    }
-};
-
-struct ornstein_stoch
-{
-    boost::mt19937 &m_rng;
-    boost::normal_distribution<> m_dist;
-
-  ornstein_stoch( boost::mt19937 &rng , double sigma ) : m_rng( rng ) , m_dist( 0.0 , sigma ) { }
-
-    void operator()( const state_type &x , state_type &dxdt )
-    {
-        dxdt[0] = m_dist( m_rng );
-    }
-};
-
-

-

-

- In the stochastic part we have used the Mersenne twister for the random - number generation and a Gaussian white noise generator normal_distribution - with standard deviation σ. Now, we can use the stochastic - Euler stepper with the integrate functions: -

-

-

-
boost::mt19937 rng;
-double dt = 0.1;
-state_type x = {{ 1.0 }};
-integrate_const( stochastic_euler< N >() , make_pair( ornstein_det() , ornstein_stoch( rng , 1.0 ) ),
-        x , 0.0 , 10.0 , dt , streaming_observer() );
-
-

-

-

- Note, how we have used the make_pair - function for the generation of the system function. -

-
-
- -

- odeint provides a C++ template meta-algorithm for constructing arbitrary - Runge-Kutta schemes [1]. Some schemes are predefined in odeint, for example the classical - Runge-Kutta of fourth order, or the Runge-Kutta-Cash-Karp 54 and the Runge-Kutta-Fehlberg - 78 method. You can use this meta algorithm to construct you own solvers. - This has the advantage that you can make full use of odeint's algebra and - operation system. -

-

- Consider for example the method of Heun, defined by the following Butcher - tableau: -

-
c1 = 0
-
-c2 = 1/3, a21 = 1/3
-
-c3 = 2/3, a31 =  0 , a32 = 2/3
-
-          b1  = 1/4, b2  = 0  , b3 = 3/4
-
-

- Implementing this method is very easy. First you have to define the constants: -

-

-

-
template< class Value = double >
-struct heun_a1 : boost::array< Value , 1 > {
-    heun_a1( void )
-    {
-        (*this)[0] = static_cast< Value >( 1 ) / static_cast< Value >( 3 );
-    }
-};
-
-template< class Value = double >
-struct heun_a2 : boost::array< Value , 2 >
-{
-    heun_a2( void )
-    {
-        (*this)[0] = static_cast< Value >( 0 );
-        (*this)[1] = static_cast< Value >( 2 ) / static_cast< Value >( 3 );
-    }
-};
-
-
-template< class Value = double >
-struct heun_b : boost::array< Value , 3 >
-{
-    heun_b( void )
-    {
-        (*this)[0] = static_cast<Value>( 1 ) / static_cast<Value>( 4 );
-        (*this)[1] = static_cast<Value>( 0 );
-        (*this)[2] = static_cast<Value>( 3 ) / static_cast<Value>( 4 );
-    }
-};
-
-template< class Value = double >
-struct heun_c : boost::array< Value , 3 >
-{
-    heun_c( void )
-    {
-        (*this)[0] = static_cast< Value >( 0 );
-        (*this)[1] = static_cast< Value >( 1 ) / static_cast< Value >( 3 );
-        (*this)[2] = static_cast< Value >( 2 ) / static_cast< Value >( 3 );
-    }
-};
-
-

-

-

- While this might look cumbersome, packing all parameters into a templatized - class which is not immediately evaluated has the advantage that you can - change the value_type of - your stepper to any type you like - presumably arbitrary precision types. - One could also instantiate the coefficients directly -

-

-

-
const boost::array< double , 1 > heun_a1 = {{ 1.0 / 3.0 }};
-const boost::array< double , 2 > heun_a2 = {{ 0.0 , 2.0 / 3.0 }};
-const boost::array< double , 3 > heun_b = {{ 1.0 / 4.0 , 0.0 , 3.0 / 4.0 }};
-const boost::array< double , 3 > heun_c = {{ 0.0 , 1.0 / 3.0 , 2.0 / 3.0 }};
-
-

-

-

- But then you are nailed down to use doubles. -

-

- Next, you need to define your stepper, note that the Heun method has 3 - stages and produces approximations of order 3: -

-

-

-
template<
-    class State ,
-    class Value = double ,
-    class Deriv = State ,
-    class Time = Value ,
-    class Algebra = boost::numeric::odeint::range_algebra ,
-    class Operations = boost::numeric::odeint::default_operations ,
-    class Resizer = boost::numeric::odeint::initially_resizer
->
-class heun : public
-boost::numeric::odeint::explicit_generic_rk< 3 , 3 , State , Value , Deriv , Time ,
-                                             Algebra , Operations , Resizer >
-{
-
-public:
-
-    typedef boost::numeric::odeint::explicit_generic_rk< 3 , 3 , State , Value , Deriv , Time ,
-                                                         Algebra , Operations , Resizer > stepper_base_type;
-
-    typedef typename stepper_base_type::state_type state_type;
-    typedef typename stepper_base_type::wrapped_state_type wrapped_state_type;
-    typedef typename stepper_base_type::value_type value_type;
-    typedef typename stepper_base_type::deriv_type deriv_type;
-    typedef typename stepper_base_type::wrapped_deriv_type wrapped_deriv_type;
-    typedef typename stepper_base_type::time_type time_type;
-    typedef typename stepper_base_type::algebra_type algebra_type;
-    typedef typename stepper_base_type::operations_type operations_type;
-    typedef typename stepper_base_type::resizer_type resizer_type;
-    typedef typename stepper_base_type::stepper_type stepper_type;
-
-    heun( const algebra_type &algebra = algebra_type() )
-    : stepper_base_type(
-            fusion::make_vector(
-                heun_a1<Value>() ,
-                heun_a2<Value>() ) ,
-            heun_b<Value>() , heun_c<Value>() , algebra )
-    { }
-};
-
-

-

-

- That's it. Now, we have a new stepper method and we can use it, for example - with the Lorenz system: -

-

-

-
typedef boost::array< double , 3 > state_type;
-heun< state_type > h;
-state_type x = {{ 10.0 , 10.0 , 10.0 }};
-
-integrate_const( h , lorenz() , x , 0.0 , 100.0 , 0.01 ,
-                 streaming_observer( std::cout ) );
-
-

-

-
-
-

-

[1] - M. Mulansky, K. Ahnert, Template-Metaprogramming applied to numerical - problems, arxiv:1110.3233 -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/using_boost__range.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/using_boost__range.html deleted file mode 100644 index cb482872f..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/using_boost__range.html +++ /dev/null @@ -1,254 +0,0 @@ - - - -Using boost::range - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- Most steppers in odeint also accept the state give as a range. A range is - sequence of values modeled by a range concept. See Boost.Range - for an overview over existing concepts and examples of ranges. This means - that the state_type of the - stepper need not necessarily be used to call the do_step - method. -

-

- One use-case for Boost.Range - in odeint has been shown in Chaotic - System where the state consists of two parts: one for the original - system and one for the perturbations. The ranges are used to initialize (solve) - only the system part where the perturbation part is not touched, that is - a range consisting only of the system part is used. After that the complete - state including the perturbations is solved. -

-

- Another use case is a system consisting of coupled units where you want to - initialize each unit separately with the ODE of the uncoupled unit. An example - is a chain of coupled van-der-Pol-oscillators which are initialized uniformly - from the uncoupled van-der-Pol-oscillator. Then you can use Boost.Range - to solve only one individual oscillator in the chain. -

-

- In short, you can Boost.Range - to use one state within two system functions which expect states with different - sizes. -

-

- An example was given in the Chaotic - System tutorial. Using Boost.Range usually means that your system - function needs to adapt to the iterators of Boost.Range. That is, your function - is called with a range and you need to get the iterators from that range. - This can easily be done. You have to implement your system as a class or - a struct and you have to templatize the operator(). Then you can use the range_iterator-meta - function and boost::begin and boost::end to - obtain the iterators of your range: -

-

-

-
class sys
-{
-    template< class State , class Deriv >
-    void operator()( const State &x_ , Deriv &dxdt_ , double t ) const
-    {
-         typename boost::range_iterator< const State >::type x = boost::begin( x_ );
-         typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ );
-
-         // fill dxdt
-    }
-};
-
-

-

-

- If your range is a random access-range you can also apply the bracket operator - to the iterator to access the elements in the range: -

-
class sys
-{
-    template< class State , class Deriv >
-    void operator()( const State &x_ , Deriv &dxdt_ , double t ) const
-    {
-         typename boost::range_iterator< const State >::type x = boost::begin( x_ );
-         typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ );
-
-         dxdt[0] = f1( x[0] , x[1] );
-         dxdt[1] = f2( x[0] , x[1] );
-    }
-};
-
-

-

-

- The following two tables show which steppers and which algebras are compatible - with Boost.Range. -

-
-

Table 1.9. Steppers supporting Boost.Range

-
- - - - - - - - - - - - - - - - - - - - - - - -
-

- Stepper -

-
-

- adams_bashforth_moulton -

-
-

- bulirsch_stoer_dense_out -

-
-

- bulirsch_stoer -

-
-

- controlled_runge_kutta -

-
-

- dense_output_runge_kutta -

-
-

- euler -

-
-

- explicit_error_generic_rk -

-
-

- explicit_generic_rk -

-
-

- rosenbrock4_controller -

-
-

- rosenbrock4_dense_output -

-
-

- rosenbrock4 -

-
-

- runge_kutta4_classic -

-
-

- runge_kutta4 -

-
-

- runge_kutta_cash_karp54_classic -

-
-

- runge_kutta_cash_karp54 -

-
-

- runge_kutta_dopri5 -

-
-

- runge_kutta_fehlberg78 -

-
-

- symplectic_euler -

-
-

- symplectic_rkn_sb3a_mclachlan -

-
-
-
-

Table 1.10. Algebras supporting Boost.Range

-
- - - - - - -
-

- algebra -

-
-

- range_algebra -

-
-

- thrust_algebra -

-
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/using_boost__ref.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/using_boost__ref.html deleted file mode 100644 index ce9ab9664..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/odeint_in_detail/using_boost__ref.html +++ /dev/null @@ -1,87 +0,0 @@ - - - -Using boost::ref - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- In odeint all system functions and observers are passed by value. For example, - if you call a do_step method - of a particular stepper or the integration functions, your system and your - stepper will be passed by value: -

-

-

-
rk4.do_step( sys , x , t , dt );   // pass sys by value
-
-

-

-

- This behavior is suitable for most systems, especially if your system does - not contain any data or only a few parameters. However, in some cases you - might contain some large amount of data with you system function and passing - them by value is not desired since the data would be copied. -

-

- In such cases you can easily use boost::ref (and - its relative boost::cref) which passes its argument by reference - (or constant reference). odeint will unpack the arguments and no copying - at all of your system object will take place: -

-

-

-
rk4.do_step( boost::ref( sys ) , x , t , dt );   // pass sys as references
-
-

-

-

- The same mechanism can be used for the observers in the integrate functions. -

-
- - - - - -
[Tip]Tip

- If you are using C++11 you can also use std::ref - and std::cref -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial.html deleted file mode 100644 index 5563e13d4..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial.html +++ /dev/null @@ -1,72 +0,0 @@ - - - -Tutorial - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
- - - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/all_examples.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/all_examples.html deleted file mode 100644 index ab6e62460..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/all_examples.html +++ /dev/null @@ -1,601 +0,0 @@ - - - -All examples - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- The following table gives an overview over all examples. -

-
-

Table 1.4. Examples Overview

-
---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- File -

-
-

- Brief Description -

-
-

- bind_member_functions.cpp -

-
-

- This examples shows how member functions can be used as system - functions in odeint. -

-
-

- bind_member_functions_cpp11.cpp -

-
-

- This examples shows how member functions can be used as system - functions in odeint with std::bind - in C++11. -

-
-

- bulirsch_stoer.cpp -

-
-

- Shows the usage of the Bulirsch-Stoer method. -

-
-

- chaotic_system.cpp -

-
-

- The chaotic system examples integrates the Lorenz system and calculates - the Lyapunov exponents. -

-
-

- elliptic_functions.cpp -

-
-

- Example calculating the elliptic functions using Bulirsch-Stoer - and Runge-Kutta-Dopri5 Steppers with dense output. -

-
-

- fpu.cpp -

-
-

- The Fermi-Pasta-Ulam (FPU) example shows how odeint can be used - to integrate lattice systems. -

-
-

- generation_functions.cpp -

-
-

- Shows skeletal code on how to implement own factory functions. -

-
-

- harmonic_oscillator.cpp -

-
-

- The harmonic oscillator examples gives a brief introduction to - odeint and shows the usage of the classical Runge-Kutta-solvers. -

-
-

- harmonic_oscillator_units.cpp -

-
-

- This examples shows how Boost.Units - can be used with odeint. -

-
-

- heun.cpp -

-
-

- The Heun example shows how an custom Runge-Kutta stepper can be - created with odeint generic Runge-Kutta method. -

-
-

- list_lattice.cpp -

-
-

- Example of a phase lattice integration using std::list - as state type. -

-
-

- lorenz_point.cpp -

-
-

- Alternative way of integrating lorenz by using a self defined point3d - data type as state type. -

-
-

- my_vector.cpp -

-
-

- Simple example showing how to get odeint to work with a self-defined - vector type. -

-
-

- phase_oscillator_ensemble.cpp -

-
-

- The phase oscillator ensemble example shows how globally coupled - oscillators can be analyzed and how statistical measures can be - computed during integration. -

-
-

- resizing_lattice.cpp -

-
-

- Shows the strength of odeint's memory management by simulating - a Hamiltonian system on an expanding lattice. -

-
-

- simple1d.cpp -

-
-

- Integrating a simple, one-dimensional ODE showing the usage of - integrate- and generate-functions. -

-
-

- solar_system.cpp -

-
-

- The solar system example shows the usage of the symplectic solvers. -

-
-

- stepper_details.cpp -

-
-

- Trivial example showing the usability of the several stepper classes. -

-
-

- stiff_system.cpp -

-
-

- The stiff system example shows the usage of the stiff solvers using - the Jacobian of the system function. -

-
-

- stochastic_euler.cpp -

-
-

- Implementation of a custom stepper - the stochastic euler - for - solving stochastic differential equations. -

-
-

- stuart_landau.cpp -

-
-

- The Stuart-Landau example shows how odeint can be used with complex - state types. -

-
-

- two_dimensional_phase_lattice.cpp -

-
-

- The 2D phase oscillator example shows how a two-dimensional lattice - works with odeint and how matrix types can be used as state types - in odeint. -

-
-

- van_der_pol_stiff.cpp -

-
-

- This stiff system example again shows the usage of the stiff solvers - by integrating the van der Pol oscillator. -

-
-

- gmpxx/lorenz_gmpxx.cpp -

-
-

- This examples integrates the Lorenz system by means of an arbitrary - precision type. -

-
-

- mtl/gauss_packet.cpp -

-
-

- The MTL-Gauss-packet example shows how the MTL can be easily used - with odeint. -

-
-

- mtl/implicit_euler_mtl.cpp -

-
-

- This examples shows the usage of the MTL implicit Euler method - with a sparse matrix type. -

-
-

- thrust/phase_oscillator_ensemble.cu -

-
-

- The Thrust phase oscillator ensemble example shows how globally - coupled oscillators can be analyzed with Thrust and CUDA, employing - the power of modern graphic devices. -

-
-

- thrust/phase_oscillator_chain.cu -

-
-

- The Thrust phase oscillator chain example shows how chains of nearest - neighbor coupled oscillators can be integrated with Thrust and - odeint. -

-
-

- thrust/lorenz_parameters.cu -

-
-

- The Lorenz parameters examples show how ensembles of ordinary differential - equations can be solved by means of Thrust to study the dependence - of an ODE on some parameters. -

-
-

- thrust/relaxation.cu -

-
-

- Another examples for the usage of Thrust. -

-
-

- ublas/lorenz_ublas.cpp -

-
-

- This example shows how the ublas vector types can be used with - odeint. -

-
-

- vexcl/lorenz_ensemble.cpp -

-
-

- This example shows how the VexCL - a framework for OpenCL computation - - can be used with odeint. -

-
-

- openmp/lorenz_ensemble_simple.cpp -

-
-

- OpenMP Lorenz attractor parameter study with continuous data. -

-
-

- openmp/lorenz_ensemble.cpp -

-
-

- OpenMP Lorenz attractor parameter study with split data. -

-
-

- openmp/lorenz_ensemble_nested.cpp -

-
-

- OpenMP Lorenz attractor parameter study with nested vector_space_algebra. -

-
-

- openmp/phase_chain.cpp -

-
-

- OpenMP nearest neighbour coupled phase chain with continuous state. -

-
-

- openmp/phase_chain_omp_state.cpp -

-
-

- OpenMP nearest neighbour coupled phase chain with split state. -

-
-

- mpi/phase_chain.cpp -

-
-

- MPI nearest neighbour coupled phase chain. -

-
-

- 2d_lattice/spreading.cpp -

-
-

- This examples shows how a vector< vector< T - > > - can be used a state type for odeint and how a resizing mechanism - of this state can be implemented. -

-
-

- quadmath/black_hole.cpp -

-
-

- This examples shows how gcc libquadmath can be used with odeint. - It provides a high precision floating point type which is adapted - to odeint in this example. -

-
-

- molecular_dynamics.cpp -

-
-

- A very basic molecular dynamics simulation with the Velocity-Verlet - method. -

-
-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/chaotic_systems_and_lyapunov_exponents.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/chaotic_systems_and_lyapunov_exponents.html deleted file mode 100644 index 4d44a0ec0..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/chaotic_systems_and_lyapunov_exponents.html +++ /dev/null @@ -1,303 +0,0 @@ - - - -Chaotic systems and Lyapunov exponents - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- In this example we present application of odeint to investigation of the - properties of chaotic deterministic systems. In mathematical terms chaotic - refers to an exponential growth of perturbations δ x. - In order to observe this exponential growth one usually solves the equations - for the tangential dynamics which is again an ordinary differential equation. - These equations are linear but time dependent and can be obtained via -

-

- d δ x / dt = J(x) δ x -

-

- where J is the Jacobian of the system under consideration. - δ x can also be interpreted as a perturbation of the original - system. In principle n of these perturbations exist, - they form a hypercube and evolve in the time. The Lyapunov exponents are - then defined as logarithmic growth rates of the perturbations. If one Lyapunov - exponent is larger then zero the nearby trajectories diverge exponentially - hence they are chaotic. If the largest Lyapunov exponent is zero one is usually - faced with periodic motion. In the case of a largest Lyapunov exponent smaller - then zero convergence to a fixed point is expected. More information's about - Lyapunov exponents and nonlinear dynamical systems can be found in many textbooks, - see for example: E. Ott "Chaos is Dynamical Systems", Cambridge. -

-

- To calculate the Lyapunov exponents numerically one usually solves the equations - of motion for n perturbations and orthonormalizes them - every k steps. The Lyapunov exponent is the average - of the logarithm of the stretching factor of each perturbation. -

-

- To demonstrate how one can use odeint to determine the Lyapunov exponents - we choose the Lorenz system. It is one of the most studied dynamical systems - in the nonlinear dynamics community. For the standard parameters it possesses - a strange attractor with non-integer dimension. The Lyapunov exponents take - values of approximately 0.9, 0 and -12. -

-

- The implementation of the Lorenz system is -

-

-

-
const double sigma = 10.0;
-const double R = 28.0;
-const double b = 8.0 / 3.0;
-
-typedef boost::array< double , 3 > lorenz_state_type;
-
-void lorenz( const lorenz_state_type &x , lorenz_state_type &dxdt , double t )
-{
-    dxdt[0] = sigma * ( x[1] - x[0] );
-    dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
-    dxdt[2] = -b * x[2] + x[0] * x[1];
-}
-
-

- We need also to integrate the set of the perturbations. This is done in parallel - to the original system, hence within one system function. Of course, we want - to use the above definition of the Lorenz system, hence the definition of - the system function including the Lorenz system itself and the perturbation - could look like: -

-

-

-
const size_t n = 3;
-const size_t num_of_lyap = 3;
-const size_t N = n + n*num_of_lyap;
-
-typedef std::tr1::array< double , N > state_type;
-typedef std::tr1::array< double , num_of_lyap > lyap_type;
-
-void lorenz_with_lyap( const state_type &x , state_type &dxdt , double t )
-{
-    lorenz( x , dxdt , t );
-
-    for( size_t l=0 ; l<num_of_lyap ; ++l )
-    {
-        const double *pert = x.begin() + 3 + l * 3;
-        double *dpert = dxdt.begin() + 3 + l * 3;
-        dpert[0] = - sigma * pert[0] + 10.0 * pert[1];
-        dpert[1] = ( R - x[2] ) * pert[0] - pert[1] - x[0] * pert[2];
-        dpert[2] = x[1] * pert[0] + x[0] * pert[1] - b * pert[2];
-    }
-}
-
-

-

-

- The perturbations are stored linearly in the state_type - behind the state of the Lorenz system. The problem of lorenz() and lorenz_with_lyap() having different - state types may be solved putting the Lorenz system inside a functor with - templatized arguments: -

-

-

-
struct lorenz
-{
-    template< class StateIn , class StateOut , class Value >
-    void operator()( const StateIn &x , StateOut &dxdt , Value t )
-    {
-        dxdt[0] = sigma * ( x[1] - x[0] );
-        dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
-        dxdt[2] = -b * x[2] + x[0] * x[1];
-    }
-};
-
-void lorenz_with_lyap( const state_type &x , state_type &dxdt , double t )
-{
-    lorenz()( x , dxdt , t );
-    ...
-}
-
-

- This works fine and lorenz_with_lyap - can be used for example via -

-
state_type x;
-// initialize x..
-
-explicit_rk4< state_type > rk4;
-integrate_n_steps( rk4 , lorenz_with_lyap , x , 0.0 , 0.01 , 1000 );
-
-

- This code snippet performs 1000 steps with constant step size 0.01. -

-

- A real world use case for the calculation of the Lyapunov exponents of Lorenz - system would always include some transient steps, just to ensure that the - current state lies on the attractor, hence it would look like -

-

-

-
state_type x;
-// initialize x
-explicit_rk4< state_type > rk4;
-integrate_n_steps( rk4 , lorenz , x , 0.0 , 0.01 , 1000 );
-
-

- The problem is now, that x - is the full state containing also the perturbations and integrate_n_steps - does not know that it should only use 3 elements. In detail, odeint and its - steppers determine the length of the system under consideration by determining - the length of the state. In the classical solvers, e.g. from Numerical Recipes, - the problem was solved by pointer to the state and an appropriate length, - something similar to -

-

-

-
void lorenz( double* x , double *dxdt , double t, void* params )
-{
-    ...
-}
-
-int system_length = 3;
-rk4( x , system_length , t , dt , lorenz );
-
-

-

-

- But odeint supports a similar and much more sophisticated concept: Boost.Range. - To make the steppers and the system ready to work with Boost.Range - the system has to be changed: -

-

-

-
struct lorenz
-{
-    template< class State , class Deriv >
-    void operator()( const State &x_ , Deriv &dxdt_ , double t ) const
-    {
-        typename boost::range_iterator< const State >::type x = boost::begin( x_ );
-        typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ );
-
-        dxdt[0] = sigma * ( x[1] - x[0] );
-        dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
-        dxdt[2] = -b * x[2] + x[0] * x[1];
-    }
-};
-
-

-

-

- This is in principle all. Now, we only have to call integrate_n_steps - with a range including only the first 3 components of x: -

-

-

-
// explicitly choose range_algebra to override default choice of array_algebra
-runge_kutta4< state_type , double , state_type , double , range_algebra > rk4;
-
-// perform 10000 transient steps
-integrate_n_steps( rk4 , lorenz() , std::make_pair( x.begin() , x.begin() + n ) , 0.0 , dt , 10000 );
-
-

-

-
- - - - - -
[Note]Note

- Note that when using Boost.Range, - we have to explicitly configure the stepper to use the range_algebra - as otherwise odeint would automatically chose the array_algebra, - which is incompatible with the usage of Boost.Range, - because the original state_type is an array. -

-

- Having integrated a sufficient number of transients steps we are now able - to calculate the Lyapunov exponents: -

-
    -
  1. - Initialize the perturbations. They are stored linearly behind the state - of the Lorenz system. The perturbations are initialized such that p - ​ij = δ ​ij, where p ​ij is the j-component - of the i.-th perturbation and δ ​ij - is the Kronecker symbol. -
  2. -
  3. - Integrate 100 steps of the full system with perturbations -
  4. -
  5. - Orthonormalize the perturbation using Gram-Schmidt orthonormalization - algorithm. -
  6. -
  7. - Repeat step 2 and 3. Every 10000 steps write the current Lyapunov exponent. -
  8. -
-

-

-
fill( x.begin()+n , x.end() , 0.0 );
-for( size_t i=0 ; i<num_of_lyap ; ++i ) x[n+n*i+i] = 1.0;
-fill( lyap.begin() , lyap.end() , 0.0 );
-
-double t = 0.0;
-size_t count = 0;
-while( true )
-{
-
-    t = integrate_n_steps( rk4 , lorenz_with_lyap , x , t , dt , 100 );
-    gram_schmidt< num_of_lyap >( x , lyap , n );
-    ++count;
-
-    if( !(count % 100000) )
-    {
-        cout << t;
-        for( size_t i=0 ; i<num_of_lyap ; ++i ) cout << "\t" << lyap[i] / t ;
-        cout << endl;
-    }
-}
-
-

-

-

- The full code can be found here: chaotic_system.cpp -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/complex_state_types.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/complex_state_types.html deleted file mode 100644 index 0475f4d72..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/complex_state_types.html +++ /dev/null @@ -1,125 +0,0 @@ - - - -Complex state types - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- Thus far we have seen several examples defined for real values. odeint can - handle complex state types, hence ODEs which are defined on complex vector - spaces, as well. An example is the Stuart-Landau oscillator -

-

- d Ψ / dt = ( 1 + i η ) Ψ + ( 1 + i α ) | Ψ |2 Ψ -

-

- where Ψ and i is a complex variable. - The definition of this ODE in C++ using complex< double > as a state - type may look as follows -

-

-

-
typedef complex< double > state_type;
-
-struct stuart_landau
-{
-    double m_eta;
-    double m_alpha;
-
-    stuart_landau( double eta = 1.0 , double alpha = 1.0 )
-    : m_eta( eta ) , m_alpha( alpha ) { }
-
-    void operator()( const state_type &x , state_type &dxdt , double t ) const
-    {
-        const complex< double > I( 0.0 , 1.0 );
-        dxdt = ( 1.0 + m_eta * I ) * x - ( 1.0 + m_alpha * I ) * norm( x ) * x;
-    }
-};
-
-

-

-

- One can also use a function instead of a functor to implement it -

-

-

-
double eta = 1.0;
-double alpha = 1.0;
-
-void stuart_landau( const state_type &x , state_type &dxdt , double t )
-{
-    const complex< double > I( 0.0 , 1.0 );
-    dxdt = ( 1.0 + m_eta * I ) * x - ( 1.0 + m_alpha * I ) * norm( x ) * x;
-}
-
-

-

-

- We strongly recommend to use the first ansatz. In this case you have explicit - control over the parameters of the system and are not restricted to use global - variables to parametrize the oscillator. -

-

- When choosing the stepper type one has to account for the "unusual" - state type: it is a single complex<double> opposed to the vector types used in the - previous examples. This means that no iterations over vector elements have - to be performed inside the stepper algorithm. Odeint already detects that - and automatically uses the vector_space_algebra - for computation. You can enforce this by supplying additional template arguments - to the stepper including the vector_space_algebra. - Details on the usage of algebras can be found in the section Adapt - your own state types. -

-

-

-
state_type x = complex< double >( 1.0 , 0.0 );
-
-const double dt = 0.1;
-
-typedef runge_kutta4< state_type > stepper_type;
-
-integrate_const( stepper_type() , stuart_landau( 2.0 , 1.0 ) , x , 0.0 , 10.0 , dt , streaming_observer( cout ) );
-
-

-

-

- The full cpp file for the Stuart-Landau example can be found here stuart_landau.cpp -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/ensembles_of_oscillators.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/ensembles_of_oscillators.html deleted file mode 100644 index da609da79..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/ensembles_of_oscillators.html +++ /dev/null @@ -1,200 +0,0 @@ - - - -Ensembles of oscillators - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- Another important high dimensional system of coupled ordinary differential - equations is an ensemble of N all-to-all coupled phase - oscillators [9] . - It is defined as -

-

- ​k / dt = ω​k + ε / N Σ​j sin( φ​j - φ​k ) -

-

- The natural frequencies ω​i of each oscillator follow - some distribution and ε is the coupling strength. We - choose here a Lorentzian distribution for ω​i. Interestingly - a phase transition can be observed if the coupling strength exceeds a critical - value. Above this value synchronization sets in and some of the oscillators - oscillate with the same frequency despite their different natural frequencies. - The transition is also called Kuramoto transition. Its behavior can be analyzed - by employing the mean field of the phase -

-

- Z = K ei Θ = 1 / N Σ​kei φ​k -

-

- The definition of the system function is now a bit more complex since we - also need to store the individual frequencies of each oscillator. -

-

-

-
typedef vector< double > container_type;
-
-
-pair< double , double > calc_mean_field( const container_type &x )
-{
-    size_t n = x.size();
-    double cos_sum = 0.0 , sin_sum = 0.0;
-    for( size_t i=0 ; i<n ; ++i )
-    {
-        cos_sum += cos( x[i] );
-        sin_sum += sin( x[i] );
-    }
-    cos_sum /= double( n );
-    sin_sum /= double( n );
-
-    double K = sqrt( cos_sum * cos_sum + sin_sum * sin_sum );
-    double Theta = atan2( sin_sum , cos_sum );
-
-    return make_pair( K , Theta );
-}
-
-
-struct phase_ensemble
-{
-    container_type m_omega;
-    double m_epsilon;
-
-    phase_ensemble( const size_t n , double g = 1.0 , double epsilon = 1.0 )
-    : m_omega( n , 0.0 ) , m_epsilon( epsilon )
-    {
-        create_frequencies( g );
-    }
-
-    void create_frequencies( double g )
-    {
-        boost::mt19937 rng;
-        boost::cauchy_distribution<> cauchy( 0.0 , g );
-        boost::variate_generator< boost::mt19937&, boost::cauchy_distribution<> > gen( rng , cauchy );
-        generate( m_omega.begin() , m_omega.end() , gen );
-    }
-
-    void set_epsilon( double epsilon ) { m_epsilon = epsilon; }
-
-    double get_epsilon( void ) const { return m_epsilon; }
-
-    void operator()( const container_type &x , container_type &dxdt , double /* t */ ) const
-    {
-        pair< double , double > mean = calc_mean_field( x );
-        for( size_t i=0 ; i<x.size() ; ++i )
-            dxdt[i] = m_omega[i] + m_epsilon * mean.first * sin( mean.second - x[i] );
-    }
-};
-
-

-

-

- Note, that we have used Z to simplify the equations - of motion. Next, we create an observer which computes the value of Z - and we record Z for different values of ε. -

-

-

-
struct statistics_observer
-{
-    double m_K_mean;
-    size_t m_count;
-
-    statistics_observer( void )
-    : m_K_mean( 0.0 ) , m_count( 0 ) { }
-
-    template< class State >
-    void operator()( const State &x , double t )
-    {
-        pair< double , double > mean = calc_mean_field( x );
-        m_K_mean += mean.first;
-        ++m_count;
-    }
-
-    double get_K_mean( void ) const { return ( m_count != 0 ) ? m_K_mean / double( m_count ) : 0.0 ; }
-
-    void reset( void ) { m_K_mean = 0.0; m_count = 0; }
-};
-
-

-

-

- Now, we do several integrations for different values of ε - and record Z. The result nicely confirms the analytical - result of the phase transition, i.e. in our example the standard deviation - of the Lorentzian is 1 such that the transition will be observed at ε = - 2. -

-

-

-
const size_t n = 16384;
-const double dt = 0.1;
-
-container_type x( n );
-
-boost::mt19937 rng;
-boost::uniform_real<> unif( 0.0 , 2.0 * M_PI );
-boost::variate_generator< boost::mt19937&, boost::uniform_real<> > gen( rng , unif );
-
-// gamma = 1, the phase transition occurs at epsilon = 2
-phase_ensemble ensemble( n , 1.0 );
-statistics_observer obs;
-
-for( double epsilon = 0.0 ; epsilon < 5.0 ; epsilon += 0.1 )
-{
-    ensemble.set_epsilon( epsilon );
-    obs.reset();
-
-    // start with random initial conditions
-    generate( x.begin() , x.end() , gen );
-
-    // calculate some transients steps
-    integrate_const( runge_kutta4< container_type >() , boost::ref( ensemble ) , x , 0.0 , 10.0 , dt );
-
-    // integrate and compute the statistics
-    integrate_const( runge_kutta4< container_type >() , boost::ref( ensemble ) , x , 0.0 , 100.0 , dt , boost::ref( obs ) );
-    cout << epsilon << "\t" << obs.get_K_mean() << endl;
-}
-
-

-

-

- The full cpp file for this example can be found here phase_oscillator_ensemble.cpp -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/harmonic_oscillator.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/harmonic_oscillator.html deleted file mode 100644 index 54402ab99..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/harmonic_oscillator.html +++ /dev/null @@ -1,528 +0,0 @@ - - - -Harmonic oscillator - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
- -

- First of all, you have to specify the data type that represents a state - x of your system. Mathematically, this usually is - an n-dimensional vector with real numbers or complex numbers as scalar - objects. For odeint the most natural way is to use vector< double > or vector< complex< double > > - to represent the system state. However, odeint can deal with other container - types as well, e.g. boost::array< double , N >, as long as it fulfills some requirements - defined below. -

-

- To integrate a differential equation numerically, one also has to define - the rhs of the equation x' = f(x). In odeint you supply - this function in terms of an object that implements the ()-operator with - a certain parameter structure. Hence, the straightforward way would be - to just define a function, e.g: -

-

-

-
/* The type of container used to hold the state vector */
-typedef std::vector< double > state_type;
-
-const double gam = 0.15;
-
-/* The rhs of x' = f(x) */
-void harmonic_oscillator( const state_type &x , state_type &dxdt , const double /* t */ )
-{
-    dxdt[0] = x[1];
-    dxdt[1] = -x[0] - gam*x[1];
-}
-
-

-

-

- The parameters of the function must follow the example above where x is the current state, here a two-component - vector containing position q and momentum p - of the oscillator, dxdt - is the derivative x' and should be filled by the function - with f(x), and t - is the current time. Note that in this example t is - not required to calculate f, however odeint expects - the function signature to have exactly three parameters (there are exception, - discussed later). -

-

- A more sophisticated approach is to implement the system as a class where - the rhs function is defined as the ()-operator of the class with the same - parameter structure as above: -

-

-

-
/* The rhs of x' = f(x) defined as a class */
-class harm_osc {
-
-    double m_gam;
-
-public:
-    harm_osc( double gam ) : m_gam(gam) { }
-
-    void operator() ( const state_type &x , state_type &dxdt , const double /* t */ )
-    {
-        dxdt[0] = x[1];
-        dxdt[1] = -x[0] - m_gam*x[1];
-    }
-};
-
-

-

-

- odeint can deal with instances of such classes instead of pure functions - which allows for cleaner code. -

-
-
- -

- Numerical integration works iteratively, that means you start at a state - x(t) and perform a time-step of length dt - to obtain the approximate state x(t+dt). There exist - many different methods to perform such a time-step each of which has a - certain order q. If the order of a method is q - than it is accurate up to term ~dtq that means the - error in x made by such a step is ~dtq+1. - odeint provides several steppers of different orders, see Stepper - overview. -

-

- Some of steppers in the table above are special: Some need the Jacobian - of the ODE, others are constructed for special ODE-systems like Hamiltonian - systems. We will show typical examples and use-cases in this tutorial and - which kind of steppers should be applied. -

-
-
- -

- The basic stepper just performs one time-step and doesn't give you any - information about the error that was made (except that you know it is of - order q+1). Such steppers are used with constant step - size that should be chosen small enough to have reasonable small errors. - However, you should apply some sort of validity check of your results (like - observing conserved quantities) because you have no other control of the - error. The following example defines a basic stepper based on the classical - Runge-Kutta scheme of 4th order. The declaration of the stepper requires - the state type as template parameter. The integration can now be done by - using the integrate_const( Stepper, System, state, start_time, end_time, step_size - ) function from odeint: -

-

-

-
runge_kutta4< state_type > stepper;
-integrate_const( stepper , harmonic_oscillator , x , 0.0 , 10.0 , 0.01 );
-
-

-

-

- This call integrates the system defined by harmonic_oscillator - using the RK4 method from t=0 to 10 - with a step-size dt=0.01 and the initial condition - given in x. The result, - x(t=10) is stored in x - (in-place). Each stepper defines a do_step - method which can also be used directly. So, you write down the above example - as -

-

-

-
const double dt = 0.01;
-for( double t=0.0 ; t<10.0 ; t+= dt )
-    stepper.do_step( harmonic_oscillator , x , t , dt );
-
-

-

-
- - - - - -
[Tip]Tip
-

- If you have a C++11 enabled compiler you can easily use lambdas to create - the system function : -

-

-

-
{
-runge_kutta4< state_type > stepper;
-integrate_const( stepper , []( const state_type &x , state_type &dxdt , double t ) {
-        dxdt[0] = x[1]; dxdt[1] = -x[0] - gam*x[1]; }
-    , x , 0.0 , 10.0 , 0.01 );
-}
-
-

-

-
-
-
- -

- To improve the numerical results and additionally minimize the computational - effort, the application of a step size control is advisable. Step size - control is realized via stepper algorithms that additionally provide an - error estimation of the applied step. odeint provides a number of such - ErrorSteppers and we will show their usage - on the example of explicit_error_rk54_ck - - a 5th order Runge-Kutta method with 4th order error estimation and coefficients - introduced by Cash and Karp. -

-

-

-
typedef runge_kutta_cash_karp54< state_type > error_stepper_type;
-
-

-

-

- Given the error stepper, one still needs an instance that checks the error - and adjusts the step size accordingly. In odeint, this is done by ControlledSteppers. For the runge_kutta_cash_karp54 - stepper a controlled_runge_kutta - stepper exists which can be used via -

-

-

-
typedef controlled_runge_kutta< error_stepper_type > controlled_stepper_type;
-controlled_stepper_type controlled_stepper;
-integrate_adaptive( controlled_stepper , harmonic_oscillator , x , 0.0 , 10.0 , 0.01 );
-
-

-

-

- As above, this integrates the system defined by harmonic_oscillator, - but now using an adaptive step size method based on the Runge-Kutta Cash-Karp - 54 scheme from t=0 to 10 with - an initial step size of dt=0.01 (will be adjusted) - and the initial condition given in x. The result, x(t=10), - will also be stored in x (in-place). -

-

- In the above example an error stepper is nested in a controlled stepper. - This is a nice technique; however one drawback is that one always needs - to define both steppers. One could also write the instantiation of the - controlled stepper into the call of the integrate function but a complete - knowledge of the underlying stepper types is still necessary. Another point - is, that the error tolerances for the step size control are not easily - included into the controlled stepper. Both issues can be solved by using - make_controlled: -

-

-

-
integrate_adaptive( make_controlled< error_stepper_type >( 1.0e-10 , 1.0e-6 ) ,
-                    harmonic_oscillator , x , 0.0 , 10.0 , 0.01 );
-
-

-

-

- make_controlled can be - used with many of the steppers of odeint. The first parameter is the absolute - error tolerance eps_abs and the second is the relative - error tolerance eps_rel which is used during the integration. - The template parameter determines from which error stepper a controlled - stepper should be instantiated. An alternative syntax of make_controlled is -

-

-

-
integrate_adaptive( make_controlled( 1.0e-10 , 1.0e-6 , error_stepper_type() ) ,
-                    harmonic_oscillator , x , 0.0 , 10.0 , 0.01 );
-
-

-

-

- For the Runge-Kutta controller the error made during one step is compared - with eps_abs + eps_rel * ( ax * |x| + adxdt * dt * |dxdt| ). - If the error is smaller than this value the current step is accepted, otherwise - it is rejected and the step size is decreased. Note, that the step size - is also increased if the error gets too small compared to the rhs of the - above relation. The full instantiation of the controlled_runge_kutta - with all parameters is therefore -

-

-

-
double abs_err = 1.0e-10 , rel_err = 1.0e-6 , a_x = 1.0 , a_dxdt = 1.0;
-controlled_stepper_type controlled_stepper(
-    default_error_checker< double , range_algebra , default_operations >( abs_err , rel_err , a_x , a_dxdt ) );
-integrate_adaptive( controlled_stepper , harmonic_oscillator , x , 0.0 , 10.0 , 0.01 );
-
-

-

-

- When using make_controlled - the parameter ax and adxdt are - used with their standard values of 1. -

-

- In the tables below, one can find all steppers which are working with - make_controlled and make_dense_output which is the analog - for the dense output steppers. -

-
-

Table 1.2. Generation functions make_controlled( abs_error , rel_error , stepper - )

-
----- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Stepper -

-
-

- Result of make_controlled -

-
-

- Remarks -

-
-

- runge_kutta_cash_karp54 -

-
-

- controlled_runge_kutta< runge_kutta_cash_karp54 - , default_error_checker<...> > -

-
-

- ax=1, adxdt=1 -

-
-

- runge_kutta_fehlberg78 -

-
-

- controlled_runge_kutta< runge_kutta_fehlberg78 - , default_error_checker<...> > -

-
-

- ax=1, adxdt=1 -

-
-

- runge_kutta_dopri5 -

-
-

- controlled_runge_kutta< runge_kutta_dopri5 - , default_error_checker<...> > -

-
-

- a x=1, adxdt=1 -

-
-

- rosenbrock4 -

-
-

- rosenbrock4_controlled< rosenbrock4 - > -

-
-

- - -

-
-
-
-

Table 1.3. Generation functions make_dense_output( abs_error , rel_error , - stepper )

-
----- - - - - - - - - - - - - - - - - - -
-

- Stepper -

-
-

- Result of make_dense_output -

-
-

- Remarks -

-
-

- runge_kutta_dopri5 -

-
-

- dense_output_runge_kutta< controlled_runge_kutta< runge_kutta_dopri5 - , default_error_checker<...> > - > -

-
-

- a x=1, adxdt=1 -

-
-

- rosenbrock4 -

-
-

- rosenbrock4_dense_output< rosenbrock4_controller< rosenbrock4 - > > -

-
-

- - -

-
-
-

- When using make_controlled - or make_dense_output one - should be aware which exact type is used and how the step size control - works. -

-
-
- -

- odeint supports iterators for solving ODEs. That is, you instantiate a - pair of iterators and instead of using the integrate routines with an appropriate - observer you put the iterators in one of the algorithm from the C++ standard - library or from Boost.Range. An example is -

-

-

-
std::for_each( make_const_step_time_iterator_begin( stepper , harmonic_oscillator, x , 0.0 , 0.1 , 10.0 ) ,
-               make_const_step_time_iterator_end( stepper , harmonic_oscillator, x ) ,
-               []( std::pair< const state_type & , const double & > x ) {
-                   cout << x.second << " " << x.first[0] << " " << x.first[1] << "\n"; } );
-
-

-

-
-

- The full source file for this example can be found here: harmonic_oscillator.cpp -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/lattice_systems.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/lattice_systems.html deleted file mode 100644 index ee1326f33..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/lattice_systems.html +++ /dev/null @@ -1,183 +0,0 @@ - - - -Lattice systems - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- odeint can also be used to solve ordinary differential equations defined - on lattices. A prominent example is the Fermi-Pasta-Ulam system [8] - . It is a Hamiltonian system of nonlinear coupled harmonic oscillators. - The Hamiltonian is -

-

- H = Σ​i p​i2/2 + 1/2 ( q​i+1 - q​i )^2 + β / 4 ( q​i+1 - q​i )^4 -

-

- Remarkably, the Fermi-Pasta-Ulam system was the first numerical experiment - to be implemented on a computer. It was studied at Los Alamos in 1953 on - one of the first computers (a MANIAC I) and it triggered a whole new tree - of mathematical and physical science. -

-

- Like the Solar - System, the FPU is solved again by a symplectic solver, but in this - case we can speed up the computation because the q components - trivially reduce to dq​i / dt = p​i. odeint is capable - of doing this performance improvement. All you have to do is to call the - symplectic solver with an state function for the p components. - Here is how this function looks like -

-

-

-
typedef vector< double > container_type;
-
-struct fpu
-{
-    const double m_beta;
-
-    fpu( const double beta = 1.0 ) : m_beta( beta ) { }
-
-    // system function defining the ODE
-    void operator()( const container_type &q , container_type &dpdt ) const
-    {
-        size_t n = q.size();
-        double tmp = q[0] - 0.0;
-        double tmp2 = tmp + m_beta * tmp * tmp * tmp;
-        dpdt[0] = -tmp2;
-        for( size_t i=0 ; i<n-1 ; ++i )
-        {
-            tmp = q[i+1] - q[i];
-            tmp2 = tmp + m_beta * tmp * tmp * tmp;
-            dpdt[i] += tmp2;
-            dpdt[i+1] = -tmp2;
-        }
-        tmp = - q[n-1];
-        tmp2 = tmp + m_beta * tmp * tmp * tmp;
-        dpdt[n-1] += tmp2;
-    }
-
-    // calculates the energy of the system
-    double energy( const container_type &q , const container_type &p ) const
-    {
-        // ...
-    }
-
-    // calculates the local energy of the system
-    void local_energy( const container_type &q , const container_type &p , container_type &e ) const
-    {
-        // ...
-    }
-};
-
-

-

-

- You can also use boost::array< double , N > - for the state type. -

-

- Now, you have to define your initial values and perform the integration: -

-

-

-
const size_t n = 64;
-container_type q( n , 0.0 ) , p( n , 0.0 );
-
-for( size_t i=0 ; i<n ; ++i )
-{
-    p[i] = 0.0;
-    q[i] = 32.0 * sin( double( i + 1 ) / double( n + 1 ) * M_PI );
-}
-
-
-const double dt = 0.1;
-
-typedef symplectic_rkn_sb3a_mclachlan< container_type > stepper_type;
-fpu fpu_instance( 8.0 );
-
-integrate_const( stepper_type() , fpu_instance ,
-        make_pair( boost::ref( q ) , boost::ref( p ) ) ,
-        0.0 , 1000.0 , dt , streaming_observer( cout , fpu_instance , 10 ) );
-
-

-

-

- The observer uses a reference to the system object to calculate the local - energies: -

-

-

-
struct streaming_observer
-{
-    std::ostream& m_out;
-    const fpu &m_fpu;
-    size_t m_write_every;
-    size_t m_count;
-
-    streaming_observer( std::ostream &out , const fpu &f , size_t write_every = 100 )
-    : m_out( out ) , m_fpu( f ) , m_write_every( write_every ) , m_count( 0 ) { }
-
-    template< class State >
-    void operator()( const State &x , double t )
-    {
-        if( ( m_count % m_write_every ) == 0 )
-        {
-            container_type &q = x.first;
-            container_type &p = x.second;
-            container_type energy( q.size() );
-            m_fpu.local_energy( q , p , energy );
-            for( size_t i=0 ; i<q.size() ; ++i )
-            {
-                m_out << t << "\t" << i << "\t" << q[i] << "\t" << p[i] << "\t" << energy[i] << "\n";
-            }
-            m_out << "\n";
-            clog << t << "\t" << accumulate( energy.begin() , energy.end() , 0.0 ) << "\n";
-        }
-        ++m_count;
-    }
-};
-
-

-

-

- The full cpp file for this FPU example can be found here fpu.cpp -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/parallel_computation_with_openmp_and_mpi.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/parallel_computation_with_openmp_and_mpi.html deleted file mode 100644 index 552c391af..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/parallel_computation_with_openmp_and_mpi.html +++ /dev/null @@ -1,938 +0,0 @@ - - - -Parallel computation with OpenMP and MPI - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -

- Parallelization is a key feature for modern numerical libraries due to the - vast availability of many cores nowadays, even on Laptops. odeint currently - supports parallelization with OpenMP and MPI, as described in the following - sections. However, it should be made clear from the beginning that the difficulty - of efficiently distributing ODE integration on many cores/machines lies in - the parallelization of the system function, which is still the user's responsibility. - Simply using a parallel odeint backend without parallelizing the system function - will bring you almost no performance gains. -

-
-

-OpenMP -

-

- odeint's OpenMP support is implemented as an external backend, which needs - to be manually included. Depending on the compiler some additional flags - may be needed, i.e. -fopenmp for GCC. -

-

-

-
#include <omp.h>
-#include <boost/numeric/odeint.hpp>
-#include <boost/numeric/odeint/external/openmp/openmp.hpp>
-
-

-

-

- In the easiest parallelization approach with OpenMP we use a standard - vector as the state type: -

-

-

-
typedef std::vector< double > state_type;
-
-

-

-

- We initialize the state with some random data: -

-

-

-
size_t N = 131101;
-state_type x( N );
-boost::random::uniform_real_distribution<double> distribution( 0.0 , 2.0*pi );
-boost::random::mt19937 engine( 0 );
-generate( x.begin() , x.end() , boost::bind( distribution , engine ) );
-
-

-

-

- Now we have to configure the stepper to use the OpenMP backend. This is - done by explicitly providing the openmp_range_algebra - as a template parameter to the stepper. This algebra requires the state - type to be a model of Random Access Range and will be used from multiple - threads by the algebra. -

-

-

-
typedef runge_kutta4<
-                  state_type , double ,
-                  state_type , double ,
-                  openmp_range_algebra
-                > stepper_type;
-
-

-

-

- Additional to providing the stepper with OpenMP parallelization we also - need a parallelized system function to exploit the available cores. Here - this is shown for a simple one-dimensional chain of phase oscillators with - nearest neighbor coupling: -

-

-

-
struct phase_chain
-{
-    phase_chain( double gamma = 0.5 )
-    : m_gamma( gamma ) { }
-
-    void operator()( const state_type &x , state_type &dxdt , double /* t */ ) const
-    {
-        const size_t N = x.size();
-        #pragma omp parallel for schedule(runtime)
-        for(size_t i = 1 ; i < N - 1 ; ++i)
-        {
-            dxdt[i] = coupling_func( x[i+1] - x[i] ) +
-                      coupling_func( x[i-1] - x[i] );
-        }
-        dxdt[0  ] = coupling_func( x[1  ] - x[0  ] );
-        dxdt[N-1] = coupling_func( x[N-2] - x[N-1] );
-    }
-
-    double coupling_func( double x ) const
-    {
-        return sin( x ) - m_gamma * ( 1.0 - cos( x ) );
-    }
-
-    double m_gamma;
-};
-
-

-

-
- - - - - -
[Note]Note

- In the OpenMP backends the system function will always be called sequentially - from the thread used to start the integration. -

-

- Finally, we perform the integration by using one of the integrate functions - from odeint. As you can see, the parallelization is completely hidden in - the stepper and the system function. OpenMP will take care of distributing - the work among the threads and join them automatically. -

-

-

-
integrate_n_steps( stepper_type() , phase_chain( 1.2 ) ,
-                   x , 0.0 , 0.01 , 100 );
-
-

-

-

- After integrating, the data can be accessed immediately and be processed - further. Note, that you can specify the OpenMP scheduling by calling omp_set_schedule in the beginning of - your program: -

-

-

-
int chunk_size = N/omp_get_max_threads();
-omp_set_schedule( omp_sched_static , chunk_size );
-
-

-

-

- See openmp/phase_chain.cpp for the complete - example. -

-
- - Split - state -
-

- For advanced cases odeint offers another approach to use OpenMP that allows - for a more exact control of the parallelization. For example, for odd-sized - data where OpenMP's thread boundaries don't match cache lines and hurt - performance it might be advisable to copy the data from the continuous - vector<T> - into separate, individually aligned, vectors. For this, odeint provides - the openmp_state<T> - type, essentially an alias for vector<vector<T>>. -

-

- Here, the initialization is done with a vector<double>, but then we use odeint's split function to fill an openmp_state. The splitting is done such - that the sizes of the individual regions differ at most by 1 to make the - computation as uniform as possible. -

-

-

-
const size_t N = 131101;
-vector<double> x( N );
-boost::random::uniform_real_distribution<double> distribution( 0.0 , 2.0*pi );
-boost::random::mt19937 engine( 0 );
-generate( x.begin() , x.end() , boost::bind( distribution , engine ) );
-const size_t blocks = omp_get_max_threads();
-state_type x_split( blocks );
-split( x , x_split );
-
-

-

-

- Of course, the system function has to be changed to deal with the openmp_state. Note that each sub-region - of the state is computed in a single task, but at the borders read access - to the neighbouring regions is required. -

-

-

-
struct phase_chain_omp_state
-{
-    phase_chain_omp_state( double gamma = 0.5 )
-    : m_gamma( gamma ) { }
-
-    void operator()( const state_type &x , state_type &dxdt , double /* t */ ) const
-    {
-        const size_t N = x.size();
-        #pragma omp parallel for schedule(runtime)
-        for(size_t n = 0 ; n < N ; ++n)
-        {
-            const size_t M = x[n].size();
-            for(size_t m = 1 ; m < M-1 ; ++m)
-            {
-                dxdt[n][m] = coupling_func( x[n][m+1] - x[n][m] ) +
-                             coupling_func( x[n][m-1] - x[n][m] );
-            }
-            dxdt[n][0] = coupling_func( x[n][1] - x[n][0] );
-            if( n > 0 )
-            {
-                dxdt[n][0] += coupling_func( x[n-1].back() - x[n].front() );
-            }
-            dxdt[n][M-1] = coupling_func( x[n][M-2] - x[n][M-1] );
-            if( n < N-1 )
-            {
-                dxdt[n][M-1] += coupling_func( x[n+1].front() - x[n].back() );
-            }
-        }
-    }
-
-    double coupling_func( double x ) const
-    {
-        return sin( x ) - m_gamma * ( 1.0 - cos( x ) );
-    }
-
-    double m_gamma;
-};
-
-

-

-

- Using the openmp_state<T> state type automatically selects openmp_algebra which executes odeint's - internal computations on parallel regions. Hence, no manual configuration - of the stepper is necessary. At the end of the integration, we use unsplit to concatenate the sub-regions - back together into a single vector. -

-

-

-
integrate_n_steps( runge_kutta4<state_type>() , phase_chain_omp_state( 1.2 ) ,
-                   x_split , 0.0 , 0.01 , 100 );
-unsplit( x_split , x );
-
-

-

-
- - - - - -
[Note]Note

- You don't actually need to use openmp_state<T> for advanced use cases, openmp_algebra is simply an alias for - openmp_nested_algebra<range_algebra> and supports any model of Random - Access Range as the outer, parallel state type, and will use the given - algebra on its elements. -

-

- See openmp/phase_chain_omp_state.cpp for - the complete example. -

-
-
-

-MPI -

-

- To expand the parallel computation across multiple machines we can use - MPI. -

-

- The system function implementation is similar to the OpenMP variant with - split data, the main difference being that while OpenMP uses a spawn/join - model where everything not explicitly paralleled is only executed in the - main thread, in MPI's model each node enters the main() method independently, diverging based - on its rank and synchronizing through message-passing and explicit barriers. -

-

- odeint's MPI support is implemented as an external backend, too. Depending - on the MPI implementation the code might need to be compiled with i.e. - mpic++. -

-

-

-
#include <boost/numeric/odeint.hpp>
-#include <boost/numeric/odeint/external/mpi/mpi.hpp>
-
-

-

-

- Instead of reading another thread's data, we asynchronously send and receive - the relevant data from neighbouring nodes, performing some computation - in the interim to hide the latency. -

-

-

-
struct phase_chain_mpi_state
-{
-    phase_chain_mpi_state( double gamma = 0.5 )
-    : m_gamma( gamma ) { }
-
-    void operator()( const state_type &x , state_type &dxdt , double /* t */ ) const
-    {
-        const size_t M = x().size();
-        const bool have_left = x.world.rank() > 0,
-                   have_right = x.world.rank() < x.world.size()-1;
-        double x_left, x_right;
-        boost::mpi::request r_left, r_right;
-        if( have_left )
-        {
-            x.world.isend( x.world.rank()-1 , 0 , x().front() ); // send to x_right
-            r_left = x.world.irecv( x.world.rank()-1 , 0 , x_left ); // receive from x().back()
-        }
-        if( have_right )
-        {
-            x.world.isend( x.world.rank()+1 , 0 , x().back() ); // send to x_left
-            r_right = x.world.irecv( x.world.rank()+1 , 0 , x_right ); // receive from x().front()
-        }
-        for(size_t m = 1 ; m < M-1 ; ++m)
-        {
-            dxdt()[m] = coupling_func( x()[m+1] - x()[m] ) +
-                        coupling_func( x()[m-1] - x()[m] );
-        }
-        dxdt()[0] = coupling_func( x()[1] - x()[0] );
-        if( have_left )
-        {
-            r_left.wait();
-            dxdt()[0] += coupling_func( x_left - x().front() );
-        }
-        dxdt()[M-1] = coupling_func( x()[M-2] - x()[M-1] );
-        if( have_right )
-        {
-            r_right.wait();
-            dxdt()[M-1] += coupling_func( x_right - x().back() );
-        }
-    }
-
-    double coupling_func( double x ) const
-    {
-        return sin( x ) - m_gamma * ( 1.0 - cos( x ) );
-    }
-
-    double m_gamma;
-};
-
-

-

-

- Analogous to openmp_state<T> we use mpi_state< InnerState<T> >, - which automatically selects mpi_nested_algebra - and the appropriate MPI-oblivious inner algebra (since our inner state - is a vector, the inner - algebra will be range_algebra - as in the OpenMP example). -

-

-

-
typedef mpi_state< vector<double> > state_type;
-
-

-

-

- In the main program we construct a communicator - which tells us the size - of the cluster and the current node's rank - within that. We generate the input data on the master node only, avoiding - unnecessary work on the other nodes. Instead of simply copying chunks, - split acts as a MPI collective - function here and sends/receives regions from master to each slave. The - input argument is ignored on the slaves, but the master node receives a - region in its output and will participate in the computation. -

-

-

-
boost::mpi::environment env( argc , argv );
-boost::mpi::communicator world;
-
-const size_t N = 131101;
-vector<double> x;
-if( world.rank() == 0 )
-{
-    x.resize( N );
-    boost::random::uniform_real_distribution<double> distribution( 0.0 , 2.0*pi );
-    boost::random::mt19937 engine( 0 );
-    generate( x.begin() , x.end() , boost::bind( distribution , engine ) );
-}
-
-state_type x_split( world );
-split( x , x_split );
-
-

-

-

- Now that x_split contains - (only) the local chunk for each node, we start the integration. -

-

- To print the result on the master node, we send the processed data back - using unsplit. -

-

-

-
integrate_n_steps( runge_kutta4<state_type>() , phase_chain_mpi_state( 1.2 ) ,
-                   x_split , 0.0 , 0.01 , 100 );
-unsplit( x_split , x );
-
-

-

-
- - - - - -
[Note]Note

- mpi_nested_algebra::for_eachN - doesn't use any MPI constructs, it simply calls the inner algebra on - the local chunk and the system function is not guarded by any barriers - either, so if you don't manually place any (for example in parameter - studies cases where the elements are completely independent) you might - see the nodes diverging, returning from this call at different times. -

-

- See mpi/phase_chain.cpp for the complete example. -

-
-
- - -
- -

- As used by mpi_nested_algebra. -

-
- - Notation -
-
-

-
-
InnerState
-

- The inner state type -

-
State
-

- The MPI-state type -

-
state
-

- Object of type State -

-
world
-

- Object of type boost::mpi::communicator -

-
-
-
- - Valid - Expressions -
-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Construct a state with a communicator -

-
-

- State(world) -

-
-

- State -

-
-

- Constructs the State. -

-
-

- Construct a state with the default communicator -

-
-

- State() -

-
-

- State -

-
-

- Constructs the State. -

-
-

- Get the current node's inner state -

-
-

- state() -

-
-

- InnerState -

-
-

- Returns a (const) reference. -

-
-

- Get the communicator -

-
-

- state.world -

-
-

- boost::mpi::communicator -

-
-

- See Boost.MPI. -

-
-
- - Models -
-
  • - mpi_state<InnerState> -
-
-
- -

- As used by openmp_nested_algebra, - essentially a Random Access Container with ValueType - = InnerState. -

-
- - Notation -
-
-

-
-
InnerState
-

- The inner state type -

-
State
-

- The split state type -

-
state
-

- Object of type State -

-
-
-
- - Valid - Expressions -
-
------ - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Construct a state for n - chunks -

-
-

- State(n) -

-
-

- State -

-
-

- Constructs underlying vector. -

-
-

- Get a chunk -

-
-

- state[i] -

-
-

- InnerState -

-
-

- Accesses underlying vector. -

-
-

- Get the number of chunks -

-
-

- state.size() -

-
-

- size_type -

-
-

- Returns size of underlying vector. -

-
-
- - Models -
-
  • - openmp_state<ValueType> - with InnerState = vector<ValueType> -
-
-
- -
- - Notation -
-
-

-
-
Container1
-

- The continuous-data container type -

-
x
-

- Object of type Container1 -

-
Container2
-

- The chunked-data container type -

-
y
-

- Object of type Container2 -

-
-
-
- - Valid - Expressions -
-
------ - - - - - - - - - - - - - - - - - - - - -
-

- Name -

-
-

- Expression -

-
-

- Type -

-
-

- Semantics -

-
-

- Copy chunks of input to output elements -

-
-

- split(x, - y) -

-
-

- void -

-
-

- Calls split_impl<Container1, Container2>::split(x, y), splits x - into y.size() - chunks. -

-
-

- Join chunks of input elements to output -

-
-

- unsplit(y, - x) -

-
-

- void -

-
-

- Calls unsplit_impl<Container2, Container1>::unsplit(y, x), assumes x - is of the correct size σ y[i].size(), does not resize - x. -

-
-
- - Models -
-
    -
  • - defined for Container1 - = Boost.Range - and Container2 = - openmp_state -
  • -
  • - and Container2 = - mpi_state. -
  • -
-

- To implement splitters for containers incompatible with Boost.Range, - specialize the split_impl - and unsplit_impl types: -

-
template< class Container1, class Container2 , class Enabler = void >
-struct split_impl {
-    static void split( const Container1 &from , Container2 &to );
-};
-
-template< class Container2, class Container1 , class Enabler = void >
-struct unsplit_impl {
-    static void unsplit( const Container2 &from , Container1 &to );
-};
-
-

-

-
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/self_expanding_lattices.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/self_expanding_lattices.html deleted file mode 100644 index 6e9bd99b4..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/self_expanding_lattices.html +++ /dev/null @@ -1,228 +0,0 @@ - - - -Self expanding lattices - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- odeint supports changes of the state size during integration if a state_type - is used which can be resized, like std::vector. - The adjustment of the state's size has to be done from outside and the stepper - has to be instantiated with always_resizer - as the template argument for the resizer_type. - In this configuration, the stepper checks for changes in the state size and - adjust it's internal storage accordingly. -

-

- We show this for a Hamiltonian system of nonlinear, disordered oscillators - with nonlinear nearest neighbor coupling. -

-

- The system function is implemented in terms of a class that also provides - functions for calculating the energy. Note, that this class stores the random - potential internally which is not resized, but rather a start index is kept - which should be changed whenever the states' size change. -

-

-

-
typedef vector< double > coord_type;
-typedef pair< coord_type , coord_type > state_type;
-
-struct compacton_lattice
-{
-    const int m_max_N;
-    const double m_beta;
-    int m_pot_start_index;
-    vector< double > m_pot;
-
-    compacton_lattice( int max_N , double beta , int pot_start_index )
-        : m_max_N( max_N ) , m_beta( beta ) , m_pot_start_index( pot_start_index ) , m_pot( max_N )
-    {
-        srand( time( NULL ) );
-        // fill random potential with iid values from [0,1]
-        boost::mt19937 rng;
-        boost::uniform_real<> unif( 0.0 , 1.0 );
-        boost::variate_generator< boost::mt19937&, boost::uniform_real<> > gen( rng , unif );
-        generate( m_pot.begin() , m_pot.end() , gen );
-    }
-
-    void operator()( const coord_type &q , coord_type &dpdt )
-    {
-        // calculate dpdt = -dH/dq of this hamiltonian system
-        // dp_i/dt = - V_i * q_i^3 - beta*(q_i - q_{i-1})^3 + beta*(q_{i+1} - q_i)^3
-        const int N = q.size();
-        double diff = q[0] - q[N-1];
-        for( int i=0 ; i<N ; ++i )
-        {
-            dpdt[i] = - m_pot[m_pot_start_index+i] * q[i]*q[i]*q[i] -
-                    m_beta * diff*diff*diff;
-            diff = q[(i+1) % N] - q[i];
-            dpdt[i] += m_beta * diff*diff*diff;
-        }
-    }
-
-    void energy_distribution( const coord_type &q , const coord_type &p , coord_type &energies )
-    {
-        // computes the energy per lattice site normalized by total energy
-        const size_t N = q.size();
-        double en = 0.0;
-        for( size_t i=0 ; i<N ; i++ )
-        {
-            const double diff = q[(i+1) % N] - q[i];
-            energies[i] = p[i]*p[i]/2.0
-                + m_pot[m_pot_start_index+i]*q[i]*q[i]*q[i]*q[i]/4.0
-                + m_beta/4.0 * diff*diff*diff*diff;
-            en += energies[i];
-        }
-        en = 1.0/en;
-        for( size_t i=0 ; i<N ; i++ )
-        {
-            energies[i] *= en;
-        }
-    }
-
-    double energy( const coord_type &q , const coord_type &p )
-    {
-        // calculates the total energy of the excitation
-        const size_t N = q.size();
-        double en = 0.0;
-        for( size_t i=0 ; i<N ; i++ )
-        {
-            const double diff = q[(i+1) % N] - q[i];
-            en += p[i]*p[i]/2.0
-                + m_pot[m_pot_start_index+i]*q[i]*q[i]*q[i]*q[i] / 4.0
-                + m_beta/4.0 * diff*diff*diff*diff;
-        }
-        return en;
-    }
-
-    void change_pot_start( const int delta )
-    {
-        m_pot_start_index += delta;
-    }
-};
-
-

-

-

- The total size we allow is 1024 and we start with an initial state size of - 60. -

-

-

-
//start with 60 sites
-const int N_start = 60;
-coord_type q( N_start , 0.0 );
-q.reserve( max_N );
-coord_type p( N_start , 0.0 );
-p.reserve( max_N );
-// start with uniform momentum distribution over 20 sites
-fill( p.begin()+20 , p.end()-20 , 1.0/sqrt(20.0) );
-
-coord_type distr( N_start , 0.0 );
-distr.reserve( max_N );
-
-// create the system
-compacton_lattice lattice( max_N , beta , (max_N-N_start)/2 );
-
-//create the stepper, note that we use an always_resizer because state size might change during steps
-typedef symplectic_rkn_sb3a_mclachlan< coord_type , coord_type , double , coord_type , coord_type , double ,
-        range_algebra , default_operations , always_resizer > hamiltonian_stepper;
-hamiltonian_stepper stepper;
-hamiltonian_stepper::state_type state = make_pair( q , p );
-
-

-

-

- The lattice gets resized whenever the energy distribution comes close to - the borders distr[10] > - 1E-150, distr[distr.size()-10] > - 1E-150. If we increase to the left, - q and p - have to be rotated because their resize function always appends at the end. - Additionally, the start index of the potential changes in this case. -

-

-

-
double t = 0.0;
-const double dt = 0.1;
-const int steps = 10000;
-for( int step = 0 ; step < steps ; ++step )
-{
-    stepper.do_step( boost::ref(lattice) , state , t , dt );
-    lattice.energy_distribution( state.first , state.second , distr );
-    if( distr[10] > 1E-150 )
-    {
-        do_resize( state.first , state.second , distr , state.first.size()+20 );
-        rotate( state.first.begin() , state.first.end()-20 , state.first.end() );
-        rotate( state.second.begin() , state.second.end()-20 , state.second.end() );
-        lattice.change_pot_start( -20 );
-        cout << t << ": resized left to " << distr.size() << ", energy = " << lattice.energy( state.first , state.second ) << endl;
-    }
-    if( distr[distr.size()-10] > 1E-150 )
-    {
-        do_resize( state.first , state.second , distr , state.first.size()+20 );
-        cout << t << ": resized right to " << distr.size() << ", energy = " << lattice.energy( state.first , state.second ) << endl;
-    }
-    t += dt;
-}
-
-

-

-

- The do_resize function simply - calls vector.resize of q - , p and distr. -

-

-

-
void do_resize( coord_type &q , coord_type &p , coord_type &distr , const int N )
-{
-    q.resize( N );
-    p.resize( N );
-    distr.resize( N );
-}
-
-

-

-

- The full example can be found in resizing_lattice.cpp -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/solar_system.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/solar_system.html deleted file mode 100644 index 1ff1360d9..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/solar_system.html +++ /dev/null @@ -1,317 +0,0 @@ - - - -Solar system - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -
- -

- The next example in this tutorial is a simulation of the outer solar system, - consisting of the sun, Jupiter, Saturn, Uranus, Neptune and Pluto. -

-

- solar_system -

-

- Each planet and of course the sun will be represented by mass points. The - interaction force between each object is the gravitational force which - can be written as -

-

- F​ij = -γ m​i m​j ( q​i - q​j ) / | q​i - q​j | 3 -

-

- where γ is the gravitational constant, m​i - and m​j are the masses and q​i - and q​j are the locations of the two objects. The equations - of motion are then -

-

- dq​i / dt = p​i -

-

- dp​i / dt = 1 / m​i Σ​ji F​ij -

-

- where p​i is the momenta of object i. - The equations of motion can also be derived from the Hamiltonian -

-

- H = Σ​i p​i2 / ( 2 m​i ) + Σ​j V( q​i , q​j ) -

-

- with the interaction potential V(q​i,q​j). The Hamiltonian - equations give the equations of motion -

-

- dq​i / dt = dH / dp​i -

-

- dp​i / dt = -dH / dq​i -

-

- In time independent Hamiltonian system the energy and the phase space volume - are conserved and special integration methods have to be applied in order - to ensure these conservation laws. The odeint library provides classes - for separable Hamiltonian systems, which can be written in the form H - = Σ -p​i2 / (2m​i) + H​q(q), where H​q(q) only - depends on the coordinates. Although this functional form might look a - bit arbitrary, it covers nearly all classical mechanical systems with inertia - and without dissipation, or where the equations of motion can be written - in the form dq​i / dt = p​i / m​i , dp​i / dt = - f( q​i ). -

-
- - - - - -
[Note]Note

- A short physical note: While the two-body-problem is known to be integrable, - that means it can be solved with purely analytic techniques, already - the three-body-problem is not solvable. This was found in the end of - the 19th century by H. Poincare which led to the whole new subject of - Chaos Theory. -

-
-
- -

- To implement this system we define a 3D point type which will represent - the space as well as the velocity. Therefore, we use the operators from - Boost.Operators: -

-

-

-
/*the point type */
-template< class T , size_t Dim >
-class point :
-    boost::additive1< point< T , Dim > ,
-    boost::additive2< point< T , Dim  > , T ,
-    boost::multiplicative2< point< T , Dim > , T
-    > > >
-    {
-    public:
-
-        const static size_t dim = Dim;
-        typedef T value_type;
-        typedef point< value_type , dim > point_type;
-
-        // ...
-        // constructors
-
-        // ...
-        // operators
-
-    private:
-
-        T m_val[dim];
-    };
-
-    //...
-    // more operators
-
-

-

-

- The next step is to define a container type storing the values of q - and p and to define system functions. As container - type we use boost::array -

-

-

-
// we simulate 5 planets and the sun
-const size_t n = 6;
-
-typedef point< double , 3 > point_type;
-typedef boost::array< point_type , n > container_type;
-typedef boost::array< double , n > mass_type;
-
-

-

-

- The container_type is different - from the state type of the ODE. The state type of the ode is simply a - pair< - container_type , - container_type > - since it needs the information about the coordinates and the momenta. -

-

- Next we define the system's equations. As we will use a stepper that accounts - for the Hamiltonian (energy-preserving) character of the system, we have - to define the rhs different from the usual case where it is just a single - function. The stepper will make use of the separable character, which means - the system will be defined by two objects representing f(p) = - -dH/dq and g(q) = dH/dp: -

-

-

-
const double gravitational_constant = 2.95912208286e-4;
-
-struct solar_system_coor
-{
-    const mass_type &m_masses;
-
-    solar_system_coor( const mass_type &masses ) : m_masses( masses ) { }
-
-    void operator()( const container_type &p , container_type &dqdt ) const
-    {
-        for( size_t i=0 ; i<n ; ++i )
-            dqdt[i] = p[i] / m_masses[i];
-    }
-};
-
-

-

-

-

-
struct solar_system_momentum
-{
-    const mass_type &m_masses;
-
-    solar_system_momentum( const mass_type &masses ) : m_masses( masses ) { }
-
-    void operator()( const container_type &q , container_type &dpdt ) const
-    {
-        const size_t n = q.size();
-        for( size_t i=0 ; i<n ; ++i )
-        {
-            dpdt[i] = 0.0;
-            for( size_t j=0 ; j<i ; ++j )
-            {
-                point_type diff = q[j] - q[i];
-                double d = abs( diff );
-                diff *= ( gravitational_constant * m_masses[i] * m_masses[j] / d / d / d );
-                dpdt[i] += diff;
-                dpdt[j] -= diff;
-
-            }
-        }
-    }
-};
-
-

-

-

- In general a three body-system is chaotic, hence we can not expect that - arbitrary initial conditions of the system will lead to a solution comparable - with the solar system dynamics. That is we have to define proper initial - conditions, which are taken from the book of Hairer, Wannier, Lubich [4] . -

-

- As mentioned above, we need to use some special integrators in order to - conserve phase space volume. There is a well known family of such integrators, - the so-called Runge-Kutta-Nystroem solvers, which we apply here in terms - of a symplectic_rkn_sb3a_mclachlan - stepper: -

-

-

-
typedef symplectic_rkn_sb3a_mclachlan< container_type > stepper_type;
-const double dt = 100.0;
-
-integrate_const(
-        stepper_type() ,
-        make_pair( solar_system_coor( masses ) , solar_system_momentum( masses ) ) ,
-        make_pair( boost::ref( q ) , boost::ref( p ) ) ,
-        0.0 , 200000.0 , dt , streaming_observer( cout ) );
-
-

-

-

- These integration routine was used to produce the above sketch of the solar - system. Note, that there are two particularities in this example. First, - the state of the symplectic stepper is not container_type - but a pair of container_type. - Hence, we must pass such a pair to the integrate function. Since, we want - to pass them as references we can simply pack them into Boost.Ref. - The second point is the observer, which is called with a state type, hence - a pair of container_type. - The reference wrapper is also passed, but this is not a problem at all: -

-

-

-
struct streaming_observer
-{
-    std::ostream& m_out;
-
-    streaming_observer( std::ostream &out ) : m_out( out ) { }
-
-    template< class State >
-    void operator()( const State &x , double t ) const
-    {
-        container_type &q = x.first;
-        m_out << t;
-        for( size_t i=0 ; i<q.size() ; ++i ) m_out << "\t" << q[i];
-        m_out << "\n";
-    }
-};
-
-

-

-
- - - - - -
[Tip]Tip

- You can use C++11 lambda to create the observers -

-

- The full example can be found here: solar_system.cpp -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/stiff_systems.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/stiff_systems.html deleted file mode 100644 index 2769bdad3..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/stiff_systems.html +++ /dev/null @@ -1,171 +0,0 @@ - - - -Stiff systems - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- An important class of ordinary differential equations are so called stiff - system which are characterized by two or more time scales of different order. - Examples of such systems are found in chemical systems where reaction rates - of individual sub-reaction might differ over large ranges, for example: -

-

- d S​1 / dt = - 101 S​2 - 100 S​1 -

-

- d S​2 / dt = S​1 -

-

- In order to efficiently solve stiff systems numerically the Jacobian -

-

- J = d f​i / d x​j -

-

- is needed. Here is the definition of the above example -

-

-

-
typedef boost::numeric::ublas::vector< double > vector_type;
-typedef boost::numeric::ublas::matrix< double > matrix_type;
-
-struct stiff_system
-{
-    void operator()( const vector_type &x , vector_type &dxdt , double /* t */ )
-    {
-        dxdt[ 0 ] = -101.0 * x[ 0 ] - 100.0 * x[ 1 ];
-        dxdt[ 1 ] = x[ 0 ];
-    }
-};
-
-struct stiff_system_jacobi
-{
-    void operator()( const vector_type & /* x */ , matrix_type &J , const double & /* t */ , vector_type &dfdt )
-    {
-        J( 0 , 0 ) = -101.0;
-        J( 0 , 1 ) = -100.0;
-        J( 1 , 0 ) = 1.0;
-        J( 1 , 1 ) = 0.0;
-        dfdt[0] = 0.0;
-        dfdt[1] = 0.0;
-    }
-};
-
-

-

-

- The state type has to be a ublas::vector - and the matrix type must by a ublas::matrix - since the stiff integrator only accepts these types. However, you might want - use non-stiff integrators on this system, too - we will do so later for demonstration. - Therefore we want to use the same function also with other state_types, realized - by templatizing the operator(): -

-

-

-
typedef boost::numeric::ublas::vector< double > vector_type;
-typedef boost::numeric::ublas::matrix< double > matrix_type;
-
-struct stiff_system
-{
-    template< class State >
-    void operator()( const State &x , State &dxdt , double t )
-    {
-        ...
-    }
-};
-
-struct stiff_system_jacobi
-{
-    template< class State , class Matrix >
-    void operator()( const State &x , Matrix &J , const double &t , State &dfdt )
-    {
-        ...
-    }
-};
-
-

-

-

- Now you can use stiff_system - in combination with std::vector or boost::array. - In the example the explicit time derivative of f(x,t) - is introduced separately in the Jacobian. If df / dt = 0 - simply fill dfdt with zeros. -

-

- A well know solver for stiff systems is the Rosenbrock method. It has a step - size control and dense output facilities and can be used like all the other - steppers: -

-

-

-
vector_type x( 2 , 1.0 );
-
-size_t num_of_steps = integrate_const( make_dense_output< rosenbrock4< double > >( 1.0e-6 , 1.0e-6 ) ,
-        make_pair( stiff_system() , stiff_system_jacobi() ) ,
-        x , 0.0 , 50.0 , 0.01 ,
-        cout << phoenix::arg_names::arg2 << " " << phoenix::arg_names::arg1[0] << "\n" );
-
-

-

-

- During the integration 71 steps have been done. Comparing to a classical - Runge-Kutta solver this is a very good result. For example the Dormand-Prince - 5 method with step size control and dense output yields 1531 steps. -

-

-

-
vector_type x2( 2 , 1.0 );
-
-size_t num_of_steps2 = integrate_const( make_dense_output< runge_kutta_dopri5< vector_type > >( 1.0e-6 , 1.0e-6 ) ,
-        stiff_system() , x2 , 0.0 , 50.0 , 0.01 ,
-        cout << phoenix::arg_names::arg2 << " " << phoenix::arg_names::arg1[0] << "\n" );
-
-

-

-

- Note, that we have used Boost.Phoenix, - a great functional programming library, to create and compose the observer. -

-

- The full example can be found here: stiff_system.cpp -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_arbitrary_precision_floating_point_types.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_arbitrary_precision_floating_point_types.html deleted file mode 100644 index d4884b773..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_arbitrary_precision_floating_point_types.html +++ /dev/null @@ -1,118 +0,0 @@ - - - -Using arbitrary precision floating point types - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- Sometimes one needs results with higher precision than provided by the standard - floating point types. As odeint allows to configure the fundamental numerical - type, it is well suited to be run with arbitrary precision types. Therefore, - one only needs a library that provides a type representing values with arbitrary - precision and the fundamental operations for those values. Boost.Multiprecision - is a boost library that does exactly this. Making use of Boost.Multiprecision - to solve odes with odeint is very simple, as the following example shows. -

-

- Here we use cpp_dec_float_50 - as the fundamental value type, which ensures exact computations up to 50 - decimal digits. -

-

-

-
#include <boost/numeric/odeint.hpp>
-#include <boost/multiprecision/cpp_dec_float.hpp>
-
-using namespace std;
-using namespace boost::numeric::odeint;
-
-typedef boost::multiprecision::cpp_dec_float_50 value_type;
-
-typedef boost::array< value_type , 3 > state_type;
-
-

-

-

- As exemplary ODE again the lorenz system is chosen, but here we have to make - sure all constants are initialized as high precision values. -

-

-

-
struct lorenz
-{
-    void operator()( const state_type &x , state_type &dxdt , value_type t ) const
-    {
-        const value_type sigma( 10 );
-        const value_type R( 28 );
-        const value_type b( value_type( 8 ) / value_type( 3 ) );
-
-        dxdt[0] = sigma * ( x[1] - x[0] );
-        dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
-        dxdt[2] = -b * x[2] + x[0] * x[1];
-    }
-};
-
-

-

-

- The actual integration then is straight forward: -

-

-

-
state_type x = {{ value_type( 10.0 ) , value_type( 10.0 ) , value_type( 10.0 ) }};
-
-cout.precision( 50 );
-integrate_const( runge_kutta4< state_type , value_type >() ,
-        lorenz() , x , value_type( 0.0 ) , value_type( 10.0 ) , value_type( value_type( 1.0 ) / value_type( 10.0 ) ) ,
-        streaming_observer( cout ) );
-
-

-

-

- The full example can be found at lorenz_mp.cpp. - Another example that compares the accuracy of the high precision type with - standard double can be found at cmp_precision.cpp. -

-

- Furthermore, odeint can also be run with other multiprecision libraries, - e.g. gmp. An example for this is - given in lorenz_gmpxx.cpp. -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_boost__units.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_boost__units.html deleted file mode 100644 index 2da50709b..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_boost__units.html +++ /dev/null @@ -1,211 +0,0 @@ - - - -Using boost::units - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- odeint also works well with Boost.Units - - a library for compile time unit and dimension analysis. It works by decoding - unit information into the types of values. For a one-dimensional unit you - can just use the Boost.Unit types as state type, deriv type and time type - and hand the vector_space_algebra - to the stepper definition and everything works just fine: -

-

-

-
typedef units::quantity< si::time , double > time_type;
-typedef units::quantity< si::length , double > length_type;
-typedef units::quantity< si::velocity , double > velocity_type;
-
-typedef runge_kutta4< length_type , double , velocity_type , time_type ,
-                      vector_space_algebra > stepper_type;
-
-

-

-

- If you want to solve more-dimensional problems the individual entries typically - have different units. That means that the state_type - is now possibly heterogeneous, meaning that every entry might have a different - type. To solve this problem, compile-time sequences from Boost.Fusion - can be used. -

-

- To illustrate how odeint works with Boost.Units - we use the harmonic oscillator as primary example. We start with defining - all quantities -

-

-

-
#include <boost/numeric/odeint.hpp>
-#include <boost/numeric/odeint/algebra/fusion_algebra.hpp>
-#include <boost/numeric/odeint/algebra/fusion_algebra_dispatcher.hpp>
-
-#include <boost/units/systems/si/length.hpp>
-#include <boost/units/systems/si/time.hpp>
-#include <boost/units/systems/si/velocity.hpp>
-#include <boost/units/systems/si/acceleration.hpp>
-#include <boost/units/systems/si/io.hpp>
-
-#include <boost/fusion/container.hpp>
-
-using namespace std;
-using namespace boost::numeric::odeint;
-namespace fusion = boost::fusion;
-namespace units = boost::units;
-namespace si = boost::units::si;
-
-typedef units::quantity< si::time , double > time_type;
-typedef units::quantity< si::length , double > length_type;
-typedef units::quantity< si::velocity , double > velocity_type;
-typedef units::quantity< si::acceleration , double > acceleration_type;
-typedef units::quantity< si::frequency , double > frequency_type;
-
-typedef fusion::vector< length_type , velocity_type > state_type;
-typedef fusion::vector< velocity_type , acceleration_type > deriv_type;
-
-

-

-

- Note, that the state_type - and the deriv_type are now - a compile-time fusion sequences. deriv_type - represents x' and is now different from the state type - as it has different unit definitions. Next, we define the ordinary differential - equation which is completely equivalent to the example in Harmonic - Oscillator: -

-

-

-
struct oscillator
-{
-    frequency_type m_omega;
-
-    oscillator( const frequency_type &omega = 1.0 * si::hertz ) : m_omega( omega ) { }
-
-    void operator()( const state_type &x , deriv_type &dxdt , time_type t ) const
-    {
-        fusion::at_c< 0 >( dxdt ) = fusion::at_c< 1 >( x );
-        fusion::at_c< 1 >( dxdt ) = - m_omega * m_omega * fusion::at_c< 0 >( x );
-    }
-};
-
-

-

-

- Next, we instantiate an appropriate stepper. We must explicitly parametrize - the stepper with the state_type, - deriv_type, time_type. -

-

-

-
typedef runge_kutta_dopri5< state_type , double , deriv_type , time_type > stepper_type;
-
-state_type x( 1.0 * si::meter , 0.0 * si::meter_per_second );
-
-integrate_const( make_dense_output( 1.0e-6 , 1.0e-6 , stepper_type() ) , oscillator( 2.0 * si::hertz ) ,
-                 x , 0.0 * si::second , 100.0 * si::second , 0.1 * si::second , streaming_observer( cout ) );
-
-

-

-
- - - - - -
[Note]Note

- When using compile-time sequences, the iteration over vector elements is - done by the fusion_algebra, - which is automatically chosen by odeint. For more on the state types / - algebras see chapter Adapt - your own state types. -

-

- It is quite easy but the compilation time might take very long. Furthermore, - the observer is defined a bit different -

-

-

-
struct streaming_observer
-{
-    std::ostream& m_out;
-
-    streaming_observer( std::ostream &out ) : m_out( out ) { }
-
-    struct write_element
-    {
-        std::ostream &m_out;
-        write_element( std::ostream &out ) : m_out( out ) { };
-
-        template< class T >
-        void operator()( const T &t ) const
-        {
-            m_out << "\t" << t;
-        }
-    };
-
-    template< class State , class Time >
-    void operator()( const State &x , const Time &t ) const
-    {
-        m_out << t;
-        fusion::for_each( x , write_element( m_out ) );
-        m_out << "\n";
-    }
-};
-
-

-

-
- - - - - -
[Caution]Caution

- Using Boost.Units - works nicely but compilation can be very time and memory consuming. For - example the unit test for the usage of Boost.Units - in odeint take up to 4 GB of memory at compilation. -

-

- The full cpp file for this example can be found here harmonic_oscillator_units.cpp. -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_cuda__or_openmp__tbb_______via_thrust.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_cuda__or_openmp__tbb_______via_thrust.html deleted file mode 100644 index ee477d4e1..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_cuda__or_openmp__tbb_______via_thrust.html +++ /dev/null @@ -1,713 +0,0 @@ - - - -Using CUDA (or OpenMP, TBB, ...) via Thrust - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- - -

- Modern graphic cards (graphic processing units - GPUs) can be used to speed - up the performance of time consuming algorithms by means of massive parallelization. - They are designed to execute many operations in parallel. odeint can utilize - the power of GPUs by means of CUDA and Thrust, - which is a STL-like interface for the native CUDA API. -

-
- - - - - -
[Important]Important

- Thrust also supports parallelization using OpenMP and Intel Threading Building - Blocks (TBB). You can switch between CUDA, OpenMP and TBB parallelizations - by a simple compiler switch. Hence, this also provides an easy way to get - basic OpenMP parallelization into odeint. The examples discussed below - are focused on GPU parallelization, though. -

-

- To use odeint with CUDA a few points have to be taken into account. First - of all, the problem has to be well chosen. It makes absolutely no sense to - try to parallelize the code for a three dimensional system, it is simply - too small and not worth the effort. One single function call (kernel execution) - on the GPU is slow but you can do the operation on a huge set of data with - only one call. We have experienced that the vector size over which is parallelized - should be of the order of 106 to make full use of the - GPU. Secondly, you have to use Thrust's - algorithms and functors when implementing the rhs the ODE. This might be - tricky since it involves some kind of functional programming knowledge. -

-

- Typical applications for CUDA and odeint are large systems, like lattices - or discretizations of PDE, and parameter studies. We introduce now three - examples which show how the power of GPUs can be used in combination with - odeint. -

-
- - - - - -
[Important]Important

- The full power of CUDA is only available for really large systems where - the number of coupled ordinary differential equations is of order N=106 - or larger. For smaller systems the CPU is usually much faster. You can - also integrate an ensemble of different uncoupled ODEs in parallel as shown - in the last example. -

-
- -

- The first example is the phase oscillator ensemble from the previous section: -

-

- ​k / dt = ω​k + ε / N Σ​j sin( φ​j - φ​k ). -

-

- It has a phase transition at ε = 2 in the limit of infinite - numbers of oscillators N. In the case of finite N - this transition is smeared out but still clearly visible. -

-

- Thrust and CUDA are - perfectly suited for such kinds of problems where one needs a large number - of particles (oscillators). We start by defining the state type which is - a thrust::device_vector. The content of this vector - lives on the GPU. If you are not familiar with this we recommend reading - the Getting started section on the Thrust - website. -

-

-

-
//change this to float if your device does not support double computation
-typedef double value_type;
-
-//change this to host_vector< ... > of you want to run on CPU
-typedef thrust::device_vector< value_type > state_type;
-// typedef thrust::host_vector< value_type > state_type;
-
-

-

-

- Thrust follows a functional programming approach. If you want to perform - a calculation on the GPU you usually have to call a global function like - thrust::for_each, thrust::reduce, - ... with an appropriate local functor which performs the basic operation. - An example is -

-
struct add_two
-{
-    template< class T >
-    __host__ __device__
-    void operator()( T &t ) const
-    {
-        t += T( 2 );
-    }
-};
-
-// ...
-
-thrust::for_each( x.begin() , x.end() , add_two() );
-
-

- This code generically adds two to every element in the container x. -

-

- For the purpose of integrating the phase oscillator ensemble we need -

-
    -
  • - to calculate the system function, hence the r.h.s. of the ODE. -
  • -
  • - this involves computing the mean field of the oscillator example, i.e. - the values of R and θ -
  • -
-

- The mean field is calculated in a class mean_field_calculator -

-

-

-
struct mean_field_calculator
-{
-    struct sin_functor : public thrust::unary_function< value_type , value_type >
-    {
-        __host__ __device__
-        value_type operator()( value_type x) const
-        {
-            return sin( x );
-        }
-    };
-
-    struct cos_functor : public thrust::unary_function< value_type , value_type >
-    {
-        __host__ __device__
-        value_type operator()( value_type x) const
-        {
-            return cos( x );
-        }
-    };
-
-    static std::pair< value_type , value_type > get_mean( const state_type &x )
-    {
-        value_type sin_sum = thrust::reduce(
-                thrust::make_transform_iterator( x.begin() , sin_functor() ) ,
-                thrust::make_transform_iterator( x.end() , sin_functor() ) );
-        value_type cos_sum = thrust::reduce(
-                thrust::make_transform_iterator( x.begin() , cos_functor() ) ,
-                thrust::make_transform_iterator( x.end() , cos_functor() ) );
-
-        cos_sum /= value_type( x.size() );
-        sin_sum /= value_type( x.size() );
-
-        value_type K = sqrt( cos_sum * cos_sum + sin_sum * sin_sum );
-        value_type Theta = atan2( sin_sum , cos_sum );
-
-        return std::make_pair( K , Theta );
-    }
-};
-
-

-

-

- Inside this class two member structures sin_functor - and cos_functor are defined. - They compute the sine and the cosine of a value and they are used within - a transform iterator to calculate the sum of sin(φ​k) - and cos(φ​k). The classifiers __host__ - and __device__ are CUDA - specific and define a function or operator which can be executed on the - GPU as well as on the CPU. The line -

-

-

-
value_type sin_sum = thrust::reduce(
-        thrust::make_transform_iterator( x.begin() , sin_functor() ) ,
-        thrust::make_transform_iterator( x.end() , sin_functor() ) );
-
-

-

-

- performs the calculation of this sine-sum on the GPU (or on the CPU, depending - on your thrust configuration). -

-

- The system function is defined via -

-

-

-
class phase_oscillator_ensemble
-{
-
-public:
-
-    struct sys_functor
-    {
-        value_type m_K , m_Theta , m_epsilon;
-
-        sys_functor( value_type K , value_type Theta , value_type epsilon )
-        : m_K( K ) , m_Theta( Theta ) , m_epsilon( epsilon ) { }
-
-        template< class Tuple >
-        __host__ __device__
-        void operator()( Tuple t )
-        {
-            thrust::get<2>(t) = thrust::get<1>(t) + m_epsilon * m_K * sin( m_Theta - thrust::get<0>(t) );
-        }
-    };
-
-    // ...
-
-    void operator() ( const state_type &x , state_type &dxdt , const value_type dt ) const
-    {
-        std::pair< value_type , value_type > mean_field = mean_field_calculator::get_mean( x );
-
-        thrust::for_each(
-                thrust::make_zip_iterator( thrust::make_tuple( x.begin() , m_omega.begin() , dxdt.begin() ) ),
-                thrust::make_zip_iterator( thrust::make_tuple( x.end() , m_omega.end() , dxdt.end()) ) ,
-                sys_functor( mean_field.first , mean_field.second , m_epsilon )
-                );
-    }
-
-    // ...
-};
-
-

-

-

- This class is used within the do_step - and integrate method. It - defines a member structure sys_functor - for the r.h.s. of each individual oscillator and the operator() for the use in the steppers and integrators - of odeint. The functor computes first the mean field of φ​k - and secondly calculates the whole r.h.s. of the ODE using this mean field. - Note, how nicely thrust::tuple - and thrust::zip_iterator play together. -

-

- Now we are ready to put everything together. All we have to do for making - odeint ready for using the GPU is to parametrize the stepper with the - state_type and value_type: -

-

-

-
typedef runge_kutta4< state_type , value_type , state_type , value_type > stepper_type;
-
-

-

-
- - - - - -
[Note]Note

- We have specifically define four template parameters because we have - to override the default parameter value double - with value_type to ensure - our programs runs properly if we use float - as fundamental data type. -

-

- You can also use a controlled or dense output stepper, e.g. -

-

-

-
typedef runge_kutta_dopri5< state_type , value_type , state_type , value_type > stepper_type;
-
-

-

-

- Then, it is straightforward to integrate the phase ensemble by creating - an instance of the rhs class and using an integration function: -

-

-

-
phase_oscillator_ensemble ensemble( N , 1.0 );
-
-

-

-

-

-
size_t steps1 = integrate_const( make_controlled( 1.0e-6 , 1.0e-6 , stepper_type() ) , boost::ref( ensemble ) , x , 0.0 , t_transients , dt );
-
-

-

-

- We have to use boost::ref here in order to pass the rhs class - as reference and not by value. This ensures that the natural frequencies - of each oscillator are not copied when calling integrate_const. - In the full example the performance and results of the Runge-Kutta-4 and - the Dopri5 solver are compared. -

-

- The full example can be found at phase_oscillator_example.cu. -

-
-
- -

- The next example is a large, one-dimensional chain of nearest-neighbor - coupled phase oscillators with the following equations of motion: -

-

- d φ​k / dt = ω​k + sin( φ​k+1 - φ​k ) + sin( φ​k - φ​k-1) -

-

- In principle we can use all the techniques from the previous phase oscillator - ensemble example, but we have to take special care about the coupling of - the oscillators. To efficiently implement the coupling you can use a very - elegant way employing Thrust's permutation iterator. A permutation iterator - behaves like a normal iterator on a vector but it does not iterate along - the usual order of the elements. It rather iterates along some permutation - of the elements defined by some index map. To realize the nearest neighbor - coupling we create one permutation iterator which travels one step behind - a usual iterator and another permutation iterator which travels one step - in front. The full system class is: -

-

-

-
//change this to host_vector< ... > if you want to run on CPU
-typedef thrust::device_vector< value_type > state_type;
-typedef thrust::device_vector< size_t > index_vector_type;
-//typedef thrust::host_vector< value_type > state_type;
-//typedef thrust::host_vector< size_t > index_vector_type;
-
-class phase_oscillators
-{
-
-public:
-
-    struct sys_functor
-    {
-        template< class Tuple >
-        __host__ __device__
-        void operator()( Tuple t )  // this functor works on tuples of values
-        {
-            // first, unpack the tuple into value, neighbors and omega
-            const value_type phi = thrust::get<0>(t);
-            const value_type phi_left = thrust::get<1>(t);  // left neighbor
-            const value_type phi_right = thrust::get<2>(t); // right neighbor
-            const value_type omega = thrust::get<3>(t);
-            // the dynamical equation
-            thrust::get<4>(t) = omega + sin( phi_right - phi ) + sin( phi - phi_left );
-        }
-    };
-
-    phase_oscillators( const state_type &omega )
-        : m_omega( omega ) , m_N( omega.size() ) , m_prev( omega.size() ) , m_next( omega.size() )
-    {
-        // build indices pointing to left and right neighbours
-        thrust::counting_iterator<size_t> c( 0 );
-        thrust::copy( c , c+m_N-1 , m_prev.begin()+1 );
-        m_prev[0] = 0; // m_prev = { 0 , 0 , 1 , 2 , 3 , ... , N-1 }
-
-        thrust::copy( c+1 , c+m_N , m_next.begin() );
-        m_next[m_N-1] = m_N-1; // m_next = { 1 , 2 , 3 , ... , N-1 , N-1 }
-    }
-
-    void operator() ( const state_type &x , state_type &dxdt , const value_type dt )
-    {
-        thrust::for_each(
-                thrust::make_zip_iterator(
-                        thrust::make_tuple(
-                                x.begin() ,
-                                thrust::make_permutation_iterator( x.begin() , m_prev.begin() ) ,
-                                thrust::make_permutation_iterator( x.begin() , m_next.begin() ) ,
-                                m_omega.begin() ,
-                                dxdt.begin()
-                                ) ),
-                thrust::make_zip_iterator(
-                        thrust::make_tuple(
-                                x.end() ,
-                                thrust::make_permutation_iterator( x.begin() , m_prev.end() ) ,
-                                thrust::make_permutation_iterator( x.begin() , m_next.end() ) ,
-                                m_omega.end() ,
-                                dxdt.end()) ) ,
-                sys_functor()
-                );
-    }
-
-private:
-
-    const state_type &m_omega;
-    const size_t m_N;
-    index_vector_type m_prev;
-    index_vector_type m_next;
-};
-
-

-

-

- Note, how easy you can obtain the value for the left and right neighboring - oscillator in the system functor using the permutation iterators. But, - the call of the thrust::for_each - function looks relatively complicated. Every term of the r.h.s. of the - ODE is resembled by one iterator packed in exactly the same way as it is - unpacked in the functor above. -

-

- Now we put everything together. We create random initial conditions and - decreasing frequencies such that we should get synchronization. We copy - the frequencies and the initial conditions onto the device and finally - initialize and perform the integration. As result we simply write out the - current state, hence the phase of each oscillator. -

-

-

-
// create initial conditions and omegas on host:
-vector< value_type > x_host( N );
-vector< value_type > omega_host( N );
-for( size_t i=0 ; i<N ; ++i )
-{
-    x_host[i] = 2.0 * pi * drand48();
-    omega_host[i] = ( N - i ) * epsilon; // decreasing frequencies
-}
-
-// copy to device
-state_type x = x_host;
-state_type omega = omega_host;
-
-// create stepper
-runge_kutta4< state_type , value_type , state_type , value_type > stepper;
-
-// create phase oscillator system function
-phase_oscillators sys( omega );
-
-// integrate
-integrate_const( stepper , sys , x , 0.0 , 10.0 , dt );
-
-thrust::copy( x.begin() , x.end() , std::ostream_iterator< value_type >( std::cout , "\n" ) );
-std::cout << std::endl;
-
-

-

-

- The full example can be found at phase_oscillator_chain.cu. -

-
-
- -

- Another important use case for Thrust - and CUDA are parameter studies of relatively small systems. Consider for - example the three-dimensional Lorenz system from the chaotic systems example - in the previous section which has three parameters. If you want to study - the behavior of this system for different parameters you usually have to - integrate the system for many parameter values. Using thrust and odeint - you can do this integration in parallel, hence you integrate a whole ensemble - of Lorenz systems where each individual realization has a different parameter - value. -

-

- In the following we will show how you can use Thrust - to integrate the above mentioned ensemble of Lorenz systems. We will vary - only the parameter β but it is straightforward to vary - other parameters or even two or all three parameters. Furthermore, we will - use the largest Lyapunov exponent to quantify the behavior of the system - (chaoticity). -

-

- We start by defining the range of the parameters we want to study. The - state_type is again a thrust::device_vector< value_type - >. -

-

-

-
vector< value_type > beta_host( N );
-const value_type beta_min = 0.0 , beta_max = 56.0;
-for( size_t i=0 ; i<N ; ++i )
-    beta_host[i] = beta_min + value_type( i ) * ( beta_max - beta_min ) / value_type( N - 1 );
-
-state_type beta = beta_host;
-
-

-

-

- The next thing we have to implement is the Lorenz system without perturbations. - Later, a system with perturbations is also implemented in order to calculate - the Lyapunov exponent. We will use an ansatz where each device function - calculates one particular realization of the Lorenz ensemble -

-

-

-
struct lorenz_system
-{
-    struct lorenz_functor
-    {
-        template< class T >
-        __host__ __device__
-        void operator()( T t ) const
-        {
-            // unpack the parameter we want to vary and the Lorenz variables
-            value_type R = thrust::get< 3 >( t );
-            value_type x = thrust::get< 0 >( t );
-            value_type y = thrust::get< 1 >( t );
-            value_type z = thrust::get< 2 >( t );
-            thrust::get< 4 >( t ) = sigma * ( y - x );
-            thrust::get< 5 >( t ) = R * x - y - x * z;
-            thrust::get< 6 >( t ) = -b * z + x * y ;
-
-        }
-    };
-
-    lorenz_system( size_t N , const state_type &beta )
-    : m_N( N ) , m_beta( beta ) { }
-
-    template< class State , class Deriv >
-    void operator()(  const State &x , Deriv &dxdt , value_type t ) const
-    {
-        thrust::for_each(
-                thrust::make_zip_iterator( thrust::make_tuple(
-                        boost::begin( x ) ,
-                        boost::begin( x ) + m_N ,
-                        boost::begin( x ) + 2 * m_N ,
-                        m_beta.begin() ,
-                        boost::begin( dxdt ) ,
-                        boost::begin( dxdt ) + m_N ,
-                        boost::begin( dxdt ) + 2 * m_N  ) ) ,
-                thrust::make_zip_iterator( thrust::make_tuple(
-                        boost::begin( x ) + m_N ,
-                        boost::begin( x ) + 2 * m_N ,
-                        boost::begin( x ) + 3 * m_N ,
-                        m_beta.begin() ,
-                        boost::begin( dxdt ) + m_N ,
-                        boost::begin( dxdt ) + 2 * m_N ,
-                        boost::begin( dxdt ) + 3 * m_N  ) ) ,
-                lorenz_functor() );
-    }
-    size_t m_N;
-    const state_type &m_beta;
-};
-
-

-

-

- As state_type a thrust::device_vector or a Boost.Range - of a device_vector is used. - The length of the state is 3N where N - is the number of systems. The system is encoded into this vector such that - all x components come first, then every y - components and finally every z components. Implementing - the device function is then a simple task, you only have to decompose the - tuple originating from the zip iterators. -

-

- Besides the system without perturbations we furthermore need to calculate - the system including linearized equations governing the time evolution - of small perturbations. Using the method from above this is straightforward, - with a small difficulty that Thrust's tuples have a maximal arity of 10. - But this is only a small problem since we can create a zip iterator packed - with zip iterators. So the top level zip iterator contains one zip iterator - for the state, one normal iterator for the parameter, and one zip iterator - for the derivative. Accessing the elements of this tuple in the system - function is then straightforward, you unpack the tuple with thrust::get<>(). - We will not show the code here, it is to large. It can be found here and - is easy to understand. -

-

- Furthermore, we need an observer which determines the norm of the perturbations, - normalizes them and averages the logarithm of the norm. The device functor - which is used within this observer is defined -

-

-

-
struct lyap_functor
-{
-    template< class T >
-    __host__ __device__
-    void operator()( T t ) const
-    {
-        value_type &dx = thrust::get< 0 >( t );
-        value_type &dy = thrust::get< 1 >( t );
-        value_type &dz = thrust::get< 2 >( t );
-        value_type norm = sqrt( dx * dx + dy * dy + dz * dz );
-        dx /= norm;
-        dy /= norm;
-        dz /= norm;
-        thrust::get< 3 >( t ) += log( norm );
-    }
-};
-
-

-

-

- Note, that this functor manipulates the state, i.e. the perturbations. -

-

- Now we complete the whole code to calculate the Lyapunov exponents. First, - we have to define a state vector. This vector contains 6N - entries, the state x,y,z and its perturbations dx,dy,dz. - We initialize them such that x=y=z=10, dx=1, - and dy=dz=0. We define a stepper type, a controlled - Runge-Kutta Dormand-Prince 5 stepper. We start with some integration to - overcome the transient behavior. For this, we do not involve the perturbation - and run the algorithm only on the state x,y,z without - any observer. Note, how Boost.Range - is used for partial integration of the state vector without perturbations - (the first half of the whole state). After the transient, the full system - with perturbations is integrated and the Lyapunov exponents are calculated - and written to stdout. -

-

-

-
state_type x( 6 * N );
-
-// initialize x,y,z
-thrust::fill( x.begin() , x.begin() + 3 * N , 10.0 );
-
-// initial dx
-thrust::fill( x.begin() + 3 * N , x.begin() + 4 * N , 1.0 );
-
-// initialize dy,dz
-thrust::fill( x.begin() + 4 * N , x.end() , 0.0 );
-
-
-// create error stepper, can be used with make_controlled or make_dense_output
-typedef runge_kutta_dopri5< state_type , value_type , state_type , value_type > stepper_type;
-
-
-lorenz_system lorenz( N , beta );
-lorenz_perturbation_system lorenz_perturbation( N , beta );
-lyap_observer obs( N , 1 );
-
-// calculate transients
-integrate_adaptive( make_controlled( 1.0e-6 , 1.0e-6 , stepper_type() ) , lorenz , std::make_pair( x.begin() , x.begin() + 3 * N ) , 0.0 , 10.0 , dt );
-
-// calculate the Lyapunov exponents -- the main loop
-double t = 0.0;
-while( t < 10000.0 )
-{
-    integrate_adaptive( make_controlled( 1.0e-6 , 1.0e-6 , stepper_type() ) , lorenz_perturbation , x , t , t + 1.0 , 0.1 );
-    t += 1.0;
-    obs( x , t );
-}
-
-vector< value_type > lyap( N );
-obs.fill_lyap( lyap );
-
-for( size_t i=0 ; i<N ; ++i )
-    cout << beta_host[i] << "\t" << lyap[i] << "\n";
-
-

-

-

- The full example can be found at lorenz_parameters.cu. -

-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_matrices_as_state_types.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_matrices_as_state_types.html deleted file mode 100644 index fab8f82d2..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_matrices_as_state_types.html +++ /dev/null @@ -1,114 +0,0 @@ - - - -Using matrices as state types - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- odeint works well with a variety of different state types. It is not restricted - to pure vector-wise types, like vector< double >, array< double , N >, - fusion::vector< double , double >, - etc. but also works with types having a different topology then simple vectors. - Here, we show how odeint can be used with matrices as states type, in the - next section we will show how can be used to solve ODEs defined on complex - networks. -

-

- By default, odeint can be used with ublas::matrix< T > as state type for matrices. A simple - example is a two-dimensional lattice of coupled phase oscillators. Other - matrix types like mtl::dense_matrix or blitz arrays and matrices - can used as well but need some kind of activation in order to work with odeint. - This activation is described in following sections, -

-

- The definition of the system is -

-

-

-
typedef boost::numeric::ublas::matrix< double > state_type;
-
-struct two_dimensional_phase_lattice
-{
-    two_dimensional_phase_lattice( double gamma = 0.5 )
-    : m_gamma( gamma ) { }
-
-    void operator()( const state_type &x , state_type &dxdt , double /* t */ ) const
-    {
-        size_t size1 = x.size1() , size2 = x.size2();
-
-        for( size_t i=1 ; i<size1-1 ; ++i )
-        {
-            for( size_t j=1 ; j<size2-1 ; ++j )
-            {
-                dxdt( i , j ) =
-                        coupling_func( x( i + 1 , j ) - x( i , j ) ) +
-                        coupling_func( x( i - 1 , j ) - x( i , j ) ) +
-                        coupling_func( x( i , j + 1 ) - x( i , j ) ) +
-                        coupling_func( x( i , j - 1 ) - x( i , j ) );
-            }
-        }
-
-        for( size_t i=0 ; i<x.size1() ; ++i ) dxdt( i , 0 ) = dxdt( i , x.size2() -1 ) = 0.0;
-        for( size_t j=0 ; j<x.size2() ; ++j ) dxdt( 0 , j ) = dxdt( x.size1() -1 , j ) = 0.0;
-    }
-
-    double coupling_func( double x ) const
-    {
-        return sin( x ) - m_gamma * ( 1.0 - cos( x ) );
-    }
-
-    double m_gamma;
-};
-
-

-

-

- In principle this is all. Please note, that the above code is far from being - optimal. Better performance can be achieved if every interaction is only - calculated once and iterators for columns and rows are used. Below are some - visualizations of the evolution of this lattice equation. -

-

- phase_lattice_2d_0000 phase_lattice_2d_0100 phase_lattice_2d_1000 -

-

- The full cpp for this example can be found here two_dimensional_phase_lattice.cpp. -

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_opencl_via_vexcl.html b/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_opencl_via_vexcl.html deleted file mode 100644 index 7c34997e7..000000000 --- a/libs/numeric/odeint/doc/html/boost_numeric_odeint/tutorial/using_opencl_via_vexcl.html +++ /dev/null @@ -1,177 +0,0 @@ - - - -Using OpenCL via VexCL - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -

- In the previous section the usage of odeint in combination with Thrust - was shown. In this section we show how one can use OpenCL with odeint. The - point of odeint is not to implement its own low-level data structures and - algorithms, but to use high level libraries doing this task. Here, we will - use the VexCL framework - to use OpenCL. VexCL - is a nice library for general computations and it uses heavily expression - templates. With the help of VexCL - it is possible to write very compact and expressive application. -

-
- - - - - -
[Note]Note

- vexcl needs C++11 features! So you have to compile with C++11 support enabled. -

-

- To use VexCL one needs - to include one additional header which includes the data-types and algorithms - from vexcl and the adaption to odeint. Adaption to odeint means here only - to adapt the resizing functionality of VexCL - to odeint. -

-

-

-
#include <boost/numeric/odeint/external/vexcl/vexcl.hpp>
-
-

-

-

- To demonstrate the use of VexCL - we integrate an ensemble of Lorenz system. The example is very similar to - the parameter study of the Lorenz system in the previous section except that - we do not compute the Lyapunov exponents. Again, we vary the parameter R - of the Lorenz system an solve a whole ensemble of Lorenz systems in parallel - (each with a different parameter R). First, we define the state type and - a vector type -

-

-

-
typedef vex::vector< double >    vector_type;
-typedef vex::multivector< double, 3 > state_type;
-
-

-

-

- The vector_type is used to - represent the parameter R. The state_type - is a multi-vector of three sub vectors and is used to represent. The first - component of this multi-vector represent all x - components of the Lorenz system, while the second all y - components and the third all z - components. The components of this vector can be obtained via -

-

-

-
auto &x = X(0);
-auto &y = X(1);
-auto &z = X(2);
-
-

-

-

- As already mentioned VexCL - supports expression templates and we will use them to implement the system - function for the Lorenz ensemble: -

-

-

-
const double sigma = 10.0;
-const double b = 8.0 / 3.0;
-
-struct sys_func
-{
-    const vector_type &R;
-
-    sys_func( const vector_type &_R ) : R( _R ) { }
-
-    void operator()( const state_type &x , state_type &dxdt , double t ) const
-    {
-        dxdt(0) = -sigma * ( x(0) - x(1) );
-        dxdt(1) = R * x(0) - x(1) - x(0) * x(2);
-        dxdt(2) = - b * x(2) + x(0) * x(1);
-    }
-};
-
-

-

-

- It's very easy, isn't it? These three little lines do all the computations - for you. There is no need to write your own OpenCL kernels. VexCL - does everything for you. Next we have to write the main application. We initialize - the vector of parameters (R) and the initial state. Note that VexCL - requires the vector_space_algebra, - but that is automatically deduced and configured by odeint internally, so - we only have to specify the state_type - when instantiating the stepper and we are done: -

-

-

-
// setup the opencl context
-vex::Context ctx( vex::Filter::Type(CL_DEVICE_TYPE_GPU) );
-std::cout << ctx << std::endl;
-
-// set up number of system, time step and integration time
-const size_t n = 1024 * 1024;
-const double dt = 0.01;
-const double t_max = 1000.0;
-
-// initialize R
-double Rmin = 0.1 , Rmax = 50.0 , dR = ( Rmax - Rmin ) / double( n - 1 );
-std::vector<double> x( n * 3 ) , r( n );
-for( size_t i=0 ; i<n ; ++i ) r[i] = Rmin + dR * double( i );
-vector_type R( ctx.queue() , r );
-
-// initialize the state of the lorenz ensemble
-state_type X(ctx.queue(), n);
-X(0) = 10.0;
-X(1) = 10.0;
-X(2) = 10.0;
-
-// create a stepper
-runge_kutta4< state_type > stepper;
-
-// solve the system
-integrate_const( stepper , sys_func( R ) , X , 0.0 , t_max , dt );
-
-

-

-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/boostbook.css b/libs/numeric/odeint/doc/html/boostbook.css deleted file mode 100644 index 42e8996d0..000000000 --- a/libs/numeric/odeint/doc/html/boostbook.css +++ /dev/null @@ -1,611 +0,0 @@ -/*============================================================================= - Copyright (c) 2004 Joel de Guzman - http://spirit.sourceforge.net/ - - Distributed under the Boost Software License, Version 1.0. (See accompany- - ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -=============================================================================*/ - -/*============================================================================= - Body defaults -=============================================================================*/ - - body - { - margin: 1em; - font-family: sans-serif; - } - -/*============================================================================= - Paragraphs -=============================================================================*/ - - p - { - text-align: left; - font-size: 10pt; - line-height: 1.15; - } - -/*============================================================================= - Program listings -=============================================================================*/ - - /* Code on paragraphs */ - p tt.computeroutput - { - font-size: 9pt; - } - - pre.synopsis - { - font-size: 9pt; - margin: 1pc 4% 0pc 4%; - padding: 0.5pc 0.5pc 0.5pc 0.5pc; - } - - .programlisting, - .screen - { - font-size: 9pt; - display: block; - margin: 1pc 4% 0pc 4%; - padding: 0.5pc 0.5pc 0.5pc 0.5pc; - } - - /* Program listings in tables don't get borders */ - td .programlisting, - td .screen - { - margin: 0pc 0pc 0pc 0pc; - padding: 0pc 0pc 0pc 0pc; - } - -/*============================================================================= - Headings -=============================================================================*/ - - h1, h2, h3, h4, h5, h6 - { - text-align: left; - margin: 1em 0em 0.5em 0em; - font-weight: bold; - } - - h1 { font-size: 140%; } - h2 { font-weight: bold; font-size: 140%; } - h3 { font-weight: bold; font-size: 130%; } - h4 { font-weight: bold; font-size: 120%; } - h5 { font-weight: normal; font-style: italic; font-size: 110%; } - h6 { font-weight: normal; font-style: italic; font-size: 100%; } - - /* Top page titles */ - title, - h1.title, - h2.title - h3.title, - h4.title, - h5.title, - h6.title, - .refentrytitle - { - font-weight: bold; - margin-bottom: 1pc; - } - - h1.title { font-size: 140% } - h2.title { font-size: 140% } - h3.title { font-size: 130% } - h4.title { font-size: 120% } - h5.title { font-size: 110% } - h6.title { font-size: 100% } - - .section h1 - { - margin: 0em 0em 0.5em 0em; - font-size: 140%; - } - - .section h2 { font-size: 140% } - .section h3 { font-size: 130% } - .section h4 { font-size: 120% } - .section h5 { font-size: 110% } - .section h6 { font-size: 100% } - - /* Code on titles */ - h1 tt.computeroutput { font-size: 140% } - h2 tt.computeroutput { font-size: 140% } - h3 tt.computeroutput { font-size: 130% } - h4 tt.computeroutput { font-size: 130% } - h5 tt.computeroutput { font-size: 130% } - h6 tt.computeroutput { font-size: 130% } - - -/*============================================================================= - Author -=============================================================================*/ - - h3.author - { - font-size: 100% - } - -/*============================================================================= - Lists -=============================================================================*/ - - li - { - font-size: 10pt; - line-height: 1.3; - } - - /* Unordered lists */ - ul - { - text-align: left; - } - - /* Ordered lists */ - ol - { - text-align: left; - } - -/*============================================================================= - Links -=============================================================================*/ - - a - { - text-decoration: none; /* no underline */ - } - - a:hover - { - text-decoration: underline; - } - -/*============================================================================= - Spirit style navigation -=============================================================================*/ - - .spirit-nav - { - text-align: right; - } - - .spirit-nav a - { - color: white; - padding-left: 0.5em; - } - - .spirit-nav img - { - border-width: 0px; - } - -/*============================================================================= - Copyright footer -=============================================================================*/ - .copyright-footer - { - text-align: right; - font-size: 70%; - } - - .copyright-footer p - { - text-align: right; - font-size: 80%; - } - -/*============================================================================= - Table of contents -=============================================================================*/ - - .toc - { - margin: 1pc 4% 0pc 4%; - padding: 0.1pc 1pc 0.1pc 1pc; - font-size: 80%; - line-height: 1.15; - } - - .boost-toc - { - float: right; - padding: 0.5pc; - } - - /* Code on toc */ - .toc .computeroutput { font-size: 120% } - - /* No margin on nested menus */ - - .toc dl dl { margin: 0; } - -/*============================================================================= - Tables -=============================================================================*/ - - .table-title, - div.table p.title - { - margin-left: 4%; - padding-right: 0.5em; - padding-left: 0.5em; - } - - .informaltable table, - .table table - { - width: 92%; - margin-left: 4%; - margin-right: 4%; - } - - div.informaltable table, - div.table table - { - padding: 4px; - } - - /* Table Cells */ - div.informaltable table tr td, - div.table table tr td - { - padding: 0.5em; - text-align: left; - font-size: 9pt; - } - - div.informaltable table tr th, - div.table table tr th - { - padding: 0.5em 0.5em 0.5em 0.5em; - border: 1pt solid white; - font-size: 80%; - } - - table.simplelist - { - width: auto !important; - margin: 0em !important; - padding: 0em !important; - border: none !important; - } - table.simplelist td - { - margin: 0em !important; - padding: 0em !important; - text-align: left !important; - font-size: 9pt !important; - border: none !important; - } - -/*============================================================================= - Blurbs -=============================================================================*/ - - div.note, - div.tip, - div.important, - div.caution, - div.warning, - p.blurb - { - font-size: 9pt; /* A little bit smaller than the main text */ - line-height: 1.2; - display: block; - margin: 1pc 4% 0pc 4%; - padding: 0.5pc 0.5pc 0.5pc 0.5pc; - } - - p.blurb img - { - padding: 1pt; - } - -/*============================================================================= - Variable Lists -=============================================================================*/ - - div.variablelist - { - margin: 1em 0; - } - - /* Make the terms in definition lists bold */ - div.variablelist dl dt, - span.term - { - font-weight: bold; - font-size: 10pt; - } - - div.variablelist table tbody tr td - { - text-align: left; - vertical-align: top; - padding: 0em 2em 0em 0em; - font-size: 10pt; - margin: 0em 0em 0.5em 0em; - line-height: 1; - } - - div.variablelist dl dt - { - margin-bottom: 0.2em; - } - - div.variablelist dl dd - { - margin: 0em 0em 0.5em 2em; - font-size: 10pt; - } - - div.variablelist table tbody tr td p, - div.variablelist dl dd p - { - margin: 0em 0em 0.5em 0em; - line-height: 1; - } - -/*============================================================================= - Misc -=============================================================================*/ - - /* Title of books and articles in bibliographies */ - span.title - { - font-style: italic; - } - - span.underline - { - text-decoration: underline; - } - - span.strikethrough - { - text-decoration: line-through; - } - - /* Copyright, Legal Notice */ - div div.legalnotice p - { - text-align: left - } - -/*============================================================================= - Colors -=============================================================================*/ - - @media screen - { - body { - background-color: #FFFFFF; - color: #000000; - } - - /* Syntax Highlighting */ - .keyword { color: #0000AA; } - .identifier { color: #000000; } - .special { color: #707070; } - .preprocessor { color: #402080; } - .char { color: teal; } - .comment { color: #800000; } - .string { color: teal; } - .number { color: teal; } - .white_bkd { background-color: #FFFFFF; } - .dk_grey_bkd { background-color: #999999; } - - /* Links */ - a, a .keyword, a .identifier, a .special, a .preprocessor - a .char, a .comment, a .string, a .number - { - color: #005a9c; - } - - a:visited, a:visited .keyword, a:visited .identifier, - a:visited .special, a:visited .preprocessor a:visited .char, - a:visited .comment, a:visited .string, a:visited .number - { - color: #9c5a9c; - } - - h1 a, h2 a, h3 a, h4 a, h5 a, h6 a, - h1 a:hover, h2 a:hover, h3 a:hover, h4 a:hover, h5 a:hover, h6 a:hover, - h1 a:visited, h2 a:visited, h3 a:visited, h4 a:visited, h5 a:visited, h6 a:visited - { - text-decoration: none; /* no underline */ - color: #000000; - } - - /* Copyright, Legal Notice */ - .copyright - { - color: #666666; - font-size: small; - } - - div div.legalnotice p - { - color: #666666; - } - - /* Program listing */ - pre.synopsis - { - border: 1px solid #DCDCDC; - } - - .programlisting, - .screen - { - border: 1px solid #DCDCDC; - } - - td .programlisting, - td .screen - { - border: 0px solid #DCDCDC; - } - - /* Blurbs */ - div.note, - div.tip, - div.important, - div.caution, - div.warning, - p.blurb - { - border: 1px solid #DCDCDC; - } - - /* Table of contents */ - .toc - { - border: 1px solid #DCDCDC; - } - - /* Tables */ - div.informaltable table tr td, - div.table table tr td - { - border: 1px solid #DCDCDC; - } - - div.informaltable table tr th, - div.table table tr th - { - background-color: #F0F0F0; - border: 1px solid #DCDCDC; - } - - .copyright-footer - { - color: #8F8F8F; - } - - /* Misc */ - span.highlight - { - color: #00A000; - } - } - - @media print - { - /* Links */ - a - { - color: black; - } - - a:visited - { - color: black; - } - - .spirit-nav - { - display: none; - } - - /* Program listing */ - pre.synopsis - { - border: 1px solid gray; - } - - .programlisting, - .screen - { - border: 1px solid gray; - } - - td .programlisting, - td .screen - { - border: 0px solid #DCDCDC; - } - - /* Table of contents */ - .toc - { - border: 1px solid gray; - } - - .informaltable table, - .table table - { - border: 1px solid gray; - border-collapse: collapse; - } - - /* Tables */ - div.informaltable table tr td, - div.table table tr td - { - border: 1px solid gray; - } - - div.informaltable table tr th, - div.table table tr th - { - border: 1px solid gray; - } - - table.simplelist tr td - { - border: none !important; - } - - /* Misc */ - span.highlight - { - font-weight: bold; - } - } - -/*============================================================================= - Images -=============================================================================*/ - - span.inlinemediaobject img - { - vertical-align: middle; - } - -/*============================================================================== - Super and Subscript: style so that line spacing isn't effected, see - http://www.adobe.com/cfusion/communityengine/index.cfm?event=showdetails&productId=1&postId=5341 -==============================================================================*/ - -sup, -sub { - height: 0; - line-height: 1; - vertical-align: baseline; - position: relative; - -} - -/* For internet explorer: */ - -* html sup, -* html sub { - vertical-align: bottom; -} - -sup { - bottom: 1ex; -} - -sub { - top: .5ex; -} - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/check_adapter_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/check_adapter_hpp.html deleted file mode 100644 index 11c62f4fb..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/check_adapter_hpp.html +++ /dev/null @@ -1,60 +0,0 @@ - - - -Header <boost/numeric/odeint/integrate/check_adapter.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, typename Checker, 
-               typename StepperCategory = typename base_tag<typename Stepper::stepper_category>::type> 
-        class checked_stepper;
-
-      template<typename Stepper, typename Checker> 
-        class checked_stepper<Stepper, Checker, stepper_tag>;
-      template<typename ControlledStepper, typename Checker> 
-        class checked_stepper<ControlledStepper, Checker, controlled_stepper_tag>;
-      template<typename DenseOutStepper, typename Checker> 
-        class checked_stepper<DenseOutStepper, Checker, dense_output_stepper_tag>;
-
-      template<typename Observer, typename Checker> class checked_observer;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_adaptive_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_adaptive_hpp.html deleted file mode 100644 index ec9ef45cb..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_adaptive_hpp.html +++ /dev/null @@ -1,73 +0,0 @@ - - - -Header <boost/numeric/odeint/integrate/integrate_adaptive.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, typename System, typename State, 
-               typename Time, typename Observer> 
-        size_t integrate_adaptive(Stepper, System, State &, Time, Time, Time, 
-                                  Observer);
-
-      // Second version to solve the forwarding problem, can be called with Boost.Range as start_state. 
-      template<typename Stepper, typename System, typename State, 
-               typename Time, typename Observer> 
-        size_t integrate_adaptive(Stepper stepper, System system, 
-                                  const State & start_state, Time start_time, 
-                                  Time end_time, Time dt, Observer observer);
-
-      // integrate_adaptive without an observer. 
-      template<typename Stepper, typename System, typename State, 
-               typename Time> 
-        size_t integrate_adaptive(Stepper stepper, System system, 
-                                  State & start_state, Time start_time, 
-                                  Time end_time, Time dt);
-
-      // Second version to solve the forwarding problem, can be called with Boost.Range as start_state. 
-      template<typename Stepper, typename System, typename State, 
-               typename Time> 
-        size_t integrate_adaptive(Stepper stepper, System system, 
-                                  const State & start_state, Time start_time, 
-                                  Time end_time, Time dt);
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_const_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_const_hpp.html deleted file mode 100644 index 26a10f898..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_const_hpp.html +++ /dev/null @@ -1,88 +0,0 @@ - - - -Header <boost/numeric/odeint/integrate/integrate_const.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, typename System, typename State, 
-               typename Time, typename Observer, typename StepOverflowChecker> 
-        size_t integrate_const(Stepper, System, State &, Time, Time, Time, 
-                               Observer, StepOverflowChecker);
-
-      // Second version to solve the forwarding problem, can be called with Boost.Range as start_state. 
-      template<typename Stepper, typename System, typename State, 
-               typename Time, typename Observer, typename StepOverflowChecker> 
-        size_t integrate_const(Stepper stepper, System system, 
-                               const State & start_state, Time start_time, 
-                               Time end_time, Time dt, Observer observer, 
-                               StepOverflowChecker checker);
-
-      // integrate_const without step overflow checker 
-      template<typename Stepper, typename System, typename State, 
-               typename Time, typename Observer> 
-        size_t integrate_const(Stepper stepper, System system, 
-                               State & start_state, Time start_time, 
-                               Time end_time, Time dt, Observer observer);
-
-      // Second version to solve the forwarding problem, can be called with Boost.Range as start_state. 
-      template<typename Stepper, typename System, typename State, 
-               typename Time, typename Observer> 
-        size_t integrate_const(Stepper stepper, System system, 
-                               const State & start_state, Time start_time, 
-                               Time end_time, Time dt, Observer observer);
-
-      // integrate_const without observer calls 
-      template<typename Stepper, typename System, typename State, 
-               typename Time> 
-        size_t integrate_const(Stepper stepper, System system, 
-                               State & start_state, Time start_time, 
-                               Time end_time, Time dt);
-
-      // Second version to solve the forwarding problem, can be called with Boost.Range as start_state. 
-      template<typename Stepper, typename System, typename State, 
-               typename Time> 
-        size_t integrate_const(Stepper stepper, System system, 
-                               const State & start_state, Time start_time, 
-                               Time end_time, Time dt);
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_hpp.html deleted file mode 100644 index 2413d381b..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_hpp.html +++ /dev/null @@ -1,61 +0,0 @@ - - - -Header <boost/numeric/odeint/integrate/integrate.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename System, typename State, typename Time, 
-               typename Observer> 
-        boost::enable_if< typename has_value_type< State >::type, size_t >::type 
-        integrate(System, State &, Time, Time, Time, Observer);
-      template<typename Value, typename System, typename State, typename Time, 
-               typename Observer> 
-        size_t integrate(System system, State & start_state, Time start_time, 
-                         Time end_time, Time dt, Observer observer);
-      template<typename System, typename State, typename Time> 
-        size_t integrate(System, State &, Time, Time, Time);
-      template<typename Value, typename System, typename State, typename Time> 
-        size_t integrate(System system, State & start_state, Time start_time, 
-                         Time end_time, Time dt);
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_n_steps_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_n_steps_hpp.html deleted file mode 100644 index 68e47a67f..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_n_steps_hpp.html +++ /dev/null @@ -1,89 +0,0 @@ - - - -Header <boost/numeric/odeint/integrate/integrate_n_steps.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, typename System, typename State, 
-               typename Time, typename Observer, typename StepOverflowChecker> 
-        Time integrate_n_steps(Stepper stepper, System system, 
-                               State & start_state, Time start_time, Time dt, 
-                               size_t num_of_steps, Observer observer, 
-                               StepOverflowChecker checker);
-
-      // Solves the forwarding problem, can be called with Boost.Range as start_state. 
-      template<typename Stepper, typename System, typename State, 
-               typename Time, typename Observer, typename 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, 
-                               StepOverflowChecker checker);
-      template<typename Stepper, typename System, typename State, 
-               typename Time, typename Observer> 
-        Time integrate_n_steps(Stepper, System, State &, Time, Time, size_t, 
-                               Observer);
-
-      // Solves the forwarding problem, can be called with Boost.Range as start_state. 
-      template<typename Stepper, typename System, typename State, 
-               typename Time, typename 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);
-
-      // The same function as above, but without observer calls. 
-      template<typename Stepper, typename System, typename State, 
-               typename Time> 
-        Time integrate_n_steps(Stepper stepper, System system, 
-                               State & start_state, Time start_time, Time dt, 
-                               size_t num_of_steps);
-
-      // Solves the forwarding problem, can be called with Boost.Range as start_state. 
-      template<typename Stepper, typename System, typename State, 
-               typename Time> 
-        Time integrate_n_steps(Stepper stepper, System system, 
-                               const State & start_state, Time start_time, 
-                               Time dt, size_t num_of_steps);
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_times_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_times_hpp.html deleted file mode 100644 index 797273763..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/integrate_times_hpp.html +++ /dev/null @@ -1,114 +0,0 @@ - - - -Header <boost/numeric/odeint/integrate/integrate_times.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, typename System, typename State, 
-               typename TimeIterator, typename Time, typename Observer, 
-               typename StepOverflowChecker> 
-        size_t integrate_times(Stepper stepper, System system, 
-                               State & start_state, TimeIterator times_start, 
-                               TimeIterator times_end, Time dt, 
-                               Observer observer, 
-                               StepOverflowChecker checker);
-
-      // Solves the forwarding problem, can be called with Boost.Range as start_state. 
-      template<typename Stepper, typename System, typename State, 
-               typename TimeIterator, typename Time, typename Observer, 
-               typename 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);
-
-      // The same function as above, but with the observation times given as range. 
-      template<typename Stepper, typename System, typename State, 
-               typename TimeRange, typename Time, typename Observer, 
-               typename StepOverflowChecker> 
-        size_t integrate_times(Stepper stepper, System system, 
-                               State & start_state, const TimeRange & times, 
-                               Time dt, Observer observer, 
-                               StepOverflowChecker checker);
-
-      // Solves the forwarding problem, can be called with Boost.Range as start_state. 
-      template<typename Stepper, typename System, typename State, 
-               typename TimeRange, typename Time, typename Observer, 
-               typename StepOverflowChecker> 
-        size_t integrate_times(Stepper stepper, System system, 
-                               const State & start_state, 
-                               const TimeRange & times, Time dt, 
-                               Observer observer, 
-                               StepOverflowChecker checker);
-      template<typename Stepper, typename System, typename State, 
-               typename TimeIterator, typename Time, typename Observer> 
-        size_t integrate_times(Stepper, System, State &, TimeIterator, 
-                               TimeIterator, Time, Observer);
-
-      // Solves the forwarding problem, can be called with Boost.Range as start_state. 
-      template<typename Stepper, typename System, typename State, 
-               typename TimeIterator, typename Time, typename Observer> 
-        size_t integrate_times(Stepper stepper, System system, 
-                               const State & start_state, 
-                               TimeIterator times_start, 
-                               TimeIterator times_end, Time dt, 
-                               Observer observer);
-
-      // The same function as above, but with the observation times given as range. 
-      template<typename Stepper, typename System, typename State, 
-               typename TimeRange, typename Time, typename Observer> 
-        size_t integrate_times(Stepper stepper, System system, 
-                               State & start_state, const TimeRange & times, 
-                               Time dt, Observer observer);
-
-      // Solves the forwarding problem, can be called with Boost.Range as start_state. 
-      template<typename Stepper, typename System, typename State, 
-               typename TimeRange, typename Time, typename Observer> 
-        size_t integrate_times(Stepper stepper, System system, 
-                               const State & start_state, 
-                               const TimeRange & times, Time dt, 
-                               Observer observer);
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/max_step_checker_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/max_step_checker_hpp.html deleted file mode 100644 index 59fbb54ba..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/integrate/max_step_checker_hpp.html +++ /dev/null @@ -1,50 +0,0 @@ - - - -Header <boost/numeric/odeint/integrate/max_step_checker.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      class max_step_checker;
-      class failed_step_checker;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/adaptive_iterator_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/adaptive_iterator_hpp.html deleted file mode 100644 index 21f1f3f5a..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/adaptive_iterator_hpp.html +++ /dev/null @@ -1,65 +0,0 @@ - - - -Header <boost/numeric/odeint/iterator/adaptive_iterator.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, typename System, typename State> 
-        class adaptive_iterator;
-      template<typename Stepper, typename System, typename State> 
-        adaptive_iterator< Stepper, System, State > 
-        make_adaptive_iterator_begin(Stepper, System, State &, 
-                                     typename traits::time_type< Stepper >::type, 
-                                     typename traits::time_type< Stepper >::type, 
-                                     typename traits::time_type< Stepper >::type);
-      template<typename Stepper, typename System, typename State> 
-        adaptive_iterator< Stepper, System, State > 
-        make_adaptive_iterator_end(Stepper, System, State &);
-      template<typename Stepper, typename System, typename State> 
-        std::pair< adaptive_iterator< Stepper, System, State >, adaptive_iterator< Stepper, System, State > > 
-        make_adaptive_range(Stepper, System, State &, 
-                            typename traits::time_type< Stepper >::type, 
-                            typename traits::time_type< Stepper >::type, 
-                            typename traits::time_type< Stepper >::type);
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/adaptive_time_iterator_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/adaptive_time_iterator_hpp.html deleted file mode 100644 index 849f7c0be..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/adaptive_time_iterator_hpp.html +++ /dev/null @@ -1,65 +0,0 @@ - - - -Header <boost/numeric/odeint/iterator/adaptive_time_iterator.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, typename System, typename State> 
-        class adaptive_time_iterator;
-      template<typename Stepper, typename System, typename State> 
-        adaptive_time_iterator< Stepper, System, State > 
-        make_adaptive_time_iterator_begin(Stepper, System, State &, 
-                                          typename traits::time_type< Stepper >::type, 
-                                          typename traits::time_type< Stepper >::type, 
-                                          typename traits::time_type< Stepper >::type);
-      template<typename Stepper, typename System, typename State> 
-        adaptive_time_iterator< Stepper, System, State > 
-        make_adaptive_time_iterator_end(Stepper, System, State &);
-      template<typename Stepper, typename System, typename State> 
-        std::pair< adaptive_time_iterator< Stepper, System, State >, adaptive_time_iterator< Stepper, System, State > > 
-        make_adaptive_time_range(Stepper, System, State &, 
-                                 typename traits::time_type< Stepper >::type, 
-                                 typename traits::time_type< Stepper >::type, 
-                                 typename traits::time_type< Stepper >::type);
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/const_step_iterator_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/const_step_iterator_hpp.html deleted file mode 100644 index 85105ecb3..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/const_step_iterator_hpp.html +++ /dev/null @@ -1,65 +0,0 @@ - - - -Header <boost/numeric/odeint/iterator/const_step_iterator.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, typename System, typename State> 
-        class const_step_iterator;
-      template<typename Stepper, typename System, typename State> 
-        const_step_iterator< Stepper, System, State > 
-        make_const_step_iterator_begin(Stepper, System, State &, 
-                                       typename traits::time_type< Stepper >::type, 
-                                       typename traits::time_type< Stepper >::type, 
-                                       typename traits::time_type< Stepper >::type);
-      template<typename Stepper, typename System, typename State> 
-        const_step_iterator< Stepper, System, State > 
-        make_const_step_iterator_end(Stepper, System, State &);
-      template<typename Stepper, typename System, typename State> 
-        std::pair< const_step_iterator< Stepper, System, State >, const_step_iterator< Stepper, System, State > > 
-        make_const_step_range(Stepper, System, State &, 
-                              typename traits::time_type< Stepper >::type, 
-                              typename traits::time_type< Stepper >::type, 
-                              typename traits::time_type< Stepper >::type);
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/const_step_time_iterator_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/const_step_time_iterator_hpp.html deleted file mode 100644 index 568906dc0..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/const_step_time_iterator_hpp.html +++ /dev/null @@ -1,65 +0,0 @@ - - - -Header <boost/numeric/odeint/iterator/const_step_time_iterator.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, typename System, typename State> 
-        class const_step_time_iterator;
-      template<typename Stepper, typename System, typename State> 
-        const_step_time_iterator< Stepper, System, State > 
-        make_const_step_time_iterator_begin(Stepper, System, State &, 
-                                            typename traits::time_type< Stepper >::type, 
-                                            typename traits::time_type< Stepper >::type, 
-                                            typename traits::time_type< Stepper >::type);
-      template<typename Stepper, typename System, typename State> 
-        const_step_time_iterator< Stepper, System, State > 
-        make_const_step_time_iterator_end(Stepper, System, State &);
-      template<typename Stepper, typename System, typename State> 
-        std::pair< const_step_time_iterator< Stepper, System, State >, const_step_time_iterator< Stepper, System, State > > 
-        make_const_step_time_range(Stepper, System, State &, 
-                                   typename traits::time_type< Stepper >::type, 
-                                   typename traits::time_type< Stepper >::type, 
-                                   typename traits::time_type< Stepper >::type);
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/n_step_iterator_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/n_step_iterator_hpp.html deleted file mode 100644 index 75f36529d..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/n_step_iterator_hpp.html +++ /dev/null @@ -1,65 +0,0 @@ - - - -Header <boost/numeric/odeint/iterator/n_step_iterator.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, typename System, typename State> 
-        class n_step_iterator;
-      template<typename Stepper, typename System, typename State> 
-        n_step_iterator< Stepper, System, State > 
-        make_n_step_iterator_begin(Stepper, System, State &, 
-                                   typename traits::time_type< Stepper >::type, 
-                                   typename traits::time_type< Stepper >::type, 
-                                   size_t);
-      template<typename Stepper, typename System, typename State> 
-        n_step_iterator< Stepper, System, State > 
-        make_n_step_iterator_end(Stepper, System, State &);
-      template<typename Stepper, typename System, typename State> 
-        std::pair< n_step_iterator< Stepper, System, State >, n_step_iterator< Stepper, System, State > > 
-        make_n_step_range(Stepper, System, State &, 
-                          typename traits::time_type< Stepper >::type, 
-                          typename traits::time_type< Stepper >::type, 
-                          size_t);
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/n_step_time_iterator_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/n_step_time_iterator_hpp.html deleted file mode 100644 index 4674bb8b0..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/n_step_time_iterator_hpp.html +++ /dev/null @@ -1,65 +0,0 @@ - - - -Header <boost/numeric/odeint/iterator/n_step_time_iterator.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, typename System, typename State> 
-        class n_step_time_iterator;
-      template<typename Stepper, typename System, typename State> 
-        n_step_time_iterator< Stepper, System, State > 
-        make_n_step_time_iterator_begin(Stepper, System, State &, 
-                                        typename traits::time_type< Stepper >::type, 
-                                        typename traits::time_type< Stepper >::type, 
-                                        size_t);
-      template<typename Stepper, typename System, typename State> 
-        n_step_time_iterator< Stepper, System, State > 
-        make_n_step_time_iterator_end(Stepper, System, State &);
-      template<typename Stepper, typename System, typename State> 
-        std::pair< n_step_time_iterator< Stepper, System, State >, n_step_time_iterator< Stepper, System, State > > 
-        make_n_step_time_range(Stepper, System, State &, 
-                               typename traits::time_type< Stepper >::type, 
-                               typename traits::time_type< Stepper >::type, 
-                               size_t);
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/times_iterator_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/times_iterator_hpp.html deleted file mode 100644 index 47b58f453..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/times_iterator_hpp.html +++ /dev/null @@ -1,66 +0,0 @@ - - - -Header <boost/numeric/odeint/iterator/times_iterator.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, typename System, typename State, 
-               typename TimeIterator> 
-        class times_iterator;
-      template<typename Stepper, typename System, typename State, 
-               typename TimeIterator> 
-        times_iterator< Stepper, System, State, TimeIterator > 
-        make_times_iterator_begin(Stepper, System, State &, TimeIterator, 
-                                  TimeIterator, 
-                                  typename traits::time_type< Stepper >::type);
-      template<typename TimeIterator, typename Stepper, typename System, 
-               typename State> 
-        times_iterator< Stepper, System, State, TimeIterator > 
-        make_times_iterator_end(Stepper, System, State &);
-      template<typename Stepper, typename System, typename State, 
-               typename TimeIterator> 
-        std::pair< times_iterator< Stepper, System, State, TimeIterator >, times_iterator< Stepper, System, State, TimeIterator > > 
-        make_times_range(Stepper, System, State &, TimeIterator, TimeIterator, 
-                         typename traits::time_type< Stepper >::type);
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/times_time_iterator_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/times_time_iterator_hpp.html deleted file mode 100644 index 56e461b3c..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/iterator/times_time_iterator_hpp.html +++ /dev/null @@ -1,67 +0,0 @@ - - - -Header <boost/numeric/odeint/iterator/times_time_iterator.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, typename System, typename State, 
-               typename TimeIterator> 
-        class times_time_iterator;
-      template<typename Stepper, typename System, typename State, 
-               typename TimeIterator> 
-        times_time_iterator< Stepper, System, State, TimeIterator > 
-        make_times_time_iterator_begin(Stepper, System, State &, TimeIterator, 
-                                       TimeIterator, 
-                                       typename traits::time_type< Stepper >::type);
-      template<typename TimeIterator, typename Stepper, typename System, 
-               typename State> 
-        times_time_iterator< Stepper, System, State, TimeIterator > 
-        make_times_time_iterator_end(Stepper, System, State &);
-      template<typename Stepper, typename System, typename State, 
-               typename TimeIterator> 
-        std::pair< times_time_iterator< Stepper, System, State, TimeIterator >, times_time_iterator< Stepper, System, State, TimeIterator > > 
-        make_times_time_range(Stepper, System, State &, TimeIterator, 
-                              TimeIterator, 
-                              typename traits::time_type< Stepper >::type);
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/adams_bashforth_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/adams_bashforth_hpp.html deleted file mode 100644 index 0765058b9..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/adams_bashforth_hpp.html +++ /dev/null @@ -1,57 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/adams_bashforth.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<int N> struct order_helper;
-
-      template<size_t Steps, typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer, 
-               typename InitializingStepper = extrapolation_stepper< order_helper<Steps>::value,                                                    State, Value, Deriv, Time,                                                   Algebra, Operations, Resizer > > 
-        class adams_bashforth;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/adams_bashforth_moulton_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/adams_bashforth_moulton_hpp.html deleted file mode 100644 index 05083df6f..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/adams_bashforth_moulton_hpp.html +++ /dev/null @@ -1,55 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/adams_bashforth_moulton.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<size_t Steps, typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer, 
-               typename InitializingStepper = runge_kutta4< State , Value , Deriv , Time , Algebra , Operations, Resizer > > 
-        class adams_bashforth_moulton;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/adams_moulton_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/adams_moulton_hpp.html deleted file mode 100644 index bbe858ee3..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/adams_moulton_hpp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/adams_moulton.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<size_t Steps, typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class adams_moulton;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/bulirsch_stoer_dense_out_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/bulirsch_stoer_dense_out_hpp.html deleted file mode 100644 index 6f66194e1..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/bulirsch_stoer_dense_out_hpp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/bulirsch_stoer_dense_out.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class bulirsch_stoer_dense_out;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/bulirsch_stoer_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/bulirsch_stoer_hpp.html deleted file mode 100644 index 05280dbb0..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/bulirsch_stoer_hpp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/bulirsch_stoer.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class bulirsch_stoer;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/controlled_runge_kutta_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/controlled_runge_kutta_hpp.html deleted file mode 100644 index 2827aa429..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/controlled_runge_kutta_hpp.html +++ /dev/null @@ -1,64 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/controlled_runge_kutta.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Value, typename Algebra, typename Operations> 
-        class default_error_checker;
-      template<typename Value, typename Time> class default_step_adjuster;
-      template<typename ErrorStepper, 
-               typename ErrorChecker = default_error_checker< typename ErrorStepper::value_type ,    typename ErrorStepper::algebra_type ,    typename ErrorStepper::operations_type >, 
-               typename StepAdjuster = default_step_adjuster< typename ErrorStepper::value_type ,    typename ErrorStepper::time_type >, 
-               typename Resizer = typename ErrorStepper::resizer_type, 
-               typename ErrorStepperCategory = typename ErrorStepper::stepper_category> 
-        class controlled_runge_kutta;
-
-      template<typename ErrorStepper, typename ErrorChecker, 
-               typename StepAdjuster, typename Resizer> 
-        class controlled_runge_kutta<ErrorStepper, ErrorChecker, StepAdjuster, Resizer, explicit_error_stepper_tag>;
-      template<typename ErrorStepper, typename ErrorChecker, 
-               typename StepAdjuster, typename Resizer> 
-        class controlled_runge_kutta<ErrorStepper, ErrorChecker, StepAdjuster, Resizer, explicit_error_stepper_fsal_tag>;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/controlled_step_result_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/controlled_step_result_hpp.html deleted file mode 100644 index 0f8d28537..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/controlled_step_result_hpp.html +++ /dev/null @@ -1,51 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/controlled_step_result.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-
-      // Enum representing the return values of the controlled steppers. 
-      enum controlled_step_result { success, fail };
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/dense_output_runge_kutta_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/dense_output_runge_kutta_hpp.html deleted file mode 100644 index fc56a6f2c..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/dense_output_runge_kutta_hpp.html +++ /dev/null @@ -1,56 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/dense_output_runge_kutta.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper, 
-               typename StepperCategory = typename Stepper::stepper_category> 
-        class dense_output_runge_kutta;
-
-      template<typename Stepper> 
-        class dense_output_runge_kutta<Stepper, stepper_tag>;
-      template<typename Stepper> 
-        class dense_output_runge_kutta<Stepper, explicit_controlled_stepper_fsal_tag>;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/euler_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/euler_hpp.html deleted file mode 100644 index 0fd97d930..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/euler_hpp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/euler.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class euler;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/explicit_error_generic_rk_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/explicit_error_generic_rk_hpp.html deleted file mode 100644 index fd79af02e..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/explicit_error_generic_rk_hpp.html +++ /dev/null @@ -1,55 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/explicit_error_generic_rk.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<size_t StageCount, size_t Order, size_t StepperOrder, 
-               size_t ErrorOrder, typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class explicit_error_generic_rk;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/explicit_generic_rk_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/explicit_generic_rk_hpp.html deleted file mode 100644 index 9be703661..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/explicit_generic_rk_hpp.html +++ /dev/null @@ -1,52 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/explicit_generic_rk.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<size_t StageCount, size_t Order, typename State, 
-               typename Value, typename Deriv, typename Time, 
-               typename Algebra, typename Operations, typename Resizer> 
-        class explicit_generic_rk;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/extrapolation_stepper_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/extrapolation_stepper_hpp.html deleted file mode 100644 index ad302072f..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/extrapolation_stepper_hpp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/extrapolation_stepper.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<unsigned short Order, typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class extrapolation_stepper;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/implicit_euler_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/implicit_euler_hpp.html deleted file mode 100644 index 3324e9815..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/implicit_euler_hpp.html +++ /dev/null @@ -1,50 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/implicit_euler.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename ValueType, typename Resizer = initially_resizer> 
-        class implicit_euler;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/modified_midpoint_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/modified_midpoint_hpp.html deleted file mode 100644 index 8574c1223..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/modified_midpoint_hpp.html +++ /dev/null @@ -1,60 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/modified_midpoint.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class modified_midpoint;
-      template<typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class modified_midpoint_dense_out;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/rosenbrock4_controller_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/rosenbrock4_controller_hpp.html deleted file mode 100644 index bd490e8b7..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/rosenbrock4_controller_hpp.html +++ /dev/null @@ -1,49 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/rosenbrock4_controller.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Stepper> class rosenbrock4_controller;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/rosenbrock4_dense_output_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/rosenbrock4_dense_output_hpp.html deleted file mode 100644 index b0364b5fd..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/rosenbrock4_dense_output_hpp.html +++ /dev/null @@ -1,49 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/rosenbrock4_dense_output.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename ControlledStepper> class rosenbrock4_dense_output;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/rosenbrock4_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/rosenbrock4_hpp.html deleted file mode 100644 index fede14521..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/rosenbrock4_hpp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/rosenbrock4.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Value> struct default_rosenbrock_coefficients;
-
-      template<typename Value, 
-               typename Coefficients = default_rosenbrock_coefficients< Value >, 
-               typename Resizer = initially_resizer> 
-        class rosenbrock4;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta4_classic_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta4_classic_hpp.html deleted file mode 100644 index ca0cf8329..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta4_classic_hpp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/runge_kutta4_classic.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class runge_kutta4_classic;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta4_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta4_hpp.html deleted file mode 100644 index a463ff2e7..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta4_hpp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/runge_kutta4.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class runge_kutta4;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_cash_karp54_classic_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_cash_karp54_classic_hpp.html deleted file mode 100644 index 272c691ba..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_cash_karp54_classic_hpp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/runge_kutta_cash_karp54_classic.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class runge_kutta_cash_karp54_classic;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_cash_karp54_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_cash_karp54_hpp.html deleted file mode 100644 index 75bb136ad..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_cash_karp54_hpp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/runge_kutta_cash_karp54.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class runge_kutta_cash_karp54;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_dopri5_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_dopri5_hpp.html deleted file mode 100644 index 09eda172e..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_dopri5_hpp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class runge_kutta_dopri5;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_fehlberg78_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_fehlberg78_hpp.html deleted file mode 100644 index b0788ee8a..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/runge_kutta_fehlberg78_hpp.html +++ /dev/null @@ -1,54 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/runge_kutta_fehlberg78.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename State, typename Value = double, 
-               typename Deriv = State, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< State >::algebra_type, 
-               typename Operations = typename operations_dispatcher< State >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class runge_kutta_fehlberg78;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/stepper_categories_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/stepper_categories_hpp.html deleted file mode 100644 index 1ddcfa106..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/stepper_categories_hpp.html +++ /dev/null @@ -1,66 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/stepper_categories.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      struct stepper_tag;
-      struct error_stepper_tag;
-      struct explicit_error_stepper_tag;
-      struct explicit_error_stepper_fsal_tag;
-      struct controlled_stepper_tag;
-      struct explicit_controlled_stepper_tag;
-      struct explicit_controlled_stepper_fsal_tag;
-      struct dense_output_stepper_tag;
-      template<typename tag> struct base_tag;
-
-      template<> struct base_tag<stepper_tag>;
-      template<> struct base_tag<error_stepper_tag>;
-      template<> struct base_tag<explicit_error_stepper_tag>;
-      template<> struct base_tag<explicit_error_stepper_fsal_tag>;
-      template<> struct base_tag<controlled_stepper_tag>;
-      template<> struct base_tag<explicit_controlled_stepper_tag>;
-      template<> struct base_tag<explicit_controlled_stepper_fsal_tag>;
-      template<> struct base_tag<dense_output_stepper_tag>;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/symplectic_euler_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/symplectic_euler_hpp.html deleted file mode 100644 index 8f1ef43a4..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/symplectic_euler_hpp.html +++ /dev/null @@ -1,55 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/symplectic_euler.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Coor, typename Momentum = Coor, 
-               typename Value = double, typename CoorDeriv = Coor, 
-               typename MomentumDeriv = Coor, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< Coor >::algebra_type, 
-               typename Operations = typename operations_dispatcher< Coor >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class symplectic_euler;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/symplectic_rkn_sb3a_m4_mclachlan_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/symplectic_rkn_sb3a_m4_mclachlan_hpp.html deleted file mode 100644 index 32c56a83f..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/symplectic_rkn_sb3a_m4_mclachlan_hpp.html +++ /dev/null @@ -1,55 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/symplectic_rkn_sb3a_m4_mclachlan.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Coor, typename Momentum = Coor, 
-               typename Value = double, typename CoorDeriv = Coor, 
-               typename MomentumDeriv = Coor, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< Coor >::algebra_type, 
-               typename Operations = typename operations_dispatcher< Coor >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class symplectic_rkn_sb3a_m4_mclachlan;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/symplectic_rkn_sb3a_mclachlan_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/symplectic_rkn_sb3a_mclachlan_hpp.html deleted file mode 100644 index bd8ef3924..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/symplectic_rkn_sb3a_mclachlan_hpp.html +++ /dev/null @@ -1,55 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/symplectic_rkn_sb3a_mclachlan.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Coor, typename Momentum = Coor, 
-               typename Value = double, typename CoorDeriv = Coor, 
-               typename MomentumDeriv = Coor, typename Time = Value, 
-               typename Algebra = typename algebra_dispatcher< Coor >::algebra_type, 
-               typename Operations = typename operations_dispatcher< Coor >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class symplectic_rkn_sb3a_mclachlan;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/velocity_verlet_hpp.html b/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/velocity_verlet_hpp.html deleted file mode 100644 index 4a7caabc7..000000000 --- a/libs/numeric/odeint/doc/html/header/boost/numeric/odeint/stepper/velocity_verlet_hpp.html +++ /dev/null @@ -1,55 +0,0 @@ - - - -Header <boost/numeric/odeint/stepper/velocity_verlet.hpp> - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
- -
namespace boost {
-  namespace numeric {
-    namespace odeint {
-      template<typename Coor, typename Velocity = Coor, 
-               typename Value = double, typename Acceleration = Coor, 
-               typename Time = Value, typename TimeSq = Time, 
-               typename Algebra = typename algebra_dispatcher< Coor >::algebra_type, 
-               typename Operations = typename operations_dispatcher< Coor >::operations_type, 
-               typename Resizer = initially_resizer> 
-        class velocity_verlet;
-    }
-  }
-}
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/images/alert.png b/libs/numeric/odeint/doc/html/images/alert.png deleted file mode 100644 index b4645bc7e7cd81f2818bf22aa898e95f89f7b154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 603 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoR!3-ps5|6h4Ddu7)&kzm{j@u9Y9{{=Y1AIbU zf%JpT46~{k9zA+AbLPwdAIsS2PzO_vNDmfMEtWH9&ip^auzMPVqn%}CB7>9&!}iGx z-;Xhv8px)lrL9@BCcs5vO&5cqu9T{h?38MTlmG^xxVH_1kB|46nGCkpmetkOTpSE4 zavV>eK0UdRp(B^!=?;d>5QYoO7|ac%0{lFz^%?x_8RR7yVthEP3>A&_q|CG#WW*RW zl{o(Y|IZtA$qVR2(~=;+U?7)dz)-XG0w_#43p^r=85p=efH0%e8j~47LDdr1h?3y^ zw370~qErUo#N?v<+|-oJLS?-v|XG0|S%xvNh*{8XkJOIEGZr$-Qt} zs7XP9Ey3he(pHrYspZRf78PH9`FH+W)~#!9NQ>E(|7f+bS8dIEdt&+3)9k$5zE@_n zwwz6h>zL57n052?|A&@wF+B45-}O%P&a!K2U&3G9nvuNo>8jg5#pWKJFg+#ZM_3KF z@0!U*M+MgC=JZ@&d`GA4#mi|OP1Q3WUuyYq=o{O;ODgJig+1&Ot|jSj5iH+p{qlah z-+>>`onNNZu_SEo{1c_>E?8^dWc*|KzHYTkoV#ab9htMb`jx;F%~$-4S3IxI_4a$B t(zNWy?!(WO+m-mQI!w5#7{UFM>Ew3T@2Uk;6oH;)@O1TaS?83{1OOIu3ZVc1 diff --git a/libs/numeric/odeint/doc/html/images/blank.png b/libs/numeric/odeint/doc/html/images/blank.png deleted file mode 100644 index 764bf4f0c3bb4a09960b04b6fa9c9024bca703bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1SEZ8zRdwrEa{HEjtmSN`?>!lvNA9*>Uz33 zhE&XXd(lylL4oIh!GZnHecj|txT>yO8>^qY%(y?B;Tppl#t7yOYze#vq#8^aMzDZb YLK^d5CO(feU_df>y85}Sb4q9e0Beb;@5Jms&t_+qirbvUVh|&#BatJPvqeMAG3eJI2P~{ToLa~KgB*G#^M#2_a3)VYn zVgvz1M%rd}-qW9r=_zaNV-N&yold8HOHftSx7PZF znWv3J5s?VPuss+I+C&6q#(KSmloGvO?*KD1ilVq*tyW{LH5!R%28alCU1K(zVKSM( zIR_#-JRt<)I7YwUPn1$)t@RT#D|H;v7=y)Pfubl7MbX&`M1*d)3jm2RW~{Zwi6BW5 z - - - -]> - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/10.png b/libs/numeric/odeint/doc/html/images/callouts/10.png deleted file mode 100644 index 0426f516a497db7f9a989ae412c381123c882a59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 485 zcmVye?*7-J8XwLb#oWGHAsf2pa!fFY62Q0 z;mh~sbZC{ErT1M9yl|fLa(G!7hF#A2`>Lu`ydhOplks@`lQAalo|fnN2VK{{wcG9H zTY#b{eg{GDnTTHQ5REaWv|6p^U@&Mh#y~_!(-f+z!m=!!&u45l8;nLH*tY%dbUHl; zL4Z3%xzibAkW#|;eavPv2qBOp2^Nb5%CdaSUa#k9n)Vz7!4nZ_%Ik=69OG~};Cj8n zFbsrYh;Fxw$z*~~r-Su+4bwDh5bZUt3;;luWw0y@oOA5=dklv|0Duqzx7$qs_)$wxRTZ)pymR;BV1>g5SZnxW9 zN=Z^m;+&I|lB%jADJ2y}K}Asz=bWM_DwoUU*VSs}Jc>j_Ri5WX6h;3nk(9E^^Zfhc b@<06n&dl<{Ml4d|00000NkvXXu0mjfA|==h diff --git a/libs/numeric/odeint/doc/html/images/callouts/10.svg b/libs/numeric/odeint/doc/html/images/callouts/10.svg deleted file mode 100644 index 4740f587b..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/10.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/11.png b/libs/numeric/odeint/doc/html/images/callouts/11.png deleted file mode 100644 index 821afc4fa84787cc97485b71e9f2078f45c93dca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmV;L0cHM)P)M+td|6n+lpimUPx=_1S)c4H7YUPG|K7G}+Q zXD3BY$LW0J{_Y!?Z)RXbkxz7K`tz)v9=YBoPVL+Dl#6|9v864%XTq&y%0>7v#V81+C6pQ~&?~07*qoM6N<$ Ef)+u)Bme*a diff --git a/libs/numeric/odeint/doc/html/images/callouts/11.svg b/libs/numeric/odeint/doc/html/images/callouts/11.svg deleted file mode 100644 index 09a0b2cf7..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/11.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/12.png b/libs/numeric/odeint/doc/html/images/callouts/12.png deleted file mode 100644 index 7cec72720fa9bb6f49fc4b405f7e36f20abe7fbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 488 zcmVP)PuxtyZYjYA&U;&lvlvl%n)GViZMKE|)kS zkFYEYm&*m+ZWonG1>^A;S(d@JZ2)kiDC#rD@FH+s7fF(UQVPQ`V4DBV62~#pG)1S= z0U-poZG&^}uGi}y+Ot5@G-O!@%d((p+5?_Wr)am^s8*{00M0p1rxOP-eGy10k!2Yi z#{mFrHXDpaBeYsAl*?rR!0mQJ6h-`SIJ_4Mg>Nq_2qB=9g75nfLSQ%?Vm_ZEj$&j0IHOdd7hsai^YGRNC+YG eJpcU+1HfO$s^?_o4trMs0000 - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/13.png b/libs/numeric/odeint/doc/html/images/callouts/13.png deleted file mode 100644 index 5b41e02a670f020ae62b7854482c4ba1980d73cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 509 zcmV4)gxr*N=Me5VesZgwj%cYwtNqcZr1 zC_xao_jajoUYEXSJjwZ;bCQPyLGYn0%a1|`74MX)s;6GB_lFQtKYCi8=bv<4|7n`0 z@g7hV#ep&QO-lLlKr}*#(rh-3ZntX?LLjBY`Fw_|s<3Sv$Kw%U7{anFbUK~R;cyr; z#_&LthfW9q=N!K8V>+Fpu4^Pog5`1vAq0XTz;3rgtJQKfO&c@DzDOxG?d^$i9AmrP z;(EQpvMk*1cl7&xn5K!vVgUf4lmdVo$MKjkh9|&vU7SuQXqpCH*I^h2Hk%D*vl$%6 z!C)`|Aq13C)OGFd_xtb4TR>41q-hGvvY;pmIOk}$+Zc^TNRk9X2mnA`*T}N02Jrg{ z5JDhLQ`okRs;V%b&yi&rvMd9o6pEstsw%{BTwgAimqw%U_2~u9Ii!^EJP)d>!f_l- zCKFIfF&qv-2zeUzJZ}fz_dl=K>zs2gIp?x0OUXHxLI_z^mAu_ - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/14.png b/libs/numeric/odeint/doc/html/images/callouts/14.png deleted file mode 100644 index de5bdbd3eb8be01d27b6f1a345d586d0c4d61b2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmVt^dUO<1U`T*_)UESUECTZgDyfaHIPO@ zV~8gA-qWSZ=hE+t2hQ)D1An$&uiuqr`9UeA;f>NX?a=G>elfjW3O+&NU1ON~b(liBt_qW?^90URG z2*2x$F-R%l`#z@ADTEMUjDazRG)*y?Ot9PS&~CR~UDwA!5PT*gU4MOI9LI>F2*8=YK-YB`hJhqWuv{)N7z~gk2^_}( zV+^)!LkQvS_xo@BHNZJXmSwOk3sOqVW;0Y(g~eil%jJSR&jA2J2;_M#04$#Xr4+I( zgX1{RG!4Vy5Uo}VQ52!m>40;Ns;Usju{fPhFQ#dJd3r%g2_k~$dElI*-|wTUD&%>N z(P#wD`O~oHdB5TN{-^DBTSzHMN=ao|l9ZB^Qlyl6^vbfNFbu2JYW01y*|?7&5s@m2 p;u?nGe?ugtR7Fwzd~E(#e*x=4{y$G>PWJ!+002ovPDHLkV1hgS;QRmp diff --git a/libs/numeric/odeint/doc/html/images/callouts/14.svg b/libs/numeric/odeint/doc/html/images/callouts/14.svg deleted file mode 100644 index 469aa9748..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/14.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/15.png b/libs/numeric/odeint/doc/html/images/callouts/15.png deleted file mode 100644 index 3fd6ac38603390bf6f9bbfdb85ddb203e2edc421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 507 zcmVBYKkWd<`JW7;@NWpWE6kA22-~|X(5OQHtARz%p zgo})YY|I%?ny^`#?35$THzUn2T-SYK6o$hgE|&|GQZNhy)oRs}QuZCk`NYgpzCO|SeXLe1 zoX=5sUIS^G zA`C+qh5;hNcs#~#x5IY3#p!fHqtU?ac7yNxDhPt-d_MpA;Q}H8Go#sTBAd;k)9GL| z8UX;h-7cPGb1bv51I>iHMUVVItx*O__)|j$@AFn3E*o<#KtO&1T;` x&$C{F#LQ_FMe%aE{BMYeD2<}%$IIrw^#|YO0JIScbaVg!002ovPDHLkV1ffM - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/16.svg b/libs/numeric/odeint/doc/html/images/callouts/16.svg deleted file mode 100644 index 01d6bf816..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/16.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/17.svg b/libs/numeric/odeint/doc/html/images/callouts/17.svg deleted file mode 100644 index 0a04c5560..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/17.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/18.svg b/libs/numeric/odeint/doc/html/images/callouts/18.svg deleted file mode 100644 index 1cb891b34..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/18.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/19.svg b/libs/numeric/odeint/doc/html/images/callouts/19.svg deleted file mode 100644 index e6fbb179f..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/19.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/2.png b/libs/numeric/odeint/doc/html/images/callouts/2.png deleted file mode 100644 index f7c1578846cd7e67f148e7bbe3178ec170050e48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 446 zcmV;v0YUzWP)g%HYe&5tuzq8hs@J33d((l1w@Pmj<(Q}ki?_Jk@sMTtf zw*YCH{*qFDX6DBN;t-LjR;!hMzhBAo9NX;{Ns_?#eKea*5D@@?nUN$(_k2Fjq?9Ni zqM$P~*6TG+rxT1Zn9t`h#(;=GL=Zxt(P*I6YIPjPnMo->GPC16S8TW27>~!$T4T4{ z!CL#`3q*u^y$%4KIF4shO56>E5a@Qh0DvF}FdB{Ey6&qx6cEqzI?Vj#g@G{!tJMlb zgvn$AA;c>{@$P!P8UWwL^X787M4F};4u}67&aw<~9GlDK@>njHKiv(YD8gc~faiG# z!w}Qy6un;Wzr()o|3nZ39}b6u(pvNFcDq-WWo)gzm)4q($78nHY`%tJ*eRe6Gh3xp o8b#4xm5bzgZk1Bs?wkMQ38E9=PG^kAEC2ui07*qoM6N<$g4YPrD*ylh diff --git a/libs/numeric/odeint/doc/html/images/callouts/2.svg b/libs/numeric/odeint/doc/html/images/callouts/2.svg deleted file mode 100644 index 07d03395d..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/2.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - -]> - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/20.svg b/libs/numeric/odeint/doc/html/images/callouts/20.svg deleted file mode 100644 index ccbfd4031..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/20.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/21.svg b/libs/numeric/odeint/doc/html/images/callouts/21.svg deleted file mode 100644 index 93ec53fdd..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/21.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/22.svg b/libs/numeric/odeint/doc/html/images/callouts/22.svg deleted file mode 100644 index f48c5f3fd..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/22.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/23.svg b/libs/numeric/odeint/doc/html/images/callouts/23.svg deleted file mode 100644 index 662421295..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/23.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/24.svg b/libs/numeric/odeint/doc/html/images/callouts/24.svg deleted file mode 100644 index a3d552535..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/24.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/25.svg b/libs/numeric/odeint/doc/html/images/callouts/25.svg deleted file mode 100644 index 56614a979..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/25.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/26.svg b/libs/numeric/odeint/doc/html/images/callouts/26.svg deleted file mode 100644 index 56faeaca3..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/26.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/27.svg b/libs/numeric/odeint/doc/html/images/callouts/27.svg deleted file mode 100644 index a75c81215..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/27.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/28.svg b/libs/numeric/odeint/doc/html/images/callouts/28.svg deleted file mode 100644 index 7f8cf1a35..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/28.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/29.svg b/libs/numeric/odeint/doc/html/images/callouts/29.svg deleted file mode 100644 index cb63adf1f..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/29.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/3.png b/libs/numeric/odeint/doc/html/images/callouts/3.png deleted file mode 100644 index 3ff0a93931515bb97a045dfa61a8530d87e458fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 431 zcmV;g0Z{&lP)?w-3fw;Fb-ls zDri;RUK#8kv6dIk;e17_)v9tnpMMx*Y&>|jZU1k#+kc5jU2l$*@~7*%uccC{@JNuR z=|3UFGc%8`5{HPaVzF3gG#Ul1H5Q8nk|aSGhNx63AR+(&Gb2for`>Kh6hh!Cv95Mz z#%wl26h%- - - - -]> - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/30.svg b/libs/numeric/odeint/doc/html/images/callouts/30.svg deleted file mode 100644 index dc43ba1e3..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/30.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - -]> - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/4.png b/libs/numeric/odeint/doc/html/images/callouts/4.png deleted file mode 100644 index 6aa29fc0b48c17aa6ce5540e1af5c00510c33ff7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmV;q0Y?6bP)1BH{J6*Ukh&=Hmk zRECzB?yd`#@n#QU|E!Aozxu0ay*5o+uKTCg>-{Doo%e)N>T9`N{#mQl zDxU$a*Xx^<@&_}&`kN4wpI>%IqLW}MIG_VIWeN-2>; zoSaTXAR-uJFqup+8jWC#x%C~#L8H+?tJU&_5JM^DcV-r%7*T7D*=&aGc8h+$k5Z}h z;RGT=y2!)DNiZId zk)|oEwRfMXwMLR88o;j`!1sL&1_N9!7XU!B*}QAcvJ7z?>(lA<;(6X97K_EV-EOC> zwam=CTrN2bL%ydpO*x99EDXcv&1T~R`1b>51^@&>@S!foE^ZEjU=IL-nXOXl8b#6F j$hnL$Rw?ybGy}k2rA_2 - - - -]> - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/5.png b/libs/numeric/odeint/doc/html/images/callouts/5.png deleted file mode 100644 index 36e785867ad9b06bb5da296fee61b67cd8159ded..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 423 zcmV;Y0a*TtP)s#AqNWNL+{%m!bruZt@^q`VMYNAEFDN!c`Zp`V!qpMaG}43yDw*Mu`(* zCbz2uThU&a&4u&vojYu`S~+nXKc;Ca@XrV#zFpV-WQ--*&QMDAOw)X`ZM*azAc~?d zDdh_hjWdYB7~_^@m72|FNo$S8VuAgBk7~7wPNxITIRJo&a5x+uw%hGcN{I}@Gdg1o z%jFWY*$iQ?@7|P`` z05p8xA4(~a8)&V;ImciyK)>J5O>RMIwOWISUUP#W2;jOd9LK@wbh>-YBuNm4VFKVI zH`r`8m`o-J!w}Qy6y0tYrfFV<&*w9I-%o-d7#EAh=N!;(w_)2hMxzmk2%hKVKX5DD zYPB|b1tA1H&qJ@*L!nTB5CTN>OZ#sa01P5Zl~U1qy}sL9Yn>{k-Y>%d@B>ihzNus- RRfYfn002ovPDHLkV1oUuv|0cF diff --git a/libs/numeric/odeint/doc/html/images/callouts/5.svg b/libs/numeric/odeint/doc/html/images/callouts/5.svg deleted file mode 100644 index ca7a9f22f..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/5.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - -]> - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/6.png b/libs/numeric/odeint/doc/html/images/callouts/6.png deleted file mode 100644 index c943676beafa0562916b058c169951febcd3cddb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 431 zcmV;g0Z{&lP)2x}6wAN@OL1SlT zq-l!d@d)P}cDo(C_aGt=5rQCqQVQeoIFeFswANpkS;|ImKA(}MDdzJz27>|OIED~! zYat?pVF&fG5i@@eULRJg71rxDq9{V1 z=O32ooI_Pr4#2O6Kq&=lEvl+QS(Z>r{TII9@5r*u<$32$t61k>phVHje&-69M_ zOeT}3aFQf{9wiDPuv{*&SS-+LwIGB5Grx)b9tHr(%(b=ldN>?D{22he_qDb5=W7@M Z{sBv`yEO&CdT0Ou002ovPDHLkV1o2ux|09^ diff --git a/libs/numeric/odeint/doc/html/images/callouts/6.svg b/libs/numeric/odeint/doc/html/images/callouts/6.svg deleted file mode 100644 index 783a0b9d7..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/6.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - -]> - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/7.png b/libs/numeric/odeint/doc/html/images/callouts/7.png deleted file mode 100644 index 20940de30d2146b73118a08905955162fe985f68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 397 zcmV;80doF{P)^QMQBulp-}gU=C{Aa}81s!lqHiS0W-t%ynn-<=Y3{Rlv1MG?LtZkX1=)gZx{d+ rGh1U!IGfG>ygNw}Ym9k2g#q9P_H(VTcF&$q00000NkvXXu0mjfg$Ay% diff --git a/libs/numeric/odeint/doc/html/images/callouts/7.svg b/libs/numeric/odeint/doc/html/images/callouts/7.svg deleted file mode 100644 index 59b3714b5..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/7.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - -]> - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/8.png b/libs/numeric/odeint/doc/html/images/callouts/8.png deleted file mode 100644 index d8e34d4a09f6dca4f9c22e626d9f9d82b969b02c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434 zcmV;j0ZsmiP)2AuM{XfkN9S(EO_B7zVCVHjdQpD(18TdnnH=bV%s&@>J9`#qv4f)D~(mcd&4 zVg({X5Cj0QD2igMwT8TJhGB>}jsXCZ$prGB|9~*_BG2=u+m9^EFdmPw*=$hPHR3o1 zGrx*3Gped$06%UwxLhvqeIG=Gs;UqK0fZ0_;ihR&6a}Bp=jXv-@a4uUrH~{E(lkXF zhFGuH@I3F$uu|&R4VX@+h@uGAS_mP~@Au)HdolL^VE~ZMIcto$9*@U|aqp{bTWgH@ cejf&azhINZs#OUR!~g&Q07*qoM6N<$f@$x%rT_o{ diff --git a/libs/numeric/odeint/doc/html/images/callouts/8.svg b/libs/numeric/odeint/doc/html/images/callouts/8.svg deleted file mode 100644 index c1803a3c0..000000000 --- a/libs/numeric/odeint/doc/html/images/callouts/8.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - -]> - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/callouts/9.png b/libs/numeric/odeint/doc/html/images/callouts/9.png deleted file mode 100644 index abe636072b61306fbcd6157b95dfdf7e86a77e5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmV;V0bBlwP)J?lRHzhELZiNz|1T-iU zCV!@@1hs;1In4LXdqeB>`avo6nCH2PJ26c& - - - -]> - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/caution.png b/libs/numeric/odeint/doc/html/images/caution.png deleted file mode 100644 index 5b7809ca4a9c8d778087522e5ce04b6e90099595..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1250 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbQ|Pftew|C&U%V<=|it5MYpyU{F+K zFf?Rva$<;zVn|MA$j)XcE@r5%W@u>vqT-$&hMpcE*)wGd!;~q-Q>IkUnZqz=PVt;M zK*p3gbLK2v%CK~4^3tV1#?q}@8MbbX+PXD)>(;G%_cH9=n|$sZ!?|yxmE{-7;w@N47?rU=3X_NkV zU|o{PnRTZ;lXp4>+)hZU_|Lw%*va*6=<@jI@BP^`_OsZ?pZg-2AaGf|;i2L0<>du@ zeRrO4er03}pLSxdREd>pap^;~&E+}=JYKy#vHnLI=Z$}pPyA_`zG;G~<$`Br2do;7 z$Heivv0AeyJYVI({@6?X6r+V~XS2Cs!|bddDqJz@2lKf$~4dA1c%lfOT+5KMUSWi#X5(9ePxx_W1Bsf2+N)z4*}Q$iB}K{RAP diff --git a/libs/numeric/odeint/doc/html/images/caution.svg b/libs/numeric/odeint/doc/html/images/caution.svg deleted file mode 100644 index 4bd586a08..000000000 --- a/libs/numeric/odeint/doc/html/images/caution.svg +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - Attenzione - - - - pulsante - - - - - Open Clip Art Library - - - - - Architetto Francesco Rollandin - - - - - Architetto Francesco Rollandin - - - - image/svg+xml - - - en - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/draft.png b/libs/numeric/odeint/doc/html/images/draft.png deleted file mode 100644 index 0084708c9b8287c51efa6b40b8d492854191455e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17454 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 diff --git a/libs/numeric/odeint/doc/html/images/home.png b/libs/numeric/odeint/doc/html/images/home.png deleted file mode 100644 index 5584aacb097a80e66a5320312b6e4eb017af1a06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7T3?v)swEqJs=3*z$5DpHG+YkL80J$mwJ|V8+ zB7)tW9nKDRM~@s%h>KBER+u?+=H<(mwr$-K=fo0^iDsNj}a zlv - - - - - - - -]> - - - - - - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/important.png b/libs/numeric/odeint/doc/html/images/important.png deleted file mode 100644 index 12c90f607a1b27ddde0a7d922ae255e8c90e883e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 722 zcmV;@0xkWCP)Gdz_qOoSb{LwMwNgp7=gl$4aErG%}mjHRWNrKOy`y@b8JoTa6ut*xc4t*y1SwY|N)#>U3Z&d%1> z*52OU=jZ3|@9+2b_y7O@tTMkk%M`~Kg@u8&dg_P^_0l3yQb639!jLZt^Lx<-O17UeeJ z-|=!77W(jGx&e#?FOku-gKofoU0$~4M+dhLFueEauP`}l7LV=;lsOdn%WHure=x;k`m0(bF&MU#) z-qv#^n8(MjB|ykioqII#+`g4no-MU=BK|Sahu_3M_-d*=7hq=~t?^}A)G7 zbairN0An*{V`DL9V>K}|HDobmIW;*pIW=W9HaTQ6F*7kTGI9=S@Bjb+07*qoM6N<$ Ef=i}M4FCWD diff --git a/libs/numeric/odeint/doc/html/images/important.svg b/libs/numeric/odeint/doc/html/images/important.svg deleted file mode 100644 index dd84f3fe3..000000000 --- a/libs/numeric/odeint/doc/html/images/important.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - -]> - - - - - - - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/next.png b/libs/numeric/odeint/doc/html/images/next.png deleted file mode 100644 index 59800b4e87f60c0e3383ede2b384b9be0f5ffe8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7T3?v)swEqJs=3*z$5DpHG+YkL80J$mwJ|V8+ zB7)tW9mdAS+qP~A^!HU$R#>ro>7z#vFJHct5EtX@VE6z3e?1}lM4)<}k|4ieAQuK0 zgzld^2NdTl@Q5sCVBi)4Va7{$>;3=*RZCnWN`mv#O3D+9QW<;`lZ*0mQ&Tb%72Gn5 zQp@v;vWpdbBNU7b3{2X~)|>}w5Cds&E=o--$;{7F2+7P%WiT|*H!#*WFgd=yhZCqG z!qdeuq+(9;4PKV1Hyx6gnJ3)X*T8%1&d~!CcvGht8EkNzY0cztDB;<=un7h&oMQJ5 zOnAh^!sYOgmxqZbU_wKJkwW(@g)2%k8?y8!<$B~f6iH61Ubv5eVdat_!+^S!9H1Qx Mp00i_>zopr0Jz|Gn*aa+ diff --git a/libs/numeric/odeint/doc/html/images/next.svg b/libs/numeric/odeint/doc/html/images/next.svg deleted file mode 100644 index 75fa83ed8..000000000 --- a/libs/numeric/odeint/doc/html/images/next.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - -]> - - - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/next_disabled.png b/libs/numeric/odeint/doc/html/images/next_disabled.png deleted file mode 100644 index 10a8c59d7b3741260b7bfe918b62d0670cad8433..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1110 zcmY+@U1(Ba7zgmjDRvTtQ&L$$oM7uF2)$_$L2619oS2=UZrYjBy6mRGh`_UtKA{mr z&7hmQ>n7-KH(k`l3W_tgna$01TCHhYnyqEo%+oU}@c)DNeRv<Aw4@Ln z93k3vZsg(J43U|lVL3RF9xoOO*=)8_spRvsnW@QgsZ^`gs@1Bl&*gH{hGA%$HjdJ0 z0!^YRltHf%-=x_aG>vj-2F;>8dW+_ej^3ep^d5ac3+N+SL}4$&L!O*Z;pbcwggWI6Ht znSIeG^MqH2daRdq_j=NKWUEDx?&yZ{K(t0hNp-olr%gM()V(P|g0v^Rdp~d9J+QaF z!E^J*7D+vMK=CJy#-QLKKFMEfm#>;6HRZnKq86dtH6)t7^tAr+x)|r>qo?RMm@+$*>08dLHng9R* diff --git a/libs/numeric/odeint/doc/html/images/note.png b/libs/numeric/odeint/doc/html/images/note.png deleted file mode 100644 index d0c3c645ab9af6318035b026dd86944b9ddc9114..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?rX+877Y2q^y~;)m42&$EE{-7; zw^Ao5PC9JB<666~wbh%Oo7tJ0_rGWfi({a(qjR96>_P4H$tJl=Pxd^1p6`8M?=jE( z!hchf6<8Mi`NHe6`iia69>!lxe4C2-S>+Wvj;l63k!MNSb9|1+f-i>irDi|a^uLl% z^#-f2#pQ2lC%m~9m9JWJZL3|T8FRX>A78<>cU{Z6XGFG336=OLGkw25|29|RG_k%U z>j|M}Ih2i#-w+9_ - - - - - - - - - - - -]> - - - - - - - - - - - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/prev.png b/libs/numeric/odeint/doc/html/images/prev.png deleted file mode 100644 index d88a40f923e3c554125f01cd366707c60cfcad04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^!XV7T3?v)swEqJs=3*z$5DpHG+YkL80J$mwJ|V8+ zB7$jYX~xFJ+qQ05v3zNuzpt9I!sW}Cx;s0Z9qba~V*daCKl2PvGf+KGNswPKkP8D0 zLif*|1B!DNctjR6FmMZjFyp1Wb$@_@swJ)wCBgY=CFO}lsSLh}$wm3OsVSL>3T~N2 zspa`a*~JRJ5eh~I1}5!gYt92Th=DXX7o{eaWaj57gkwm>gfq&(JZLf6ZeXy%aV8%R&r1O{j}20XTDX{IIykaj z4Nx#hVBm6cU}k1+>Qw1kB6gA`rFdeFa~bob(-ZFQzAc!;#K4>y+$E64`2%PJgQu&X J%Q~loCIAR&aHIeL diff --git a/libs/numeric/odeint/doc/html/images/prev.svg b/libs/numeric/odeint/doc/html/images/prev.svg deleted file mode 100644 index 6d88ffdd0..000000000 --- a/libs/numeric/odeint/doc/html/images/prev.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - -]> - - - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/prev_disabled.png b/libs/numeric/odeint/doc/html/images/prev_disabled.png deleted file mode 100644 index ab3c17e02d156e7494dbab2f9cd66af46af2358c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1109 zcmY+@QAkr^6bJBgcW-U!1{X&)qK7M_5M*o=8THWJ+-L(GYZ=trG_;qf9*iP{hOHkvdvc6%2vA_iD3U9-0yJDcRs#*KhAd};6H4s z+g3+J7N6H0vA^EQ+H!#9vbD6`Ds$w15^-3cW^4D2@1tYP~^k(L0ny@6iX8LwWQOEu&AU zfQo1ZeMa02wZ5RQ=o?x^-x0S~tsm$oT0_531^q^UP!(}k|Km7w>=EA^b6?PZ^nZ>c zHKa9-^N)RQXXnMy?rd*3eEalZV2h}d<7uSYUol!mlhPcO#b+0y%6jsu%~o|iC&Tqk zjZ&+ugrhej$H%%!n2hY4Bw5`RXuNjl<&!a&&LzU`dgFGUS~a!}3S4TRbC4w09~9k9 z);;a{R+T2~>V^|?*&xZWmO@B-pr0ES45n;vpEFE`ily1KnYZ`aRH^GBuiSf29T*)S kmrP2ur(nL^B6b$eQ zaTOO4T)k@LniZub1%Y8f*1x{4x_4{3i<3oNO~t)?cMWybC-tSAKHfEHLVsF{-%ks|7 zjDPxIwu_^_r<>iTb(LLhafxxBUq39{v3=XjnKLh+@6Sy0Xlrc@39wrE41I-`%@*_H`vT)Rk40g{7sX z`FNVTJ6okB1!txP#zY2wc(d5s)2XE)>ihSl4mQR?K~7U9WB`>-?C(j83rmc1F39y? zzq)+;=Gy(c8ka3y($mw@(UR0yUs+Qb`ct-`85ma4B|(0{|49c7L~4o1Q3?TC!&%@F zSTaI#9`SV_9+c( zW;eO@wl|k#YcHt%5b*DNxDw|SUx{9YOXh`gE=j?bXD{#?S~XQQJ?8HZ6@8!dXRi6f zFs(-mE_w-be$Bq$tZlXB;`6;hFXYS9RpKXpuq=q{RQb~W-D%-&g`@1Dljl5NzBeuH zd3B|Jc-c9=PwD+{`aRe5YtcxAH&Vh)Vt}-<~+7jfdx*(to}? W^F^#dfhRDm89ZJ6T-G@yGywo=2(Kal diff --git a/libs/numeric/odeint/doc/html/images/tip.png b/libs/numeric/odeint/doc/html/images/tip.png deleted file mode 100644 index 5c4aab3bb3543191c360387c4af9a3cbaa051345..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^l0YoM0VEi-?r};1DW)WEcNYeRRlUkaK;CUn7srr_ zTcwkB3m#VBagbEhuIO1a$!w|j^feEHv@=+|woj32oF*6|l<3XH$!T}Lao)e6jJhoQ z_vr?OZVprC|7iZ8xaicUR0b&zR-JdP408=+?zC0Rn8IN&QLTWhMIcU0X8P7uUN4WB zR_?a_;&p>ll{>(OzfJ4N{OX={Q&zNgO}j31DC;|ya^r9Fjd348&p+!^cT+^sws+=& zCu*T*mRNK3PE;$BNx$Fa_9(Y=&DoXLMFRd#U31O)<`W^F&-o=xbIqK-c?mr!bmn>! zky6TW;ML~4nXw$T{yra=OteL6G!=B;0=?;6;u=vBoS#-wo>-L1;Gm(b>6x3Dp6Z*J zo|&AjV4`QFXQ5zesc&GRZ(yj9T$EW{Qt6OeSzMBtte0A>mr`1gpI4%noS!>!m*Ngk zP=bxiOwUU!DFvFBnrfM1VQy}0X_lO7WM-b2nq**TZkb|inr2~`WR#dJWc*7VsEZGz hD*$LMgOO>4k%_i}w!yxSoa=!y44$rjF6*2UngF(YpwIvS diff --git a/libs/numeric/odeint/doc/html/images/tip.svg b/libs/numeric/odeint/doc/html/images/tip.svg deleted file mode 100644 index cd437a5e8..000000000 --- a/libs/numeric/odeint/doc/html/images/tip.svg +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - lamp - - - - office - - lamp - - - - - Open Clip Art Library - - - - - Sergio Luiz Araujo Silva - - - - - Public Domain - - - set 2005 - image/svg+xml - - - en - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/toc-blank.png b/libs/numeric/odeint/doc/html/images/toc-blank.png deleted file mode 100644 index 6ffad17a0c7a78deaae58716e8071cc40cb0b8e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngf!VDzk7iOmbDT4r?5LY1G0LBeqssYGrXgF}- zKtn^rf1vn(hW}s+NCR0w;4iG^2^42c@^*J&=wOxg0CMC!T^vIyZYBTtzyH6zKuy9A zentg0F+qV0g#~P97#OBpaJrNsxA6f`rE`gEL`iUdT1k0gQ7VIjhO(w-Zen_>Z(@38 za<+nro{^q~f~BRtfrY+-p+a&|W^qZSLvCepNoKNMYO!8QX+eHoiC%Jk?!;Y+JAlS% zfsM;d&r2*R1)7&;o@#7ik&>8{Vv?F>U|?x(ZfKHZYGz`bmXczeoR*Z-Hs=yh7cWRx f0MJ?nL(>XNZ3Ars^Rf>h;}|?${an^LB{Ts5OHX0g diff --git a/libs/numeric/odeint/doc/html/images/toc-minus.png b/libs/numeric/odeint/doc/html/images/toc-minus.png deleted file mode 100644 index abbb020c8e2d6705ebc2f0fc17deed30f2977a46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngf0VEhsJkjh1QcOwS?k)@rt9q4-G!sMP)HD-wQzH`-1CumMgJctv6pLi@6hos# qqtv?{|7HPo@q%;(0Ig*(G_A1IHqbUOFZ%#8j=|H_&t;ucLK6V~f=xvL diff --git a/libs/numeric/odeint/doc/html/images/toc-plus.png b/libs/numeric/odeint/doc/html/images/toc-plus.png deleted file mode 100644 index 941312ce0dab168e0efcc5b572e387259880e541..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngf0VEhsJkjh1QcOwS?k)@rt9q49T#T`K7w7|w?rspM=lmg95OfodLFfd9rOi4*hH8wIdOfpPPHA_l1 vPBO4aOiebg{S^Z=hXV#3jn*#4_ x=vj5p^wF)?xpx*Du6ddKc=uuXxWffq{6A*KyDFWJxdXJF!PC{xWt~$(69DY=mmvTE diff --git a/libs/numeric/odeint/doc/html/images/up.svg b/libs/numeric/odeint/doc/html/images/up.svg deleted file mode 100644 index d31aa9c80..000000000 --- a/libs/numeric/odeint/doc/html/images/up.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - -]> - - - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/images/up_disabled.png b/libs/numeric/odeint/doc/html/images/up_disabled.png deleted file mode 100644 index e22bc8712192df3a8faa3264b0ec71ff3aaaa96c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1115 zcmY+@Z)^*37zgl2dzmw~oK$GMafp#cWXs;jyt!6uYtl7UeZec8`SV6X{7De9Dw2(4 zm>26}32(gcW*OddFPdfV_NT?wYHgXdTAfl#H+r5D$$dY`-IIHMf0Ezb_xin_j)wY; z^+eR*>U8+HT56YQ=DTxXyvjv5Ve7IHJsG&Xy#F3Q%RQaGE}~1@h=SLMDmvFJ(fJml zT!5&3h-ky9p~u59A~Sj2e&_VmWGa=4$F*XyxL7D;GnsO^oJh>ZqBHq?zEmnDlXI0y zMc4I7gDEtPW>6Hx&`b0Ry+#^}qc><4CD2?%a47s&%&rYXwnm@^2oK6>2RiC(}ybQxc@;;j!lN7xJKGXK5u*58HCq zi)yn~zbYIeQ(ynxTdSHPs@k~jXquO=uiH1eY2@@XO+VY(#*4k%x7x*t?&AUCt?S$* rDO!X~;(e<^-4?Sb9}HJ}I(CrQLYik+oARjr0iT6jPLE^M9tiybIrJyp diff --git a/libs/numeric/odeint/doc/html/images/warning.png b/libs/numeric/odeint/doc/html/images/warning.png deleted file mode 100644 index 1c33db8f34a8b42b373179b46a2d8d8a10e061a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1241 zcmeHH+e?!H6#vDtmgHCxG{Q}12(7`~)|MMe^RnTlY0JD#q1sIwW1DTCqzzwWg@Q=t zBC2Iceu@w4LHM97Gb5%*E%9MN*%m}jvs!{N@Pd8$H}vS?TsRzlzr#5kPPe|YG%fXL zDu6VdR$WC$&Oc)^X#ZjK-7LU>{!F!o39xr+d_Vw5fMTEwpb-s#9q<5Nzz6gIepyU?Lctpr{ZK zVzWaWPAC)#17S8h%;AIuf(Q_yeIybEqS0s^i1YdJcsv0ln9M{Xkpz;-I_^=P))~D~!!Hvpq{Dl8O{rN@cECkt>#DncX%I(O&3i_YgL-$m$VU zT3cLBLS%M1`o{TBX}S|Tbhc)vk!Yp)%rdDd&my(RPsxl%lU$)tC?(1~WuEwClUQn! n$Q8O{Mxt@ukkcT{K0> diff --git a/libs/numeric/odeint/doc/html/images/warning.svg b/libs/numeric/odeint/doc/html/images/warning.svg deleted file mode 100644 index fc8d7484c..000000000 --- a/libs/numeric/odeint/doc/html/images/warning.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - -]> - - - - - - - - - - - - - diff --git a/libs/numeric/odeint/doc/html/index.html b/libs/numeric/odeint/doc/html/index.html deleted file mode 100644 index 00b75d0ee..000000000 --- a/libs/numeric/odeint/doc/html/index.html +++ /dev/null @@ -1,178 +0,0 @@ - - - -Chapter 1. Boost.Numeric.Odeint - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
Next
-
-
-

-Chapter 1. Boost.Numeric.Odeint

-

-Karsten Ahnert -

-

-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) -

-
-
-
-

Table of Contents

-
-
Getting started
-
-
Overview
-
Usage, - Compilation, Headers
-
Short - Example
-
-
Tutorial
-
-
Harmonic - oscillator
-
Solar system
-
Chaotic - systems and Lyapunov exponents
-
Stiff systems
-
Complex - state types
-
Lattice - systems
-
Ensembles - of oscillators
-
Using - boost::units
-
Using - matrices as state types
-
Using - arbitrary precision floating point types
-
Self - expanding lattices
-
Using - CUDA (or OpenMP, TBB, ...) via Thrust
-
Using - OpenCL via VexCL
-
Parallel - computation with OpenMP and MPI
-
All examples
-
-
odeint in detail
-
-
Steppers
-
Generation - functions
-
Integrate - functions
-
Iterators - and Ranges
-
State - types, algebras and operations
-
Using - boost::ref
-
Using - boost::range
-
Binding - member functions
-
-
Concepts
-
-
System
-
Second - Order System
-
Symplectic - System
-
Simple - Symplectic System
-
Implicit - System
-
Stepper
-
Error Stepper
-
Controlled - Stepper
-
Dense - Output Stepper
-
State - Algebra Operations
-
State Wrapper
-
-
Literature
-
Acknowledgments
-
odeint Reference
-
-
Header <boost/numeric/odeint/integrate/check_adapter.hpp>
-
Header <boost/numeric/odeint/integrate/integrate.hpp>
-
Header <boost/numeric/odeint/integrate/integrate_adaptive.hpp>
-
Header <boost/numeric/odeint/integrate/integrate_const.hpp>
-
Header <boost/numeric/odeint/integrate/integrate_n_steps.hpp>
-
Header <boost/numeric/odeint/integrate/integrate_times.hpp>
-
Header <boost/numeric/odeint/integrate/max_step_checker.hpp>
-
Header <boost/numeric/odeint/iterator/adaptive_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/adaptive_time_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/const_step_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/const_step_time_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/n_step_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/n_step_time_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/times_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/times_time_iterator.hpp>
-
Header <boost/numeric/odeint/stepper/adams_bashforth.hpp>
-
Header <boost/numeric/odeint/stepper/adams_bashforth_moulton.hpp>
-
Header <boost/numeric/odeint/stepper/adams_moulton.hpp>
-
Header <boost/numeric/odeint/stepper/bulirsch_stoer.hpp>
-
Header <boost/numeric/odeint/stepper/bulirsch_stoer_dense_out.hpp>
-
Header <boost/numeric/odeint/stepper/controlled_runge_kutta.hpp>
-
Header <boost/numeric/odeint/stepper/controlled_step_result.hpp>
-
Header <boost/numeric/odeint/stepper/dense_output_runge_kutta.hpp>
-
Header <boost/numeric/odeint/stepper/euler.hpp>
-
Header <boost/numeric/odeint/stepper/explicit_error_generic_rk.hpp>
-
Header <boost/numeric/odeint/stepper/explicit_generic_rk.hpp>
-
Header <boost/numeric/odeint/stepper/extrapolation_stepper.hpp>
-
Header <boost/numeric/odeint/stepper/implicit_euler.hpp>
-
Header <boost/numeric/odeint/stepper/modified_midpoint.hpp>
-
Header <boost/numeric/odeint/stepper/rosenbrock4.hpp>
-
Header <boost/numeric/odeint/stepper/rosenbrock4_controller.hpp>
-
Header <boost/numeric/odeint/stepper/rosenbrock4_dense_output.hpp>
-
Header <boost/numeric/odeint/stepper/runge_kutta4.hpp>
-
Header <boost/numeric/odeint/stepper/runge_kutta4_classic.hpp>
-
Header <boost/numeric/odeint/stepper/runge_kutta_cash_karp54.hpp>
-
Header <boost/numeric/odeint/stepper/runge_kutta_cash_karp54_classic.hpp>
-
Header <boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp>
-
Header <boost/numeric/odeint/stepper/runge_kutta_fehlberg78.hpp>
-
Header <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
Header <boost/numeric/odeint/stepper/symplectic_euler.hpp>
-
Header <boost/numeric/odeint/stepper/symplectic_rkn_sb3a_m4_mclachlan.hpp>
-
Header <boost/numeric/odeint/stepper/symplectic_rkn_sb3a_mclachlan.hpp>
-
Header <boost/numeric/odeint/stepper/velocity_verlet.hpp>
-
-
Indexes
-
-
-
- - - -

Last revised: December 22, 2016 at 12:49:14 GMT

-
-
Next
- - diff --git a/libs/numeric/odeint/doc/html/logo.jpg b/libs/numeric/odeint/doc/html/logo.jpg deleted file mode 100644 index a658bbea9e573faa4abdedb03ea1e61b7c8cfb92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9048 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 N`pN$v$m((7e*qmt3>N?Z diff --git a/libs/numeric/odeint/doc/html/odeint/indexes.html b/libs/numeric/odeint/doc/html/odeint/indexes.html deleted file mode 100644 index 39d7e831c..000000000 --- a/libs/numeric/odeint/doc/html/odeint/indexes.html +++ /dev/null @@ -1,69 +0,0 @@ - - - -Indexes - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHome -
-
- -

-

-
-

-Class Index

-
-
-

-

-

-

-
-

-Function Index

-
-
-

-

-

-

-
-

-Index

-
-
-

-

-
- - - -
-
-
-PrevUpHome -
- - diff --git a/libs/numeric/odeint/doc/html/odeint_reference.html b/libs/numeric/odeint/doc/html/odeint_reference.html deleted file mode 100644 index 73cdff9e9..000000000 --- a/libs/numeric/odeint/doc/html/odeint_reference.html +++ /dev/null @@ -1,87 +0,0 @@ - - - -odeint Reference - - - - - - - - - - - - - - - -
Boost C++ LibrariesHomeLibrariesPeopleFAQMore
-
-
-PrevUpHomeNext -
-
-

-odeint Reference

-
-
Header <boost/numeric/odeint/integrate/check_adapter.hpp>
-
Header <boost/numeric/odeint/integrate/integrate.hpp>
-
Header <boost/numeric/odeint/integrate/integrate_adaptive.hpp>
-
Header <boost/numeric/odeint/integrate/integrate_const.hpp>
-
Header <boost/numeric/odeint/integrate/integrate_n_steps.hpp>
-
Header <boost/numeric/odeint/integrate/integrate_times.hpp>
-
Header <boost/numeric/odeint/integrate/max_step_checker.hpp>
-
Header <boost/numeric/odeint/iterator/adaptive_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/adaptive_time_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/const_step_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/const_step_time_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/n_step_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/n_step_time_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/times_iterator.hpp>
-
Header <boost/numeric/odeint/iterator/times_time_iterator.hpp>
-
Header <boost/numeric/odeint/stepper/adams_bashforth.hpp>
-
Header <boost/numeric/odeint/stepper/adams_bashforth_moulton.hpp>
-
Header <boost/numeric/odeint/stepper/adams_moulton.hpp>
-
Header <boost/numeric/odeint/stepper/bulirsch_stoer.hpp>
-
Header <boost/numeric/odeint/stepper/bulirsch_stoer_dense_out.hpp>
-
Header <boost/numeric/odeint/stepper/controlled_runge_kutta.hpp>
-
Header <boost/numeric/odeint/stepper/controlled_step_result.hpp>
-
Header <boost/numeric/odeint/stepper/dense_output_runge_kutta.hpp>
-
Header <boost/numeric/odeint/stepper/euler.hpp>
-
Header <boost/numeric/odeint/stepper/explicit_error_generic_rk.hpp>
-
Header <boost/numeric/odeint/stepper/explicit_generic_rk.hpp>
-
Header <boost/numeric/odeint/stepper/extrapolation_stepper.hpp>
-
Header <boost/numeric/odeint/stepper/implicit_euler.hpp>
-
Header <boost/numeric/odeint/stepper/modified_midpoint.hpp>
-
Header <boost/numeric/odeint/stepper/rosenbrock4.hpp>
-
Header <boost/numeric/odeint/stepper/rosenbrock4_controller.hpp>
-
Header <boost/numeric/odeint/stepper/rosenbrock4_dense_output.hpp>
-
Header <boost/numeric/odeint/stepper/runge_kutta4.hpp>
-
Header <boost/numeric/odeint/stepper/runge_kutta4_classic.hpp>
-
Header <boost/numeric/odeint/stepper/runge_kutta_cash_karp54.hpp>
-
Header <boost/numeric/odeint/stepper/runge_kutta_cash_karp54_classic.hpp>
-
Header <boost/numeric/odeint/stepper/runge_kutta_dopri5.hpp>
-
Header <boost/numeric/odeint/stepper/runge_kutta_fehlberg78.hpp>
-
Header <boost/numeric/odeint/stepper/stepper_categories.hpp>
-
Header <boost/numeric/odeint/stepper/symplectic_euler.hpp>
-
Header <boost/numeric/odeint/stepper/symplectic_rkn_sb3a_m4_mclachlan.hpp>
-
Header <boost/numeric/odeint/stepper/symplectic_rkn_sb3a_mclachlan.hpp>
-
Header <boost/numeric/odeint/stepper/velocity_verlet.hpp>
-
-
- - - -
-
-
-PrevUpHomeNext -
- - diff --git a/libs/numeric/odeint/doc/html/phase_lattice_2d_0000.jpg b/libs/numeric/odeint/doc/html/phase_lattice_2d_0000.jpg deleted file mode 100644 index f98703eb98d670309f0b5804b3d727603bf25abf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1995 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 diff --git a/libs/numeric/odeint/doc/html/phase_lattice_2d_1000.jpg b/libs/numeric/odeint/doc/html/phase_lattice_2d_1000.jpg deleted file mode 100644 index e0ee037c7799223bbbc4327cfcd85f5cd78e402c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13287 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 diff --git a/libs/numeric/odeint/doc/html/solar_system.jpg b/libs/numeric/odeint/doc/html/solar_system.jpg deleted file mode 100644 index b89c3b3deb95b060a9d9036e8288544fbf5c0560..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31597 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�IE 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 wqR6GM$- >`] [['a[sub x]=1], ['a[sub dxdt]=1]]] - [[`runge_kutta_fehlberg78`] [`controlled_runge_kutta< runge_kutta_fehlberg78 , default_error_checker<...> >`] [['a[sub x]=1], ['a[sub dxdt]=1]]] - [[`runge_kutta_dopri5`] [`controlled_runge_kutta< runge_kutta_dopri5 , default_error_checker<...> >`] [['a [sub x]=1], ['a[sub dxdt]=1]]] - [[`rosenbrock4`] [`rosenbrock4_controlled< rosenbrock4 >`] [-]] -] diff --git a/libs/numeric/odeint/doc/make_dense_output_table.qbk b/libs/numeric/odeint/doc/make_dense_output_table.qbk deleted file mode 100644 index be610bc0c..000000000 --- a/libs/numeric/odeint/doc/make_dense_output_table.qbk +++ /dev/null @@ -1,19 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2012 Mario Mulansky - - 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) -=============================================================================/] - - - -[table Generation functions make_dense_output( abs_error , rel_error , stepper ) - [[Stepper] [Result of make_dense_output] [Remarks]] - [[`runge_kutta_dopri5`] [`dense_output_runge_kutta< controlled_runge_kutta< runge_kutta_dopri5 , default_error_checker<...> > >`] [['a [sub x]=1], ['a[sub dxdt]=1]]] - [[`rosenbrock4`] [`rosenbrock4_dense_output< rosenbrock4_controller< rosenbrock4 > >`] [-]] -] - diff --git a/libs/numeric/odeint/doc/odeint.idx b/libs/numeric/odeint/doc/odeint.idx deleted file mode 100644 index 330e73805..000000000 --- a/libs/numeric/odeint/doc/odeint.idx +++ /dev/null @@ -1,54 +0,0 @@ -# odeint.idx list of files and keyword to be indexed. - -# Copyright 2012 Karsten Ahnert -# Copyright 2012 Pierre Talbot -# -# 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) - -!scan-path "boost/numeric/odeint/" ".*\.*pp" true -# recurse in any sub-directories. - -# List of terms in the docbook (from Quickbook) to be indexed. -# Convenient to order these alphabetically. - -# TODO - add more! - -acknowledgements -book -# C++ \ -card -credit -deprecated -Doxygen -example \ -equations \ -graphics \ -Gumm -links \ -images \ -ISBN -ISSN -IBM -italic \ -# index index and indexes (assume not using plural indices!) -index \ -Luhn -Mastercard -modulus -path \ -pre-conditions \ -post-conditions \ -remark \ -snippet \ -png -Quickbook -Verhoeff -# version \ -VISA -warning \ - -# Remove leading "A" or "The" prefixes from section titles. -# !rewrite-name "(?:A|An|The)\s+(.*)" "\1" - diff --git a/libs/numeric/odeint/doc/odeint.qbk b/libs/numeric/odeint/doc/odeint.qbk deleted file mode 100644 index 3eda23364..000000000 --- a/libs/numeric/odeint/doc/odeint.qbk +++ /dev/null @@ -1,273 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2009-2012 Karsten Ahnert - Copyright 2011-2013 Mario Mulansky - Copyright 2012 Sylwester Arabas - Copyright 2013 Pascal Germroth - - 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) -=============================================================================/] - - - -[library Boost.Numeric.Odeint - [quickbook 1.5] - [id odeint] - [dirname odeint] - [authors [Ahnert, Karsten], [Mulansky, Mario]] - [copyright 2009-2015 Karsten Ahnert and Mario Mulansky] - [category math] - [purpose - Numerical integration of ordinary differential equations. - ] - [license - Distributed under the 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 auto_index_helpers.qbk] - - - -[def __boost_lambda - [@http://www.boost.org/doc/libs/release/libs/lambda/ Boost.Lambda]] -[def __boost_phoenix - [@http://www.boost.org/doc/libs/release/libs/phoenix/ Boost.Phoenix]] -[def __boost_operators - [@http://www.boost.org/doc/libs/release/libs/utility/operators.htm Boost.Operators]] -[def __boost_ref - [@http://www.boost.org/doc/libs/release/libs/bind/ref.html Boost.Ref]] -[def __boost_range - [@http://www.boost.org/doc/libs/release/libs/range/ Boost.Range]] -[def __boost_units - [@http://www.boost.org/doc/libs/release/libs/units/ Boost.Units]] -[def __boost_fusion - [@http://www.boost.org/doc/libs/release/libs/fusion/ Boost.Fusion]] -[def __boost_graph - [@http://www.boost.org/doc/libs/release/libs/graph/ Boost.Graph]] -[def __boost_multiprecision - [@http://www.boost.org/doc/libs/release/libs/multiprecision/ Boost.Multiprecision]] -[def __boost_mpi - [@http://www.boost.org/doc/libs/release/libs/mpi/ Boost.MPI]] - -[def __thrust - [@http://code.google.com/p/thrust/ Thrust]] -[def __ublas - [@http://www.boost.org/doc/libs/release/libs/numeric/ublas/index.html Boost.uBLAS]] -[def __intel_mkl - [@http://software.intel.com/en-us/articles/intel-mkl/ Intel Math Kernel Library]] -[def __gsl - [@http://www.gsl.org GSL]] -[def __vexcl - [@https://github.com/ddemidov/vexcl VexCL]] - -[def __concepts - [link boost_numeric_odeint.concepts Concepts]] -[def __system - [link boost_numeric_odeint.concepts.system System]] -[def __symplectic_system - [link boost_numeric_odeint.concepts.symplectic_system Symplectic System]] -[def __simple_symplectic_system - [link boost_numeric_odeint.concepts.simple_symplectic_system Simple Symplectic System]] -[def __implicit_system - [link boost_numeric_odeint.concepts.implicit_system Implicit System]] -[def __second_order_system - [link boost_numeric_odeint.concepts.second_order_system Second Order System]] -[def __stepper - [link boost_numeric_odeint.concepts.stepper Stepper]] -[def __error_stepper - [link boost_numeric_odeint.concepts.error_stepper Error Stepper]] -[def __controlled_stepper - [link boost_numeric_odeint.concepts.controlled_stepper Controlled Stepper]] -[def __dense_output_stepper - [link boost_numeric_odeint.concepts.dense_output_stepper Dense Output Stepper]] -[def __integrate_functions - [link boost_numeric_odeint.odeint_in_detail.integrate_functions integrate functions]] -[def __tutorial - [link boost_numeric_odeint.tutorial Tutorial]] -[def __tut_solar_system - [link boost_numeric_odeint.tutorial.solar_system Solar System]] -[def __tut_chaotic_system - [link boost_numeric_odeint.tutorial.chaotic_systems_and_lyapunov_exponents Chaotic System]] -[def __tut_harmonic_oscillator - [link boost_numeric_odeint.tutorial.harmonic_oscillator Harmonic Oscillator]] -[def __using_steppers - [link boost_numeric_odeint.odeint_in_detail.steppers.using_steppers Using steppers]] -[def __generation_functions - [link boost_numeric_odeint.odeint_in_detail.generation_functions Generation functions]] -[def __adapt_state_types - [link boost_numeric_odeint.odeint_in_detail.state_types__algebras_and_operations Adapt your own state types]] -[def __resizing_lattice_example - [link boost_numeric_odeint.tutorial.self_expanding_lattices Self expanding lattices]] -[def __odeint_stepper_table - [link boost_numeric_odeint.odeint_in_detail.steppers.stepper_overview Stepper overview]] - - - -[def __nr_ref [link numerical_recipies \[1\] ]] -[def __hairer_1_ref [link hairer_solving_odes_1 \[2\] ]] -[def __hairer_2_ref [link hairer_solving_odes_2 \[3\] ]] -[def __hairer_geom_ref [link hairer_geometrical_numeric_integration \[4\] ]] -[def __leimkuhler_reich_ref [link leimkuhler_reich_simulating_hamiltonian_dynamics \[5\] ]] -[def __symplectic_integrator_1_ref [link symplectic_yoshida_symplectic_integrators \[6\] ]] -[def __symplectic_integrator_2_ref [link symplectic_mylachlan_symmetric_composition_mehtods \[7\] ]] -[def __fpu_scholarpedia_ref [link fpu_scholarpedia \[8\] ]] -[def __synchronization_pikovsky_ref [link synchronization_pikovsky_rosenblum \[9\] ]] - - - - - -[def __alpha '''α'''] -[def __Alpha '''Α'''] -[def __beta '''β'''] -[def __Beta '''Β'''] -[def __gamma '''γ'''] -[def __Gamma '''Γ'''] -[def __delta '''δ'''] -[def __Delta '''Δ'''] -[def __epsilon '''ε'''] -[def __Epsilon '''Ε'''] -[def __zeta '''ζ'''] -[def __Zeta '''Ζ'''] -[def __eta '''η'''] -[def __Eta '''Η'''] -[def __theta '''θ'''] -[def __Theta '''Θ'''] -[def __iota '''ι'''] -[def __Iota '''Ι'''] -[def __kappa '''κ'''] -[def __Kappa '''Κ'''] -[def __lambda '''λ'''][/lower case] -[def __Lambda '''Λ'''][/upper case] -[def __mu '''μ'''] -[def __Mu '''Μ'''] -[def __nu '''ν'''] -[def __Nu '''Ν'''] -[def __xi '''ξ'''] -[def __Xi '''Ξ'''] -[def __omicron '''ο'''] -[def __Omicron '''Ο'''] -[def __pi '''π'''] -[def __Pi '''Π'''] -[def __rho '''ρ'''] -[def __Rho '''Ρ'''] -[def __sigma '''σ'''] -[def __Sigma '''Σ'''] -[def __tau '''τ'''] -[def __Tau '''Τ'''] -[def __upsilon '''υ'''] -[def __Upsilon '''Υ'''] -[def __phi '''φ'''] -[def __Phi '''Φ'''] -[def __chi '''χ'''] -[def __Chi '''Χ'''] -[def __psi '''ψ'''] -[def __Psi '''Ψ'''] -[def __Omega '''Ω'''] -[def __omega '''ω'''] - -[def __space '''​'''] - - - -[template super[x]''''''[x]''''''] -[template supl[x]''''''__space[x]''''''] -[template sub[x]''''''[x]''''''] -[template subl[x]''''''__space[x]''''''] - -[template github_link[url text]''''''[text]''''''] -[/ [template github_link[url text]''''''[text]'''''']] - - - - -[include getting_started.qbk] - -[include tutorial.qbk] - -[include details.qbk] - -[include concepts.qbk] - -[include literature.qbk] - -[include acknowledgements.qbk] - -[xinclude reference.xml] - -[section:indexes Indexes] - -[named_index class_name Class Index] -[named_index function_name Function Index] -[/ -[named_index typedef_name Typedef Index] -[named_index macro_name Macro Index] -] -[index] - -[endsect] - - - - -[/ -# Α Α Α U+0391 Greek capital letter alpha -# Β Î’ Β U+0392 Greek capital letter beta -# Γ Î“ Γ U+0393 Greek capital letter gamma ISOgrk3 -# Δ Î” Δ U+0394 Greek capital letter delta ISOgrk3 -# Ε Î• Ε U+0395 Greek capital letter epsilon -# Ζ Î– Ζ U+0396 Greek capital letter zeta -# Η Î— Η U+0397 Greek capital letter eta -# Θ Î˜ Θ U+0398 Greek capital letter theta ISOgrk3 -# Ι Î™ Ι U+0399 Greek capital letter iota -# Κ Îš Κ U+039A Greek capital letter kappa -# Λ Î› Λ U+039B Greek capital letter lambda ISOgrk3 -# Μ Îœ Μ U+039C Greek capital letter mu -# Ν Î Ν U+039D Greek capital letter nu -# Ξ Îž Ξ U+039E Greek capital letter xi ISOgrk3 -# Ο ÎŸ Ο U+039F Greek capital letter omicron -# Π Î  Π U+03A0 Greek capital letter pi ISOgrk3 -# Ρ Î¡ Ρ U+03A1 Greek capital letter rho -# Σ Î£ Σ U+03A3 Greek capital letter sigma ISOgrk3 -# Τ Î¤ Τ U+03A4 Greek capital letter tau -# Υ Î¥ Υ U+03A5 Greek capital letter upsilon ISOgrk3 -# Φ Î¦ Φ U+03A6 Greek capital letter phi ISOgrk3 -# Χ Î§ Χ U+03A7 Greek capital letter chi -# Ψ Î¨ Ψ U+03A8 Greek capital letter psi ISOgrk3 -# Ω Î© Ω U+03A9 Greek capital letter omega ISOgrk3 -# α α α U+03B1 Greek small letter alpha ISOgrk3 -# β β β U+03B2 Greek small letter beta ISOgrk3 -# γ γ γ U+03B3 Greek small letter gamma ISOgrk3 -# δ δ δ U+03B4 Greek small letter delta ISOgrk3 -# ε ε ε U+03B5 Greek small letter epsilon ISOgrk3 -# ζ ζ ζ U+03B6 Greek small letter zeta ISOgrk3 -# η η η U+03B7 Greek small letter eta ISOgrk3 -# θ θ θ U+03B8 Greek small letter theta ISOgrk3 -# ι ι ι U+03B9 Greek small letter iota ISOgrk3 -# κ κ κ U+03BA Greek small letter kappa ISOgrk3 -# λ λ λ U+03BB Greek small letter lambda ISOgrk3 -# μ μ μ U+03BC Greek small letter mu ISOgrk3 -# ν ν ν U+03BD Greek small letter nu ISOgrk3 -# ξ ξ ξ U+03BE Greek small letter xi ISOgrk3 -# ο ο ο U+03BF Greek small letter omicron New -# π Ï€ π U+03C0 Greek small letter pi ISOgrk3 -# ρ Ï ρ U+03C1 Greek small letter rho ISOgrk3 -# ς Ï‚ ς U+03C2 Greek small letter final sigma ISOgrk3 -# σ σ σ U+03C3 Greek small letter sigma ISOgrk3 -# τ Ï„ τ U+03C4 Greek small letter tau ISOgrk3 -# υ Ï… υ U+03C5 Greek small letter upsilon ISOgrk3 -# φ φ φ U+03C6 Greek small letter phi ISOgrk3 -# χ χ χ U+03C7 Greek small letter chi ISOgrk3 -# ψ ψ ψ U+03C8 Greek small letter psi ISOgrk3 -# ω ω ω U+03C9 Greek small letter omega ISOgrk3 -# ϑ Ï‘ ϑ U+03D1 Greek small letter theta symbol New -# ϒ Ï’ ϒ U+03D2 Greek upsilon with hook symbol New -# ϖ Ï– ϖ U+03D6 Greek pi symbol ISOgrk3 - -/] diff --git a/libs/numeric/odeint/doc/range_table.qbk b/libs/numeric/odeint/doc/range_table.qbk deleted file mode 100644 index 8d88ec980..000000000 --- a/libs/numeric/odeint/doc/range_table.qbk +++ /dev/null @@ -1,70 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2012 Karsten Ahnert - Copyright 2012 Mario Mulansky - - 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) -=============================================================================/] - - - -[/ -Steppers supporting __boost_range: - -* adams_bashforth_moulton -* bulirsch_stoer_dense_out -* bulirsch_stoer -* controlled_runge_kutta -* dense_output_runge_kutta -* euler -* explicit_error_generic_rk -* explicit_generic_rk -* rosenbrock4_controller -* rosenbrock4_dense_output -* rosenbrock4 -* runge_kutta4_classic -* runge_kutta4 -* runge_kutta_cash_karp54_classic -* runge_kutta_cash_karp54 -* runge_kutta_dopri5 -* runge_kutta_fehlberg78 -* symplectic_euler -* symplectic_rkn_sb3a_mclachlan - -Algebras supporting __boost_range - -* range_algebra -* thrust_algebra -/] - -[table Steppers supporting Boost.Range - [[Stepper]] - [[adams_bashforth_moulton]] - [[bulirsch_stoer_dense_out]] - [[bulirsch_stoer]] - [[controlled_runge_kutta]] - [[dense_output_runge_kutta]] - [[euler]] - [[explicit_error_generic_rk]] - [[explicit_generic_rk]] - [[rosenbrock4_controller]] - [[rosenbrock4_dense_output]] - [[rosenbrock4]] - [[runge_kutta4_classic]] - [[runge_kutta4]] - [[runge_kutta_cash_karp54_classic]] - [[runge_kutta_cash_karp54]] - [[runge_kutta_dopri5]] - [[runge_kutta_fehlberg78]] - [[symplectic_euler]] - [[symplectic_rkn_sb3a_mclachlan]] -] - -[table Algebras supporting Boost.Range - [[algebra]] - [[range_algebra]] - [[thrust_algebra]] -] \ No newline at end of file diff --git a/libs/numeric/odeint/doc/reference.xml b/libs/numeric/odeint/doc/reference.xml deleted file mode 100644 index 93f52458c..000000000 --- a/libs/numeric/odeint/doc/reference.xml +++ /dev/null @@ -1,4720 +0,0 @@ - -odeint Reference
- - - -StepperCheckerstepper_tagAdapter to combine basic stepper and checker. Stepper -Checker -stepper_type::state_type -stepper_type::value_type -stepper_type::deriv_type -stepper_type::time_type - -voidSystemStateInOut &const time_typeconst time_typeforward of the do_step method - -stepper_type &checker_type &Construct the checked_stepper. -ControlledStepperCheckercontrolled_stepper_tagAdapter to combine controlled stepper and checker. ControlledStepper -Checker -stepper_type::state_type -stepper_type::value_type -stepper_type::deriv_type -stepper_type::time_type - -controlled_step_resultSystemStateInOut &time_type &time_type &forward of the do_step method - -stepper_type &checker_type &Construct the checked_stepper. -DenseOutStepperCheckerdense_output_stepper_tagAdapter to combine dense out stepper and checker. DenseOutStepper -Checker -stepper_type::state_type -stepper_type::value_type -stepper_type::deriv_type -stepper_type::time_type - -std::pair< time_type, time_type >System -voidconst StateType &time_typetime_type -voidtime_typeStateOut & -voidtime_typeconst StateOut & -const state_type &void -time_typevoid -const state_type &void -time_typevoid -time_typevoid - -stepper_type &checker_type &Construct the checked_stepper. -Adapter to combine observer and checker. Observer -Checker - -voidconst State &Time - -observer_type &checker_type & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -boost::enable_if< typename has_value_type< State >::type, size_t >::typeSystemThe system function to solve, hence the r.h.s. of the ordinary differential equation. State &The initial state. TimeStart time of the integration. TimeEnd time of the integration. TimeInitial step size, will be adjusted during the integration. ObserverObserver that will be called after each time step. Integrates the ODE. Integrates the ODE given by system from start_time to end_time starting with start_state as initial condition and dt as initial time step. This function uses a dense output dopri5 stepper and performs an adaptive integration with step size control, thus dt changes during the integration. This method uses standard error bounds of 1E-6. After each step, the observer is called.A second version of this function template exists which explicitly expects the value type as template parameter, i.e. integrate< double >( sys , x , t0 , t1 , dt , obs ); - - -The number of steps performed. -size_tSystemState &TimeTimeTimeObserver -size_tSystemThe system function to solve, hence the r.h.s. of the ordinary differential equation. State &The initial state. TimeStart time of the integration. TimeEnd time of the integration. TimeInitial step size, will be adjusted during the integration. Integrates the ODE without observer calls. Integrates the ODE given by system from start_time to end_time starting with start_state as initial condition and dt as initial time step. This function uses a dense output dopri5 stepper and performs an adaptive integration with step size control, thus dt changes during the integration. This method uses standard error bounds of 1E-6. No observer is called.A second version of this function template exists which explicitly expects the value type as template parameter, i.e. integrate< double >( sys , x , t0 , t1 , dt ); - - -The number of steps performed. -size_tSystemState &TimeTimeTime - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - -size_tStepperThe stepper to be used for numerical integration. SystemFunction/Functor defining the rhs of the ODE. State &The initial condition x0. TimeThe initial time t0. TimeThe final integration time tend. TimeThe time step between observer calls, not necessarily the time step of the integration. ObserverFunction/Functor called at equidistant time intervals. Integrates the ODE with adaptive step size. This function integrates the ODE given by system with the given stepper. The observer is called after each step. If the stepper has no error control, the step size remains constant and the observer is called at equidistant time points t0+n*dt. If the stepper is a ControlledStepper, the step size is adjusted and the observer is called in non-equidistant intervals. - -The number of steps performed. -size_tStepperSystemconst State &TimeTimeTimeObserverSecond version to solve the forwarding problem, can be called with Boost.Range as start_state. -size_tStepperSystemState &TimeTimeTimeintegrate_adaptive without an observer. -size_tStepperSystemconst State &TimeTimeTimeSecond version to solve the forwarding problem, can be called with Boost.Range as start_state. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - -size_tStepperThe stepper to be used for numerical integration. SystemFunction/Functor defining the rhs of the ODE. State &The initial condition x0. TimeThe initial time t0. TimeThe final integration time tend. TimeThe time step between observer calls, not necessarily the time step of the integration. Observer[optional] Function/Functor called at equidistant time intervals. StepOverflowChecker[optional] Functor to check for step count overflows, if no checker is provided, no exception is thrown. 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. - -The number of steps performed. -size_tStepperSystemconst State &TimeTimeTimeObserverStepOverflowCheckerSecond version to solve the forwarding problem, can be called with Boost.Range as start_state. -size_tStepperSystemState &TimeTimeTimeObserverintegrate_const without step overflow checker -size_tStepperSystemconst State &TimeTimeTimeObserverSecond version to solve the forwarding problem, can be called with Boost.Range as start_state. -size_tStepperSystemState &TimeTimeTimeintegrate_const without observer calls -size_tStepperSystemconst State &TimeTimeTimeSecond version to solve the forwarding problem, can be called with Boost.Range as start_state. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - -TimeStepperSystemState &TimeTimesize_tObserverStepOverflowChecker -TimeStepperSystemconst State &TimeTimesize_tObserverStepOverflowCheckerSolves the forwarding problem, can be called with Boost.Range as start_state. -TimeStepperThe stepper to be used for numerical integration. SystemFunction/Functor defining the rhs of the ODE. State &The initial condition x0. TimeThe initial time t0. TimeThe time step between observer calls, not necessarily the time step of the integration. size_tNumber of steps to be performed ObserverFunction/Functor called at equidistant time intervals. The same function as above, but without checker. Integrates the ODE with constant step size.This function is similar to integrate_const. The observer is called at equidistant time intervals t0 + n*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. 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. - -The number of steps performed. -TimeStepperSystemconst State &TimeTimesize_tObserverSolves the forwarding problem, can be called with Boost.Range as start_state. -TimeStepperSystemState &TimeTimesize_tThe same function as above, but without observer calls. -TimeStepperSystemconst State &TimeTimesize_tSolves the forwarding problem, can be called with Boost.Range as start_state. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - -size_tStepperSystemState &TimeIteratorTimeIteratorTimeObserverStepOverflowChecker -size_tStepperSystemconst State &TimeIteratorTimeIteratorTimeObserverStepOverflowCheckerSolves the forwarding problem, can be called with Boost.Range as start_state. -size_tStepperSystemState &const TimeRange &TimeObserverStepOverflowCheckerThe same function as above, but with the observation times given as range. -size_tStepperSystemconst State &const TimeRange &TimeObserverStepOverflowCheckerSolves the forwarding problem, can be called with Boost.Range as start_state. -size_tStepperThe stepper to be used for numerical integration. SystemFunction/Functor defining the rhs of the ODE. State &The initial condition x0. TimeIteratorIterator to the start time TimeIteratorIterator to the end time TimeThe time step between observer calls, not necessarily the time step of the integration. ObserverFunction/Functor called at equidistant time intervals. Integrates the ODE with observer calls at given time points. Integrates the ODE given by system using the given stepper. This function does observer calls at the subsequent time points given by the range times_start, times_end. If the stepper has not step size control, the step size might be reduced occasionally to ensure observer calls exactly at the time points from the given sequence. If the stepper is a ControlledStepper, the step size is adjusted to meet the error bounds, but also might be reduced occasionally to ensure correct observer calls. 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. - -The number of steps performed. -size_tStepperSystemconst State &TimeIteratorTimeIteratorTimeObserverSolves the forwarding problem, can be called with Boost.Range as start_state. -size_tStepperSystemState &const TimeRange &TimeObserverThe same function as above, but with the observation times given as range. -size_tStepperSystemconst State &const TimeRange &TimeObserverSolves the forwarding problem, can be called with Boost.Range as start_state. - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -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. -voidResets the max_step_checker by setting the internal counter to 0. -voidvoidIncreases the counter and performs the iteration check. - -const int500Construct the max_step_checker. max_steps is the maximal number of iterations allowed before runtime_error is thrown. -boost::numeric::odeint::max_step_checkerA class for performing overflow checks on the failed step count in step size adjustments. Used internally within the dense output stepper and integrate routines. -voidvoidIncreases the counter and performs the iteration check. -voidResets the max_step_checker by setting the internal counter to 0. - -const int500Construct the failed_step_checker. max_steps is the maximal number of iterations allowed before runtime_error is thrown. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -ODE Iterator with adaptive step size. The value type of this iterator is the state type of the stepper. Implements an iterator representing the solution of an ODE from t_start to t_end evaluated at steps with an adaptive step size dt. After each iteration the iterator dereferences to the state x at the next time t+dt where dt is controlled by the stepper. This iterator can be used with ControlledSteppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_adaptive routine.adaptive_iterator is a model of single-pass iterator.The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time. - - -StepperSystemState &time_typetime_typetime_type -StepperSystemState & - - - - - - - - - - - - - - - - - - - - - - - - - - - - -adaptive_iterator< Stepper, System, State >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. typename traits::time_type< Stepper >::typeThe initial time. typename traits::time_type< Stepper >::typeThe end time, at which the iteration should stop. typename traits::time_type< Stepper >::typeThe initial time step. Factory function for adaptive_iterator. Constructs a begin iterator. - -The adaptive iterator. -adaptive_iterator< Stepper, System, State >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. Factory function for adaptive_iterator. Constructs a end iterator. - -The adaptive iterator. -std::pair< adaptive_iterator< Stepper, System, State >, adaptive_iterator< Stepper, System, State > >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. typename traits::time_type< Stepper >::typeThe initial time. typename traits::time_type< Stepper >::typeThe end time, at which the iteration should stop. typename traits::time_type< Stepper >::typeThe initial time step. Factory function to construct a single pass range of adaptive iterators. A range is here a pair of adaptive_iterator. - -The adaptive range. - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -ODE Iterator with adaptive step size. The value type of this iterator is a std::pair containing state and time. Implements an iterator representing the solution of an ODE from t_start to t_end evaluated at steps with an adaptive step size dt. After each iteration the iterator dereferences to a pair containing state and time at the next time point t+dt where dt is controlled by the stepper. This iterator can be used with ControlledSteppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_adaptive routine.adaptive_iterator is a model of single-pass iterator.The value type of this iterator is a std::pair of state and time of the stepper. - - -StepperSystemState &time_typetime_typetime_type -StepperSystemState & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -adaptive_time_iterator< Stepper, System, State >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. adaptive_time_iterator stores a reference of s and changes its value during the iteration. typename traits::time_type< Stepper >::typeThe initial time. typename traits::time_type< Stepper >::typeThe end time, at which the iteration should stop. typename traits::time_type< Stepper >::typeThe initial time step. Factory function for adaptive_time_iterator. Constructs a begin iterator. - -The adaptive time iterator. -adaptive_time_iterator< Stepper, System, State >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. adaptive_time_iterator stores a reference of s and changes its value during the iteration. Factory function for adaptive_time_iterator. Constructs a end iterator. - -The adaptive time iterator. -std::pair< adaptive_time_iterator< Stepper, System, State >, adaptive_time_iterator< Stepper, System, State > >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. adaptive_time_iterator stores a reference of s and changes its value during the iteration. typename traits::time_type< Stepper >::typeThe initial time. typename traits::time_type< Stepper >::typeThe end time, at which the iteration should stop. typename traits::time_type< Stepper >::typeThe initial time step. Factory function to construct a single pass range of adaptive time iterators. A range is here a pair of adaptive_time_iterators. - -The adaptive time range. - - - - - - - - - - - - - - - - - - - - - -
-
- - - -ODE Iterator with constant step size. The value type of this iterator is the state type of the stepper. Implements an iterator representing the solution of an ODE from t_start to t_end evaluated at steps with constant step size dt. After each iteration the iterator dereferences to the state x at the next time t+dt. This iterator can be used with Steppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_const routine.const_step_iterator is a model of single-pass iterator.The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time. - - -StepperSystemState &time_typetime_typetime_type -StepperSystemState & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const_step_iterator< Stepper, System, State >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator stores a reference of s and changes its value during the iteration. typename traits::time_type< Stepper >::typeThe initial time. typename traits::time_type< Stepper >::typeThe end time, at which the iteration should stop. typename traits::time_type< Stepper >::typeThe initial time step. Factory function for const_step_iterator. Constructs a begin iterator. - -The const step iterator. -const_step_iterator< Stepper, System, State >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator stores a reference of s and changes its value during the iteration. Factory function for const_step_iterator. Constructs a end iterator. - -The const_step_iterator. -std::pair< const_step_iterator< Stepper, System, State >, const_step_iterator< Stepper, System, State > >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator store a reference of s and changes its value during the iteration. typename traits::time_type< Stepper >::typeThe initial time. typename traits::time_type< Stepper >::typeThe end time, at which the iteration should stop. typename traits::time_type< Stepper >::typeThe initial time step. Factory function to construct a single pass range of const step iterators. A range is here a pair of const_step_iterator. - -The const step range. - - - - - - - - - - - - - - - - - - -
-
- - - -ODE Iterator with constant step size. The value type of this iterator is a std::pair containing state and time. Implements an iterator representing the solution of an ODE from t_start to t_end evaluated at steps with constant step size dt. After each iteration the iterator dereferences to a pair containing state and time at the next time point t+dt.. This iterator can be used with Steppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_const routine.const_step_time_iterator is a model of single-pass iterator.The value type of this iterator is a pair with the state type and time type of the stepper. - - -StepperSystemState &time_typetime_typetime_type -StepperSystemState & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const_step_time_iterator< Stepper, System, State >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_time_iterator stores a reference of s and changes its value during the iteration. typename traits::time_type< Stepper >::typeThe initial time. typename traits::time_type< Stepper >::typeThe end time, at which the iteration should stop. typename traits::time_type< Stepper >::typeThe initial time step. Factory function for const_step_time_iterator. Constructs a begin iterator. - -The const step time iterator. -const_step_time_iterator< Stepper, System, State >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_time_iterator store a reference of s and changes its value during the iteration. Factory function for const_step_time_iterator. Constructs a end iterator. - -The const step time iterator. -std::pair< const_step_time_iterator< Stepper, System, State >, const_step_time_iterator< Stepper, System, State > >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_time_iterator stores a reference of s and changes its value during the iteration. typename traits::time_type< Stepper >::typetypename traits::time_type< Stepper >::typeThe end time, at which the iteration should stop. typename traits::time_type< Stepper >::typeThe initial time step. Factory function to construct a single pass range of const_step_time_iterator. A range is here a pair of const_step_time_iterator. - -The const step time range. - - - - - - - - - - - - - - - -
-
- - - -ODE Iterator with constant step size. The value type of this iterator is the state type of the stepper. Implements an iterator representing the solution of an ODE starting from t with n steps and a constant step size dt. After each iteration the iterator dereferences to the state x at the next time t+dt. This iterator can be used with Steppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_n_steps routine.n_step_iterator is a model of single-pass iterator.The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time. - - -StepperSystemState &time_typetime_typesize_t -StepperSystemState & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -n_step_iterator< Stepper, System, State >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator stores a reference of s and changes its value during the iteration. typename traits::time_type< Stepper >::typeThe initial time. typename traits::time_type< Stepper >::typeThe initial time step. size_tThe number of steps to be executed. Factory function for n_step_iterator. Constructs a begin iterator. - -The n-step iterator. -n_step_iterator< Stepper, System, State >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator stores a reference of s and changes its value during the iteration. Factory function for n_step_iterator. Constructs an end iterator. - -The const_step_iterator. -std::pair< n_step_iterator< Stepper, System, State >, n_step_iterator< Stepper, System, State > >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator store a reference of s and changes its value during the iteration. typename traits::time_type< Stepper >::typeThe initial time. typename traits::time_type< Stepper >::typeThe initial time step. size_tThe number of steps to be executed. Factory function to construct a single pass range of n-step iterators. A range is here a pair of n_step_iterator. - -The n-step range. - - - - - - - - - - - - -
-
- - - -ODE Iterator with constant step size. The value type of this iterator is a std::pair containing state and time. Implements an iterator representing the solution of an ODE starting from t with n steps and a constant step size dt. After each iteration the iterator dereferences to a pair of state and time at the next time t+dt. This iterator can be used with Steppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_n_steps routine.n_step_time_iterator is a model of single-pass iterator.The value type of this iterator is pair of state and time. - - -StepperSystemState &time_typetime_typesize_t -StepperSystemState & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -n_step_time_iterator< Stepper, System, State >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator stores a reference of s and changes its value during the iteration. typename traits::time_type< Stepper >::typeThe initial time. typename traits::time_type< Stepper >::typeThe initial time step. size_tThe number of steps to be executed. Factory function for n_step_time_iterator. Constructs a begin iterator. - -The n-step iterator. -n_step_time_iterator< Stepper, System, State >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator stores a reference of s and changes its value during the iteration. Factory function for n_step_time_iterator. Constructs an end iterator. - -The const_step_iterator. -std::pair< n_step_time_iterator< Stepper, System, State >, n_step_time_iterator< Stepper, System, State > >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator store a reference of s and changes its value during the iteration. typename traits::time_type< Stepper >::typeThe initial time. typename traits::time_type< Stepper >::typeThe initial time step. size_tThe number of steps to be executed. Factory function to construct a single pass range of n-step iterators. A range is here a pair of n_step_time_iterator. - -The n-step range. - - - - - - - - - -
-
- - - -ODE Iterator with given evaluation points. The value type of this iterator is the state type of the stepper. Implements an iterator representing the solution of an ODE from *t_start to *t_end evaluated at time points given by the sequence t_start to t_end. t_start and t_end are iterators representing a sequence of time points where the solution of the ODE should be evaluated. After each iteration the iterator dereferences to the state x at the next time *t_start++ until t_end is reached. This iterator can be used with Steppers, ControlledSteppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_times routine.times_iterator is a model of single-pass iterator.The value type of this iterator is the state type of the stepper. Hence one can only access the state and not the current time. - - -StepperSystemState &TimeIteratorTimeIteratortime_type -StepperSystemState & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -times_iterator< Stepper, System, State, TimeIterator >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator stores a reference of s and changes its value during the iteration. TimeIteratorBegin iterator of the sequence of evaluation time points. TimeIteratorEnd iterator of the sequence of evaluation time points. typename traits::time_type< Stepper >::typeThe initial time step. Factory function for times_iterator. Constructs a begin iterator. - -The times iterator. -times_iterator< Stepper, System, State, TimeIterator >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator stores a reference of s and changes its value during the iteration. Factory function for times_iterator. Constructs an end iterator. - - -This function needs the TimeIterator type specifically defined as a template parameter. The times iterator. -std::pair< times_iterator< Stepper, System, State, TimeIterator >, times_iterator< Stepper, System, State, TimeIterator > >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator store a reference of s and changes its value during the iteration. TimeIteratorBegin iterator of the sequence of evaluation time points. TimeIteratorEnd iterator of the sequence of evaluation time points. typename traits::time_type< Stepper >::typeThe initial time step. Factory function to construct a single pass range of times iterators. A range is here a pair of times_iterator. - -The times iterator range. - - - - - - -
-
- - - -ODE Iterator with given evaluation points. The value type of this iterator is a std::pair containing state and time. Implements an iterator representing the solution of an ODE from *t_start to *t_end evaluated at time points given by the sequence t_start to t_end. t_start and t_end are iterators representing a sequence of time points where the solution of the ODE should be evaluated. After each iteration the iterator dereferences to a pair with the state and the time at the next evaluation point *t_start++ until t_end is reached. This iterator can be used with Steppers, ControlledSteppers and DenseOutputSteppers and it always makes use of the all the given steppers capabilities. A for_each over such an iterator range behaves similar to the integrate_times routine.times_time_iterator is a model of single-pass iterator.The value type of this iterator is a pair of state and time type. - - -StepperSystemState &TimeIteratorTimeIteratortime_type -StepperSystemState & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -times_time_iterator< Stepper, System, State, TimeIterator >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator stores a reference of s and changes its value during the iteration. TimeIteratorBegin iterator of the sequence of evaluation time points. TimeIteratorEnd iterator of the sequence of evaluation time points. typename traits::time_type< Stepper >::typeThe initial time step. Factory function for times_time_iterator. Constructs a begin iterator. - -The times_time iterator. -times_time_iterator< Stepper, System, State, TimeIterator >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator stores a reference of s and changes its value during the iteration. Factory function for times_time_iterator. Constructs an end iterator. - - -This function needs the TimeIterator type specifically defined as a template parameter. The times_time iterator. -std::pair< times_time_iterator< Stepper, System, State, TimeIterator >, times_time_iterator< Stepper, System, State, TimeIterator > >StepperThe stepper to use during the iteration. SystemThe system function (ODE) to solve. State &The initial state. const_step_iterator store a reference of s and changes its value during the iteration. TimeIteratorBegin iterator of the sequence of evaluation time points. TimeIteratorEnd iterator of the sequence of evaluation time points. typename traits::time_type< Stepper >::typeThe initial time step. Factory function to construct a single pass range of times_time iterators. A range is here a pair of times_iterator. - -The times_time iterator range. - - - -
-
- - - -boost::mpl::max::type< mpl::eval_if< mpl::equal_to< mpl::modulus< int_< N >, int_< 2 > >, int_< 0 > >, int_< N >, int_< N+1 > >::type, int_< 4 > >algebra_stepper_base< Algebra, Operations >The Adams-Bashforth multistep algorithm. The Adams-Bashforth method is a multi-step algorithm with configurable step number. The step number is specified as template parameter Steps and it then uses the result from the previous Steps steps. See also en.wikipedia.org/wiki/Linear_multistep_method. Currently, a maximum of Steps=8 is supported. The method is explicit and fulfills the Stepper concept. Step size control or continuous output are not provided.This class derives from algebra_base and inherits its interface via CRTP (current recurring template pattern). For more details see algebra_stepper_base. -State -state_wrapper< state_type > -Value -Deriv -state_wrapper< deriv_type > -Time -Resizer -stepper_tag -InitializingStepper -algebra_stepper_base< Algebra, Operations > -algebra_stepper_base_type::algebra_type -algebra_stepper_base_type::operations_type -unsigned short -unspecified -const size_t -const order_type - -order_typevoidReturns the order of the algorithm, which is equal to the number of steps. -order of the method. -voidSystemStateInOut &time_typetime_type -voidSystemconst StateInOut &time_typetime_typeSecond version to solve the forwarding problem, can be called with Boost.Range as StateInOut. -voidSystemconst StateIn &time_typeStateOut &time_type -voidSystemconst StateIn &time_typeconst StateOut &time_typeSecond version to solve the forwarding problem, can be called with Boost.Range as StateOut. -voidconst StateType &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - -const step_storage_type &voidReturns the storage of intermediate results. -The storage of intermediate results. -step_storage_type &voidReturns the storage of intermediate results. -The storage of intermediate results. -voidExplicitStepperSystemStateIn &time_type &time_type -voidSystemStateIn &time_type &time_type -voidvoidResets the internal buffer of the stepper. -boolvoidReturns true if the stepper has been initialized. -bool true if stepper is initialized, false otherwise -const initializing_stepper_type &voidReturns the internal initializing stepper instance. -initializing_stepper -initializing_stepper_type &voidReturns the internal initializing stepper instance. -initializing_stepper - -const algebra_type &algebra_type()A copy of algebra is made and stored. Constructs the adams_bashforth class. This constructor can be used as a default constructor if the algebra has a default constructor. - - -voidSystemconst StateIn &time_typeStateOut &time_type -boolconst StateIn & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -The Adams-Bashforth-Moulton multistep algorithm. The Adams-Bashforth method is a multi-step predictor-corrector algorithm with configurable step number. The step number is specified as template parameter Steps and it then uses the result from the previous Steps steps. See also en.wikipedia.org/wiki/Linear_multistep_method. Currently, a maximum of Steps=8 is supported. The method is explicit and fulfills the Stepper concept. Step size control or continuous output are not provided.This class derives from algebra_base and inherits its interface via CRTP (current recurring template pattern). For more details see algebra_stepper_base. -State -state_wrapper< state_type > -Value -Deriv -state_wrapper< deriv_type > -Time -Algebra -Operations -Resizer -stepper_tag -InitializingStepper -unsigned short -const size_t -const order_type - -order_typevoidReturns the order of the algorithm, which is equal to the number of steps+1. -order of the method. -voidSystemStateInOut &time_typetime_type -voidSystemconst StateInOut &time_typetime_typeSecond version to solve the forwarding problem, can be called with Boost.Range as StateInOut. -voidSystemconst StateIn &time_typeconst StateOut &time_type -voidSystemconst StateIn &time_typeStateOut &time_typeSecond version to solve the forwarding problem, can be called with Boost.Range as StateOut. -voidconst StateType &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - -voidExplicitStepperSystemStateIn &time_type &time_type -voidSystemStateIn &time_type &time_type - -voidConstructs the adams_bashforth class. -const algebra_type &A copy of algebra is made and stored. Constructs the adams_bashforth class. This constructor can be used as a default constructor if the algebra has a default constructor. - - -voidSystemStateInOut &time_typetime_type -voidSystemStateIn const &time_typeStateInOut &time_type -boolconst StateIn & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -State -state_wrapper< state_type > -Value -Deriv -state_wrapper< deriv_type > -Time -Algebra -Operations -Resizer -stepper_tag -adams_moulton< Steps, State, Value, Deriv, Time, Algebra, Operations, Resizer > -unsigned short -unspecified -const size_t -const order_type - -order_typevoid -voidSystemStateInOut &StateIn const &time_typetime_typeconst ABBuf & -voidSystemconst StateInOut &StateIn const &time_typetime_typeconst ABBuf & -voidSystemconst StateIn &const PredIn &time_typeStateOut &time_typeconst ABBuf & -voidSystemconst StateIn &const PredIn &time_typeconst StateOut &time_typeconst ABBuf & -voidconst StateType & -algebra_type & -const algebra_type & - - -algebra_type & -adams_moulton &const adams_moulton & - -voidSystemconst StateIn &const PredIn &time_typeStateOut &time_typeconst ABBuf & -boolconst StateIn & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -The Bulirsch-Stoer algorithm. The Bulirsch-Stoer is a controlled stepper that adjusts both step size and order of the method. The algorithm uses the modified midpoint and a polynomial extrapolation compute the solution. -State -Value -Deriv -Time -Algebra -Operations -Resizer -const size_t - -controlled_step_resultSystemStateInOut &time_type &time_type & -controlled_step_resultSystemconst StateInOut &time_type &time_type &Second version to solve the forwarding problem, can be used with Boost.Range as StateInOut. -controlled_step_resultSystemStateInOut &const DerivIn &time_type &time_type & -boost::disable_if< boost::is_same< StateIn, time_type >, controlled_step_result >::typeSystemconst StateIn &time_type &StateOut &time_type & -controlled_step_resultSystemconst StateIn &const DerivIn &time_type &StateOut &time_type & -voidResets the internal state of the stepper. -voidconst StateIn &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - - -value_type1E-6Absolute tolerance level. value_type1E-6Relative tolerance level. value_type1.0Factor for the weight of the state. value_type1.0Factor for the weight of the derivative. time_typestatic_cast< time_type >(0)Constructs the bulirsch_stoer class, including initialization of the error bounds. - - -boolconst StateIn & -boolconst StateIn & -boolconst StateIn & -controlled_step_resultSystemStateInOut &time_type &time_type & -voidsize_tstate_table_type &const value_matrix &StateInOut & -time_typetime_typevalue_typesize_t -controlled_step_resultsize_tconst inv_time_vector &const time_vector &time_type & -boolsize_t -boolvalue_typesize_t - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -The Bulirsch-Stoer algorithm. The Bulirsch-Stoer is a controlled stepper that adjusts both step size and order of the method. The algorithm uses the modified midpoint and a polynomial extrapolation compute the solution. This class also provides dense output facility. -State -Value -Deriv -Time -Algebra -Operations -Resizer -dense_output_stepper_tag -const size_t - -controlled_step_resultSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. const StateIn &The state of the ODE which should be solved. const DerivIn &The derivative of state. time_type &The value of the time. Updated if the step is successful. StateOut &Used to store the result of the step. DerivOut &time_type &The step size. Updated. Tries to perform one step. This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed. Also, the internal order of the stepper is adjusted if required. - -success if the step was accepted, fail otherwise. -voidconst StateType &The initial state. const time_type &The initial time. const time_type &The initial time step. Initializes the dense output stepper. - -std::pair< time_type, time_type >SystemThe system function to solve, hence the r.h.s. of the ordinary differential equation. It must fulfill the Simple System concept. Does one time step. This is the main method that should be used to integrate an ODE with this stepper. initialize has to be called before using this method to set the initial conditions x,t and the stepsize. - - -Pair with start and end time of the integration step. -voidtime_typeThe time at which the solution should be calculated, has to be in the current time interval. StateOut &The output variable where the result is written into. Calculates the solution at an intermediate point within the last step. - -const state_type &voidReturns the current state of the solution. -The current state of the solution x(t). -time_typevoidReturns the current time of the solution. -The current time of the solution t. -const state_type &voidReturns the last state of the solution. -The last state of the solution x(t-dt). -time_typevoidReturns the last time of the solution. -The last time of the solution t-dt. -time_typevoidReturns the current step size. -The current step size. -voidResets the internal state of the stepper. -voidconst StateIn &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - - -value_type1E-6Absolute tolerance level. value_type1E-6Relative tolerance level. value_type1.0Factor for the weight of the state. value_type1.0Factor for the weight of the derivative. time_typestatic_cast< time_type >(0)boolfalseSet true to additionally control the error of the interpolation. Constructs the bulirsch_stoer class, including initialization of the error bounds. - - -voidsize_tStateVector &const value_matrix &StateInOut &size_t0 -voidsize_tStateVector &const value_matrix &size_t0 -time_typetime_typevalue_typesize_t -boolsize_t -boolvalue_typesize_t -value_typeintconst StateIn1 &const DerivIn1 &const StateIn2 &const DerivIn2 &time_type -voidsize_tsize_tvalue_typeconst DerivIn & -voidtime_typeStateOut & -boolconst StateIn & -state_type &void -const state_type &void -state_type &void -const state_type &void -deriv_type &void -const deriv_type &void -deriv_type &void -const deriv_type &void -voidvoid - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -The default error checker to be used with Runge-Kutta error steppers. This class provides the default mechanism to compare the error estimates reported by Runge-Kutta error steppers with user defined error bounds. It is used by the controlled_runge_kutta steppers. -Value -Algebra -Operations - -value_typeconst State &const Deriv &Err &Time -value_typealgebra_type &const State &const Deriv &Err &Time - -value_typestatic_cast< value_type >(1.0e-6)value_typestatic_cast< value_type >(1.0e-6)value_typestatic_cast< value_type >(1)value_typestatic_cast< value_type >(1) -Time -Value - -time_typetime_typeconst value_typeconst int -time_typetime_typevalue_typeconst int -boolconst time_type -time_type - -const time_typestatic_cast< time_type >(0) -ErrorStepperErrorCheckerStepAdjusterResizerexplicit_error_stepper_tagImplements step size control for Runge-Kutta steppers with error estimation. This class implements the step size control for standard Runge-Kutta steppers with error estimation. -ErrorStepper -stepper_type::state_type -stepper_type::value_type -stepper_type::deriv_type -stepper_type::time_type -stepper_type::algebra_type -stepper_type::operations_type -Resizer -ErrorChecker -StepAdjuster -explicit_controlled_stepper_tag - -controlled_step_resultSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. StateInOut &The state of the ODE which should be solved. Overwritten if the step is successful. time_type &The value of the time. Updated if the step is successful. time_type &The step size. Updated. Tries to perform one step. This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed. - -success if the step was accepted, fail otherwise. -controlled_step_resultSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. const StateInOut &The state of the ODE which should be solved. Overwritten if the step is successful. Can be a boost range. time_type &The value of the time. Updated if the step is successful. time_type &The step size. Updated. Tries to perform one step. Solves the forwarding problem and allows for using boost range as state_type. This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed. - -success if the step was accepted, fail otherwise. -controlled_step_resultSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. StateInOut &The state of the ODE which should be solved. Overwritten if the step is successful. const DerivIn &The derivative of state. time_type &The value of the time. Updated if the step is successful. time_type &The step size. Updated. Tries to perform one step. This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed. - -success if the step was accepted, fail otherwise. -boost::disable_if< boost::is_same< StateIn, time_type >, controlled_step_result >::typeSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. const StateIn &The state of the ODE which should be solved. time_type &The value of the time. Updated if the step is successful. StateOut &Used to store the result of the step. time_type &The step size. Updated. Tries to perform one step. This method is disabled if state_type=time_type to avoid ambiguity. -This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed. - -success if the step was accepted, fail otherwise. -controlled_step_resultSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. const StateIn &The state of the ODE which should be solved. const DerivIn &The derivative of state. time_type &The value of the time. Updated if the step is successful. StateOut &Used to store the result of the step. time_type &The step size. Updated. Tries to perform one step. This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed. - -success if the step was accepted, fail otherwise. -voidconst StateType &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - -stepper_type &voidReturns the instance of the underlying stepper. -The instance of the underlying stepper. -const stepper_type &voidReturns the instance of the underlying stepper. -The instance of the underlying stepper. - -const error_checker_type &error_checker_type()An instance of the error checker. const step_adjuster_type &step_adjuster_type()const stepper_type &stepper_type()An instance of the underlying stepper. Constructs the controlled Runge-Kutta stepper. - - -controlled_step_resultSystemStateInOut &time_type &time_type & -boolconst StateIn & -boolconst StateIn & -boolconst StateIn & - -ErrorStepperErrorCheckerStepAdjusterResizerexplicit_error_stepper_fsal_tagImplements step size control for Runge-Kutta FSAL steppers with error estimation. This class implements the step size control for FSAL Runge-Kutta steppers with error estimation. -ErrorStepper -stepper_type::state_type -stepper_type::value_type -stepper_type::deriv_type -stepper_type::time_type -stepper_type::algebra_type -stepper_type::operations_type -Resizer -ErrorChecker -StepAdjuster -explicit_controlled_stepper_fsal_tag - -controlled_step_resultSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. StateInOut &The state of the ODE which should be solved. Overwritten if the step is successful. time_type &The value of the time. Updated if the step is successful. time_type &The step size. Updated. Tries to perform one step. This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed. - -success if the step was accepted, fail otherwise. -controlled_step_resultSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. const StateInOut &The state of the ODE which should be solved. Overwritten if the step is successful. Can be a boost range. time_type &The value of the time. Updated if the step is successful. time_type &The step size. Updated. Tries to perform one step. Solves the forwarding problem and allows for using boost range as state_type. This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed. - -success if the step was accepted, fail otherwise. -boost::disable_if< boost::is_same< StateIn, time_type >, controlled_step_result >::typeSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. const StateIn &The state of the ODE which should be solved. time_type &The value of the time. Updated if the step is successful. StateOut &Used to store the result of the step. time_type &The step size. Updated. Tries to perform one step. This method is disabled if state_type=time_type to avoid ambiguity. -This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed. - -success if the step was accepted, fail otherwise. -controlled_step_resultSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. StateInOut &The state of the ODE which should be solved. Overwritten if the step is successful. DerivInOut &The derivative of state. time_type &The value of the time. Updated if the step is successful. time_type &The step size. Updated. Tries to perform one step. This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed. - -success if the step was accepted, fail otherwise. -controlled_step_resultSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. const StateIn &The state of the ODE which should be solved. const DerivIn &time_type &The value of the time. Updated if the step is successful. StateOut &Used to store the result of the step. DerivOut &time_type &The step size. Updated. Tries to perform one step. This method tries to do one step with step size dt. If the error estimate is to large, the step is rejected and the method returns fail and the step size dt is reduced. If the error estimate is acceptably small, the step is performed, success is returned and dt might be increased to make the steps as large as possible. This method also updates t if a step is performed. - -success if the step was accepted, fail otherwise. -voidvoidResets the internal state of the underlying FSAL stepper. -voidconst DerivIn &The initial derivative of the ODE. Initializes the internal state storing an internal copy of the derivative. - -voidSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. const StateIn &The initial state of the ODE which should be solved. time_typeThe initial time. Initializes the internal state storing an internal copy of the derivative. - -boolvoidReturns true if the stepper has been initialized, false otherwise. -true, if the stepper has been initialized, false otherwise. -voidconst StateType &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - -stepper_type &voidReturns the instance of the underlying stepper. -The instance of the underlying stepper. -const stepper_type &voidReturns the instance of the underlying stepper. -The instance of the underlying stepper. - -const error_checker_type &error_checker_type()An instance of the error checker. const step_adjuster_type &step_adjuster_type()const stepper_type &stepper_type()An instance of the underlying stepper. Constructs the controlled Runge-Kutta stepper. - - -boolconst StateIn & -boolconst StateIn & -boolconst StateIn & -boolconst StateIn & -controlled_step_resultSystemStateInOut &time_type &time_type & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -The trial step was successful, hence the state and the time have been advanced. The step was not successful and might possibly be repeated with a small step size. Enum representing the return values of the controlled steppers. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -Stepperstepper_tagThe class representing dense-output Runge-Kutta steppers. In this stepper, the initialize method has to be called before using the do_step method. -The dense-output functionality allows to interpolate the solution between subsequent integration points using intermediate results obtained during the computation. This version works based on a normal stepper without step-size control. -Stepper -stepper_type::state_type -stepper_type::wrapped_state_type -stepper_type::value_type -stepper_type::deriv_type -stepper_type::wrapped_deriv_type -stepper_type::time_type -stepper_type::algebra_type -stepper_type::operations_type -stepper_type::resizer_type -dense_output_stepper_tag -dense_output_runge_kutta< Stepper > - -voidconst StateType &The initial state of the ODE which should be solved. time_typeThe initial time, at which the step should be performed. time_typeThe step size. Initializes the stepper. Has to be called before do_step can be used to set the initial conditions and the step size. - -std::pair< time_type, time_type >SystemThe system function to solve, hence the r.h.s. of the ordinary differential equation. It must fulfill the Simple System concept. Does one time step. initialize has to be called before using this method to set the initial conditions x,t and the stepsize. - - -Pair with start and end time of the integration step. -voidtime_typeThe time at which the solution should be calculated, has to be in the current time interval. StateOut &The output variable where the result is written into. Calculates the solution at an intermediate point. - -voidtime_typeThe time at which the solution should be calculated, has to be in the current time interval. const StateOut &The output variable where the result is written into, can be a boost range. Calculates the solution at an intermediate point. Solves the forwarding problem. - -voidconst StateType &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - -const state_type &voidReturns the current state of the solution. -The current state of the solution x(t). -time_typevoidReturns the current time of the solution. -The current time of the solution t. -const state_type &voidReturns the last state of the solution. -The last state of the solution x(t-dt). -time_typevoidReturns the last time of the solution. -The last time of the solution t-dt. -time_typevoidReturns the current time step. -dt. - -const stepper_type &stepper_type()An instance of the underlying stepper. Constructs the dense_output_runge_kutta class. An instance of the underlying stepper can be provided. - - -state_type &void -const state_type &void -state_type &void -const state_type &void -voidvoid -boolconst StateIn & - -Stepperexplicit_controlled_stepper_fsal_tagThe class representing dense-output Runge-Kutta steppers with FSAL property. The interface is the same as for dense_output_runge_kutta< Stepper , stepper_tag >. This class provides dense output functionality based on methods with step size controlled -Stepper -controlled_stepper_type::stepper_type -stepper_type::state_type -stepper_type::wrapped_state_type -stepper_type::value_type -stepper_type::deriv_type -stepper_type::wrapped_deriv_type -stepper_type::time_type -stepper_type::algebra_type -stepper_type::operations_type -stepper_type::resizer_type -dense_output_stepper_tag -dense_output_runge_kutta< Stepper > - -voidconst StateType &time_typetime_type -std::pair< time_type, time_type >System -voidtime_typeStateOut & -voidtime_typeconst StateOut & -boolconst StateIn & -voidconst StateType & -const state_type &void -time_typevoid -const state_type &void -time_typevoid -time_typevoid - -const controlled_stepper_type &controlled_stepper_type() - -state_type &void -const state_type &void -state_type &void -const state_type &void -deriv_type &void -const deriv_type &void -deriv_type &void -const deriv_type &void -voidvoid - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -explicit_stepper_baseAn implementation of the Euler method. The Euler method is a very simply solver for ordinary differential equations. This method should not be used for real applications. It is only useful for demonstration purposes. Step size control is not provided but trivial continuous output is available.This class derives from explicit_stepper_base and inherits its interface via CRTP (current recurring template pattern), see explicit_stepper_base -explicit_stepper_base< euler< ... >,... > -stepper_base_type::state_type -stepper_base_type::value_type -stepper_base_type::deriv_type -stepper_base_type::time_type -stepper_base_type::algebra_type -stepper_base_type::operations_type -stepper_base_type::resizer_type - -voidSystemconst StateIn &The state of the ODE which should be solved. in is not modified in this method const DerivIn &The derivative of x at t. time_typeStateOut &The result of the step is written in out. time_typeThe step size. This method performs one step. The derivative dxdt of in at the time t is passed to the method. The result is updated out of place, hence the input is in in and the output in out. Access to this step functionality is provided by explicit_stepper_base and do_step_impl should not be called directly. - -voidStateOut &time_typeconst StateIn1 &time_typeconst StateIn2 &time_typeThis method is used for continuous output and it calculates the state x at a time t from the knowledge of two states old_state and current_state at time points t_old and t_new. -voidconst StateType &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - - -const algebra_type &algebra_type()A copy of algebra is made and stored inside explicit_stepper_base. Constructs the euler class. This constructor can be used as a default constructor of the algebra has a default constructor. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -explicit_error_stepper_baseA generic implementation of explicit Runge-Kutta algorithms with error estimation. This class is as a base class for all explicit Runge-Kutta steppers with error estimation. This class implements the explicit Runge-Kutta algorithms with error estimation in a generic way. The Butcher tableau is passed to the stepper which constructs the stepper scheme with the help of a template-metaprogramming algorithm. ToDo : Add example!This class derives explicit_error_stepper_base which provides the stepper interface. -explicit_stepper_base< ... > -stepper_base_type::state_type -stepper_base_type::wrapped_state_type -stepper_base_type::value_type -stepper_base_type::deriv_type -stepper_base_type::wrapped_deriv_type -stepper_base_type::time_type -stepper_base_type::algebra_type -stepper_base_type::operations_type -stepper_base_type::resizer_type -unspecified -rk_algorithm_type::coef_a_type -rk_algorithm_type::coef_b_type -rk_algorithm_type::coef_c_type -const size_t - -voidSystemconst StateIn &const DerivIn &time_typeStateOut &time_typeErr & -voidSystemconst StateIn &const DerivIn &time_typeStateOut &time_type -voidconst StateIn &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - - -const coef_a_type &Triangular matrix of parameters b in the Butcher tableau. const coef_b_type &Last row of the butcher tableau. const coef_b_type &Parameters for lower-order evaluation to estimate the error. const coef_c_type &Parameters to calculate the time points in the Butcher tableau. const algebra_type &algebra_type()A copy of algebra is made and stored inside explicit_stepper_base. Constructs the explicit_error_generik_rk class with the given parameters a, b, b2 and c. See examples section for details on the coefficients. - - -boolconst StateIn & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -explicit_stepper_baseA generic implementation of explicit Runge-Kutta algorithms. This class is as a base class for all explicit Runge-Kutta steppers. This class implements the explicit Runge-Kutta algorithms without error estimation in a generic way. The Butcher tableau is passed to the stepper which constructs the stepper scheme with the help of a template-metaprogramming algorithm. ToDo : Add example!This class derives explicit_stepper_base which provides the stepper interface. -explicit_stepper_base< ... > -stepper_base_type::state_type -stepper_base_type::wrapped_state_type -stepper_base_type::value_type -stepper_base_type::deriv_type -stepper_base_type::wrapped_deriv_type -stepper_base_type::time_type -stepper_base_type::algebra_type -stepper_base_type::operations_type -stepper_base_type::resizer_type -unspecified -rk_algorithm_type::coef_a_type -rk_algorithm_type::coef_b_type -rk_algorithm_type::coef_c_type - -voidSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. const StateIn &The state of the ODE which should be solved. in is not modified in this method const DerivIn &The derivative of x at t. time_typeThe value of the time, at which the step should be performed. StateOut &The result of the step is written in out. time_typeThe step size. This method performs one step. The derivative dxdt of in at the time t is passed to the method. The result is updated out of place, hence the input is in in and the output in out. Access to this step functionality is provided by explicit_stepper_base and do_step_impl should not be called directly. - -voidconst StateIn &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - - -const coef_a_type &Triangular matrix of parameters b in the Butcher tableau. const coef_b_type &Last row of the butcher tableau. const coef_c_type &Parameters to calculate the time points in the Butcher tableau. const algebra_type &algebra_type()A copy of algebra is made and stored inside explicit_stepper_base. Constructs the explicit_generic_rk class. See examples section for details on the coefficients. - - -boolconst StateIn & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -explicit_error_stepper_baseExtrapolation stepper with configurable order, and error estimation. The extrapolation stepper is a stepper with error estimation and configurable order. The order is given as template parameter and needs to be an odd number. The stepper is based on several executions of the modified midpoint method and a Richardson extrapolation. This is essentially the same technique as for bulirsch_stoer, but without the variable order.The Order parameter has to be an even number greater 2. -explicit_error_stepper_base< extrapolation_stepper< ... >,... > -stepper_base_type::state_type -stepper_base_type::value_type -stepper_base_type::deriv_type -stepper_base_type::time_type -stepper_base_type::algebra_type -stepper_base_type::operations_type -stepper_base_type::resizer_type -unsigned short -const order_type -const order_type -const order_type -const size_t - -((Order%2)==0)&&(Order > 2)"extrapolation_stepper requires even Order larger than 2" -boolconst StateIn & -boolconst StateIn & -voidsize_tstate_table_type &const value_matrix &StateInOut & - - -voidSystemconst StateIn &const DerivIn &time_typeStateOut &time_typeErr & -voidSystemStateInOut &const DerivIn &time_typetime_typeErr & -voidSystemconst StateIn &const DerivIn &time_typeStateOut &time_type -voidSystemStateInOut &const DerivIn &time_typetime_type -voidSystemStateInOut &const DerivIn &time_typetime_type -voidSystemconst StateIn &const DerivIn &time_typeStateOut &time_type -voidconst StateIn & - -const algebra_type &algebra_type() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
- - - -ValueType -value_type -boost::numeric::ublas::vector< value_type > -state_wrapper< state_type > -state_type -state_wrapper< deriv_type > -boost::numeric::ublas::matrix< value_type > -state_wrapper< matrix_type > -boost::numeric::ublas::permutation_matrix< size_t > -state_wrapper< pmatrix_type > -Resizer -stepper_tag -implicit_euler< ValueType, Resizer > - -voidSystemstate_type &time_typetime_type -voidconst StateType & - -value_type1E-6 - -boolconst StateIn & -voidstate_type &matrix_type & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -explicit_stepper_baseImplementation of the modified midpoint method with a configurable number of intermediate steps. This class is used by the Bulirsch-Stoer algorithm and is not meant for direct usage. explicit_stepper_base< modified_midpoint< State, Value, Deriv, Time, Algebra, Operations, Resizer >, 2, State, Value, Deriv, Time, Algebra, Operations, Resizer > -stepper_base_type::state_type -stepper_base_type::wrapped_state_type -stepper_base_type::value_type -stepper_base_type::deriv_type -stepper_base_type::wrapped_deriv_type -stepper_base_type::time_type -stepper_base_type::algebra_type -stepper_base_type::operations_type -stepper_base_type::resizer_type -stepper_base_type::stepper_type - -voidSystemconst StateIn &const DerivIn &time_typeStateOut &time_type -voidunsigned short -unsigned shortvoid -voidconst StateIn & - -unsigned short2const algebra_type &algebra_type() - -boolconst StateIn & - -Implementation of the modified midpoint method with a configurable number of intermediate steps. This class is used by the dense output Bulirsch-Stoer algorithm and is not meant for direct usage. This stepper is for internal use only and does not meet any stepper concept. -State -Value -Deriv -Time -Algebra -Operations -Resizer -state_wrapper< state_type > -state_wrapper< deriv_type > -modified_midpoint_dense_out< State, Value, Deriv, Time, Algebra, Operations, Resizer > -std::vector< wrapped_deriv_type > - -voidSystemconst StateIn &const DerivIn &time_typeStateOut &time_typestate_type &deriv_table_type & -voidunsigned short -unsigned shortvoid -boolconst StateIn & -voidconst StateIn & - -unsigned short2const algebra_type &algebra_type() - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -Value -unsigned short -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const value_type -const order_type -const order_type - - -void -Value -boost::numeric::ublas::vector< value_type > -state_type -value_type -boost::numeric::ublas::matrix< value_type > -boost::numeric::ublas::permutation_matrix< size_t > -Resizer -Coefficients -stepper_tag -unsigned short -state_wrapper< state_type > -state_wrapper< deriv_type > -state_wrapper< matrix_type > -state_wrapper< pmatrix_type > -rosenbrock4< Value, Coefficients, Resizer > -const order_type -const order_type - -order_type -voidSystemconst state_type &time_typestate_type &time_typestate_type & -voidSystemstate_type &time_typetime_typestate_type & -voidSystemconst state_type &time_typestate_type &time_type -voidSystemstate_type &time_typetime_type -void -voidtime_typestate_type &const state_type &time_typeconst state_type &time_type -voidconst StateType & - -void - -boolconst StateIn & -boolconst StateIn & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -Stepper -stepper_type::value_type -stepper_type::state_type -stepper_type::wrapped_state_type -stepper_type::time_type -stepper_type::deriv_type -stepper_type::wrapped_deriv_type -stepper_type::resizer_type -controlled_stepper_tag -rosenbrock4_controller< Stepper > - -value_typeconst state_type &const state_type &const state_type & -value_typevoid -boost::numeric::odeint::controlled_step_resultSystemstate_type &time_type &time_type & -boost::numeric::odeint::controlled_step_resultSystemconst state_type &time_type &state_type &time_type & -voidconst StateType & -stepper_type &void -const stepper_type &void - -value_type1.0e-6value_type1.0e-6const stepper_type &stepper_type() -value_typevalue_typetime_typeconst stepper_type &stepper_type() - -boolconst StateIn & -boolconst StateIn & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -ControlledStepper -controlled_stepper_type::stepper_type -stepper_type::value_type -stepper_type::state_type -stepper_type::wrapped_state_type -stepper_type::time_type -stepper_type::deriv_type -stepper_type::wrapped_deriv_type -stepper_type::resizer_type -dense_output_stepper_tag -rosenbrock4_dense_output< ControlledStepper > - -voidconst StateType &time_typetime_type -std::pair< time_type, time_type >System -voidtime_typeStateOut & -voidtime_typeconst StateOut & -voidconst StateType & -const state_type &void -time_typevoid -const state_type &void -time_typevoid -time_typevoid - -const controlled_stepper_type &controlled_stepper_type() - -state_type &void -const state_type &void -state_type &void -const state_type &void -voidvoid -boolconst StateIn & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -boost::numeric::odeint::explicit_generic_rk< StageCount, Order, State, Value, Deriv, Time, Algebra, Operations, Resizer >The classical Runge-Kutta stepper of fourth order. The Runge-Kutta method of fourth order is one standard method for solving ordinary differential equations and is widely used, see also en.wikipedia.org/wiki/Runge-Kutta_methods The method is explicit and fulfills the Stepper concept. Step size control or continuous output are not provided.This class derives from explicit_stepper_base and inherits its interface via CRTP (current recurring template pattern). Furthermore, it derivs from explicit_generic_rk which is a generic Runge-Kutta algorithm. For more details see explicit_stepper_base and explicit_generic_rk. -stepper_base_type::state_type -stepper_base_type::value_type -stepper_base_type::deriv_type -stepper_base_type::time_type -stepper_base_type::algebra_type -stepper_base_type::operations_type -stepper_base_type::resizer_type - -voidSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. const StateIn &The state of the ODE which should be solved. in is not modified in this method const DerivIn &The derivative of x at t. time_typeThe value of the time, at which the step should be performed. StateOut &The result of the step is written in out. time_typeThe step size. This method performs one step. The derivative dxdt of in at the time t is passed to the method. The result is updated out of place, hence the input is in in and the output in out. Access to this step functionality is provided by explicit_stepper_base and do_step_impl should not be called directly. - -voidconst StateIn &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - - -const algebra_type &algebra_type()A copy of algebra is made and stored inside explicit_stepper_base. Constructs the runge_kutta4 class. This constructor can be used as a default constructor if the algebra has a default constructor. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -explicit_stepper_baseThe classical Runge-Kutta stepper of fourth order. The Runge-Kutta method of fourth order is one standard method for solving ordinary differential equations and is widely used, see also en.wikipedia.org/wiki/Runge-Kutta_methods The method is explicit and fulfills the Stepper concept. Step size control or continuous output are not provided. This class implements the method directly, hence the generic Runge-Kutta algorithm is not used.This class derives from explicit_stepper_base and inherits its interface via CRTP (current recurring template pattern). For more details see explicit_stepper_base. -explicit_stepper_base< runge_kutta4_classic< ... >,... > -stepper_base_type::state_type -stepper_base_type::value_type -stepper_base_type::deriv_type -stepper_base_type::time_type -stepper_base_type::algebra_type -stepper_base_type::operations_type -stepper_base_type::resizer_type - -voidSystemThe system function to solve, hence the r.h.s. of the ODE. It must fulfill the Simple System concept. const StateIn &The state of the ODE which should be solved. in is not modified in this method const DerivIn &The derivative of x at t. time_typeThe value of the time, at which the step should be performed. StateOut &The result of the step is written in out. time_typeThe step size. This method performs one step. The derivative dxdt of in at the time t is passed to the method. The result is updated out of place, hence the input is in in and the output in out. Access to this step functionality is provided by explicit_stepper_base and do_step_impl should not be called directly. - -voidconst StateType &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - - -const algebra_type &algebra_type()A copy of algebra is made and stored inside explicit_stepper_base. Constructs the runge_kutta4_classic class. This constructor can be used as a default constructor if the algebra has a default constructor. - - -boolconst StateIn & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -boost::numeric::odeint::explicit_error_generic_rk< StageCount, Order, StepperOrder, ErrorOrder, State, Value, Deriv, Time, Algebra, Operations, Resizer >The Runge-Kutta Cash-Karp method. The Runge-Kutta Cash-Karp method is one of the standard methods for solving ordinary differential equations, see en.wikipedia.org/wiki/Cash-Karp_methods. The method is explicit and fulfills the Error Stepper concept. Step size control is provided but continuous output is not available for this method.This class derives from explicit_error_stepper_base and inherits its interface via CRTP (current recurring template pattern). Furthermore, it derivs from explicit_error_generic_rk which is a generic Runge-Kutta algorithm with error estimation. For more details see explicit_error_stepper_base and explicit_error_generic_rk. -stepper_base_type::state_type -stepper_base_type::value_type -stepper_base_type::deriv_type -stepper_base_type::time_type -stepper_base_type::algebra_type -stepper_base_type::operations_type -stepper_base_type::resizer_type - -voidSystemconst StateIn &const DerivIn &time_typeStateOut &time_typeErr & -voidSystemconst StateIn &const DerivIn &time_typeStateOut &time_type -voidconst StateIn &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - - -const algebra_type &algebra_type()A copy of algebra is made and stored inside explicit_stepper_base. Constructs the runge_kutta_cash_karp54 class. This constructor can be used as a default constructor if the algebra has a default constructor. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -explicit_error_stepper_baseThe Runge-Kutta Cash-Karp method implemented without the generic Runge-Kutta algorithm. The Runge-Kutta Cash-Karp method is one of the standard methods for solving ordinary differential equations, see en.wikipedia.org/wiki/Cash-Karp_method. The method is explicit and fulfills the Error Stepper concept. Step size control is provided but continuous output is not available for this method.This class derives from explicit_error_stepper_base and inherits its interface via CRTP (current recurring template pattern). This class implements the method directly, hence the generic Runge-Kutta algorithm is not used. -explicit_error_stepper_base< runge_kutta_cash_karp54_classic< ... >,... > -stepper_base_type::state_type -stepper_base_type::value_type -stepper_base_type::deriv_type -stepper_base_type::time_type -stepper_base_type::algebra_type -stepper_base_type::operations_type -stepper_base_type::resizer_type - -voidSystemconst StateIn &const DerivIn &time_typeStateOut &time_typeErr & -voidSystemconst StateIn &const DerivIn &time_typeStateOut &time_type -voidconst StateIn &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - - -const algebra_type &algebra_type()A copy of algebra is made and stored inside explicit_stepper_base. Constructs the runge_kutta_cash_karp54_classic class. This constructor can be used as a default constructor if the algebra has a default constructor. - - -boolconst StateIn & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -explicit_error_stepper_fsal_baseThe Runge-Kutta Dormand-Prince 5 method. The Runge-Kutta Dormand-Prince 5 method is a very popular method for solving ODEs, see . The method is explicit and fulfills the Error Stepper concept. Step size control is provided but continuous output is available which make this method favourable for many applications.This class derives from explicit_error_stepper_fsal_base and inherits its interface via CRTP (current recurring template pattern). The method possesses the FSAL (first-same-as-last) property. See explicit_error_stepper_fsal_base for more details. -explicit_error_stepper_fsal_base< runge_kutta_dopri5< ... >,... > -stepper_base_type::state_type -stepper_base_type::value_type -stepper_base_type::deriv_type -stepper_base_type::time_type -stepper_base_type::algebra_type -stepper_base_type::operations_type -stepper_base_type::resizer_type - -voidSystemconst StateIn &const DerivIn &time_typeStateOut &DerivOut &time_type -voidSystemconst StateIn &const DerivIn &time_typeStateOut &DerivOut &time_typeErr & -voidtime_typeStateOut &const StateIn1 &const DerivIn1 &time_typeconst StateIn2 &const DerivIn2 &time_typeThis method is used for continuous output and it calculates the state x at a time t from the knowledge of two states old_state and current_state at time points t_old and t_new. It also uses internal variables to calculate the result. Hence this method must be called after two successful do_step calls. -voidconst StateIn &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - - -const algebra_type &algebra_type()A copy of algebra is made and stored inside explicit_stepper_base. Constructs the runge_kutta_dopri5 class. This constructor can be used as a default constructor if the algebra has a default constructor. - - -boolconst StateIn & -boolconst StateIn & - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -boost::numeric::odeint::explicit_error_generic_rk< StageCount, Order, StepperOrder, ErrorOrder, State, Value, Deriv, Time, Algebra, Operations, Resizer >The Runge-Kutta Fehlberg 78 method. The Runge-Kutta Fehlberg 78 method is a standard method for high-precision applications. The method is explicit and fulfills the Error Stepper concept. Step size control is provided but continuous output is not available for this method.This class derives from explicit_error_stepper_base and inherits its interface via CRTP (current recurring template pattern). Furthermore, it derivs from explicit_error_generic_rk which is a generic Runge-Kutta algorithm with error estimation. For more details see explicit_error_stepper_base and explicit_error_generic_rk. -stepper_base_type::state_type -stepper_base_type::value_type -stepper_base_type::deriv_type -stepper_base_type::time_type -stepper_base_type::algebra_type -stepper_base_type::operations_type -stepper_base_type::resizer_type - -voidSystemconst StateIn &const DerivIn &time_typeStateOut &time_typeErr & -voidSystemconst StateIn &const DerivIn &time_typeStateOut &time_type -voidconst StateIn &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - - -const algebra_type &algebra_type()A copy of algebra is made and stored inside explicit_stepper_base. Constructs the runge_kutta_cash_fehlberg78 class. This constructor can be used as a default constructor if the algebra has a default constructor. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -boost::numeric::odeint::stepper_tagboost::numeric::odeint::error_stepper_tagboost::numeric::odeint::error_stepper_tagboost::numeric::odeint::controlled_stepper_tagboost::numeric::odeint::controlled_stepper_tagstepper_tagstepper_tag -error_stepper_tagstepper_tag -explicit_error_stepper_tagstepper_tag -explicit_error_stepper_fsal_tagstepper_tag -controlled_stepper_tagcontrolled_stepper_tag -explicit_controlled_stepper_tagcontrolled_stepper_tag -explicit_controlled_stepper_fsal_tagcontrolled_stepper_tag -dense_output_stepper_tagdense_output_stepper_tag - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -symplectic_nystroem_stepper_baseImplementation of the symplectic Euler method. The method is of first order and has one stage. It is described HERE. -stepper_base_type::algebra_type -stepper_base_type::value_type - - -const algebra_type &algebra_type()A copy of algebra is made and stored inside explicit_stepper_base. Constructs the symplectic_euler. This constructor can be used as a default constructor if the algebra has a default constructor. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -symplectic_nystroem_stepper_baseImplementation of the symmetric B3A Runge-Kutta Nystroem method of fifth order. The method is of fourth order and has five stages. It is described HERE. This method can be used with multiprecision types since the coefficients are defined analytically.ToDo: add reference to paper. -stepper_base_type::algebra_type -stepper_base_type::value_type - - -const algebra_type &algebra_type()A copy of algebra is made and stored inside explicit_stepper_base. Constructs the symplectic_rkn_sb3a_m4_mclachlan. This constructor can be used as a default constructor if the algebra has a default constructor. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -symplectic_nystroem_stepper_baseImplement of the symmetric B3A method of Runge-Kutta-Nystroem method of sixth order. The method is of fourth order and has six stages. It is described HERE. This method cannot be used with multiprecision types since the coefficients are not defined analytically.ToDo Add reference to the paper. -stepper_base_type::algebra_type -stepper_base_type::value_type - - -const algebra_type &algebra_type()A copy of algebra is made and stored inside explicit_stepper_base. Constructs the symplectic_rkn_sb3a_mclachlan. This constructor can be used as a default constructor if the algebra has a default constructor. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -algebra_stepper_base< Algebra, Operations >The Velocity-Verlet algorithm. The Velocity-Verlet algorithm is a method for simulation of molecular dynamics systems. It solves the ODE a=f(r,v',t) where r are the coordinates, v are the velocities and a are the accelerations, hence v = dr/dt, a=dv/dt. -algebra_stepper_base< Algebra, Operations > -algebra_stepper_base_type::algebra_type -algebra_stepper_base_type::operations_type -Coor -Velocity -Acceleration -std::pair< coor_type, velocity_type > -std::pair< velocity_type, acceleration_type > -state_wrapper< acceleration_type > -Value -Time -TimeSq -Resizer -stepper_tag -unsigned short -const order_type - -order_typevoid -Returns the order of the stepper. -voidSystemStateInOut &time_typetime_type -voidSystemconst StateInOut &time_typetime_type -voidSystemCoorIn const &VelocityIn const &AccelerationIn const &CoorOut &VelocityOut &AccelerationOut &time_typetime_type -voidconst StateIn &A state from which the size of the temporaries to be resized is deduced. Adjust the size of all temporaries in the stepper manually. - -voidvoidResets the internal state of this stepper. After calling this method it is safe to use all do_step method without explicitly initializing the stepper. -voidconst AccelerationIn & -voidSystemconst CoorIn &const VelocityIn &time_type -boolvoid -Returns if the stepper is initialized. - -const algebra_type &algebra_type()A copy of algebra is made and stored. Constructs the velocity_verlet class. This constructor can be used as a default constructor if the algebra has a default constructor. - - -voidSystemconst CoorIn &const VelocityIn &time_type -voidSystemStateInOut &time_typetime_type -boolconst StateIn & -acceleration_type &void -const acceleration_type &void -acceleration_type &void -const acceleration_type &void -voidvoid - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
\ No newline at end of file diff --git a/libs/numeric/odeint/doc/stepper_table.qbk b/libs/numeric/odeint/doc/stepper_table.qbk deleted file mode 100644 index 86e101802..000000000 --- a/libs/numeric/odeint/doc/stepper_table.qbk +++ /dev/null @@ -1,44 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2015 Karsten Ahnert - Copyright 2011-2015 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - - -[table Stepper Algorithms - [[Algorithm] [Class] [Concept] [System Concept] [Order] [Error Estimation] [Dense Output] [Internal state] [Remarks]] - [[Explicit Euler] [`euler`] [__dense_output_stepper] [__system] [1] [No] [Yes] [No] [Very simple, only for demonstrating purpose]] - [[Modified Midpoint] [`modified_midpoint`] [__stepper] [__system] [configurable (2)] [No] [No] [No] [Used in Bulirsch-Stoer implementation]] - [[Runge-Kutta 4] [`runge_kutta4`] [__stepper] [__system] [4] [No] [No] [No] [The classical Runge-Kutta scheme, good general scheme without error control]] - [[Cash-Karp] [`runge_kutta_cash_karp54`] [__error_stepper] [__system] [5] [Yes (4)] [No] [No] [Good general scheme with error estimation, to be used in controlled_error_stepper]] - [[Dormand-Prince 5] [`runge_kutta_dopri5`] [__error_stepper] [__system] [5] [Yes (4)] [Yes] [Yes] [Standard method with error control and dense output, to be used in controlled_error_stepper and in dense_output_controlled_explicit_fsal.]] - [[Fehlberg 78] [`runge_kutta_fehlberg78`] [__error_stepper] [__system] [8] [Yes (7)] [No] [No] [Good high order method with error estimation, to be used in controlled_error_stepper.]] - - [[Adams Bashforth] [`adams_bashforth`] [__stepper] [__system] [configurable] [No] [No] [Yes] [Multistep method]] -[/ # removed as it is not an independent algorithm. - [[Adams Moulton] [`adams_moulton`] [__stepper] [__system] [configurable] [No] [No] [Yes] [Multistep method]] \] - [[Adams Bashforth Moulton] [`adams_bashforth_moulton`] [__stepper] [__system] [configurable] [No] [No] [Yes] [Combined multistep method]] - - [[Controlled Runge-Kutta] [`controlled_runge_kutta`] [__controlled_stepper] [__system] [depends] [Yes] [No] [depends] [Error control for __error_stepper. Requires an __error_stepper from above. Order depends on the given ErrorStepper]] - [[Dense Output Runge-Kutta] [`dense_output_runge_kutta`] [__dense_output_stepper] [__system] [depends] [No] [Yes] [Yes] [Dense output for __stepper and __error_stepper from above if they provide dense output functionality (like `euler` and `runge_kutta_dopri5`). Order depends on the given stepper.]] - - [[Bulirsch-Stoer] [`bulirsch_stoer`] [__controlled_stepper] [__system] [variable] [Yes] [No] [No] [Stepper with step size and order control. Very good if high precision is required.]] - [[Bulirsch-Stoer Dense Output] [`bulirsch_stoer_dense_out`] [__dense_output_stepper] [__system] [variable] [Yes] [Yes] [No] [Stepper with step size and order control as well as dense output. Very good if high precision and dense output is required.]] - - [[Implicit Euler] [`implicit_euler`] [__stepper] [__implicit_system] [1] [No] [No] [No] [Basic implicit routine. Requires the Jacobian. Works only with __ublas vectors as state types.]] - [[Rosenbrock 4] [`rosenbrock4`] [__error_stepper] [__implicit_system] [4] [Yes] [Yes] [No] [Good for stiff systems. Works only with __ublas vectors as state types.]] - [[Controlled Rosenbrock 4] [`rosenbrock4_controller`] [__controlled_stepper] [__implicit_system] [4] [Yes] [Yes] [No] [Rosenbrock 4 with error control. Works only with __ublas vectors as state types.]] - [[Dense Output Rosenbrock 4] [`rosenbrock4_dense_output`] [__dense_output_stepper] [__implicit_system] [4] [Yes] [Yes] [No] [Controlled Rosenbrock 4 with dense output. Works only with __ublas vectors as state types.]] - - [[Symplectic Euler] [`symplectic_euler`] [__stepper] [__symplectic_system __simple_symplectic_system] [1] [No] [No] [No] [Basic symplectic solver for separable Hamiltonian system]] - [[Symplectic RKN McLachlan] [`symplectic_rkn_sb3a_mclachlan`] [__stepper] [__symplectic_system __simple_symplectic_system] [4] [No] [No] [No] [Symplectic solver for separable Hamiltonian system with 6 stages and order 4.]] - [[Symplectic RKN McLachlan] [`symplectic_rkn_sb3a_m4_mclachlan`] [__stepper] [__symplectic_system __simple_symplectic_system] [4] [No] [No] [No] [Symplectic solver with 5 stages and order 4, can be used with arbitrary precision types.]] - - [[Velocity Verlet] [`velocity_verlet`] [__stepper] [__second_order_system] [1] [No] [No] [Yes] [Velocity verlet method suitable for molecular dynamics simulation.]] -] diff --git a/libs/numeric/odeint/doc/tutorial.qbk b/libs/numeric/odeint/doc/tutorial.qbk deleted file mode 100644 index 128437db7..000000000 --- a/libs/numeric/odeint/doc/tutorial.qbk +++ /dev/null @@ -1,46 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2010-2012 Karsten Ahnert - Copyright 2010-2013 Mario Mulansky - Copyright 2013 Pascal Germroth - - 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) -=============================================================================/] - - -[section Tutorial] - - -[include tutorial_harmonic_oscillator.qbk] - -[include tutorial_solar_system.qbk] - -[include tutorial_chaotic_system.qbk] - -[include tutorial_stiff_systems.qbk] - -[include tutorial_special_topics.qbk] - -[include tutorial_thrust_cuda.qbk] - -[include tutorial_vexcl_opencl.qbk] - -[include tutorial_parallel.qbk] - -[section All examples] - -The following table gives an overview over all examples. - -[include examples_table.qbk] - -[endsect] - - - - - - -[endsect] diff --git a/libs/numeric/odeint/doc/tutorial_chaotic_system.qbk b/libs/numeric/odeint/doc/tutorial_chaotic_system.qbk deleted file mode 100644 index 930573379..000000000 --- a/libs/numeric/odeint/doc/tutorial_chaotic_system.qbk +++ /dev/null @@ -1,162 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2013 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - - -[section Chaotic systems and Lyapunov exponents] - -[import ../examples/chaotic_system.cpp] - -In this example we present application of odeint to investigation of the properties of chaotic -deterministic systems. In mathematical terms chaotic refers to an exponential -growth of perturbations ['__delta x]. In order to observe this exponential growth one usually solves the equations for the tangential dynamics which is again an ordinary differential equation. These equations are linear but time dependent and can be obtained via - -['d __delta x / dt = J(x) __delta x] - -where ['J] is the Jacobian of the system under consideration. ['__delta x] can -also be interpreted as a perturbation of the original system. In principle -['n] of these perturbations exist, they form a hypercube and evolve in the -time. The Lyapunov exponents are then defined as logarithmic growth rates of -the perturbations. If one Lyapunov exponent is larger then zero the nearby -trajectories diverge exponentially hence they are chaotic. If the largest -Lyapunov exponent is zero one is usually faced with periodic motion. In the -case of a largest Lyapunov exponent smaller then zero convergence to a -fixed point is expected. More information's about Lyapunov exponents and nonlinear -dynamical systems can be found in many textbooks, see for example: E. Ott "Chaos is -Dynamical Systems", Cambridge. - -To calculate the Lyapunov exponents numerically one usually solves the equations of motion for ['n] perturbations and orthonormalizes them every ['k] steps. The Lyapunov exponent is the average of the logarithm of the stretching factor of each perturbation. - -To demonstrate how one can use odeint to determine the Lyapunov exponents we choose the Lorenz system. It is one of the most studied dynamical systems in the nonlinear dynamics community. For the standard parameters it possesses a strange attractor with non-integer dimension. The Lyapunov exponents take values of approximately 0.9, 0 and -12. - -The implementation of the Lorenz system is - -`` -const double sigma = 10.0; -const double R = 28.0; -const double b = 8.0 / 3.0; - -typedef boost::array< double , 3 > lorenz_state_type; - -void lorenz( const lorenz_state_type &x , lorenz_state_type &dxdt , double t ) -{ - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; -} -`` -We need also to integrate the set of the perturbations. This is done in parallel to the original system, hence within one system function. Of course, we want to use the above definition of the Lorenz system, hence the definition of the system function including the Lorenz system itself and the perturbation could look like: - -`` -const size_t n = 3; -const size_t num_of_lyap = 3; -const size_t N = n + n*num_of_lyap; - -typedef std::tr1::array< double , N > state_type; -typedef std::tr1::array< double , num_of_lyap > lyap_type; - -void lorenz_with_lyap( const state_type &x , state_type &dxdt , double t ) -{ - lorenz( x , dxdt , t ); - - for( size_t l=0 ; l - void operator()( const StateIn &x , StateOut &dxdt , Value t ) - { - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; - } -}; - -void lorenz_with_lyap( const state_type &x , state_type &dxdt , double t ) -{ - lorenz()( x , dxdt , t ); - ... -} - -`` -This works fine and `lorenz_with_lyap` can be used for example via -`` -state_type x; -// initialize x.. - -explicit_rk4< state_type > rk4; -integrate_n_steps( rk4 , lorenz_with_lyap , x , 0.0 , 0.01 , 1000 ); -`` -This code snippet performs 1000 steps with constant step size 0.01. - -A real world use case for the calculation of the Lyapunov exponents of Lorenz system would always include some transient steps, just to ensure that the current state lies on the attractor, hence it would look like - -`` -state_type x; -// initialize x -explicit_rk4< state_type > rk4; -integrate_n_steps( rk4 , lorenz , x , 0.0 , 0.01 , 1000 ); -`` -The problem is now, that `x` is the full state containing also the -perturbations and `integrate_n_steps` does not know that it should only use 3 -elements. In detail, odeint and its steppers determine the length of the -system under consideration by determining the length of the state. In the -classical solvers, e.g. from Numerical Recipes, the problem was solved by -pointer to the state and an appropriate length, something similar to - -`` -void lorenz( double* x , double *dxdt , double t, void* params ) -{ - ... -} - -int system_length = 3; -rk4( x , system_length , t , dt , lorenz ); -`` - -But odeint supports a similar and much more sophisticated concept: __boost_range. To make the steppers and the system ready to work with __boost_range the system has to be changed: - -[system_function_without_perturbations] - -This is in principle all. Now, we only have to call `integrate_n_steps` with a -range including only the first 3 components of ['x]: - -[integrate_transients_with_range] - -[note Note that when using __boost_range, we have to explicitly configure the -stepper to use the `range_algebra` as otherwise odeint would automatically -chose the `array_algebra`, which is incompatible with the usage of __boost_range, because the original state_type is an `array`.] - -Having integrated a sufficient number of transients steps we are now able to calculate the Lyapunov exponents: - -# Initialize the perturbations. They are stored linearly behind the state of the Lorenz system. The perturbations are initialized such that [' p [subl ij] = __delta [subl ij]], where ['p [subl ij]] is the ['j]-component of the ['i].-th perturbation and ['__delta [subl ij]] is the Kronecker symbol. -# Integrate 100 steps of the full system with perturbations -# Orthonormalize the perturbation using Gram-Schmidt orthonormalization algorithm. -# Repeat step 2 and 3. Every 10000 steps write the current Lyapunov exponent. - -[lyapunov_full_code] - -The full code can be found here: [github_link examples/chaotic_system.cpp chaotic_system.cpp] - -[endsect] diff --git a/libs/numeric/odeint/doc/tutorial_harmonic_oscillator.qbk b/libs/numeric/odeint/doc/tutorial_harmonic_oscillator.qbk deleted file mode 100644 index 53b8d8822..000000000 --- a/libs/numeric/odeint/doc/tutorial_harmonic_oscillator.qbk +++ /dev/null @@ -1,123 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2013 Karsten Ahnert - Copyright 2011-2012 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - - - -[section Harmonic oscillator] - -[section Define the ODE] - -First of all, you have to specify the data type that represents a state ['x] of your system. Mathematically, this usually is an n-dimensional vector with real numbers or complex numbers as scalar objects. For odeint the most natural way is to use `vector< double >` or `vector< complex< double > >` to represent the system state. However, odeint can deal with other container types as well, e.g. `boost::array< double , N >`, as long as it fulfills some requirements defined below. - -To integrate a differential equation numerically, one also has to define the rhs of the equation ['x' = f(x)]. In odeint you supply this function in terms of an object that implements the ()-operator with a certain parameter structure. Hence, the straightforward way would be to just define a function, e.g: - -[rhs_function] - -The parameters of the function must follow the example above where `x` is the -current state, here a two-component vector containing position ['q] and -momentum ['p] of the oscillator, `dxdt` is the derivative ['x'] and should be -filled by the function with ['f(x)], and `t` is the current time. -Note that in this example ['t] is not required to calculate ['f], however -odeint expects the function signature to have exactly three parameters (there -are exception, discussed later). - -A more sophisticated approach is to implement the system as a class where the rhs function is defined as the ()-operator of the class with the same parameter structure as above: - -[rhs_class] - -odeint can deal with instances of such classes instead of pure functions which -allows for cleaner code. - -[endsect] - -[section Stepper Types] - -Numerical integration works iteratively, that means you start at a state ['x(t)] and perform a time-step of length ['dt] to obtain the approximate state ['x(t+dt)]. There exist many different methods to perform such a time-step each of which has a certain order ['q]. If the order of a method is ['q] than it is accurate up to term ['~dt[super q]] that means the error in ['x] made by such a step is ['~dt[super q+1]]. odeint provides several steppers of different orders, see __odeint_stepper_table. - -Some of steppers in the table above are special: Some need the Jacobian of the ODE, others are constructed for special ODE-systems like Hamiltonian systems. We will show typical examples and use-cases in this tutorial and which kind of steppers should be applied. - -[endsect] - -[section Integration with Constant Step Size] - -The basic stepper just performs one time-step and doesn't give you any information about the error that was made (except that you know it is of order ['q+1]). Such steppers are used with constant step size that should be chosen small enough to have reasonable small errors. However, you should apply some sort of validity check of your results (like observing conserved quantities) because you have no other control of the error. The following example defines a basic stepper based on the classical Runge-Kutta scheme of 4th order. The declaration of the stepper requires the state type as template parameter. The integration can now be done by using the `integrate_const( Stepper, System, state, start_time, end_time, step_size )` function from odeint: - -[define_const_stepper] - -This call integrates the system defined by `harmonic_oscillator` using the RK4 method from ['t=0] to ['10] with a step-size ['dt=0.01] and the initial condition given in `x`. The result, ['x(t=10)] is stored in `x` (in-place). Each stepper defines a `do_step` method which can also be used directly. So, you write down the above example as - -[integrate_const_loop] - -[tip If you have a C++11 enabled compiler you can easily use lambdas to create the system function : - -[define_const_stepper_cpp11] - -] - -[endsect] - -[section Integration with Adaptive Step Size] - -To improve the numerical results and additionally minimize the computational -effort, the application of a step size control is advisable. Step size control -is realized via stepper algorithms that additionally provide an error -estimation of the applied step. odeint provides a number of such -*ErrorSteppers* and we will show their usage on the example of -`explicit_error_rk54_ck` - a 5th order Runge-Kutta method with 4th order -error estimation and coefficients introduced by Cash and Karp. - -[define_adapt_stepper] - -Given the error stepper, one still needs an instance that checks the error and adjusts the step size accordingly. In odeint, this is done by *ControlledSteppers*. For the `runge_kutta_cash_karp54` stepper a `controlled_runge_kutta` stepper exists which can be used via - -[integrate_adapt] - -As above, this integrates the system defined by `harmonic_oscillator`, but now using an adaptive step size method based on the Runge-Kutta Cash-Karp 54 scheme from ['t=0] to ['10] with an initial step size of ['dt=0.01] (will be adjusted) and the initial condition given in x. The result, ['x(t=10)], will also be stored in x (in-place). - -In the above example an error stepper is nested in a controlled stepper. This is a nice technique; however one drawback is that one always needs to define both steppers. One could also write the instantiation of the controlled stepper into the call of the integrate function but a complete knowledge of the underlying stepper types is still necessary. Another point is, that the error tolerances for the step size control are not easily included into the controlled stepper. Both issues can be solved by using `make_controlled`: - -[integrate_adapt_make_controlled] - -`make_controlled` can be used with many of the steppers of odeint. The first -parameter is the absolute error tolerance ['eps_abs] and the second is the -relative error tolerance ['eps_rel] which is used during the integration. The template parameter determines from which error stepper a controlled stepper should be instantiated. An alternative syntax of `make_controlled` is - -[integrate_adapt_make_controlled_alternative] - -For the Runge-Kutta controller the error made during one step is compared with ['eps_abs + eps_rel * ( a[sub x] * |x| + a[sub dxdt] * dt * |dxdt| )]. If the error is smaller than this value the current step is accepted, otherwise it is rejected and the step size is decreased. Note, that the step size is also increased if the error gets too small compared to the rhs of the above relation. The full instantiation of the `controlled_runge_kutta` with all parameters is therefore - -[integrate_adapt_full] - -When using `make_controlled` the parameter ['a[sub x]] and ['a[sub dxdt]] are used with their standard values of 1. - -In the tables below, one can find all steppers which are working with `make_controlled` and `make_dense_output` which is the analog for the dense output steppers. - -[include make_controlled_table.qbk] - -[include make_dense_output_table.qbk] - -When using `make_controlled` or `make_dense_output` one should be aware which exact type is used and how the step size control works. - -[endsect] - -[section Using iterators] - -odeint supports iterators for solving ODEs. That is, you instantiate a pair of iterators and instead of using the integrate routines with an appropriate observer you put the iterators in one of the algorithm from the C++ standard library or from Boost.Range. An example is - -[harm_iterator_const_step] - -[endsect] - -The full source file for this example can be found here: [github_link examples/harmonic_oscillator.cpp harmonic_oscillator.cpp] - - -[endsect] diff --git a/libs/numeric/odeint/doc/tutorial_parallel.qbk b/libs/numeric/odeint/doc/tutorial_parallel.qbk deleted file mode 100644 index 92f401c5e..000000000 --- a/libs/numeric/odeint/doc/tutorial_parallel.qbk +++ /dev/null @@ -1,266 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2013 Karsten Ahnert - Copyright 2013 Pascal Germroth - Copyright 2013 Mario Mulansky - - 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) -=============================================================================/] - - -[section Parallel computation with OpenMP and MPI] - -Parallelization is a key feature for modern numerical libraries due to the vast -availability of many cores nowadays, even on Laptops. -odeint currently supports parallelization with OpenMP and MPI, as described in -the following sections. -However, it should be made clear from the beginning that the difficulty of -efficiently distributing ODE integration on many cores/machines lies in the -parallelization of the system function, which is still the user's -responsibility. -Simply using a parallel odeint backend without parallelizing the system function -will bring you almost no performance gains. - -[section OpenMP] - -[import ../examples/openmp/phase_chain.cpp] - -odeint's OpenMP support is implemented as an external backend, which needs to be -manually included. Depending on the compiler some additional flags may be -needed, i.e. [^-fopenmp] for GCC. -[phase_chain_openmp_header] - -In the easiest parallelization approach with OpenMP we use a standard `vector` -as the state type: -[phase_chain_vector_state] - -We initialize the state with some random data: -[phase_chain_init] - -Now we have to configure the stepper to use the OpenMP backend. -This is done by explicitly providing the `openmp_range_algebra` as a template -parameter to the stepper. -This algebra requires the state type to be a model of Random Access Range and -will be used from multiple threads by the algebra. -[phase_chain_stepper] - -Additional to providing the stepper with OpenMP parallelization we also need -a parallelized system function to exploit the available cores. -Here this is shown for a simple one-dimensional chain of phase oscillators with -nearest neighbor coupling: -[phase_chain_rhs] - -[note In the OpenMP backends the system function will always be called -sequentially from the thread used to start the integration.] - -Finally, we perform the integration by using one of the integrate functions from -odeint. -As you can see, the parallelization is completely hidden in the stepper and the -system function. -OpenMP will take care of distributing the work among the threads and join them -automatically. -[phase_chain_integrate] - -After integrating, the data can be accessed immediately and be processed -further. -Note, that you can specify the OpenMP scheduling by calling `omp_set_schedule` -in the beginning of your program: -[phase_chain_scheduling] - -See [github_link examples/openmp/phase_chain.cpp -openmp/phase_chain.cpp] for the complete example. - -[heading Split state] - -[import ../examples/openmp/phase_chain_omp_state.cpp] - -For advanced cases odeint offers another approach to use OpenMP that allows for -a more exact control of the parallelization. -For example, for odd-sized data where OpenMP's thread boundaries don't match -cache lines and hurt performance it might be advisable to copy the data from the -continuous `vector` into separate, individually aligned, vectors. -For this, odeint provides the `openmp_state` type, essentially an alias for -`vector>`. - -Here, the initialization is done with a `vector`, but then we use -odeint's `split` function to fill an `openmp_state`. -The splitting is done such that the sizes of the individual regions differ at -most by 1 to make the computation as uniform as possible. -[phase_chain_state_init] - -Of course, the system function has to be changed to deal with the -`openmp_state`. -Note that each sub-region of the state is computed in a single task, but at the -borders read access to the neighbouring regions is required. -[phase_chain_state_rhs] - -Using the `openmp_state` state type automatically selects `openmp_algebra` -which executes odeint's internal computations on parallel regions. -Hence, no manual configuration of the stepper is necessary. -At the end of the integration, we use `unsplit` to concatenate the sub-regions -back together into a single vector. -[phase_chain_state_integrate] - -[note You don't actually need to use `openmp_state` for advanced use cases, -`openmp_algebra` is simply an alias for `openmp_nested_algebra` -and supports any model of Random Access Range as the outer, parallel state type, -and will use the given algebra on its elements.] - -See [github_link examples/openmp/phase_chain_omp_state.cpp -openmp/phase_chain_omp_state.cpp] for the complete example. - -[endsect] - -[section MPI] - -[import ../examples/mpi/phase_chain.cpp] - -To expand the parallel computation across multiple machines we can use MPI. - -The system function implementation is similar to the OpenMP variant with split -data, the main difference being that while OpenMP uses a spawn/join model where -everything not explicitly paralleled is only executed in the main thread, in -MPI's model each node enters the `main()` method independently, diverging based -on its rank and synchronizing through message-passing and explicit barriers. - -odeint's MPI support is implemented as an external backend, too. -Depending on the MPI implementation the code might need to be compiled with i.e. -[^mpic++]. -[phase_chain_mpi_header] - -Instead of reading another thread's data, we asynchronously send and receive the -relevant data from neighbouring nodes, performing some computation in the interim -to hide the latency. -[phase_chain_mpi_rhs] - -Analogous to `openmp_state` we use `mpi_state< InnerState >`, which -automatically selects `mpi_nested_algebra` and the appropriate MPI-oblivious -inner algebra (since our inner state is a `vector`, the inner algebra will be -`range_algebra` as in the OpenMP example). -[phase_chain_state] - -In the main program we construct a `communicator` which tells us the `size` of -the cluster and the current node's `rank` within that. -We generate the input data on the master node only, avoiding unnecessary work on -the other nodes. -Instead of simply copying chunks, `split` acts as a MPI collective function here -and sends/receives regions from master to each slave. -The input argument is ignored on the slaves, but the master node receives -a region in its output and will participate in the computation. -[phase_chain_mpi_init] - -Now that `x_split` contains (only) the local chunk for each node, we start the -integration. - -To print the result on the master node, we send the processed data back using -`unsplit`. -[phase_chain_mpi_integrate] - -[note `mpi_nested_algebra::for_each`[~N] doesn't use any MPI constructs, it -simply calls the inner algebra on the local chunk and the system function is not -guarded by any barriers either, so if you don't manually place any (for example -in parameter studies cases where the elements are completely independent) you -might see the nodes diverging, returning from this call at different times.] - -See [github_link examples/mpi/phase_chain.cpp -mpi/phase_chain.cpp] for the complete example. - -[endsect] - -[section Concepts] - -[section MPI State] -As used by `mpi_nested_algebra`. -[heading Notation] -[variablelist - [[`InnerState`] [The inner state type]] - [[`State`] [The MPI-state type]] - [[`state`] [Object of type `State`]] - [[`world`] [Object of type `boost::mpi::communicator`]] -] -[heading Valid Expressions] -[table - [[Name] [Expression] [Type] [Semantics]] - [[Construct a state with a communicator] - [`State(world)`] [`State`] [Constructs the State.]] - [[Construct a state with the default communicator] - [`State()`] [`State`] [Constructs the State.]] - [[Get the current node's inner state] - [`state()`] [`InnerState`] [Returns a (const) reference.]] - [[Get the communicator] - [`state.world`] [`boost::mpi::communicator`] [See __boost_mpi.]] -] -[heading Models] -* `mpi_state` - -[endsect] - -[section OpenMP Split State] -As used by `openmp_nested_algebra`, essentially a Random Access Container with -`ValueType = InnerState`. -[heading Notation] -[variablelist - [[`InnerState`] [The inner state type]] - [[`State`] [The split state type]] - [[`state`] [Object of type `State`]] -] -[heading Valid Expressions] -[table - [[Name] [Expression] [Type] [Semantics]] - [[Construct a state for `n` chunks] - [`State(n)`] [`State`] [Constructs underlying `vector`.]] - [[Get a chunk] - [`state[i]`] [`InnerState`] [Accesses underlying `vector`.]] - [[Get the number of chunks] - [`state.size()`] [`size_type`] [Returns size of underlying `vector`.]] -] -[heading Models] -* `openmp_state` with `InnerState = vector` - -[endsect] - -[section Splitter] -[heading Notation] -[variablelist - [[`Container1`] [The continuous-data container type]] - [[`x`] [Object of type `Container1`]] - [[`Container2`] [The chunked-data container type]] - [[`y`] [Object of type `Container2`]] -] -[heading Valid Expressions] -[table - [[Name] [Expression] [Type] [Semantics]] - [[Copy chunks of input to output elements] - [`split(x, y)`] [`void`] - [Calls `split_impl::split(x, y)`, splits `x` into - `y.size()` chunks.]] - [[Join chunks of input elements to output] - [`unsplit(y, x)`] [`void`] - [Calls `unsplit_impl::unsplit(y, x)`, assumes `x` - is of the correct size ['__sigma `y[i].size()`], does not resize `x`.]] -] -[heading Models] -* defined for `Container1` = __boost_range and `Container2 = openmp_state` -* and `Container2 = mpi_state`. - -To implement splitters for containers incompatible with __boost_range, -specialize the `split_impl` and `unsplit_impl` types: -``` -template< class Container1, class Container2 , class Enabler = void > -struct split_impl { - static void split( const Container1 &from , Container2 &to ); -}; - -template< class Container2, class Container1 , class Enabler = void > -struct unsplit_impl { - static void unsplit( const Container2 &from , Container1 &to ); -}; -``` -[endsect] - -[endsect] - -[endsect] diff --git a/libs/numeric/odeint/doc/tutorial_solar_system.qbk b/libs/numeric/odeint/doc/tutorial_solar_system.qbk deleted file mode 100644 index a9e667796..000000000 --- a/libs/numeric/odeint/doc/tutorial_solar_system.qbk +++ /dev/null @@ -1,109 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2012 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - - - -[section Solar system] - -[section Gravitation and energy conservation] - -The next example in this tutorial is a simulation of the outer solar system, consisting of the sun, Jupiter, Saturn, Uranus, Neptune and Pluto. - -[$solar_system.jpg] - -Each planet and of course the sun will be represented by mass points. The interaction force between each object is the gravitational force which can be written as - -['F[subl ij] = -__gamma m[subl i] m[subl j] ( q[subl i] - q[subl j] ) / | q[subl i] - q[subl j] | [super 3]] - -where [' __gamma] is the gravitational constant, ['m[subl i]] and ['m[subl j]] are the masses and ['q[subl i]] and ['q[subl j]] are the locations of the two objects. The equations of motion are then - -['dq[subl i] / dt = p[subl i]] - -['dp[subl i] / dt = 1 / m[subl i] __Sigma[subl ji] F[subl ij]] - -where ['p[subl i]] is the momenta of object ['i]. The equations of motion can also be derived from the Hamiltonian - -['H = __Sigma[subl i] p[subl i][super 2] / ( 2 m[subl i] ) + __Sigma[subl j] V( q[subl i] , q[subl j] )] - -with the interaction potential ['V(q[subl i],q[subl j])]. The Hamiltonian equations give the -equations of motion - -['dq[subl i] / dt = dH / dp[subl i]] - -['dp[subl i] / dt = -dH / dq[subl i]] - -In time independent Hamiltonian system the energy and the phase space volume -are conserved and special integration methods have to be applied in order to -ensure these conservation laws. The odeint library provides classes for -separable Hamiltonian systems, which can be written in the form ['H = __Sigma -p[subl i][super 2] / (2m[subl i]) + H[subl q](q)], where ['H[subl q](q)] only -depends on the coordinates. Although this functional form might look a bit -arbitrary, it covers nearly all classical mechanical systems with inertia and -without dissipation, or where the equations of motion can be written in the -form ['dq[subl i] / dt = p[subl i]] / m[subl i] , ['dp[subl i] / dt = f( -q[subl i] )]. - -[note A short physical note: While the two-body-problem is known to be -integrable, that means it can be solved with purely analytic techniques, -already the three-body-problem is not solvable. This was found in the end of the -19th century by H. Poincare which led to the whole new subject of -[@http://en.wikipedia.org/wiki/Chaos_theory Chaos Theory].] - -[endsect] - - -[section Define the system function] - -To implement this system we define a 3D point type which will represent the space as well as the velocity. Therefore, we use the operators from __boost_operators: - -[import ../examples/point_type.hpp] -[point_type] - - -The next step is to define a container type storing the values of ['q] and ['p] and to define system functions. As container type we use `boost::array` - -[import ../examples/solar_system.cpp] -[container_type_definition] - -The `container_type` is different from the state type of the ODE. The state type of the ode is simply a `pair< container_type , container_type >` since it needs the information about the coordinates and the momenta. - -Next we define the system's equations. -As we will use a stepper that accounts for the Hamiltonian (energy-preserving) -character of the system, we have to define the rhs different from the usual -case where it is just a single function. -The stepper will make use of the separable character, which means the system -will be defined by two objects representing ['f(p) = -dH/dq] and ['g(q) = dH/dp]: - -[coordinate_function] - -[momentum_function] - -In general a three body-system is chaotic, hence we can not expect that arbitrary initial conditions of the system will lead to a solution comparable with the solar system dynamics. That is we have to define proper initial conditions, which are taken from the book of Hairer, Wannier, Lubich __hairer_geom_ref. - -As mentioned above, we need to use some special integrators in order to -conserve phase space volume. There is a well known family of such integrators, -the so-called Runge-Kutta-Nystroem solvers, which we apply here in terms of a -`symplectic_rkn_sb3a_mclachlan` stepper: - -[integration_solar_system] - -These integration routine was used to produce the above sketch of the solar system. Note, that there are two particularities in this example. First, the state of the symplectic stepper is not `container_type` but a pair of `container_type`. Hence, we must pass such a pair to the integrate function. Since, we want to pass them as references we can simply pack them into __boost_ref. The second point is the observer, which is called with a state type, hence a pair of `container_type`. The reference wrapper is also passed, but this is not a problem at all: - -[streaming_observer] - -[tip You can use C++11 lambda to create the observers] - -The full example can be found here: [github_link examples/solar_system.cpp solar_system.cpp] - -[endsect] - -[endsect] diff --git a/libs/numeric/odeint/doc/tutorial_special_topics.qbk b/libs/numeric/odeint/doc/tutorial_special_topics.qbk deleted file mode 100644 index 0e3e9dc3a..000000000 --- a/libs/numeric/odeint/doc/tutorial_special_topics.qbk +++ /dev/null @@ -1,274 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2013 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - - -[/ [section Special topics] /] - -[section Complex state types] - -[import ../examples/stuart_landau.cpp] - -Thus far we have seen several examples defined for real values. -odeint can handle complex state types, hence ODEs which are defined on complex -vector spaces, as well. An example is the Stuart-Landau oscillator - -['d __Psi / dt = ( 1 + i __eta ) __Psi + ( 1 + i __alpha ) | __Psi |[super 2] __Psi ] - -where ['__Psi] and ['i] is a complex variable. The definition of this ODE in C++ -using complex< double > as a state type may look as follows - -[stuart_landau_system_function] - -One can also use a function instead of a functor to implement it - -[stuart_landau_system_function_alternative] - -We strongly recommend to use the first ansatz. In this case you have explicit control over the parameters of the system and are not restricted to use global variables to parametrize the oscillator. - -When choosing the stepper type one has to account for the "unusual" state type: -it is a single `complex` opposed to the vector types used in the -previous examples. This means that no iterations over vector elements have to -be performed inside the stepper algorithm. Odeint already detects that and -automatically uses the `vector_space_algebra` for computation. -You can enforce this by supplying additional template arguments to the stepper -including the `vector_space_algebra`. Details on the usage of algebras can be -found in the section __adapt_state_types. - -[stuart_landau_integration] - -The full cpp file for the Stuart-Landau example can be found here [github_link -examples/stuart_landau.cpp stuart_landau.cpp] - -[endsect] - -[section Lattice systems] - -[import ../examples/fpu.cpp] - - -odeint can also be used to solve ordinary differential equations defined on lattices. A prominent example is the Fermi-Pasta-Ulam system __fpu_scholarpedia_ref. It is a Hamiltonian system of nonlinear coupled harmonic oscillators. The Hamiltonian is - -[' H = __Sigma[subl i] p[subl i][super 2]/2 + 1/2 ( q[subl i+1] - q[subl i] )^2 + __beta / 4 ( q[subl i+1] - q[subl i] )^4 ] - -Remarkably, the Fermi-Pasta-Ulam system was the first numerical experiment to be implemented on a computer. It was studied at Los Alamos in 1953 on one of the first computers (a MANIAC I) and it triggered a whole new tree of mathematical and physical science. - -Like the __tut_solar_system, the FPU is solved again by a symplectic solver, but in this case we can speed up the computation because the ['q] components trivially reduce to ['dq[subl i] / dt = p[subl i]]. odeint is capable of doing this performance improvement. All you have to do is to call the symplectic solver with an state function for the ['p] components. Here is how this function looks like - -[fpu_system_function] - -You can also use `boost::array< double , N >` for the state type. - -Now, you have to define your initial values and perform the integration: - -[fpu_integration] - -The observer uses a reference to the system object to calculate the local energies: - -[fpu_observer] - -The full cpp file for this FPU example can be found here [github_link examples/fpu.cpp fpu.cpp] - -[endsect] - -[section Ensembles of oscillators] - -[import ../examples/phase_oscillator_ensemble.cpp] - -Another important high dimensional system of coupled ordinary differential equations is an ensemble of ['N] all-to-all coupled phase oscillators __synchronization_pikovsky_ref. It is defined as - -[' d__phi[subl k] / dt = __omega[subl k] + __epsilon / N __Sigma[subl j] sin( __phi[subl j] - __phi[subl k] )] - -The natural frequencies ['__omega[subl i]] of each oscillator follow some distribution and ['__epsilon] is the coupling strength. We choose here a Lorentzian distribution for ['__omega[subl i]]. Interestingly a phase transition can be observed if the coupling strength exceeds a critical value. Above this value synchronization sets in and some of the oscillators oscillate with the same frequency despite their different natural frequencies. The transition is also called Kuramoto transition. Its behavior can be analyzed by employing the mean field of the phase - -['Z = K e[super i __Theta] = 1 / N __Sigma[subl k]e[super i __phi[subl k]]] - -The definition of the system function is now a bit more complex since we also need to store the individual frequencies of each oscillator. - -[phase_oscillator_ensemble_system_function] - -Note, that we have used ['Z] to simplify the equations of motion. Next, we create an observer which computes the value of ['Z] and we record ['Z] for different values of ['__epsilon]. - -[phase_oscillator_ensemble_observer] - -Now, we do several integrations for different values of ['__epsilon] and record ['Z]. The result nicely confirms the analytical result of the phase transition, i.e. in our example the standard deviation of the Lorentzian is 1 such that the transition will be observed at ['__epsilon = 2]. - -[phase_oscillator_ensemble_integration] - -The full cpp file for this example can be found here [github_link examples/phase_oscillator_ensemble.cpp phase_oscillator_ensemble.cpp] - -[endsect] - -[section Using boost::units] - -[import ../examples/harmonic_oscillator_units.cpp] - -odeint also works well with __boost_units - a library for compile time unit -and dimension analysis. It works by decoding unit information into the types -of values. For a one-dimensional unit you can just use the Boost.Unit types as -state type, deriv type and time type and hand the `vector_space_algebra` to -the stepper definition and everything works just fine: - -``` -typedef units::quantity< si::time , double > time_type; -typedef units::quantity< si::length , double > length_type; -typedef units::quantity< si::velocity , double > velocity_type; - -typedef runge_kutta4< length_type , double , velocity_type , time_type , - vector_space_algebra > stepper_type; -``` - -If you want to solve more-dimensional problems the individual entries -typically have different units. That means that the `state_type` is now -possibly heterogeneous, meaning that every entry might have a different type. -To solve this problem, compile-time sequences from __boost_fusion can be used. - -To illustrate how odeint works with __boost_units we use the harmonic oscillator as primary example. We start with defining all quantities - -[units_define_basic_quantities] - -Note, that the `state_type` and the `deriv_type` are now a compile-time fusion -sequences. `deriv_type` represents ['x'] and is now different from the state -type as it has different unit definitions. Next, we define the ordinary -differential equation which is completely equivalent to the example in __tut_harmonic_oscillator: - -[units_define_ode] - -Next, we instantiate an appropriate stepper. We must explicitly parametrize -the stepper with the `state_type`, `deriv_type`, `time_type`. - -[units_define_stepper] - -[note When using compile-time sequences, the iteration over vector elements is -done by the `fusion_algebra`, which is automatically chosen by odeint. For -more on the state types / algebras see chapter __adapt_state_types.] - -It is quite easy but the compilation time might take very long. Furthermore, the observer is defined a bit different - -[units_observer] - -[caution Using __boost_units works nicely but compilation can be very time and -memory consuming. For example the unit test for the usage of __boost_units in odeint take up to 4 GB -of memory at compilation.] - -The full cpp file for this example can be found here [github_link examples/harmonic_oscillator_units.cpp harmonic_oscillator_units.cpp]. - -[endsect] - -[section Using matrices as state types] - -[import ../examples/two_dimensional_phase_lattice.cpp] - -odeint works well with a variety of different state types. It is not restricted to pure vector-wise types, like `vector< double >`, `array< double , N >`, `fusion::vector< double , double >`, etc. but also works with types having a different topology then simple vectors. Here, we show how odeint can be used with matrices as states type, in the next section we will show how can be used to solve ODEs defined on complex networks. - -By default, odeint can be used with `ublas::matrix< T >` as state type for matrices. A simple example is a two-dimensional lattice of coupled phase oscillators. Other matrix types like `mtl::dense_matrix` or blitz arrays and matrices can used as well but need some kind of activation in order to work with odeint. This activation is described in following sections, - -The definition of the system is - -[two_dimensional_phase_lattice_definition] - -In principle this is all. Please note, that the above code is far from being optimal. Better performance can be achieved if every interaction is only calculated once and iterators for columns and rows are used. Below are some visualizations of the evolution of this lattice equation. - -[$phase_lattice_2d_0000.jpg] [$phase_lattice_2d_0100.jpg] [$phase_lattice_2d_1000.jpg] - -The full cpp for this example can be found here [github_link examples/two_dimensional_phase_lattice.cpp two_dimensional_phase_lattice.cpp]. - -[endsect] - -[/ -[section Partial differential equations] -To be continued: -*Wave equation -*KdV -*Ginzburg-Landau -[endsect] -[section Ordinary differential equations on networks] -to be continued -[endsect] -] - -[section Using arbitrary precision floating point types] - -[import ../examples/multiprecision/lorenz_mp.cpp] - -Sometimes one needs results with higher precision than provided by the -standard floating point types. -As odeint allows to configure the fundamental numerical type, it is well -suited to be run with arbitrary precision types. -Therefore, one only needs a library that provides a type representing values -with arbitrary precision and the fundamental operations for those values. -__boost_multiprecision is a boost library that does exactly this. -Making use of __boost_multiprecision to solve odes with odeint is very simple, -as the following example shows. - -Here we use `cpp_dec_float_50` as the fundamental value type, which ensures -exact computations up to 50 decimal digits. - - -[mp_lorenz_defs] - -As exemplary ODE again the lorenz system is chosen, but here we have to make -sure all constants are initialized as high precision values. - -[mp_lorenz_rhs] - -The actual integration then is straight forward: - -[mp_lorenz_int] - -The full example can be found at [github_link examples/multiprecision/lorenz_mp.cpp lorenz_mp.cpp]. -Another example that compares the accuracy of the high precision type with -standard double can be found at [github_link examples/multiprecision/cmp_precision.cpp cmp_precision.cpp]. - -Furthermore, odeint can also be run with other multiprecision libraries, -e.g. [@http://gmplib.org/ gmp]. -An example for this is given in [github_link examples/gmpxx/lorenz_gmpxx.cpp lorenz_gmpxx.cpp]. - -[endsect] - -[section Self expanding lattices] - -[import ../examples/resizing_lattice.cpp] - -odeint supports changes of the state size during integration if a state_type -is used which can be resized, like `std::vector`. -The adjustment of the state's size has to be done from outside and the stepper -has to be instantiated with `always_resizer` as the template argument for the -`resizer_type`. -In this configuration, the stepper checks for changes in the state size and -adjust it's internal storage accordingly. - -We show this for a Hamiltonian system of nonlinear, disordered oscillators with nonlinear nearest neighbor coupling. - -The system function is implemented in terms of a class that also provides functions for calculating the energy. -Note, that this class stores the random potential internally which is not resized, but rather a start index is kept which should be changed whenever the states' size change. - -[resizing_lattice_system_class] - -The total size we allow is 1024 and we start with an initial state size of 60. - -[resizing_lattice_initialize] - -The lattice gets resized whenever the energy distribution comes close to the borders `distr[10] > 1E-150`, `distr[distr.size()-10] > 1E-150`. -If we increase to the left, `q` and `p` have to be rotated because their resize function always appends at the end. -Additionally, the start index of the potential changes in this case. - -[resizing_lattice_steps_loop] - -The `do_resize` function simply calls `vector.resize` of `q` , `p` and `distr`. - -[resizing_lattice_resize_function] - -The full example can be found in [github_link examples/resizing_lattice.cpp resizing_lattice.cpp] - -[endsect] - -[/ [endsect] /] diff --git a/libs/numeric/odeint/doc/tutorial_stiff_systems.qbk b/libs/numeric/odeint/doc/tutorial_stiff_systems.qbk deleted file mode 100644 index 6e28257a1..000000000 --- a/libs/numeric/odeint/doc/tutorial_stiff_systems.qbk +++ /dev/null @@ -1,62 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2013 Karsten Ahnert - Copyright 2011-2012 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - - - -[section Stiff systems] - -[import ../examples/stiff_system.cpp] - -An important class of ordinary differential equations are so called stiff -system which are characterized by two or more time scales of different -order. Examples of such systems are found in chemical systems where reaction -rates of individual sub-reaction might differ over large ranges, for example: - -['d S[subl 1] / dt = - 101 S[subl 2] - 100 S[subl 1]] - -['d S[subl 2] / dt = S[subl 1]] - - -In order to efficiently solve stiff systems numerically the Jacobian - -['J = d f[subl i] / d x[subl j]] - -is needed. Here is the definition of the above example - -[stiff_system_definition] - -The state type has to be a `ublas::vector` and the matrix type must by a -`ublas::matrix` since the stiff integrator only accepts these types. -However, you might want use non-stiff integrators on this system, too - we will -do so later for demonstration. Therefore we want to use the same function also -with other state_types, realized by templatizing the `operator()`: - -[stiff_system_alternative_definition] - -Now you can use `stiff_system` in combination with `std::vector` or -`boost::array`. In the example the explicit time derivative of ['f(x,t)] is -introduced separately in the Jacobian. If ['df / dt = 0] simply fill `dfdt` with zeros. - -A well know solver for stiff systems is the Rosenbrock method. It has a step size control and dense output facilities and can be used like all the other steppers: - -[integrate_stiff_system] - -During the integration 71 steps have been done. Comparing to a classical Runge-Kutta solver this is a very good result. For example the Dormand-Prince 5 method with step size control and dense output yields 1531 steps. - -[integrate_stiff_system_alternative] - -Note, that we have used __boost_phoenix, a great functional programming library, to create and compose the observer. - -The full example can be found here: [github_link examples/stiff_system.cpp stiff_system.cpp] - - -[endsect] diff --git a/libs/numeric/odeint/doc/tutorial_thrust_cuda.qbk b/libs/numeric/odeint/doc/tutorial_thrust_cuda.qbk deleted file mode 100644 index 4ad6aa057..000000000 --- a/libs/numeric/odeint/doc/tutorial_thrust_cuda.qbk +++ /dev/null @@ -1,172 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2011-2013 Karsten Ahnert - Copyright 2011-2013 Mario Mulansky - Copyright 2012 Sylwester Arabas - - 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) -=============================================================================/] - - -[section Using CUDA (or OpenMP, TBB, ...) via Thrust] - -Modern graphic cards (graphic processing units - GPUs) can be used to speed up -the performance of time consuming algorithms by means of massive -parallelization. They are designed to execute many operations in -parallel. odeint can utilize the power of GPUs by means of CUDA and __thrust, -which is a STL-like interface for the native CUDA API. - -[important Thrust also supports parallelization using OpenMP and Intel Threading Building Blocks (TBB). You can switch -between CUDA, OpenMP and TBB parallelizations by a simple compiler -switch. Hence, this also provides an easy way to get basic OpenMP -parallelization into odeint. The examples discussed below are focused on GPU parallelization, though. ] - -To use odeint with CUDA a few points have to be taken into account. First of all, the problem has to be well chosen. It makes absolutely no sense to try to parallelize the code for a three dimensional system, it is simply too small and not worth the effort. One single function call (kernel execution) on the GPU is slow but you can do the operation on a huge set of data with only one call. We have experienced that the vector size over which is parallelized should be of the order of ['10[super 6]] to make full use of the GPU. Secondly, you have to use __thrust's algorithms and functors when implementing the rhs the ODE. This might be tricky since it involves some kind of functional programming knowledge. - -Typical applications for CUDA and odeint are large systems, like lattices or discretizations of PDE, and parameter studies. We introduce now three examples which show how the power of GPUs can be used in combination with odeint. - -[important The full power of CUDA is only available for really large systems where the number of coupled ordinary differential equations is of order ['N=10[super 6]] or larger. For smaller systems the CPU is usually much faster. You can also integrate an ensemble of different uncoupled ODEs in parallel as shown in the last example.] - -[section Phase oscillator ensemble] - -[import ../examples/thrust/phase_oscillator_ensemble.cu] - -The first example is the phase oscillator ensemble from the previous -section: - -[' d__phi[subl k] / dt = __omega[subl k] + __epsilon / N __Sigma[subl j] sin( __phi[subl j] - __phi[subl k] ).] - -It has a phase transition at ['__epsilon = 2] in the limit of -infinite numbers of oscillators ['N]. In the case of finite ['N] this -transition is smeared out but still clearly visible. - -__thrust and CUDA are perfectly suited for such kinds of problems where one needs a large number of particles (oscillators). We start by defining the state type which is a `thrust::device_vector`. The content of this vector lives on the GPU. If you are not familiar with this we recommend reading the ['Getting started] section on the __thrust website. - -[thrust_phase_ensemble_state_type] - -Thrust follows a functional programming approach. If you want to perform a calculation on the GPU you usually have to call a global function like `thrust::for_each`, `thrust::reduce`, ... with an appropriate local functor which performs the basic operation. An example is -`` -struct add_two -{ - template< class T > - __host__ __device__ - void operator()( T &t ) const - { - t += T( 2 ); - } -}; - -// ... - -thrust::for_each( x.begin() , x.end() , add_two() ); -`` -This code generically adds two to every element in the container `x`. - -For the purpose of integrating the phase oscillator ensemble we need - -* to calculate the system function, hence the r.h.s. of the ODE. -* this involves computing the mean field of the oscillator example, i.e. the values of ['R] and ['__theta] - -The mean field is calculated in a class `mean_field_calculator` - -[thrust_phase_ensemble_mean_field_calculator] - -Inside this class two member structures `sin_functor` and `cos_functor` are defined. They compute the sine and the cosine of a value and they are used within a transform iterator to calculate the sum of ['sin(__phi[subl k])] and ['cos(__phi[subl k])]. The classifiers `__host__` and `__device__` are CUDA specific and define a function or operator which can be executed on the GPU as well as on the CPU. The line - -[thrust_phase_ensemble_sin_sum] - -performs the calculation of this sine-sum on the GPU (or on the CPU, depending on your thrust configuration). - -The system function is defined via - -[thrust_phase_ensemble_sys_function] - -This class is used within the `do_step` and `integrate` method. It defines a member structure `sys_functor` for the r.h.s. of each individual oscillator and the `operator()` for the use in the steppers and integrators of odeint. The functor computes first the mean field of ['__phi[subl k]] and secondly calculates the whole r.h.s. of the ODE using this mean field. Note, how nicely `thrust::tuple` and `thrust::zip_iterator` play together. - -Now we are ready to put everything together. All we have to do for making -odeint ready for using the GPU is to parametrize the stepper with the `state_type` -and `value_type`: - -[thrust_phase_ensemble_define_rk4] - -[note We have specifically define four template parameters because we have to -override the default parameter value `double` with `value_type` to ensure our -programs runs properly if we use `float` as fundamental data type.] - -You can also use a controlled or dense output stepper, e.g. - -[thrust_phase_ensemble_define_dopri5] - -Then, it is straightforward to integrate the phase ensemble by creating an instance of the rhs class and using an integration function: - -[thrust_phase_ensemble_system_instance] -[thrust_phase_ensemble_integration] - -We have to use `boost::ref` here in order to pass the rhs class as reference and not by value. This ensures that the natural frequencies of each oscillator are not copied when calling `integrate_const`. In the full example the performance and results of the Runge-Kutta-4 and the Dopri5 solver are compared. - -The full example can be found at [github_link examples/thrust/phase_oscillator_ensemble.cu phase_oscillator_example.cu]. - -[endsect] - -[section Large oscillator chains] - -[import ../examples/thrust/phase_oscillator_chain.cu] - -The next example is a large, one-dimensional chain of nearest-neighbor coupled phase oscillators with the following equations of motion: - -['d __phi[subl k] / dt = __omega[subl k] + sin( __phi[subl k+1] - __phi[subl k] ) + sin( __phi[subl k] - __phi[subl k-1])] - -In principle we can use all the techniques from the previous phase oscillator ensemble example, but we have to take special care about the coupling of the oscillators. To efficiently implement the coupling you can use a very elegant way employing Thrust's permutation iterator. A permutation iterator behaves like a normal iterator on a vector but it does not iterate along the usual order of the elements. -It rather iterates along some permutation of the elements defined by some index map. To realize the nearest neighbor coupling we create one permutation iterator which travels one step behind a usual iterator and another permutation iterator which travels one step in front. The full system class is: - -[thrust_phase_chain_system] - -Note, how easy you can obtain the value for the left and right neighboring oscillator in the system functor using the permutation iterators. But, the call of the `thrust::for_each` function looks relatively complicated. Every term of the r.h.s. of the ODE is resembled by one iterator packed in exactly the same way as it is unpacked in the functor above. - -Now we put everything together. We create random initial conditions and decreasing frequencies such that we should get synchronization. We copy the frequencies and the initial conditions onto the device and finally initialize and perform the integration. As result we simply write out the current state, hence the phase of each oscillator. - -[thrust_phase_chain_integration] - -The full example can be found at [github_link examples/thrust/phase_oscillator_chain.cu phase_oscillator_chain.cu]. - -[endsect] - -[section Parameter studies] - -[import ../examples/thrust/lorenz_parameters.cu] - -Another important use case for __thrust and CUDA are parameter studies of relatively small systems. Consider for example the three-dimensional Lorenz system from the chaotic systems example in the previous section which has three parameters. If you want to study the behavior of this system for different parameters you usually have to integrate the system for many parameter values. Using thrust and odeint you can do this integration in parallel, hence you integrate a whole ensemble of Lorenz systems where each individual realization has a different parameter value. -[/ The Lorenz system is dissipative, such that you can assume that different initial conditions will lead to the same attractor so . For Hamiltonian systems this is not the case. Here it might be interesting to study a range of initial conditions to quantify different regions in the phase space.] - -In the following we will show how you can use __thrust to integrate the above mentioned ensemble of Lorenz systems. We will vary only the parameter ['__beta] but it is straightforward to vary other parameters or even two or all three parameters. Furthermore, we will use the largest Lyapunov exponent to quantify the behavior of the system (chaoticity). - -We start by defining the range of the parameters we want to study. The state_type is again a `thrust::device_vector< value_type >`. - -[thrust_lorenz_parameters_define_beta] - -The next thing we have to implement is the Lorenz system without perturbations. Later, a system with perturbations is also implemented in order to calculate the Lyapunov exponent. We will use an ansatz where each device function calculates one particular realization of the Lorenz ensemble - -[thrust_lorenz_parameters_define_simple_system] - -As `state_type` a `thrust::device_vector` or a __boost_range of a `device_vector` is used. The length of the state is ['3N] where ['N] is the number of systems. The system is encoded into this vector such that all ['x] components come first, then every ['y] components and finally every ['z] components. Implementing the device function is then a simple task, you only have to decompose the tuple originating from the zip iterators. - -Besides the system without perturbations we furthermore need to calculate the system including linearized equations governing the time evolution of small perturbations. Using the method from above this is straightforward, with a small difficulty that Thrust's tuples have a maximal arity of 10. But this is only a small problem since we can create a zip iterator packed with zip iterators. So the top level zip iterator contains one zip iterator for the state, one normal iterator for the parameter, and one zip iterator for the derivative. Accessing the elements of this tuple in the system function is then straightforward, you unpack the tuple with `thrust::get<>()`. We will not show the code here, it is to large. It can be found [github_link examples/thrust/lorenz_parameters.cu here] and is easy to understand. - -Furthermore, we need an observer which determines the norm of the perturbations, normalizes them and averages the logarithm of the norm. The device functor which is used within this observer is defined - -[thrust_lorenz_parameters_observer_functor] - -Note, that this functor manipulates the state, i.e. the perturbations. - -Now we complete the whole code to calculate the Lyapunov exponents. First, we have to define a state vector. This vector contains ['6N] entries, the state ['x,y,z] and its perturbations ['dx,dy,dz]. We initialize them such that ['x=y=z=10], ['dx=1], and ['dy=dz=0]. We define a stepper type, a controlled Runge-Kutta Dormand-Prince 5 stepper. We start with some integration to overcome the transient behavior. For this, we do not involve the perturbation and run the algorithm only on the state ['x,y,z] without any observer. Note, how __boost_range is used for partial integration of the state vector without perturbations (the first half of the whole state). After the transient, the full system with perturbations is integrated and the Lyapunov exponents are calculated and written to `stdout`. - -[thrust_lorenz_parameters_integration] - -The full example can be found at [github_link examples/thrust/lorenz_parameters.cu lorenz_parameters.cu]. - -[endsect] - -[endsect] diff --git a/libs/numeric/odeint/doc/tutorial_vexcl_opencl.qbk b/libs/numeric/odeint/doc/tutorial_vexcl_opencl.qbk deleted file mode 100644 index 8e69a77c0..000000000 --- a/libs/numeric/odeint/doc/tutorial_vexcl_opencl.qbk +++ /dev/null @@ -1,53 +0,0 @@ -[/============================================================================ - Boost.odeint - - Copyright 2012 Karsten Ahnert - Copyright 2012 Sylwester Arabas - Copyright 2012-2013 Mario Mulansky - - 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) -=============================================================================/] - - -[section Using OpenCL via VexCL] - -[import ../examples/vexcl/lorenz_ensemble.cpp] - -In the previous section the usage of odeint in combination with __thrust was shown. In this section we show how one can use OpenCL with odeint. The point of odeint is not to implement its own low-level data structures and algorithms, but to use high level libraries doing this task. Here, we will use the __vexcl framework to use OpenCL. __vexcl is a nice library for general computations and it uses heavily expression templates. With the help of __vexcl it is possible to write very compact and expressive application. - -[note vexcl needs C++11 features! So you have to compile with C++11 support enabled.] - -To use __vexcl one needs to include one additional header which includes the data-types and algorithms from vexcl and the adaption to odeint. Adaption to odeint means here only to adapt the resizing functionality of __vexcl to odeint. - -[vexcl_includes] - -To demonstrate the use of __vexcl we integrate an ensemble of Lorenz system. The example is very similar to the parameter study of the Lorenz system in the previous section except that we do not compute the Lyapunov exponents. Again, we vary the parameter R of the Lorenz system an solve a whole ensemble of Lorenz systems in parallel (each with a different parameter R). First, we define the state type and a vector type - -[vexcl_state_types ] - -The `vector_type` is used to represent the parameter R. The `state_type` is a multi-vector of three sub vectors and is used to represent. The first component of this multi-vector represent all `x` components of the Lorenz system, while the second all `y` components and the third all `z` components. The components of this vector can be obtained via - -`` -auto &x = X(0); -auto &y = X(1); -auto &z = X(2); -`` - -As already mentioned __vexcl supports expression templates and we will use them to implement the system function for the Lorenz ensemble: - -[vexcl_system] - -It's very easy, isn't it? These three little lines do all the computations for -you. There is no need to write your own OpenCL kernels. __vexcl does -everything for you. Next we have to write the main application. We initialize -the vector of parameters (R) and the initial state. Note that __vexcl requires -the `vector_space_algebra`, but that is automatically deduced and configured -by odeint internally, so we only have to specify the `state_type` when -instantiating the stepper and we are done: - -[vexcl_main] - - -[endsect] diff --git a/libs/numeric/odeint/examples/2d_lattice/Jamfile.v2 b/libs/numeric/odeint/examples/2d_lattice/Jamfile.v2 deleted file mode 100644 index c995ec168..000000000 --- a/libs/numeric/odeint/examples/2d_lattice/Jamfile.v2 +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2011 Mario Mulansky -# Copyright 2012 Karsten Ahnert -# Distributed under the Boost Software License, Version 1.0. (See -# accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - -project - : requirements - ../../../../.. - BOOST_ALL_NO_LIB=1 - ; - -exe spreading : spreading.cpp ; \ No newline at end of file diff --git a/libs/numeric/odeint/examples/2d_lattice/lattice2d.hpp b/libs/numeric/odeint/examples/2d_lattice/lattice2d.hpp deleted file mode 100644 index 4fd9c985e..000000000 --- a/libs/numeric/odeint/examples/2d_lattice/lattice2d.hpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - Copyright 2011 Mario Mulansky - Copyright 2012-2013 Karsten Ahnert - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or - copy at http://www.boost.org/LICENSE_1_0.txt) - */ - - -/* strongly nonlinear hamiltonian lattice in 2d */ - -#ifndef LATTICE2D_HPP -#define LATTICE2D_HPP - -#include - -#include - -using boost::math::pow; - -template< int Kappa , int Lambda > -struct lattice2d { - - const double m_beta; - std::vector< std::vector< double > > m_omega; - - lattice2d( const double beta ) - : m_beta( beta ) - { } - - template< class StateIn , class StateOut > - void operator()( const StateIn &q , StateOut &dpdt ) - { - // q and dpdt are 2d - const int N = q.size(); - - int i; - for( i = 0 ; i < N ; ++i ) - { - const int i_l = (i-1+N) % N; - const int i_r = (i+1) % N; - for( int j = 0 ; j < N ; ++j ) - { - const int j_l = (j-1+N) % N; - const int j_r = (j+1) % N; - dpdt[i][j] = - m_omega[i][j] * pow( q[i][j] ) - - m_beta * pow( q[i][j] - q[i][j_l] ) - - m_beta * pow( q[i][j] - q[i][j_r] ) - - m_beta * pow( q[i][j] - q[i_l][j] ) - - m_beta * pow( q[i][j] - q[i_r][j] ); - } - } - } - - template< class StateIn > - double energy( const StateIn &q , const StateIn &p ) - { - // q and dpdt are 2d - const int N = q.size(); - double energy = 0.0; - int i; - for( i = 0 ; i < N ; ++i ) - { - const int i_l = (i-1+N) % N; - const int i_r = (i+1) % N; - for( int j = 0 ; j < N ; ++j ) - { - const int j_l = (j-1+N) % N; - const int j_r = (j+1) % N; - energy += p[i][j]*p[i][j] / 2.0 - + m_omega[i][j] * pow( q[i][j] ) / Kappa - + m_beta * pow( q[i][j] - q[i][j_l] ) / Lambda / 2 - + m_beta * pow( q[i][j] - q[i][j_r] ) / Lambda / 2 - + m_beta * pow( q[i][j] - q[i_l][j] ) / Lambda / 2 - + m_beta * pow( q[i][j] - q[i_r][j] ) / Lambda / 2; - } - } - return energy; - } - - - template< class StateIn , class StateOut > - double local_energy( const StateIn &q , const StateIn &p , StateOut &energy ) - { - // q and dpdt are 2d - const int N = q.size(); - double e = 0.0; - int i; - for( i = 0 ; i < N ; ++i ) - { - const int i_l = (i-1+N) % N; - const int i_r = (i+1) % N; - for( int j = 0 ; j < N ; ++j ) - { - const int j_l = (j-1+N) % N; - const int j_r = (j+1) % N; - energy[i][j] = p[i][j]*p[i][j] / 2.0 - + m_omega[i][j] * pow( q[i][j] ) / Kappa - + m_beta * pow( q[i][j] - q[i][j_l] ) / Lambda / 2 - + m_beta * pow( q[i][j] - q[i][j_r] ) / Lambda / 2 - + m_beta * pow( q[i][j] - q[i_l][j] ) / Lambda / 2 - + m_beta * pow( q[i][j] - q[i_r][j] ) / Lambda / 2; - e += energy[i][j]; - } - } - //rescale - e = 1.0/e; - for( i = 0 ; i < N ; ++i ) - for( int j = 0 ; j < N ; ++j ) - energy[i][j] *= e; - return 1.0/e; - } - - void load_pot( const char* filename , const double W , const double gap , - const size_t dim ) - { - std::ifstream in( filename , std::ios::in | std::ios::binary ); - if( !in.is_open() ) { - std::cerr << "pot file not found: " << filename << std::endl; - exit(0); - } else { - std::cout << "using pot file: " << filename << std::endl; - } - - m_omega.resize( dim ); - for( int i = 0 ; i < dim ; ++i ) - { - m_omega[i].resize( dim ); - for( size_t j = 0 ; j < dim ; ++j ) - { - if( !in.good() ) - { - std::cerr << "I/O Error: " << filename << std::endl; - exit(0); - } - double d; - in.read( (char*) &d , sizeof(d) ); - if( (d < 0) || (d > 1.0) ) - { - std::cerr << "ERROR: " << d << std::endl; - exit(0); - } - m_omega[i][j] = W*d + gap; - } - } - - } - - void generate_pot( const double W , const double gap , const size_t dim ) - { - m_omega.resize( dim ); - for( size_t i = 0 ; i < dim ; ++i ) - { - m_omega[i].resize( dim ); - for( size_t j = 0 ; j < dim ; ++j ) - { - m_omega[i][j] = W*static_cast(rand())/RAND_MAX + gap; - } - } - } - -}; - -#endif diff --git a/libs/numeric/odeint/examples/2d_lattice/nested_range_algebra.hpp b/libs/numeric/odeint/examples/2d_lattice/nested_range_algebra.hpp deleted file mode 100644 index 0afa367fd..000000000 --- a/libs/numeric/odeint/examples/2d_lattice/nested_range_algebra.hpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - Copyright 2011 Mario Mulansky - Copyright 2012 Karsten Ahnert - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or - copy at http://www.boost.org/LICENSE_1_0.txt) - */ - - -/* nested range algebra */ - -#ifndef NESTED_RANGE_ALGEBRA -#define NESTED_RANGE_ALGEBRA - -namespace detail { - - template< class Iterator1 , class Iterator2 , class Iterator3 , class Operation , class Algebra > - void for_each3( Iterator1 first1 , Iterator1 last1 , Iterator2 first2 , Iterator3 first3, Operation op , Algebra &algebra ) -{ - for( ; first1 != last1 ; ) - algebra.for_each3( *first1++ , *first2++ , *first3++ , op ); -} -} - - -template< class InnerAlgebra > -struct nested_range_algebra -{ - - nested_range_algebra() - : m_inner_algebra() - { } - - template< class S1 , class S2 , class S3 , class Op > - void for_each3( S1 &s1 , S2 &s2 , S3 &s3 , Op op ) - { - detail::for_each3( boost::begin( s1 ) , boost::end( s1 ) , boost::begin( s2 ) , boost::begin( s3 ) , op , m_inner_algebra ); - } - - -private: - InnerAlgebra m_inner_algebra; -}; - -#endif diff --git a/libs/numeric/odeint/examples/2d_lattice/spreading.cpp b/libs/numeric/odeint/examples/2d_lattice/spreading.cpp deleted file mode 100644 index 88c60bf72..000000000 --- a/libs/numeric/odeint/examples/2d_lattice/spreading.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - Copyright 2011 Mario Mulansky - Copyright 2012 Karsten Ahnert - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or - copy at http://www.boost.org/LICENSE_1_0.txt) - */ - - -/* - * Example of a 2D simulation of nonlinearly coupled oscillators. - * Program just prints final energy which should be close to the initial energy (1.0). - * No parallelization is employed here. - * Run time on a 2.3GHz Intel Core-i5: about 10 seconds for 100 steps. - * Compile simply via bjam or directly: - * g++ -O3 -I${BOOST_ROOT} -I../../../../.. spreading.cpp - */ - - -#include -#include -#include -#include -#include - -#include -#include - -// we use a vector< vector< double > > as state type, -// for that some functionality has to be added for odeint to work -#include "nested_range_algebra.hpp" -#include "vector_vector_resize.hpp" - -// defines the rhs of our dynamical equation -#include "lattice2d.hpp" -/* dynamical equations (Hamiltonian structure): -dqdt_{i,j} = p_{i,j} -dpdt_{i,j} = - omega_{i,j}*q_{i,j} - \beta*[ (q_{i,j} - q_{i,j-1})^3 - +(q_{i,j} - q_{i,j+1})^3 - +(q_{i,j} - q_{i-1,j})^3 - +(q_{i,j} - q_{i+1,j})^3 ] -*/ - - -using namespace std; - -static const int MAX_N = 1024;//2048; - -static const size_t KAPPA = 2; -static const size_t LAMBDA = 4; -static const double W = 1.0; -static const double gap = 0.0; -static const size_t steps = 100; -static const double dt = 0.1; - -double initial_e = 1.0; -double beta = 1.0; -int realization_index = 0; - -//the state type -typedef vector< vector< double > > state_type; - -//the stepper, choose a symplectic one to account for hamiltonian structure -//use nested_range_algebra for calculations on vector< vector< ... > > -typedef boost::numeric::odeint::symplectic_rkn_sb3a_mclachlan< - state_type , state_type , double , state_type , state_type , double , - nested_range_algebra< boost::numeric::odeint::range_algebra > , - boost::numeric::odeint::default_operations > stepper_type; - -double time_diff_in_ms( timeval &t1 , timeval &t2 ) -{ return (t2.tv_sec - t1.tv_sec)*1000.0 + (t2.tv_usec - t1.tv_usec)/1000.0 + 0.5; } - - -int main( int argc, const char* argv[] ) { - - srand( time(NULL) ); - - lattice2d< KAPPA , LAMBDA > lattice( beta ); - - - lattice.generate_pot( W , gap , MAX_N ); - - state_type q( MAX_N , vector< double >( MAX_N , 0.0 ) ); - - state_type p( q ); - - state_type energy( q ); - - p[MAX_N/2][MAX_N/2] = sqrt( 0.5*initial_e ); - p[MAX_N/2+1][MAX_N/2] = sqrt( 0.5*initial_e ); - p[MAX_N/2][MAX_N/2+1] = sqrt( 0.5*initial_e ); - p[MAX_N/2+1][MAX_N/2+1] = sqrt( 0.5*initial_e ); - - cout.precision(10); - - lattice.local_energy( q , p , energy ); - double e=0.0; - for( size_t i=0 ; i - -#include - -namespace boost { namespace numeric { namespace odeint { - -template<> -struct is_resizeable< std::vector< std::vector< double > > > -{ - typedef boost::true_type type; - const static bool value = type::value; -}; - -template<> -struct same_size_impl< std::vector< std::vector< double > > , std::vector< std::vector< double > > > -{ - typedef std::vector< std::vector< double > > state_type; - - static bool same_size( const state_type &x1 , - const state_type &x2 ) - { - bool same = ( boost::size( x1 ) == boost::size( x2 ) ); - if( !same ) - return false; - typename state_type::const_iterator begin1 = boost::begin( x1 ); - typename state_type::const_iterator begin2 = boost::begin( x2 ); - while( begin1 != boost::end( x1 ) ) - same &= ( boost::size( *begin1++ ) == boost::size( *begin2++ ) ); - return same; - } -}; - -template<> -struct resize_impl< std::vector< std::vector< double > > , std::vector< std::vector< double > > > -{ - typedef std::vector< std::vector< double > > state_type; - - static void resize( state_type &x1 , const state_type &x2 ) - { - x1.resize( boost::size( x2 ) ); - typename state_type::iterator begin1 = boost::begin( x1 ); - typename state_type::const_iterator begin2 = boost::begin( x2 ); - while( begin1 != boost::end( x1 ) ) - (*begin1++).resize( boost::size( *begin2++ ) ); - } -}; - -template<> -struct state_wrapper< std::vector< std::vector< double > > > -{ - typedef std::vector< std::vector< double > > state_type; - typedef state_wrapper< state_type > state_wrapper_type; - typedef boost::true_type is_resizeable; - - state_type m_v; - - template< class State > - bool same_size( const State &x ) - { - bool same = ( boost::size( m_v ) == boost::size( x ) ); - if( !same ) - return false; - typename state_type::iterator begin1 = boost::begin( m_v ); - typename State::const_iterator begin2 = boost::begin( x ); - while( begin1 != boost::end( m_v ) ) - same &= ( boost::size( *begin1++ ) == boost::size( *begin2++ ) ); - return same; - } - - template< class State > - bool resize( const State &x ) - { - if( !same_size( x ) ) - { - m_v.resize( boost::size( x ) ); - typename state_type::iterator begin1 = boost::begin( m_v ); - typename State::const_iterator begin2 = boost::begin( x ); - while( begin1 != boost::end( m_v ) ) - (*begin1++).resize( boost::size( *begin2++ ) ); - - return true; - } else - return false; - } - -}; - -} } } - -#endif diff --git a/libs/numeric/odeint/examples/Jamfile.v2 b/libs/numeric/odeint/examples/Jamfile.v2 deleted file mode 100644 index 11813c847..000000000 --- a/libs/numeric/odeint/examples/Jamfile.v2 +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2009-2013 Karsten Ahnert -# Copyright 2010-2013 Mario Mulansky -# Copyright 2013 Pascal Germroth -# Distributed under the Boost Software License, Version 1.0. (See -# accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - - -project - : requirements - BOOST_ALL_NO_LIB=1 - : - ; - - -exe harmonic_oscillator : harmonic_oscillator.cpp ; -exe solar_system : solar_system.cpp ; -exe chaotic_system : chaotic_system.cpp ; -exe stiff_system : stiff_system.cpp ; -exe fpu : fpu.cpp ; -exe phase_oscillator_ensemble : phase_oscillator_ensemble.cpp ; -exe harmonic_oscillator_units : harmonic_oscillator_units.cpp : clang:no ; -exe stuart_landau : stuart_landau.cpp ; -exe two_dimensional_phase_lattice : two_dimensional_phase_lattice.cpp ; -exe bulirsch_stoer : bulirsch_stoer.cpp ; -exe elliptic_functions : elliptic_functions.cpp ; -exe resizing_lattice : resizing_lattice.cpp ; -exe list_lattice : list_lattice.cpp ; -exe stepper_details : stepper_details.cpp ; -exe my_vector : my_vector.cpp ; -exe lorenz : lorenz.cpp ; -exe lorenz_point : lorenz_point.cpp ; -exe van_der_pol_stiff : van_der_pol_stiff.cpp ; -exe simple1d : simple1d.cpp ; -exe stochastic_euler : stochastic_euler.cpp ; -exe generation_functions : generation_functions.cpp ; -exe heun : heun.cpp ; -exe bind_member_functions : bind_member_functions.cpp ; -exe bind_member_functions_cpp11 : bind_member_functions_cpp11.cpp : -std=c++0x ; -exe molecular_dynamics : molecular_dynamics.cpp : -std=c++0x ; -exe molecular_dynamics_cells : molecular_dynamics_cells.cpp : -std=c++0x ; -exe abm_precision : abm_precision.cpp ; -exe integrate_times : integrate_times.cpp ; -exe find_crossing : find_crossing.cpp : -std=c++0x ; - -build-project multiprecision ; -# build-project mtl ; -# build-project ublas ; -# build-project gmpxx ; -# build-project openmp ; -# build-project mpi ; diff --git a/libs/numeric/odeint/examples/abm_precision.cpp b/libs/numeric/odeint/examples/abm_precision.cpp deleted file mode 100644 index 747919f32..000000000 --- a/libs/numeric/odeint/examples/abm_precision.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* - * abm_precision.cpp - * - * example to check the order of the multi-step methods - * - * Copyright 2009-2013 Karsten Ahnert - * Copyright 2009-2013 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) - */ - -#include -#include - -#include -#include - -using namespace boost::numeric::odeint; - -const int Steps = 4; - -typedef double value_type; - -typedef boost::array< double , 2 > state_type; - -typedef runge_kutta_fehlberg78 initializing_stepper_type; -typedef adams_bashforth_moulton< Steps , state_type > stepper_type; -//typedef adams_bashforth< Steps , state_type > stepper_type; - -// harmonic oscillator, analytic solution x[0] = sin( t ) -struct osc -{ - void operator()( const state_type &x , state_type &dxdt , const double t ) const - { - dxdt[0] = x[1]; - dxdt[1] = -x[0]; - } -}; - -int main() -{ - stepper_type stepper; - initializing_stepper_type init_stepper; - const int o = stepper.order()+1; //order of the error is order of approximation + 1 - - const state_type x0 = {{ 0.0 , 1.0 }}; - state_type x1 = x0; - double t = 0.0; - double dt = 0.25; - // initialization, does a number of steps already to fill internal buffer, t is increased - // we use the rk78 as initializing stepper - stepper.initialize( boost::ref(init_stepper) , osc() , x1 , t , dt ); - // do a number of steps to fill the buffer with results from adams bashforth - for( size_t n=0 ; n < stepper.steps ; ++n ) - { - stepper.do_step( osc() , x1 , t , dt ); - t += dt; - } - double A = std::sqrt( x1[0]*x1[0] + x1[1]*x1[1] ); - double phi = std::asin(x1[0]/A) - t; - // now we do the actual step - stepper.do_step( osc() , x1 , t , dt ); - // only examine the error of the adams-bashforth-moulton step, not the initialization - const double f = 2.0 * std::abs( A*sin(t+dt+phi) - x1[0] ) / std::pow( dt , o ); // upper bound - - std::cout << "# " << o << " , " << f << std::endl; - - /* as long as we have errors above machine precision */ - while( f*std::pow( dt , o ) > 1E-16 ) - { - x1 = x0; - t = 0.0; - stepper.initialize( boost::ref(init_stepper) , osc() , x1 , t , dt ); - A = std::sqrt( x1[0]*x1[0] + x1[1]*x1[1] ); - phi = std::asin(x1[0]/A) - t; - // now we do the actual step - stepper.do_step( osc() , x1 , t , dt ); - // only examine the error of the adams-bashforth-moulton step, not the initialization - std::cout << dt << '\t' << std::abs( A*sin(t+dt+phi) - x1[0] ) << std::endl; - dt *= 0.5; - } -} diff --git a/libs/numeric/odeint/examples/adaptive_iterator.cpp b/libs/numeric/odeint/examples/adaptive_iterator.cpp deleted file mode 100644 index 343699de3..000000000 --- a/libs/numeric/odeint/examples/adaptive_iterator.cpp +++ /dev/null @@ -1,361 +0,0 @@ -/* - * adaptive_iterator.cpp - * - * Copyright 2012-2013 Karsten Ahnert - * Copyright 2012 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) - */ - - - -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#define tab "\t" - -using namespace std; -using namespace boost::numeric::odeint; - -const double sigma = 10.0; -const double R = 28.0; -const double b = 8.0 / 3.0; - -struct lorenz -{ - template< class State , class Deriv > - void operator()( const State &x , Deriv &dxdt , double t ) const - { - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; - } -}; - -#include - -int main( int argc , char **argv ) -{ - typedef boost::array< double , 3 > state_type; - - /* - * Controlled steppers with time iterator - */ - - // std::for_each - { - auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - std::for_each( make_adaptive_time_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - make_adaptive_time_iterator_end( stepper , lorenz() , x ) , - []( const std::pair< const state_type&, double > &x ) { - std::cout << x.second << tab << x.first[0] << tab << x.first[1] << tab << x.first[2] << "\n"; } ); - } - - // std::copy_if - { - std::vector< pair< state_type , double > > res; - auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - std::copy_if( make_adaptive_time_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - make_adaptive_time_iterator_end( stepper , lorenz() , x ) , - std::back_inserter( res ) , - []( const pair< const state_type& , double > &x ) { - return ( x.first[0] > 0.0 ) ? true : false; } ); - for( size_t i=0 ; i() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - double res = std::accumulate( make_adaptive_time_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - make_adaptive_time_iterator_end( stepper , lorenz() , x ) , - 0.0 , - []( double sum , const pair< const state_type& , double > &x ) { - return sum + x.first[0]; } ); - cout << res << endl; - } - - - // std::transform - { - auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - vector< double > weights; - std::transform( make_adaptive_time_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - make_adaptive_time_iterator_end( stepper , lorenz() , x ) , - back_inserter( weights ) , - []( const pair< const state_type& , double > &x ) { - return sqrt( x.first[0] * x.first[0] + x.first[1] * x.first[1] + x.first[2] * x.first[2] ); } ); - for( size_t i=0 ; i() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - boost::range::for_each( make_adaptive_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - []( const std::pair< const state_type& , double > &x ) { - std::cout << x.second << tab << x.first[0] << tab << x.first[1] << tab << x.first[2] << "\n"; } ); - } - - - // boost::range::copy with filtered adaptor (simulating std::copy_if) - { - auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() ); - std::vector< std::pair< state_type , double > > res; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - boost::range::copy( make_adaptive_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) | - boost::adaptors::filtered( [] ( const pair< const state_type& , double > &x ) { return ( x.first[0] > 0.0 ); } ) , - std::back_inserter( res ) ); - for( size_t i=0 ; i() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - double res = boost::accumulate( make_adaptive_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , 0.0 , - []( double sum , const pair< const state_type& , double > &x ) { - return sum + x.first[0]; } ); - cout << res << endl; - //] - } - - - // boost::range::transform - { - auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - vector< double > weights; - boost::transform( make_adaptive_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , back_inserter( weights ) , - []( const pair< const state_type& , double > &x ) { - return sqrt( x.first[0] * x.first[0] + x.first[1] * x.first[1] + x.first[2] * x.first[2] ); } ); - for( size_t i=0 ; i() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - auto iter = boost::find_if( make_adaptive_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - []( const std::pair< const state_type & , double > &x ) { - return ( x.first[0] < 0.0 ); } ); - cout << iter->second << "\t" << iter->first[0] << "\t" << iter->first[1] << "\t" << iter->first[2] << "\n"; - } - - - - - - - - - - - - - // /* - // * Boost.Range versions for dense output steppers - // */ - - // // boost::range::for_each - // { - // runge_kutta_dopri5< state_type > stepper; - // state_type x = {{ 10.0 , 10.0 , 10.0 }}; - // boost::range::for_each( make_adaptive_range( make_dense_output( 1.0e-6 , 1.0e-6 , stepper ) , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - // []( const state_type &x ) { - // std::cout << x[0] << tab << x[1] << tab << x[2] << "\n"; } ); - // } - - - // // boost::range::for_each with time iterator - // { - // runge_kutta_dopri5< state_type > stepper; - // state_type x = {{ 10.0 , 10.0 , 10.0 }}; - // boost::range::for_each( make_adaptive_time_range( make_dense_output( 1.0e-6 , 1.0e-6 , stepper ) , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - // []( const std::pair< state_type& , double > &x ) { - // std::cout << x.second << tab << x.first[0] << tab << x.first[1] << tab << x.first[2] << "\n"; } ); - - // } - - - - - - /* - * Pure iterators for controlled stepper without time iterator - */ - - // std::for_each - { - auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - std::for_each( make_adaptive_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - make_adaptive_iterator_end( stepper , lorenz() , x ) , - []( const state_type& x ) { - std::cout << x[0] << tab << x[1] << tab << x[2] << "\n"; } ); - } - - // std::copy_if - { - std::vector< state_type > res; - auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - std::copy_if( make_adaptive_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - make_adaptive_iterator_end( stepper , lorenz() , x ) , - std::back_inserter( res ) , - []( const state_type& x ) { - return ( x[0] > 0.0 ) ? true : false; } ); - for( size_t i=0 ; i() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - double res = std::accumulate( make_adaptive_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - make_adaptive_iterator_end( stepper , lorenz() , x ) , - 0.0 , - []( double sum , const state_type& x ) { - return sum + x[0]; } ); - cout << res << endl; - } - - - // std::transform - { - auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - vector< double > weights; - std::transform( make_adaptive_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - make_adaptive_iterator_end( stepper , lorenz() , x ) , - back_inserter( weights ) , - []( const state_type& x ) { - return sqrt( x[0] * x[0] + x[1] * x[1] + x[2] * x[2] ); } ); - for( size_t i=0 ; i() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - boost::range::for_each( make_adaptive_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - []( const state_type &x ) { - std::cout << x[0] << tab << x[1] << tab << x[2] << "\n"; } ); - } - - - // boost::range::copy with filtered adaptor (simulating std::copy_if) - { - auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() ); - std::vector< state_type > res; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - boost::range::copy( make_adaptive_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) | - boost::adaptors::filtered( [] ( const state_type& x ) { return ( x[0] > 0.0 ); } ) , - std::back_inserter( res ) ); - for( size_t i=0 ; i() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - double res = boost::accumulate( make_adaptive_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , 0.0 , - []( double sum , const state_type& x ) { - return sum + x[0]; } ); - cout << res << endl; - //] - } - - - // boost::range::transform - { - auto stepper = make_controlled( 1.0e-6 , 1.0e-6 , runge_kutta_cash_karp54< state_type >() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - vector< double > weights; - boost::transform( make_adaptive_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , back_inserter( weights ) , - []( const state_type& x ) { - return sqrt( x[0] * x[0] + x[1] * x[1] + x[2] * x[2] ); } ); - for( size_t i=0 ; i() ); - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - auto iter = boost::find_if( make_adaptive_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - []( const state_type &x ) { - return ( x[0] < 0.0 ); } ); - cout << (*iter)[0] << "\t" << (*iter)[1] << "\t" << (*iter)[2] << "\n"; - } - - - - - - return 0; -} diff --git a/libs/numeric/odeint/examples/bind_member_functions.cpp b/libs/numeric/odeint/examples/bind_member_functions.cpp deleted file mode 100644 index 51f85e033..000000000 --- a/libs/numeric/odeint/examples/bind_member_functions.cpp +++ /dev/null @@ -1,126 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/examples/bind_member_functions.hpp - - [begin_description] - tba. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012 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) - */ - -#include - -#include - -namespace odeint = boost::numeric::odeint; - -typedef boost::array< double , 3 > state_type; - -//[ ode_wrapper -template< class Obj , class Mem > -class ode_wrapper -{ - Obj m_obj; - Mem m_mem; - -public: - - ode_wrapper( Obj obj , Mem mem ) : m_obj( obj ) , m_mem( mem ) { } - - template< class State , class Deriv , class Time > - void operator()( const State &x , Deriv &dxdt , Time t ) - { - (m_obj.*m_mem)( x , dxdt , t ); - } -}; - -template< class Obj , class Mem > -ode_wrapper< Obj , Mem > make_ode_wrapper( Obj obj , Mem mem ) -{ - return ode_wrapper< Obj , Mem >( obj , mem ); -} -//] - - -template< class Obj , class Mem > -class observer_wrapper -{ - Obj m_obj; - Mem m_mem; - -public: - - observer_wrapper( Obj obj , Mem mem ) : m_obj( obj ) , m_mem( mem ) { } - - template< class State , class Time > - void operator()( const State &x , Time t ) - { - (m_obj.*m_mem)( x , t ); - } -}; - -template< class Obj , class Mem > -observer_wrapper< Obj , Mem > make_observer_wrapper( Obj obj , Mem mem ) -{ - return observer_wrapper< Obj , Mem >( obj , mem ); -} - - - -//[ bind_member_function -struct lorenz -{ - void ode( const state_type &x , state_type &dxdt , double t ) const - { - dxdt[0] = 10.0 * ( x[1] - x[0] ); - dxdt[1] = 28.0 * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -8.0 / 3.0 * x[2] + x[0] * x[1]; - } -}; - -int main( int argc , char *argv[] ) -{ - using namespace boost::numeric::odeint; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - integrate_const( runge_kutta4< state_type >() , make_ode_wrapper( lorenz() , &lorenz::ode ) , - x , 0.0 , 10.0 , 0.01 ); - return 0; -} -//] - - -/* -struct lorenz -{ - void ode( const state_type &x , state_type &dxdt , double t ) const - { - dxdt[0] = 10.0 * ( x[1] - x[0] ); - dxdt[1] = 28.0 * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -8.0 / 3.0 * x[2] + x[0] * x[1]; - } - - void obs( const state_type &x , double t ) const - { - std::cout << t << " " << x[0] << " " << x[1] << " " << x[2] << "\n"; - } -}; - -int main( int argc , char *argv[] ) -{ - using namespace boost::numeric::odeint; - - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - integrate_const( runge_kutta4< state_type >() , - make_ode_wrapper( lorenz() , &lorenz::ode ) , - x , 0.0 , 10.0 , 0.01 , - make_observer_wrapper( lorenz() , &lorenz::obs ) ); - - return 0; -} -*/ diff --git a/libs/numeric/odeint/examples/bind_member_functions_cpp11.cpp b/libs/numeric/odeint/examples/bind_member_functions_cpp11.cpp deleted file mode 100644 index 177dded7a..000000000 --- a/libs/numeric/odeint/examples/bind_member_functions_cpp11.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/examples/bind_member_functions.hpp - - [begin_description] - tba. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012 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) - */ - -#include -#include -#include - -#include - -namespace odeint = boost::numeric::odeint; - - - -typedef std::array< double , 3 > state_type; - -struct lorenz -{ - void ode( const state_type &x , state_type &dxdt , double t ) const - { - const double sigma = 10.0; - const double R = 28.0; - const double b = 8.0 / 3.0; - - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; - } -}; - -int main( int argc , char *argv[] ) -{ - using namespace boost::numeric::odeint; - //[ bind_member_function_cpp11 - namespace pl = std::placeholders; - - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - integrate_const( runge_kutta4< state_type >() , - std::bind( &lorenz::ode , lorenz() , pl::_1 , pl::_2 , pl::_3 ) , - x , 0.0 , 10.0 , 0.01 ); - //] - return 0; -} - diff --git a/libs/numeric/odeint/examples/bulirsch_stoer.cpp b/libs/numeric/odeint/examples/bulirsch_stoer.cpp deleted file mode 100644 index 0b18f46e9..000000000 --- a/libs/numeric/odeint/examples/bulirsch_stoer.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * bulirsch_stoer.cpp - * - * Copyright 2011-2013 Mario Mulansky - * Copyright 2011-2012 Karsten Ahnert - * - * Distributed under the 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 -#include -#define _USE_MATH_DEFINES -#include - -#include -#include - -#include - -#include -#include -#include - -using namespace std; -using namespace boost::numeric::odeint; - -typedef boost::array< double , 1 > state_type; - -/* - * x' = ( - x*sin t + 2 tan x ) y - * with x( pi/6 ) = 2/sqrt(3) the analytic solution is 1/cos t - */ - -void rhs( const state_type &x , state_type &dxdt , const double t ) -{ - dxdt[0] = ( - x[0] * sin( t ) + 2.0 * tan( t ) ) * x[0]; -} - -void rhs2( const state_type &x , state_type &dxdt , const double t ) -{ - dxdt[0] = sin(t); -} - - -ofstream out; - -void write_out( const state_type &x , const double t ) -{ - out << t << '\t' << x[0] << endl; -} - -int main() -{ - bulirsch_stoer_dense_out< state_type > stepper( 1E-8 , 0.0 , 0.0 , 0.0 ); - bulirsch_stoer< state_type > stepper2( 1E-8 , 0.0 , 0.0 , 0.0 ); - - state_type x = {{ 2.0 / sqrt(3.0) }}; - - double t = M_PI/6.0; - //double t = 0.0; - double dt = 0.01; - double t_end = M_PI/2.0 - 0.1; - //double t_end = 100.0; - - out.open( "bs.dat" ); - out.precision(16); - integrate_const( stepper , rhs , x , t , t_end , dt , write_out ); - out.close(); - - x[0] = 2.0 / sqrt(3.0); - - out.open( "bs2.dat" ); - out.precision(16); - integrate_adaptive( stepper , rhs , x , t , t_end , dt , write_out ); - out.close(); - - x[0] = 2.0 / sqrt(3.0); - - out.open( "bs3.dat" ); - out.precision(16); - integrate_adaptive( stepper2 , rhs , x , t , t_end , dt , write_out ); - out.close(); - - - typedef runge_kutta_dopri5< state_type > dopri5_type; - typedef controlled_runge_kutta< dopri5_type > controlled_dopri5_type; - typedef dense_output_runge_kutta< controlled_dopri5_type > dense_output_dopri5_type; - - dense_output_dopri5_type dopri5 = make_dense_output( 1E-9 , 1E-9 , dopri5_type() ); - - x[0] = 2.0 / sqrt(3.0); - - out.open( "bs4.dat" ); - out.precision(16); - integrate_adaptive( dopri5 , rhs , x , t , t_end , dt , write_out ); - out.close(); - -} diff --git a/libs/numeric/odeint/examples/chaotic_system.cpp b/libs/numeric/odeint/examples/chaotic_system.cpp deleted file mode 100644 index 607846898..000000000 --- a/libs/numeric/odeint/examples/chaotic_system.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - * chaotic_system.cpp - * - * This example demonstrates how one can use odeint to determine the Lyapunov - * exponents of a chaotic system namely the well known Lorenz system. Furthermore, - * it shows how odeint interacts with boost.range. - * - * Copyright 2011-2012 Karsten Ahnert - * Copyright 2011-2013 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) - */ - - -#include -#include - -#include - -#include "gram_schmidt.hpp" - -using namespace std; -using namespace boost::numeric::odeint; - - -const double sigma = 10.0; -const double R = 28.0; -const double b = 8.0 / 3.0; - -//[ system_function_without_perturbations -struct lorenz -{ - template< class State , class Deriv > - void operator()( const State &x_ , Deriv &dxdt_ , double t ) const - { - typename boost::range_iterator< const State >::type x = boost::begin( x_ ); - typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ ); - - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; - } -}; -//] - - - -//[ system_function_with_perturbations -const size_t n = 3; -const size_t num_of_lyap = 3; -const size_t N = n + n*num_of_lyap; - -typedef boost::array< double , N > state_type; -typedef boost::array< double , num_of_lyap > lyap_type; - -void lorenz_with_lyap( const state_type &x , state_type &dxdt , double t ) -{ - lorenz()( x , dxdt , t ); - - for( size_t l=0 ; l rk4; - - // perform 10000 transient steps - integrate_n_steps( rk4 , lorenz() , std::make_pair( x.begin() , x.begin() + n ) , 0.0 , dt , 10000 ); - //] - - //[ lyapunov_full_code - fill( x.begin()+n , x.end() , 0.0 ); - for( size_t i=0 ; i( x , lyap , n ); - ++count; - - if( !(count % 100000) ) - { - cout << t; - for( size_t i=0 ; i -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#define tab "\t" - -using namespace std; -using namespace boost::numeric::odeint; - -const double sigma = 10.0; -const double R = 28.0; -const double b = 8.0 / 3.0; - -struct lorenz -{ - template< class State , class Deriv > - void operator()( const State &x , Deriv &dxdt , double t ) const - { - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; - } -}; - - - -int main( int argc , char **argv ) -{ - typedef std::array< double , 3 > state_type; - - // std::for_each - { - runge_kutta4< state_type > stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - std::for_each( make_const_step_time_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - make_const_step_time_iterator_end( stepper , lorenz() , x ) , - []( const std::pair< const state_type&, double > &x ) { - std::cout << x.second << tab << x.first[0] << tab << x.first[1] << tab << x.first[2] << "\n"; } ); - } - - // std::copy_if - { - std::vector< state_type > res; - runge_kutta4< state_type > stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - std::copy_if( make_const_step_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - make_const_step_iterator_end( stepper , lorenz() , x ) , - std::back_inserter( res ) , - []( const state_type& x ) { - return ( x[0] > 0.0 ) ? true : false; } ); - for( size_t i=0 ; i stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - double res = std::accumulate( make_const_step_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - make_const_step_iterator_end( stepper , lorenz() , x ) , - 0.0 , - []( double sum , const state_type &x ) { - return sum + x[0]; } ); - cout << res << endl; - //] - } - - - // std::transform - { - runge_kutta4< state_type > stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - vector< double > weights; - std::transform( make_const_step_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - make_const_step_iterator_end( stepper , lorenz() , x ) , - back_inserter( weights ) , - []( const state_type &x ) { - return sqrt( x[0] * x[0] + x[1] * x[1] + x[2] * x[2] ); } ); - for( size_t i=0 ; i stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - vector< double > weights; - std::transform( make_const_step_time_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - make_const_step_time_iterator_end( stepper , lorenz() , x ) , - back_inserter( weights ) , - []( const std::pair< const state_type &, double > &x ) { - return sqrt( x.first[0] * x.first[0] + x.first[1] * x.first[1] + x.first[2] * x.first[2] ); } ); - for( size_t i=0 ; i stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - boost::range::for_each( make_const_step_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - []( const state_type &x ) { - std::cout << x[0] << tab << x[1] << tab << x[2] << "\n"; } ); - } - - // boost::range::for_each with time iterator - { - runge_kutta4< state_type > stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - boost::range::for_each( make_const_step_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - []( const std::pair< const state_type& , double > &x ) { - std::cout << x.second << tab << x.first[0] << tab << x.first[1] << tab << x.first[2] << "\n"; } ); - } - - - // boost::range::copy with filtered adaptor (simulating std::copy_if) - { - std::vector< state_type > res; - runge_kutta4< state_type > stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - boost::range::copy( make_const_step_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) | - boost::adaptors::filtered( [] ( const state_type &x ) { return ( x[0] > 0.0 ); } ) , - std::back_inserter( res ) ); - for( size_t i=0 ; i stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - double res = boost::accumulate( make_const_step_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , 0.0 , - []( double sum , const state_type &x ) { - return sum + x[0]; } ); - cout << res << endl; - //] - } - - // boost::range::accumulate with time iterator - { - //[const_step_time_iterator_accumulate_range - runge_kutta4< state_type > stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - double res = boost::accumulate( make_const_step_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , 0.0 , - []( double sum , const std::pair< const state_type &, double > &x ) { - return sum + x.first[0]; } ); - cout << res << endl; - //] - } - - - // boost::range::transform - { - runge_kutta4< state_type > stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - vector< double > weights; - boost::transform( make_const_step_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , back_inserter( weights ) , - []( const state_type &x ) { - return sqrt( x[0] * x[0] + x[1] * x[1] + x[2] * x[2] ); } ); - for( size_t i=0 ; i stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - auto iter = boost::find_if( make_const_step_time_range( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - []( const std::pair< const state_type & , double > &x ) { - return ( x.first[0] < 0.0 ); } ); - cout << iter->second << "\t" << iter->first[0] << "\t" << iter->first[1] << "\t" << iter->first[2] << "\n"; - - } - - - - - - - - - - - - - /* - * Boost.Range versions for dense output steppers - */ - - // boost::range::for_each - { - runge_kutta_dopri5< state_type > stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - boost::range::for_each( make_const_step_range( make_dense_output( 1.0e-6 , 1.0e-6 , stepper ) , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - []( const state_type &x ) { - std::cout << x[0] << tab << x[1] << tab << x[2] << "\n"; } ); - } - - - // boost::range::for_each with time iterator - { - runge_kutta_dopri5< state_type > stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - boost::range::for_each( make_const_step_time_range( make_dense_output( 1.0e-6 , 1.0e-6 , stepper ) , lorenz() , x , 0.0 , 1.0 , 0.01 ) , - []( const std::pair< const state_type& , double > &x ) { - std::cout << x.second << tab << x.first[0] << tab << x.first[1] << tab << x.first[2] << "\n"; } ); - - } - - - - - - /* - * Pure iterators - */ - { - runge_kutta4< state_type > stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - auto first = make_const_step_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ); - auto last = make_const_step_iterator_end( stepper , lorenz() , x ); - while( first != last ) - { - assert( last != first ); - cout << (*first)[0] << tab << (*first)[1] << tab << (*first)[2] << "\n"; - ++first; - } - } - - { - runge_kutta4< state_type > stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - auto first = make_const_step_time_iterator_begin( stepper , lorenz() , x , 0.0 , 1.0 , 0.01 ); - auto last = make_const_step_time_iterator_end( stepper , lorenz() , x ); - while( first != last ) - { - assert( last != first ); - cout << first->second << tab << first->first[0] << tab << first->first[1] << tab << first->first[2] << "\n"; - ++first; - } - } - - - - - - - - return 0; -} diff --git a/libs/numeric/odeint/examples/elliptic.py b/libs/numeric/odeint/examples/elliptic.py deleted file mode 100644 index 9f5f1d45c..000000000 --- a/libs/numeric/odeint/examples/elliptic.py +++ /dev/null @@ -1,31 +0,0 @@ -""" - Copyright 2011 Mario Mulansky - Copyright 2012 Karsten Ahnert - - Stochastic euler stepper example and Ornstein-Uhlenbeck process - - Distributed under the Boost Software License, Version 1.0. -(See accompanying file LICENSE_1_0.txt or - copy at http://www.boost.org/LICENSE_1_0.txt) -""" - - -from pylab import * -from scipy import special - -data1 = loadtxt("elliptic1.dat") -data2 = loadtxt("elliptic2.dat") -data3 = loadtxt("elliptic3.dat") - -sn1,cn1,dn1,phi1 = special.ellipj( data1[:,0] , 0.51 ) -sn2,cn2,dn2,phi2 = special.ellipj( data2[:,0] , 0.51 ) -sn3,cn3,dn3,phi3 = special.ellipj( data3[:,0] , 0.51 ) - -semilogy( data1[:,0] , abs(data1[:,1]-sn1) ) -semilogy( data2[:,0] , abs(data2[:,1]-sn2) , 'ro' ) -semilogy( data3[:,0] , abs(data3[:,1]-sn3) , '--' ) - -show() - - - diff --git a/libs/numeric/odeint/examples/elliptic_functions.cpp b/libs/numeric/odeint/examples/elliptic_functions.cpp deleted file mode 100644 index 97ba59da5..000000000 --- a/libs/numeric/odeint/examples/elliptic_functions.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* - * elliptic_functions.cpp - * - * Copyright 2011-2013 Mario Mulansky - * Copyright 2011-2012 Karsten Ahnert - * - * Distributed under the 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 -#include -#include - -#include - -#include - -#include -#include -#include - -using namespace std; -using namespace boost::numeric::odeint; - -typedef boost::array< double , 3 > state_type; - -/* - * x1' = x2*x3 - * x2' = -x1*x3 - * x3' = -m*x1*x2 - */ - -void rhs( const state_type &x , state_type &dxdt , const double t ) -{ - static const double m = 0.51; - - dxdt[0] = x[1]*x[2]; - dxdt[1] = -x[0]*x[2]; - dxdt[2] = -m*x[0]*x[1]; -} - -ofstream out; - -void write_out( const state_type &x , const double t ) -{ - out << t << '\t' << x[0] << '\t' << x[1] << '\t' << x[2] << endl; -} - -int main() -{ - bulirsch_stoer_dense_out< state_type > stepper( 1E-9 , 1E-9 , 1.0 , 0.0 ); - - state_type x1 = {{ 0.0 , 1.0 , 1.0 }}; - - double t = 0.0; - double dt = 0.01; - - out.open( "elliptic1.dat" ); - out.precision(16); - integrate_const( stepper , rhs , x1 , t , 100.0 , dt , write_out ); - out.close(); - - state_type x2 = {{ 0.0 , 1.0 , 1.0 }}; - - out.open( "elliptic2.dat" ); - out.precision(16); - integrate_adaptive( stepper , rhs , x2 , t , 100.0 , dt , write_out ); - out.close(); - - typedef runge_kutta_dopri5< state_type > dopri5_type; - typedef controlled_runge_kutta< dopri5_type > controlled_dopri5_type; - typedef dense_output_runge_kutta< controlled_dopri5_type > dense_output_dopri5_type; - - - dense_output_dopri5_type dopri5 = make_dense_output( 1E-9 , 1E-9 , dopri5_type() ); - //dense_output_dopri5_type dopri5( controlled_dopri5_type( default_error_checker< double >( 1E-9 , 0.0 , 0.0 , 0.0 ) ) ); - - state_type x3 = {{ 0.0 , 1.0 , 1.0 }}; - - out.open( "elliptic3.dat" ); - out.precision(16); - integrate_adaptive( dopri5 , rhs , x3 , t , 100.0 , dt , write_out ); - out.close(); -} diff --git a/libs/numeric/odeint/examples/find_crossing.cpp b/libs/numeric/odeint/examples/find_crossing.cpp deleted file mode 100644 index a17ef4f97..000000000 --- a/libs/numeric/odeint/examples/find_crossing.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/* - * find_crossing.cpp - * - * Finds the energy threshold crossing for a damped oscillator. - * The algorithm uses a dense out stepper with find_if to first find an - * interval containing the threshold crossing and the utilizes the dense out - * functionality with a bisection to further refine the interval until some - * desired precision is reached. - * - * 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) - */ - - - -#include -#include -#include -#include - -#include -#include -#include - -namespace odeint = boost::numeric::odeint; - -typedef std::array state_type; - -const double gam = 1.0; // damping strength - -void damped_osc(const state_type &x, state_type &dxdt, const double /*t*/) -{ - dxdt[0] = x[1]; - dxdt[1] = -x[0] - gam * x[1]; -} - - -struct energy_condition { - - // defines the threshold crossing in terms of a boolean functor - - double m_min_energy; - - energy_condition(const double min_energy) - : m_min_energy(min_energy) { } - - double energy(const state_type &x) { - return 0.5 * x[1] * x[1] + 0.5 * x[0] * x[0]; - } - - bool operator()(const state_type &x) { - // becomes true if the energy becomes smaller than the threshold - return energy(x) <= m_min_energy; - } -}; - - -template -std::pair -find_condition(state_type &x0, System sys, Condition cond, - const double t_start, const double t_end, const double dt, - const double precision = 1E-6) { - - // integrates an ODE until some threshold is crossed - // returns time and state at the point of the threshold crossing - // if no threshold crossing is found, some time > t_end is returned - - auto stepper = odeint::make_dense_output(1.0e-6, 1.0e-6, - odeint::runge_kutta_dopri5()); - - auto ode_range = odeint::make_adaptive_range(std::ref(stepper), sys, x0, - t_start, t_end, dt); - - // find the step where the condition changes - auto found_iter = std::find_if(ode_range.first, ode_range.second, cond); - - if(found_iter == ode_range.second) - { - // no threshold crossing -> return time after t_end and ic - return std::make_pair(t_end + dt, x0); - } - - // the dense out stepper now covers the interval where the condition changes - // improve the solution by bisection - double t0 = stepper.previous_time(); - double t1 = stepper.current_time(); - double t_m; - state_type x_m; - // use odeint's resizing functionality to allocate memory for x_m - odeint::adjust_size_by_resizeability(x_m, x0, - typename odeint::is_resizeable::type()); - while(std::abs(t1 - t0) > precision) { - t_m = 0.5 * (t0 + t1); // get the mid point time - stepper.calc_state(t_m, x_m); // obtain the corresponding state - if (cond(x_m)) - t1 = t_m; // condition changer lies before midpoint - else - t0 = t_m; // condition changer lies after midpoint - } - // we found the interval of size eps, take it's midpoint as final guess - t_m = 0.5 * (t0 + t1); - stepper.calc_state(t_m, x_m); - return std::make_pair(t_m, x_m); -} - - -int main(int argc, char **argv) -{ - state_type x0 = {{10.0, 0.0}}; - const double t_start = 0.0; - const double t_end = 10.0; - const double dt = 0.1; - const double threshold = 0.1; - - energy_condition cond(threshold); - state_type x_cond; - double t_cond; - std::tie(t_cond, x_cond) = find_condition(x0, damped_osc, cond, - t_start, t_end, dt, 1E-6); - if(t_cond > t_end) - { - // time after t_end -> no threshold crossing within [t_start, t_end] - std::cout << "No threshold crossing found." << std::endl; - } else - { - std::cout.precision(16); - std::cout << "Time of energy threshold crossing: " << t_cond << std::endl; - std::cout << "State: [" << x_cond[0] << " , " << x_cond[1] << "]" << std::endl; - std::cout << "Energy: " << cond.energy(x_cond) << std::endl; - } -} diff --git a/libs/numeric/odeint/examples/fpu.cpp b/libs/numeric/odeint/examples/fpu.cpp deleted file mode 100644 index e3ca9df44..000000000 --- a/libs/numeric/odeint/examples/fpu.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/* - * fpu.cpp - * - * This example demonstrates how one can use odeint to solve the Fermi-Pasta-Ulam system. - - * Created on: July 13, 2011 - * - * Copyright 2011-2012 Karsten Ahnert - * Copyright 2011 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) - */ - -#include -#include -#include -#include - -#include - -#ifndef M_PI //not there on windows -#define M_PI 3.1415927 //... -#endif - -using namespace std; -using namespace boost::numeric::odeint; - -//[ fpu_system_function -typedef vector< double > container_type; - -struct fpu -{ - const double m_beta; - - fpu( const double beta = 1.0 ) : m_beta( beta ) { } - - // system function defining the ODE - void operator()( const container_type &q , container_type &dpdt ) const - { - size_t n = q.size(); - double tmp = q[0] - 0.0; - double tmp2 = tmp + m_beta * tmp * tmp * tmp; - dpdt[0] = -tmp2; - for( size_t i=0 ; i - } - - // calculates the local energy of the system - void local_energy( const container_type &q , const container_type &p , container_type &e ) const - { - // ... - //<- - size_t n = q.size(); - double tmp = q[0]; - double tmp2 = 0.5 * tmp * tmp + 0.25 * m_beta * tmp * tmp * tmp * tmp; - e[0] = tmp2; - for( size_t i=0 ; i - } -}; -//] - - - -//[ fpu_observer -struct streaming_observer -{ - std::ostream& m_out; - const fpu &m_fpu; - size_t m_write_every; - size_t m_count; - - streaming_observer( std::ostream &out , const fpu &f , size_t write_every = 100 ) - : m_out( out ) , m_fpu( f ) , m_write_every( write_every ) , m_count( 0 ) { } - - template< class State > - void operator()( const State &x , double t ) - { - if( ( m_count % m_write_every ) == 0 ) - { - container_type &q = x.first; - container_type &p = x.second; - container_type energy( q.size() ); - m_fpu.local_energy( q , p , energy ); - for( size_t i=0 ; i stepper_type; - fpu fpu_instance( 8.0 ); - - integrate_const( stepper_type() , fpu_instance , - make_pair( boost::ref( q ) , boost::ref( p ) ) , - 0.0 , 1000.0 , dt , streaming_observer( cout , fpu_instance , 10 ) ); - //] - - return 0; -} diff --git a/libs/numeric/odeint/examples/generation_functions.cpp b/libs/numeric/odeint/examples/generation_functions.cpp deleted file mode 100644 index 6baa5f22d..000000000 --- a/libs/numeric/odeint/examples/generation_functions.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - libs/numeric/odeint/examples/stochastic_euler.hpp - - Copyright 2012 Karsten Ahnert - Copyright 2012-2013 Mario Mulansky - Copyright 2013 Pascal Germroth - - Stochastic euler stepper example and Ornstein-Uhlenbeck process - - Distributed under the 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 - -#include - -typedef boost::array< double , 1 > state_type; - -using namespace boost::numeric::odeint; - - -//[ generation_functions_own_steppers -class custom_stepper -{ -public: - - typedef double value_type; - // ... -}; - -class custom_controller -{ - // ... -}; - -class custom_dense_output -{ - // ... -}; -//] - - -//[ generation_functions_get_controller -namespace boost { namespace numeric { namespace odeint { - -template<> -struct get_controller< custom_stepper > -{ - typedef custom_controller type; -}; - -} } } -//] - -//[ generation_functions_controller_factory -namespace boost { namespace numeric { namespace odeint { - -template<> -struct controller_factory< custom_stepper , custom_controller > -{ - custom_controller operator()( double abs_tol , double rel_tol , const custom_stepper & ) const - { - return custom_controller(); - } - - custom_controller operator()( double abs_tol , double rel_tol , double max_dt , - const custom_stepper & ) const - { - // version with maximal allowed step size max_dt - return custom_controller(); - } -}; - -} } } -//] - -int main( int argc , char **argv ) -{ - { - typedef runge_kutta_dopri5< state_type > stepper_type; - - /* - //[ generation_functions_syntax_auto - auto stepper1 = make_controlled( 1.0e-6 , 1.0e-6 , stepper_type() ); - // or with max step size limit: - // auto stepper1 = make_controlled( 1.0e-6 , 1.0e-6 , 0.01, stepper_type() ); - - auto stepper2 = make_dense_output( 1.0e-6 , 1.0e-6 , stepper_type() ); - //] - */ - - //[ generation_functions_syntax_result_of - boost::numeric::odeint::result_of::make_controlled< stepper_type >::type stepper3 = make_controlled( 1.0e-6 , 1.0e-6 , stepper_type() ); - (void)stepper3; - boost::numeric::odeint::result_of::make_dense_output< stepper_type >::type stepper4 = make_dense_output( 1.0e-6 , 1.0e-6 , stepper_type() ); - (void)stepper4; - //] - } - - { - /* - //[ generation_functions_example_custom_controller - auto stepper5 = make_controlled( 1.0e-6 , 1.0e-6 , custom_stepper() ); - //] - */ - - boost::numeric::odeint::result_of::make_controlled< custom_stepper >::type stepper5 = make_controlled( 1.0e-6 , 1.0e-6 , custom_stepper() ); - (void)stepper5; - } - return 0; -} diff --git a/libs/numeric/odeint/examples/gmpxx/Makefile b/libs/numeric/odeint/examples/gmpxx/Makefile deleted file mode 100644 index 0a9f7cb01..000000000 --- a/libs/numeric/odeint/examples/gmpxx/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -CXXFLAGS = -I${BOOST_ROOT} -O2 -static -LDFLAGS = -lgmpxx -lgmp - -lorenz_gmpxx: lorenz_gmpxx.cpp - ${CXX} ${CXXFLAGS} lorenz_gmpxx.cpp ${LDFLAGS} -o lorenz_gmpxx diff --git a/libs/numeric/odeint/examples/gmpxx/lorenz_gmpxx.cpp b/libs/numeric/odeint/examples/gmpxx/lorenz_gmpxx.cpp deleted file mode 100644 index 39b4c72e6..000000000 --- a/libs/numeric/odeint/examples/gmpxx/lorenz_gmpxx.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - * lorenz_gmpxx.cpp - * - * This example demonstrates how odeint can be used with arbitrary precision types. - * - * Copyright 2011-2012 Karsten Ahnert - * Copyright 2011-2012 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) - */ - - - -#include -#include - -#include - -#include - -using namespace std; -using namespace boost::numeric::odeint; - -//[ gmpxx_lorenz -typedef mpf_class value_type; -typedef boost::array< value_type , 3 > state_type; - -struct lorenz -{ - void operator()( const state_type &x , state_type &dxdt , value_type t ) const - { - const value_type sigma( 10.0 ); - const value_type R( 28.0 ); - const value_type b( value_type( 8.0 ) / value_type( 3.0 ) ); - - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; - } -}; -//] - - - - -struct streaming_observer -{ - std::ostream& m_out; - - streaming_observer( std::ostream &out ) : m_out( out ) { } - - template< class State , class Time > - void operator()( const State &x , Time t ) const - { - m_out << t; - for( size_t i=0 ; i() , - lorenz() , x , value_type( 0.0 ) , value_type( 10.0 ) , value_type( value_type( 1.0 ) / value_type( 10.0 ) ) , - streaming_observer( cout ) ); - //] - - return 0; -} diff --git a/libs/numeric/odeint/examples/gram_schmidt.hpp b/libs/numeric/odeint/examples/gram_schmidt.hpp deleted file mode 100644 index f5f56808b..000000000 --- a/libs/numeric/odeint/examples/gram_schmidt.hpp +++ /dev/null @@ -1,89 +0,0 @@ -/* - boost header: numeric/odeint/gram_schmitt.hpp - - Copyright 2011-2013 Karsten Ahnert - Copyright 2011 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_GRAM_SCHMITT_HPP_INCLUDED -#define BOOST_NUMERIC_ODEINT_GRAM_SCHMITT_HPP_INCLUDED - -#include -#include -#include -#include - -namespace boost { -namespace numeric { -namespace odeint { - -template< class Iterator , class T > -void normalize( Iterator first , Iterator last , T norm ) -{ - while( first != last ) *first++ /= norm; -} - -template< class Iterator , class T > -void substract_vector( Iterator first1 , Iterator last1 , - Iterator first2 , T val ) -{ - while( first1 != last1 ) *first1++ -= val * ( *first2++ ); -} - -template< size_t num_of_lyap , class StateType , class LyapType > -void gram_schmidt( StateType &x , LyapType &lyap , size_t n ) -{ - if( !num_of_lyap ) return; - if( ptrdiff_t( ( num_of_lyap + 1 ) * n ) != std::distance( x.begin() , x.end() ) ) - BOOST_THROW_EXCEPTION( std::domain_error( "renormalization() : size of state does not match the number of lyapunov exponents." ) ); - - typedef typename StateType::value_type value_type; - typedef typename StateType::iterator iterator; - - value_type norm[num_of_lyap]; - value_type tmp[num_of_lyap]; - iterator first = x.begin() + n; - iterator beg1 = first , end1 = first + n ; - - std::fill( norm , norm+num_of_lyap , 0.0 ); - - // normalize first vector - norm[0] = sqrt( std::inner_product( beg1 , end1 , beg1 , 0.0 ) ); - normalize( beg1 , end1 , norm[0] ); - - beg1 += n; - end1 += n; - - for( size_t j=1 ; j -#include - -#include - - - -//[ rhs_function -/* The type of container used to hold the state vector */ -typedef std::vector< double > state_type; - -const double gam = 0.15; - -/* The rhs of x' = f(x) */ -void harmonic_oscillator( const state_type &x , state_type &dxdt , const double /* t */ ) -{ - dxdt[0] = x[1]; - dxdt[1] = -x[0] - gam*x[1]; -} -//] - - - - - -//[ rhs_class -/* The rhs of x' = f(x) defined as a class */ -class harm_osc { - - double m_gam; - -public: - harm_osc( double gam ) : m_gam(gam) { } - - void operator() ( const state_type &x , state_type &dxdt , const double /* t */ ) - { - dxdt[0] = x[1]; - dxdt[1] = -x[0] - m_gam*x[1]; - } -}; -//] - - - - - -//[ integrate_observer -struct push_back_state_and_time -{ - std::vector< state_type >& m_states; - std::vector< double >& m_times; - - push_back_state_and_time( std::vector< state_type > &states , std::vector< double > × ) - : m_states( states ) , m_times( times ) { } - - void operator()( const state_type &x , double t ) - { - m_states.push_back( x ); - m_times.push_back( t ); - } -}; -//] - -struct write_state -{ - void operator()( const state_type &x ) const - { - std::cout << x[0] << "\t" << x[1] << "\n"; - } -}; - - -int main(int /* argc */ , char** /* argv */ ) -{ - using namespace std; - using namespace boost::numeric::odeint; - - - //[ state_initialization - state_type x(2); - x[0] = 1.0; // start at x=1.0, p=0.0 - x[1] = 0.0; - //] - - - - //[ integration - size_t steps = integrate( harmonic_oscillator , - x , 0.0 , 10.0 , 0.1 ); - //] - - - - //[ integration_class - harm_osc ho(0.15); - steps = integrate( ho , - x , 0.0 , 10.0 , 0.1 ); - //] - - - - - - //[ integrate_observ - vector x_vec; - vector times; - - steps = integrate( harmonic_oscillator , - x , 0.0 , 10.0 , 0.1 , - push_back_state_and_time( x_vec , times ) ); - - /* output */ - for( size_t i=0; i<=steps; i++ ) - { - cout << times[i] << '\t' << x_vec[i][0] << '\t' << x_vec[i][1] << '\n'; - } - //] - - - - - - - - //[ define_const_stepper - runge_kutta4< state_type > stepper; - integrate_const( stepper , harmonic_oscillator , x , 0.0 , 10.0 , 0.01 ); - //] - - - - - //[ integrate_const_loop - const double dt = 0.01; - for( double t=0.0 ; t<10.0 ; t+= dt ) - stepper.do_step( harmonic_oscillator , x , t , dt ); - //] - - - - - //[ define_adapt_stepper - typedef runge_kutta_cash_karp54< state_type > error_stepper_type; - //] - - - - //[ integrate_adapt - typedef controlled_runge_kutta< error_stepper_type > controlled_stepper_type; - controlled_stepper_type controlled_stepper; - integrate_adaptive( controlled_stepper , harmonic_oscillator , x , 0.0 , 10.0 , 0.01 ); - //] - - { - //[integrate_adapt_full - double abs_err = 1.0e-10 , rel_err = 1.0e-6 , a_x = 1.0 , a_dxdt = 1.0; - controlled_stepper_type controlled_stepper( - default_error_checker< double , range_algebra , default_operations >( abs_err , rel_err , a_x , a_dxdt ) ); - integrate_adaptive( controlled_stepper , harmonic_oscillator , x , 0.0 , 10.0 , 0.01 ); - //] - } - - - //[integrate_adapt_make_controlled - integrate_adaptive( make_controlled< error_stepper_type >( 1.0e-10 , 1.0e-6 ) , - harmonic_oscillator , x , 0.0 , 10.0 , 0.01 ); - //] - - - - - //[integrate_adapt_make_controlled_alternative - integrate_adaptive( make_controlled( 1.0e-10 , 1.0e-6 , error_stepper_type() ) , - harmonic_oscillator , x , 0.0 , 10.0 , 0.01 ); - //] - - #ifdef BOOST_NUMERIC_ODEINT_CXX11 - //[ define_const_stepper_cpp11 - { - runge_kutta4< state_type > stepper; - integrate_const( stepper , []( const state_type &x , state_type &dxdt , double t ) { - dxdt[0] = x[1]; dxdt[1] = -x[0] - gam*x[1]; } - , x , 0.0 , 10.0 , 0.01 ); - } - //] - - - - //[ harm_iterator_const_step] - std::for_each( make_const_step_time_iterator_begin( stepper , harmonic_oscillator, x , 0.0 , 0.1 , 10.0 ) , - make_const_step_time_iterator_end( stepper , harmonic_oscillator, x ) , - []( std::pair< const state_type & , const double & > x ) { - cout << x.second << " " << x.first[0] << " " << x.first[1] << "\n"; } ); - //] - #endif - - - - -} diff --git a/libs/numeric/odeint/examples/harmonic_oscillator_units.cpp b/libs/numeric/odeint/examples/harmonic_oscillator_units.cpp deleted file mode 100644 index ceee83d80..000000000 --- a/libs/numeric/odeint/examples/harmonic_oscillator_units.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - Copyright 2011-2013 Karsten Ahnert - Copyright 2011-2013 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) - */ - - -#include -#include - - -/* WARNING: Compilation in debug mode might consume enormous memory - (e.g. ~2GB on gcc 4.4 ) -*/ - -// first increase fusion macro variables (now done by odeint itself) -//#define BOOST_FUSION_INVOKE_MAX_ARITY 15 -//#define BOOST_RESULT_OF_NUM_ARGS 15 - -//[ units_define_basic_quantities - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -using namespace std; -using namespace boost::numeric::odeint; -namespace fusion = boost::fusion; -namespace units = boost::units; -namespace si = boost::units::si; - -typedef units::quantity< si::time , double > time_type; -typedef units::quantity< si::length , double > length_type; -typedef units::quantity< si::velocity , double > velocity_type; -typedef units::quantity< si::acceleration , double > acceleration_type; -typedef units::quantity< si::frequency , double > frequency_type; - -typedef fusion::vector< length_type , velocity_type > state_type; -typedef fusion::vector< velocity_type , acceleration_type > deriv_type; -//] - - - -//[ units_define_ode -struct oscillator -{ - frequency_type m_omega; - - oscillator( const frequency_type &omega = 1.0 * si::hertz ) : m_omega( omega ) { } - - void operator()( const state_type &x , deriv_type &dxdt , time_type t ) const - { - fusion::at_c< 0 >( dxdt ) = fusion::at_c< 1 >( x ); - fusion::at_c< 1 >( dxdt ) = - m_omega * m_omega * fusion::at_c< 0 >( x ); - } -}; -//] - - -//[ units_observer -struct streaming_observer -{ - std::ostream& m_out; - - streaming_observer( std::ostream &out ) : m_out( out ) { } - - struct write_element - { - std::ostream &m_out; - write_element( std::ostream &out ) : m_out( out ) { }; - - template< class T > - void operator()( const T &t ) const - { - m_out << "\t" << t; - } - }; - - template< class State , class Time > - void operator()( const State &x , const Time &t ) const - { - m_out << t; - fusion::for_each( x , write_element( m_out ) ); - m_out << "\n"; - } -}; -//] - - -int main( int argc , char**argv ) -{ -// typedef dense_output_runge_kutta -// < -// controlled_runge_kutta -// < -// runge_kutta_dopri5< state_type , double , deriv_type , time_type , fusion_algebra > -// > -// > stepper_type; - - //[ units_define_stepper - typedef runge_kutta_dopri5< state_type , double , deriv_type , time_type > stepper_type; - - state_type x( 1.0 * si::meter , 0.0 * si::meter_per_second ); - - integrate_const( make_dense_output( 1.0e-6 , 1.0e-6 , stepper_type() ) , oscillator( 2.0 * si::hertz ) , - x , 0.0 * si::second , 100.0 * si::second , 0.1 * si::second , streaming_observer( cout ) ); - //] - - return 0; -} diff --git a/libs/numeric/odeint/examples/heun.cpp b/libs/numeric/odeint/examples/heun.cpp deleted file mode 100644 index 34fe12c42..000000000 --- a/libs/numeric/odeint/examples/heun.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/examples/heun.cpp - - [begin_description] - Examplary implementation of the method of Heun. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012 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) - */ - -#include - - -#include -#include - -#include - -#include - - - - - - -namespace fusion = boost::fusion; - -//[ heun_define_coefficients -template< class Value = double > -struct heun_a1 : boost::array< Value , 1 > { - heun_a1( void ) - { - (*this)[0] = static_cast< Value >( 1 ) / static_cast< Value >( 3 ); - } -}; - -template< class Value = double > -struct heun_a2 : boost::array< Value , 2 > -{ - heun_a2( void ) - { - (*this)[0] = static_cast< Value >( 0 ); - (*this)[1] = static_cast< Value >( 2 ) / static_cast< Value >( 3 ); - } -}; - - -template< class Value = double > -struct heun_b : boost::array< Value , 3 > -{ - heun_b( void ) - { - (*this)[0] = static_cast( 1 ) / static_cast( 4 ); - (*this)[1] = static_cast( 0 ); - (*this)[2] = static_cast( 3 ) / static_cast( 4 ); - } -}; - -template< class Value = double > -struct heun_c : boost::array< Value , 3 > -{ - heun_c( void ) - { - (*this)[0] = static_cast< Value >( 0 ); - (*this)[1] = static_cast< Value >( 1 ) / static_cast< Value >( 3 ); - (*this)[2] = static_cast< Value >( 2 ) / static_cast< Value >( 3 ); - } -}; -//] - - -//[ heun_stepper_definition -template< - class State , - class Value = double , - class Deriv = State , - class Time = Value , - class Algebra = boost::numeric::odeint::range_algebra , - class Operations = boost::numeric::odeint::default_operations , - class Resizer = boost::numeric::odeint::initially_resizer -> -class heun : public -boost::numeric::odeint::explicit_generic_rk< 3 , 3 , State , Value , Deriv , Time , - Algebra , Operations , Resizer > -{ - -public: - - typedef boost::numeric::odeint::explicit_generic_rk< 3 , 3 , State , Value , Deriv , Time , - Algebra , Operations , Resizer > stepper_base_type; - - typedef typename stepper_base_type::state_type state_type; - typedef typename stepper_base_type::wrapped_state_type wrapped_state_type; - typedef typename stepper_base_type::value_type value_type; - typedef typename stepper_base_type::deriv_type deriv_type; - typedef typename stepper_base_type::wrapped_deriv_type wrapped_deriv_type; - typedef typename stepper_base_type::time_type time_type; - typedef typename stepper_base_type::algebra_type algebra_type; - typedef typename stepper_base_type::operations_type operations_type; - typedef typename stepper_base_type::resizer_type resizer_type; - typedef typename stepper_base_type::stepper_type stepper_type; - - heun( const algebra_type &algebra = algebra_type() ) - : stepper_base_type( - fusion::make_vector( - heun_a1() , - heun_a2() ) , - heun_b() , heun_c() , algebra ) - { } -}; -//] - - -const double sigma = 10.0; -const double R = 28.0; -const double b = 8.0 / 3.0; - -struct lorenz -{ - template< class State , class Deriv > - void operator()( const State &x_ , Deriv &dxdt_ , double t ) const - { - typename boost::range_iterator< const State >::type x = boost::begin( x_ ); - typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ ); - - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; - } -}; - -struct streaming_observer -{ - std::ostream &m_out; - streaming_observer( std::ostream &out ) : m_out( out ) { } - template< typename State , typename Value > - void operator()( const State &x , Value t ) const - { - m_out << t; - for( size_t i=0 ; i state_type; - heun< state_type > h; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - - integrate_const( h , lorenz() , x , 0.0 , 100.0 , 0.01 , - streaming_observer( std::cout ) ); - - //] - - return 0; -} diff --git a/libs/numeric/odeint/examples/integrate_times.cpp b/libs/numeric/odeint/examples/integrate_times.cpp deleted file mode 100644 index 9e6b58104..000000000 --- a/libs/numeric/odeint/examples/integrate_times.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* Boost libs/numeric/odeint/examples/integrate_times.cpp - - Copyright 2009-2014 Karsten Ahnert - Copyright 2009-2014 Mario Mulansky - - example for the use of integrate_times - - Distributed under the 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 -#include - -using namespace std; -using namespace boost::numeric::odeint; - - -/* - * simple 1D ODE - */ - -void rhs( const double x , double &dxdt , const double t ) -{ - dxdt = 3.0/(2.0*t*t) + x/(2.0*t); -} - -void write_cout( const double &x , const double t ) -{ - cout << t << '\t' << x << endl; -} - -// state_type = double -typedef runge_kutta_dopri5< double > stepper_type; - -const double dt = 0.1; - -int main() -{ - // create a vector with observation time points - std::vector times( 91 ); - for( size_t i=0 ; i -#include -#include - -#include - -//[ list_bindings -typedef std::list< double > state_type; - -namespace boost { namespace numeric { namespace odeint { - -template< > -struct is_resizeable< state_type > -{ // declare resizeability - typedef boost::true_type type; - const static bool value = type::value; -}; - -template< > -struct same_size_impl< state_type , state_type > -{ // define how to check size - static bool same_size( const state_type &v1 , - const state_type &v2 ) - { - return v1.size() == v2.size(); - } -}; - -template< > -struct resize_impl< state_type , state_type > -{ // define how to resize - static void resize( state_type &v1 , - const state_type &v2 ) - { - v1.resize( v2.size() ); - } -}; - -} } } -//] - -void lattice( const state_type &x , state_type &dxdt , const double /* t */ ) -{ - state_type::const_iterator x_begin = x.begin(); - state_type::const_iterator x_end = x.end(); - state_type::iterator dxdt_begin = dxdt.begin(); - - x_end--; // stop one before last - while( x_begin != x_end ) - { - *(dxdt_begin++) = std::sin( *(x_begin) - *(x_begin++) ); - } - *dxdt_begin = sin( *x_begin - *(x.begin()) ); // periodic boundary -} - -using namespace boost::numeric::odeint; - -int main() -{ - const int N = 32; - state_type x; - for( int i=0 ; i() , lattice , x , 0.0 , 10.0 , 0.1 ); -} diff --git a/libs/numeric/odeint/examples/lorenz.cpp b/libs/numeric/odeint/examples/lorenz.cpp deleted file mode 100644 index 37155aaed..000000000 --- a/libs/numeric/odeint/examples/lorenz.cpp +++ /dev/null @@ -1,31 +0,0 @@ -#include -#include - -#include - -using namespace std; -using namespace boost::numeric::odeint; - -const double sigma = 10.0; -const double R = 28.0; -const double b = 8.0 / 3.0; - -typedef boost::array< double , 3 > state_type; - -void lorenz( const state_type &x , state_type &dxdt , double t ) -{ - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; -} - -void write_lorenz( const state_type &x , const double t ) -{ - cout << t << '\t' << x[0] << '\t' << x[1] << '\t' << x[2] << endl; -} - -int main(int argc, char **argv) -{ - state_type x = {{ 10.0 , 1.0 , 1.0 }}; // initial conditions - integrate( lorenz , x , 0.0 , 25.0 , 0.1 , write_lorenz ); -} diff --git a/libs/numeric/odeint/examples/lorenz_point.cpp b/libs/numeric/odeint/examples/lorenz_point.cpp deleted file mode 100644 index 26161675c..000000000 --- a/libs/numeric/odeint/examples/lorenz_point.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2011-2013 Mario Mulansky - * Copyright 2012 Karsten Ahnert - * - * Distributed under the Boost Software License, Version 1.0. - * (See accompanying file LICENSE_1_0.txt or - * copy at http://www.boost.org/LICENSE_1_0.txt) - * - * Example for the lorenz system with a 3D point type -*/ - -#include -#include - -#include - -#include - - -//[point3D -class point3D : - boost::additive1< point3D , - boost::additive2< point3D , double , - boost::multiplicative2< point3D , double > > > -{ -public: - - double x , y , z; - - point3D() - : x( 0.0 ) , y( 0.0 ) , z( 0.0 ) - { } - - point3D( const double val ) - : x( val ) , y( val ) , z( val ) - { } - - point3D( const double _x , const double _y , const double _z ) - : x( _x ) , y( _y ) , z( _z ) - { } - - point3D& operator+=( const point3D &p ) - { - x += p.x; y += p.y; z += p.z; - return *this; - } - - point3D& operator*=( const double a ) - { - x *= a; y *= a; z *= a; - return *this; - } - -}; -//] - -//[point3D_abs_div -// only required for steppers with error control -point3D operator/( const point3D &p1 , const point3D &p2 ) -{ - return point3D( p1.x/p2.x , p1.y/p2.y , p1.z/p2.z ); -} - -point3D abs( const point3D &p ) -{ - return point3D( std::abs(p.x) , std::abs(p.y) , std::abs(p.z) ); -} -//] - -//[point3D_norm -// also only for steppers with error control -namespace boost { namespace numeric { namespace odeint { -template<> -struct vector_space_norm_inf< point3D > -{ - typedef double result_type; - double operator()( const point3D &p ) const - { - using std::max; - using std::abs; - return max( max( abs( p.x ) , abs( p.y ) ) , abs( p.z ) ); - } -}; -} } } -//] - -std::ostream& operator<<( std::ostream &out , const point3D &p ) -{ - out << p.x << " " << p.y << " " << p.z; - return out; -} - -//[point3D_main -const double sigma = 10.0; -const double R = 28.0; -const double b = 8.0 / 3.0; - -void lorenz( const point3D &x , point3D &dxdt , const double t ) -{ - dxdt.x = sigma * ( x.y - x.x ); - dxdt.y = R * x.x - x.y - x.x * x.z; - dxdt.z = -b * x.z + x.x * x.y; -} - -using namespace boost::numeric::odeint; - -int main() -{ - - point3D x( 10.0 , 5.0 , 5.0 ); - // point type defines it's own operators -> use vector_space_algebra ! - typedef runge_kutta_dopri5< point3D , double , point3D , - double , vector_space_algebra > stepper; - int steps = integrate_adaptive( make_controlled( 1E-10 , 1E-10 ) , lorenz , x , - 0.0 , 10.0 , 0.1 ); - std::cout << x << std::endl; - std::cout << "steps: " << steps << std::endl; -} -//] diff --git a/libs/numeric/odeint/examples/molecular_dynamics.cpp b/libs/numeric/odeint/examples/molecular_dynamics.cpp deleted file mode 100644 index e1a82e036..000000000 --- a/libs/numeric/odeint/examples/molecular_dynamics.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/examples/molecular_dynamics.cpp - - [begin_description] - Molecular dynamics example. - [end_description] - - Copyright 2009-2012 Karsten Ahnert - Copyright 2009-2012 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) - */ - -#include - -#include -#include -#include - -using namespace boost::numeric::odeint; - - - -using namespace std; -#define tab "\t" - -const size_t n1 = 16; -const size_t n2 = 16; - -struct md_system -{ - static const size_t n = n1 * n2; - typedef std::vector< double > vector_type; - - md_system( double a = 0.0 , // strength of harmonic oscillator - double gamma = 0.0 , // friction - double eps = 0.1 , // interaction strenght - double sigma = 1.0 , // interaction radius - double xmax = 150.0 , double ymax = 150.0 ) - : m_a( a ) , m_gamma( gamma ) - , m_eps( eps ) , m_sigma( sigma ) - , m_xmax( xmax ) , m_ymax( ymax ) - { } - - static void init_vector_type( vector_type &x ) { x.resize( 2 * n ); } - - void operator()( vector_type const& x , vector_type const& v , vector_type &a , double t ) const - { - for( size_t i=0 ; i xmax ) ? x - xmax : x ; - } - - double m_a; - double m_gamma; - double m_eps ; - double m_sigma ; - double m_xmax , m_ymax; -}; - - - - - -int main( int argc , char *argv[] ) -{ - const size_t n = md_system::n; - typedef md_system::vector_type vector_type; - - - std::mt19937 rng; - std::normal_distribution<> dist( 0.0 , 1.0 ); - - vector_type x , v; - md_system::init_vector_type( x ); - md_system::init_vector_type( v ); - - for( size_t i=0 ; i stepper; - const double dt = 0.025; - double t = 0.0; - md_system sys; - for( size_t oi=0 ; oi<100000 ; ++oi ) - { - for( size_t ii=0 ; ii<100 ; ++ii,t+=dt ) - stepper.do_step( sys , std::make_pair( std::ref( x ) , std::ref( v ) ) , t , dt ); - sys.bc( x ); - - std::cout << "set size square" << "\n"; - std::cout << "unset key" << "\n"; - std::cout << "p [0:" << sys.m_xmax << "][0:" << sys.m_ymax << "] '-' pt 7 ps 0.5" << "\n"; - for( size_t i=0 ; i - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "point_type.hpp" - - - - - - - - -struct local_force -{ - double m_gamma; // friction - local_force( double gamma = 0.0 ) : m_gamma( gamma ) { } - template< typename Point > - Point operator()( Point& x , Point& v ) const - { - return - m_gamma * v; - } -}; - - -struct lennard_jones -{ - double m_sigma; - double m_eps; - lennard_jones( double sigma = 1.0 , double eps = 0.1 ) : m_sigma( sigma ) , m_eps( eps ) { } - double operator()( double r ) const - { - double c = m_sigma / r; - double c3 = c * c * c; - double c6 = c3 * c3; - return 4.0 * m_eps * ( -12.0 * c6 * c6 / r + 6.0 * c6 / r ); - } -}; - -template< typename F > -struct conservative_interaction -{ - F m_f; - conservative_interaction( F const &f = F() ) : m_f( f ) { } - template< typename Point > - Point operator()( Point const& x1 , Point const& x2 ) const - { - Point diff = x1 - x2; - double r = abs( diff ); - double f = m_f( r ); - return - diff / r * f; - } -}; - -template< typename F > -conservative_interaction< F > make_conservative_interaction( F const &f ) -{ - return conservative_interaction< F >( f ); -} - - - - - - - -// force = interaction( x1 , x2 ) -// force = local_force( x , v ) -template< typename LocalForce , typename Interaction > -class md_system_bs -{ -public: - - typedef std::vector< double > vector_type; - typedef point< double , 2 > point_type; - typedef point< int , 2 > index_type; - typedef std::vector< point_type > point_vector; - typedef std::vector< index_type > index_vector; - typedef std::vector< size_t > hash_vector; - typedef LocalForce local_force_type; - typedef Interaction interaction_type; - - - struct params - { - size_t n; - size_t n_cell_x , n_cell_y , n_cells; - double x_max , y_max , cell_size; - double eps , sigma; // interaction strength, interaction radius - interaction_type interaction; - local_force_type local_force; - }; - - - struct cell_functor - { - params const &m_p; - - cell_functor( params const& p ) : m_p( p ) { } - - template< typename Tuple > - void operator()( Tuple const& t ) const - { - auto point = boost::get< 0 >( t ); - size_t i1 = size_t( point[0] / m_p.cell_size ) , i2 = size_t( point[1] / m_p.cell_size ); - boost::get< 1 >( t ) = index_type( i1 , i2 ); - boost::get< 2 >( t ) = hash_func( boost::get< 1 >( t ) , m_p ); - } - }; - - - - struct transform_functor : public std::unary_function< size_t , size_t > - { - hash_vector const* m_index; - transform_functor( hash_vector const& index ) : m_index( &index ) { } - size_t operator()( size_t i ) const { return (*m_index)[i]; } - }; - - - - struct interaction_functor - { - hash_vector const &m_cells_begin; - hash_vector const &m_cells_end; - hash_vector const &m_order; - point_vector const &m_x; - point_vector const &m_v; - params const &m_p; - size_t m_ncellx , m_ncelly; - - interaction_functor( hash_vector const& cells_begin , hash_vector const& cells_end , hash_vector pos_order , - point_vector const&x , point_vector const& v , params const &p ) - : m_cells_begin( cells_begin ) , m_cells_end( cells_end ) , m_order( pos_order ) , m_x( x ) , m_v( v ) , - m_p( p ) { } - - template< typename Tuple > - void operator()( Tuple const &t ) const - { - point_type x = periodic_bc( boost::get< 0 >( t ) , m_p ) , v = boost::get< 1 >( t ); - index_type index = boost::get< 3 >( t ); - size_t pos_hash = boost::get< 4 >( t ); - - point_type a = m_p.local_force( x , v ); - - for( int i=-1 ; i<=1 ; ++i ) - { - for( int j=-1 ; j<=1 ; ++j ) - { - index_type cell_index = index + index_type( i , j ); - size_t cell_hash = hash_func( cell_index , m_p ); - for( size_t ii = m_cells_begin[ cell_hash ] ; ii < m_cells_end[ cell_hash ] ; ++ii ) - { - if( m_order[ ii ] == pos_hash ) continue; - point_type x2 = periodic_bc( m_x[ m_order[ ii ] ] , m_p ); - - if( cell_index[0] >= m_p.n_cell_x ) x2[0] += m_p.x_max; - if( cell_index[0] < 0 ) x2[0] -= m_p.x_max; - if( cell_index[1] >= m_p.n_cell_y ) x2[1] += m_p.y_max; - if( cell_index[1] < 0 ) x2[1] -= m_p.y_max; - - a += m_p.interaction( x , x2 ); - } - } - } - boost::get< 2 >( t ) = a; - } - }; - - - - - md_system_bs( size_t n , - local_force_type const& local_force = local_force_type() , - interaction_type const& interaction = interaction_type() , - double xmax = 100.0 , double ymax = 100.0 , double cell_size = 2.0 ) - : m_p() - { - m_p.n = n; - m_p.x_max = xmax; - m_p.y_max = ymax; - m_p.interaction = interaction; - m_p.local_force = local_force; - m_p.n_cell_x = size_t( xmax / cell_size ); - m_p.n_cell_y = size_t( ymax / cell_size ); - m_p.n_cells = m_p.n_cell_x * m_p.n_cell_y; - m_p.cell_size = cell_size; - } - - void init_point_vector( point_vector &x ) const { x.resize( m_p.n ); } - - void operator()( point_vector const& x , point_vector const& v , point_vector &a , double t ) const - { - // init - hash_vector pos_hash( m_p.n , 0 ); - index_vector pos_index( m_p.n ); - hash_vector pos_order( m_p.n , 0 ); - hash_vector cells_begin( m_p.n_cells ) , cells_end( m_p.n_cells ) , cell_order( m_p.n_cells ); - - boost::iota( pos_order , 0 ); - boost::iota( cell_order , 0 ); - - // calculate grid hash - // calcHash( m_dGridParticleHash, m_dGridParticleIndex, dPos, m_numParticles); - std::for_each( - boost::make_zip_iterator( boost::make_tuple( x.begin() , pos_index.begin() , pos_hash.begin() ) ) , - boost::make_zip_iterator( boost::make_tuple( x.end() , pos_index.end() , pos_hash.end() ) ) , - cell_functor( m_p ) ); - -// // sort particles based on hash -// // sortParticles(m_dGridParticleHash, m_dGridParticleIndex, m_numParticles); - boost::sort( pos_order , [&]( size_t i1 , size_t i2 ) -> bool { - return pos_hash[i1] < pos_hash[i2]; } ); - - - - // reorder particle arrays into sorted order and find start and end of each cell - std::for_each( cell_order.begin() , cell_order.end() , [&]( size_t i ) { - auto pos_begin = boost::make_transform_iterator( pos_order.begin() , transform_functor( pos_hash ) ); - auto pos_end = boost::make_transform_iterator( pos_order.end() , transform_functor( pos_hash ) ); - cells_begin[ i ] = std::distance( pos_begin , std::lower_bound( pos_begin , pos_end , i ) ); - cells_end[ i ] = std::distance( pos_begin , std::upper_bound( pos_begin , pos_end , i ) ); - } ); - - std::for_each( - boost::make_zip_iterator( boost::make_tuple( - x.begin() , - v.begin() , - a.begin() , - pos_index.begin() , - boost::counting_iterator< size_t >( 0 ) - ) ) , - boost::make_zip_iterator( boost::make_tuple( - x.end() , - v.end() , - a.end() , - pos_index.end() , - boost::counting_iterator< size_t >( m_p.n ) - ) ) , - interaction_functor( cells_begin , cells_end , pos_order , x , v , m_p ) ); - } - - void bc( point_vector &x ) - { - for( size_t i=0 ; i= 0.0 ? tmp : tmp + xmax; - } - - - static inline point_type periodic_bc( point_type const& x , params const& p ) - { - return point_type( periodic_bc( x[0] , p.x_max ) , periodic_bc( x[1] , p.y_max ) ); - } - - - static inline int check_interval( int i , int max ) - { - int tmp = i % max; - return tmp >= 0 ? tmp : tmp + max; - } - - - static inline size_t hash_func( index_type index , params const & p ) - { - size_t i1 = check_interval( index[0] , p.n_cell_x ); - size_t i2 = check_interval( index[1] , p.n_cell_y ); - return i1 * p.n_cell_y + i2; - } - - params m_p; -}; - - -template< typename LocalForce , typename Interaction > -md_system_bs< LocalForce , Interaction > make_md_system_bs( size_t n , LocalForce const &f1 , Interaction const &f2 , - double xmax = 100.0 , double ymax = 100.0 , double cell_size = 2.0 ) -{ - return md_system_bs< LocalForce , Interaction >( n , f1 , f2 , xmax , ymax , cell_size ); -} - - - - - - -using namespace boost::numeric::odeint; - - - -int main( int argc , char *argv[] ) -{ - const size_t n1 = 32; - const size_t n2 = 32; - const size_t n = n1 * n2; - auto sys = make_md_system_bs( n , local_force() , make_conservative_interaction( lennard_jones() ) , 100.0 , 100.0 , 2.0 ); - typedef decltype( sys ) system_type; - typedef system_type::point_vector point_vector; - - std::mt19937 rng; - std::normal_distribution<> dist( 0.0 , 1.0 ); - - point_vector x , v; - sys.init_point_vector( x ); - sys.init_point_vector( v ); - - for( size_t i=0 ; i stepper; - const double dt = 0.025; - double t = 0.0; - // std::cout << "set term x11" << endl; - for( size_t oi=0 ; oi<10000 ; ++oi ) - { - for( size_t ii=0 ; ii<50 ; ++ii,t+=dt ) - stepper.do_step( sys , std::make_pair( std::ref( x ) , std::ref( v ) ) , t , dt ); - sys.bc( x ); - - std::cout << "set size square" << "\n"; - std::cout << "unset key" << "\n"; - std::cout << "p [0:" << sys.m_p.x_max << "][0:" << sys.m_p.y_max << "] '-' pt 7 ps 0.5" << "\n"; - for( size_t i=0 ; iBOOST_ALL_NO_LIB=1 - /boost//mpi - /boost//timer - ; - -exe phase_chain : phase_chain.cpp ; diff --git a/libs/numeric/odeint/examples/mpi/phase_chain.cpp b/libs/numeric/odeint/examples/mpi/phase_chain.cpp deleted file mode 100644 index 258c2f21d..000000000 --- a/libs/numeric/odeint/examples/mpi/phase_chain.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/* - * phase_chain.cpp - * - * Example of MPI parallelization with odeint - * - * Copyright 2013 Karsten Ahnert - * Copyright 2013 Mario Mulansky - * Copyright 2013 Pascal Germroth - * Distributed under the 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 -#include -#include -#include -//[phase_chain_mpi_header -#include -#include -//] - -using namespace std; -using namespace boost::numeric::odeint; -using boost::timer::cpu_timer; -using boost::math::double_constants::pi; - -//[phase_chain_state -typedef mpi_state< vector > state_type; -//] - -//[phase_chain_mpi_rhs -struct phase_chain_mpi_state -{ - phase_chain_mpi_state( double gamma = 0.5 ) - : m_gamma( gamma ) { } - - void operator()( const state_type &x , state_type &dxdt , double /* t */ ) const - { - const size_t M = x().size(); - const bool have_left = x.world.rank() > 0, - have_right = x.world.rank() < x.world.size()-1; - double x_left, x_right; - boost::mpi::request r_left, r_right; - if( have_left ) - { - x.world.isend( x.world.rank()-1 , 0 , x().front() ); // send to x_right - r_left = x.world.irecv( x.world.rank()-1 , 0 , x_left ); // receive from x().back() - } - if( have_right ) - { - x.world.isend( x.world.rank()+1 , 0 , x().back() ); // send to x_left - r_right = x.world.irecv( x.world.rank()+1 , 0 , x_right ); // receive from x().front() - } - for(size_t m = 1 ; m < M-1 ; ++m) - { - dxdt()[m] = coupling_func( x()[m+1] - x()[m] ) + - coupling_func( x()[m-1] - x()[m] ); - } - dxdt()[0] = coupling_func( x()[1] - x()[0] ); - if( have_left ) - { - r_left.wait(); - dxdt()[0] += coupling_func( x_left - x().front() ); - } - dxdt()[M-1] = coupling_func( x()[M-2] - x()[M-1] ); - if( have_right ) - { - r_right.wait(); - dxdt()[M-1] += coupling_func( x_right - x().back() ); - } - } - - double coupling_func( double x ) const - { - return sin( x ) - m_gamma * ( 1.0 - cos( x ) ); - } - - double m_gamma; -}; -//] - - -int main( int argc , char **argv ) -{ - //[phase_chain_mpi_init - boost::mpi::environment env( argc , argv ); - boost::mpi::communicator world; - - const size_t N = 131101; - vector x; - if( world.rank() == 0 ) - { - x.resize( N ); - boost::random::uniform_real_distribution distribution( 0.0 , 2.0*pi ); - boost::random::mt19937 engine( 0 ); - generate( x.begin() , x.end() , boost::bind( distribution , engine ) ); - } - - state_type x_split( world ); - split( x , x_split ); - //] - - - cpu_timer timer; - //[phase_chain_mpi_integrate - integrate_n_steps( runge_kutta4() , phase_chain_mpi_state( 1.2 ) , - x_split , 0.0 , 0.01 , 100 ); - unsplit( x_split , x ); - //] - - if( world.rank() == 0 ) - { - double run_time = static_cast(timer.elapsed().wall) * 1.0e-9; - std::cerr << run_time << "s" << std::endl; - // copy(x.begin(), x.end(), ostream_iterator(cout, "\n")); - } - - return 0; -} diff --git a/libs/numeric/odeint/examples/mtl/Jamfile.v2 b/libs/numeric/odeint/examples/mtl/Jamfile.v2 deleted file mode 100644 index 9f4ffb0f3..000000000 --- a/libs/numeric/odeint/examples/mtl/Jamfile.v2 +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright 2011-2013 Mario Mulansky -# Copyright 2012 Karsten Ahnert -# Distributed under the Boost Software License, Version 1.0. (See -# accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - -# set your MTL4 directory here -MTL4_INCLUDE = /home/mario/MTL4 ; - -project - : requirements - $(MTL4_INCLUDE) - BOOST_ALL_NO_LIB=1 - ; - -exe gauss_packet : gauss_packet.cpp ; -exe implicit_euler_mtl : implicit_euler_mtl.cpp ; \ No newline at end of file diff --git a/libs/numeric/odeint/examples/mtl/gauss_packet.cpp b/libs/numeric/odeint/examples/mtl/gauss_packet.cpp deleted file mode 100644 index 9579e5d45..000000000 --- a/libs/numeric/odeint/examples/mtl/gauss_packet.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* - * gauss_packet.cpp - * - * Schroedinger equation with potential barrier and periodic boundary conditions - * Initial Gauss packet moving to the right - * - * pipe output into gnuplot to see animation - * - * Implementation of Hamilton operator via MTL library - * - * Copyright 2011-2013 Mario Mulansky - * Copyright 2011-2012 Karsten Ahnert - * - * Distributed under the 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 -#include - -#include -#include - -#include - - -using namespace std; -using namespace boost::numeric::odeint; - -typedef mtl::dense_vector< complex< double > > state_type; - -struct hamiltonian { - - typedef mtl::compressed2D< complex< double > > matrix_type; - matrix_type m_H; - - hamiltonian( const int N ) : m_H( N , N ) - { - // constructor with zero potential - m_H = 0.0; - initialize_kinetic_term(); - } - - //template< mtl::compressed2D< double > > - hamiltonian( mtl::compressed2D< double > &V ) : m_H( num_rows( V ) , num_cols( V ) ) - { - // use potential V in hamiltonian - m_H = complex( 0.0 , -1.0 ) * V; - initialize_kinetic_term(); - } - - void initialize_kinetic_term( ) - { - const int N = num_rows( m_H ); - mtl::matrix::inserter< matrix_type , mtl::update_plus< complex > > ins( m_H ); - const double z = 1.0; - // fill diagonal and upper and lower diagonal - for( int i = 0 ; i( 0.0 , -z ); - ins[ i ][ i ] << complex< double >( 0.0 , z ); - ins[ (i+1) % N ][ i ] << complex< double >( 0.0 , -z ); - } - } - - void operator()( const state_type &psi , state_type &dpsidt , const double t ) - { - dpsidt = m_H * psi; - } - -}; - -struct write_for_gnuplot -{ - size_t m_every , m_count; - - write_for_gnuplot( size_t every = 10 ) - : m_every( every ) , m_count( 0 ) { } - - void operator()( const state_type &x , double t ) - { - if( ( m_count % m_every ) == 0 ) - { - //clog << t << endl; - cout << "p [0:" << mtl::size(x) << "][0:0.02] '-'" << endl; - for( size_t i=0 ; i( 0.0 , k0*i ) ); - //x[i] += 2.0*exp( -(i+N0-N)*(i+N0-N) / ( 4.0*sigma0*sigma0 ) ) * exp( complex< double >( 0.0 , -k0*i ) ); - } - x /= mtl::two_norm( x ); - - typedef runge_kutta4< state_type > stepper; - - // create potential barrier - mtl::compressed2D< double > V( N , N ); - V = 0.0; - { - mtl::matrix::inserter< mtl::compressed2D< double > > ins( V ); - for( int i=0 ; i -#include -#include -#include "time.h" - -#include -#include -#include - -#include - -using namespace std; -using namespace boost::numeric::odeint; - -namespace phoenix = boost::phoenix; - - - -typedef mtl::dense_vector< double > vec_mtl4; -typedef mtl::compressed2D< double > mat_mtl4; - -typedef boost::numeric::ublas::vector< double > vec_ublas; -typedef boost::numeric::ublas::matrix< double > mat_ublas; - - -// two systems defined 1 & 2 both are mostly sparse with the number of element variable -struct system1_mtl4 -{ - - void operator()( const vec_mtl4 &x , vec_mtl4 &dxdt , double t ) - { - int size = mtl::size(x); - - dxdt[ 0 ] = -0.06*x[0]; - - for (int i =1; i< size ; ++i){ - - dxdt[ i ] = 4.2*x[i-1]-2.2*x[i]*x[i]; - } - - } -}; - -struct jacobi1_mtl4 -{ - void operator()( const vec_mtl4 &x , mat_mtl4 &J , const double &t ) - { - int size = mtl::size(x); - mtl::matrix::inserter ins(J); - - ins[0][0]=-0.06; - - for (int i =1; i< size ; ++i) - { - ins[i][i-1] = + 4.2; - ins[i][i] = -4.2*x[i]; - } - } -}; - - - -struct system1_ublas -{ - - void operator()( const vec_ublas &x , vec_ublas &dxdt , double t ) - { - int size = x.size(); - - dxdt[ 0 ] = -0.06*x[0]; - - for (int i =1; i< size ; ++i){ - - dxdt[ i ] = 4.2*x[i-1]-2.2*x[i]*x[i]; - } - - } -}; - -struct jacobi1_ublas -{ - void operator()( const vec_ublas &x , mat_ublas &J , const double &t ) - { - int size = x.size(); -// mtl::matrix::inserter ins(J); - - J(0,0)=-0.06; - - for (int i =1; i< size ; ++i){ -//ins[i][0]=120.0*x[i]; - J(i,i-1) = + 4.2; - J(i,i) = -4.2*x[i]; - - } - } -}; - -struct system2_mtl4 -{ - - void operator()( const vec_mtl4 &x , vec_mtl4 &dxdt , double t ) - { - int size = mtl::size(x); - - - for (int i =0; i< size/5 ; i+=5){ - - dxdt[ i ] = -0.5*x[i]; - dxdt[i+1]= +25*x[i+1]*x[i+2]-740*x[i+3]*x[i+3]+4.2e-2*x[i]; - dxdt[i+2]= +25*x[i]*x[i]-740*x[i+3]*x[i+3]; - dxdt[i+3]= -25*x[i+1]*x[i+2]+740*x[i+3]*x[i+3]; - dxdt[i+4] = 0.250*x[i]*x[i+1]-44.5*x[i+3]; - - } - - } -}; - -struct jacobi2_mtl4 -{ - void operator()( const vec_mtl4 &x , mat_mtl4 &J , const double &t ) - { - int size = mtl::size(x); - mtl::matrix::inserter ins(J); - - for (int i =0; i< size/5 ; i+=5){ - - ins[ i ][i] = -0.5; - ins[i+1][i+1]=25*x[i+2]; - ins[i+1][i+2] = 25*x[i+1]; - ins[i+1][i+3] = -740*2*x[i+3]; - ins[i+1][i] =+4.2e-2; - - ins[i+2][i]= 50*x[i]; - ins[i+2][i+3]= -740*2*x[i+3]; - ins[i+3][i+1] = -25*x[i+2]; - ins[i+3][i+2] = -25*x[i+1]; - ins[i+3][i+3] = +740*2*x[i+3]; - ins[i+4][i] = 0.25*x[i+1]; - ins[i+4][i+1] =0.25*x[i]; - ins[i+4][i+3]=-44.5; - - - - } - } -}; - - - -struct system2_ublas -{ - - void operator()( const vec_ublas &x , vec_ublas &dxdt , double t ) - { - int size = x.size(); - for (int i =0; i< size/5 ; i+=5){ - - dxdt[ i ] = -4.2e-2*x[i]; - dxdt[i+1]= +25*x[i+1]*x[i+2]-740*x[i+3]*x[i+3]+4.2e-2*x[i]; - dxdt[i+2]= +25*x[i]*x[i]-740*x[i+3]*x[i+3]; - dxdt[i+3]= -25*x[i+1]*x[i+2]+740*x[i+3]*x[i+3]; - dxdt[i+4] = 0.250*x[i]*x[i+1]-44.5*x[i+3]; - - } - - } -}; - -struct jacobi2_ublas -{ - void operator()( const vec_ublas &x , mat_ublas &J , const double &t ) - { - int size = x.size(); - - for (int i =0; i< size/5 ; i+=5){ - - J(i ,i) = -4.2e-2; - J(i+1,i+1)=25*x[i+2]; - J(i+1,i+2) = 25*x[i+1]; - J(i+1,i+3) = -740*2*x[i+3]; - J(i+1,i) =+4.2e-2; - - J(i+2,i)= 50*x[i]; - J(i+2,i+3)= -740*2*x[i+3]; - J(i+3,i+1) = -25*x[i+2]; - J(i+3,i+2) = -25*x[i+1]; - J(i+3,i+3) = +740*2*x[i+3]; - J(i+4,i) = 0.25*x[i+1]; - J(i+4,i+1) =0.25*x[i]; - J(i+4,i+3)=-44.5; - - - - } - - - } -}; - - - - -void testRidiculouslyMassiveArray( int size ) -{ - typedef boost::numeric::odeint::implicit_euler_mtl4 < double > mtl4stepper; - typedef boost::numeric::odeint::implicit_euler< double > booststepper; - - vec_mtl4 x(size , 0.0); - x[0]=1; - - - double dt = 0.02; - double endtime = 10.0; - - clock_t tstart_mtl4 = clock(); - size_t num_of_steps_mtl4 = integrate_const( - mtl4stepper() , - make_pair( system1_mtl4() , jacobi1_mtl4() ) , - x , 0.0 , endtime , dt ); - clock_t tend_mtl4 = clock() ; - - clog << x[0] << endl; - clog << num_of_steps_mtl4 << " time elapsed: " << (double)(tend_mtl4-tstart_mtl4 )/CLOCKS_PER_SEC << endl; - - vec_ublas x_ublas(size , 0.0); - x_ublas[0]=1; - - clock_t tstart_boost = clock(); - size_t num_of_steps_ublas = integrate_const( - booststepper() , - make_pair( system1_ublas() , jacobi1_ublas() ) , - x_ublas , 0.0 , endtime , dt ); - clock_t tend_boost = clock() ; - - clog << x_ublas[0] << endl; - clog << num_of_steps_ublas << " time elapsed: " << (double)(tend_boost-tstart_boost)/CLOCKS_PER_SEC<< endl; - - clog << "dt_ublas/dt_mtl4 = " << (double)( tend_boost-tstart_boost )/( tend_mtl4-tstart_mtl4 ) << endl << endl; - return ; -} - - - -void testRidiculouslyMassiveArray2( int size ) -{ - typedef boost::numeric::odeint::implicit_euler_mtl4 < double > mtl4stepper; - typedef boost::numeric::odeint::implicit_euler< double > booststepper; - - - vec_mtl4 x(size , 0.0); - x[0]=100; - - - double dt = 0.01; - double endtime = 10.0; - - clock_t tstart_mtl4 = clock(); - size_t num_of_steps_mtl4 = integrate_const( - mtl4stepper() , - make_pair( system1_mtl4() , jacobi1_mtl4() ) , - x , 0.0 , endtime , dt ); - - - clock_t tend_mtl4 = clock() ; - - clog << x[0] << endl; - clog << num_of_steps_mtl4 << " time elapsed: " << (double)(tend_mtl4-tstart_mtl4 )/CLOCKS_PER_SEC << endl; - - vec_ublas x_ublas(size , 0.0); - x_ublas[0]=100; - - clock_t tstart_boost = clock(); - size_t num_of_steps_ublas = integrate_const( - booststepper() , - make_pair( system1_ublas() , jacobi1_ublas() ) , - x_ublas , 0.0 , endtime , dt ); - - - clock_t tend_boost = clock() ; - - clog << x_ublas[0] << endl; - clog << num_of_steps_ublas << " time elapsed: " << (double)(tend_boost-tstart_boost)/CLOCKS_PER_SEC<< endl; - - clog << "dt_ublas/dt_mtl4 = " << (double)( tend_boost-tstart_boost )/( tend_mtl4-tstart_mtl4 ) << endl << endl; - return ; -} - - - - -int main( int argc , char **argv ) -{ - std::vector< size_t > length; - length.push_back( 8 ); - length.push_back( 16 ); - length.push_back( 32 ); - length.push_back( 64 ); - length.push_back( 128 ); - length.push_back( 256 ); - - for( size_t i=0 ; iBOOST_ALL_NO_LIB=1 - : - ; - - -exe lorenz_mp : lorenz_mp.cpp ; -exe cmp_precision : cmp_precision.cpp ; diff --git a/libs/numeric/odeint/examples/multiprecision/cmp_precision.cpp b/libs/numeric/odeint/examples/multiprecision/cmp_precision.cpp deleted file mode 100644 index 779b5e290..000000000 --- a/libs/numeric/odeint/examples/multiprecision/cmp_precision.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* Boost libs/numeric/odeint/examples/multiprecision/cmp_precision.cpp - - Copyright 2013 Karsten Ahnert - Copyright 2013 Mario Mulansky - - example comparing double to multiprecision using Boost.Multiprecision - - Distributed under the 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 -#include -#include - -using namespace std; -using namespace boost::numeric::odeint; - -typedef boost::multiprecision::cpp_dec_float_50 mp_50; - -/* we solve the simple ODE x' = 3/(2t^2) + x/(2t) - * with initial condition x(1) = 0. - * Analytic solution is x(t) = sqrt(t) - 1/t - */ - -void rhs_m( const mp_50 x , mp_50 &dxdt , const mp_50 t ) -{ // version for multiprecision - dxdt = mp_50(3)/(mp_50(2)*t*t) + x/(mp_50(2)*t); -} - -void rhs_d( const double x , double &dxdt , const double t ) -{ // version for double precision - dxdt = 3.0/(2.0*t*t) + x/(2.0*t); -} - -// state_type = mp_50 = deriv_type = time_type = mp_50 -typedef runge_kutta4< mp_50 , mp_50 , mp_50 , mp_50 , vector_space_algebra , default_operations , never_resizer > stepper_type_m; - -typedef runge_kutta4< double , double , double , double , vector_space_algebra , default_operations , never_resizer > stepper_type_d; - -int main() -{ - - stepper_type_m stepper_m; - stepper_type_d stepper_d; - - mp_50 dt_m( 0.5 ); - double dt_d( 0.5 ); - - cout << "dt" << '\t' << "mp" << '\t' << "double" << endl; - - while( dt_m > 1E-20 ) - { - - mp_50 x_m = 0; //initial value x(1) = 0 - stepper_m.do_step( rhs_m , x_m , mp_50( 1 ) , dt_m ); - double x_d = 0; - stepper_d.do_step( rhs_d , x_d , 1.0 , dt_d ); - - cout << dt_m << '\t'; - cout << abs((x_m - (sqrt(1+dt_m)-mp_50(1)/(1+dt_m)))/x_m) << '\t' ; - cout << abs((x_d - (sqrt(1+dt_d)-mp_50(1)/(1+dt_d)))/x_d) << endl ; - dt_m /= 2; - dt_d /= 2; - } -} diff --git a/libs/numeric/odeint/examples/multiprecision/lorenz_mp.cpp b/libs/numeric/odeint/examples/multiprecision/lorenz_mp.cpp deleted file mode 100644 index c3e5b82e8..000000000 --- a/libs/numeric/odeint/examples/multiprecision/lorenz_mp.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - * lorenz_mp.cpp - * - * This example demonstrates how odeint can be used with boost.multiprecision. - * - * Copyright 2011-2012 Karsten Ahnert - * Copyright 2013 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) - */ - - - -#include - -//[ mp_lorenz_defs -#include -#include - -using namespace std; -using namespace boost::numeric::odeint; - -typedef boost::multiprecision::cpp_dec_float_50 value_type; - -typedef boost::array< value_type , 3 > state_type; -//] - -//[ mp_lorenz_rhs -struct lorenz -{ - void operator()( const state_type &x , state_type &dxdt , value_type t ) const - { - const value_type sigma( 10 ); - const value_type R( 28 ); - const value_type b( value_type( 8 ) / value_type( 3 ) ); - - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; - } -}; -//] - - - - -struct streaming_observer -{ - std::ostream& m_out; - - streaming_observer( std::ostream &out ) : m_out( out ) { } - - template< class State , class Time > - void operator()( const State &x , Time t ) const - { - m_out << t; - for( size_t i=0 ; i() , - lorenz() , x , value_type( 0.0 ) , value_type( 10.0 ) , value_type( value_type( 1.0 ) / value_type( 10.0 ) ) , - streaming_observer( cout ) ); - //] - - return 0; -} diff --git a/libs/numeric/odeint/examples/my_vector.cpp b/libs/numeric/odeint/examples/my_vector.cpp deleted file mode 100644 index 746dfaada..000000000 --- a/libs/numeric/odeint/examples/my_vector.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright 2011-2012 Mario Mulansky - * Copyright 2012-2013 Karsten Ahnert - * - * Distributed under the Boost Software License, Version 1.0. - * (See accompanying file LICENSE_1_0.txt or - * copy at http://www.boost.org/LICENSE_1_0.txt) - * - * Example for self defined vector type. - */ - -#include - -#include - -//[my_vector -template< size_t MAX_N > -class my_vector -{ - typedef std::vector< double > vector; - -public: - typedef vector::iterator iterator; - typedef vector::const_iterator const_iterator; - -public: - my_vector( const size_t N ) - : m_v( N ) - { - m_v.reserve( MAX_N ); - } - - my_vector() - : m_v() - { - m_v.reserve( MAX_N ); - } - -// ... [ implement container interface ] -//] - const double & operator[]( const size_t n ) const - { return m_v[n]; } - - double & operator[]( const size_t n ) - { return m_v[n]; } - - iterator begin() - { return m_v.begin(); } - - const_iterator begin() const - { return m_v.begin(); } - - iterator end() - { return m_v.end(); } - - const_iterator end() const - { return m_v.end(); } - - size_t size() const - { return m_v.size(); } - - void resize( const size_t n ) - { m_v.resize( n ); } - -private: - std::vector< double > m_v; - -}; - -//[my_vector_resizeable -// define my_vector as resizeable - -namespace boost { namespace numeric { namespace odeint { - -template -struct is_resizeable< my_vector > -{ - typedef boost::true_type type; - static const bool value = type::value; -}; - -} } } -//] - - -typedef my_vector<3> state_type; - -void lorenz( const state_type &x , state_type &dxdt , const double t ) -{ - const double sigma( 10.0 ); - const double R( 28.0 ); - const double b( 8.0 / 3.0 ); - - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; -} - -using namespace boost::numeric::odeint; - -int main() -{ - state_type x(3); - x[0] = 5.0 ; x[1] = 10.0 ; x[2] = 10.0; - - // make sure resizing is ON - BOOST_STATIC_ASSERT( is_resizeable::value == true ); - - // my_vector works with range_algebra as it implements - // the required parts of a container interface - // no further work is required - - integrate_const( runge_kutta4< state_type >() , lorenz , x , 0.0 , 10.0 , 0.1 ); -} diff --git a/libs/numeric/odeint/examples/nt2/Jamfile.v2 b/libs/numeric/odeint/examples/nt2/Jamfile.v2 deleted file mode 100644 index 05847cd17..000000000 --- a/libs/numeric/odeint/examples/nt2/Jamfile.v2 +++ /dev/null @@ -1,34 +0,0 @@ -#============================================================================== -# Copyright 2014 LRI UMR 8623 CNRS/Univ Paris Sud XI -# Copyright 2014 NumScale SAS -# -# Distributed under the Boost Software License, Version 1.0. -# See accompanying file LICENSE.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt -#============================================================================== - -use-project boost : $(BOOST_ROOT) ; - -import os ; - -# This must be built using an NT2 installation. -# NT2_ROOT_PATH should point to the build directory. -# Currently, cxxflags needs to be set to the required architecture -# if using avx/avx2, set the environemnt variable NT2_SIMD_FLAGS to the -# required value for your compiler (i.e. -mavx2 on g++) -# If using sse2/3/4 in 64 bits, this is set automatically. - -local NT2_ROOT_PATH = [ os.environ NT2_ROOT_PATH ] ; -local NT2_SIMD_FLAGS = [ os.environ NT2_SIMD_FLAGS ] ; - -project - : requirements - BOOST_ALL_NO_LIB=1 - $(NT2_ROOT_PATH)/include/ - static - gcc:-DBOOST_SIMD_NO_STRICT_ALIASING - gcc:-fno-strict-aliasing - $(NT2_SIMD_FLAGS) - ; - -exe phase_oscillator_ensemble : phase_oscillator_ensemble.cpp ; diff --git a/libs/numeric/odeint/examples/nt2/phase_oscillator_ensemble.cpp b/libs/numeric/odeint/examples/nt2/phase_oscillator_ensemble.cpp deleted file mode 100644 index 1f28623cd..000000000 --- a/libs/numeric/odeint/examples/nt2/phase_oscillator_ensemble.cpp +++ /dev/null @@ -1,170 +0,0 @@ -//============================================================================== -// Copyright 2011-2014 Karsten Ahnert -// Copyright 2011-2014 Mario Mulansky -// Copyright 2014 LRI UMR 8623 CNRS/Univ Paris Sud XI -// Copyright 2014 NumScale SAS -// -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt -//============================================================================== - -#include -#include - -#include - -#ifndef M_PI //not there on windows -#define M_PI 3.141592653589793 //... -#endif - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - - -using namespace std; -using namespace boost::numeric::odeint; - -template -pair< T, T > calc_mean_field( const container_type &x ) - -{ - T cos_sum = 0.0 , sin_sum = 0.0; - - nt2::tie(cos_sum,sin_sum) = nt2::tie(nt2::mean( nt2::cos(x) ), nt2::mean( nt2::sin(x) )); - - T K = nt2::hypot(sin_sum,cos_sum); - T Theta = nt2::atan2( sin_sum , cos_sum ); - - return make_pair( K , Theta ); -} - -template -struct phase_ensemble -{ - typedef typename boost::dispatch::meta::as_integer::type int_type; - container_type m_omega; - T m_epsilon; - - phase_ensemble( const int_type n , T g = 1.0 , T epsilon = 1.0 ) - : m_epsilon( epsilon ) - { - m_omega = nt2::zeros(nt2::of_size(n), nt2::meta::as_()); - create_frequencies( g ); - } - - void create_frequencies( T g ) - { - boost::mt19937 rng; - boost::cauchy_distribution<> cauchy( 0.0 , g ); - boost::variate_generator< boost::mt19937&, boost::cauchy_distribution<> > gen( rng , cauchy ); - generate( m_omega.begin() , m_omega.end() , gen ); -} - - void set_epsilon( T epsilon ) { m_epsilon = epsilon; } - - T get_epsilon( void ) const { return m_epsilon; } - - void operator()( const container_type &x , container_type &dxdt , T ) const - { - pair< T, T > mean = calc_mean_field( x ); - dxdt = m_omega + m_epsilon * mean.first * nt2::sin( mean.second - x ); - } -}; - -template -struct statistics_observer -{ - typedef typename boost::dispatch::meta::as_integer::type int_type; - T m_K_mean; - int_type m_count; - - statistics_observer( void ) - : m_K_mean( 0.0 ) , m_count( 0 ) { } - - template< class State > - void operator()( const State &x , T t ) - { - pair< T, T > mean = calc_mean_field( x ); - m_K_mean += mean.first; - ++m_count; - } - - T get_K_mean( void ) const { return ( m_count != 0 ) ? m_K_mean / T( m_count ) : 0.0 ; } - - void reset( void ) { m_K_mean = 0.0; m_count = 0; } -}; - -template -struct test_ode_table -{ - typedef nt2::table array_type; - typedef void experiment_is_immutable; - - typedef typename boost::dispatch::meta::as_integer::type int_type; - - test_ode_table ( ) - : size_(16384), ensemble( size_ , 1.0 ), unif( 0.0 , 2.0 * M_PI ), gen( rng , unif ), obs() - { - x.resize(nt2::of_size(size_)); - } - - void operator()() - { - for( T epsilon = 0.0 ; epsilon < 5.0 ; epsilon += 0.1 ) - { - ensemble.set_epsilon( epsilon ); - obs.reset(); - - // start with random initial conditions - generate( x.begin() , x.end() , gen ); - // calculate some transients steps - integrate_const( runge_kutta4< array_type, T >() , boost::ref( ensemble ) , x , T(0.0) , T(10.0) , dt ); - - // integrate and compute the statistics - integrate_const( runge_kutta4< array_type, T >() , boost::ref( ensemble ) , x , T(0.0) , T(100.0) , dt , boost::ref( obs ) ); - cout << epsilon << "\t" << obs.get_K_mean() << endl; - } - } - - friend std::ostream& operator<<(std::ostream& os, test_ode_table const& p) - { - return os << "(" << p.size() << ")"; - } - - std::size_t size() const { return size_; } - - private: - std::size_t size_; - phase_ensemble ensemble; - boost::uniform_real<> unif; - array_type x; - boost::mt19937 rng; - boost::variate_generator< boost::mt19937&, boost::uniform_real<> > gen; - statistics_observer obs; - - static const T dt = 0.1; -}; - -int main() -{ - std::cout<< " With T = [double] \n"; - test_ode_table test_double; - test_double(); - - std::cout<< " With T = [float] \n"; - test_ode_table test_float; - test_float(); -} diff --git a/libs/numeric/odeint/examples/openmp/Jamfile.v2 b/libs/numeric/odeint/examples/openmp/Jamfile.v2 deleted file mode 100644 index cef4f670c..000000000 --- a/libs/numeric/odeint/examples/openmp/Jamfile.v2 +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright 2011-2013 Mario Mulansky -# Copyright 2012 Karsten Ahnert -# Copyright 2013 Pascal Germroth -# Distributed under the Boost Software License, Version 1.0. (See -# accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - -use-project /boost : $(BOOST_ROOT) ; -import openmp : * ; - -project - : requirements - .. - BOOST_ALL_NO_LIB=1 - /boost//timer - [ openmp ] - ; - -exe lorenz_ensemble : lorenz_ensemble.cpp ; -exe lorenz_ensemble_simple : lorenz_ensemble_simple.cpp ; -exe lorenz_ensemble_nested : lorenz_ensemble_nested.cpp ; -exe phase_chain : phase_chain.cpp ; -exe phase_chain_omp_state : phase_chain_omp_state.cpp ; diff --git a/libs/numeric/odeint/examples/openmp/lorenz_ensemble.cpp b/libs/numeric/odeint/examples/openmp/lorenz_ensemble.cpp deleted file mode 100644 index 6717a505b..000000000 --- a/libs/numeric/odeint/examples/openmp/lorenz_ensemble.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* Boost libs/numeric/odeint/examples/openmp/lorenz_ensemble.cpp - - Copyright 2013 Karsten Ahnert - Copyright 2013 Mario Mulansky - Copyright 2013 Pascal Germroth - - Parallelized Lorenz ensembles - - Distributed under the 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 -#include -#include -#include -#include -#include -#include -#include "point_type.hpp" - -using namespace std; -using namespace boost::numeric::odeint; - -typedef point point_type; -typedef vector< point_type > inner_state_type; -typedef openmp_state state_type; - -const double sigma = 10.0; -const double b = 8.0 / 3.0; - - -struct sys_func { - const vector &R; - sys_func( vector &R ) : R(R) {} - - void operator()( const state_type &x , state_type &dxdt , double t ) const { -# pragma omp parallel for - for(size_t j = 0 ; j < x.size() ; j++) { - size_t offset = 0; - for(size_t i = 0 ; i < j ; i++) - offset += x[i].size(); - - for(size_t i = 0 ; i < x[j].size() ; i++) { - const point_type &xi = x[j][i]; - point_type &dxdti = dxdt[j][i]; - dxdti[0] = -sigma * (xi[0] - xi[1]); - dxdti[1] = R[offset + i] * xi[0] - xi[1] - xi[0] * xi[2]; - dxdti[2] = -b * xi[2] + xi[0] * xi[1]; - } - } - } -}; - - -int main(int argc, char **argv) { - size_t n = 1024; - if(argc > 1) n = boost::lexical_cast(argv[1]); - - vector R(n); - const double Rmin = 0.1, Rmax = 50.0; -# pragma omp parallel for - for(size_t i = 0 ; i < n ; i++) - R[i] = Rmin + (Rmax - Rmin) / (n - 1) * i; - - vector inner(n, point_type(10, 10, 10)); - state_type state; - split(inner, state); - - cerr << "openmp_state split " << n << " into"; - for(size_t i = 0 ; i != state.size() ; i++) - cerr << ' ' << state[i].size(); - cerr << endl; - - typedef runge_kutta4< state_type, double > stepper; - - const double t_max = 10.0, dt = 0.01; - - integrate_const( - stepper(), - sys_func(R), - state, - 0.0, t_max, dt - ); - - unsplit(state, inner); - std::copy( inner.begin(), inner.end(), ostream_iterator(cout, "\n") ); - - return 0; -} diff --git a/libs/numeric/odeint/examples/openmp/lorenz_ensemble_nested.cpp b/libs/numeric/odeint/examples/openmp/lorenz_ensemble_nested.cpp deleted file mode 100644 index 4609c47a4..000000000 --- a/libs/numeric/odeint/examples/openmp/lorenz_ensemble_nested.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* Boost libs/numeric/odeint/examples/openmp/lorenz_ensemble_nested.cpp - - Copyright 2013 Karsten Ahnert - Copyright 2013 Pascal Germroth - Copyright 2013 Mario Mulansky - - Parallelized Lorenz ensembles using nested omp algebra - - Distributed under the 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 -#include -#include -#include -#include -#include -#include -#include "point_type.hpp" - -using namespace std; -using namespace boost::numeric::odeint; - -typedef point point_type; -typedef vector< point_type > state_type; - -const double sigma = 10.0; -const double b = 8.0 / 3.0; - - -struct sys_func { - const vector &R; - sys_func( vector &R ) : R(R) {} - - void operator()( const state_type &x , state_type &dxdt , double t ) const { -# pragma omp parallel for - for(size_t i = 0 ; i < x.size() ; i++) { - dxdt[i][0] = -sigma * (x[i][0] - x[i][1]); - dxdt[i][1] = R[i] * x[i][0] - x[i][1] - x[i][0] * x[i][2]; - dxdt[i][2] = -b * x[i][2] + x[i][0] * x[i][1]; - } - } -}; - - -int main(int argc, char **argv) { - size_t n = 1024; - if(argc > 1) n = boost::lexical_cast(argv[1]); - - vector R(n); - const double Rmin = 0.1, Rmax = 50.0; -# pragma omp parallel for - for(size_t i = 0 ; i < n ; i++) - R[i] = Rmin + (Rmax - Rmin) / (n - 1) * i; - - state_type state( n , point_type(10, 10, 10) ); - - typedef runge_kutta4< state_type, double , state_type , double , - openmp_nested_algebra > stepper; - - const double t_max = 10.0, dt = 0.01; - - integrate_const( - stepper(), - sys_func(R), - state, - 0.0, t_max, dt - ); - - std::copy( state.begin(), state.end(), ostream_iterator(cout, "\n") ); - - return 0; -} diff --git a/libs/numeric/odeint/examples/openmp/lorenz_ensemble_simple.cpp b/libs/numeric/odeint/examples/openmp/lorenz_ensemble_simple.cpp deleted file mode 100644 index fbaf24999..000000000 --- a/libs/numeric/odeint/examples/openmp/lorenz_ensemble_simple.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* Boost libs/numeric/odeint/examples/openmp/lorenz_ensemble_simple.cpp - - Copyright 2013 Karsten Ahnert - Copyright 2013 Mario Mulansky - Copyright 2013 Pascal Germroth - - Parallelized Lorenz ensembles - - Distributed under the 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 -#include -#include -#include -#include -#include "point_type.hpp" - -using namespace std; - -typedef vector vector_type; -typedef point point_type; -typedef vector state_type; - -const double sigma = 10.0; -const double b = 8.0 / 3.0; - -struct sys_func { - const vector_type &R; - sys_func( const vector_type &_R ) : R( _R ) { } - - void operator()( const state_type &x , state_type &dxdt , double t ) const { - const size_t n = x.size(); -# pragma omp parallel for - for(size_t i = 0 ; i < n ; i++) { - const point_type &xi = x[i]; - point_type &dxdti = dxdt[i]; - dxdti[0] = -sigma * (xi[0] - xi[1]); - dxdti[1] = R[i] * xi[0] - xi[1] - xi[0] * xi[2]; - dxdti[2] = -b * xi[2] + xi[0] * xi[1]; - } - } -}; - - -int main() { - using namespace boost::numeric::odeint; - - const size_t n = 1024; - vector_type R(n); - const double Rmin = 0.1, Rmax = 50.0; -# pragma omp parallel for - for(size_t i = 0 ; i < n ; i++) - R[i] = Rmin + (Rmax - Rmin) / (n - 1) * i; - - state_type X(n, point_type(10, 10, 10)); - - const double t_max = 10.0, dt = 0.01; - - // Simple stepper with constant step size - // typedef runge_kutta4 stepper; - - // integrate_const(stepper(), sys_func(R), X, 0.0, t_max, dt); - - // Controlled stepper with variable step size - typedef runge_kutta_fehlberg78 error_stepper_type; - typedef controlled_runge_kutta controlled_stepper_type; - controlled_stepper_type controlled_stepper; - - integrate_adaptive(controlled_stepper, sys_func(R), X, 0.0, t_max, dt); - - copy( X.begin(), X.end(), ostream_iterator(cout, "\n") ); - - return 0; -} diff --git a/libs/numeric/odeint/examples/openmp/openmp.jam b/libs/numeric/odeint/examples/openmp/openmp.jam deleted file mode 100644 index 226bcf577..000000000 --- a/libs/numeric/odeint/examples/openmp/openmp.jam +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright 2013 Karsten Ahnert -# Copyright 2013 Mario Mulansky -# Copyright 2013 Pascal Germroth -# Distributed under the Boost Software License, Version 1.0. (See -# accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - - -# Only builds target with supported OpenMP enabled toolsets. -# -# use as: -# exe omp : omp.cpp : [ openmp ] ; -# -rule openmp return - # default - no - # GNU C++ - gcc:-fopenmp - gcc:-fopenmp - gcc:yes - # Microsoft Visual C++ - msvc:/openmp - msvc:/openmp - msvc:yes - # Intel C++ - intel-linux:-openmp - intel-linux:-openmp - intel-linux:yes - intel-win:-Qopenmp - intel-win:-Qopenmp - intel-win:yes - # HP aC++ - acc:+Oopenmp - acc:+Oopenmp - acc:yes - # Sun Studio - sun:-xopenmp - sun:-xopenmp - sun:yes - # IBM XL - vacpp:-qsmp=omp - vacpp:-qsmp=omp - vacpp:yes - # PG++ - pgi:-mp - pgi:-mp - pgi:yes - # Pathscale - pathscale:-mp - pathscale:-mp - pathscale:yes - ; diff --git a/libs/numeric/odeint/examples/openmp/phase_chain.cpp b/libs/numeric/odeint/examples/openmp/phase_chain.cpp deleted file mode 100644 index 08876fcce..000000000 --- a/libs/numeric/odeint/examples/openmp/phase_chain.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - * phase_chain.cpp - * - * Example of OMP parallelization with odeint - * - * Copyright 2013 Karsten Ahnert - * Copyright 2013 Mario Mulansky - * Copyright 2013 Pascal Germroth - * Distributed under the 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 -#include -#include -#include -//[phase_chain_openmp_header -#include -#include -#include -//] - -using namespace std; -using namespace boost::numeric::odeint; -using boost::timer::cpu_timer; -using boost::math::double_constants::pi; - -//[phase_chain_vector_state -typedef std::vector< double > state_type; -//] - -//[phase_chain_rhs -struct phase_chain -{ - phase_chain( double gamma = 0.5 ) - : m_gamma( gamma ) { } - - void operator()( const state_type &x , state_type &dxdt , double /* t */ ) const - { - const size_t N = x.size(); - #pragma omp parallel for schedule(runtime) - for(size_t i = 1 ; i < N - 1 ; ++i) - { - dxdt[i] = coupling_func( x[i+1] - x[i] ) + - coupling_func( x[i-1] - x[i] ); - } - dxdt[0 ] = coupling_func( x[1 ] - x[0 ] ); - dxdt[N-1] = coupling_func( x[N-2] - x[N-1] ); - } - - double coupling_func( double x ) const - { - return sin( x ) - m_gamma * ( 1.0 - cos( x ) ); - } - - double m_gamma; -}; -//] - - -int main( int argc , char **argv ) -{ - //[phase_chain_init - size_t N = 131101; - state_type x( N ); - boost::random::uniform_real_distribution distribution( 0.0 , 2.0*pi ); - boost::random::mt19937 engine( 0 ); - generate( x.begin() , x.end() , boost::bind( distribution , engine ) ); - //] - - //[phase_chain_stepper - typedef runge_kutta4< - state_type , double , - state_type , double , - openmp_range_algebra - > stepper_type; - //] - - //[phase_chain_scheduling - int chunk_size = N/omp_get_max_threads(); - omp_set_schedule( omp_sched_static , chunk_size ); - //] - - cpu_timer timer; - //[phase_chain_integrate - integrate_n_steps( stepper_type() , phase_chain( 1.2 ) , - x , 0.0 , 0.01 , 100 ); - //] - double run_time = static_cast(timer.elapsed().wall) * 1.0e-9; - std::cerr << run_time << "s" << std::endl; - // copy(x.begin(), x.end(), ostream_iterator(cout, "\n")); - - return 0; -} diff --git a/libs/numeric/odeint/examples/openmp/phase_chain_omp_state.cpp b/libs/numeric/odeint/examples/openmp/phase_chain_omp_state.cpp deleted file mode 100644 index 8627f58ad..000000000 --- a/libs/numeric/odeint/examples/openmp/phase_chain_omp_state.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* - * phase_chain_omp_state.cpp - * - * Example of OMP parallelization with odeint - * - * Copyright 2013 Karsten Ahnert - * Copyright 2013 Mario Mulansky - * Copyright 2013 Pascal Germroth - * Distributed under the 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 -#include -#include -#include -#include -#include -#include - -#include - -using namespace std; -using namespace boost::numeric::odeint; -using boost::timer::cpu_timer; -using boost::math::double_constants::pi; - -typedef openmp_state state_type; - -//[phase_chain_state_rhs -struct phase_chain_omp_state -{ - phase_chain_omp_state( double gamma = 0.5 ) - : m_gamma( gamma ) { } - - void operator()( const state_type &x , state_type &dxdt , double /* t */ ) const - { - const size_t N = x.size(); - #pragma omp parallel for schedule(runtime) - for(size_t n = 0 ; n < N ; ++n) - { - const size_t M = x[n].size(); - for(size_t m = 1 ; m < M-1 ; ++m) - { - dxdt[n][m] = coupling_func( x[n][m+1] - x[n][m] ) + - coupling_func( x[n][m-1] - x[n][m] ); - } - dxdt[n][0] = coupling_func( x[n][1] - x[n][0] ); - if( n > 0 ) - { - dxdt[n][0] += coupling_func( x[n-1].back() - x[n].front() ); - } - dxdt[n][M-1] = coupling_func( x[n][M-2] - x[n][M-1] ); - if( n < N-1 ) - { - dxdt[n][M-1] += coupling_func( x[n+1].front() - x[n].back() ); - } - } - } - - double coupling_func( double x ) const - { - return sin( x ) - m_gamma * ( 1.0 - cos( x ) ); - } - - double m_gamma; -}; -//] - - -int main( int argc , char **argv ) -{ - //[phase_chain_state_init - const size_t N = 131101; - vector x( N ); - boost::random::uniform_real_distribution distribution( 0.0 , 2.0*pi ); - boost::random::mt19937 engine( 0 ); - generate( x.begin() , x.end() , boost::bind( distribution , engine ) ); - const size_t blocks = omp_get_max_threads(); - state_type x_split( blocks ); - split( x , x_split ); - //] - - - cpu_timer timer; - //[phase_chain_state_integrate - integrate_n_steps( runge_kutta4() , phase_chain_omp_state( 1.2 ) , - x_split , 0.0 , 0.01 , 100 ); - unsplit( x_split , x ); - //] - - double run_time = static_cast(timer.elapsed().wall) * 1.0e-9; - std::cerr << run_time << "s" << std::endl; - // copy(x.begin(), x.end(), ostream_iterator(cout, "\n")); - - return 0; -} diff --git a/libs/numeric/odeint/examples/phase_oscillator_ensemble.cpp b/libs/numeric/odeint/examples/phase_oscillator_ensemble.cpp deleted file mode 100644 index 090fd587b..000000000 --- a/libs/numeric/odeint/examples/phase_oscillator_ensemble.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/* - * phase_oscillator_ensemble.cpp - * - * Demonstrates the phase transition from an unsynchronized to an synchronized state. - * - * Copyright 2011-2012 Karsten Ahnert - * Copyright 2011-2012 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) - * - */ - -#include -#include - -#include - -#ifndef M_PI //not there on windows -#define M_PI 3.141592653589793 //... -#endif - -#include - -using namespace std; -using namespace boost::numeric::odeint; - -//[ phase_oscillator_ensemble_system_function -typedef vector< double > container_type; - - -pair< double , double > calc_mean_field( const container_type &x ) -{ - size_t n = x.size(); - double cos_sum = 0.0 , sin_sum = 0.0; - for( size_t i=0 ; i cauchy( 0.0 , g ); - boost::variate_generator< boost::mt19937&, boost::cauchy_distribution<> > gen( rng , cauchy ); - generate( m_omega.begin() , m_omega.end() , gen ); - } - - void set_epsilon( double epsilon ) { m_epsilon = epsilon; } - - double get_epsilon( void ) const { return m_epsilon; } - - void operator()( const container_type &x , container_type &dxdt , double /* t */ ) const - { - pair< double , double > mean = calc_mean_field( x ); - for( size_t i=0 ; i - void operator()( const State &x , double t ) - { - pair< double , double > mean = calc_mean_field( x ); - m_K_mean += mean.first; - ++m_count; - } - - double get_K_mean( void ) const { return ( m_count != 0 ) ? m_K_mean / double( m_count ) : 0.0 ; } - - void reset( void ) { m_K_mean = 0.0; m_count = 0; } -}; -//] - - - - - - - - -int main( int argc , char **argv ) -{ - //[ phase_oscillator_ensemble_integration - const size_t n = 16384; - const double dt = 0.1; - - container_type x( n ); - - boost::mt19937 rng; - boost::uniform_real<> unif( 0.0 , 2.0 * M_PI ); - boost::variate_generator< boost::mt19937&, boost::uniform_real<> > gen( rng , unif ); - - // gamma = 1, the phase transition occurs at epsilon = 2 - phase_ensemble ensemble( n , 1.0 ); - statistics_observer obs; - - for( double epsilon = 0.0 ; epsilon < 5.0 ; epsilon += 0.1 ) - { - ensemble.set_epsilon( epsilon ); - obs.reset(); - - // start with random initial conditions - generate( x.begin() , x.end() , gen ); - - // calculate some transients steps - integrate_const( runge_kutta4< container_type >() , boost::ref( ensemble ) , x , 0.0 , 10.0 , dt ); - - // integrate and compute the statistics - integrate_const( runge_kutta4< container_type >() , boost::ref( ensemble ) , x , 0.0 , 100.0 , dt , boost::ref( obs ) ); - cout << epsilon << "\t" << obs.get_K_mean() << endl; - } - - - //] - - return 0; -} diff --git a/libs/numeric/odeint/examples/point_type.hpp b/libs/numeric/odeint/examples/point_type.hpp deleted file mode 100644 index 088751108..000000000 --- a/libs/numeric/odeint/examples/point_type.hpp +++ /dev/null @@ -1,177 +0,0 @@ -/* Boost libs/numeric/odeint/examples/point_type.hpp - - Copyright 2010-2012 Karsten Ahnert - Copyright 2011 Mario Mulansky - - solar system example for Hamiltonian stepper - - Distributed under the 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 POINT_TYPE_HPP_INCLUDED -#define POINT_TYPE_HPP_INCLUDED - - -#include -#include - - -//[ point_type -/*the point type */ -template< class T , size_t Dim > -class point : - boost::additive1< point< T , Dim > , - boost::additive2< point< T , Dim > , T , - boost::multiplicative2< point< T , Dim > , T - > > > - { - public: - - const static size_t dim = Dim; - typedef T value_type; - typedef point< value_type , dim > point_type; - - // ... - // constructors - //<- - point( void ) - { - for( size_t i=0 ; i 0 ) m_val[0] = x; - if( dim > 1 ) m_val[1] = y; - if( dim > 2 ) m_val[2] = z; - } - //-> - - // ... - // operators - //<- - T operator[]( size_t i ) const { return m_val[i]; } - T& operator[]( size_t i ) { return m_val[i]; } - - point_type& operator+=( const point_type& p ) - { - for( size_t i=0 ; i - - private: - - T m_val[dim]; - }; - - //... - // more operators - //] - - // - // the - operator - // - template< class T , size_t Dim > - point< T , Dim > operator-( const point< T , Dim > &p ) - { - point< T , Dim > tmp; - for( size_t i=0 ; i - T scalar_prod( const point< T , Dim > &p1 , const point< T , Dim > &p2 ) - { - T tmp = 0.0; - for( size_t i=0 ; i - T norm( const point< T , Dim > &p1 ) - { - return scalar_prod( p1 , p1 ); - } - - - - - // - // absolute value - // - template< class T , size_t Dim > - T abs( const point< T , Dim > &p1 ) - { - return sqrt( norm( p1 ) ); - } - - - - - // - // output operator - // - template< class T , size_t Dim > - std::ostream& operator<<( std::ostream &out , const point< T , Dim > &p ) - { - if( Dim > 0 ) out << p[0]; - for( size_t i=1 ; iBOOST_ALL_NO_LIB=1 - : - ; - -lib quadmath : : quadmath shared ; - -exe black_hole : black_hole.cpp quadmath : -std=c++0x ; \ No newline at end of file diff --git a/libs/numeric/odeint/examples/quadmath/black_hole.cpp b/libs/numeric/odeint/examples/quadmath/black_hole.cpp deleted file mode 100644 index 5a6802af0..000000000 --- a/libs/numeric/odeint/examples/quadmath/black_hole.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/examples/black_hole.cpp - - [begin_description] - This example shows how the __float128 from gcc libquadmath can be used with odeint. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012 Lee Hodgkinson - Copyright 2012 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) - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern "C" { -#include -} - -const __float128 zero =strtoflt128 ("0.0", NULL); - -namespace std { - - inline __float128 abs( __float128 x ) - { - return fabsq( x ); - } - - inline __float128 sqrt( __float128 x ) - { - return sqrtq( x ); - } - - inline __float128 pow( __float128 x , __float128 y ) - { - return powq( x , y ); - } - - inline __float128 abs( std::complex< __float128 > x ) - { - return sqrtq( x.real() * x.real() + x.imag() * x.imag() ); - } - - inline std::complex< __float128 > pow( std::complex< __float128> x , __float128 y ) - { - __float128 r = pow( abs(x) , y ); - __float128 phi = atanq( x.imag() / x.real() ); - return std::complex< __float128 >( r * cosq( y * phi ) , r * sinq( y * phi ) ); - } -} - -inline std::ostream& operator<< (std::ostream& os, const __float128& f) { - - char* y = new char[1000]; - quadmath_snprintf(y, 1000, "%.30Qg", f) ; - os.precision(30); - os< -#include -#include -#include -#include - - - -using namespace boost::numeric::odeint; -using namespace std; - -typedef __float128 my_float; -typedef std::vector< std::complex < my_float > > state_type; - -struct radMod -{ - my_float m_om; - my_float m_l; - - radMod( my_float om , my_float l ) - : m_om( om ) , m_l( l ) { } - - void operator()( const state_type &x , state_type &dxdt , my_float r ) const - { - - dxdt[0] = x[1]; - dxdt[1] = -(2*(r-1)/(r*(r-2)))*x[1]-((m_om*m_om*r*r/((r-2)*(r-2)))-(m_l*(m_l+1)/(r*(r-2))))*x[0]; - } -}; - - - - - - - -int main( int argc , char **argv ) -{ - - - state_type x(2); - - my_float re0 = strtoflt128( "-0.00008944230755601224204687038354994353820468" , NULL ); - my_float im0 = strtoflt128( "0.00004472229441850588228136889483397204368247" , NULL ); - my_float re1 = strtoflt128( "-4.464175354293244250869336196695966076150E-6 " , NULL ); - my_float im1 = strtoflt128( "-8.950483248390306670770345406051469584488E-6" , NULL ); - - x[0] = complex< my_float >( re0 ,im0 ); - x[1] = complex< my_float >( re1 ,im1 ); - - const my_float dt =strtoflt128 ("-0.001", NULL); - const my_float start =strtoflt128 ("10000.0", NULL); - const my_float end =strtoflt128 ("9990.0", NULL); - const my_float omega =strtoflt128 ("2.0", NULL); - const my_float ell =strtoflt128 ("1.0", NULL); - - - - my_float abs_err = strtoflt128( "1.0E-15" , NULL ) , rel_err = strtoflt128( "1.0E-10" , NULL ); - my_float a_x = strtoflt128( "1.0" , NULL ) , a_dxdt = strtoflt128( "1.0" , NULL ); - - typedef runge_kutta_dopri5< state_type, my_float > dopri5_type; - typedef controlled_runge_kutta< dopri5_type > controlled_dopri5_type; - typedef dense_output_runge_kutta< controlled_dopri5_type > dense_output_dopri5_type; - - dense_output_dopri5_type dopri5( controlled_dopri5_type( default_error_checker< my_float >( abs_err , rel_err , a_x , a_dxdt ) ) ); - - std::for_each( make_adaptive_time_iterator_begin(dopri5 , radMod(omega , ell) , x , start , end , dt) , - make_adaptive_time_iterator_end(dopri5 , radMod(omega , ell) , x ) , - []( const std::pair< state_type&, my_float > &x ) { - std::cout << x.second << ", " << x.first[0].real() << "\n"; } - ); - - - - return 0; -} diff --git a/libs/numeric/odeint/examples/resizing_lattice.cpp b/libs/numeric/odeint/examples/resizing_lattice.cpp deleted file mode 100644 index f77f26e5d..000000000 --- a/libs/numeric/odeint/examples/resizing_lattice.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/* - * resizing_lattice.cpp - * - * Demonstrates the usage of resizing of the state type during integration. - * Examplary system is a strongly nonlinear, disordered Hamiltonian lattice - * where the spreading of energy is investigated - * - * Copyright 2011-2012 Mario Mulansky - * Copyright 2012-2013 Karsten Ahnert - * Distributed under the 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 -#include - -#include - -#include -#include - -using namespace std; -using namespace boost::numeric::odeint; - -//[ resizing_lattice_system_class -typedef vector< double > coord_type; -typedef pair< coord_type , coord_type > state_type; - -struct compacton_lattice -{ - const int m_max_N; - const double m_beta; - int m_pot_start_index; - vector< double > m_pot; - - compacton_lattice( int max_N , double beta , int pot_start_index ) - : m_max_N( max_N ) , m_beta( beta ) , m_pot_start_index( pot_start_index ) , m_pot( max_N ) - { - srand( time( NULL ) ); - // fill random potential with iid values from [0,1] - boost::mt19937 rng; - boost::uniform_real<> unif( 0.0 , 1.0 ); - boost::variate_generator< boost::mt19937&, boost::uniform_real<> > gen( rng , unif ); - generate( m_pot.begin() , m_pot.end() , gen ); - } - - void operator()( const coord_type &q , coord_type &dpdt ) - { - // calculate dpdt = -dH/dq of this hamiltonian system - // dp_i/dt = - V_i * q_i^3 - beta*(q_i - q_{i-1})^3 + beta*(q_{i+1} - q_i)^3 - const int N = q.size(); - double diff = q[0] - q[N-1]; - for( int i=0 ; i hamiltonian_stepper; - hamiltonian_stepper stepper; - hamiltonian_stepper::state_type state = make_pair( q , p ); - //] - - //[ resizing_lattice_steps_loop - double t = 0.0; - const double dt = 0.1; - const int steps = 10000; - for( int step = 0 ; step < steps ; ++step ) - { - stepper.do_step( boost::ref(lattice) , state , t , dt ); - lattice.energy_distribution( state.first , state.second , distr ); - if( distr[10] > 1E-150 ) - { - do_resize( state.first , state.second , distr , state.first.size()+20 ); - rotate( state.first.begin() , state.first.end()-20 , state.first.end() ); - rotate( state.second.begin() , state.second.end()-20 , state.second.end() ); - lattice.change_pot_start( -20 ); - cout << t << ": resized left to " << distr.size() << ", energy = " << lattice.energy( state.first , state.second ) << endl; - } - if( distr[distr.size()-10] > 1E-150 ) - { - do_resize( state.first , state.second , distr , state.first.size()+20 ); - cout << t << ": resized right to " << distr.size() << ", energy = " << lattice.energy( state.first , state.second ) << endl; - } - t += dt; - } - //] - - cout << "final lattice size: " << distr.size() << ", final energy: " << lattice.energy( state.first , state.second ) << endl; -} diff --git a/libs/numeric/odeint/examples/simple1d.cpp b/libs/numeric/odeint/examples/simple1d.cpp deleted file mode 100644 index 3a8dfa04f..000000000 --- a/libs/numeric/odeint/examples/simple1d.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* Boost libs/numeric/odeint/examples/simple1d.cpp - - Copyright 2012-2013 Mario Mulansky - Copyright 2012 Karsten Ahnert - - example for a simple one-dimensional 1st order ODE - - Distributed under the 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 -#include - -using namespace std; -using namespace boost::numeric::odeint; - - -/* we solve the simple ODE x' = 3/(2t^2) + x/(2t) - * with initial condition x(1) = 0. - * Analytic solution is x(t) = sqrt(t) - 1/t - */ - -void rhs( const double x , double &dxdt , const double t ) -{ - dxdt = 3.0/(2.0*t*t) + x/(2.0*t); -} - -void write_cout( const double &x , const double t ) -{ - cout << t << '\t' << x << endl; -} - -// state_type = double -typedef runge_kutta_dopri5< double > stepper_type; - -int main() -{ - double x = 0.0; //initial value x(1) = 0 - // use dopri5 with stepsize control and allowed errors 10^-12, integrate t=1...10 - integrate_adaptive( make_controlled( 1E-12 , 1E-12 , stepper_type() ) , rhs , x , 1.0 , 10.0 , 0.1 , write_cout ); -} diff --git a/libs/numeric/odeint/examples/solar_system.agr b/libs/numeric/odeint/examples/solar_system.agr deleted file mode 100644 index 87f8c38e7..000000000 --- a/libs/numeric/odeint/examples/solar_system.agr +++ /dev/null @@ -1,12672 +0,0 @@ -# Grace project file -# -@version 50122 -@page size 792, 612 -@page scroll 5% -@page inout 5% -@link page off -@map font 0 to "Times-Roman", "Times-Roman" -@map font 1 to "Times-Italic", "Times-Italic" -@map font 2 to "Times-Bold", "Times-Bold" -@map font 3 to "Times-BoldItalic", "Times-BoldItalic" -@map font 4 to "Helvetica", "Helvetica" -@map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" -@map font 6 to "Helvetica-Bold", "Helvetica-Bold" -@map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" -@map font 8 to "Courier", "Courier" -@map font 9 to "Courier-Oblique", "Courier-Oblique" -@map font 10 to "Courier-Bold", "Courier-Bold" -@map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" -@map font 12 to "Symbol", "Symbol" -@map font 13 to "ZapfDingbats", "ZapfDingbats" -@map color 0 to (255, 255, 255), "white" -@map color 1 to (0, 0, 0), "black" -@map color 2 to (255, 0, 0), "red" -@map color 3 to (0, 255, 0), "green" -@map color 4 to (0, 0, 255), "blue" -@map color 5 to (255, 255, 0), "yellow" -@map color 6 to (188, 143, 143), "brown" -@map color 7 to (220, 220, 220), "grey" -@map color 8 to (148, 0, 211), "violet" -@map color 9 to (0, 255, 255), "cyan" -@map color 10 to (255, 0, 255), "magenta" -@map color 11 to (255, 165, 0), "orange" -@map color 12 to (114, 33, 188), "indigo" -@map color 13 to (103, 7, 72), "maroon" -@map color 14 to (64, 224, 208), "turquoise" -@map color 15 to (0, 139, 0), "green4" -@reference date 0 -@date wrap off -@date wrap year 1950 -@default linewidth 1.0 -@default linestyle 1 -@default color 1 -@default pattern 1 -@default font 0 -@default char size 1.000000 -@default symbol size 1.000000 -@default sformat "%.8g" -@background color 0 -@page background fill on -@timestamp off -@timestamp 0.03, 0.03 -@timestamp color 1 -@timestamp rot 0 -@timestamp font 0 -@timestamp char size 1.000000 -@timestamp def "Fri Mar 18 17:58:35 2011" -@with line -@ line on -@ line loctype view -@ line 0.248774509804, 0.780637254902, 0.558823529412, 0.444852941176 -@ line linewidth 1.0 -@ line linestyle 1 -@ line color 1 -@ line arrow 0 -@ line arrow type 0 -@ line arrow length 1.000000 -@ line arrow layout 1.000000, 1.000000 -@line def -@with line -@ line on -@ line loctype view -@ line 0.730392156863, 0.126225490196, 0.621323529412, 0.411764705882 -@ line linewidth 1.0 -@ line linestyle 1 -@ line color 1 -@ line arrow 0 -@ line arrow type 0 -@ line arrow length 1.000000 -@ line arrow layout 1.000000, 1.000000 -@line def -@with line -@ line on -@ line loctype view -@ line 0.887254901961, 0.121323529412, 0.689950980392, 0.417892156863 -@ line linewidth 1.0 -@ line linestyle 1 -@ line color 1 -@ line arrow 0 -@ line arrow type 0 -@ line arrow length 1.000000 -@ line arrow layout 1.000000, 1.000000 -@line def -@with line -@ line on -@ line loctype view -@ line 1.07107843137, 0.120098039216, 0.827205882353, 0.447303921569 -@ line linewidth 1.0 -@ line linestyle 1 -@ line color 1 -@ line arrow 0 -@ line arrow type 0 -@ line arrow length 1.000000 -@ line arrow layout 1.000000, 1.000000 -@line def -@with string -@ string on -@ string loctype view -@ string 0.164215686274, 0.792892156863 -@ string color 1 -@ string rot 0 -@ string font 0 -@ string just 0 -@ string char size 2.000000 -@ string def "Sun" -@with string -@ string on -@ string loctype view -@ string 0.658088235294, 0.08 -@ string color 1 -@ string rot 0 -@ string font 0 -@ string just 0 -@ string char size 2.000000 -@ string def "Jupiter" -@with string -@ string on -@ string loctype view -@ string 0.837009803922, 0.08 -@ string color 1 -@ string rot 0 -@ string font 0 -@ string just 0 -@ string char size 2.000000 -@ string def "Saturn" -@with string -@ string on -@ string loctype view -@ string 1.00980392157, 0.08 -@ string color 1 -@ string rot 0 -@ string font 0 -@ string just 0 -@ string char size 2.000000 -@ string def "Uranus" -@with string -@ string on -@ string loctype view -@ string 0.735294117647, 0.680147058824 -@ string color 1 -@ string rot 0 -@ string font 0 -@ string just 0 -@ string char size 2.000000 -@ string def "Neptune" -@with string -@ string on -@ string loctype view -@ string 0.996323529411, 0.780637254902 -@ string color 1 -@ string rot 0 -@ string font 0 -@ string just 0 -@ string char size 2.000000 -@ string def "Pluto" -@r0 off -@link r0 to g0 -@r0 type above -@r0 linestyle 1 -@r0 linewidth 1.0 -@r0 color 1 -@r0 line 0, 0, 0, 0 -@r1 off -@link r1 to g0 -@r1 type above -@r1 linestyle 1 -@r1 linewidth 1.0 -@r1 color 1 -@r1 line 0, 0, 0, 0 -@r2 off -@link r2 to g0 -@r2 type above -@r2 linestyle 1 -@r2 linewidth 1.0 -@r2 color 1 -@r2 line 0, 0, 0, 0 -@r3 off -@link r3 to g0 -@r3 type above -@r3 linestyle 1 -@r3 linewidth 1.0 -@r3 color 1 -@r3 line 0, 0, 0, 0 -@r4 off -@link r4 to g0 -@r4 type above -@r4 linestyle 1 -@r4 linewidth 1.0 -@r4 color 1 -@r4 line 0, 0, 0, 0 -@g0 on -@g0 hidden false -@g0 type XY -@g0 stacked false -@g0 bar hgap 0.000000 -@g0 fixedpoint off -@g0 fixedpoint type 0 -@g0 fixedpoint xy 0.000000, 0.000000 -@g0 fixedpoint format general general -@g0 fixedpoint prec 6, 6 -@with g0 -@ world -32, -32, 45, 46 -@ stack world 0, 0, 0, 0 -@ znorm 1 -@ view 0.150000, 0.150000, 1.150000, 0.850000 -@ title "" -@ title font 0 -@ title size 1.500000 -@ title color 1 -@ subtitle "" -@ subtitle font 0 -@ subtitle size 1.000000 -@ subtitle color 1 -@ xaxes scale Normal -@ yaxes scale Normal -@ xaxes invert off -@ yaxes invert off -@ xaxis on -@ xaxis type zero false -@ xaxis offset 0.000000 , 0.000000 -@ xaxis bar on -@ xaxis bar color 1 -@ xaxis bar linestyle 1 -@ xaxis bar linewidth 1.0 -@ xaxis label "" -@ xaxis label layout para -@ xaxis label place auto -@ xaxis label char size 1.000000 -@ xaxis label font 0 -@ xaxis label color 1 -@ xaxis label place normal -@ xaxis tick off -@ xaxis tick major 20 -@ xaxis tick minor ticks 1 -@ xaxis tick default 6 -@ xaxis tick place rounded true -@ xaxis tick in -@ xaxis tick major size 1.000000 -@ xaxis tick major color 1 -@ xaxis tick major linewidth 1.0 -@ xaxis tick major linestyle 1 -@ xaxis tick major grid off -@ xaxis tick minor color 1 -@ xaxis tick minor linewidth 1.0 -@ xaxis tick minor linestyle 1 -@ xaxis tick minor grid off -@ xaxis tick minor size 0.500000 -@ xaxis ticklabel off -@ xaxis ticklabel format general -@ xaxis ticklabel prec 5 -@ xaxis ticklabel formula "" -@ xaxis ticklabel append "" -@ xaxis ticklabel prepend "" -@ xaxis ticklabel angle 0 -@ xaxis ticklabel skip 0 -@ xaxis ticklabel stagger 0 -@ xaxis ticklabel place normal -@ xaxis ticklabel offset auto -@ xaxis ticklabel offset 0.000000 , 0.010000 -@ xaxis ticklabel start type auto -@ xaxis ticklabel start 0.000000 -@ xaxis ticklabel stop type auto -@ xaxis ticklabel stop 0.000000 -@ xaxis ticklabel char size 1.000000 -@ xaxis ticklabel font 0 -@ xaxis ticklabel color 1 -@ xaxis tick place both -@ xaxis tick spec type none -@ yaxis on -@ yaxis type zero false -@ yaxis offset 0.000000 , 0.000000 -@ yaxis bar on -@ yaxis bar color 1 -@ yaxis bar linestyle 1 -@ yaxis bar linewidth 1.0 -@ yaxis label "" -@ yaxis label layout para -@ yaxis label place auto -@ yaxis label char size 1.000000 -@ yaxis label font 0 -@ yaxis label color 1 -@ yaxis label place normal -@ yaxis tick off -@ yaxis tick major 20 -@ yaxis tick minor ticks 1 -@ yaxis tick default 6 -@ yaxis tick place rounded true -@ yaxis tick in -@ yaxis tick major size 1.000000 -@ yaxis tick major color 1 -@ yaxis tick major linewidth 1.0 -@ yaxis tick major linestyle 1 -@ yaxis tick major grid off -@ yaxis tick minor color 1 -@ yaxis tick minor linewidth 1.0 -@ yaxis tick minor linestyle 1 -@ yaxis tick minor grid off -@ yaxis tick minor size 0.500000 -@ yaxis ticklabel off -@ yaxis ticklabel format general -@ yaxis ticklabel prec 5 -@ yaxis ticklabel formula "" -@ yaxis ticklabel append "" -@ yaxis ticklabel prepend "" -@ yaxis ticklabel angle 0 -@ yaxis ticklabel skip 0 -@ yaxis ticklabel stagger 0 -@ yaxis ticklabel place normal -@ yaxis ticklabel offset auto -@ yaxis ticklabel offset 0.000000 , 0.010000 -@ yaxis ticklabel start type auto -@ yaxis ticklabel start 0.000000 -@ yaxis ticklabel stop type auto -@ yaxis ticklabel stop 0.000000 -@ yaxis ticklabel char size 1.000000 -@ yaxis ticklabel font 0 -@ yaxis ticklabel color 1 -@ yaxis tick place both -@ yaxis tick spec type none -@ altxaxis off -@ altyaxis off -@ legend on -@ legend loctype view -@ legend 0.85, 0.8 -@ legend box color 1 -@ legend box pattern 1 -@ legend box linewidth 1.0 -@ legend box linestyle 1 -@ legend box fill color 0 -@ legend box fill pattern 1 -@ legend font 0 -@ legend char size 1.000000 -@ legend color 1 -@ legend length 4 -@ legend vgap 1 -@ legend hgap 1 -@ legend invert false -@ frame type 0 -@ frame linestyle 1 -@ frame linewidth 1.0 -@ frame color 1 -@ frame pattern 1 -@ frame background color 0 -@ frame background pattern 0 -@ s0 hidden false -@ s0 type xy -@ s0 symbol 1 -@ s0 symbol size 1.000000 -@ s0 symbol color 1 -@ s0 symbol pattern 1 -@ s0 symbol fill color 1 -@ s0 symbol fill pattern 1 -@ s0 symbol linewidth 1.0 -@ s0 symbol linestyle 1 -@ s0 symbol char 65 -@ s0 symbol char font 0 -@ s0 symbol skip 0 -@ s0 line type 1 -@ s0 line linestyle 1 -@ s0 line linewidth 2.0 -@ s0 line color 1 -@ s0 line pattern 1 -@ s0 baseline type 0 -@ s0 baseline off -@ s0 dropline off -@ s0 fill type 0 -@ s0 fill rule 0 -@ s0 fill color 1 -@ s0 fill pattern 1 -@ s0 avalue off -@ s0 avalue type 2 -@ s0 avalue char size 1.000000 -@ s0 avalue font 0 -@ s0 avalue color 1 -@ s0 avalue rot 0 -@ s0 avalue format general -@ s0 avalue prec 3 -@ s0 avalue prepend "" -@ s0 avalue append "" -@ s0 avalue offset 0.000000 , 0.000000 -@ s0 errorbar on -@ s0 errorbar place both -@ s0 errorbar color 1 -@ s0 errorbar pattern 1 -@ s0 errorbar size 1.000000 -@ s0 errorbar linewidth 1.0 -@ s0 errorbar linestyle 1 -@ s0 errorbar riser linewidth 1.0 -@ s0 errorbar riser linestyle 1 -@ s0 errorbar riser clip off -@ s0 errorbar riser clip length 0.100000 -@ s0 comment "Cols 2:3" -@ s0 legend "" -@ s1 hidden false -@ s1 type xy -@ s1 symbol 0 -@ s1 symbol size 1.000000 -@ s1 symbol color 1 -@ s1 symbol pattern 1 -@ s1 symbol fill color 1 -@ s1 symbol fill pattern 0 -@ s1 symbol linewidth 1.0 -@ s1 symbol linestyle 1 -@ s1 symbol char 65 -@ s1 symbol char font 0 -@ s1 symbol skip 0 -@ s1 line type 1 -@ s1 line linestyle 1 -@ s1 line linewidth 3.0 -@ s1 line color 1 -@ s1 line pattern 1 -@ s1 baseline type 0 -@ s1 baseline off -@ s1 dropline off -@ s1 fill type 0 -@ s1 fill rule 0 -@ s1 fill color 1 -@ s1 fill pattern 1 -@ s1 avalue off -@ s1 avalue type 2 -@ s1 avalue char size 1.000000 -@ s1 avalue font 0 -@ s1 avalue color 1 -@ s1 avalue rot 0 -@ s1 avalue format general -@ s1 avalue prec 3 -@ s1 avalue prepend "" -@ s1 avalue append "" -@ s1 avalue offset 0.000000 , 0.000000 -@ s1 errorbar on -@ s1 errorbar place both -@ s1 errorbar color 1 -@ s1 errorbar pattern 1 -@ s1 errorbar size 1.000000 -@ s1 errorbar linewidth 1.0 -@ s1 errorbar linestyle 1 -@ s1 errorbar riser linewidth 1.0 -@ s1 errorbar riser linestyle 1 -@ s1 errorbar riser clip off -@ s1 errorbar riser clip length 0.100000 -@ s1 comment "Cols 5:6" -@ s1 legend "" -@ s2 hidden false -@ s2 type xy -@ s2 symbol 0 -@ s2 symbol size 1.000000 -@ s2 symbol color 1 -@ s2 symbol pattern 1 -@ s2 symbol fill color 1 -@ s2 symbol fill pattern 0 -@ s2 symbol linewidth 1.0 -@ s2 symbol linestyle 1 -@ s2 symbol char 65 -@ s2 symbol char font 0 -@ s2 symbol skip 0 -@ s2 line type 1 -@ s2 line linestyle 1 -@ s2 line linewidth 3.0 -@ s2 line color 1 -@ s2 line pattern 1 -@ s2 baseline type 0 -@ s2 baseline off -@ s2 dropline off -@ s2 fill type 0 -@ s2 fill rule 0 -@ s2 fill color 1 -@ s2 fill pattern 1 -@ s2 avalue off -@ s2 avalue type 2 -@ s2 avalue char size 1.000000 -@ s2 avalue font 0 -@ s2 avalue color 1 -@ s2 avalue rot 0 -@ s2 avalue format general -@ s2 avalue prec 3 -@ s2 avalue prepend "" -@ s2 avalue append "" -@ s2 avalue offset 0.000000 , 0.000000 -@ s2 errorbar on -@ s2 errorbar place both -@ s2 errorbar color 1 -@ s2 errorbar pattern 1 -@ s2 errorbar size 1.000000 -@ s2 errorbar linewidth 1.0 -@ s2 errorbar linestyle 1 -@ s2 errorbar riser linewidth 1.0 -@ s2 errorbar riser linestyle 1 -@ s2 errorbar riser clip off -@ s2 errorbar riser clip length 0.100000 -@ s2 comment "Cols 8:9" -@ s2 legend "" -@ s3 hidden false -@ s3 type xy -@ s3 symbol 0 -@ s3 symbol size 1.000000 -@ s3 symbol color 1 -@ s3 symbol pattern 1 -@ s3 symbol fill color 1 -@ s3 symbol fill pattern 0 -@ s3 symbol linewidth 1.0 -@ s3 symbol linestyle 1 -@ s3 symbol char 65 -@ s3 symbol char font 0 -@ s3 symbol skip 0 -@ s3 line type 1 -@ s3 line linestyle 1 -@ s3 line linewidth 3.0 -@ s3 line color 1 -@ s3 line pattern 1 -@ s3 baseline type 0 -@ s3 baseline off -@ s3 dropline off -@ s3 fill type 0 -@ s3 fill rule 0 -@ s3 fill color 1 -@ s3 fill pattern 1 -@ s3 avalue off -@ s3 avalue type 2 -@ s3 avalue char size 1.000000 -@ s3 avalue font 0 -@ s3 avalue color 1 -@ s3 avalue rot 0 -@ s3 avalue format general -@ s3 avalue prec 3 -@ s3 avalue prepend "" -@ s3 avalue append "" -@ s3 avalue offset 0.000000 , 0.000000 -@ s3 errorbar on -@ s3 errorbar place both -@ s3 errorbar color 1 -@ s3 errorbar pattern 1 -@ s3 errorbar size 1.000000 -@ s3 errorbar linewidth 1.0 -@ s3 errorbar linestyle 1 -@ s3 errorbar riser linewidth 1.0 -@ s3 errorbar riser linestyle 1 -@ s3 errorbar riser clip off -@ s3 errorbar riser clip length 0.100000 -@ s3 comment "Cols 11:12" -@ s3 legend "" -@ s4 hidden false -@ s4 type xy -@ s4 symbol 0 -@ s4 symbol size 1.000000 -@ s4 symbol color 1 -@ s4 symbol pattern 1 -@ s4 symbol fill color 1 -@ s4 symbol fill pattern 0 -@ s4 symbol linewidth 1.0 -@ s4 symbol linestyle 1 -@ s4 symbol char 65 -@ s4 symbol char font 0 -@ s4 symbol skip 0 -@ s4 line type 1 -@ s4 line linestyle 1 -@ s4 line linewidth 3.0 -@ s4 line color 1 -@ s4 line pattern 1 -@ s4 baseline type 0 -@ s4 baseline off -@ s4 dropline off -@ s4 fill type 0 -@ s4 fill rule 0 -@ s4 fill color 1 -@ s4 fill pattern 1 -@ s4 avalue off -@ s4 avalue type 2 -@ s4 avalue char size 1.000000 -@ s4 avalue font 0 -@ s4 avalue color 1 -@ s4 avalue rot 0 -@ s4 avalue format general -@ s4 avalue prec 3 -@ s4 avalue prepend "" -@ s4 avalue append "" -@ s4 avalue offset 0.000000 , 0.000000 -@ s4 errorbar on -@ s4 errorbar place both -@ s4 errorbar color 1 -@ s4 errorbar pattern 1 -@ s4 errorbar size 1.000000 -@ s4 errorbar linewidth 1.0 -@ s4 errorbar linestyle 1 -@ s4 errorbar riser linewidth 1.0 -@ s4 errorbar riser linestyle 1 -@ s4 errorbar riser clip off -@ s4 errorbar riser clip length 0.100000 -@ s4 comment "Cols 14:15" -@ s4 legend "" -@ s5 hidden false -@ s5 type xy -@ s5 symbol 0 -@ s5 symbol size 1.000000 -@ s5 symbol color 1 -@ s5 symbol pattern 1 -@ s5 symbol fill color 1 -@ s5 symbol fill pattern 0 -@ s5 symbol linewidth 1.0 -@ s5 symbol linestyle 1 -@ s5 symbol char 65 -@ s5 symbol char font 0 -@ s5 symbol skip 0 -@ s5 line type 1 -@ s5 line linestyle 1 -@ s5 line linewidth 3.0 -@ s5 line color 1 -@ s5 line pattern 1 -@ s5 baseline type 0 -@ s5 baseline off -@ s5 dropline off -@ s5 fill type 0 -@ s5 fill rule 0 -@ s5 fill color 1 -@ s5 fill pattern 1 -@ s5 avalue off -@ s5 avalue type 2 -@ s5 avalue char size 1.000000 -@ s5 avalue font 0 -@ s5 avalue color 1 -@ s5 avalue rot 0 -@ s5 avalue format general -@ s5 avalue prec 3 -@ s5 avalue prepend "" -@ s5 avalue append "" -@ s5 avalue offset 0.000000 , 0.000000 -@ s5 errorbar on -@ s5 errorbar place both -@ s5 errorbar color 1 -@ s5 errorbar pattern 1 -@ s5 errorbar size 1.000000 -@ s5 errorbar linewidth 1.0 -@ s5 errorbar linestyle 1 -@ s5 errorbar riser linewidth 1.0 -@ s5 errorbar riser linestyle 1 -@ s5 errorbar riser clip off -@ s5 errorbar riser clip length 0.100000 -@ s5 comment "Cols 17:18" -@ s5 legend "" -@target G0.S0 -@type xy --0.00020471 0.00655014 --0.000847612 0.00675668 --0.0015342 0.00688468 --0.00225308 0.00692804 --0.00299183 0.00688197 --0.00373705 0.00674311 --0.00447459 0.00650976 --0.0051897 0.00618199 --0.00586735 0.00576186 --0.00649249 0.0052535 --0.00705043 0.00466325 --0.00752731 0.00399965 --0.00791047 0.00327339 --0.00818899 0.00249719 --0.00835413 0.00168553 --0.00839971 0.000854306 --0.00832249 2.03576e-05 --0.00812233 -0.000799035 --0.00780235 -0.00158674 --0.0073688 -0.00232635 --0.00683085 -0.00300275 --0.00620026 -0.00360259 --0.00549091 -0.00411465 --0.00471829 -0.00453016 --0.00389894 -0.00484288 --0.00304988 -0.0050492 --0.00218816 -0.00514798 --0.00133037 -0.00514046 --0.000492311 -0.00503003 -0.000311334 -0.00482194 -0.00106719 -0.00452309 -0.00176336 -0.00414174 -0.0023895 -0.00368725 -0.00293689 -0.00316983 -0.00339843 -0.00260038 -0.00376866 -0.00199025 -0.00404372 -0.00135108 -0.00422132 -0.000694668 -0.00430073 -3.28003e-05 -0.0042827 0.000622837 -0.00416947 0.0012608 -0.00396473 0.00186999 -0.00367358 0.00243978 -0.00330251 0.00296015 -0.00285936 0.00342178 -0.00235329 0.00381622 -0.00179469 0.00413606 -0.00119514 0.00437506 -0.000567293 0.00452836 --7.53049e-05 0.00459264 --0.00071836 0.00456633 --0.0013471 0.00444974 --0.00194656 0.00424528 --0.00250195 0.00395751 --0.00299907 0.0035932 --0.00342472 0.00316136 --0.00376725 0.00267308 --0.00401694 0.0021413 --0.00416652 0.00158056 --0.00421147 0.0010065 --0.00415031 0.000435375 --0.00398471 -0.000116498 --0.00371947 -0.000633337 --0.00336234 -0.00110046 --0.00292371 -0.00150477 --0.00241619 -0.00183519 --0.00185406 -0.00208297 --0.0012528 -0.0022418 --0.000628469 -0.00230793 -2.74829e-06 -0.00228011 -0.000625026 -0.0021594 -0.00122327 -0.00194905 -0.00178344 -0.00165417 -0.00229275 -0.00128155 -0.00273988 -0.000839337 -0.00311505 -0.000336807 -0.00341009 0.000215892 -0.00361845 0.00080795 -0.00373522 0.0014281 -0.00375709 0.00206477 -0.00368232 0.00270628 -0.00351072 0.00334094 -0.00324358 0.0039572 -0.00288369 0.00454375 -0.00243523 0.00508965 -0.00190382 0.00558444 -0.00129643 0.00601825 -0.00062136 0.00638196 --0.000111784 0.00666728 --0.000892163 0.00686694 --0.00170777 0.00697486 --0.00254553 0.00698629 --0.00339145 0.00689801 --0.00423075 0.00670851 --0.00504817 0.00641817 --0.00582817 0.00602941 --0.00655533 0.00554683 --0.00721472 0.00497726 --0.00779234 0.00432976 --0.00827562 0.00361555 --0.00865384 0.00284781 --0.00891864 0.0020414 --0.00906434 0.00121243 --0.00908827 0.000377804 --0.00899094 -0.000445331 --0.00877603 -0.00124019 --0.00845028 -0.0019909 --0.00802318 -0.00268303 --0.00750665 -0.00330403 --0.00691449 -0.00384357 --0.00626188 -0.00429373 --0.00556482 -0.00464914 --0.00483963 -0.0049069 --0.00410248 -0.00506653 --0.00336896 -0.00512977 --0.00265377 -0.00510033 --0.00197047 -0.0049837 --0.00133124 -0.00478682 --0.000746836 -0.00451784 --0.000226441 -0.00418594 -0.000222331 -0.00380099 -0.000593451 -0.00337346 -0.000882467 -0.00291418 -0.00108647 -0.00243419 -0.00120406 -0.00194459 -0.00123533 -0.00145645 -0.00118179 -0.00098063 -0.0010464 -0.000527727 -0.000833454 -0.000107918 -0.000548629 0.000269138 -0.000198908 0.000594425 --0.000207449 0.0008597 --0.000660949 0.00105764 --0.00115094 0.001182 --0.00166568 0.00122777 --0.00219249 0.00119135 --0.00271789 0.00107074 --0.00322782 0.000865725 --0.00370789 0.000578006 --0.00414371 0.00021135 --0.00452123 -0.00022832 --0.00482722 -0.000732913 --0.00504967 -0.00129222 --0.00517828 -0.00189406 --0.00520489 -0.00252456 --0.00512392 -0.00316849 --0.00493266 -0.00380972 --0.00463146 -0.00443178 --0.00422385 -0.00501838 --0.00371639 -0.00555403 --0.00311849 -0.00602454 --0.00244202 -0.00641751 --0.00170088 -0.0067227 --0.000910464 -0.00693225 --8.71233e-05 -0.00704087 -0.000752367 -0.00704578 -0.0015913 -0.00694671 -0.00241347 -0.00674568 -0.00320354 -0.0064468 -0.00394729 -0.00605603 -0.00463189 -0.00558093 -0.00524599 -0.00503036 -0.00577986 -0.00441424 -0.0062254 -0.00374334 -0.00657619 -0.00302901 -0.00682745 -0.00228306 -0.00697604 -0.00151752 -0.00702042 -0.000744533 -0.00696063 2.38198e-05 -0.00679821 0.000775615 -0.0065362 0.00149923 -0.00617912 0.00218344 -0.00573286 0.00281756 -0.00520472 0.00339157 -0.00460335 0.00389621 -0.00393865 0.00432316 -0.00322179 0.00466517 -0.00246503 0.00491623 -0.00168168 0.00507174 -0.000885924 0.0051287 -9.26032e-05 0.00508585 --0.00068299 0.00494387 --0.00142543 0.00470552 --0.00211951 0.00437571 --0.00275065 0.00396159 --0.00330531 0.0034725 --0.00377151 0.00291985 --0.00413922 0.00231694 --0.00440087 0.00167859 --0.00455163 0.00102077 --0.0045897 0.000360038 --0.00451645 -0.000286939 --0.00433636 -0.000904027 --0.00405687 -0.00147615 --0.00368811 -0.00198982 --0.00324241 -0.00243351 --0.00273386 -0.002798 --0.00217774 -0.00307652 --0.00159 -0.00326484 --0.000986717 -0.00336123 --0.000383681 -0.0033663 -0.000204034 -0.00328282 -0.000762373 -0.00311552 -0.00127853 -0.00287073 -0.00174114 -0.00255624 -0.00214038 -0.00218094 -0.00246801 -0.0017546 -0.00271744 -0.0012877 -0.0028837 -0.000791139 -0.00296344 -0.000276135 -0.00295485 0.000245977 -0.0028577 0.000763873 -0.00267322 0.00126637 -0.0024041 0.00174256 -0.00205447 0.00218189 -0.00162983 0.00257432 -0.00113701 0.00291042 -0.000584157 0.00318149 --1.93094e-05 0.0033797 --0.000662788 0.00349826 --0.00133455 0.00353151 --0.00202184 0.00347518 --0.00271103 0.00332649 --0.00338777 0.00308434 --0.00403724 0.00274953 --0.00464442 0.00232482 --0.00519441 0.00181515 --0.00567283 0.00122762 --0.00606627 0.00057154 --0.00636272 -0.000141662 --0.00655203 -0.000898636 --0.00662641 -0.00168438 --0.00658076 -0.00248265 --0.00641299 -0.00327642 --0.00612418 -0.00404845 --0.00571862 -0.00478184 --0.00520367 -0.00546063 --0.00458951 -0.00607034 --0.00388877 -0.00659837 --0.00311599 -0.00703441 --0.00228713 -0.00737062 --0.001419 -0.00760176 --0.00052874 -0.00772514 -0.000366691 -0.00774057 -0.0012509 -0.00765013 -0.00210843 -0.00745797 -0.00292501 -0.00717004 -0.00368775 -0.00679382 -0.00438529 -0.00633807 -0.00500783 -0.00581257 -0.00554725 -0.00522787 -0.00599704 -0.00459514 -0.00635231 -0.00392594 -0.00660981 -0.00323204 -0.00676782 -0.00252534 -0.00682617 -0.00181768 -0.00678621 -0.00112073 -0.00665073 -0.000445896 -0.00642398 0.000195823 -0.00611161 0.000793944 -0.00572065 0.00133863 -0.00525948 0.00182081 -0.00473775 0.00223236 -0.00416635 0.00256621 -0.00355733 0.00281658 -0.00292371 0.00297911 -0.00227941 0.00305104 -0.00163898 0.00303144 -0.00101735 0.00292134 -0.000429522 0.00272388 --0.000109804 0.00244439 --0.000586673 0.00209045 --0.000988327 0.0016718 --0.00130368 0.00120023 --0.00152379 0.00068929 --0.00164224 0.000153959 --0.00165553 -0.000389828 --0.00156321 -0.000925707 --0.00136803 -0.00143747 --0.00107581 -0.00190963 --0.000695242 -0.00232799 --0.000237499 -0.00268011 -0.00028419 -0.00295566 -0.000855081 -0.00314671 -0.00145946 -0.00324785 -0.00208119 -0.00325617 -0.00270419 -0.00317124 -0.00331286 -0.0029949 -0.00389246 -0.00273106 -0.0044294 -0.00238543 -0.0049114 -0.0019653 -0.00532771 -0.00147922 -0.00566911 -0.000936778 -0.00592803 -0.000348364 -0.00609852 0.000275049 -0.00617624 0.000922089 -0.00615847 0.00158115 -0.00604404 0.00224056 -0.00583329 0.00288869 -0.00552807 0.00351407 -0.00513166 0.00410555 -0.00464878 0.00465236 -0.00408553 0.00514429 -0.00344935 0.00557172 -0.00274903 0.00592584 -0.00199462 0.00619874 -0.00119736 0.00638358 -0.000369664 0.00647474 --0.000475063 0.00646803 --0.00132253 0.00636083 --0.00215777 0.0061523 --0.00296539 0.00584355 --0.00372986 0.00543777 --0.00443589 0.00494038 --0.00506882 0.004359 --0.00561513 0.00370351 --0.00606283 0.00298586 --0.00640199 0.00221989 --0.00662518 0.00142098 --0.00672776 0.000605622 --0.00670819 -0.000209112 --0.00656811 -0.0010061 --0.00631234 -0.0017688 --0.00594864 -0.00248175 --0.00548747 -0.00313111 --0.00494148 -0.00370507 --0.00432505 -0.0041941 --0.00365376 -0.00459117 --0.00294383 -0.00489176 --0.0022116 -0.00509385 --0.00147312 -0.00519776 --0.000743747 -0.00520592 --3.78368e-05 -0.00512273 -0.00063148 -0.00495418 -0.00125246 -0.0047077 -0.00181488 -0.00439181 -0.00231004 -0.00401597 -0.00273085 -0.0035903 -0.00307179 -0.00312541 -0.00332892 -0.00263223 -0.00349981 -0.00212187 -0.00358356 -0.00160544 -0.0035807 -0.00109397 -0.00349323 -0.000598283 -0.00332451 -0.000128855 -0.0030793 0.000304265 -0.00276369 0.00069159 -0.00238509 0.00102432 -0.00195215 0.00129447 -0.00147476 0.00149502 -0.000963934 0.00162009 -0.000431728 0.00166509 --0.000108887 0.0016269 --0.000644214 0.00150408 --0.00116005 0.00129698 --0.00164196 0.00100797 --0.00207563 0.00064151 --0.00244724 0.000204212 --0.00274392 -0.000295131 --0.00295417 -0.000845654 --0.00306839 -0.00143461 --0.00307925 -0.00204764 --0.00298211 -0.0026692 --0.0027753 -0.00328305 --0.00246023 -0.00387273 --0.00204148 -0.00442224 --0.0015266 -0.00491653 --0.000925861 -0.00534202 --0.000251852 -0.00568708 -0.000481 -0.00594234 -0.00125696 -0.00610085 -0.00205954 -0.00615824 -0.002872 -0.00611266 -0.00367784 -0.00596467 -0.00446119 -0.00571708 -0.00520716 -0.00537468 -0.00590206 -0.00494403 -0.00653364 -0.00443317 -0.0070912 -0.00385134 -0.00756562 -0.00320879 -0.00794947 -0.0025165 -0.00823697 -0.00178597 -0.00842398 -0.00102908 -0.00850797 -0.000257903 -0.00848803 0.000515464 -0.00836476 0.001279 -0.00814029 0.00202091 -0.00781823 0.00272972 -0.00740361 0.00339442 -0.00690288 0.00400457 -0.00632386 0.00455043 -0.00567567 0.00502309 -0.00496873 0.00541463 -0.00421462 0.00571825 -0.00342605 0.00592846 -0.00261666 0.00604125 -0.00180095 0.00605425 -0.000993963 0.00596692 -0.000211106 0.00578071 --0.000532214 0.00549919 --0.00122095 0.00512811 --0.00184082 0.00467545 --0.0023788 0.00415136 --0.00282353 0.00356799 --0.00316584 0.00293927 --0.00339909 0.00228051 --0.00351951 0.00160799 --0.00352642 0.000938407 --0.00342232 0.00028833 --0.00321277 -0.000326398 --0.00290622 -0.000891183 --0.00251361 -0.00139316 --0.00204795 -0.00182158 --0.00152382 -0.00216802 --0.000956798 -0.0024266 --0.000362918 -0.00259395 -0.000241787 -0.00266913 -0.000841748 -0.00265351 -0.00142221 -0.00255054 -0.00196954 -0.00236551 -0.0024714 -0.00210525 -0.00291694 -0.00177791 -0.00329689 -0.0013927 -0.00360357 -0.000959609 -0.00383093 -0.000489253 -0.00397456 7.36633e-06 -0.00403161 0.000519013 -0.00400083 0.00103437 -0.00388247 0.00154219 -0.00367824 0.00203139 -0.00339133 0.0024912 -0.00302631 0.00291128 -0.00258913 0.0032818 -0.00208706 0.00359361 -0.00152867 0.00383833 -0.000923769 0.00400851 -0.000283327 0.00409775 --0.000380585 0.00410091 --0.00105493 0.00401425 --0.00172584 0.00383558 --0.00237883 0.0035645 --0.00299902 0.0032025 --0.00357145 0.00275314 --0.00408143 0.00222212 --0.00451494 0.00161737 --0.00485908 0.000948966 --0.00510253 0.000229046 --0.00523601 -0.000528417 --0.00525274 -0.00130795 --0.00514871 -0.00209298 --0.00492305 -0.00286637 --0.00457804 -0.00361097 --0.00411915 -0.0043102 --0.00355485 -0.00494861 --0.00289628 -0.00551238 --0.00215687 -0.00598974 --0.00135176 -0.0063713 --0.000497319 -0.00665017 -0.000389423 -0.00682207 -0.0012913 -0.00688529 -0.00219149 -0.00684051 -0.00307384 -0.00669064 -0.00392329 -0.00644056 -0.00472599 -0.00609685 -0.00546959 -0.00566755 -0.00614326 -0.00516188 -0.00673779 -0.00458998 -0.00724564 -0.00396272 -0.0076609 -0.00329148 -0.00797927 -0.00258799 -0.00819807 -0.00186413 -0.00831617 -0.00113186 -0.00833398 -0.000403032 -0.0082534 0.000310724 -0.00807778 0.000998088 -0.00781192 0.00164819 -0.007462 0.00225073 -0.00703558 0.00279608 -0.00654156 0.00327549 -0.00599008 0.00368114 -0.0053925 0.0040064 -0.00476127 0.00424594 -0.00410982 0.00439594 -0.00345235 0.00445428 -0.00280362 0.00442068 -0.00217868 0.00429692 -0.00159252 0.0040869 -0.00105966 0.00379675 -0.000593729 0.00343484 -0.000206991 0.00301167 --9.01348e-05 0.00253969 --0.000289523 0.00203302 --0.000385725 0.00150707 --0.000376267 0.000978004 --0.000261813 0.000462218 --4.61849e-05 -2.42425e-05 -0.000263767 -0.000466267 -0.000658442 -0.000850202 -0.00112589 -0.0011643 -0.0016523 -0.00139903 -0.00222253 -0.00154732 -0.00282066 -0.00160463 -0.00343052 -0.00156894 -0.00403616 -0.00144062 -0.00462228 -0.00122224 -0.00517449 -0.000918388 -0.00567968 -0.000535338 -0.00612609 -8.08355e-05 -0.00650351 0.000436183 -0.00680331 0.00100583 -0.00701851 0.00161752 -0.00714373 0.00226012 -0.00717522 0.00292218 -0.00711082 0.00359207 -0.00694989 0.00425815 -0.00669333 0.00490883 -0.0063435 0.0055328 -0.00590418 0.00611903 -0.00538059 0.00665696 -0.00477931 0.0071366 -0.00410825 0.00754863 -0.00337664 0.00788455 -0.00259495 0.00813684 -0.00177485 0.0082991 -0.000929099 0.0083662 -7.14174e-05 0.00833452 --0.000783652 0.00820206 --0.00162097 0.00796868 --0.00242508 0.00763621 --0.0031805 0.00720865 --0.00387212 0.00669219 --0.00448566 0.0060953 --0.00500808 0.00542862 --0.0054281 0.00470482 --0.00573664 0.00393836 --0.00592723 0.00314508 --0.00599634 0.00234177 --0.00594358 0.00154561 --0.00577177 0.000773615 --0.00548682 4.20286e-05 --0.00509756 -0.000634203 --0.0046153 -0.0012419 --0.00405343 -0.00177003 --0.00342686 -0.00220993 --0.0027515 -0.00255546 --0.00204372 -0.002803 --0.00131986 -0.00295139 --0.000595792 -0.00300173 -0.0001134 -0.00295719 -0.000793733 -0.00282277 -0.00143251 -0.00260503 -0.00201848 -0.00231181 -0.00254191 -0.00195203 -0.00299463 -0.0015354 -0.00337006 -0.00107226 -0.00366322 -0.000573387 -0.00387063 -4.98061e-05 -0.00399039 0.000487333 -0.00402205 0.00102689 -0.00396663 0.00155788 -0.00382656 0.00206953 -0.00360566 0.00255147 -0.00330914 0.00299379 -0.0029435 0.00338716 -0.00251657 0.00372301 -0.00203742 0.00399361 -0.00151631 0.00419227 -0.000964635 0.00431347 -0.000394771 0.00435305 --0.000180037 0.0043084 --0.000745883 0.00417861 --0.00128844 0.00396467 --0.00179326 0.00366961 --0.00224614 0.00329856 --0.00263351 0.00285886 --0.00294291 0.00235999 --0.00316343 0.00181345 --0.00328619 0.00123254 --0.00330473 0.000632022 --0.00321539 2.77156e-05 --0.00301755 -0.000564045 --0.00271372 -0.00112696 --0.00230949 -0.00164532 --0.00181337 -0.0021046 --0.00123645 -0.00249193 --0.000591989 -0.00279646 -0.000105129 -0.0030097 -0.000838903 -0.00312568 -0.00159276 -0.00314093 -0.00235007 -0.00305452 -0.00309459 -0.00286784 -0.00381083 -0.00258445 -0.00448437 -0.00220982 -0.00510212 -0.00175105 -0.00565241 -0.00121665 -0.00612518 -0.000616233 -0.00651199 3.96856e-05 -0.00680604 0.000739932 -0.00700221 0.00147286 -0.00709699 0.00222654 -0.00708849 0.0029889 -0.00697638 0.00374787 -0.00676186 0.00449153 -0.00644763 0.00520821 -0.00603785 0.00588661 -0.0055381 0.00651593 -0.00495536 0.007086 -0.00429795 0.00758738 -0.0035755 0.00801151 -0.00279889 0.00835089 -0.00198015 0.00859918 -0.00113238 0.00875143 -0.000269591 0.00880422 --0.000593479 0.00875586 --0.00144158 0.00860654 --0.00225923 0.00835849 --0.00303108 0.00801608 --0.00374229 0.00758593 --0.00437895 0.00707683 --0.00492858 0.00649972 --0.00538053 0.00586746 --0.00572651 0.00519457 --0.00596085 0.0044968 --0.00608091 0.00379066 --0.00608713 0.00309292 --0.00598314 0.00241995 --0.00577556 0.00178725 --0.00547378 0.00120885 --0.00508955 0.000696908 --0.00463649 0.000261391 --0.00412957 -9.01733e-05 --0.0035846 -0.000352771 --0.00301766 -0.000523893 --0.00244463 -0.000603429 --0.00188084 -0.000593487 --0.00134065 -0.000498166 --0.000837246 -0.000323302 --0.000382446 -7.62015e-05 -1.34511e-05 0.000234621 -0.000341729 0.00059969 -0.000595289 0.0010088 -0.000768656 0.00145121 -0.000857967 0.00191585 -0.000860935 0.00239147 -0.00077682 0.0028668 -0.000606385 0.00333065 -0.000351857 0.00377207 -1.68928e-05 0.00418046 --0.000393461 0.00454566 --0.000872803 0.0048581 --0.00141341 0.00510891 --0.0020063 0.00529004 --0.00264126 0.00539441 --0.00330694 0.00541609 --0.00399094 0.00535042 --0.00467992 0.00519422 --0.00535982 0.00494594 --0.006016 0.00460586 --0.00663356 0.00417621 --0.00719762 0.00366132 --0.00769374 0.00306772 --0.00810828 0.0024041 --0.00842893 0.00168131 --0.00864509 0.000912188 --0.00874839 0.000111275 --0.00873307 -0.000705518 --0.00859629 -0.00152138 --0.00833835 -0.00231913 --0.00796275 -0.00308179 --0.00747612 -0.00379315 --0.00688795 -0.00443836 --0.00621032 -0.00500433 --0.00545734 -0.00548018 --0.00464469 -0.00585744 --0.00378905 -0.00613023 --0.00290757 -0.00629524 --0.00201735 -0.0063517 --0.00113502 -0.00630117 --0.000276361 -0.00614734 -0.000543972 -0.00589582 -0.00131267 -0.00555378 -0.00201794 -0.00512977 -0.00264954 -0.00463342 -0.00319891 -0.00407522 -0.00365911 -0.0034663 -0.00402485 -0.00281822 -0.00429249 -0.00214282 -0.00445994 -0.00145209 -0.00452668 -0.000757982 -0.00449372 -7.23101e-05 -0.00436354 0.00059336 -0.00414008 0.00122784 -0.00382869 0.00182043 -0.00343613 0.00236104 -0.00297049 0.00284035 -0.00244119 0.0032499 -0.00185888 0.0035823 -0.00123539 0.00383136 -0.000583595 0.00399228 --8.27271e-05 0.00406183 --0.000749079 0.00403857 --0.0014005 0.00392293 --0.00202187 0.00371747 --0.00259827 0.00342692 --0.00311538 0.00305823 --0.00355996 0.00262058 --0.00392031 0.00212522 --0.00418673 0.00158531 --0.00435196 0.00101549 --0.00441156 0.000431554 --0.00436414 -0.000150138 --0.00421145 -0.000713197 --0.00395841 -0.0012418 --0.00361288 -0.00172126 --0.00318531 -0.0021385 --0.0026884 -0.0024825 --0.00213646 -0.00274456 --0.00154499 -0.00291845 --0.000930025 -0.00300052 --0.000307715 -0.00298956 -0.000306186 -0.00288675 -0.000896679 -0.00269536 -0.00144983 -0.00242058 -0.00195298 -0.0020692 -0.00239494 -0.00164941 -0.00276608 -0.00117045 -0.00305835 -0.000642454 -0.00326536 -7.61943e-05 -0.00338233 0.000517116 -0.00340609 0.00112599 -0.00333502 0.00173881 -0.00316905 0.002344 -0.00290959 0.0029301 -0.00255953 0.00348593 -0.00212315 0.00400066 -0.00160616 0.00446398 -0.00101561 0.00486615 -0.000359859 0.0051982 --0.000351414 0.005452 --0.00110732 0.00562046 --0.00189583 0.00569765 --0.00270382 0.005679 --0.00351729 0.0055615 --0.00432148 0.00534383 --0.00510113 0.00502657 --0.00584075 0.00461236 --0.00652499 0.00410601 --0.00713899 0.00351457 --0.00766889 0.00284733 --0.00810225 0.00211574 --0.00842857 0.00133317 --0.00863968 0.000514676 --0.00873017 -0.000323451 --0.00869768 -0.00116417 --0.00854301 -0.00199025 --0.00827016 -0.00278485 --0.00788619 -0.00353208 --0.00740094 -0.00421756 --0.00682659 -0.0048288 --0.00617721 -0.00535559 --0.00546821 -0.00579015 --0.00471578 -0.00612723 --0.00393641 -0.00636411 --0.00314638 -0.00650046 --0.00236139 -0.00653815 --0.00159621 -0.00648104 --0.000864441 -0.00633473 --0.000178338 -0.00610627 -0.000451323 -0.00580392 -0.00101531 -0.00543692 -0.00150597 -0.00501524 -0.00191723 -0.00454941 -0.00224459 -0.00405033 -0.00248508 -0.00352909 -0.00263726 -0.00299689 -0.00270114 -0.00246484 -0.0026782 -0.00194391 -0.0025713 -0.00144475 -0.0023847 -0.000977635 -0.00212403 -0.000552323 -0.00179621 -0.000177928 -0.00140946 0.000137204 -0.000973252 0.000385644 -0.000498219 0.000561036 --3.91598e-06 0.000658268 --0.000520468 0.000673646 --0.00103795 0.000605082 --0.00154229 0.000452269 --0.00201907 0.000216841 --0.00245391 -9.74899e-05 --0.00283275 -0.000484853 --0.00314237 -0.000937196 --0.00337079 -0.00144435 --0.00350776 -0.00199417 --0.00354519 -0.00257284 --0.00347759 -0.00316519 --0.00330234 -0.0037552 --0.00301992 -0.00432651 --0.00263394 -0.004863 --0.00215106 -0.00534936 --0.00158075 -0.00577164 --0.000934892 -0.00611769 --0.000227375 -0.00637753 -0.000526482 -0.00654359 -0.00131045 -0.00661083 -0.00210791 -0.00657674 -0.00290237 -0.00644127 -0.00367787 -0.00620664 -0.00441932 -0.00587715 -0.00511282 -0.00545888 -0.0057458 -0.0049595 -0.00630724 -0.00438791 -0.00678768 -0.0037541 -0.00717933 -0.00306881 -0.00747603 -0.00234341 -0.00767328 -0.00158963 -0.00776819 -0.000819462 -0.00775946 -4.49676e-05 -0.00764734 0.000721848 -0.0074336 0.00146916 -0.00712147 0.00218544 -0.00671566 0.00285957 -0.00622226 0.003481 -0.00564874 0.0040398 -0.00500392 0.00452685 -0.00429789 0.00493398 -0.00354198 0.00525409 -0.00274861 0.00548135 -0.00193126 0.00561135 -0.00110423 0.0056413 -0.000282503 0.00557017 --0.000518552 0.00539891 --0.00128345 0.00513053 --0.00199696 0.00477025 --0.00264452 0.0043255 --0.00321269 0.0038059 --0.00368959 0.00322316 --0.00406541 0.00259079 --0.00433276 0.00192386 --0.00448708 0.00123847 --0.00452685 0.000551326 --0.00445371 -0.000120873 --0.00427242 -0.000761984 --0.00399068 -0.00135699 --0.00361879 -0.00189247 --0.00316926 -0.00235704 --0.0026563 -0.0027416 --0.00209526 -0.00303952 --0.00150208 -0.00324671 --0.000892858 -0.00336154 --0.000283313 -0.00338473 -0.000311548 -0.00331911 -0.000877747 -0.00316945 -0.00140257 -0.00294212 -0.00187475 -0.00264488 -0.00228452 -0.0022866 -0.00262374 -0.00187703 -0.00288589 -0.00142656 -0.00306606 -0.000946067 -0.00316092 -0.000446673 -0.00316874 6.03597e-05 -0.00308929 0.000563789 -0.00292383 0.00105252 -0.00267508 0.00151572 -0.00234717 0.00194295 -0.0019456 0.00232425 -0.00147721 0.0026503 -0.000950161 0.00291249 -0.000373841 0.00310313 --0.000241152 0.00321553 --0.000883112 0.00324419 --0.00153932 0.00318497 --0.0021962 0.00303525 --0.00283948 0.00279413 --0.00345444 0.00246255 --0.00402618 0.0020435 --0.00453999 0.00154209 --0.00498172 0.000965631 --0.00533819 0.000323597 --0.00559772 -0.000372434 --0.00575054 -0.00110899 --0.00578923 -0.00187101 --0.00570912 -0.00264222 --0.00550857 -0.00340566 --0.0051891 -0.0041442 --0.00475541 -0.00484113 --0.00421526 -0.00548073 --0.0035792 -0.00604881 --0.00286011 -0.00653312 --0.00207278 -0.00692371 --0.00123334 -0.00721312 --0.000358713 -0.00739649 -0.000533906 -0.00747153 -0.00142754 -0.0074384 -0.00230584 -0.00729955 -0.0031534 -0.00705948 -0.00395608 -0.00672447 -0.00470111 -0.0063023 -0.00537729 -0.00580201 -0.00597502 -0.00523365 -0.00648638 -0.00460801 -0.00690507 -0.00393647 -0.00722647 -0.00323077 -0.00744754 -0.00250288 -0.00756684 -0.00176482 -0.00758447 -0.00102856 -0.00750203 -0.000305872 -0.0073226 0.000391772 -0.00705071 0.00105332 -0.00669228 0.00166825 -0.00625463 0.00222674 -0.00574638 0.00271972 -0.00517749 0.0031391 -0.00455909 0.0034779 -0.00390347 0.0037304 -0.00322392 0.00389236 -0.00253455 0.00396116 -0.00185012 0.00393603 -0.00118574 0.00381817 -0.000556566 0.0036109 --2.25989e-05 0.00331979 --0.00053772 0.0029526 --0.000976001 0.00251932 --0.00132636 0.00203193 --0.0015799 0.0015042 --0.0017303 0.000951274 --0.00177416 0.000389245 --0.00171118 -0.000165416 --0.00154427 -0.000696424 --0.0012794 -0.00118827 --0.000925402 -0.00162677 --0.000493592 -0.00199953 -2.70698e-06 -0.00229631 -0.00054869 -0.00250928 -0.00112862 -0.00263312 -0.00172636 -0.00266507 -0.00232589 -0.0026048 -0.0029117 -0.00245426 -0.00346915 -0.00221742 -0.00398477 -0.00190009 -0.00444647 -0.00150957 -0.0048436 -0.00105445 -0.00516715 -0.00054431 -0.00540969 1.04888e-05 -0.00556544 0.000599016 -0.00563022 0.00120996 -0.00560147 0.00183181 -0.00547814 0.00245297 -0.00526072 0.00306192 -0.00495119 0.00364732 -0.00455293 0.00419815 -0.00407078 0.00470378 -0.00351093 0.00515414 -0.00288091 0.00553977 -0.00218957 0.00585203 -0.00144703 0.00608319 -0.00066459 0.00622658 --0.000145305 0.00627678 --0.000969217 0.0062298 --0.00179285 0.00608323 --0.00260124 0.00583646 --0.00337901 0.00549082 --0.0041107 0.00504975 --0.00478109 0.0045189 --0.00537564 0.00390614 --0.00588094 0.00322161 --0.00628523 0.00247751 --0.00657879 0.00168789 --0.00675444 0.000868354 --0.00680788 3.556e-05 --0.0067379 -0.000793274 --0.00654651 -0.00160095 --0.0062389 -0.00237087 --0.00582321 -0.00308762 --0.00531024 -0.00373743 --0.00471298 -0.0043086 --0.0040461 -0.00479177 --0.00332542 -0.00518008 --0.00256735 -0.00546922 --0.0017884 -0.00565736 --0.00100472 -0.005745 --0.000231751 -0.0057348 -0.000516103 -0.00563129 -0.00122568 -0.00544064 -0.00188521 -0.00517039 -0.00248446 -0.0048292 -0.00301472 -0.00442662 -0.0034689 -0.00397287 -0.00384146 -0.00347863 -0.00412843 -0.00295493 -0.00432738 -0.00241293 -0.00443736 -0.00186384 -0.00445888 -0.00131875 -0.00439391 -0.000788557 -0.00424578 -0.000283835 -0.00401923 0.000185282 -0.00372032 0.000609217 -0.00335645 0.000979069 -0.00293627 0.00128676 -0.00246966 0.00152518 -0.00196767 0.00168834 -0.00144237 0.00177158 -0.000906782 0.00177171 -0.000374634 0.00168719 --0.00013982 0.00151837 --0.00062211 0.00126755 --0.00105788 0.000939192 --0.00143331 0.000539902 --0.0017355 7.84798e-05 --0.00195302 -0.000434197 --0.0020763 -0.000985369 --0.00209811 -0.00156069 --0.00201392 -0.00214465 --0.0018222 -0.00272105 --0.00152451 -0.00327355 --0.00112557 -0.00378628 --0.000633055 -0.00424437 --5.73322e-05 -0.0046345 -0.000588956 -0.00494528 -0.00129138 -0.00516761 -0.00203427 -0.00529484 -0.00280123 -0.00532288 -0.0035757 -0.00525016 -0.00434138 -0.00507746 -0.00508265 -0.00480782 -0.00578489 -0.0044462 -0.00643473 -0.00399929 -0.00702022 -0.00347522 -0.00753095 -0.00288331 -0.00795815 -0.00223382 -0.00829466 -0.0015377 -0.00853498 -0.000806448 -0.00867526 -5.18715e-05 -0.00871324 0.000714043 -0.00864821 0.00147928 -0.00848102 0.00223194 -0.008214 0.00296032 -0.00785095 0.00365309 -0.0073971 0.00429935 -0.00685906 0.00488881 -0.00624483 0.00541186 -0.00556369 0.00585975 -0.00482621 0.0062247 -0.00404415 0.0065001 -0.00323034 0.00668065 -0.00239859 0.00676255 -0.00156349 0.00674365 -0.000740216 0.00662369 --5.5763e-05 0.00640438 --0.000809002 0.0060896 --0.00150446 0.00568539 --0.00212791 0.00520008 --0.00266645 0.0046441 --0.0031089 0.00402993 --0.00344631 0.00337174 --0.00367231 0.00268508 --0.00378345 0.00198639 --0.00377942 0.0012925 --0.00366304 0.000619996 --0.00344021 -1.52936e-05 --0.00311969 -0.000598859 --0.00271266 -0.00111797 --0.00223237 -0.00156203 --0.00169352 -0.00192282 --0.00111177 -0.00219464 --0.000503202 -0.0023743 -0.000116174 -0.00246104 -0.000730839 -0.00245636 -0.00132612 -0.00236383 -0.00188848 -0.00218879 -0.00240569 -0.00193814 -0.00286702 -0.00162005 -0.00326329 -0.00124371 -0.00358691 -0.00081909 -0.00383194 -0.000356757 -0.00399402 0.000132346 -0.00407039 0.000637052 -0.00405982 0.00114613 -0.00396259 0.00164839 -0.00378047 0.00213286 -0.00351664 0.00258887 -0.00317569 0.00300614 -0.00276357 0.00337496 -0.00228756 0.00368628 -0.0017562 0.00393181 -0.0011793 0.00410421 -0.000567808 0.00419723 --6.62365e-05 0.00420583 --0.000709837 0.00412643 --0.00134919 0.00395699 --0.00196988 0.00369729 --0.00255714 0.00334899 --0.00309616 0.00291585 --0.00357243 0.00240377 --0.00397216 0.00182085 --0.00428275 0.00117735 --0.0044932 0.000485559 --0.00459463 -0.000240438 --0.00458068 -0.000985106 --0.00444783 -0.00173189 --0.00419567 -0.00246373 --0.00382696 -0.00316362 --0.00334763 -0.00381522 --0.00276658 -0.00440338 --0.00209531 -0.00491463 --0.00134753 -0.00533763 --0.000538614 -0.0056634 -0.000314911 -0.00588551 -0.00119595 -0.00600015 -0.00208732 -0.00600603 -0.00297223 -0.00590426 -0.00383465 -0.00569816 -0.00465963 -0.00539299 -0.00543352 -0.00499568 -0.00614415 -0.00451458 -0.00678095 -0.00395922 -0.00733495 -0.00333998 -0.00779888 -0.00266797 -0.00816711 -0.00195478 -0.00843565 -0.00121229 -0.0086021 -0.000452557 -0.00866565 0.000312372 -0.00862701 0.00107055 -0.00848839 0.00181028 -0.00825344 0.00252019 -0.00792727 0.00318941 -0.00751637 0.00380764 -0.0070286 0.00436529 -0.00647312 0.00485364 -0.00586037 0.00526499 -0.00520198 0.00559278 -0.00451065 0.00583183 -0.00380004 0.00597845 -0.00308458 0.00603069 -0.00237923 0.00598849 -0.00169919 0.00585382 -0.00105958 0.00563082 -0.000475013 0.00532588 --4.08309e-05 0.0049476 --0.000475693 0.00450673 --0.000819203 0.00401598 --0.00106333 0.00348968 --0.00120277 0.00294342 --0.00123522 0.00239352 --0.00116153 0.00185648 --0.000985758 0.0013484 --0.000714944 0.000884384 --0.000358885 0.000478036 -7.03095e-05 0.000141013 -0.000558702 -0.000117295 -0.00109108 -0.000289966 -0.00165149 -0.000372625 -0.0022238 -0.000363414 -0.00279212 -0.000262861 -0.00334123 -7.36936e-05 -0.00385693 0.000199403 -0.00432623 0.000550047 -0.00473758 0.000970433 -0.00508096 0.00145159 -0.00534795 0.00198362 -0.00553176 0.00255596 -0.00562722 0.00315752 -0.00563077 0.00377691 -0.00554042 0.00440261 -0.00535573 0.00502305 -0.00507775 0.00562679 -0.00470898 0.00620263 -0.00425336 0.0067397 -0.00371623 0.0072276 -0.00310427 0.00765649 -0.00242551 0.00801724 -0.00168927 0.00830154 -0.000906097 0.00850206 -8.77161e-05 0.0086126 --0.000753064 0.00862827 --0.00160248 0.00854566 --0.00244598 0.00836301 --0.00326843 0.00808044 --0.00405441 0.00770005 --0.00478849 0.00722609 --0.00545567 0.00666504 --0.00604179 0.00602566 --0.006534 0.00531885 --0.00692123 0.00455756 --0.00719468 0.00375649 --0.00734821 0.00293171 --0.00737866 0.00210018 --0.00728602 0.00127922 --0.00707353 0.000485882 --0.00674755 -0.000263568 --0.00631731 -0.000954252 --0.00579451 -0.00157311 --0.0051929 -0.00210929 --0.00452769 -0.00255433 --0.00381504 -0.00290233 --0.00307151 -0.00314994 --0.00231357 -0.00329622 --0.00155719 -0.00334254 --0.000817509 -0.0032923 --0.000108525 -0.0031507 -0.000557074 -0.00292449 -0.00116805 -0.00262168 -0.0017147 -0.00225132 -0.00218889 -0.00182325 -0.00258408 -0.00134793 -0.0028953 -0.000836208 -0.00311913 -0.000299215 -0.00325367 0.000251823 -0.00329848 0.000805695 -0.00325461 0.00135132 -0.0031245 0.00187788 -0.00291199 0.0023749 -0.0026223 0.0028324 -0.00226196 0.00324097 -0.00183883 0.00359196 -0.00136202 0.00387757 -0.00084185 0.00409103 -0.000289754 0.00422675 --0.000281812 0.00428052 --0.000859532 0.0042497 --0.00142942 0.00413335 --0.00197709 0.00393246 --0.00248801 0.00365006 --0.00294793 0.00329135 --0.00334328 0.00286371 --0.00366158 0.00237667 --0.00389197 0.00184181 --0.00402564 0.00127248 --0.00405627 0.000683498 --0.00398035 9.06782e-05 --0.00379743 -0.000489676 --0.00351021 -0.00104134 --0.00312448 -0.00154876 --0.00264891 -0.00199759 --0.00209474 -0.00237518 --0.00147528 -0.00267098 --0.00080545 -0.00287681 --0.00010121 -0.00298696 -0.000620981 -0.00299832 -0.00134465 -0.00291022 -0.00205379 -0.00272431 -0.00273315 -0.00244439 -0.00336864 -0.00207609 -0.00394745 -0.00162666 -0.00445827 -0.00110471 -0.00489136 -0.000519899 -0.00523861 0.000117241 -0.00549354 0.000795557 -0.00565134 0.00150345 -0.00570878 0.00222907 -0.00566425 0.00296044 -0.00551767 0.00368561 -0.00527047 0.00439277 -0.00492558 0.0050704 -0.00448735 0.00570735 -0.00396155 0.00629298 -0.00335535 0.00681726 -0.00267723 0.00727092 -0.001937 0.00764559 -0.00114568 0.00793394 -0.000315454 0.00812986 --0.00054043 0.00822859 --0.00140783 0.00822697 --0.0022719 0.00812356 --0.00311728 0.00791885 --0.00392845 0.00761536 --0.00469005 0.00721783 --0.00538725 0.00673317 --0.00600626 0.00617057 --0.00653472 0.00554129 --0.00696224 0.00485852 --0.00728076 0.00413706 --0.007485 0.0033929 --0.00757267 0.00264274 --0.00754462 0.00190343 --0.00740488 0.0011914 --0.00716047 0.000522057 --0.00682112 -9.06587e-05 --0.00639889 -0.000634758 --0.00590762 -0.00110049 --0.00536248 -0.00148057 --0.00477934 -0.0017702 --0.00417432 -0.00196712 --0.00356329 -0.00207141 --0.0029615 -0.00208536 --0.00238322 -0.00201321 --0.00184151 -0.00186089 --0.00134805 -0.00163579 --0.000913007 -0.00134644 --0.000544958 -0.00100233 --0.000250882 -0.000613633 --3.6141e-05 -0.000191038 -9.54964e-05 0.000254446 -0.000141826 0.000711648 -0.000102173 0.00116938 --2.26495e-05 0.00161655 --0.000230374 0.00204232 --0.00051732 0.00243619 --0.000878423 0.00278811 --0.00130728 0.00308861 --0.00179616 0.00332894 --0.00233609 0.00350118 --0.00291687 0.00359837 --0.00352719 0.00361472 --0.00415466 0.00354572 --0.00478601 0.00338834 --0.00540722 0.00314122 --0.00600377 0.0028048 --0.00656086 0.00238153 --0.00706378 0.00187595 --0.00749828 0.00129478 --0.00785101 0.000646931 --0.00810993 -5.65498e-05 --0.00826485 -0.000802682 --0.00830782 -0.0015768 --0.00823355 -0.00236294 --0.00803971 -0.00314431 --0.00772712 -0.00390383 --0.0072998 -0.0046247 --0.00676486 -0.00529098 --0.00613228 -0.00588817 --0.00541446 -0.00640358 --0.00462585 -0.00682679 --0.00378234 -0.00714983 --0.00290074 -0.00736731 --0.00199824 -0.00747643 --0.00109192 -0.00747689 --0.000198311 -0.00737071 -0.000666941 -0.00716202 -0.00148938 -0.00685681 -0.00225594 -0.0064626 -0.00295506 -0.00598828 -0.00357682 -0.00544374 -0.00411294 -0.00483972 -0.00455681 -0.00418754 -0.00490347 -0.00349896 -0.00514959 -0.00278594 -0.00529343 -0.00206058 -0.0053348 -0.0013349 -0.00527505 -0.000620779 -0.00511697 7.02093e-05 -0.00486483 0.000726877 -0.0045243 0.00133856 -0.00410243 0.00189523 -0.00360762 0.00238762 -0.00304956 0.00280741 -0.00243919 0.0031473 -0.00178858 0.00340128 -0.00111084 0.00356471 -0.000419972 0.00363457 --0.000269337 0.00360962 --0.000941971 0.00349056 --0.00158268 0.00328019 --0.00217647 0.00298351 --0.00270897 0.00260777 --0.00316698 0.00216243 --0.00353883 0.00165904 --0.00381498 0.00111098 --0.00398833 0.000533167 --0.00405466 -5.84376e-05 --0.00401282 -0.000647325 --0.00386487 -0.00121703 --0.003616 -0.0017517 --0.00327433 -0.00223669 --0.00285058 -0.00265903 --0.00235764 -0.00300785 --0.00180999 -0.00327461 --0.00122322 -0.00345333 --0.000613421 -0.00354054 -3.28964e-06 -0.00353527 -0.000611222 -0.0034389 -0.00119549 -0.00325489 -0.00174231 -0.00298857 -0.00223922 -0.00264687 -0.00267522 -0.00223805 -0.00304088 -0.00177143 -0.0033284 -0.00125716 -0.0035316 -0.000705993 -0.00364591 -0.000129116 -0.00366837 0.000462045 -0.00359757 0.00105597 -0.00343362 0.00164116 -0.00317812 0.0022063 -0.0028341 0.00274034 -0.00240601 0.00323261 -0.00189966 0.00367296 -0.00132224 0.00405184 -0.000682217 0.00436044 --1.06478e-05 0.00459086 --0.000745393 0.00473619 --0.00150992 0.00479076 --0.00229108 0.00475022 --0.00307483 0.00461179 --0.00384644 0.00437443 --0.00459066 0.00403899 --0.00529206 0.00360838 --0.00593538 0.00308771 --0.00650591 0.00248433 --0.00698996 0.00180781 --0.00737532 0.00106989 --0.00765177 0.00028423 --0.00781149 -0.000533889 --0.00784946 -0.00136797 --0.00776373 -0.00220082 --0.00755558 -0.00301512 --0.00722949 -0.00379399 --0.00679302 -0.00452163 --0.00625644 -0.00518376 --0.00563237 -0.00576811 --0.00493526 -0.00626468 --0.00418084 -0.00666599 --0.00338554 -0.00696712 --0.00256605 -0.00716565 --0.00173875 -0.00726158 --0.00091943 -0.0072571 --0.000122869 -0.00715635 -0.000637337 -0.00696518 -0.00134898 -0.0066909 -0.00200134 -0.00634196 -0.00258526 -0.0059278 -0.00309316 -0.00545854 -0.00351905 -0.00494486 -0.0038585 -0.00439776 -0.00410863 -0.00382847 -0.00426805 -0.00324828 -0.00433686 -0.00266839 -0.00431658 -0.00209985 -0.00421015 -0.00155343 -0.0040219 -0.00103946 -0.00375751 -0.00056778 -0.00342399 -0.000147592 -0.00302963 0.000212691 -0.002584 0.000505574 -0.00209782 0.000724644 -0.00158291 0.000864745 -0.00105207 0.000922156 -0.000518898 0.000894778 --2.43285e-06 0.000782316 --0.00049742 0.000586438 --0.000951575 0.000310912 --0.00135081 -3.8314e-05 --0.00168186 -0.000453093 --0.00193276 -0.000923151 --0.00209333 -0.00143625 --0.00215558 -0.00197848 --0.00211417 -0.00253461 --0.00196668 -0.00308859 --0.0017138 -0.00362411 --0.00135937 -0.00412511 --0.000910274 -0.00457646 --0.000376169 -0.00496441 -0.000230894 -0.00527706 -0.000896945 -0.00550476 -0.00160663 -0.00564026 -0.00234377 -0.00567886 -0.00309187 -0.00561839 -0.00383461 -0.00545912 -0.00455627 -0.00520356 -0.00524205 -0.00485623 -0.00587837 -0.00442345 -0.00645302 -0.003913 -0.00695532 -0.00333392 -0.00737619 -0.00269623 -0.00770819 -0.0020107 -0.00794551 -0.00128868 -0.00808399 -0.000541855 -0.00812105 0.000217879 -0.0080557 0.000978563 -0.00788846 0.00172832 -0.00762137 0.00245546 -0.00725789 0.00314861 -0.00680294 0.00379682 -0.00626284 0.00438971 -0.00564524 0.00491753 -0.00495916 0.00537135 -0.00421486 0.0057432 -0.00342381 0.0060262 -0.00259863 0.00621473 -0.00175292 0.00630465 -0.000901122 0.0062934 -5.83161e-05 0.00618029 --0.000760034 0.00596654 --0.0015384 0.00565554 --0.00226156 0.00525284 --0.00291501 0.00476625 --0.00348543 0.00420577 --0.00396113 0.00358345 --0.00433255 0.00291318 --0.00459264 0.00221027 --0.00473723 0.0014911 --0.00476521 0.000772521 --0.00467868 7.13155e-05 --0.00448283 -0.000596375 --0.00418579 -0.00121561 --0.00379825 -0.00177314 --0.00333303 -0.00225778 --0.00280457 -0.00266069 --0.0022284 -0.00297552 --0.00162056 -0.00319846 --0.000997145 -0.00332814 --0.00037384 -0.00336551 -0.000234438 -0.00331365 -0.000813845 -0.00317745 -0.00135182 -0.00296343 -0.00183725 -0.00267943 -0.00226057 -0.00233436 -0.00261378 -0.00193799 -0.00289052 -0.00150069 -0.00308602 -0.00103327 -0.0031971 -0.000546798 -0.00322212 -5.24534e-05 -0.00316094 0.000438622 -0.00301491 0.000915438 -0.00278679 0.00136728 -0.00248077 0.00178382 -0.00210237 0.00215522 -0.00165847 0.00247229 -0.00115722 0.00272656 -0.000608027 0.00291046 -2.14703e-05 0.00301745 --0.000590759 0.00304219 --0.00121598 0.00298069 --0.00184065 0.00283051 --0.00245057 0.00259092 --0.00303111 0.0022631 --0.00356752 0.00185024 --0.00404525 0.00135766 --0.00445035 0.000792888 --0.00476994 0.000165633 --0.00499267 -0.000512338 --0.00510917 -0.0012274 --0.00511248 -0.00196437 --0.00499844 -0.00270695 --0.00476593 -0.0034382 --0.00441701 -0.00414113 --0.00395695 -0.00479925 --0.003394 -0.00539714 --0.00273914 -0.00592101 --0.00200563 -0.00635907 --0.00120855 -0.00670185 --0.000364205 -0.00694246 -0.000510382 -0.00707654 -0.00139802 -0.00710237 -0.00228181 -0.0070206 -0.00314555 -0.00683417 -0.00397406 -0.00654801 -0.00475342 -0.00616879 -0.00547117 -0.00570464 -0.00611644 -0.00516493 -0.00667997 -0.00455993 -0.00715418 -0.00390069 -0.00753317 -0.00319875 -0.00781265 -0.00246599 -0.00798999 -0.00171449 -0.0080641 -0.000956326 -0.00803546 -0.000203513 -0.00790604 0.000532173 -0.00767925 0.00123928 -0.00735997 0.00190681 -0.00695446 0.00252434 -0.00647034 0.00308211 -0.00591656 0.00357121 -0.00530334 0.0039837 -0.00464211 0.00431277 -0.00394539 0.0045529 -0.00322669 0.00470008 -0.00250034 0.00475195 -0.00178126 0.00470798 -0.0010847 0.00456969 -0.000425889 0.00434069 --0.000180315 0.00402686 --0.00071989 0.0036363 --0.00118011 0.0031793 --0.00155001 0.00266817 --0.00182088 0.00211692 --0.00198664 0.00154097 --0.00204417 0.000956581 --0.00199349 0.000380355 --0.00183783 -0.000171364 --0.0015835 -0.000683078 --0.00123965 -0.00114068 --0.00081787 -0.00153191 --0.000331701 -0.00184672 -0.00020388 -0.00207751 -0.000773036 -0.00221922 -0.0013596 -0.00226933 -0.00194758 -0.00222776 -0.00252154 -0.00209669 -0.00306701 -0.00188031 -0.00357067 -0.0015846 -0.00402064 -0.00121699 -0.00440651 -0.000786164 -0.0047195 -0.000301772 -0.00495243 0.000225803 -0.00509977 0.000785641 -0.00515759 0.00136648 -0.00512355 0.00195686 -0.00499683 0.0025453 -0.00477812 0.00312039 -0.0044696 0.00367094 -0.00407485 0.00418607 -0.00359884 0.00465534 -0.00304791 0.00506886 -0.00242974 0.00541738 -0.00175328 0.00569248 -0.00102874 0.00588665 -0.000267515 0.00599346 --0.000517909 0.00600777 --0.00131406 0.00592583 --0.00210662 0.00574553 --0.00288065 0.00546655 --0.00362084 0.00509054 --0.00431179 0.00462123 --0.00493843 0.00406461 --0.00548638 0.00342889 --0.00594249 0.00272449 --0.00629525 0.00196392 --0.00653531 0.00116155 --0.00665588 0.000333178 --0.0066531 -0.000504323 --0.00652625 -0.00133361 --0.00627787 -0.00213742 --0.00591366 -0.00289918 --0.00544232 -0.00360356 --0.00487511 -0.00423699 --0.00422548 -0.00478799 --0.00350849 -0.0052475 --0.00274027 -0.005609 --0.00193747 -0.00586854 --0.00111679 -0.00602466 --0.000294484 -0.00607823 -0.000513966 -0.00603223 -0.00129415 -0.00589152 -0.00203295 -0.00566258 -0.00271867 -0.00535319 -0.00334115 -0.00497226 -0.00389181 -0.00452953 -0.00436366 -0.0040354 -0.00475127 -0.0035007 -0.00505079 -0.00293659 -0.00525989 -0.00235435 -0.00537774 -0.00176529 -0.00540496 -0.00118059 -0.0053436 -0.000611242 -0.00519712 -6.78851e-05 -0.00497035 0.000439276 -0.00466946 0.000900598 -0.00430194 0.00130713 -0.00387658 0.00165074 -0.00340337 0.00192429 -0.00289346 0.00212178 -0.00235908 0.00223852 -0.00181335 0.00227135 -0.00127012 0.00221877 -0.000743763 0.00208117 -0.000248841 0.00186096 --0.000200224 0.00156267 --0.000589559 0.00119307 --0.000906289 0.000761075 --0.00113901 0.000277715 --0.00127827 -0.000244117 --0.00131698 -0.000789963 --0.00125083 -0.00134423 --0.00107852 -0.00189068 --0.000801881 -0.00241302 --0.000425905 -0.00289547 -4.14664e-05 -0.00332332 -0.000589638 -0.00368349 -0.00120579 -0.00396487 -0.00187537 -0.00415869 -0.00258267 -0.00425866 -0.00331135 -0.00426105 -0.00404494 -0.00416464 -0.00476733 -0.00397057 -0.00546315 -0.00368214 -0.00611806 -0.0033046 -0.00671902 -0.00284483 -0.00725444 -0.00231112 -0.00771427 -0.0017129 -0.0080901 -0.00106049 -0.00837515 -0.000364866 -0.00856428 0.000362506 -0.00865396 0.00110987 -0.00864226 0.00186533 -0.00852878 0.00261698 -0.00831465 0.00335304 -0.00800246 0.00406199 -0.00759626 0.00473263 -0.00710148 0.00535427 -0.00652497 0.00591678 -0.00587489 0.00641075 -0.00516072 0.00682765 -0.00439319 0.00715991 -0.00358421 0.00740115 -0.00274676 0.00754631 -0.00189478 0.00759186 -0.00104297 0.00753596 -0.000206579 0.00737862 --0.000598861 0.00712192 --0.0013579 0.00677005 --0.00205553 0.00632948 --0.00267764 0.00580887 --0.00321148 0.00521905 --0.00364612 0.00457286 --0.00397292 0.0038848 --0.00418589 0.00317069 --0.00428204 0.0024472 --0.00426149 0.00173126 --0.00412758 0.00103953 --0.00388669 0.000387774 --0.00354801 -0.000209617 --0.00312315 -0.000740122 --0.00262566 -0.00119341 --0.00207051 -0.00156157 --0.00147352 -0.00183921 --0.000850848 -0.00202347 --0.000218514 -0.0021139 -0.000408021 -0.00211228 -0.0010142 -0.0020224 -0.00158661 -0.00184982 -0.00211323 -0.00160159 -0.0025835 -0.00128598 -0.00298842 -0.000912232 -0.00332062 -0.000490365 -0.00357431 -3.0925e-05 -0.0037453 0.000455177 -0.00383098 0.000956832 -0.00383025 0.00146288 -0.00374351 0.00196224 -0.00357261 0.00244403 -0.0033208 0.00289767 -0.00299274 0.00331304 -0.00259442 0.00368053 -0.00213314 0.0039912 -0.00161749 0.00423693 -0.00105725 0.0044105 -0.000463394 0.00450579 --0.000152071 0.00451794 --0.000776174 0.00444352 --0.00139516 0.00428068 --0.00199469 0.00402937 --0.0025601 0.00369148 --0.00307672 0.00327095 --0.00353021 0.00277392 --0.00390704 0.0022087 --0.00419488 0.00158575 --0.0043831 0.000917548 --0.00446325 0.000218305 --0.00442943 -0.000496361 --0.00427864 -0.00120989 --0.00401101 -0.00190529 --0.00362985 -0.00256574 --0.00314164 -0.00317515 --0.00255574 -0.00371874 --0.0018841 -0.00418349 --0.00114075 -0.00455853 --0.000341311 -0.00483545 -0.000497549 -0.00500839 -0.00135869 -0.00507409 -0.002225 -0.00503185 -0.0030798 -0.00488328 -0.00390729 -0.00463221 -0.00469279 -0.00428433 -0.00542295 -0.00384696 -0.00608596 -0.00332881 -0.00667161 -0.00273967 -0.00717135 -0.00209019 -0.0075783 -0.00139168 -0.00788724 -0.000655871 -0.0080946 0.000105237 -0.0081984 0.000879521 -0.00819823 0.00165489 -0.0080952 0.0024194 -0.00789191 0.00316137 -0.0075924 0.00386951 -0.00720213 0.00453303 -0.00672795 0.00514174 -0.00617803 0.00568622 -0.00556188 0.0061579 -0.00489021 0.00654928 -0.00417493 0.00685403 -0.00342899 0.0070672 -0.00266627 0.00718539 -0.00190137 0.00720692 -0.0011494 0.00713205 -0.00042569 0.00696308 --0.000254603 0.0067045 --0.000876855 0.00636302 --0.00142744 0.0059476 --0.00189422 0.00546934 --0.00226699 0.00494124 --0.00253796 0.00437792 --0.00270211 0.0037952 --0.00275745 0.00320956 --0.00270522 0.00263761 --0.00254979 0.00209547 --0.00229859 0.0015982 --0.00196172 0.0011593 --0.00155158 0.000790248 --0.00108233 0.000500207 --0.00056933 0.000295844 --2.86149e-05 0.000181259 -0.000523656 0.000158036 -0.00107165 0.000225377 -0.00160028 0.000380311 -0.00209547 0.000617937 -0.00254446 0.000931697 -0.00293592 0.00131364 -0.00326008 0.00175471 -0.00350878 0.00224494 -0.00367551 0.00277373 -0.00375537 0.00333004 -0.00374506 0.00390252 -0.00364284 0.00447971 -0.00344852 0.00505017 -0.00316337 0.00560259 -0.00279011 0.00612592 -0.00233288 0.00660948 -0.00179718 0.00704304 -0.00118987 0.00741699 -0.000519105 0.00772242 --0.000205672 0.00795128 --0.000973812 0.00809649 --0.00177351 0.00815212 --0.00259191 0.00811357 --0.00341522 0.00797772 --0.0042289 0.00774316 --0.00501784 0.00741029 --0.0057667 0.00698157 --0.00646018 0.0064616 --0.00708345 0.0058572 --0.00762255 0.00517745 --0.00806491 0.00443361 --0.00839982 0.00363892 --0.00861885 0.00280836 --0.0087163 0.00195821 --0.00868952 0.00110561 --0.00853903 0.000267982 --0.00826863 -0.000537593 --0.00788522 -0.00129492 --0.00739856 -0.00198927 --0.00682088 -0.00260779 --0.00616635 -0.0031399 --0.00545057 -0.00357751 --0.00469 -0.00391507 --0.00390142 -0.00414962 --0.00310147 -0.00428064 --0.0023062 -0.00430986 --0.00153077 -0.00424106 --0.000789143 -0.00407979 --9.3948e-05 -0.0038331 -0.000543677 -0.00350928 -0.00111415 -0.00311763 -0.00160948 -0.0026682 -0.00202326 -0.00217164 -0.00235067 -0.00163896 -0.00258844 -0.00108142 -0.00273482 -0.000510378 -0.00278953 6.28611e-05 -0.00275374 0.000627129 -0.00263005 0.00117152 -0.00242245 0.00168552 -0.00213629 0.00215906 -0.00177825 0.00258273 -0.00135634 0.00294782 -0.000879801 0.00324653 -0.000359112 0.00347207 --0.000194143 0.00361888 --0.000767365 0.00368279 --0.0013471 0.0036612 --0.00191923 0.00355327 --0.00246924 0.00336008 --0.00298254 0.0030848 --0.0034448 0.00273276 --0.00384243 0.00231152 --0.00416297 0.00183079 --0.00439565 0.00130231 --0.0045318 0.000739597 --0.00456527 0.000157595 --0.00449279 -0.000427789 --0.0043142 -0.00100022 --0.00403248 -0.00154351 --0.00365372 -0.0020422 --0.00318687 -0.00248213 --0.0026434 -0.0028509 --0.00203681 -0.00313824 --0.00138214 -0.00333631 --0.000695371 -0.00343979 -7.07559e-06 -0.00344589 -0.000708855 -0.00335432 -0.00139413 -0.00316707 -0.00204794 -0.00288821 -0.00265645 -0.00252363 -0.00320721 -0.00208078 -0.00368926 -0.00156842 -0.00409323 -0.000996296 -0.00441138 -0.000375001 -0.00463761 0.000284308 -0.00476746 0.000970071 -0.00479805 0.0016705 -0.00472808 0.00237371 -0.0045578 0.0030679 -0.00428892 0.00374139 -0.00392463 0.00438284 -0.00346952 0.00498128 -0.0029296 0.00552627 -0.00231223 0.00600798 -0.00162608 0.00641738 -0.000881139 0.00674632 -8.8584e-05 0.00698771 --0.00073925 0.0071357 --0.001589 0.00718582 --0.00244641 0.00713519 --0.00329653 0.00698269 --0.00412398 0.00672913 --0.0049132 0.00637742 --0.00564885 0.00593263 --0.0063162 0.00540211 --0.00690158 0.00479539 --0.00739288 0.00412415 --0.00777997 0.00340193 --0.00805517 0.00264384 --0.00821361 0.00186615 --0.00825346 0.00108574 --0.00817611 0.000319558 --0.00798608 -0.000415947 --0.00769089 -0.00110543 --0.00730075 -0.00173511 --0.0068281 -0.00229324 --0.00628712 -0.00277036 --0.00569322 -0.00315948 --0.00506244 -0.00345617 --0.00441097 -0.00365849 --0.00375468 -0.00376683 --0.00310875 -0.00378377 --0.00248734 -0.00371379 --0.00190337 -0.00356303 --0.00136832 -0.00333901 --0.000892187 -0.00305039 --0.000483348 -0.00270671 --0.000148592 -0.00231817 -0.000106895 -0.00189544 -0.00027951 -0.00144951 -0.000367195 -0.000991486 -0.000369402 -0.000532467 -0.000287052 -8.34435e-05 -0.000122501 0.000344845 --0.0001205 0.000742011 --0.000436834 0.00109814 --0.000820055 0.00140389 --0.00126242 0.00165065 --0.00175495 0.00183063 --0.00228744 0.00193704 --0.00284859 0.00196421 --0.00342606 0.00190781 --0.00400663 0.00176499 --0.00457635 0.00153456 --0.00512078 0.00121716 --0.00562527 0.000815445 --0.00607529 0.000334156 --0.00645678 -0.000219767 --0.00675667 -0.000837204 --0.00696326 -0.00150693 --0.00706674 -0.00221581 --0.0070596 -0.00294907 --0.00693705 -0.00369069 --0.00669731 -0.00442392 --0.00634174 -0.00513179 --0.00587492 -0.00579771 --0.00530449 -0.00640608 --0.00464087 -0.00694276 --0.0038969 -0.00739556 --0.0030873 -0.00775457 --0.0022282 -0.0080124 --0.00133649 -0.00816425 --0.000429373 -0.00820789 -0.000476158 -0.00814358 -0.00136374 -0.00797388 -0.00221798 -0.0077034 -0.00302472 -0.00733853 -0.00377122 -0.00688722 -0.0044463 -0.00635863 -0.00504044 -0.00576297 -0.00554576 -0.00511117 -0.00595608 -0.00441476 -0.00626684 -0.00368559 -0.00647516 -0.00293576 -0.00657971 -0.00217738 -0.00658071 -0.00142251 -0.0064799 -0.000682991 -0.00628048 2.96505e-05 -0.00598708 0.000704315 -0.00560572 0.00133045 -0.00514382 0.00189818 -0.00461007 0.00239841 -0.00401449 0.002823 -0.00336826 0.00316491 -0.00268373 0.00341833 -0.00197421 0.00357893 -0.00125391 0.00364396 -0.000537641 0.0036125 -& -@target G0.S1 -@type xy --3.50257 -3.81043 --2.90668 -4.18559 --2.25582 -4.48139 --1.56171 -4.69102 --0.837195 -4.80894 --0.0961435 -4.83116 -0.646737 -4.75536 -1.37611 -4.58111 -2.07627 -4.31002 -2.73149 -3.94588 -3.3264 -3.49479 -3.8464 -2.96512 -4.27818 -2.36754 -4.61018 -1.71479 -4.83307 -1.02151 -4.9402 -0.303765 -4.92793 0.421323 -4.79585 1.13619 -4.54689 1.82342 -4.18724 2.46633 -3.72613 3.04957 -3.17543 3.5596 -2.54922 3.98513 -1.86322 4.31735 -1.1342 4.55011 -0.37942 4.67995 --0.383861 4.706 --1.13889 4.6298 --1.86978 4.45512 --2.56181 4.18765 --3.20166 3.83474 --3.77756 3.40513 --4.27939 2.90866 --4.69869 2.35605 --5.02877 1.75864 --5.26457 1.12822 --5.40275 0.476853 --5.44159 -0.183307 --5.38095 -0.840131 --5.22228 -1.48166 --4.96853 -2.09621 --4.62413 -2.67251 --4.19499 -3.19982 --3.6884 -3.66803 --3.11307 -4.06785 --2.47902 -4.39089 --1.79755 -4.62986 --1.08115 -4.77876 --0.343376 -4.83299 -0.401279 -4.78963 -1.13762 -4.64757 -1.84996 -4.40771 -2.52248 -4.0731 -3.13958 -3.64907 -3.68628 -3.14329 -4.14875 -2.56573 -4.51476 -1.92855 -4.77417 -1.24586 -4.91943 -0.533385 -4.94591 0.19197 -4.85218 0.912673 -4.64016 1.61115 -4.31505 2.2704 -3.8852 2.87459 -3.36172 3.40958 -2.75807 3.86333 -2.08951 4.22628 -1.37253 4.49145 -0.624287 4.65455 --0.137937 4.71391 --0.897211 4.67035 --1.63736 4.52695 --2.34329 4.2888 --3.00124 3.96274 --3.59893 3.55708 --4.12571 3.0813 --4.5726 2.54584 --4.93233 1.96184 --5.19929 1.34096 --5.36961 0.695171 --5.44099 0.0365955 --5.4128 -0.622618 --5.28595 -1.27044 --5.06288 -1.89509 --4.74754 -2.48515 --4.34533 -3.02966 --3.86311 -3.5183 --3.30911 -3.94148 --2.69295 -4.29048 --2.02551 -4.55762 --1.31892 -4.73646 --0.586419 -4.8219 -0.157763 -4.81047 -0.898612 -4.70045 -1.62056 -4.49206 -2.30776 -4.18768 -2.94449 -3.79191 -3.51551 -3.31169 -4.00658 -2.75628 -4.4049 -2.13716 -4.69965 -1.46786 -4.88242 -0.763634 -4.94764 -0.0410522 -4.89285 0.68252 -4.71891 1.38949 -4.42999 2.06265 -4.03344 2.68577 -3.5395 3.24414 -2.96089 3.72505 -2.31231 4.11812 -1.60985 4.41552 -0.870478 4.6121 -0.111443 4.70532 --0.650195 4.69519 --1.398 4.58403 --2.1165 4.37627 --2.79147 4.07819 --3.41013 3.6976 --3.96127 3.2436 --4.43531 2.72634 --4.8244 2.15674 --5.12237 1.5463 --5.32474 0.906922 --5.42868 0.250714 --5.43299 -0.41015 --5.33808 -1.06357 --5.14588 -1.69763 --4.85986 -2.30076 --4.48497 -2.86182 --4.0276 -3.37025 --3.49556 -3.81618 --2.89805 -4.19059 --2.24558 -4.48544 --1.5499 -4.69387 --0.823937 -4.81033 --0.0816164 -4.83084 -0.66227 -4.75307 -1.3923 -4.57665 -2.09271 -4.30324 -2.7477 -3.93672 -3.34187 -3.48328 -3.86062 -2.95141 -4.29065 -2.35188 -4.62048 -1.69756 -4.84088 -1.00317 -4.94531 -0.284855 -4.93026 0.44024 -4.7955 1.15456 -4.54408 1.84071 -4.1823 2.4821 -3.71946 3.06347 -3.1675 3.57139 -2.54049 3.99467 -1.85412 4.32462 -1.1251 4.55516 -0.370666 4.68289 --0.392018 4.70695 --1.14625 4.62893 --1.87619 4.45257 --2.56715 4.18357 --3.20584 3.82925 --3.78048 3.39833 --4.28097 2.90066 --4.69884 2.34693 --5.02737 1.74851 --5.26153 1.11721 --5.39796 0.465087 --5.43495 -0.195648 --5.3724 -0.852842 --5.21177 -1.4945 --4.95607 -2.10891 --4.60979 -2.68479 --4.17887 -3.21137 --3.67071 -3.67858 --3.09406 -4.07712 --2.45901 -4.39867 --1.7769 -4.63598 --1.06026 -4.78311 --0.322676 -4.83558 -0.421378 -4.79052 -1.15672 -4.64692 -1.86774 -4.40575 -2.53867 -4.07013 -3.154 -3.64543 -3.69887 -3.13936 -4.15954 -2.56185 -4.52387 -1.92505 -4.78183 -1.243 -4.9259 -0.531355 -4.95148 0.193071 -4.85714 0.91283 -4.64475 1.61043 -4.31947 2.26891 -3.88956 2.87249 -3.36606 3.40701 -2.76235 3.86043 -2.09364 4.22314 -1.37639 4.48809 -0.62774 4.65095 --0.135001 4.70998 --0.894868 4.66596 --1.63563 4.52192 --2.34214 4.28296 --3.00056 3.95591 --3.59856 3.54911 --4.12544 3.07208 --4.57217 2.53531 --4.93146 1.95001 --5.19773 1.32789 --5.36708 0.68099 --5.43729 0.0214915 --5.40775 -0.63841 --5.27943 -1.28665 --5.05485 -1.91142 --4.73803 -2.5013 --4.33447 -3.04535 --3.85107 -3.53326 --3.29614 -3.9555 --2.67934 -4.3034 --2.0116 -4.56936 --1.30505 -4.74699 --0.572933 -4.8313 -0.170568 -4.81887 -0.910488 -4.70804 -1.63133 -4.4991 -2.31733 -4.19441 -2.95287 -3.7986 -3.52279 -3.31857 -4.01292 -2.76352 -4.41052 -2.14487 -4.70477 -1.47608 -4.88727 -0.772312 -4.9524 -0.0500763 -4.89764 0.673311 -4.72378 1.38028 -4.43489 2.05361 -4.03827 2.67704 -3.54411 3.23581 -2.96512 3.71715 -2.31599 4.1106 -1.61288 4.4083 -0.872791 4.60504 -0.113047 4.69826 --0.649228 4.68797 --1.39754 4.57652 --2.11638 4.36838 --2.79149 4.06986 --3.41007 3.68883 --3.96093 3.23444 --4.43453 2.71689 --4.82303 2.14713 --5.12031 1.53669 --5.32193 0.897475 --5.42513 0.241609 --5.42874 -0.418748 --5.33322 -1.07151 --5.14052 -1.7048 --4.85414 -2.30707 --4.47904 -2.86723 --4.02163 -3.37473 --3.4897 -3.81975 --2.89243 -4.1933 --2.2403 -4.48736 --1.54504 -4.69509 --0.819544 -4.81095 --0.0777013 -4.83093 -0.665723 -4.75272 -1.39533 -4.57589 -2.09537 -4.30211 -2.75003 -3.9352 -3.3439 -3.48132 -3.86235 -2.94896 -4.29205 -2.34887 -4.62146 -1.69392 -4.84131 -0.998838 -4.94503 -0.279819 -4.92909 0.445951 -4.79323 1.16085 -4.54054 1.84745 -4.17734 2.48907 -3.71302 3.07043 -3.15955 3.57807 -2.5311 4.0008 -1.84344 4.32995 -1.11336 4.55947 -0.358121 4.68602 --0.405051 4.70883 --1.15945 4.62953 --1.88924 4.45195 --2.57977 4.18184 --3.21778 3.82659 --3.79156 3.39496 --4.29105 2.8968 --4.70785 2.34284 --5.03531 1.74443 --5.26842 1.11334 --5.40389 0.461639 --5.44001 -0.198534 --5.37671 -0.855058 --5.21544 -1.49598 --4.95919 -2.10963 --4.61243 -2.68474 --4.18109 -3.21058 --3.6725 -3.67706 --3.0954 -4.07489 --2.45985 -4.3957 --1.77718 -4.63224 --1.05994 -4.77852 --0.321719 -4.82999 -0.422962 -4.78378 -1.15886 -4.63883 -1.87028 -4.39611 -2.54139 -4.05876 -3.15657 -3.63219 -3.70088 -3.12418 -4.16054 -2.54477 -4.52337 -1.9062 -4.77936 -1.22266 -4.92105 -0.509907 -4.94393 0.21513 -4.8467 0.934932 -4.63141 1.63197 -4.30336 2.28929 -3.87098 2.89116 -3.34544 3.42352 -2.74023 3.87443 -2.07061 4.23442 -1.35305 4.49659 -0.604693 4.65672 --0.157227 4.71319 --0.915822 4.66687 --1.65496 4.52086 --2.35958 4.28027 --3.01596 3.95197 --3.61185 3.54425 --4.13663 3.06662 --4.58133 2.52953 --4.93869 1.94413 --5.20314 1.32208 --5.37081 0.675377 --5.43944 0.0161671 --5.40842 -0.643386 --5.2787 -1.29124 --5.05275 -1.91559 --4.73457 -2.505 --4.32963 -3.04853 --3.84483 -3.53584 --3.28847 -3.95735 --2.67022 -4.30437 --2.00105 -4.56926 --1.29312 -4.74561 --0.559725 -4.82839 -0.184865 -4.81419 -0.925616 -4.70135 -1.64695 -4.4902 -2.33304 -4.18317 -2.96819 -3.78495 -3.53721 -3.30255 -4.02593 -2.74527 -4.42162 -2.12467 -4.71353 -1.4543 -4.89336 -0.749442 -4.9556 -0.026655 -4.8979 0.696699 -4.72117 1.40305 -4.42966 2.07522 -4.03076 2.69701 -3.53476 3.25378 -2.95441 3.73285 -2.30443 4.1239 -1.60095 4.41914 -0.860912 4.61346 -0.101588 4.70438 --0.659971 4.69194 --1.40733 4.5785 --2.12504 4.36855 --2.79889 4.06837 --3.4161 3.68584 --3.96549 3.23009 --4.43752 2.7113 --4.82437 2.14041 --5.11989 1.52898 --5.31965 0.888906 --5.42089 0.232338 --5.42245 -0.428533 --5.3248 -1.08159 --5.12995 -1.71493 --4.84142 -2.31697 --4.46424 -2.87659 --4.00488 -3.38324 --3.4712 -3.82712 --2.87245 -4.19923 --2.21918 -4.49161 --1.52318 -4.69747 --0.797372 -4.81135 --0.0556868 -4.82932 -0.687114 -4.74916 -1.41566 -4.57054 -2.11422 -4.29519 -2.7671 -3.92705 -3.35896 -3.47231 -3.87528 -2.93948 -4.30284 -2.33934 -4.63022 -1.68471 -4.84823 -0.990285 -4.95038 -0.272172 -4.93318 0.452527 -4.79637 1.16629 -4.54302 1.85175 -4.17942 2.49231 -3.71486 3.07273 -3.16126 3.57957 -2.53271 4.00163 -1.84491 4.33019 -1.11463 4.55919 -0.359103 4.68521 --0.404434 4.70743 --1.15925 4.62745 --1.88946 4.44906 --2.58036 4.17798 --3.21864 3.82162 --3.79252 3.38876 --4.29191 2.88928 --4.70837 2.33395 --5.03521 1.73418 --5.26745 1.10182 --5.40178 0.448969 --5.43655 -0.212156 --5.37171 -0.869389 --5.20879 -1.51074 --4.95084 -2.1245 --4.60241 -2.69942 --4.16949 -3.22476 --3.65952 -3.69045 --3.08128 -4.08725 --2.44491 -4.40685 --1.76177 -4.64206 --1.04443 -4.78696 --0.306474 -4.83711 -0.437592 -4.78969 -1.17258 -4.64372 -1.88286 -4.40022 -2.55267 -4.06237 -3.16652 -3.63559 -3.70953 -3.12762 -4.16801 -2.54848 -4.52986 -1.91034 -4.78508 -1.2273 -4.92621 -0.515073 -4.94873 0.209506 -4.8513 0.928964 -4.63586 1.6258 -4.30768 2.28307 -3.87509 2.88501 -3.34925 3.41751 -2.7436 3.86861 -2.07342 4.22875 -1.35522 4.49099 -0.606174 4.65109 --0.156411 4.7074 --0.91559 4.66079 --1.65518 4.51438 --2.36008 4.27333 --3.01654 3.94453 --3.61231 3.53633 --4.13676 3.05829 --4.58097 2.5209 --4.93771 1.93533 --5.20145 1.31329 --5.36836 0.666766 --5.43625 0.00791248 --5.40453 -0.651117 --5.2742 -1.2983 --5.04776 -1.92186 --4.72925 -2.5104 --4.32413 -3.053 --3.83931 -3.53937 --3.28309 -3.95997 --2.66511 -4.30612 --1.99631 -4.57023 --1.28883 -4.74587 --0.555933 -4.82805 -0.188151 -4.81333 -0.928413 -4.70004 -1.64929 -4.48848 -2.33498 -4.18107 -2.96976 -3.78245 -3.53845 -3.29961 -4.02681 -2.74183 -4.4221 -2.12066 -4.71352 -1.44965 -4.89272 -0.744103 -4.95415 -0.0206277 -4.89544 0.703366 -4.7175 1.41025 -4.4246 2.08278 -4.02418 2.70471 -3.5266 3.26135 -2.94467 3.74001 -2.29321 4.13035 -1.58841 4.42464 -0.847314 4.61778 -0.0872213 4.70737 --0.674772 4.69351 --1.42223 4.57866 --2.13969 4.36736 --2.81299 4.06598 --3.4294 3.68243 --3.97779 3.2259 --4.44869 2.70658 --4.83433 2.13545 --5.12865 1.52402 --5.32725 0.884211 --5.42742 0.228113 --5.42805 -0.432116 --5.3296 -1.0844 --5.13409 -1.71689 --4.84504 -2.31803 --4.46744 -2.87675 --4.00772 -3.38252 --3.47372 -3.82554 --2.87466 -4.19681 --2.22105 -4.48837 --1.52466 -4.69338 --0.798418 -4.80634 --0.0562642 -4.82328 -0.687002 -4.74194 -1.41595 -4.56197 -2.1148 -4.28509 -2.76773 -3.91522 -3.35934 -3.45862 -3.87502 -2.92386 -4.30151 -2.32181 -4.62732 -1.66541 -4.8433 -0.969471 -4.943 -0.250236 -4.92302 0.475089 -4.78325 1.1889 -4.52689 1.87379 -4.16042 2.51317 -3.69329 3.09183 -3.13755 3.59644 -2.50741 4.01589 -1.81864 4.34162 -1.08802 4.5677 -0.33279 4.69084 --0.429888 4.71035 --1.18335 4.62792 --1.91181 4.4474 --2.60067 4.17458 --3.23672 3.81687 --3.80828 3.38303 --4.30532 2.88293 --4.71949 2.3273 --5.04415 1.7275 --5.27433 1.09531 --5.40675 0.442812 --5.43974 -0.217839 --5.37325 -0.874507 --5.20879 -1.51522 --4.94937 -2.12831 --4.59952 -2.70249 --4.16522 -3.22703 --3.65387 -3.69184 --3.07426 -4.08765 --2.43654 -4.40611 --1.75209 -4.64001 --1.03351 -4.78341 --0.294458 -4.83182 -0.450508 -4.78244 -1.18612 -4.6343 -1.89668 -4.38845 -2.56634 -4.04811 -3.17955 -3.61881 -3.72142 -3.10837 -4.17822 -2.52693 -4.53788 -1.88678 -4.79047 -1.20214 -4.92863 -0.488801 -4.94797 0.236305 -4.84728 0.955672 -4.62869 1.6518 -4.2976 2.30778 -3.86249 2.90792 -3.33458 3.43822 -2.72741 3.88683 -2.05627 4.2443 -1.33764 4.50382 -0.588659 4.66123 --0.173437 4.71496 --0.93177 4.66593 --1.67023 4.5173 --2.37378 4.27422 --3.02871 3.94358 --3.62281 3.53374 --4.14549 3.05423 --4.58782 2.51553 --4.94257 1.92883 --5.20423 1.3058 --5.36896 0.658474 --5.43457 -0.000993882 --5.40049 -0.660421 --5.26773 -1.30775 --5.03885 -1.93119 --4.71792 -2.5193 --4.31046 -3.06116 --3.82345 -3.54645 --3.26526 -3.96563 --2.64562 -4.31006 --1.97553 -4.57218 --1.26721 -4.74562 --0.533959 -4.82546 -0.209954 -4.80835 -0.94951 -4.69274 -1.66917 -4.47902 -2.35316 -4.16969 -2.98585 -3.76951 -3.55215 -3.28553 -4.03794 -2.72707 -4.4306 -2.10569 -4.71946 -1.43493 -4.89627 -0.730055 -4.95559 -0.00758691 -4.89509 0.71515 -4.71572 1.42062 -4.42173 2.09168 -4.02053 2.71216 -3.52242 3.26742 -2.94015 3.74481 -2.28845 4.134 -1.58347 4.42723 -0.842195 4.61939 -0.0819105 4.70801 --0.680296 4.69317 --1.42796 4.57727 --2.14562 4.36483 --2.81902 4.06221 --3.43542 3.67732 --3.98363 3.21936 --4.45413 2.69856 --4.83912 2.12593 --5.13253 1.51305 --5.32996 0.871892 --5.4287 0.214606 --5.42768 -0.446593 --5.32741 -1.09958 --5.12995 -1.73246 --4.83891 -2.33367 --4.45936 -2.8921 --3.9978 -3.39725 --3.46216 -3.83932 --2.86173 -4.20938 --2.20709 -4.4995 --1.51005 -4.70292 --0.783582 -4.81422 --0.0416246 -4.82953 -0.701039 -4.74667 -1.42902 -4.56536 -2.12659 -4.28739 -2.77805 -3.91674 -3.36805 -3.45968 -3.8821 -2.92477 -4.30702 -2.32285 -4.63142 -1.66682 -4.84618 -0.971408 -4.94486 -0.252786 -4.92408 0.47191 -4.78367 1.18513 -4.5268 1.86951 -4.15986 2.50848 -3.69227 3.0868 -3.13603 3.59113 -2.50532 4.01032 -1.81592 4.33576 -1.08463 4.56147 -0.328739 4.68417 --0.434542 4.70313 --1.18849 4.62006 --1.91729 4.43883 --2.60628 4.16526 --3.24225 3.8068 --3.81352 3.37227 --4.31007 2.87158 --4.72357 2.31549 --5.04742 1.71539 --5.27671 1.08311 --5.40819 0.430717 --5.44026 -0.229627 --5.37291 -0.885799 --5.20769 -1.52585 --4.94764 -2.13814 --4.59733 -2.71142 --4.16275 -3.23499 --3.65129 -3.69881 --3.07175 -4.09364 --2.43424 -4.41118 --1.75015 -4.64422 --1.03201 -4.78684 --0.293464 -4.83457 -0.450966 -4.7846 -1.18604 -4.63594 -1.89608 -4.38963 -2.56525 -4.04886 -3.178 -3.61911 -3.7194 -3.1082 -4.1757 -2.52624 -4.5348 -1.88552 -4.78671 -1.20026 -4.92405 -0.486297 -4.94237 0.23941 -4.84047 0.959295 -4.62047 1.65579 -4.28781 2.31193 -3.85101 2.91197 -3.32138 3.44188 -2.71254 3.88977 -2.03985 4.24622 -1.3199 4.50445 -0.569887 4.66034 --0.192892 4.71241 --0.95153 4.66164 --1.68991 4.51127 --2.393 4.26655 --3.04714 3.93444 --3.64017 3.52335 --4.16154 3.04286 --4.60242 2.50348 --4.95565 1.9164 --5.21578 1.29331 --5.37903 0.646189 --5.44327 -0.0128151 --5.40797 -0.671569 --5.27416 -1.31806 --5.0444 -1.94055 --4.72275 -2.52764 --4.31472 -3.06844 --3.82726 -3.55269 --3.2687 -3.97084 --2.64872 -4.31428 --1.9783 -4.5754 --1.26964 -4.74784 --0.536025 -4.82662 -0.208265 -4.80838 -0.948183 -4.6915 -1.66813 -4.47635 -2.35229 -4.16543 -2.98492 -3.76349 -3.55085 -3.27761 -4.0359 -2.71721 -4.42737 -2.09391 -4.71456 -1.42139 -4.88923 -0.715022 -4.94599 0.00853012 -4.88261 0.731835 -4.70017 1.43728 -4.40308 2.10766 -3.99894 2.72682 -3.49819 3.28017 -2.91374 3.75514 -2.26045 4.14152 -1.55452 4.43168 -0.812985 4.62067 -0.0531051 4.70617 --0.708075 4.68836 --1.45417 4.56977 --2.16981 4.355 --2.84086 4.05044 --3.45467 3.66403 --4.00016 3.20499 --4.4679 2.6835 --4.85018 2.11055 --5.14096 1.49769 --5.33589 0.856802 --5.4323 0.200014 --5.4291 -0.460513 --5.32681 -1.1127 --5.12749 -1.74467 --4.83469 -2.34488 --4.45348 -2.90224 --3.99034 -3.40625 --3.45318 -3.84708 --2.85128 -4.21579 --2.19524 -4.50441 --1.49689 -4.70617 --0.769215 -4.81563 --0.0262265 -4.82889 -0.717234 -4.74376 -1.44571 -4.56 -2.14339 -4.27941 -2.79451 -3.90605 -3.38366 -3.44625 -3.89632 -2.90869 -4.3193 -2.30433 -4.64123 -1.64617 -4.85307 -0.949083 -4.94849 -0.229332 -4.92422 0.495869 -4.78028 1.20893 -4.51999 1.89248 -4.14991 2.52999 -3.67959 3.10632 -3.12116 3.60821 -2.48885 4.02464 -1.79847 4.34713 -1.06682 4.56984 -0.31113 4.68956 --0.451446 4.70566 --1.20427 4.61991 --1.93159 4.43624 --2.61884 4.16045 --3.25285 3.80002 --3.82198 3.36376 --4.31626 2.86156 --4.72739 2.30418 --5.04875 1.703 --5.27546 1.06986 --5.40427 0.41682 --5.43359 -0.243932 --5.36342 -0.900254 --5.19533 -1.54018 --4.93243 -2.15202 --4.5793 -2.72452 --4.14201 -3.24696 --3.62802 -3.70929 --3.04622 -4.10227 --2.40679 -4.41762 --1.72119 -4.64818 --1.00205 -4.78809 --0.263061 -4.83295 -0.481216 -4.78006 -1.21553 -4.62853 -1.9242 -4.37951 -2.59145 -4.03632 -3.20179 -3.60454 -3.74041 -3.09207 -4.19369 -2.50907 -4.54964 -1.86787 -4.79843 -1.18268 -4.9328 -0.469289 -4.94843 0.255402 -4.84418 0.973922 -4.62223 1.66881 -4.28802 2.3232 -3.85006 2.92143 -3.31961 3.44955 -2.71022 3.89574 -2.0372 4.25058 -1.31707 4.50729 -0.566972 4.66175 --0.195823 4.71244 --0.954423 4.66031 --1.6927 4.50858 --2.39562 4.26245 --3.04947 3.92889 --3.64206 3.51631 --4.16282 3.0343 --4.60286 2.49339 --4.955 1.90482 --5.21378 1.28033 --5.37543 0.631953 --5.43782 -0.0281061 --5.40046 -0.687661 --5.26443 -1.33466 --5.03236 -1.9573 --4.70836 -2.54417 --4.29805 -3.08438 --3.80844 -3.56766 --3.24796 -3.98449 --2.62637 -4.32628 --1.95472 -4.58552 --1.24527 -4.75589 --0.51134 -4.83252 -0.232771 -4.81213 -0.972027 -4.6932 -1.69087 -4.47619 -2.37353 -4.16369 -3.00438 -3.7605 -3.56833 -3.27375 -4.0513 -2.71284 -4.4407 -2.0894 -4.72592 -1.41705 -4.89878 -0.711099 -4.95395 0.0118568 -4.88918 0.734459 -4.70556 1.43915 -4.40746 2.10879 -4.00241 2.72724 -3.50082 3.2799 -2.91558 3.7542 -2.2615 4.1399 -1.5548 4.42934 -0.812515 4.61756 -0.05196 4.70221 --0.709783 4.68348 --1.45628 4.5639 --2.17212 4.34811 --2.84315 4.04254 --3.4567 3.65517 --4.00168 3.19526 --4.46871 2.67306 --4.85008 2.09958 --5.13981 1.48639 --5.33362 0.845419 --5.42886 0.188791 --5.42453 -0.471337 --5.32118 -1.1229 --5.12092 -1.75404 --4.82735 -2.35326 --4.44556 -2.90951 --3.98205 -3.41231 --3.44474 -3.85191 --2.84289 -4.21938 --2.18709 -4.50681 --1.48914 -4.70744 --0.762014 -4.81586 --0.0196643 -4.82818 -0.723094 -4.74222 -1.45083 -4.55771 -2.14777 -4.27644 -2.79813 -3.90244 -3.38653 -3.44203 -3.89841 -2.90387 -4.32057 -2.29887 -4.64158 -1.64006 -4.85238 -0.942316 -4.94659 -0.221934 -4.92093 0.503825 -4.77539 1.21731 -4.51332 1.9011 -4.14132 2.5386 -3.669 3.1146 -3.10856 3.61583 -2.47433 4.03126 -1.78222 4.35242 -1.04911 4.5735 -0.2923 4.69137 --0.470991 4.70547 --1.2241 4.61766 --1.95126 4.43194 --2.63794 4.15423 --3.27099 3.79207 --3.83885 3.35433 --4.33161 2.85097 --4.74103 2.29277 --5.06061 1.69113 --5.28552 1.05787 --5.41259 0.405048 --5.44029 -0.255188 --5.36867 -0.910739 --5.19933 -1.54968 --4.93539 -2.16039 --4.58144 -2.73166 --4.14351 -3.25282 --3.62907 -3.71384 --3.04694 -4.10553 --2.40728 -4.41961 --1.7215 -4.64892 --1.00222 -4.78757 --0.263099 -4.83117 -0.48129 -4.77694 -1.21567 -4.62398 -1.92433 -4.3734 -2.59142 -4.02851 -3.20138 -3.59489 -3.73931 -3.08048 -4.19151 -2.4955 -4.54595 -1.85239 -4.79275 -1.16546 -4.92468 -0.450634 -4.93745 0.275062 -4.83003 0.994042 -4.60474 1.68876 -4.26719 2.34231 -3.82605 2.93903 -3.29277 3.46502 -2.68104 3.90854 -2.0063 4.2603 -1.28513 4.51367 -0.53473 4.66467 --0.227654 4.71194 --0.985172 4.65656 --1.72178 4.50186 --2.42252 4.25314 --3.07382 3.91741 --3.66358 3.50312 --4.18134 3.01986 --4.61832 2.47816 --4.96741 1.88921 --5.22324 1.26472 --5.38206 0.616681 --5.4418 -0.0427728 --5.40197 -0.701496 --5.26366 -1.34748 --5.02949 -1.96896 --4.70356 -2.55456 --4.29145 -3.09339 --3.80018 -3.57518 --3.23816 -3.99042 --2.61514 -4.33052 --1.94219 -4.58792 --1.23155 -4.7563 --0.496618 -4.83076 -0.248285 -4.80802 -0.988059 -4.68656 -1.70708 -4.46686 -2.38951 -4.15154 -3.01964 -3.74548 -3.58234 -3.25587 -4.0635 -2.69223 -4.45053 -2.06631 -4.73285 -1.39185 -4.90236 -0.684293 -4.95383 0.0396776 -4.88518 0.762621 -4.69764 1.46694 -4.39577 2.1355 -3.98727 2.7522 -3.4827 3.30254 -2.89506 3.77404 -2.23924 4.15661 -1.5315 4.44273 -0.78886 4.62755 -0.028592 4.70884 --0.732289 4.6869 --1.47744 4.56432 --2.19152 4.34578 --2.86046 4.03774 --3.47166 3.6482 --4.01411 3.18639 --4.47843 2.66257 --4.85698 2.08775 --5.14379 1.47347 --5.33457 0.831686 --5.42671 0.174506 --5.4192 -0.485892 --5.31263 -1.13742 --5.10913 -1.76822 --4.81235 -2.36674 --4.42741 -2.92192 --3.96089 -3.42327 --3.42078 -3.86102 --2.81644 -4.22626 --2.15854 -4.5111 --1.45897 -4.70882 --0.73077 -4.81408 -0.0120178 -4.82308 -0.75454 -4.73373 -1.48134 -4.5459 -2.17667 -4.2615 -2.82477 -3.88469 -3.41035 -3.4219 -3.91897 -2.88188 -4.33754 -2.27564 -4.65482 -1.61623 -4.86187 -0.918537 -4.95249 -0.198815 -4.92352 0.525743 -4.77505 1.23758 -4.51051 1.91939 -4.13652 2.55468 -3.66267 3.12838 -3.10115 3.62726 -2.46622 4.0404 -1.77372 4.35935 -1.04047 4.57833 -0.283719 4.69421 --0.479359 4.70641 --1.23212 4.61676 --1.95882 4.42925 --2.64491 4.14977 --3.27722 3.78586 --3.84417 3.34639 --4.3358 2.84133 --4.74388 2.28148 --5.06187 1.6783 --5.28494 1.04363 --5.40992 0.389586 --5.4353 -0.271625 --5.36117 -0.927855 --5.18918 -1.56713 --4.9225 -2.1778 --4.56582 -2.74862 --4.12524 -3.2689 --3.60831 -3.72864 --3.02396 -4.11865 --2.38243 -4.43071 --1.69522 -4.65771 --0.975007 -4.79385 --0.235493 -4.83482 -0.508723 -4.77796 -1.24237 -4.62247 -1.94976 -4.36957 -2.61512 -4.02265 -3.22296 -3.58738 -3.7585 -3.07174 -4.20815 -2.486 -4.55999 -1.84254 -4.80426 -1.15569 -4.93379 -0.441292 -4.94438 0.283701 -4.83502 1.00178 -4.60803 1.69545 -4.26898 2.34789 -3.82656 2.94345 -3.29214 3.46827 -2.67939 3.91059 -2.00373 4.26113 -1.28175 4.51324 -0.530646 4.66293 --0.232301 4.70884 --0.990211 4.65206 --1.727 4.49593 --2.42768 4.2458 --3.07866 3.90872 --3.66783 3.49318 --4.18475 3.00882 --4.62064 2.46622 --4.96847 1.87662 --5.22288 1.25174 --5.38021 0.60359 --5.43844 -0.0556748 --5.39714 -0.713923 --5.25746 -1.35916 --5.02207 -1.97966 --4.69512 -2.56407 --4.28222 -3.10156 --3.79041 -3.5819 --3.22811 -3.99564 --2.60506 -4.33422 --1.93231 -4.59013 --1.22209 -4.75709 --0.487755 -4.83024 -0.25641 -4.80628 -0.99534 -4.68372 -1.71344 -4.46304 -2.39491 -4.14682 -3.02404 -3.73994 -3.58571 -3.24955 -4.06579 -2.68518 -4.45167 -2.05854 -4.73274 -1.38338 -4.90086 -0.675158 -4.95076 0.0494025 -4.88036 0.772816 -4.69089 1.47743 -4.38691 2.14604 -3.9762 2.76249 -3.46938 3.31223 -2.87952 3.78277 -2.22163 4.164 -1.51205 4.44844 -0.767902 4.63127 -0.00653287 4.71036 --0.754991 4.68606 --1.5003 4.56108 --2.21404 4.34019 --2.88219 4.02994 --3.49218 3.63842 --4.03305 3.17493 --4.49553 2.64979 --4.87204 2.07403 --5.15671 1.45923 --5.34534 0.817311 --5.4354 0.160386 --5.42595 -0.49941 --5.31763 -1.15004 --5.11262 -1.77967 --4.81458 -2.37685 --4.42865 -2.93055 --3.96139 -3.43034 --3.42078 -3.86649 --2.81612 -4.23013 --2.15805 -4.5134 --1.45844 -4.70958 --0.730277 -4.81332 -0.0124139 -4.82079 -0.754783 -4.7299 -1.48136 -4.54045 -2.17636 -4.25434 -2.82397 -3.87572 -3.40883 -3.41102 -3.91642 -2.86903 -4.33359 -2.26081 -4.64903 -1.59953 -4.85379 -0.900147 -4.94167 -0.179072 -4.90957 0.546384 -4.7577 1.25855 -4.4896 1.94004 -4.11206 2.57432 -3.63487 3.14631 -3.07037 3.64286 -2.433 4.0531 -1.73871 4.36875 -1.00439 4.58414 -0.247343 4.69632 --0.515277 4.70486 --1.26687 4.61172 --1.99176 4.42102 --2.6755 4.13875 --3.30504 3.7725 --3.86891 3.33117 --4.35728 2.82477 --4.762 2.26408 --5.07663 1.66051 --5.29642 1.02589 --5.41827 0.372277 --5.4407 -0.288178 --5.36383 -0.943378 --5.18931 -1.5814 --4.92034 -2.19063 --4.56157 -2.75985 --4.1191 -3.27841 --3.60048 -3.73632 --3.0146 -4.12438 --2.37171 -4.43437 --1.68332 -4.65918 --0.962115 -4.793 --0.221829 -4.83149 -0.522894 -4.772 -1.25673 -4.61372 -1.96394 -4.35792 -2.62867 -4.00801 -3.23538 -3.56975 -3.76924 -3.05119 -4.21664 -2.4627 -4.56567 -1.8168 -4.80661 -1.12793 -4.93237 -0.412052 -4.93887 0.313776 -4.82526 1.03197 -4.59402 1.72502 -4.25092 2.37608 -3.80481 2.96959 -3.26722 3.49174 -2.65193 3.93093 -1.97446 4.278 -1.25141 4.52644 -0.499983 4.6724 --0.262585 4.71464 --1.01948 4.65436 --1.75471 4.49497 --2.45338 4.24186 --3.10197 3.90213 --3.68847 3.48425 --4.20249 2.9979 --4.63532 2.45363 --4.97995 1.86268 --5.23106 1.23675 --5.385 0.587864 --5.43977 -0.0718277 --5.39496 -0.730182 --5.25174 -1.37519 --5.01282 -1.9951 --4.68239 -2.57855 --4.26612 -3.11467 --3.7711 -3.59324 --3.20584 -4.0048 --2.58017 -4.34078 --1.90524 -4.59372 --1.19337 -4.75739 --0.458 -4.82698 -0.286508 -4.7993 -1.02504 -4.67297 -1.74198 -4.44859 -2.42151 -4.12891 -3.04801 -3.7189 -3.60641 -3.22589 -4.08272 -2.65949 -4.46447 -2.03151 -4.74121 -1.35575 -4.905 -0.64766 -4.95073 0.0760591 -4.87646 0.797996 -4.68356 1.5006 -4.37667 2.16679 -3.96359 2.78054 -3.45498 3.32741 -2.86386 3.79503 -2.20518 4.17337 -1.49523 4.45501 -0.751059 4.63517 --0.0100563 4.71171 --0.771098 4.685 --1.51573 4.55773 --2.22862 4.33465 --2.89575 4.0223 --3.50454 3.62874 --4.04403 3.16331 --4.50491 2.6363 --4.8796 2.05878 --5.1622 1.44237 --5.34853 0.799036 --5.43604 0.140924 --5.42384 -0.519772 --5.31259 -1.17096 --5.10453 -1.80079 --4.80339 -2.39773 --4.41438 -2.95076 --3.94415 -3.44942 --3.40078 -3.884 --2.79367 -4.24566 --2.13354 -4.52656 --1.43235 -4.72006 --0.703177 -4.8209 -0.0399239 -4.82535 -0.782067 -4.73143 -1.50779 -4.53906 -2.20131 -4.25026 -2.84692 -3.86927 -3.42932 -3.40264 -3.93411 -2.8592 -4.34826 -2.25006 -4.66061 -1.58837 -4.86231 -0.889094 -4.94727 -0.168562 -4.91248 0.555978 -4.75818 1.26694 -4.48795 1.94701 -4.10857 2.57972 -3.6298 3.15004 -3.06397 3.64487 -2.42547 4.05335 -1.73025 4.36719 -0.995189 4.58075 -0.237585 4.69106 --0.525384 4.69771 --1.2771 4.60267 --2.00186 4.41009 --2.68518 4.126 --3.31402 3.75804 --3.87691 3.31516 --4.36401 2.8074 --4.76723 2.24561 --5.08017 1.64123 --5.29813 1.00612 --5.41807 0.352355 --5.43858 -0.307914 --5.35985 -0.962596 --5.1836 -1.59979 --4.91308 -2.20791 --4.55298 -2.77579 --4.10946 -3.29282 --3.59007 -3.74907 --3.00374 -4.13539 --2.3607 -4.44362 --1.67243 -4.66669 --0.951614 -4.79885 --0.211944 -4.83577 -0.531976 -4.77484 -1.26486 -4.61527 -1.97101 -4.35829 -2.6346 -4.00735 -3.2401 -3.56815 -3.77271 -3.04875 -4.21879 -2.45948 -4.56642 -1.81287 -4.80585 -1.12335 -4.92997 -0.406898 -4.93467 0.319387 -4.81909 1.03788 -4.58572 1.731 -4.24036 2.38187 -3.7919 2.97485 -3.25197 3.4961 -2.63443 3.934 -1.95489 4.2794 -1.23006 4.52582 -0.477243 4.66946 --0.286266 4.70916 --1.0436 4.64621 --1.77873 4.48413 --2.47678 4.22841 --3.12425 3.88623 --3.70918 3.46618 --4.22126 2.97799 --4.65184 2.43227 --4.99402 1.8403 --5.24258 1.21381 --5.39396 0.564812 --5.44624 -0.0945691 --5.3991 -0.75222 --5.25378 -1.39618 --5.01301 -2.01475 --4.68104 -2.59664 --4.26353 -3.13104 --3.76759 -3.60779 --3.20169 -4.01746 --2.57563 -4.35156 --1.90052 -4.60265 --1.18865 -4.76449 --0.453396 -4.8323 -0.290886 -4.80287 -1.0291 -4.67478 -1.74562 -4.44863 -2.42461 -4.12711 -3.05039 -3.71521 -3.60785 -3.22024 -4.08291 -2.65186 -4.46305 -2.02192 -4.73777 -1.34433 -4.8991 -0.634632 -4.94196 0.0903405 -4.86446 0.813057 -4.66807 1.51586 -4.35758 2.18158 -3.94096 2.79417 -3.42903 3.33919 -2.835 3.80431 -2.17397 4.17962 -1.46235 4.45781 -0.717257 4.63425 --0.0439849 4.70697 --0.804368 4.67649 --1.5476 4.54565 --2.25844 4.3193 --2.92295 4.0041 --3.52868 3.60817 --4.06478 3.14089 --4.52206 2.61258 --4.89306 2.0343 --5.17197 1.41762 --5.35469 0.774495 --5.43875 0.117011 --5.42329 -0.54269 --5.30903 -1.19257 --5.0982 -1.82083 --4.79455 -2.41599 --4.4033 -2.96706 --3.93108 -3.46362 --3.38594 -3.89597 --2.7773 -4.25528 --2.11587 -4.53373 --1.41359 -4.72467 --0.683564 -4.82283 -0.0601208 -4.82446 -0.802546 -4.7276 -1.5282 -4.53219 -2.22125 -4.24026 -2.86593 -3.85611 -3.44688 -3.38634 -3.94967 -2.83989 -4.36126 -2.22796 -4.67048 -1.56383 -4.86855 -0.862568 -4.94948 -0.140638 -4.91036 0.584624 -4.75161 1.29557 -4.47697 1.97484 -4.09342 2.606 -3.61089 3.17408 -3.04186 3.66606 -2.40084 4.07123 -1.70385 4.38142 -0.967826 4.59116 -0.210039 4.6976 --0.552369 4.70047 --1.30285 4.60186 --2.02579 4.40598 --2.70682 4.11891 --3.33296 3.74833 --3.89284 3.3032 --4.37672 2.79356 --4.77654 2.23026 --5.08595 1.62472 --5.30028 0.988796 --5.41653 0.334556 --5.43331 -0.325846 --5.35082 -0.980312 --5.17083 -1.61693 --4.89658 -2.22409 --4.53284 -2.79063 --4.08582 -3.30589 --3.56313 -3.75995 --2.97378 -4.14367 --2.3281 -4.44888 --1.63767 -4.66855 --0.915258 -4.79697 --0.174662 -4.82991 -0.569443 -4.76484 -1.30172 -4.60109 -2.00643 -4.34004 -2.66777 -3.98528 -3.27026 -3.54266 -3.79918 -3.02038 -4.24102 -2.4289 -4.58404 -1.78083 -4.81865 -1.09066 -4.93794 -0.374378 -4.93799 0.350959 -4.8181 1.0678 -4.58091 1.75867 -4.2323 2.40682 -3.78122 2.99677 -3.2393 3.51479 -2.62039 3.94939 -1.94004 4.29152 -1.2149 4.53476 -0.462171 4.67538 --0.300895 4.71223 --1.0575 4.64659 --1.79166 4.48199 --2.48853 4.2239 --3.13463 3.8795 --3.71799 3.45736 --4.2283 2.9672 --4.65691 2.41967 --4.9969 1.82603 --5.24304 1.19807 --5.39178 0.547822 --5.44121 -0.112536 --5.39104 -0.770845 --5.24253 -1.4151 --4.99849 -2.03357 --4.66322 -2.61491 --4.24247 -3.1483 --3.74343 -3.62356 --3.17467 -4.03129 --2.5461 -4.36301 --1.86892 -4.61132 --1.15551 -4.77008 --0.419328 -4.83457 -0.325222 -4.80169 -1.06301 -4.67017 -1.77841 -4.4407 -2.45562 -4.11613 -3.07901 -3.70154 -3.63358 -3.20437 -4.10537 -2.63433 -4.48199 -2.00334 -4.7531 -1.32529 -4.91083 -0.615718 -4.95025 0.10861 -4.86957 0.830233 -4.6703 1.53158 -4.35727 2.19558 -3.93847 2.80624 -3.42469 3.34921 -2.82912 3.8122 -2.16685 4.18532 -1.45424 4.46128 -0.708421 4.63548 --0.0533021 4.70594 --0.813911 4.67321 --1.5571 4.54013 --2.26761 4.3116 --2.93149 3.99432 --3.53629 3.59646 --4.07115 3.12745 --4.52693 2.59764 --4.89617 2.01816 --5.17314 1.40063 --5.35378 0.756999 --5.4357 0.0993932 --5.41811 -0.56005 --5.3018 -1.20931 --5.08907 -1.83659 --4.78374 -2.43047 --4.39107 -2.97999 --3.91773 -3.4748 --3.37182 -3.90526 --2.76275 -4.26258 --2.10123 -4.53902 --1.3992 -4.72798 --0.669732 -4.82424 -0.0731315 -4.82411 -0.814512 -4.72562 -1.53894 -4.52875 -2.23064 -4.23554 -2.87385 -3.85027 -3.45327 -3.37952 -3.95447 -2.83222 -4.36441 -2.21955 -4.67191 -1.55478 -4.86816 -0.852975 -4.94716 -0.130617 -4.90597 0.594929 -4.745 1.30597 -4.46802 1.9851 -4.08203 2.61582 -3.59701 3.18312 -3.02552 3.67394 -2.38217 4.07756 -1.68308 4.38582 -0.945271 4.59328 -0.186112 4.69715 --0.577186 4.69725 --1.32802 4.59574 --2.05077 4.39696 --2.73105 4.10709 --3.35594 3.7339 --3.91409 3.28645 --4.39585 2.77485 --4.79324 2.21001 --5.10001 1.60339 --5.3116 0.966869 --5.4251 0.31251 --5.43922 -0.34755 --5.35424 -1.00125 --5.17198 -1.63673 --4.89579 -2.24243 --4.53043 -2.80726 --4.08214 -3.32064 --3.55854 -3.77269 --2.96861 -4.15435 --2.32265 -4.4575 --1.63221 -4.67515 --0.91 -4.8016 --0.169777 -4.83264 -0.57382 -4.76573 -1.30547 -4.60017 -2.00944 -4.33734 -2.66992 -3.98079 -3.27139 -3.53635 -3.79906 -3.01223 -4.23939 -2.41892 -4.58054 -1.76908 -4.81293 -1.07727 -4.9296 -0.359588 -4.92665 0.366787 -4.80344 1.08419 -4.56272 1.77505 -4.2105 2.42254 -3.7559 3.01113 -3.21071 3.52713 -2.58897 3.95908 -1.90635 4.29804 -1.17963 4.53772 -0.426095 4.67453 --0.336985 4.70747 --1.09281 4.638 --1.82546 4.46976 --2.52015 4.20837 --3.16349 3.86109 --3.74366 3.43656 --4.25044 2.94457 --4.67531 2.39574 --5.01147 1.80138 --5.25377 1.17321 --5.39877 0.523253 --5.44462 -0.13637 --5.39109 -0.793555 --5.23947 -1.43635 --4.99261 -2.05308 --4.6548 -2.63245 --4.2318 -3.16368 --3.7308 -3.63663 --3.16036 -4.04192 --2.53038 -4.3711 --1.85205 -4.61677 --1.13775 -4.77278 --0.40095 -4.83444 -0.343922 -4.79864 -1.0817 -4.6641 -1.79673 -4.43155 -2.47315 -4.10384 -3.09529 -3.68614 -3.6481 -3.18592 -4.1176 -2.61299 -4.49137 -1.97938 -4.75911 -1.29909 -4.91302 -0.587767 -4.94823 0.137705 -4.8631 0.859782 -4.65931 1.56084 -4.34186 2.22377 -3.9189 2.83263 -3.40141 3.37311 -2.80273 3.83304 -2.13805 4.20265 -1.42382 4.4748 -0.677191 4.64503 --0.0845414 4.71153 --0.844402 4.67495 --1.58616 4.53824 --2.29464 4.3064 --2.956 3.98616 --3.55787 3.58574 --4.08951 3.11455 --4.54183 2.58298 --4.90745 2.00211 --5.18068 1.38357 --5.35752 0.739303 --5.43558 0.0814138 --5.41412 -0.577957 --5.29393 -1.22678 --5.07735 -1.85326 --4.76822 -2.44596 --4.37185 -2.99389 --3.89499 -3.4867 --3.34576 -3.91473 --2.73369 -4.26921 --2.06957 -4.54238 --1.36544 -4.72771 --0.634462 -4.82001 -0.109212 -4.81567 -0.850627 -4.71285 -1.57426 -4.51161 -2.2643 -4.21417 -2.90501 -3.82495 -3.48113 -3.35069 -3.97833 -2.80047 -4.3837 -2.18559 -4.68625 -1.51943 -4.87737 -0.817106 -4.95123 -0.0950973 -4.90512 0.629264 -4.73962 1.33837 -4.45864 2.01493 -4.06928 2.64259 -3.58159 3.20649 -3.00814 3.69371 -2.36351 4.09366 -1.66375 4.3983 -0.925822 4.60226 -0.167014 4.70283 --0.595545 4.69982 --1.34532 4.59543 --2.06675 4.39398 --2.74548 4.10164 --3.36862 3.72617 --3.92483 3.27662 --4.40446 2.76309 --4.79953 2.1965 --5.10378 1.58834 --5.31265 0.950484 --5.42323 0.295047 --5.43424 -0.365798 --5.346 -1.01995 --5.16037 -1.6555 --4.88072 -2.26086 --4.51193 -2.82489 --4.06028 -3.33701 --3.53349 -3.78732 --2.94065 -4.16676 --2.29214 -4.46725 --1.59963 -4.68185 --0.875919 -4.80493 --0.134834 -4.83238 -0.608921 -4.76176 -1.34 -4.59251 -2.04266 -4.32613 -2.70112 -3.9663 -3.29993 -3.51901 -3.82442 -2.99255 -4.26115 -2.3975 -4.59845 -1.74657 -4.82687 -1.05434 -4.93962 -0.336881 -4.93291 0.38869 -4.80624 1.10478 -4.56239 1.79393 -4.20745 2.43939 -3.75053 3.02573 -3.20342 3.53933 -2.58013 3.9688 -1.89632 4.30522 -1.16872 4.54234 -0.414614 4.67659 --0.348746 4.70699 --1.10457 4.635 --1.83691 4.46431 --2.53099 4.20055 --3.17343 3.85103 --3.75238 3.42445 --4.25765 2.93063 --4.68075 2.38025 --5.0149 1.78467 --5.25502 1.15564 --5.39772 0.505216 --5.44122 -0.154467 --5.38537 -0.811304 --5.23154 -1.45336 --4.98264 -2.06897 --4.64304 -2.6469 --4.21855 -3.17641 --3.7164 -3.64742 --3.14518 -4.05062 --2.51481 -4.37762 --1.83647 -4.62109 --1.12254 -4.77495 --0.386445 -4.83456 -0.357422 -4.79685 -1.09395 -4.66059 -1.80753 -4.42651 -2.48235 -4.09749 -3.1028 -3.67867 -3.65384 -3.17751 -4.12152 -2.60381 -4.49344 -1.96956 -4.75927 -1.28875 -4.9112 -0.577033 -4.94436 0.148707 -4.85707 0.8709 -4.65099 1.57188 -4.33115 2.2345 -3.90574 2.84275 -3.38577 3.38229 -2.78467 3.8409 -2.1177 4.20882 -1.40143 4.47891 -0.653091 4.64675 --0.109929 4.71057 --0.870589 4.67112 --1.61261 4.53145 --2.32079 4.29665 --2.9813 3.97355 --3.5818 3.57048 --4.1116 3.09694 --4.56169 2.56339 --4.92477 1.98099 --5.19526 1.36139 --5.36924 0.71656 --5.44446 0.0586038 --5.42024 -0.600356 --5.29748 -1.24833 --5.0786 -1.87356 --4.76749 -2.46469 --4.36951 -3.01079 --3.89141 -3.50158 --3.34136 -3.92748 --2.72882 -4.27977 --2.06458 -4.55078 --1.36064 -4.73399 --0.630091 -4.82426 -0.112952 -4.81799 -0.853583 -4.71333 -1.57631 -4.51034 -2.26533 -4.2112 -2.90491 -3.82032 -3.47975 -3.34441 -3.9755 -2.79256 -4.37918 -2.17608 -4.67976 -1.50838 -4.86857 -0.804671 -4.93978 -0.0815086 -4.89069 0.643663 -4.72195 1.35313 -4.43755 2.0295 -4.04472 2.65636 -3.55367 3.21881 -2.97712 3.70395 -2.32982 4.10124 -1.62795 4.40273 -0.888595 4.60317 -0.129101 4.69999 --0.633369 4.69316 --1.38229 4.58503 --2.10214 4.38004 --2.77865 4.0845 --3.39902 3.70624 --3.95203 3.25441 --4.42812 2.73914 --4.81946 2.17136 --5.1199 1.56256 --5.32495 0.924605 --5.43182 0.269564 --5.4393 -0.390436 --5.34776 -1.04334 --5.15909 -1.67731 --4.87671 -2.28081 --4.50549 -2.84275 --4.05174 -3.35259 --3.52315 -3.80047 --2.92882 -4.17737 --2.27911 -4.47524 --1.58569 -4.68713 --0.861342 -4.80743 --0.119915 -4.83204 -0.623878 -4.75851 -1.35466 -4.58631 -2.05666 -4.31695 -2.71406 -3.95413 -3.31137 -3.5039 -3.83386 -2.97461 -4.2681 -2.37692 -4.60241 -1.72364 -4.82735 -1.02946 -4.93621 -0.310553 -4.9253 0.415861 -4.79423 1.13212 -4.54595 1.8207 -4.18672 2.46486 -3.72581 3.04918 -3.17519 3.56013 -2.54899 3.98641 -1.86298 4.31924 -1.13397 4.55251 -0.379246 4.68279 --0.383944 4.70924 --1.13885 4.63347 --1.86962 4.45924 --2.56155 4.19227 --3.20135 3.83991 --3.77728 3.4109 --4.27925 2.91506 --4.69883 2.36307 --5.02931 1.76627 --5.26567 1.13641 --5.40454 0.485515 --5.44421 -0.174284 --5.38451 -0.830885 --5.22685 -1.47235 --4.97417 -2.08701 --4.63086 -2.66362 --4.20278 -3.19142 --3.69721 -3.66031 --3.12281 -4.06099 --2.48957 -4.38505 --1.80877 -4.62519 --1.09287 -4.77537 --0.355423 -4.83097 -0.3891 -4.78904 -1.1255 -4.64843 -1.83811 -4.41001 -2.5111 -4.0768 -3.12886 -3.65409 -3.67642 -3.14953 -4.13992 -2.57304 -4.50711 -1.93676 -4.76784 -1.25476 -4.91451 -0.542753 -4.94244 0.182371 -4.85016 0.90309 -4.63955 1.60182 -4.31575 2.26156 -3.88706 2.86643 -3.36456 3.40226 -2.76168 3.85699 -2.09366 4.22098 -1.37699 4.48721 -0.628834 4.65136 --0.133516 4.7117 --0.8931 4.66903 --1.63371 4.5264 --2.34023 4.28888 --2.99885 3.96331 --3.59728 3.55799 --4.12483 3.08242 --4.57251 2.54704 --4.93301 1.963 --5.20074 1.34198 --5.3718 0.695959 --5.44393 0.0370746 --5.41646 -0.622517 --5.29031 -1.27078 --5.06795 -1.89594 --4.75332 -2.48657 --4.35184 -3.03174 --3.87034 -3.52112 --3.31706 -3.94514 --2.7016 -4.29509 --2.03482 -4.56331 --1.32882 -4.74335 --0.596809 -4.83014 -0.147041 -4.82017 -0.887756 -4.7117 -1.60981 -4.50494 -2.29741 -4.20219 -2.93484 -3.808 -3.50689 -3.32924 -3.9993 -2.77507 -4.39923 -2.15692 -4.69581 -1.48825 -4.88053 -0.784269 -4.94771 -0.061516 -4.8948 0.662629 -4.72255 1.37053 -4.43504 2.04492 -4.03954 2.66948 -3.54628 3.22939 -2.96796 3.71185 -2.3193 4.10639 -1.61648 4.4051 -0.876509 4.60277 -0.116734 4.69684 --0.645706 4.68732 --1.3943 4.57654 --2.11352 4.36901 --2.7891 4.07103 --3.40824 3.69049 --3.95974 3.23657 --4.43405 2.71946 --4.82335 2.15014 --5.12153 1.54013 --5.32418 0.901353 --5.42854 0.245892 --5.43348 -0.414109 --5.33945 -1.0666 --5.14842 -1.69974 --4.86387 -2.30203 --4.49074 -2.86242 --4.0354 -3.37043 --3.50561 -3.81626 --2.91045 -4.19095 --2.26035 -4.48653 --1.56694 -4.69612 --0.842997 -4.81419 --0.102336 -4.83668 -0.640376 -4.76121 -1.36982 -4.58727 -& -@target G0.S2 -@type xy -9.07533 -3.03929 -9.22824 -2.55085 -9.35109 -2.0541 -9.44322 -1.55058 -9.50404 -1.04192 -9.53307 -0.529761 -9.52991 -0.0158071 -9.49428 0.498206 -9.426 1.01051 -9.32499 1.51931 -9.19131 2.02279 -9.02513 2.51911 -8.82673 3.00643 -8.59654 3.48291 -8.33511 3.94673 -8.04311 4.39605 -7.72136 4.82908 -7.37081 5.24407 -6.99254 5.6393 -6.58775 6.01312 -6.15778 6.36392 -5.7041 6.69019 -5.22828 6.99051 -4.73204 7.26354 -4.21719 7.50809 -3.68567 7.72303 -3.1395 7.9074 -2.5808 8.06033 -2.01176 8.18112 -1.43463 8.26919 -0.851705 8.3241 -0.265326 8.34559 --0.322148 8.33353 --0.908351 8.28794 --1.49092 8.20902 --2.06752 8.09712 --2.63583 7.95273 --3.1936 7.77649 --3.73863 7.56921 --4.26878 7.3318 --4.78201 7.06532 --5.27638 6.77097 --5.75002 6.45004 --6.20122 6.10392 --6.62836 5.73413 --7.02994 5.34224 --7.40461 4.9299 --7.75114 4.49883 --8.06846 4.05082 --8.35559 3.58766 --8.61175 3.11121 --8.83625 2.62333 --9.02856 2.12589 --9.18828 1.62079 --9.31514 1.1099 --9.40899 0.595087 --9.46983 0.0781871 --9.49774 -0.43898 --9.49295 -0.954633 --9.45579 -1.46703 --9.38668 -1.97446 --9.28615 -2.47529 --9.15483 -2.9679 --8.99342 -3.45077 --8.80273 -3.92239 --8.58361 -4.38135 --8.33702 -4.82629 --8.06396 -5.25592 --7.7655 -5.66899 --7.44277 -6.06434 --7.09695 -6.44089 --6.72927 -6.7976 --6.341 -7.13352 --5.93345 -7.44775 --5.50797 -7.73948 --5.06593 -8.00795 --4.60876 -8.25249 --4.13786 -8.47248 --3.65472 -8.66737 --3.16079 -8.83669 --2.65757 -8.98002 --2.14657 -9.09704 --1.6293 -9.18746 --1.10729 -9.25107 --0.582058 -9.28774 --0.0551514 -9.29738 -0.471898 -9.27999 -0.997555 -9.23563 -1.52029 -9.16442 -2.03857 -9.06653 -2.55088 -8.94223 -3.0557 -8.79183 -3.55155 -8.6157 -4.03695 -8.41428 -4.51042 -8.1881 -4.97054 -7.93771 -5.41589 -7.66375 -5.84509 -7.36695 -6.25678 -7.04807 -6.64964 -6.70795 -7.02238 -6.34752 -7.37375 -5.96775 -7.70254 -5.56968 -8.00759 -5.15443 -8.28777 -4.72316 -8.54201 -4.2771 -8.76932 -3.81756 -8.96876 -3.34587 -9.13943 -2.86347 -9.28055 -2.3718 -9.39139 -1.87241 -9.4713 -1.36686 -9.51973 -0.856774 -9.53623 -0.343826 -9.52043 0.170274 -9.47207 0.683781 -9.39101 1.19491 -9.27722 1.70187 -9.13077 2.20282 -8.95187 2.69593 -8.74086 3.17936 -8.4982 3.65126 -8.22448 4.1098 -7.92042 4.55318 -7.58691 4.97961 -7.22492 5.38734 -6.8356 5.77469 -6.42022 6.14 -5.98017 6.48172 -5.51699 6.79836 -5.03232 7.08852 -4.52792 7.35089 -4.00567 7.58429 -3.46756 7.78764 -2.91563 7.96 -2.35206 8.10055 -1.77904 8.20863 -1.19887 8.28371 -0.613849 8.32542 -0.0263445 8.33354 --0.56128 8.30802 --1.14665 8.24894 --1.72741 8.15656 --2.30122 8.03131 --2.86579 7.87373 --3.41887 7.68455 --3.95829 7.46461 --4.48195 7.21491 --4.98783 6.93657 --5.47404 6.63082 --5.93875 6.29903 --6.38029 5.94263 --6.79709 5.56318 --7.18772 5.16229 --7.55088 4.74166 --7.88539 4.30304 --8.19023 3.84822 --8.46451 3.37904 --8.70748 2.89737 --8.91852 2.40508 --9.09716 1.90407 --9.24304 1.39623 --9.35597 0.883422 --9.43583 0.367523 --9.48267 -0.149633 --9.49662 -0.666238 --9.47794 -1.18052 --9.427 -1.69076 --9.34425 -2.19528 --9.23027 -2.69245 --9.0857 -3.18071 --8.9113 -3.65854 --8.70791 -4.12449 --8.47642 -4.57718 --8.21782 -5.01527 --7.93317 -5.43749 --7.62355 -5.84265 --7.29012 -6.22961 --6.93411 -6.59729 --6.55675 -6.9447 --6.15935 -7.2709 --5.74322 -7.57503 --5.30975 -7.85629 --4.86032 -8.11396 --4.39636 -8.34737 --3.91931 -8.55595 --3.43064 -8.73916 --2.93184 -8.89656 --2.42441 -9.02775 --1.90986 -9.13244 --1.38973 -9.21035 --0.86553 -9.26132 --0.338811 -9.28522 -0.188891 -9.28202 -0.716033 -9.25172 -1.24108 -9.19442 -1.76249 -9.11025 -2.27874 -8.99945 -2.78831 -8.8623 -3.28969 -8.69914 -3.78139 -8.51039 -4.26193 -8.29654 -4.72985 -8.05812 -5.18371 -7.79577 -5.62211 -7.51016 -6.04365 -7.20204 -6.44697 -6.87222 -6.83077 -6.52158 -7.19376 -6.15108 -7.53469 -5.76171 -7.85237 -5.35457 -8.14565 -4.93078 -8.41344 -4.49156 -8.6547 -4.03818 -8.86845 -3.57196 -9.05378 -3.09429 -9.20987 -2.60662 -9.33594 -2.11046 -9.43132 -1.60735 -9.49542 -1.09891 -9.52773 -0.586796 -9.52786 -0.072696 -9.4955 0.441652 -9.43047 0.954478 -9.33267 1.46399 -9.20215 1.96836 -9.03906 2.46575 -8.84368 2.95433 -8.61643 3.43225 -8.35783 3.89767 -8.06857 4.34877 -7.74945 4.78375 -7.40141 5.20085 -7.02553 5.59835 -6.62302 5.97457 -6.1952 6.32792 -5.74355 6.65686 -5.26965 6.95996 -4.77519 7.23585 -4.26199 7.4833 -3.73195 7.70118 -3.18709 7.88851 -2.6295 8.04441 -2.06137 8.16817 -1.48494 8.2592 -0.902497 8.31708 -0.316389 8.34151 --0.271028 8.33237 --0.857386 8.28969 --1.44032 8.21364 --2.01748 8.10455 --2.58657 7.96293 --3.1453 7.78939 --3.69147 7.58472 --4.22296 7.34985 --4.73769 7.08582 --5.23373 6.79382 --5.7092 6.47511 --6.16237 6.13112 --6.59161 5.76331 --6.99543 5.37328 --7.37244 4.96267 --7.72143 4.53319 --8.04129 4.08662 --8.33106 3.62476 --8.58991 3.14946 --8.81718 2.66257 --9.01231 2.16599 --9.17488 1.66158 --9.30463 1.15124 --9.4014 0.636813 --9.46515 0.120154 --9.49599 -0.396921 --9.49413 -0.91263 --9.45987 -1.42522 --9.39364 -1.933 --9.29596 -2.43432 --9.16745 -2.92756 --9.0088 -3.41118 --8.82081 -3.8837 --8.60434 -4.34368 --8.36032 -4.78976 --8.08976 -5.22065 --7.79371 -5.6351 --7.4733 -6.03195 --7.12971 -6.4101 --6.76415 -6.76852 --6.37789 -7.10623 --5.97224 -7.42236 --5.54853 -7.71607 --5.10815 -7.98661 --4.6525 -8.23329 --4.183 -8.45549 --3.7011 -8.65266 --3.20828 -8.82431 --2.70603 -8.97004 --2.19584 -9.08949 --1.67923 -9.18238 --1.15772 -9.2485 --0.632843 -9.2877 --0.106122 -9.2999 -0.420906 -9.28509 -0.946705 -9.2433 -1.46975 -9.17467 -1.9885 -9.07937 -2.50146 -8.95764 -3.0071 -8.8098 -3.50393 -8.63622 -3.99048 -8.43734 -4.46526 -8.21366 -4.92684 -7.96575 -5.37379 -7.69424 -5.80473 -7.39983 -6.21828 -7.08328 -6.61311 -6.74542 -6.98795 -6.38714 -7.34153 -6.00942 -7.67264 -5.61328 -7.98012 -5.19983 -8.26285 -4.77022 -8.51976 -4.32569 -8.74984 -3.86753 -8.95215 -3.39707 -9.1258 -2.91574 -9.26998 -2.42498 -9.38396 -1.92633 -9.46708 -1.42135 -9.5188 -0.91165 -9.53862 -0.398907 -9.52619 0.115175 -9.48124 0.628854 -9.40359 1.14035 -9.29321 1.64787 -9.15017 2.14958 -8.97466 2.64365 -8.76699 3.12823 -8.52761 3.60148 -8.25711 4.06157 -7.9562 4.50668 -7.62573 4.93504 -7.26667 5.34488 -6.88016 5.7345 -6.46744 6.10227 -6.02991 6.4466 -5.56907 6.766 -5.08656 7.05906 -4.58414 7.32447 -4.06367 7.56102 -3.52711 7.76762 -2.97653 7.94333 -2.41406 8.0873 -1.84192 8.19887 -1.26238 8.27748 -0.67776 8.32274 -0.0903996 8.33443 --0.497328 8.31247 --1.08305 8.25693 --1.66441 8.16806 --2.23906 8.04626 --2.80471 7.89206 --3.3591 7.70616 --3.90006 7.48942 --4.42546 7.24279 --4.93331 6.9674 --5.42166 6.66446 --5.88871 6.33531 --6.33275 5.9814 --6.75222 5.60426 --7.14565 5.2055 --7.51174 4.78682 --7.8493 4.34994 --8.15729 3.89667 --8.43481 3.42884 --8.68109 2.94832 --8.89551 2.45697 --9.07757 1.95669 --9.22692 1.44937 --9.34333 0.93689 --9.42671 0.421113 --9.47707 -0.0961171 --9.49456 -0.612989 --9.47942 -1.12773 --9.432 -1.63859 --9.35278 -2.1439 --9.24229 -2.64201 --9.10119 -3.13134 --8.9302 -3.61037 --8.73014 -4.07764 --8.50189 -4.53175 --8.24642 -4.97137 --7.96477 -5.39524 --7.65803 -5.80216 --7.32736 -6.19098 --6.97395 -6.56065 --6.59906 -6.91015 --6.20398 -7.23854 --5.79004 -7.54497 --5.3586 -7.82864 --4.91105 -8.0888 --4.44881 -8.3248 --3.97333 -8.53603 --3.48607 -8.72199 --2.98851 -8.88219 --2.48216 -9.01627 --1.96852 -9.12388 --1.44912 -9.20477 --0.925479 -9.25876 --0.399142 -9.28572 -0.128356 -9.28559 -0.655477 -9.25839 -1.18068 -9.20419 -1.70244 -9.12313 -2.21921 -9.01542 -2.7295 -8.88134 -3.23177 -8.72124 -3.72455 -8.5355 -4.20636 -8.32462 -4.67572 -8.08912 -5.1312 -7.82962 -5.5714 -7.54679 -5.99491 -7.24136 -6.40038 -6.91414 -6.78649 -6.56601 -7.15195 -6.19789 -7.49551 -5.81079 -7.81597 -5.40577 -8.11217 -4.98398 -8.38301 -4.5466 -8.62745 -4.0949 -8.84451 -3.63019 -9.03325 -3.15386 -9.19284 -2.66734 -9.32251 -2.17214 -9.42156 -1.66979 -9.48939 -1.16191 -9.52548 -0.650138 -9.52942 -0.136165 -9.50089 0.378277 -9.43969 0.891421 -9.34571 1.40147 -9.21898 1.90661 -9.05963 2.40501 -8.86793 2.89482 -8.64428 3.37419 -8.38919 3.84129 -8.10332 4.29428 -7.78746 4.73137 -7.44255 5.15079 -7.06964 5.5508 -6.66993 5.92975 -6.24474 6.286 -5.79554 6.61804 -5.3239 6.92439 -4.83152 7.20369 -4.3202 7.45469 -3.79187 7.67623 -3.24851 7.86729 -2.69221 8.02697 -2.12514 8.15452 -1.54952 8.24935 -0.967643 8.311 -0.381828 8.33917 --0.205568 8.33373 --0.792177 8.29468 --1.37563 8.22221 --1.95358 8.11662 --2.5237 7.9784 --3.08372 7.80817 --3.63142 7.6067 --4.16466 7.37489 --4.68137 7.1138 --5.17957 6.82457 --5.6574 6.50849 --6.1131 6.16695 --6.54503 5.80144 --6.95167 5.41352 --7.33164 5.00483 --7.68369 4.57709 --8.00671 4.13207 --8.29972 3.67157 --8.56189 3.19743 --8.79252 2.71153 --8.99105 2.21574 --9.15705 1.71194 --9.29024 1.20201 --9.39045 0.687826 --9.45764 0.171232 --9.49189 -0.345952 --9.49341 -0.861936 --9.4625 -1.37497 --9.39958 -1.88335 --9.30515 -2.38541 --9.17983 -2.87955 --9.0243 -3.36421 --8.83936 -3.8379 --8.62586 -4.2992 --8.38472 -4.74672 --8.11694 -5.17917 --7.82358 -5.5953 --7.50577 -5.99395 --7.16465 -6.374 --6.80147 -6.73442 --6.41746 -7.07424 --6.01394 -7.39257 --5.59225 -7.68856 --5.15375 -7.96147 --4.69984 -8.2106 --4.23196 -8.43532 --3.75153 -8.63508 --3.26004 -8.80939 --2.75896 -8.95783 --2.24979 -9.08005 --1.73404 -9.17576 --1.21324 -9.24473 --0.688896 -9.28682 --0.162546 -9.30194 -0.36428 -9.29007 -0.890053 -9.25125 -1.41325 -9.18559 -1.93233 -9.09326 -2.4458 -8.9745 -2.95215 -8.82962 -3.44987 -8.65898 -3.93749 -8.46303 -4.41355 -8.24225 -4.87659 -7.99721 -5.32519 -7.72854 -5.75796 -7.43692 -6.17353 -7.12312 -6.57054 -6.78794 -6.94771 -6.43227 -7.30377 -6.05706 -7.63751 -5.66333 -7.94775 -5.25215 -8.23337 -4.82467 -8.49331 -4.38212 -8.72656 -3.92576 -8.93216 -3.45693 -9.10923 -2.97704 -9.25695 -2.48754 -9.37458 -1.98993 -9.46146 -1.48578 -9.51701 -0.976705 -9.54074 -0.464357 -9.53229 0.0495622 -9.49135 0.563314 -9.41775 1.07513 -9.31143 1.58321 -9.17245 2.08572 -9.00096 2.58085 -8.79729 3.06674 -8.56184 3.54154 -8.29519 4.00344 -7.99803 4.45059 -7.67118 4.88123 -7.31562 5.29357 -6.93243 5.68593 -6.52287 6.05664 -6.0883 6.40411 -5.63021 6.72684 -5.15023 7.0234 -4.65009 7.29246 -4.13165 7.53281 -3.59687 7.74333 -3.04778 7.92306 -2.48652 8.07115 -1.9153 8.18689 -1.33639 8.26972 -0.75209 8.31924 -0.164758 8.33518 --0.42324 8.31745 --1.00953 8.26612 --1.59174 8.18139 --2.16754 8.06365 --2.7346 7.91343 --3.29068 7.7314 --3.83358 7.51839 --4.36117 7.27535 --4.87143 7.00339 --5.36242 6.70371 --5.83231 6.37763 --6.27938 6.02661 --6.70205 5.65214 --7.09883 5.25585 --7.46841 4.8394 --7.80958 4.40455 --8.12129 3.95307 --8.40261 3.48681 --8.65276 3.00761 --8.87111 2.51736 --9.05715 2.01795 --9.2105 1.51126 --9.33093 0.999189 --9.41833 0.483592 --9.47271 -0.0336828 --9.4942 -0.550818 --9.48304 -1.06603 --9.43958 -1.57759 --9.36427 -2.08378 --9.25767 -2.58298 --9.12041 -3.07357 --8.95322 -3.55404 --8.7569 -4.0229 --8.53232 -4.47875 --8.28043 -4.92024 --8.00226 -5.34609 --7.69887 -5.7551 --7.37142 -6.14613 --7.02108 -6.51811 --6.64911 -6.87004 --6.25679 -7.20097 --5.84545 -7.51005 --5.41643 -7.79646 --4.97114 -8.05948 --4.51099 -8.29843 --4.03742 -8.51272 --3.55189 -8.70181 --3.05588 -8.86523 --2.55088 -9.0026 --2.03841 -9.11357 --1.51998 -9.1979 --0.997115 -9.25536 --0.47135 -9.28585 -0.0557809 -9.28929 -0.582741 -9.26568 -1.108 -9.21509 -1.63001 -9.13765 -2.14727 -9.03357 -2.65824 -8.90311 -3.16143 -8.7466 -3.65533 -8.56443 -4.13847 -8.35707 -4.6094 -8.12505 -5.06666 -7.86896 -5.50884 -7.58946 -5.93455 -7.28729 -6.34244 -6.96322 -6.73116 -6.61813 -7.09944 -6.25294 -7.44602 -5.86863 -7.76968 -5.46626 -8.06927 -5.04696 -8.34368 -4.6119 -8.59185 -4.16234 -8.81279 -3.69958 -9.00557 -3.225 -9.16933 -2.74002 -9.30329 -2.24612 -9.40673 -1.74486 -9.47905 -1.23781 -9.51972 -0.726617 -9.52828 -0.212968 -9.50443 0.301415 -9.44792 0.814771 -9.35864 1.32531 -9.2366 1.83122 -9.0819 2.33066 -8.89479 2.8218 -8.67565 3.30278 -8.42497 3.77176 -8.14339 4.22692 -7.83168 4.66644 -7.49074 5.08855 -7.12163 5.49152 -6.7255 5.87366 -6.30368 6.23335 -5.85761 6.56904 -5.38885 6.87926 -4.89908 7.16264 -4.39011 7.4179 -3.86384 7.64387 -3.32228 7.83951 -2.7675 8.00389 -2.20167 8.13624 -1.62702 8.23591 -1.04581 8.30241 -0.460366 8.33542 --0.126975 8.33476 --0.713853 8.30043 --1.2979 8.23258 --1.87678 8.13151 --2.44815 7.99769 --3.00974 7.83172 --3.55931 7.63435 --4.09471 7.40649 --4.61386 7.14915 --5.11477 6.86348 --5.59555 6.55077 --6.05442 6.21237 --6.48973 5.84976 --6.89993 5.46451 --7.28364 5.05826 --7.63956 4.6327 --7.96658 4.18961 --8.26369 3.73078 --8.53005 3.25806 --8.76492 2.77332 --8.96775 2.27844 --9.13807 1.77531 --9.27559 1.2658 --9.38012 0.751795 --9.45162 0.235146 --9.49014 -0.282319 --9.49588 -0.798804 --9.46913 -1.31255 --9.41029 -1.82185 --9.31987 -2.32502 --9.19845 -2.82046 --9.04674 -3.30661 --8.8655 -3.78196 --8.65558 -4.24507 --8.4179 -4.69456 --8.15346 -5.12913 --7.8633 -5.54752 --7.54854 -5.94855 --7.21035 -6.33112 --6.84993 -6.69417 --6.46854 -7.03674 --6.06749 -7.35791 --5.64809 -7.65685 --5.21173 -7.93279 --4.7598 -8.18503 --4.29371 -8.41295 --3.81491 -8.61597 --3.32487 -8.79361 --2.82507 -8.94544 --2.317 -9.07109 --1.80216 -9.17028 --1.28208 -9.24278 --0.758273 -9.28843 --0.232265 -9.30713 -0.294417 -9.29886 -0.820243 -9.26366 -1.34369 -9.20161 -1.86324 -9.1129 -2.37737 -8.99776 -2.88459 -8.85647 -3.3834 -8.68941 -3.87232 -8.497 -4.34989 -8.27972 -4.81467 -8.03814 -5.26524 -7.77288 -5.70019 -7.48462 -6.11815 -7.17411 -6.51779 -6.84215 -6.89778 -6.48963 -7.25687 -6.11748 -7.59383 -5.7267 -7.90747 -5.31837 -8.19666 -4.8936 -8.46033 -4.45359 -8.69746 -3.9996 -8.90711 -3.53295 -9.08837 -3.05503 -9.24043 -2.56727 -9.36254 -2.07118 -9.45403 -1.56831 -9.51432 -1.06025 -9.54291 -0.548656 -9.53939 -0.0352165 -9.50347 0.47834 -9.43496 0.99025 -9.33377 1.49872 -9.19993 2.00195 -9.03359 2.49809 -8.83504 2.9853 -8.60467 3.46176 -8.34303 3.92561 -8.05077 4.37505 -7.72871 4.80827 -7.37778 5.22352 -6.99906 5.61907 -6.59377 5.99327 -6.16323 6.3445 -5.70893 6.67125 -5.23246 6.97208 -4.73554 7.24564 -4.22001 7.4907 -3.68779 7.70612 -3.14092 7.8909 -2.58152 8.04418 -2.01178 8.16523 -1.43396 8.25344 -0.850357 8.3084 -0.263325 8.32981 --0.324772 8.31755 --0.911559 8.27166 --1.49466 8.19231 --2.07174 8.07987 --2.64046 7.93483 --3.19856 7.75784 --3.74383 7.54971 --4.27414 7.31137 --4.78743 7.0439 --5.28175 6.74848 --5.75524 6.42643 --6.20617 6.07916 --6.63292 5.70818 --7.034 5.31509 --7.40806 4.90156 --7.75387 4.46931 --8.07035 4.02015 --8.35655 3.55588 --8.61168 3.07838 --8.83506 2.58951 --9.02618 2.09117 --9.18463 1.58526 --9.31016 1.07366 --9.40265 0.55824 --9.46208 0.0408572 --9.48857 -0.476667 --9.48236 -0.992543 --9.44377 -1.50502 --9.37326 -2.0124 --9.27136 -2.51303 --9.1387 -3.00529 --8.976 -3.48766 --8.78407 -3.95863 --8.56378 -4.41679 --8.31606 -4.86078 --8.04194 -5.28929 --7.74247 -5.70112 --7.41878 -6.0951 --7.07204 -6.47015 --6.70349 -6.82525 --6.3144 -7.15947 --5.90609 -7.47194 --5.4799 -7.76185 --5.03722 -8.02846 --4.57947 -8.2711 --4.10809 -8.48917 --3.62453 -8.68213 --3.13026 -8.84951 --2.6268 -8.99091 --2.11562 -9.10598 --1.59826 -9.19447 --1.07624 -9.25615 --0.551086 -9.2909 --0.0243262 -9.29864 -0.502502 -9.27937 -1.02787 -9.23313 -1.55024 -9.16007 -2.0681 -9.06036 -2.57993 -8.93425 -3.08422 -8.78208 -3.57949 -8.60423 -4.06424 -8.40114 -4.53704 -8.17333 -4.99642 -7.92139 -5.44099 -7.64597 -5.86934 -7.34777 -6.28011 -7.02758 -6.67198 -6.68624 -7.04364 -6.32466 -7.39385 -5.94382 -7.72138 -5.54476 -8.02507 -5.12858 -8.30381 -4.69646 -8.55652 -4.24962 -8.78221 -3.78936 -8.97993 -3.31704 -9.14881 -2.83407 -9.28806 -2.34191 -9.39696 -1.8421 -9.47486 -1.33622 -9.52122 -0.825879 -9.53559 -0.312765 -9.51761 0.201412 -9.46704 0.714902 -9.38372 1.22592 -9.26763 1.73266 -9.11887 2.2333 -8.93766 2.72599 -8.72433 3.20889 -8.47935 3.68015 -8.20334 4.13793 -7.89703 4.58044 -7.5613 5.00588 -7.19717 5.41251 -6.80578 5.79863 -6.38841 6.16262 -5.94649 6.50289 -5.48154 6.81797 -4.99525 7.10647 -4.48938 7.36708 -3.96583 7.59862 -3.42659 7.80002 -2.87374 7.97033 -2.30943 8.10876 -1.7359 8.21462 -1.15541 8.28739 -0.570299 8.3267 --0.0170975 8.33233 --0.60442 8.30423 --1.18931 8.24251 --1.76942 8.14744 --2.34242 8.01945 --2.90603 7.85913 --3.45801 7.66721 --3.99618 7.44457 --4.51846 7.1922 --5.02282 6.91126 --5.50737 6.60299 --5.97029 6.26875 --6.40991 5.91001 --6.82467 5.52831 --7.21313 5.12529 --7.574 4.70265 --7.90611 4.26215 --8.20845 3.80558 --8.48013 3.3348 --8.72042 2.85167 --8.9287 2.35807 --9.10452 1.85589 --9.24755 1.34703 --9.35757 0.83337 --9.43453 0.316763 --9.47847 -0.200949 --9.48956 -0.717961 --9.46807 -1.23251 --9.41441 -1.74286 --9.32904 -2.24734 --9.21258 -2.74433 --9.06568 -3.23224 --8.88911 -3.70958 --8.68371 -4.17489 --8.4504 -4.62677 --8.19016 -5.06391 --7.90403 -5.48505 --7.59313 -5.889 --7.2586 -6.27463 --6.90167 -6.64089 --6.52357 -6.9868 --6.12561 -7.31144 --5.70912 -7.61397 --5.27545 -7.89361 --4.826 -8.14966 --4.36219 -8.38146 --3.88546 -8.58847 --3.39727 -8.77016 --2.8991 -8.92611 --2.39243 -9.05595 --1.87878 -9.15938 --1.35965 -9.23616 --0.836568 -9.28613 --0.311048 -9.30919 -0.215381 -9.30529 -0.741195 -9.27447 -1.26487 -9.21681 -1.78489 -9.13249 -2.29975 -9.02171 -2.80794 -8.88477 -3.30797 -8.72202 -3.79837 -8.53388 -4.27768 -8.32082 -4.74446 -8.0834 -5.19728 -7.82222 -5.63475 -7.53796 -6.05549 -7.23135 -6.45817 -6.90321 -6.84148 -6.55438 -7.20413 -6.18582 -7.54491 -5.79849 -7.86261 -5.39347 -8.15609 -4.97187 -8.42426 -4.53485 -8.6661 -4.08366 -8.88063 -3.61961 -9.06696 -3.14404 -9.22425 -2.65839 -9.35175 -2.16413 -9.44878 -1.6628 -9.51475 -1.15598 -9.54914 -0.645309 -9.55155 -0.132466 -9.52165 0.380833 -9.45923 0.892836 -9.36418 1.40176 -9.23651 1.9058 -9.07635 2.40313 -8.88395 2.89192 -8.65968 3.37032 -8.40406 3.83651 -8.11771 4.28866 -7.80142 4.72498 -7.45609 5.14369 -7.08277 5.54307 -6.68263 5.92145 -6.25699 6.2772 -5.80729 6.6088 -5.3351 6.91478 -4.84212 7.19377 -4.33013 7.44452 -3.80107 7.66586 -3.25694 7.85678 -2.69984 8.01637 -2.13194 8.14387 -1.55549 8.23866 -0.972788 8.30027 -0.386171 8.32838 --0.201999 8.32283 --0.789345 8.28361 --1.37349 8.21089 --1.95208 8.10498 --2.52279 7.96634 --3.08333 7.7956 --3.63148 7.59353 --4.16508 7.36103 --4.68205 7.09914 --5.18043 6.80905 --5.65834 6.49204 --6.114 6.14949 --6.54578 5.78291 --6.95215 5.39387 --7.33173 4.98403 --7.68327 4.55511 --8.00565 4.1089 --8.2979 3.6472 --8.55919 3.17189 --8.78882 2.68483 --8.98623 2.18792 --9.15102 1.68306 --9.28289 1.17213 --9.3817 0.657028 --9.4474 0.139597 --9.48011 -0.378324 --9.48002 -0.894938 --9.44746 -1.40848 --9.38285 -1.91725 --9.28672 -2.41956 --9.15969 -2.91382 --9.00247 -3.39845 --8.81586 -3.87196 --8.60071 -4.33292 --8.35796 -4.77995 --8.08863 -5.21174 --7.79377 -5.62705 --7.47451 -6.0247 --7.13202 -6.4036 --6.7675 -6.7627 --6.38223 -7.10106 --5.9775 -7.41777 --5.55466 -7.71204 --5.11508 -7.9831 --4.66016 -8.23029 --4.19135 -8.45299 --3.71009 -8.65067 --3.21787 -8.82285 --2.71616 -8.96911 --2.20648 -9.08912 --1.69034 -9.18259 --1.16926 -9.24932 --0.644768 -9.28914 --0.118395 -9.30199 -0.408328 -9.28785 -0.93387 -9.24676 -1.4567 -9.17884 -1.97531 -9.08427 -2.48817 -8.96329 -2.99378 -8.81621 -3.49065 -8.6434 -3.97731 -8.44531 -4.45229 -8.22244 -4.91416 -7.97535 -5.36149 -7.70469 -5.7929 -7.41115 -6.20702 -7.09549 -6.60252 -6.75856 -6.97809 -6.40123 -7.33249 -6.02448 -7.66448 -5.62933 -7.97291 -5.21687 -8.25663 -4.78824 -8.51459 -4.34468 -8.74577 -3.88745 -8.94921 -3.41789 -9.12404 -2.9374 -9.26944 -2.44743 -9.38468 -1.94949 -9.4691 -1.44515 -9.52213 -0.936016 -9.54331 -0.423744 -9.53225 0.0899632 -9.48868 0.60337 -9.41243 1.1147 -9.30346 1.62217 -9.16182 2.12394 -8.98769 2.61819 -8.7814 3.10308 -8.54337 3.57675 -8.27418 4.03739 -7.97453 4.48317 -7.64527 4.9123 -7.28737 5.32304 -6.90195 5.71367 -6.49026 6.08255 -6.05367 6.4281 -5.5937 6.74881 -5.11197 7.04325 -4.61024 7.31012 -4.09038 7.54821 -3.55435 7.7564 -3.0042 7.93374 -2.44209 8.07938 -1.87022 8.19262 -1.29088 8.27291 -0.706379 8.31984 -0.119072 8.33315 --0.468672 8.31275 --1.05448 8.25868 --1.636 8.17118 --2.2109 8.05061 --2.77688 7.89751 --3.3317 7.71259 --3.87318 7.49667 --4.3992 7.25075 --4.90774 6.97592 --5.39687 6.67342 --5.86476 6.3446 --6.30969 5.99089 --6.73008 5.61384 --7.12445 5.21506 --7.49148 4.79625 --7.82998 4.35915 --8.13888 3.90556 --8.41727 3.43733 --8.66438 2.95631 --8.87956 2.4644 --9.06233 1.9635 --9.21232 1.4555 --9.32931 0.942284 --9.41318 0.425733 --9.46398 -0.0923083 --9.48183 -0.61002 --9.467 -1.12562 --9.41986 -1.63737 --9.34088 -2.14358 --9.23062 -2.6426 --9.08975 -3.13285 --8.91902 -3.6128 --8.71926 -4.08097 --8.49137 -4.53598 --8.23632 -4.97647 --7.95516 -5.40117 --7.64898 -5.80889 --7.31893 -6.19847 --6.96622 -6.56886 --6.59211 -6.91906 --6.19787 -7.24813 --5.78483 -7.55523 --5.35436 -7.83955 --4.90784 -8.10039 --4.4467 -8.3371 --3.97236 -8.54908 --3.4863 -8.73584 --2.98998 -8.89692 --2.4849 -9.03195 --1.97256 -9.14061 --1.45447 -9.22267 --0.932143 -9.27795 --0.407106 -9.30633 -0.119119 -9.30776 -0.645008 -9.28228 -1.16904 -9.22995 -1.6897 -9.15094 -2.20548 -9.04545 -2.71488 -8.91375 -3.21641 -8.7562 -3.70859 -8.5732 -4.18998 -8.36522 -4.65912 -8.13279 -5.11459 -7.87652 -5.55501 -7.59705 -5.979 -7.29513 -6.38522 -6.97155 -6.77236 -6.62714 -7.13915 -6.26284 -7.48435 -5.87963 -7.80676 -5.47854 -8.10524 -5.06069 -8.37869 -4.62723 -8.62606 -4.17939 -8.84637 -3.71846 -9.03869 -3.24577 -9.20219 -2.76272 -9.33608 -2.27077 -9.43968 -1.77143 -9.51238 -1.26625 -9.55365 -0.756871 -9.56307 -0.244937 -9.54029 0.267847 -9.48509 0.779744 -9.39733 1.28898 -9.277 1.79377 -9.1242 2.29229 -8.93914 2.78271 -8.72217 3.26321 -8.47376 3.73195 -8.19452 4.18711 -7.88518 4.6269 -7.54661 5.04953 -7.17982 5.45328 -6.78595 5.83645 -6.36628 6.19742 -5.92221 6.53464 -5.45527 6.84661 -4.96712 7.13196 -4.45954 7.38939 -3.9344 7.61772 -3.3937 7.81588 -2.83949 7.98295 -2.27395 8.11812 -1.69929 8.22072 -1.1178 8.29026 -0.531808 8.32637 --0.0563274 8.32884 --0.644231 8.29763 --1.22953 8.23286 --1.80985 8.13479 --2.38286 8.00386 --2.94625 7.84064 --3.49779 7.64586 --4.0353 7.4204 --4.55667 7.16527 --5.0599 6.88161 --5.54309 6.57068 --6.00443 6.23384 --6.44224 5.87257 --6.85498 5.48843 --7.24121 5.08306 --7.59965 4.65817 --7.92915 4.21553 --8.22869 3.75696 --8.49741 3.28431 --8.73458 2.79945 --8.9396 2.30428 --9.11203 1.80071 --9.25155 1.29063 --9.35798 0.775926 --9.43125 0.258472 --9.47144 -0.25989 --9.47873 -0.777348 --9.45342 -1.29213 --9.39592 -1.80251 --9.30672 -2.30679 --9.18644 -2.80337 --9.03577 -3.29065 --8.85549 -3.76713 --8.64646 -4.23136 --8.4096 -4.68195 --8.14592 -5.11756 --7.85647 -5.53695 --7.54238 -5.93893 --7.20481 -6.32237 --6.84497 -6.68623 --6.46412 -7.02951 --6.06356 -7.35131 --5.64463 -7.6508 --5.20868 -7.92721 --4.7571 -8.17984 --4.29133 -8.40809 --3.81281 -8.61138 --3.32301 -8.78925 --2.82342 -8.94128 --2.31553 -9.0671 --1.80086 -9.16645 --1.28093 -9.2391 --0.757271 -9.28488 --0.231404 -9.30372 -0.295136 -9.29558 -0.820822 -9.2605 -1.34413 -9.19859 -1.86353 -9.11001 -2.37752 -8.995 -2.88459 -8.85385 -3.38325 -8.68693 -3.87203 -8.49465 -4.34947 -8.27752 -4.81412 -8.03608 -5.26457 -7.77096 -5.69943 -7.48284 -6.11733 -7.17248 -6.51692 -6.84067 -6.89693 -6.48831 -7.25607 -6.11634 -7.59312 -5.72577 -7.90691 -5.31766 -8.1963 -4.89315 -8.46021 -4.45344 -8.69763 -3.99979 -8.90758 -3.53351 -9.08917 -3.05599 -9.24158 -2.56866 -9.36405 -2.07301 -9.45591 -1.57058 -9.51657 -1.06297 -9.54553 -0.551819 -9.54241 -0.0388096 -9.50688 0.474335 -9.43877 0.985858 -9.33797 1.49397 -9.20454 1.99687 -9.03861 2.49273 -8.84046 2.97971 -8.61049 3.45597 -8.34924 3.91969 -8.05737 4.36904 -7.73569 4.80223 -7.38512 5.2175 -7.00674 5.61314 -6.60176 5.98748 -6.17152 6.33892 -5.71749 6.66593 -5.24126 6.96708 -4.74456 7.24101 -4.2292 7.48648 -3.69713 7.70237 -3.15039 7.88766 -2.59108 8.04148 -2.02141 8.1631 -1.44363 8.25192 -0.860063 8.30749 -0.273049 8.32952 --0.315037 8.31787 --0.901813 8.27255 --1.4849 8.19375 --2.06196 8.08179 --2.63065 7.93714 --3.18873 7.76046 --3.73398 7.55251 --4.26428 7.31425 --4.77758 7.04672 --5.27193 6.75115 --5.74548 6.42883 --6.19648 6.08119 --6.6233 5.70976 --7.02446 5.31613 --7.39858 4.90198 --7.74443 4.46905 --8.06091 4.01913 --8.34706 3.55407 --8.60208 3.07571 --8.82528 2.58597 --9.01614 2.08672 --9.17426 1.57988 --9.29936 1.06735 --9.39132 0.551004 --9.45013 0.0327077 --9.4759 -0.485707 --9.46887 -1.00244 --9.42937 -1.51574 --9.35786 -2.0239 --9.25488 -2.52524 --9.12108 -3.01818 --8.95718 -3.50115 --8.764 -3.97268 --8.54242 -4.43133 --8.29342 -4.87575 --8.01802 -5.30464 --7.71731 -5.71679 --7.39244 -6.11103 --7.0446 -6.48628 --6.67503 -6.84153 --6.28502 -7.17583 --5.8759 -7.48831 --5.44903 -7.77815 --5.00578 -8.04463 --4.54758 -8.28708 --4.07587 -8.50491 --3.5921 -8.69759 --3.09775 -8.86466 --2.59431 -9.00572 --2.08328 -9.12047 --1.56618 -9.20864 --1.04452 -9.27005 --0.519827 -9.30456 -0.00637733 -9.31212 -0.532568 -9.29275 -1.05722 -9.24651 -1.57883 -9.17354 -2.09587 -9.07404 -2.60684 -8.94828 -3.11027 -8.79659 -3.60467 -8.61937 -4.08858 -8.41706 -4.56056 -8.19021 -5.01919 -7.93939 -5.46307 -7.66525 -5.89084 -7.36851 -6.30115 -7.04995 -6.69268 -6.7104 -7.06417 -6.35078 -7.41437 -5.97205 -7.74209 -5.57523 -8.04617 -5.16143 -8.32552 -4.7318 -8.57907 -4.28754 -8.80583 -3.82993 -9.00487 -3.3603 -9.17532 -2.88003 -9.31639 -2.39056 -9.42736 -1.89338 -9.50759 -1.39002 -9.55655 -0.882084 -9.5738 -0.371204 -9.55896 0.140936 -9.5118 0.652617 -9.43217 1.16208 -9.32001 1.66756 -9.17541 2.16723 -8.99854 2.6593 -8.78974 3.14192 -8.54943 3.61328 -8.27818 4.07156 -7.97669 4.51496 -7.64579 4.9417 -7.28645 5.35005 -6.89977 5.7383 -6.48698 6.10483 -6.04945 6.44805 -5.58867 6.76648 -5.10626 7.05868 -4.60395 7.32335 -4.0836 7.55928 -3.54714 7.76538 -2.99662 7.94066 -2.43418 8.08429 -1.86201 8.19557 -1.28238 8.27394 -0.697598 8.319 -0.110014 8.3305 --0.478004 8.30834 --1.06408 8.25259 --1.64585 8.16348 --2.22096 8.04138 --2.7871 7.88682 --3.34201 7.7005 --3.8835 7.48324 --4.40943 7.23601 --4.91778 6.95991 --5.40659 6.65617 --5.87405 6.32612 --6.31843 5.97121 --6.73814 5.59297 --7.13171 5.19302 --7.49782 4.77305 --7.83526 4.33483 --8.14298 3.88015 --8.42008 3.41085 --8.66577 2.92882 --8.87943 2.43595 --9.06056 1.93413 --9.20881 1.42528 --9.32396 0.911296 --9.40591 0.394049 --9.4547 -0.124602 --9.47047 -0.64283 --9.45351 -1.15885 --9.40418 -1.67091 --9.32296 -2.17731 --9.21045 -2.67642 --9.0673 -3.16662 --8.89429 -3.6464 --8.69226 -4.11427 --8.46212 -4.56884 --8.20485 -5.00876 --7.92152 -5.43274 --7.61323 -5.83959 --7.28114 -6.22816 --6.92648 -6.59738 --6.55048 -6.94626 --6.15446 -7.27386 --5.73974 -7.57932 --5.30769 -7.86185 --4.8597 -8.12073 --4.39717 -8.35532 --3.92156 -8.56506 --3.43432 -8.74943 --2.93694 -8.90801 --2.4309 -9.04043 --1.91772 -9.14641 --1.39892 -9.22571 --0.876023 -9.27817 --0.35056 -9.30368 -0.175937 -9.30222 -0.70194 -9.27381 -1.22592 -9.21854 -1.74636 -9.13656 -2.26174 -9.02811 -2.77056 -8.89347 -3.27133 -8.73298 -3.76257 -8.54705 -4.24282 -8.33617 -4.71064 -8.10088 -5.16461 -7.84179 -5.60333 -7.55955 -6.02544 -7.25492 -6.42959 -6.92868 -6.81449 -6.5817 -7.17886 -6.21491 -7.52148 -5.8293 -7.84116 -5.42591 -8.13676 -5.00588 -8.40719 -4.57037 -8.65142 -4.12062 -8.86848 -3.65794 -9.05745 -3.18368 -9.2175 -2.69926 -9.34787 -2.20615 -9.44785 -1.70588 -9.51684 -1.20001 -9.55433 -0.690172 -9.55988 -0.17803 -9.53318 0.334713 -9.474 0.846314 -9.38221 1.355 -9.25783 1.85899 -9.10096 2.35645 -8.91185 2.84556 -8.69085 3.3245 -8.43845 3.79143 -8.15529 4.24454 -7.84211 4.68203 -7.49981 5.10213 -7.12941 5.50313 -6.73208 5.88334 -6.30911 6.24115 -5.86193 6.57501 -5.39208 6.88345 -4.90125 7.1651 -4.39121 7.41869 -3.86388 7.64304 -3.32125 7.83711 -2.76541 8 -2.19853 8.1309 -1.62285 8.22919 -1.04065 8.29438 -0.454289 8.32612 --0.13388 8.32423 --0.721473 8.28868 --1.30611 8.21959 --1.88541 8.11726 --2.45705 7.98212 --3.01872 7.81475 --3.56819 7.61589 --4.1033 7.38642 --4.62195 7.12734 --5.12217 6.83981 --5.60207 6.5251 --6.05987 6.1846 --6.49393 5.81978 --6.90271 5.43224 --7.2848 5.02364 --7.63892 4.59569 --7.96394 4.15019 --8.25886 3.68896 --8.52282 3.21387 --8.75511 2.7268 --8.95514 2.22967 --9.12247 1.72437 --9.2568 1.21283 --9.35795 0.696927 --9.42589 0.178541 --9.46069 -0.340478 --9.46255 -0.858315 --9.43178 -1.3732 --9.3688 -1.88339 --9.27414 -2.38721 --9.14841 -2.88303 --8.99232 -3.36929 --8.80667 -3.84446 --8.59234 -4.30711 --8.35027 -4.75585 --8.08147 -5.18937 --7.78703 -5.60642 --7.46808 -6.00582 --7.12582 -6.38647 --6.76148 -6.74732 --6.37634 -7.08742 --5.97172 -7.40587 --5.54898 -7.70185 --5.1095 -7.9746 --4.65471 -8.22344 --4.18602 -8.44776 --3.70492 -8.64702 --3.21287 -8.82073 --2.71136 -8.96851 --2.2019 -9.09001 --1.686 -9.18495 --1.16518 -9.25315 --0.640968 -9.29445 --0.114887 -9.3088 -0.411535 -9.29619 -0.936776 -9.25667 -1.45932 -9.19037 -1.97765 -9.09749 -2.49026 -8.97827 -2.99567 -8.83304 -3.49239 -8.66218 -3.97897 -8.46613 -4.45395 -8.2454 -4.91593 -8.00058 -5.36349 -7.73229 -5.79527 -7.44124 -6.20992 -7.12819 -6.60612 -6.79397 -6.98259 -6.43947 -7.3381 -6.06564 -7.67145 -5.6735 -7.98147 -5.26412 -8.26705 -4.83865 -8.52715 -4.39828 -8.76075 -3.94427 -8.96692 -3.47794 -9.14476 -3.00065 -9.29348 -2.51384 -9.41234 -2.01897 -9.50067 -1.51757 -9.55791 -1.01122 -9.58357 -0.501524 -9.57729 0.0098532 -9.53877 0.521216 -9.46786 1.03083 -9.36447 1.53693 -9.22866 2.03773 -9.06059 2.53143 -8.86054 3.01621 -8.62891 3.49025 -8.36624 3.95174 -8.07318 4.39888 -7.75052 4.82989 -7.3992 5.24304 -7.02027 5.63662 -6.61491 6.00897 -6.18446 6.35851 -5.73036 6.68372 -5.25419 6.98316 -4.75763 7.25549 -4.24251 7.49948 -3.71072 7.71398 -3.16429 7.89799 -2.60531 8.05064 -2.03596 8.17117 -1.45847 8.25898 -0.87514 8.31363 -0.288305 8.3348 --0.299676 8.32237 --0.886433 8.27634 --1.46959 8.19687 --2.04681 8.08431 --2.61575 7.93914 --3.17415 7.76199 --3.71978 7.55364 --4.25049 7.31502 --4.76423 7.04719 --5.259 6.75133 --5.73296 6.42874 --6.18433 6.08083 --6.61149 5.70911 --7.01293 5.31518 --7.38726 4.90071 --7.73326 4.46742 --8.04981 4.01713 --8.33596 3.55165 --8.59089 3.07286 --8.81392 2.58266 --9.00452 2.08294 --9.16228 1.57562 --9.28694 1.06259 --9.37838 0.545751 --9.43658 0.0269674 --9.46165 -0.491921 --9.45385 -1.00911 --9.4135 -1.52283 --9.34107 -2.03138 --9.23711 -2.53307 --9.10227 -3.0263 --8.93728 -3.50951 --8.74297 -3.98121 --8.52025 -4.43997 --8.27007 -4.88442 --7.99349 -5.31327 --7.69159 -5.72528 --7.36554 -6.1193 --7.01655 -6.49424 --6.64586 -6.84907 --6.25477 -7.18284 --5.84462 -7.49468 --5.41676 -7.78377 --4.97259 -8.04938 --4.51353 -8.29084 --4.04101 -8.50754 --3.55651 -8.69897 --3.06148 -8.86466 --2.55742 -9.00424 --2.04584 -9.11739 --1.52825 -9.20387 --1.00617 -9.26351 --0.481127 -9.2962 -0.0453362 -9.30188 -0.571693 -9.28058 -1.09642 -9.23237 -1.61798 -9.15742 -2.13487 -9.05591 -2.64557 -8.92813 -3.1486 -8.77442 -3.64247 -8.59517 -4.12572 -8.39085 -4.59691 -8.16198 -5.0546 -7.90917 -5.49741 -7.63306 -5.92396 -7.33438 -6.3329 -7.01391 -6.72293 -6.67249 -7.09278 -6.31105 -7.44119 -5.93054 -7.76699 -5.53202 -8.06903 -5.11658 -8.34621 -4.68538 -8.59749 -4.23964 -8.82188 -3.78064 -9.01846 -3.30973 -9.18637 -2.82831 -9.32484 -2.33781 -9.43316 -1.83976 -9.51069 -1.33571 -9.55691 -0.827256 -9.57135 -0.316052 -9.55368 0.196216 -9.50364 0.707821 -9.42109 1.21701 -9.30598 1.72199 -9.15842 2.22098 -8.97859 2.71214 -8.76682 3.19367 -8.52356 3.66373 -8.2494 4.12051 -7.94505 4.56223 -7.61136 4.9871 -7.24931 5.3934 -6.86001 5.77944 -6.44472 6.14359 -6.00482 6.48428 -5.5418 6.80003 -5.05731 7.08944 -4.55309 7.35119 -4.031 7.58411 -3.493 7.78709 -2.94115 7.95919 -2.37759 8.09959 -1.80452 8.20759 -1.22422 8.28266 -0.639013 8.32441 -0.051245 8.3326 --0.536707 8.30716 --1.12246 8.24817 --1.70365 8.15586 --2.27792 8.03062 --2.84295 7.87301 --3.3965 7.6837 --3.93634 7.46353 --4.46037 7.21347 --4.96656 6.93462 --5.45297 6.62819 --5.91778 6.29552 --6.35931 5.93806 --6.77598 5.55734 --7.16634 5.155 --7.52908 4.73275 --7.86303 4.29233 --8.16714 3.83559 --8.44051 3.36437 --8.68237 2.88055 --8.89211 2.38605 --9.06925 1.88278 --9.21342 1.37264 --9.32441 0.857548 --9.40214 0.339388 --9.44665 -0.179977 --9.4581 -0.698716 --9.43676 -1.21503 --9.38302 -1.72718 --9.29738 -2.23345 --9.18042 -2.73219 --9.03283 -3.2218 --8.85538 -3.70076 --8.64892 -4.16759 --8.41439 -4.62089 --8.15279 -5.0593 --7.86517 -5.48156 --7.55267 -5.88647 --7.21647 -6.27289 --6.85779 -6.63977 --6.47791 -6.98611 --6.07815 -7.31099 --5.65986 -7.61358 --5.22442 -7.89309 --4.77325 -8.14882 --4.30778 -8.38014 --3.82948 -8.58649 --3.33983 -8.76737 --2.84031 -8.92236 --2.33244 -9.05111 --1.81773 -9.15332 --1.29771 -9.22879 --0.773901 -9.27736 --0.247838 -9.29894 -0.278949 -9.29352 -0.804931 -9.26115 -1.32859 -9.20192 -1.8484 -9.11603 -2.36286 -9.00372 -2.87047 -8.86528 -3.36975 -8.7011 -3.85924 -8.5116 -4.33748 -8.29728 -4.80304 -8.05871 -5.25453 -7.7965 -5.69057 -7.51136 -6.1098 -7.20402 -6.5109 -6.87531 -6.8926 -6.5261 -7.25364 -6.15733 -7.59282 -5.77001 -7.90897 -5.36519 -8.20098 -4.944 -8.46779 -4.50763 -8.70838 -4.05732 -8.92181 -3.59437 -9.10719 -3.12014 -9.26369 -2.63603 -9.39057 -2.14353 -9.48716 -1.64413 -9.55285 -1.1394 -9.58715 -0.630943 -9.58964 -0.120401 -9.56001 0.390545 -9.49807 0.900186 -9.4037 1.40678 -9.27694 1.90855 -9.11791 2.40372 -8.92686 2.89047 -8.70418 3.36702 -8.45035 3.83154 -8.16601 4.28225 -7.8519 4.71737 -7.50891 5.13516 -7.13805 5.53391 -6.74048 5.91195 -6.31746 6.2677 -5.87042 6.5996 -5.40087 6.90622 -4.91048 7.18618 -4.401 7.43821 -3.87431 7.66114 -3.33239 7.85395 -2.77729 8.0157 -2.21116 8.1456 -1.63622 8.24303 -1.05473 8.30746 -0.46902 8.33855 --0.118575 8.33611 --0.705688 8.3001 --1.28995 8.23062 --1.86901 8.12797 --2.44054 7.99256 --3.00224 7.82499 --3.55187 7.62598 --4.08727 7.3964 --4.60635 7.13728 --5.10708 6.84975 --5.58758 6.53508 --6.04604 6.19462 --6.48079 5.82987 --6.89027 5.44239 --7.27307 5.03381 --7.62788 4.60587 --7.95356 4.16033 --8.24911 3.69902 --8.51365 3.2238 --8.74645 2.73655 --8.94694 2.23918 --9.11466 1.7336 --9.24931 1.22172 --9.35071 0.705441 --9.41881 0.18664 --9.45368 -0.332827 --9.45553 -0.85114 --9.42467 -1.36652 --9.36151 -1.87721 --9.26659 -2.38155 --9.14052 -2.87789 --8.98402 -3.36464 --8.79788 -3.8403 --8.583 -4.30341 --8.34032 -4.75258 --8.07087 -5.18649 --7.77573 -5.60388 --7.45605 -6.00357 --7.11303 -6.38445 --6.74792 -6.74548 --6.362 -7.08568 --5.95661 -7.40415 --5.53311 -7.70007 --5.09289 -7.97267 --4.63739 -8.22127 --4.16803 -8.44524 --3.68629 -8.64404 --3.19365 -8.81719 --2.69159 -8.96428 --2.18163 -9.08497 --1.66526 -9.179 --1.14402 -9.24617 --0.619425 -9.28636 --0.0930099 -9.29951 -0.433694 -9.28562 -0.959157 -9.24478 -1.48185 -9.1771 -2.00026 -9.0828 -2.51287 -8.96213 -3.01818 -8.81543 -3.51472 -8.64307 -4.001 -8.44552 -4.47559 -8.22328 -4.93706 -7.97694 -5.38399 -7.70715 -5.81502 -7.4146 -6.22879 -7.10007 -6.624 -6.76439 -6.99935 -6.40846 -7.35361 -6.03323 -7.68558 -5.63974 -7.9941 -5.22905 -8.27807 -4.80232 -8.53643 -4.36075 -8.7682 -3.90561 -8.97242 -3.43822 -9.14825 -2.95995 -9.29487 -2.47225 -9.41157 -1.9766 -9.4977 -1.47454 -9.55271 -0.967658 -9.57612 -0.457581 -9.56755 0.0540176 -9.52674 0.565428 -9.45351 1.07491 -9.34779 1.5807 -9.20964 2.081 -9.03923 2.574 -8.83684 3.0579 -8.60288 3.53089 -8.33791 3.99114 -8.04258 4.43687 -7.71771 4.8663 -7.36424 5.27771 -6.98323 5.66939 -6.57589 6.0397 -6.14355 6.38707 -5.68768 6.70997 -5.20986 7.007 -4.71179 7.27682 -4.1953 7.5182 -3.6623 7.73002 -3.11482 7.91129 -2.55495 8.06113 -1.9849 8.17883 -1.40689 8.2638 -0.823228 8.31559 -0.236255 8.33392 --0.351667 8.31866 --0.938165 8.26984 --1.52087 8.18764 --2.09742 8.07241 --2.66549 7.92464 --3.22281 7.74497 --3.76716 7.5342 --4.29638 7.29325 --4.8084 7.02319 --5.30126 6.72519 --5.77308 6.40055 --6.22212 6.05068 --6.64674 5.67707 --7.04545 5.28131 --7.4169 4.86507 --7.75986 4.4301 --8.07326 3.97818 --8.35613 3.51117 --8.60769 3.03093 --8.82727 2.53938 --9.01433 2.03843 --9.16849 1.52999 --9.28948 1.01598 --9.37719 0.498292 --9.43159 -0.0211906 --9.45283 -0.540622 --9.44113 -1.05819 --9.39686 -1.57212 --9.32046 -2.08069 --9.21251 -2.58223 --9.07365 -3.07511 --8.90463 -3.55778 -& -@target G0.S3 -@type xy -8.30994 -16.2836 -8.66186 -16.1431 -9.01042 -15.9963 -9.35548 -15.8433 -9.69693 -15.6842 -10.0346 -15.5191 -10.3685 -15.3479 -10.6983 -15.1709 -11.0241 -14.9881 -11.3456 -14.7995 -11.6628 -14.6053 -11.9756 -14.4055 -12.2838 -14.2002 -12.5873 -13.9896 -12.8861 -13.7736 -13.18 -13.5524 -13.4689 -13.3262 -13.7528 -13.0949 -14.0315 -12.8586 -14.3049 -12.6176 -14.573 -12.3718 -14.8356 -12.1214 -15.0926 -11.8664 -15.344 -11.6071 -15.5897 -11.3434 -15.8296 -11.0755 -16.0636 -10.8034 -16.2917 -10.5274 -16.5137 -10.2474 -16.7296 -9.96372 -16.9393 -9.6763 -17.1428 -9.38532 -17.3399 -9.09087 -17.5306 -8.79307 -17.7149 -8.49203 -17.8927 -8.18787 -18.0639 -7.88069 -18.2284 -7.57063 -18.3863 -7.25778 -18.5374 -6.94228 -18.6817 -6.62423 -18.8192 -6.30375 -18.9498 -5.98097 -19.0734 -5.65599 -19.1901 -5.32895 -19.2997 -4.99997 -19.4024 -4.66915 -19.4979 -4.33663 -19.5863 -4.00253 -19.6675 -3.66696 -19.7416 -3.33006 -19.8085 -2.99195 -19.8681 -2.65274 -19.9205 -2.31257 -19.9656 -1.97155 -20.0035 -1.62981 -20.034 -1.28748 -20.0572 -0.944683 -20.0731 -0.601539 -20.0816 -0.258176 -20.0828 0.085282 -20.0767 0.428709 -20.0632 0.77198 -20.0423 1.11497 -20.0142 1.45755 -19.9787 1.7996 -19.9358 2.14099 -19.8857 2.48159 -19.8282 2.82128 -19.7635 3.15994 -19.6915 3.49744 -19.6122 3.83365 -19.5258 4.16844 -19.4321 4.5017 -19.3312 4.83329 -19.2232 5.1631 -19.1081 5.491 -18.9859 5.81686 -18.8567 6.14057 -18.7204 6.46199 -18.5772 6.78101 -18.4271 7.0975 -18.2701 7.41135 -18.1063 7.72243 -17.9357 8.03062 -17.7583 8.3358 -17.5743 8.63785 -17.3837 8.93665 -17.1866 9.23209 -16.983 9.52404 -16.7729 9.8124 -16.5565 10.097 -16.3338 10.3779 -16.1049 10.6547 -15.8699 10.9275 -15.6288 11.1962 -15.3818 11.4606 -15.1288 11.7205 -14.87 11.976 -14.6056 12.2269 -14.3355 12.473 -14.0598 12.7144 -13.7787 12.9508 -13.4923 13.1822 -13.2006 13.4084 -12.9037 13.6295 -12.6019 13.8452 -12.295 14.0554 -11.9834 14.2602 -11.667 14.4593 -11.346 14.6527 -11.0206 14.8403 -10.6907 15.0221 -10.3566 15.1978 -10.0184 15.3675 -9.67612 15.531 -9.32999 15.6884 -8.98012 15.8394 -8.62662 15.984 -8.26964 16.1222 -7.9093 16.2538 -7.54575 16.3788 -7.17913 16.4971 -6.80957 16.6087 -6.43722 16.7135 -6.06223 16.8114 -5.68473 16.9024 -5.30489 16.9864 -4.92286 17.0633 -4.53877 17.1332 -4.15279 17.1959 -3.76508 17.2514 -3.37579 17.2996 -2.98508 17.3406 -2.59311 17.3743 -2.20004 17.4006 -1.80604 17.4195 -1.41127 17.431 -1.0159 17.435 -0.620089 17.4316 -0.224012 17.4207 --0.172163 17.4023 --0.568265 17.3764 --0.964123 17.3429 --1.35956 17.3019 --1.75442 17.2533 --2.1485 17.1973 --2.54165 17.1336 --2.93368 17.0625 --3.32442 16.9838 --3.7137 16.8976 --4.10133 16.804 --4.48714 16.7029 --4.87095 16.5943 --5.25258 16.4783 --5.63186 16.3549 --6.00861 16.2242 --6.38266 16.0861 --6.75382 15.9408 --7.12192 15.7883 --7.4868 15.6286 --7.84826 15.4618 --8.20615 15.2879 --8.56029 15.1071 --8.9105 14.9193 --9.25662 14.7247 --9.59848 14.5232 --9.93591 14.3151 --10.2687 14.1003 --10.5968 13.879 --10.92 13.6513 --11.238 13.4172 --11.5508 13.1768 --11.8582 12.9302 --12.1601 12.6776 --12.4562 12.4191 --12.7465 12.1547 --13.0308 11.8846 --13.3089 11.6088 --13.5807 11.3276 --13.8461 11.041 --14.1049 10.7491 --14.357 10.4522 --14.6023 10.1503 --14.8406 9.84348 --15.0718 9.53201 --15.2958 9.21597 --15.5124 8.89552 --15.7217 8.57081 --15.9234 8.24198 --16.1174 7.90918 --16.3037 7.57258 --16.4821 7.23234 --16.6526 6.88861 --16.815 6.54155 --16.9693 6.19133 --17.1155 5.83813 --17.2533 5.4821 --17.3828 5.12341 --17.5039 4.76225 --17.6165 4.39879 --17.7206 4.03319 --17.8161 3.66564 --17.903 3.29631 --17.9812 2.92539 --18.0506 2.55305 --18.1114 2.17947 --18.1633 1.80484 --18.2064 1.42933 --18.2407 1.05313 --18.2661 0.676423 --18.2827 0.299385 --18.2904 -0.0777982 --18.2893 -0.454945 --18.2793 -0.831874 --18.2605 -1.2084 --18.2329 -1.58435 --18.1964 -1.95953 --18.1512 -2.33377 --18.0972 -2.70688 --18.0345 -3.07869 --17.9631 -3.44902 --17.8831 -3.81769 --17.7945 -4.18453 --17.6973 -4.54937 --17.5917 -4.91202 --17.4777 -5.27232 --17.3553 -5.63011 --17.2246 -5.98521 --17.0857 -6.33745 --16.9387 -6.68668 --16.7837 -7.03273 --16.6206 -7.37545 --16.4498 -7.71468 --16.2711 -8.05026 --16.0848 -8.38204 --15.8908 -8.70987 --15.6895 -9.03361 --15.4807 -9.35312 --15.2647 -9.66824 --15.0416 -9.97885 --14.8114 -10.2848 --14.5744 -10.586 --14.3306 -10.8822 --14.0802 -11.1735 --13.8232 -11.4595 --13.5599 -11.7403 --13.2903 -12.0157 --13.0147 -12.2855 --12.7331 -12.5498 --12.4456 -12.8083 --12.1525 -13.061 --11.8539 -13.3077 --11.5499 -13.5485 --11.2407 -13.7831 --10.9264 -14.0114 --10.6072 -14.2335 --10.2833 -14.4492 --9.95473 -14.6584 --9.62174 -14.8611 --9.28447 -15.0572 --8.94308 -15.2466 --8.59774 -15.4293 --8.2486 -15.6051 --7.89583 -15.7741 --7.5396 -15.9362 --7.18006 -16.0913 --6.8174 -16.2394 --6.45176 -16.3804 --6.08333 -16.5143 --5.71227 -16.6411 --5.33874 -16.7607 --4.96292 -16.8731 --4.58498 -16.9783 --4.20507 -17.0762 --3.82337 -17.1669 --3.44005 -17.2502 --3.05527 -17.3263 --2.6692 -17.395 --2.28201 -17.4564 --1.89387 -17.5105 --1.50493 -17.5572 --1.11536 -17.5967 --0.725328 -17.6288 --0.334998 -17.6535 -0.05547 -17.671 -0.445914 -17.6812 -0.836173 -17.6841 -1.22609 -17.6797 -1.6155 -17.6681 -2.00425 -17.6493 -2.39219 -17.6234 -2.77915 -17.5902 -3.16499 -17.55 -3.54955 -17.5026 -3.93268 -17.4483 -4.31423 -17.3869 -4.69405 -17.3185 -5.072 -17.2433 -5.44793 -17.1612 -5.82169 -17.0722 -6.19314 -16.9765 -6.56214 -16.8741 -6.92855 -16.765 -7.29224 -16.6494 -7.65306 -16.5272 -8.01089 -16.3985 -8.36559 -16.2635 -8.71702 -16.1221 -9.06507 -15.9744 -9.4096 -15.8206 -9.75049 -15.6606 -10.0876 -15.4946 -10.4209 -15.3226 -10.7501 -15.1447 -11.0752 -14.961 -11.3961 -14.7716 -11.7126 -14.5765 -12.0247 -14.3759 -12.3321 -14.1698 -12.635 -13.9584 -12.933 -13.7416 -13.2261 -13.5196 -13.5143 -13.2926 -13.7973 -13.0605 -14.0752 -12.8235 -14.3478 -12.5817 -14.615 -12.3352 -14.8767 -12.0841 -15.1329 -11.8284 -15.3834 -11.5684 -15.6282 -11.304 -15.8672 -11.0354 -16.1003 -10.7627 -16.3274 -10.486 -16.5484 -10.2055 -16.7633 -9.92114 -16.9721 -9.63312 -17.1745 -9.34155 -17.3707 -9.04653 -17.5604 -8.74817 -17.7436 -8.4466 -17.9204 -8.14191 -18.0905 -7.83423 -18.254 -7.52367 -18.4108 -7.21036 -18.5609 -6.89439 -18.7041 -6.5759 -18.8405 -6.25501 -18.97 -5.93182 -19.0926 -5.60646 -19.2081 -5.27906 -19.3167 -4.94972 -19.4182 -4.61858 -19.5126 -4.28575 -19.5999 -3.95135 -19.68 -3.61552 -19.753 -3.27836 -19.8187 -2.94001 -19.8772 -2.60059 -19.9284 -2.26022 -19.9724 -1.91902 -20.009 -1.57713 -20.0384 -1.23466 -20.0604 -0.891739 -20.0751 -0.548492 -20.0825 -0.205044 -20.0825 0.138479 -20.0752 0.481951 -20.0605 0.825247 -20.0385 1.16824 -20.0091 1.51081 -19.9725 1.85282 -19.9284 2.19415 -19.8771 2.53468 -19.8185 2.87427 -19.7526 3.21281 -19.6794 3.55016 -19.599 3.8862 -19.5113 4.22081 -19.4165 4.55387 -19.3144 4.88523 -19.2053 5.2148 -19.089 5.54243 -18.9656 5.868 -18.8352 6.19139 -18.6978 6.51249 -18.5535 6.83115 -18.4022 7.14728 -18.244 7.46073 -18.0791 7.77139 -17.9073 8.07915 -17.7289 8.38387 -17.5438 8.68545 -17.352 8.98376 -17.1538 9.27868 -16.9491 9.5701 -16.7379 9.8579 -16.5204 10.142 -16.2967 10.4222 -16.0667 10.6984 -15.8306 10.9706 -15.5885 11.2386 -15.3404 11.5023 -15.0865 11.7616 -14.8267 12.0163 -14.5613 12.2665 -14.2902 12.5119 -14.0135 12.7524 -13.7315 12.988 -13.4441 13.2186 -13.1515 13.444 -12.8537 13.6642 -12.5509 13.879 -12.2432 14.0883 -11.9307 14.2922 -11.6135 14.4904 -11.2916 14.6828 -10.9653 14.8695 -10.6347 15.0502 -10.2998 15.225 -9.96079 15.3937 -9.6178 15.5562 -9.27095 15.7125 -8.92037 15.8624 -8.56619 16.0059 -8.20854 16.143 -7.84757 16.2735 -7.4834 16.3974 -7.11617 16.5146 -6.74604 16.6251 -6.37314 16.7287 -5.99762 16.8254 -5.61962 16.9152 -5.23929 16.998 -4.8568 17.0738 -4.47228 17.1424 -4.08589 17.2039 -3.6978 17.2581 -3.30815 17.3052 -2.91711 17.3449 -2.52484 17.3773 -2.1315 17.4023 -1.73725 17.42 -1.34226 17.4302 -0.946704 17.433 -0.55074 17.4283 -0.15454 17.4161 --0.241726 17.3964 --0.637886 17.3692 --1.03377 17.3345 --1.4292 17.2922 --1.82401 17.2424 --2.21801 17.1851 --2.61104 17.1202 --3.00292 17.0478 --3.39347 16.9678 --3.78252 16.8804 --4.16988 16.7855 --4.55539 16.6831 --4.93886 16.5732 --5.32012 16.456 --5.69899 16.3314 --6.07529 16.1994 --6.44885 16.0601 --6.8195 15.9136 --7.18705 15.7598 --7.55134 15.5989 --7.91219 15.4308 --8.26942 15.2558 --8.62287 15.0737 --8.97236 14.8847 --9.31772 14.6889 --9.65879 14.4863 --9.9954 14.277 --10.3274 14.0611 --10.6546 13.8386 --10.9768 13.6098 --11.2939 13.3745 --11.6057 13.1331 --11.9121 12.8854 --12.2129 12.6318 --12.508 12.3722 --12.7972 12.1067 --13.0803 11.8356 --13.3573 11.5588 --13.6279 11.2766 --13.8921 10.9891 --14.1497 10.6963 --14.4005 10.3984 --14.6445 10.0956 --14.8815 9.78794 --15.1114 9.47562 --15.334 9.15876 --15.5493 8.83752 --15.7572 8.51203 --15.9575 8.18246 --16.1501 7.84895 --16.335 7.51167 --16.5119 7.17077 --16.681 6.82641 --16.8419 6.47875 --16.9948 6.12798 --17.1394 5.77424 --17.2757 5.41771 --17.4037 5.05856 --17.5233 4.69696 --17.6343 4.33309 --17.7369 3.96712 --17.8308 3.59923 --17.9161 3.2296 --17.9926 2.85841 --18.0605 2.48582 --18.1196 2.11204 --18.1699 1.73723 --18.2114 1.36158 --18.2441 0.985264 --18.2679 0.608474 --18.2829 0.231388 --18.289 -0.14581 --18.2863 -0.522939 --18.2747 -0.899814 --18.2543 -1.27625 --18.225 -1.65208 --18.187 -2.0271 --18.1402 -2.40115 --18.0846 -2.77404 --18.0204 -3.14559 --17.9474 -3.51563 --17.8659 -3.88397 --17.7757 -4.25045 --17.6771 -4.61489 --17.5699 -4.97711 --17.4544 -5.33696 --17.3305 -5.69425 --17.1984 -6.04883 --17.0581 -6.40052 --16.9096 -6.74916 --16.7531 -7.0946 --16.5887 -7.43668 --16.4164 -7.77523 --16.2364 -8.11011 --16.0487 -8.44117 --15.8535 -8.76825 --15.6508 -9.09121 --15.4407 -9.4099 --15.2235 -9.7242 --14.9991 -10.034 --14.7677 -10.339 --14.5295 -10.6393 --14.2846 -10.9346 --14.033 -11.2249 --13.7749 -11.51 --13.5105 -11.7898 --13.2399 -12.0641 --12.9632 -12.333 --12.6806 -12.5961 --12.3922 -12.8536 --12.0981 -13.1052 --11.7986 -13.3508 --11.4937 -13.5904 --11.1836 -13.8238 --10.8685 -14.051 --10.5485 -14.2719 --10.2238 -14.4864 --9.89445 -14.6944 --9.56073 -14.8959 --9.22276 -15.0907 --8.8807 -15.2789 --8.53471 -15.4603 --8.18495 -15.6348 --7.8316 -15.8025 --7.47481 -15.9633 --7.11475 -16.1171 --6.75159 -16.2639 --6.3855 -16.4036 --6.01664 -16.5362 --5.64518 -16.6617 --5.27128 -16.78 --4.89512 -16.891 --4.51687 -16.9949 --4.13668 -17.0915 --3.75473 -17.1808 --3.37119 -17.2628 --2.98622 -17.3375 --2.59999 -17.4049 --2.21266 -17.4649 --1.82441 -17.5176 --1.43539 -17.563 --1.04577 -17.6011 --0.655717 -17.6319 --0.265389 -17.6553 -0.125051 -17.6714 -0.51544 -17.6803 -0.905618 -17.6818 -1.29543 -17.6761 -1.68471 -17.6632 -2.0733 -17.6431 -2.46106 -17.6158 -2.84781 -17.5814 -3.23342 -17.5399 -3.61772 -17.4913 -4.00057 -17.4356 -4.38182 -17.373 -4.76131 -17.3034 -5.13891 -17.2269 -5.51446 -17.1436 -5.88782 -17.0534 -6.25885 -16.9565 -6.62741 -16.8529 -6.99336 -16.7427 -7.35656 -16.6259 -7.71687 -16.5026 -8.07417 -16.3728 -8.42831 -16.2367 -8.77918 -16.0942 -9.12663 -15.9455 -9.47055 -15.7906 -9.81081 -15.6296 -10.1473 -15.4625 -10.4799 -15.2895 -10.8084 -15.1107 -11.1328 -14.9261 -11.453 -14.7357 -11.7687 -14.5398 -12.08 -14.3383 -12.3868 -14.1313 -12.6888 -13.919 -12.986 -13.7015 -13.2783 -13.4787 -13.5655 -13.2509 -13.8477 -13.0181 -14.1247 -12.7804 -14.3964 -12.5379 -14.6626 -12.2907 -14.9234 -12.0389 -15.1786 -11.7826 -15.4281 -11.5219 -15.6719 -11.2569 -15.9099 -10.9877 -16.1419 -10.7145 -16.368 -10.4373 -16.588 -10.1562 -16.8018 -9.87133 -17.0095 -9.58283 -17.2108 -9.29079 -17.4059 -8.99532 -17.5945 -8.69654 -17.7766 -8.39456 -17.9522 -8.08949 -18.1212 -7.78144 -18.2835 -7.47054 -18.4392 -7.1569 -18.588 -6.84063 -18.7301 -6.52186 -18.8653 -6.2007 -18.9937 -5.87727 -19.115 -5.55169 -19.2294 -5.22409 -19.3368 -4.89457 -19.4371 -4.56327 -19.5303 -4.23031 -19.6164 -3.89579 -19.6953 -3.55986 -19.7671 -3.22263 -19.8316 -2.88423 -19.8889 -2.54477 -19.9389 -2.20438 -19.9817 -1.86319 -20.0171 -1.52131 -20.0453 -1.17889 -20.0662 -0.836027 -20.0797 -0.492862 -20.0859 -0.149517 -20.0847 0.193882 -20.0763 0.53721 -20.0604 0.880342 -20.0373 1.22315 -20.0068 1.56551 -19.969 1.9073 -19.9238 2.24838 -19.8714 2.58864 -19.8117 2.92795 -19.7446 3.26618 -19.6704 3.60321 -19.5889 3.93892 -19.5001 4.27317 -19.4042 4.60584 -19.3011 4.93681 -19.1909 5.26596 -19.0736 5.59316 -18.9492 5.91828 -18.8177 6.24121 -18.6793 6.56182 -18.534 6.87999 -18.3817 7.19559 -18.2226 7.50851 -18.0567 7.81863 -17.884 8.12582 -17.7046 8.42996 -17.5185 8.73094 -17.3259 9.02864 -17.1268 9.32293 -16.9212 9.61371 -16.7092 9.90086 -16.4908 10.1843 -16.2662 10.4638 -16.0355 10.7393 -15.7986 11.0108 -15.5557 11.278 -15.3068 11.541 -15.0521 11.7995 -14.7916 12.0535 -14.5253 12.3028 -14.2535 12.5474 -13.9762 12.7872 -13.6935 13.0219 -13.4054 13.2517 -13.1121 13.4762 -12.8137 13.6955 -12.5103 13.9095 -12.202 14.118 -11.8888 14.3209 -11.571 14.5182 -11.2486 14.7097 -10.9218 14.8955 -10.5906 15.0753 -10.2552 15.2491 -9.91572 15.4168 -9.57226 15.5784 -9.22496 15.7337 -8.87394 15.8827 -8.51934 16.0252 -8.16129 16.1613 -7.79993 16.2908 -7.4354 16.4137 -7.06783 16.5298 -6.69736 16.6392 -6.32415 16.7418 -5.94833 16.8375 -5.57006 16.9262 -5.18948 17.008 -4.80674 17.0826 -4.422 17.1502 -4.03541 17.2106 -3.64712 17.2637 -3.25731 17.3097 -2.86612 17.3483 -2.47372 17.3796 -2.08027 17.4035 -1.68593 17.4201 -1.29087 17.4292 -0.895262 17.4308 -0.499267 17.425 -0.103056 17.4117 --0.2932 17.3909 --0.689329 17.3625 --1.08516 17.3267 --1.48052 17.2833 --1.87523 17.2323 --2.26912 17.1738 --2.66201 17.1078 --3.05374 17.0342 --3.44411 16.9531 --3.83296 16.8645 --4.22011 16.7685 --4.60538 16.6649 --4.9886 16.5539 --5.36958 16.4355 --5.74816 16.3097 --6.12415 16.1766 --6.49738 16.0362 --6.86767 15.8885 --7.23485 15.7337 --7.59874 15.5716 --7.95917 15.4025 --8.31596 15.2263 --8.66894 15.0432 --9.01794 14.8532 --9.36278 14.6563 --9.70331 14.4526 --10.0393 14.2423 --10.3707 14.0253 --10.6973 13.8019 --11.0189 13.572 --11.3353 13.3358 --11.6464 13.0933 --11.9521 12.8448 --12.2521 12.5901 --12.5464 12.3296 --12.8348 12.0632 --13.1171 11.7912 --13.3932 11.5135 --13.6629 11.2304 --13.9261 10.942 --14.1828 10.6484 --14.4326 10.3497 --14.6756 10.046 --14.9116 9.73754 --15.1404 9.42443 --15.3619 9.10679 --15.5761 8.78478 --15.7828 8.45855 --15.9819 8.12825 --16.1734 7.79403 --16.357 7.45606 --16.5327 7.11448 --16.7004 6.76947 --16.8601 6.42118 --17.0116 6.06978 --17.1549 5.71545 --17.2899 5.35834 --17.4165 4.99864 --17.5346 4.63651 --17.6442 4.27212 --17.7453 3.90566 --17.8377 3.5373 --17.9215 3.16722 --17.9966 2.7956 --18.0629 2.42262 --18.1205 2.04845 --18.1693 1.67329 --18.2092 1.29731 --18.2403 0.920699 --18.2626 0.543637 --18.276 0.166309 --18.2805 -0.211103 --18.2762 -0.588414 --18.263 -0.965442 --18.2409 -1.342 --18.2101 -1.71792 --18.1704 -2.093 --18.122 -2.46707 --18.0648 -2.83995 --17.9989 -3.21147 --17.9243 -3.58143 --17.8411 -3.94967 --17.7494 -4.31602 --17.6491 -4.68029 --17.5403 -5.04231 --17.4231 -5.40192 --17.2976 -5.75895 --17.1638 -6.11322 --17.0219 -6.46458 --16.8718 -6.81286 --16.7137 -7.15791 --16.5477 -7.49955 --16.3738 -7.83764 --16.1922 -8.17203 --16.003 -8.50256 --15.8062 -8.82908 --15.602 -9.15145 --15.3904 -9.46952 --15.1716 -9.78316 --14.9458 -10.0922 --14.713 -10.3966 --14.4733 -10.6961 --14.2269 -10.9907 --13.9739 -11.2801 --13.7145 -11.5644 --13.4487 -11.8433 --13.1767 -12.1167 --12.8987 -12.3846 --12.6148 -12.6469 --12.3251 -12.9033 --12.0298 -13.1539 --11.7291 -13.3984 --11.423 -13.6369 --11.1118 -13.8693 --10.7955 -14.0954 --10.4744 -14.3151 --10.1486 -14.5284 --9.81823 -14.7353 --9.48349 -14.9355 --9.14454 -15.1291 --8.80153 -15.316 --8.45463 -15.4961 --8.104 -15.6694 --7.74981 -15.8358 --7.39221 -15.9953 --7.03139 -16.1478 --6.6675 -16.2932 --6.30071 -16.4315 --5.93119 -16.5628 --5.55911 -16.6868 --5.18463 -16.8037 --4.80792 -16.9134 --4.42916 -17.0158 --4.04851 -17.1109 --3.66613 -17.1988 --3.28219 -17.2793 --2.89686 -17.3525 --2.51031 -17.4184 --2.1227 -17.477 --1.7342 -17.5283 --1.34498 -17.5722 --0.955191 -17.6087 --0.565004 -17.638 --0.174583 -17.6599 -0.215913 -17.6745 -0.60632 -17.6819 -0.99648 -17.682 -1.38623 -17.6748 -1.77542 -17.6604 -2.16388 -17.6388 -2.55147 -17.61 -2.93802 -17.5741 -3.32339 -17.5311 -3.70741 -17.481 -4.08995 -17.4239 -4.47084 -17.3598 -4.84995 -17.2888 -5.22713 -17.2109 -5.60222 -17.1261 -5.97509 -17.0345 -6.3456 -16.9362 -6.7136 -16.8312 -7.07896 -16.7196 -7.44154 -16.6014 -7.80121 -16.4768 -8.15783 -16.3456 -8.51127 -16.2081 -8.8614 -16.0643 -9.20809 -15.9143 -9.55122 -15.7581 -9.89067 -15.5958 -10.2263 -15.4275 -10.558 -15.2533 -10.8857 -15.0733 -11.2092 -14.8874 -11.5284 -14.6959 -11.8432 -14.4988 -12.1535 -14.2962 -12.4592 -14.0881 -12.7602 -13.8747 -13.0563 -13.6561 -13.3476 -13.4323 -13.6338 -13.2034 -13.9148 -12.9696 -14.1907 -12.7309 -14.4612 -12.4874 -14.7263 -12.2393 -14.9859 -11.9866 -15.2399 -11.7294 -15.4883 -11.4678 -15.7309 -11.202 -15.9676 -10.932 -16.1984 -10.658 -16.4232 -10.38 -16.6419 -10.0982 -16.8545 -9.81265 -17.0609 -9.52347 -17.261 -9.23079 -17.4547 -8.93471 -17.642 -8.63534 -17.8228 -8.33279 -17.997 -8.02719 -18.1647 -7.71865 -18.3257 -7.40728 -18.48 -7.09319 -18.6275 -6.77651 -18.7682 -6.45736 -18.9021 -6.13584 -19.029 -5.81209 -19.149 -5.48621 -19.262 -5.15834 -19.3679 -4.82858 -19.4668 -4.49706 -19.5586 -4.1639 -19.6432 -3.82922 -19.7207 -3.49315 -19.791 -3.1558 -19.8541 -2.8173 -19.9099 -2.47778 -19.9585 -2.13735 -19.9998 -1.79614 -20.0339 -1.45427 -20.0606 -1.11187 -20.08 -0.769069 -20.0921 -0.425984 -20.0968 -0.0827423 -20.0942 0.26053 -20.0843 0.603708 -20.067 0.946665 -20.0424 1.28928 -20.0105 1.63142 -19.9713 1.97296 -19.9247 2.31379 -19.8708 2.65376 -19.8097 2.99277 -19.7413 3.33067 -19.6656 3.66735 -19.5827 4.00269 -19.4926 4.33655 -19.3953 4.66881 -19.2908 4.99935 -19.1793 5.32805 -19.0606 5.65478 -18.9349 5.97941 -18.8021 6.30183 -18.6624 6.62191 -18.5158 6.93953 -18.3622 7.25457 -18.2018 7.56691 -18.0347 7.87642 -17.8607 8.18298 -17.6801 8.48649 -17.4929 8.78681 -17.2991 9.08382 -17.0988 9.37742 -16.892 9.66748 -16.6789 9.95389 -16.4594 10.2365 -16.2337 10.5153 -16.0019 10.7901 -15.7639 11.0607 -15.5199 11.3271 -15.27 11.5892 -15.0143 11.8469 -14.7528 12.1 -14.4856 12.3485 -14.2128 12.5921 -13.9345 12.831 -13.6508 13.0648 -13.3619 13.2936 -13.0677 13.5172 -12.7684 13.7355 -12.4642 13.9485 -12.155 14.156 -11.8411 14.3579 -11.5225 14.5542 -11.1994 14.7447 -10.8718 14.9294 -10.5399 15.1081 -10.2038 15.2809 -9.86365 15.4475 -9.51955 15.608 -9.17162 15.7621 -8.82001 15.91 -8.46483 16.0514 -8.10623 16.1863 -7.74434 16.3147 -7.3793 16.4364 -7.01125 16.5514 -6.64032 16.6596 -6.26667 16.761 -5.89044 16.8554 -5.51178 16.943 -5.13084 17.0235 -4.74776 17.0969 -4.36271 17.1632 -3.97584 17.2224 -3.5873 17.2743 -3.19725 17.3189 -2.80585 17.3563 -2.41327 17.3863 -2.01967 17.409 -1.62521 17.4243 -1.23005 17.4321 -0.834375 17.4325 -0.438339 17.4254 -0.0421154 17.4108 --0.354125 17.3887 --0.75021 17.359 --1.14597 17.3218 --1.54123 17.2771 --1.93581 17.2249 --2.32955 17.165 --2.72226 17.0977 --3.11378 17.0228 --3.50392 16.9404 --3.89251 16.8505 --4.27937 16.7531 --4.66432 16.6483 --5.0472 16.536 --5.42781 16.4163 --5.80599 16.2892 --6.18155 16.1548 --6.55432 16.0131 --6.92413 15.8641 --7.29079 15.708 --7.65414 15.5447 --8.01399 15.3743 --8.37018 15.1969 --8.72252 15.0125 --9.07086 14.8212 --9.41502 14.6231 --9.75482 14.4182 --10.0901 14.2067 --10.4207 13.9885 --10.7465 13.7639 --11.0672 13.5328 --11.3828 13.2954 --11.693 13.0518 --11.9978 12.8021 --12.2969 12.5463 --12.5903 12.2847 --12.8776 12.0172 --13.1589 11.7441 --13.434 11.4654 --13.7027 11.1812 --13.9649 10.8918 --14.2204 10.5972 --14.4692 10.2975 --14.711 9.99286 --14.9458 9.68347 --15.1735 9.36945 --15.3939 9.05094 --15.6068 8.72808 --15.8123 8.40103 --16.0102 8.06994 --16.2004 7.73496 --16.3827 7.39625 --16.5571 7.05398 --16.7235 6.7083 --16.8819 6.35937 --17.032 6.00737 --17.1739 5.65246 --17.3075 5.29481 --17.4326 4.9346 --17.5494 4.57199 --17.6575 4.20716 --17.7571 3.84029 --17.8481 3.47155 --17.9304 3.10112 --18.004 2.72919 --18.0688 2.35594 --18.1248 1.98154 --18.1721 1.60617 --18.2105 1.23003 --18.24 0.85329 --18.2607 0.476137 --18.2725 0.0987529 --18.2754 -0.278678 --18.2695 -0.655974 --18.2547 -1.03295 --18.2311 -1.40943 --18.1986 -1.78522 --18.1573 -2.16015 --18.1072 -2.53404 --18.0484 -2.9067 --17.9808 -3.27796 --17.9046 -3.64764 --17.8198 -4.01556 --17.7264 -4.38156 --17.6244 -4.74545 --17.514 -5.10706 --17.3952 -5.46623 --17.2681 -5.82278 --17.1327 -6.17655 --16.9891 -6.52737 --16.8374 -6.87509 --16.6778 -7.21954 --16.5102 -7.56056 --16.3347 -7.898 --16.1516 -8.2317 --15.9608 -8.56152 --15.7625 -8.8873 --15.5567 -9.2089 --15.3437 -9.52618 --15.1235 -9.83899 --14.8962 -10.1472 --14.6619 -10.4507 --14.4208 -10.7493 --14.1731 -11.0429 --13.9187 -11.3314 --13.6579 -11.6146 --13.3909 -11.8925 --13.1176 -12.1649 --12.8383 -12.4318 --12.5532 -12.6929 --12.2623 -12.9482 --11.9658 -13.1977 --11.6638 -13.4411 --11.3566 -13.6784 --11.0443 -13.9095 --10.7269 -14.1344 --10.4047 -14.3529 --10.0779 -14.565 --9.74656 -14.7706 --9.41087 -14.9695 --9.07099 -15.1618 --8.72709 -15.3474 --8.37932 -15.5262 --8.02787 -15.6982 --7.67288 -15.8632 --7.31453 -16.0213 --6.95298 -16.1724 --6.5884 -16.3164 --6.22095 -16.4534 --5.85081 -16.5832 --5.47815 -16.7058 --5.10312 -16.8212 --4.7259 -16.9294 --4.34665 -17.0304 --3.96555 -17.1241 --3.58276 -17.2104 --3.19844 -17.2895 --2.81278 -17.3613 --2.42592 -17.4257 --2.03804 -17.4828 --1.64931 -17.5325 --1.25989 -17.5749 --0.869939 -17.61 --0.479627 -17.6378 --0.0891163 -17.6582 -0.301432 -17.6714 -0.691857 -17.6772 -1.082 -17.6758 -1.47169 -17.6671 -1.86079 -17.6513 -2.24913 -17.6282 -2.63655 -17.598 -3.0229 -17.5606 -3.40803 -17.5161 -3.79179 -17.4646 -4.17402 -17.4061 -4.55458 -17.3405 -4.93332 -17.2681 -5.31008 -17.1887 -5.68474 -17.1026 -6.05714 -17.0096 -6.42715 -16.9099 -6.79462 -16.8036 -7.15942 -16.6906 -7.52141 -16.571 -7.88045 -16.445 -8.23642 -16.3126 -8.58919 -16.1738 -8.93861 -16.0287 -9.28457 -15.8774 -9.62694 -15.7199 -9.9656 -15.5564 -10.3004 -15.3869 -10.6313 -15.2115 -10.9581 -15.0303 -11.2807 -14.8433 -11.599 -14.6506 -11.9128 -14.4524 -12.2222 -14.2487 -12.5269 -14.0395 -12.8268 -13.8251 -13.122 -13.6054 -13.4121 -13.3806 -13.6972 -13.1507 -13.9772 -12.9159 -14.2519 -12.6763 -14.5213 -12.4319 -14.7853 -12.1828 -15.0437 -11.9292 -15.2965 -11.6712 -15.5437 -11.4088 -15.785 -11.1422 -16.0205 -10.8714 -16.2501 -10.5966 -16.4736 -10.3179 -16.6911 -10.0354 -16.9024 -9.74915 -17.1075 -9.45933 -17.3063 -9.16602 -17.4987 -8.86934 -17.6847 -8.5694 -17.8641 -8.26631 -18.0371 -7.9602 -18.2034 -7.65116 -18.3631 -7.33933 -18.516 -7.02482 -18.6622 -6.70773 -18.8015 -6.3882 -18.934 -6.06633 -19.0596 -5.74225 -19.1782 -5.41608 -19.2898 -5.08793 -19.3944 -4.75793 -19.492 -4.4262 -19.5824 -4.09285 -19.6657 -3.75802 -19.7418 -3.42182 -19.8108 -3.08437 -19.8726 -2.7458 -19.9271 -2.40624 -19.9744 -2.0658 -20.0144 -1.72461 -20.0471 -1.38279 -20.0726 -1.04048 -20.0907 -0.697784 -20.1015 -0.354839 -20.105 -0.0117672 -20.1011 0.331306 -20.09 0.674257 -20.0715 1.01696 -20.0457 1.35929 -20.0125 1.70112 -19.9721 2.04232 -19.9243 2.38278 -19.8693 2.72237 -19.807 3.06095 -19.7374 3.39841 -19.6606 3.73463 -19.5765 4.06947 -19.4853 4.40281 -19.3869 4.73454 -19.2813 5.06452 -19.1687 5.39263 -19.0489 5.71876 -18.9222 6.04277 -18.7884 6.36454 -18.6477 6.68396 -18.5 7.0009 -18.3455 7.31524 -18.1841 7.62685 -18.016 7.93563 -17.8411 8.24144 -17.6596 8.54418 -17.4714 8.84371 -17.2767 9.13993 -17.0756 9.43271 -16.8679 9.72195 -16.654 10.0075 -16.4337 10.2893 -16.2072 10.5672 -15.9746 10.8411 -15.7359 11.1108 -15.4912 11.3764 -15.2406 11.6376 -14.9841 11.8943 -14.7219 12.1465 -14.4541 12.394 -14.1807 12.6368 -13.9018 12.8747 -13.6176 13.1076 -13.3281 13.3354 -13.0334 13.5581 -12.7336 13.7755 -12.4289 13.9875 -12.1193 14.194 -11.8049 14.395 -11.486 14.5902 -11.1624 14.7798 -10.8345 14.9635 -10.5023 15.1413 -10.1659 15.313 -9.82543 15.4787 -9.48106 15.6381 -9.13289 15.7913 -8.78105 15.9382 -8.42567 16.0786 -8.06688 16.2125 -7.70483 16.3399 -7.33965 16.4606 -6.97148 16.5746 -6.60046 16.6819 -6.22673 16.7823 -5.85045 16.8758 -5.47175 16.9624 -5.09079 17.0419 -4.70772 17.1144 -4.3227 17.1797 -3.93587 17.2379 -3.54739 17.2889 -3.15743 17.3327 -2.76614 17.3691 -2.37368 17.3982 -1.98022 17.42 -1.58592 17.4343 -1.19094 17.4413 -0.795462 17.4407 -0.39964 17.4327 -0.00364702 17.4172 --0.392347 17.3942 --0.788172 17.3637 --1.18365 17.3257 --1.57862 17.2801 --1.97291 17.227 --2.36633 17.1663 --2.75871 17.0981 --3.14988 17.0224 --3.53966 16.9392 --3.92788 16.8484 --4.31435 16.7502 --4.69891 16.6446 --5.08137 16.5315 --5.46156 16.411 --5.83929 16.2832 --6.2144 16.148 --6.5867 16.0055 --6.95603 15.8558 --7.32219 15.699 --7.68503 15.5349 --8.04436 15.3638 --8.40001 15.1857 --8.75181 15.0006 --9.09959 14.8086 --9.44318 14.6097 --9.78241 14.4042 --10.1171 14.1919 --10.4471 13.9731 --10.7723 13.7478 --11.0924 13.516 --11.4073 13.278 --11.7169 13.0337 --12.021 12.7833 --12.3195 12.5269 --12.6121 12.2646 --12.8988 11.9965 --13.1794 11.7228 --13.4538 11.4435 --13.7218 11.1587 --13.9832 10.8687 --14.238 10.5734 --14.486 10.2731 --14.7271 9.96796 --14.9611 9.658 --15.188 9.34342 --15.4076 9.02435 --15.6198 8.70094 --15.8244 8.37335 --16.0215 8.04173 --16.2108 7.70622 --16.3922 7.36699 --16.5658 7.0242 --16.7313 6.67801 --16.8887 6.32858 --17.038 5.97609 --17.179 5.62069 --17.3116 5.26256 --17.4359 4.90188 --17.5516 4.53881 --17.6589 4.17353 --17.7575 3.80622 --17.8475 3.43706 --17.9288 3.06622 --18.0015 2.69389 --18.0653 2.32025 --18.1204 1.94548 --18.1666 1.56977 --18.204 1.19329 --18.2325 0.816227 --18.2522 0.43877 --18.263 0.0611005 --18.2649 -0.316598 --18.258 -0.694142 --18.2421 -1.07135 --18.2175 -1.44803 --18.1839 -1.82401 --18.1416 -2.19911 --18.0905 -2.57314 --18.0306 -2.94592 --17.962 -3.31728 --17.8847 -3.68704 --17.7988 -4.05501 --17.7044 -4.42103 --17.6013 -4.78492 --17.4899 -5.14651 --17.37 -5.50562 --17.2418 -5.8621 --17.1053 -6.21576 --16.9607 -6.56646 --16.8079 -6.91401 --16.6472 -7.25827 --16.4785 -7.59908 --16.302 -7.93627 --16.1178 -8.26969 --15.9259 -8.5992 --15.7265 -8.92465 --15.5197 -9.24589 --15.3056 -9.56277 --15.0843 -9.87516 --14.8559 -10.1829 --14.6205 -10.4859 --14.3784 -10.784 --14.1295 -11.0771 --13.8741 -11.365 --13.6122 -11.6477 --13.344 -11.9249 --13.0697 -12.1967 --12.7894 -12.4629 --12.5031 -12.7233 --12.2112 -12.9779 --11.9137 -13.2266 --11.6107 -13.4693 --11.3025 -13.7058 --10.9891 -13.9362 --10.6708 -14.1602 --10.3476 -14.3779 --10.0198 -14.5891 --9.68753 -14.7938 --9.35091 -14.9919 --9.01012 -15.1832 --8.66533 -15.3679 --8.3167 -15.5457 --7.96439 -15.7167 --7.60857 -15.8807 --7.24941 -16.0378 --6.88707 -16.1878 --6.52172 -16.3308 --6.15353 -16.4666 --5.78266 -16.5953 --5.4093 -16.7169 --5.03359 -16.8312 --4.65572 -16.9382 --4.27585 -17.038 --3.89415 -17.1305 --3.51079 -17.2157 --3.12593 -17.2936 --2.73975 -17.3642 --2.35241 -17.4274 --1.96407 -17.4832 --1.57491 -17.5318 --1.18509 -17.5729 --0.794771 -17.6068 --0.404122 -17.6333 --0.0133061 -17.6525 -0.377515 -17.6643 -0.768181 -17.6689 -1.15853 -17.6662 -1.5484 -17.6563 -1.93764 -17.6391 -2.32608 -17.6148 -2.71358 -17.5832 -3.09998 -17.5446 -3.48512 -17.4988 -3.86885 -17.446 -4.25102 -17.3862 -4.63149 -17.3193 -5.0101 -17.2456 -5.38672 -17.1649 -5.76119 -17.0775 -6.13338 -16.9832 -6.50313 -16.8823 -6.87033 -16.7746 -7.23481 -16.6604 -7.59645 -16.5396 -7.95512 -16.4123 -8.31068 -16.2786 -8.663 -16.1386 -9.01195 -15.9923 -9.3574 -15.8398 -9.69923 -15.6811 -10.0373 -15.5164 -10.3715 -15.3458 -10.7018 -15.1692 -11.0279 -14.9868 -11.3498 -14.7987 -11.6673 -14.6049 -11.9805 -14.4055 -12.289 -14.2007 -12.5929 -13.9905 -12.892 -13.7749 -13.1863 -13.5542 -13.4755 -13.3283 -13.7597 -13.0975 -14.0388 -12.8617 -14.3125 -12.621 -14.5809 -12.3757 -14.8438 -12.1257 -15.1012 -11.8712 -15.353 -11.6122 -15.599 -11.349 -15.8393 -11.0815 -16.0736 -10.8099 -16.302 -10.5343 -16.5244 -10.2548 -16.7407 -9.97149 -16.9508 -9.68451 -17.1546 -9.39396 -17.3521 -9.09996 -17.5433 -8.8026 -17.728 -8.50201 -17.9061 -8.1983 -18.0778 -7.89158 -18.2427 -7.58196 -18.401 -7.26958 -18.5526 -6.95453 -18.6974 -6.63693 -18.8353 -6.31692 -18.9664 -5.99459 -19.0906 -5.67007 -19.2078 -5.34349 -19.318 -5.01496 -19.4211 -4.6846 -19.5172 -4.35253 -19.6062 -4.01888 -19.688 -3.68376 -19.7627 -3.34731 -19.8302 -3.00963 -19.8905 -2.67086 -19.9435 -2.33112 -19.9893 -1.99054 -20.0278 -1.64923 -20.0591 -1.30731 -20.083 -0.964929 -20.0997 -0.622193 -20.109 -0.27923 -20.111 0.0638337 -20.1057 0.406874 -20.093 0.749766 -20.073 1.09238 -20.0457 1.4346 -20.0111 1.7763 -19.9692 2.11735 -19.92 2.45762 -19.8635 2.797 -19.7997 3.13535 -19.7287 3.47256 -19.6505 3.80849 -19.5651 4.14302 -19.4724 4.47604 -19.3726 4.80741 -19.2657 5.13701 -19.1517 5.46471 -19.0306 5.79041 -18.9026 6.11396 -18.7675 6.43525 -18.6254 6.75416 -18.4765 7.07056 -18.3207 7.38434 -18.1581 7.69537 -17.9888 8.00354 -17.8127 8.30871 -17.63 8.61078 -17.4407 8.90963 -17.2449 9.20514 -17.0425 9.49718 -16.8338 9.78566 -16.6187 10.0704 -16.3974 10.3514 -16.1698 10.6285 -15.9361 10.9015 -15.6964 11.1704 -15.4507 11.4351 -15.1991 11.6954 -14.9417 11.9512 -14.6786 12.2024 -14.4098 12.449 -14.1355 12.6908 -13.8558 12.9276 -13.5707 13.1595 -13.2804 13.3863 -12.9848 13.6079 -12.6843 13.8242 -12.3788 14.0351 -12.0684 14.2406 -11.7534 14.4404 -11.4337 14.6346 -11.1095 14.823 -10.7809 15.0055 -10.448 15.1821 -10.111 15.3527 -9.76996 15.5171 -9.42502 15.6754 -9.07631 15.8274 -8.72396 15.9731 -8.36809 16.1123 -8.00885 16.245 -7.64637 16.3711 -7.28078 16.4906 -6.91223 16.6034 -6.54086 16.7094 -6.16681 16.8086 -5.79023 16.9009 -5.41126 16.9862 -5.03006 17.0645 -4.64678 17.1357 -4.26157 17.1999 -3.87459 17.2568 -3.48599 17.3066 -3.09593 17.3491 -2.70457 17.3843 -2.31208 17.4121 -1.9186 17.4326 -1.52432 17.4457 -1.12938 17.4514 -0.733969 17.4497 -0.338241 17.4404 --0.0576318 17.4237 --0.45348 17.3995 --0.849133 17.3678 --1.24442 17.3285 --1.63916 17.2817 --2.03319 17.2274 --2.42633 17.1656 --2.81841 17.0962 --3.20925 17.0193 --3.59867 16.935 --3.9865 16.8431 --4.37257 16.7438 --4.75668 16.637 --5.13868 16.5228 --5.51837 16.4012 --5.89559 16.2723 --6.27016 16.1361 --6.64189 15.9926 --7.01062 15.8418 --7.37618 15.6839 --7.73838 15.5188 --8.09705 15.3467 --8.45202 15.1676 --8.80311 14.9815 --9.15016 14.7885 --9.493 14.5888 --9.83146 14.3823 --10.1654 14.1691 --10.4946 13.9494 --10.8189 13.7232 --11.1382 13.4906 --11.4522 13.2517 --11.761 13.0066 --12.0642 12.7554 --12.3617 12.4982 --12.6534 12.2351 --12.9392 11.9663 --13.2188 11.6918 --13.4922 11.4118 --13.7592 11.1263 --14.0196 10.8356 --14.2734 10.5397 --14.5203 10.2388 --14.7603 9.93301 --14.9933 9.62247 --15.2191 9.30731 --15.4375 8.98769 --15.6486 8.66375 --15.8521 8.33565 --16.048 8.00353 --16.2361 7.66755 --16.4164 7.32786 --16.5888 6.98464 --16.7531 6.63803 --16.9094 6.28821 --17.0574 5.93534 --17.1972 5.57959 --17.3286 5.22114 --17.4516 4.86015 --17.5662 4.4968 --17.6722 4.13126 --17.7696 3.76371 --17.8584 3.39434 --17.9385 3.02331 --18.0098 2.65081 --18.0724 2.27703 --18.1262 1.90213 --18.1712 1.52631 --18.2073 1.14975 --18.2346 0.772632 --18.253 0.395136 --18.2625 0.017449 --18.2631 -0.360246 --18.2549 -0.737766 --18.2378 -1.11493 --18.2118 -1.49155 --18.177 -1.86744 --18.1334 -2.24244 --18.081 -2.61634 --18.0199 -2.98898 --17.95 -3.36018 --17.8714 -3.72975 --17.7843 -4.09752 --17.6885 -4.46331 --17.5843 -4.82696 --17.4716 -5.18829 --17.3505 -5.54713 --17.221 -5.9033 --17.0834 -6.25665 --16.9375 -6.607 --16.7836 -6.9542 --16.6217 -7.29808 --16.4518 -7.63849 --16.2742 -7.97527 --16.0888 -8.30826 --15.8958 -8.63731 --15.6953 -8.96228 --15.4874 -9.28302 --15.2722 -9.59939 --15.0498 -9.91124 --14.8204 -10.2184 --14.584 -10.5209 --14.3408 -10.8184 --14.0909 -11.1108 --13.8345 -11.3981 --13.5717 -11.6802 --13.3026 -11.9568 --13.0274 -12.2279 --12.7461 -12.4933 --12.4591 -12.7531 --12.1663 -13.0069 --11.8679 -13.2549 --11.5641 -13.4968 --11.2551 -13.7325 --10.941 -13.9621 --10.622 -14.1853 --10.2981 -14.4021 --9.96963 -14.6125 --9.63668 -14.8162 --9.29943 -15.0134 --8.95802 -15.2038 --8.61263 -15.3875 --8.26342 -15.5644 --7.91056 -15.7344 --7.5542 -15.8974 --7.19452 -16.0534 --6.83169 -16.2024 --6.46586 -16.3443 --6.09722 -16.4791 --5.72592 -16.6068 --5.35214 -16.7272 --4.97605 -16.8404 --4.5978 -16.9463 --4.21758 -17.045 --3.83555 -17.1364 --3.45188 -17.2204 --3.06674 -17.2971 --2.68029 -17.3665 --2.29271 -17.4285 --1.90416 -17.4832 --1.5148 -17.5306 --1.12481 -17.5705 --0.734347 -17.6032 --0.343575 -17.6285 -0.0473399 -17.6465 -0.438236 -17.6571 -0.828953 -17.6605 -1.21933 -17.6566 -1.6092 -17.6454 -1.99842 -17.6271 -2.38682 -17.6015 -2.77425 -17.5687 -3.16055 -17.5288 -3.54558 -17.4818 -3.92918 -17.4278 -4.31119 -17.3667 -4.69148 -17.2987 -5.06989 -17.2237 -5.44627 -17.1419 -5.82049 -17.0532 -6.1924 -16.9577 -6.56186 -16.8556 -6.92872 -16.7468 -7.29286 -16.6313 -7.65413 -16.5094 -8.0124 -16.3809 -8.36753 -16.2461 -8.7194 -16.1049 -9.06788 -15.9575 -9.41283 -15.8038 -9.75414 -15.6441 -10.0917 -15.4783 -10.4253 -15.3065 -10.755 -15.1288 -11.0805 -14.9453 -11.4017 -14.7561 -11.7186 -14.5613 -12.0311 -14.3609 -12.3389 -14.155 -12.6421 -13.9438 -12.9405 -13.7273 -13.2339 -13.5055 -13.5224 -13.2787 -13.8058 -13.0469 -14.084 -12.8101 -14.3569 -12.5686 -14.6244 -12.3223 -14.8865 -12.0714 -15.1429 -11.8161 -15.3938 -11.5563 -15.6389 -11.2922 -15.8782 -11.0239 -16.1115 -10.7515 -16.339 -10.4751 -16.5603 -10.1948 -16.7755 -9.91079 -16.9846 -9.6231 -17.1873 -9.33186 -17.3838 -9.03718 -17.5738 -8.73917 -17.7574 -8.43795 -17.9344 -8.13363 -18.1049 -7.82633 -18.2687 -7.51615 -18.4258 -7.20322 -18.5762 -6.88765 -18.7198 -6.56956 -18.8565 -6.24906 -18.9864 -5.92629 -19.1093 -5.60135 -19.2253 -5.27437 -19.3342 -4.94546 -19.4361 -4.61476 -19.531 -4.28237 -19.6187 -3.94842 -19.6992 -3.61304 -19.7726 -3.27634 -19.8388 -2.93845 -19.8978 -2.59949 -19.9496 -2.25959 -19.994 -1.91887 -20.0313 -1.57744 -20.0612 -1.23545 -20.0838 -0.893001 -20.0991 -0.55023 -20.1071 -0.20726 -20.1078 0.135786 -20.1011 0.478782 -20.0872 0.821604 -20.0659 1.16413 -20.0373 1.50623 -20.0013 1.84778 -19.9581 2.18865 -19.9076 2.52873 -19.8498 2.86788 -19.7847 3.20598 -19.7124 3.54291 -19.6329 3.87855 -19.5462 4.21276 -19.4523 4.54542 -19.3512 4.87641 -19.2431 5.20561 -19.1278 5.5329 -19.0055 5.85814 -18.8762 6.18122 -18.7399 6.50202 -18.5967 6.8204 -18.4466 7.13626 -18.2896 7.44947 -18.1259 7.75992 -17.9554 8.06747 -17.7782 8.37202 -17.5944 8.67344 -17.404 8.97161 -17.207 9.26643 -17.0037 9.55778 -16.7939 9.84553 -16.5778 10.1296 -16.3554 10.4098 -16.1269 10.6861 -15.8923 10.9583 -15.6516 11.2264 -15.405 11.4903 -15.1526 11.7497 -14.8943 12.0047 -14.6304 12.255 -14.3608 12.5007 -14.0858 12.7416 -13.8053 12.9775 -13.5195 13.2085 -13.2284 13.4343 -12.9323 13.655 -12.6311 13.8703 -12.325 14.0802 -12.014 14.2846 -11.6984 14.4835 -11.3782 14.6766 -11.0535 14.864 -10.7244 15.0455 -10.3911 15.221 -10.0537 15.3905 -9.71231 15.5539 -9.36702 15.7111 -9.01799 15.862 -8.66534 16.0065 -8.30921 16.1446 -7.94973 16.2762 -7.58703 16.4012 -7.22126 16.5196 -6.85256 16.6312 -6.48105 16.7361 -6.1069 16.8341 -5.73024 16.9253 -5.35123 17.0094 -4.97001 17.0866 -4.58673 17.1566 -4.20155 17.2196 -3.81462 17.2754 -3.42609 17.324 -3.03613 17.3653 -2.6449 17.3993 -2.25255 17.426 -1.85924 17.4454 -1.46514 17.4573 -1.07042 17.4619 -0.675244 17.459 -0.279773 17.4486 --0.115819 17.4308 --0.511364 17.4055 --0.90669 17.3726 --1.30163 17.3323 --1.696 17.2844 --2.08963 17.2291 --2.48236 17.1662 --2.874 17.0958 --3.26437 17.0179 --3.65331 16.9325 --4.04064 16.8396 --4.42618 16.7393 --4.80975 16.6315 --5.19119 16.5164 --5.5703 16.3938 --5.94692 16.264 --6.32087 16.1268 --6.69197 15.9824 --7.06005 15.8307 -& -@target G0.S4 -@type xy -11.4706 -25.7229 -11.7583 -25.6068 -12.0447 -25.4879 -12.3298 -25.3662 -12.6136 -25.2418 -12.896 -25.1146 -13.177 -24.9848 -13.4566 -24.8522 -13.7348 -24.717 -14.0115 -24.5791 -14.2866 -24.4385 -14.5602 -24.2953 -14.8323 -24.1494 -15.1027 -24.001 -15.3715 -23.8499 -15.6386 -23.6963 -15.904 -23.5401 -16.1677 -23.3813 -16.4297 -23.22 -16.6899 -23.0562 -16.9482 -22.8899 -17.2048 -22.7211 -17.4594 -22.5498 -17.7122 -22.3761 -17.9631 -22.2 -18.212 -22.0214 -18.4589 -21.8405 -18.7038 -21.6572 -18.9467 -21.4715 -19.1875 -21.2835 -19.4262 -21.0932 -19.6629 -20.9006 -19.8973 -20.7057 -20.1297 -20.5086 -20.3598 -20.3092 -20.5877 -20.1076 -20.8134 -19.9039 -21.0368 -19.6979 -21.2579 -19.4899 -21.4767 -19.2796 -21.6931 -19.0673 -21.9072 -18.8529 -22.1189 -18.6365 -22.3282 -18.418 -22.535 -18.1975 -22.7394 -17.975 -22.9413 -17.7506 -23.1407 -17.5242 -23.3376 -17.2959 -23.5319 -17.0657 -23.7237 -16.8337 -23.9128 -16.5998 -24.0994 -16.3641 -24.2833 -16.1266 -24.4645 -15.8873 -24.6431 -15.6463 -24.819 -15.4036 -24.9921 -15.1592 -25.1625 -14.9131 -25.3302 -14.6654 -25.4951 -14.4161 -25.6571 -14.1652 -25.8164 -13.9128 -25.9729 -13.6588 -26.1265 -13.4034 -26.2772 -13.1464 -26.425 -12.888 -26.57 -12.6282 -26.712 -12.3671 -26.8511 -12.1045 -26.9872 -11.8406 -27.1204 -11.5755 -27.2506 -11.309 -27.3777 -11.0413 -27.5019 -10.7724 -27.6231 -10.5023 -27.7412 -10.2311 -27.8562 -9.95871 -27.9682 -9.68524 -28.0772 -9.4107 -28.183 -9.13513 -28.2857 -8.85854 -28.3853 -8.58098 -28.4817 -8.30248 -28.5751 -8.02306 -28.6652 -7.74275 -28.7523 -7.46159 -28.8361 -7.17961 -28.9168 -6.89683 -28.9942 -6.6133 -29.0685 -6.32903 -29.1395 -6.04406 -29.2074 -5.75842 -29.272 -5.47215 -29.3333 -5.18528 -29.3915 -4.89783 -29.4463 -4.60984 -29.498 -4.32134 -29.5463 -4.03236 -29.5914 -3.74294 -29.6332 -3.4531 -29.6717 -3.16288 -29.707 -2.87231 -29.7389 -2.58142 -29.7676 -2.29025 -29.793 -1.99882 -29.815 -1.70717 -29.8338 -1.41533 -29.8492 -1.12334 -29.8613 -0.831216 -29.8702 -0.539003 -29.8757 -0.246731 -29.8779 0.0455681 -29.8767 0.337863 -29.8723 0.630119 -29.8645 0.922306 -29.8535 1.21439 -29.8391 1.50634 -29.8214 1.79812 -29.8004 2.0897 -29.776 2.38105 -29.7484 2.67214 -29.7174 2.96293 -29.6832 3.25339 -29.6456 3.54349 -29.6048 3.83319 -29.5606 4.12247 -29.5132 4.41129 -29.4625 4.69961 -29.4085 4.98742 -29.3512 5.27467 -29.2907 5.56133 -29.2269 5.84738 -29.1598 6.13277 -29.0895 6.41748 -29.016 6.70148 -28.9392 6.98473 -28.8592 7.2672 -28.776 7.54887 -28.6896 7.82969 -28.6 8.10964 -28.5072 8.38868 -28.4112 8.66679 -28.312 8.94393 -28.2097 9.22008 -28.1043 9.49519 -27.9957 9.76925 -27.884 10.0422 -27.7691 10.3141 -27.6512 10.5848 -27.5302 10.8543 -27.4061 11.1226 -27.279 11.3896 -27.1488 11.6554 -27.0156 11.9199 -26.8793 12.1831 -26.7401 12.4449 -26.5979 12.7053 -26.4527 12.9643 -26.3045 13.2218 -26.1535 13.4779 -25.9994 13.7324 -25.8425 13.9855 -25.6827 14.2369 -25.5201 14.4868 -25.3546 14.735 -25.1862 14.9816 -25.015 15.2266 -24.8411 15.4698 -24.6643 15.7113 -24.4848 15.951 -24.3026 16.189 -24.1177 16.4251 -23.93 16.6595 -23.7397 16.8919 -23.5467 17.1225 -23.3511 17.3511 -23.1529 17.5778 -22.9521 17.8026 -22.7487 18.0253 -22.5428 18.2461 -22.3344 18.4648 -22.1234 18.6814 -21.91 18.8959 -21.6942 19.1084 -21.4759 19.3187 -21.2552 19.5268 -21.0321 19.7327 -20.8067 19.9365 -20.579 20.138 -20.3489 20.3373 -20.1166 20.5342 -19.882 20.7289 -19.6453 20.9213 -19.4063 21.1114 -19.1651 21.299 -18.9218 21.4843 -18.6764 21.6672 -18.4289 21.8477 -18.1793 22.0257 -17.9277 22.2013 -17.6742 22.3744 -17.4186 22.5449 -17.1611 22.713 -16.9016 22.8785 -16.6403 23.0415 -16.3771 23.2019 -16.1121 23.3597 -15.8453 23.5149 -15.5767 23.6675 -15.3064 23.8174 -15.0343 23.9646 -14.7606 24.1092 -14.4852 24.2511 -14.2083 24.3903 -13.9297 24.5268 -13.6496 24.6605 -13.3679 24.7914 -13.0848 24.9196 -12.8002 25.045 -12.5141 25.1677 -12.2267 25.2875 -11.9379 25.4045 -11.6478 25.5186 -11.3564 25.6299 -11.0637 25.7384 -10.7697 25.8439 -10.4746 25.9466 -10.1783 26.0464 -9.8809 26.1433 -9.58237 26.2373 -9.28277 26.3284 -8.98213 26.4165 -8.6805 26.5016 -8.3779 26.5839 -8.07436 26.6631 -7.76993 26.7394 -7.46463 26.8127 -7.1585 26.883 -6.85157 26.9504 -6.54388 27.0147 -6.23546 27.076 -5.92635 27.1343 -5.61657 27.1896 -5.30617 27.2418 -4.99518 27.291 -4.68364 27.3372 -4.37157 27.3804 -4.05902 27.4205 -3.74601 27.4575 -3.43259 27.4915 -3.11879 27.5224 -2.80464 27.5503 -2.49018 27.5751 -2.17544 27.5969 -1.86046 27.6156 -1.54527 27.6312 -1.22991 27.6438 -0.91442 27.6533 -0.598823 27.6597 -0.28316 27.663 --0.0325346 27.6633 --0.348225 27.6605 --0.663878 27.6546 --0.979456 27.6457 --1.29493 27.6337 --1.61025 27.6187 --1.9254 27.6006 --2.24034 27.5794 --2.55502 27.5551 --2.86943 27.5279 --3.18351 27.4975 --3.49725 27.4642 --3.81059 27.4278 --4.12352 27.3883 --4.43599 27.3458 --4.74797 27.3003 --5.05942 27.2518 --5.37032 27.2003 --5.68062 27.1457 --5.99029 27.0882 --6.2993 27.0277 --6.60761 26.9642 --6.9152 26.8977 --7.22202 26.8282 --7.52804 26.7558 --7.83324 26.6804 --8.13756 26.6021 --8.44099 26.5208 --8.74349 26.4366 --9.04503 26.3495 --9.34557 26.2595 --9.64507 26.1666 --9.94352 26.0709 --10.2409 25.9722 --10.5371 25.8707 --10.8322 25.7664 --11.126 25.6592 --11.4187 25.5491 --11.7101 25.4363 --12.0002 25.3207 --12.2889 25.2023 --12.5764 25.0811 --12.8624 24.9572 --13.1471 24.8305 --13.4303 24.7011 --13.712 24.569 --13.9922 24.4342 --14.2709 24.2967 --14.548 24.1565 --14.8235 24.0137 --15.0974 23.8683 --15.3696 23.7202 --15.6402 23.5696 --15.909 23.4163 --16.1761 23.2605 --16.4414 23.1022 --16.7049 22.9413 --16.9666 22.7779 --17.2265 22.612 --17.4844 22.4436 --17.7404 22.2728 --17.9945 22.0995 --18.2467 21.9239 --18.4968 21.7458 --18.7449 21.5654 --18.991 21.3826 --19.235 21.1974 --19.4769 21.01 --19.7167 20.8203 --19.9543 20.6283 --20.1897 20.434 --20.423 20.2375 --20.654 20.0388 --20.8828 19.8379 --21.1092 19.6349 --21.3334 19.4297 --21.5553 19.2224 --21.7748 19.013 --21.992 18.8016 --22.2067 18.5881 --22.4191 18.3726 --22.629 18.155 --22.8364 17.9355 --23.0414 17.7141 --23.2438 17.4907 --23.4438 17.2654 --23.6412 17.0383 --23.836 16.8093 --24.0282 16.5785 --24.2179 16.3459 --24.4049 16.1115 --24.5892 15.8753 --24.7709 15.6375 --24.9499 15.3979 --25.1262 15.1567 --25.2998 14.9138 --25.4706 14.6694 --25.6387 14.4233 --25.804 14.1757 --25.9665 13.9265 --26.1262 13.6758 --26.2831 13.4237 --26.4371 13.1701 --26.5883 12.915 --26.7366 12.6586 --26.882 12.4008 --27.0245 12.1417 --27.1641 11.8813 --27.3007 11.6195 --27.4344 11.3566 --27.5652 11.0924 --27.693 10.8269 --27.8177 10.5604 --27.9395 10.2927 --28.0583 10.0239 --28.174 9.75396 --28.2867 9.48301 --28.3964 9.21104 --28.503 8.93807 --28.6065 8.66415 --28.707 8.38929 --28.8044 8.11353 --28.8986 7.83689 --28.9898 7.55941 --29.0778 7.28112 --29.1627 7.00204 --29.2445 6.72222 --29.3231 6.44166 --29.3986 6.16042 --29.4709 5.87851 --29.5401 5.59597 --29.6061 5.31283 --29.6689 5.02912 --29.7285 4.74487 --29.7849 4.46011 --29.8382 4.17488 --29.8882 3.88919 --29.935 3.60309 --29.9786 3.3166 --30.0191 3.02975 --30.0562 2.74258 --30.0902 2.45512 --30.121 2.1674 --30.1485 1.87944 --30.1728 1.59128 --30.1938 1.30295 --30.2117 1.01448 --30.2263 0.725901 --30.2376 0.437245 --30.2458 0.148543 --30.2507 -0.140175 --30.2523 -0.428879 --30.2508 -0.717537 --30.2459 -1.00612 --30.2379 -1.29459 --30.2266 -1.58293 --30.2121 -1.87109 --30.1944 -2.15906 --30.1735 -2.44679 --30.1493 -2.73427 --30.1219 -3.02145 --30.0913 -3.30831 --30.0575 -3.59482 --30.0204 -3.88094 --29.9802 -4.16665 --29.9368 -4.45191 --29.8902 -4.7367 --29.8403 -5.02098 --29.7874 -5.30473 --29.7312 -5.58791 --29.6718 -5.8705 --29.6093 -6.15246 --29.5437 -6.43376 --29.4749 -6.71438 --29.4029 -6.99428 --29.3279 -7.27344 --29.2497 -7.55183 --29.1684 -7.82941 --29.0839 -8.10616 --28.9964 -8.38204 --28.9058 -8.65703 --28.8121 -8.9311 --28.7154 -9.20422 --28.6156 -9.47636 --28.5127 -9.7475 --28.4069 -10.0176 --28.298 -10.2866 --28.186 -10.5546 --28.0711 -10.8214 --27.9532 -11.087 --27.8324 -11.3515 --27.7085 -11.6148 --27.5818 -11.8768 --27.4521 -12.1376 --27.3194 -12.3971 --27.1839 -12.6553 --27.0455 -12.9121 --26.9042 -13.1676 --26.7601 -13.4216 --26.6131 -13.6742 --26.4632 -13.9254 --26.3106 -14.1751 --26.1552 -14.4233 --25.997 -14.67 --25.836 -14.9151 --25.6723 -15.1586 --25.5059 -15.4005 --25.3367 -15.6408 --25.1649 -15.8794 --24.9904 -16.1163 --24.8132 -16.3515 --24.6334 -16.585 --24.451 -16.8167 --24.266 -17.0467 --24.0784 -17.2748 --23.8883 -17.5011 --23.6956 -17.7255 --23.5004 -17.9481 --23.3027 -18.1687 --23.1026 -18.3874 --22.9 -18.6042 --22.6949 -18.819 --22.4875 -19.0318 --22.2776 -19.2425 --22.0654 -19.4513 --21.8509 -19.6579 --21.634 -19.8625 --21.4149 -20.065 --21.1935 -20.2653 --20.9698 -20.4635 --20.7439 -20.6595 --20.5158 -20.8534 --20.2855 -21.045 --20.053 -21.2344 --19.8185 -21.4215 --19.5818 -21.6063 --19.3431 -21.7889 --19.1023 -21.9691 --18.8594 -22.147 --18.6146 -22.3226 --18.3678 -22.4958 --18.119 -22.6666 --17.8684 -22.835 --17.6158 -23.0009 --17.3613 -23.1645 --17.105 -23.3255 --16.8469 -23.4841 --16.587 -23.6402 --16.3253 -23.7938 --16.062 -23.9448 --15.7968 -24.0933 --15.5301 -24.2393 --15.2616 -24.3827 --14.9916 -24.5235 --14.7199 -24.6616 --14.4467 -24.7972 --14.172 -24.9301 --13.8957 -25.0604 --13.618 -25.188 --13.3388 -25.313 --13.0582 -25.4352 --12.7762 -25.5547 --12.4929 -25.6716 --12.2082 -25.7857 --11.9223 -25.897 --11.635 -26.0056 --11.3465 -26.1114 --11.0569 -26.2145 --10.766 -26.3147 --10.474 -26.4122 --10.1809 -26.5069 --9.88668 -26.5987 --9.59142 -26.6877 --9.29515 -26.7739 --8.99788 -26.8572 --8.69966 -26.9376 --8.40051 -27.0152 --8.10047 -27.0899 --7.79956 -27.1617 --7.49782 -27.2307 --7.19529 -27.2967 --6.89199 -27.3598 --6.58795 -27.42 --6.28321 -27.4773 --5.97781 -27.5317 --5.67176 -27.5831 --5.36511 -27.6315 --5.05789 -27.6771 --4.75013 -27.7196 --4.44186 -27.7593 --4.13312 -27.7959 --3.82393 -27.8296 --3.51434 -27.8603 --3.20438 -27.8881 --2.89407 -27.9128 --2.58345 -27.9346 --2.27256 -27.9534 --1.96143 -27.9692 --1.65008 -27.9821 --1.33856 -27.9919 --1.0269 -27.9987 --0.715125 -28.0026 --0.403277 -28.0034 --0.0913854 -28.0013 -0.220515 -27.9962 -0.532392 -27.988 -0.844211 -27.9769 -1.15594 -27.9628 -1.46754 -27.9457 -1.77899 -27.9255 -2.09025 -27.9024 -2.40128 -27.8764 -2.71206 -27.8473 -3.02254 -27.8152 -3.3327 -27.7802 -3.6425 -27.7422 -3.95191 -27.7012 -4.2609 -27.6572 -4.56943 -27.6102 -4.87747 -27.5603 -5.18499 -27.5075 -5.49195 -27.4517 -5.79832 -27.3929 -6.10407 -27.3312 -6.40916 -27.2666 -6.71356 -27.199 -7.01724 -27.1285 -7.32016 -27.0551 -7.6223 -26.9788 -7.92362 -26.8996 -8.22408 -26.8175 -8.52366 -26.7325 -8.82232 -26.6446 -9.12003 -26.5539 -9.41676 -26.4603 -9.71248 -26.3638 -10.0071 -26.2645 -10.3007 -26.1624 -10.5932 -26.0574 -10.8846 -25.9497 -11.1747 -25.8391 -11.4637 -25.7258 -11.7514 -25.6097 -12.0378 -25.4908 -12.323 -25.3692 -12.6068 -25.2448 -12.8893 -25.1177 -13.1703 -24.9879 -13.45 -24.8554 -13.7282 -24.7202 -14.0049 -24.5823 -14.2801 -24.4418 -14.5537 -24.2986 -14.8258 -24.1528 -15.0962 -24.0044 -15.3651 -23.8534 -15.6322 -23.6998 -15.8977 -23.5436 -16.1614 -23.3849 -16.4234 -23.2236 -16.6836 -23.0598 -16.942 -22.8936 -17.1986 -22.7248 -17.4533 -22.5536 -17.7061 -22.3799 -17.957 -22.2038 -18.2059 -22.0253 -18.4529 -21.8444 -18.6978 -21.6611 -18.9407 -21.4755 -19.1816 -21.2875 -19.4204 -21.0972 -19.657 -20.9046 -19.8915 -20.7098 -20.1239 -20.5127 -20.3541 -20.3133 -20.582 -20.1118 -20.8077 -19.908 -21.0311 -19.7021 -21.2523 -19.4941 -21.4711 -19.2839 -21.6876 -19.0716 -21.9017 -18.8572 -22.1134 -18.6408 -22.3228 -18.4223 -22.5296 -18.2018 -22.7341 -17.9794 -22.936 -17.7549 -23.1354 -17.5286 -23.3323 -17.3003 -23.5267 -17.0701 -23.7185 -16.8381 -23.9077 -16.6042 -24.0942 -16.3685 -24.2782 -16.131 -24.4595 -15.8917 -24.6381 -15.6507 -24.814 -15.408 -24.9871 -15.1636 -25.1576 -14.9175 -25.3253 -14.6698 -25.4902 -14.4205 -25.6523 -14.1696 -25.8116 -13.9172 -25.9681 -13.6632 -26.1217 -13.4077 -26.2725 -13.1508 -26.4204 -12.8924 -26.5653 -12.6326 -26.7074 -12.3714 -26.8465 -12.1089 -26.9827 -11.845 -27.1159 -11.5798 -27.2461 -11.3133 -27.3733 -11.0456 -27.4975 -10.7767 -27.6187 -10.5066 -27.7369 -10.2353 -27.852 -9.96293 -27.964 -9.68944 -28.0729 -9.41489 -28.1788 -9.13929 -28.2815 -8.86269 -28.3811 -8.58511 -28.4776 -8.30659 -28.571 -8.02715 -28.6612 -7.74682 -28.7482 -7.46564 -28.8321 -7.18363 -28.9128 -6.90083 -28.9903 -6.61727 -29.0645 -6.33297 -29.1356 -6.04798 -29.2035 -5.76231 -29.2681 -5.47601 -29.3295 -5.18911 -29.3876 -4.90163 -29.4425 -4.6136 -29.4942 -4.32507 -29.5425 -4.03606 -29.5876 -3.7466 -29.6295 -3.45672 -29.668 -3.16647 -29.7033 -2.87586 -29.7352 -2.58493 -29.7639 -2.29372 -29.7893 -2.00225 -29.8113 -1.71056 -29.8301 -1.41868 -29.8455 -1.12665 -29.8577 -0.834485 -29.8665 -0.54223 -29.872 -0.249915 -29.8742 0.0424291 -29.8731 0.334768 -29.8687 0.627071 -29.8609 0.919304 -29.8499 1.21144 -29.8355 1.50343 -29.8178 1.79526 -29.7968 2.08689 -29.7724 2.37829 -29.7448 2.66943 -29.7139 2.96026 -29.6796 3.25077 -29.6421 3.54092 -29.6012 3.83067 -29.5571 4.12 -29.5096 4.40887 -29.4589 4.69725 -29.4049 4.9851 -29.3477 5.2724 -29.2871 5.55911 -29.2233 5.84521 -29.1563 6.13065 -29.0859 6.41541 -29.0124 6.69945 -28.9356 6.98275 -28.8556 7.26527 -28.7724 7.54698 -28.686 7.82785 -28.5963 8.10785 -28.5035 8.38694 -28.4075 8.6651 -28.3083 8.94229 -28.206 9.21848 -28.1005 9.49365 -27.9919 9.76775 -27.8802 10.0408 -27.7654 10.3127 -27.6474 10.5834 -27.5264 10.853 -27.4023 11.1213 -27.2751 11.3884 -27.1449 11.6543 -27.0117 11.9188 -26.8754 12.182 -26.7362 12.4438 -26.5939 12.7043 -26.4487 12.9633 -26.3005 13.2209 -26.1494 13.477 -25.9954 13.7316 -25.8384 13.9846 -25.6786 14.2361 -25.5159 14.4861 -25.3504 14.7343 -25.182 14.981 -25.0108 15.2259 -24.8368 15.4692 -24.66 15.7107 -24.4805 15.9505 -24.2982 16.1885 -24.1132 16.4247 -23.9255 16.659 -23.7352 16.8915 -23.5421 17.1221 -23.3465 17.3508 -23.1482 17.5775 -22.9474 17.8023 -22.744 18.0251 -22.538 18.2458 -22.3295 18.4646 -22.1185 18.6812 -21.9051 18.8958 -21.6892 19.1083 -21.4709 19.3186 -21.2501 19.5267 -21.027 19.7327 -20.8016 19.9365 -20.5738 20.138 -20.3437 20.3373 -20.1113 20.5343 -19.8767 20.729 -19.6399 20.9214 -19.4008 21.1115 -19.1596 21.2992 -18.9163 21.4845 -18.6708 21.6674 -18.4233 21.8479 -18.1737 22.0259 -17.922 22.2015 -17.6684 22.3746 -17.4128 22.5452 -17.1552 22.7133 -16.8957 22.8788 -16.6344 23.0418 -16.3711 23.2022 -16.1061 23.36 -15.8392 23.5152 -15.5706 23.6678 -15.3002 23.8177 -15.0281 23.9649 -14.7544 24.1095 -14.479 24.2514 -14.2019 24.3906 -13.9233 24.5271 -13.6432 24.6608 -13.3615 24.7918 -13.0783 24.9199 -12.7936 25.0454 -12.5076 25.168 -12.2201 25.2878 -11.9313 25.4048 -11.6411 25.5189 -11.3497 25.6302 -11.0569 25.7386 -10.763 25.8442 -10.4678 25.9469 -10.1715 26.0467 -9.874 26.1435 -9.57543 26.2375 -9.27579 26.3285 -8.97512 26.4167 -8.67345 26.5018 -8.37082 26.584 -8.06724 26.6633 -7.76278 26.7395 -7.45744 26.8128 -7.15127 26.8831 -6.84431 26.9504 -6.53659 27.0147 -6.22814 27.076 -5.91899 27.1343 -5.60919 27.1896 -5.29876 27.2418 -4.98774 27.291 -4.67617 27.3372 -4.36407 27.3803 -4.05149 27.4204 -3.73846 27.4574 -3.42502 27.4914 -3.11119 27.5223 -2.79702 27.5502 -2.48253 27.5749 -2.16777 27.5967 -1.85277 27.6154 -1.53756 27.631 -1.22219 27.6435 -0.906673 27.653 -0.591059 27.6594 -0.275379 27.6627 --0.0403313 27.6629 --0.356037 27.6601 --0.671703 27.6542 --0.987295 27.6453 --1.30278 27.6333 --1.61811 27.6182 --1.93327 27.6001 --2.24822 27.5789 --2.56291 27.5546 --2.87732 27.5273 --3.19141 27.497 --3.50515 27.4636 --3.8185 27.4272 --4.13143 27.3877 --4.4439 27.3452 --4.75588 27.2997 --5.06734 27.2512 --5.37823 27.1996 --5.68853 27.145 --5.9982 27.0875 --6.30721 27.0269 --6.61552 26.9634 --6.9231 26.8969 --7.22992 26.8274 --7.53593 26.755 --7.84112 26.6796 --8.14544 26.6013 --8.44886 26.52 --8.75135 26.4358 --9.05288 26.3487 --9.3534 26.2587 --9.6529 26.1658 --9.95133 26.07 --10.2487 25.9713 --10.5449 25.8698 --10.8399 25.7654 --11.1338 25.6582 --11.4264 25.5482 --11.7178 25.4354 --12.0079 25.3197 --12.2966 25.2013 --12.584 25.0801 --12.8701 24.9562 --13.1547 24.8295 --13.4379 24.7001 --13.7196 24.568 --13.9997 24.4332 --14.2784 24.2957 --14.5555 24.1555 --14.831 24.0127 --15.1049 23.8672 --15.3771 23.7192 --15.6476 23.5685 --15.9164 23.4153 --16.1835 23.2595 --16.4488 23.1011 --16.7123 22.9402 --16.974 22.7769 --17.2338 22.611 --17.4917 22.4426 --17.7477 22.2718 --18.0018 22.0986 --18.2539 21.9229 --18.504 21.7449 --18.7521 21.5644 --18.9982 21.3817 --19.2421 21.1965 --19.484 21.0091 --19.7238 20.8194 --19.9614 20.6274 --20.1968 20.4332 --20.43 20.2367 --20.661 20.038 --20.8898 19.8372 --21.1162 19.6342 --21.3404 19.429 --21.5622 19.2217 --21.7817 19.0124 --21.9989 18.801 --22.2136 18.5875 --22.4259 18.372 --22.6358 18.1545 --22.8432 17.9351 --23.0482 17.7136 --23.2506 17.4903 --23.4505 17.2651 --23.6479 17.038 --23.8427 16.809 --24.0349 16.5782 --24.2245 16.3457 --24.4115 16.1113 --24.5959 15.8752 --24.7775 15.6374 --24.9565 15.3979 --25.1328 15.1567 --25.3064 14.9139 --25.4772 14.6695 --25.6453 14.4234 --25.8106 14.1759 --25.9731 13.9267 --26.1327 13.6761 --26.2896 13.424 --26.4436 13.1705 --26.5948 12.9155 --26.7431 12.6591 --26.8885 12.4014 --27.031 12.1423 --27.1706 11.8819 --27.3072 11.6203 --27.4409 11.3574 --27.5717 11.0932 --27.6995 10.8279 --27.8243 10.5614 --27.946 10.2937 --28.0648 10.0249 --28.1806 9.75511 --28.2933 9.48422 --28.403 9.21231 --28.5096 8.93941 --28.6131 8.66555 --28.7136 8.39075 --28.811 8.11506 --28.9053 7.83848 --28.9964 7.56107 --29.0845 7.28285 --29.1694 7.00384 --29.2512 6.72408 --29.3299 6.44359 --29.4054 6.16242 --29.4778 5.88058 --29.547 5.59811 --29.613 5.31504 --29.6758 5.0314 --29.7355 4.74722 --29.7919 4.46253 --29.8452 4.17736 --29.8953 3.89175 --29.9422 3.60572 --29.9858 3.3193 --30.0263 3.03252 --30.0635 2.74542 --30.0976 2.45803 --30.1284 2.17037 --30.1559 1.88249 --30.1803 1.5944 --30.2014 1.30614 --30.2193 1.01774 --30.2339 0.72923 --30.2454 0.440644 --30.2536 0.152011 --30.2585 -0.136638 --30.2603 -0.425272 --30.2587 -0.713861 --30.254 -1.00237 --30.246 -1.29078 --30.2348 -1.57905 --30.2204 -1.86714 --30.2028 -2.15504 --30.1819 -2.44271 --30.1578 -2.73012 --30.1305 -3.01724 --30.0999 -3.30404 --30.0662 -3.59048 --30.0292 -3.87654 --29.9891 -4.16219 --29.9458 -4.44739 --29.8992 -4.73212 --29.8495 -5.01634 --29.7966 -5.30003 --29.7405 -5.58316 --29.6813 -5.86569 --29.6189 -6.14759 --29.5533 -6.42885 --29.4846 -6.70941 --29.4127 -6.98927 --29.3378 -7.26838 --29.2597 -7.54671 --29.1784 -7.82424 --29.0941 -8.10095 --29.0067 -8.37679 --28.9162 -8.65174 --28.8226 -8.92576 --28.726 -9.19885 --28.6263 -9.47095 --28.5236 -9.74204 --28.4178 -10.0121 --28.309 -10.2811 --28.1972 -10.549 --28.0824 -10.8158 --27.9646 -11.0814 --27.8439 -11.3459 --27.7202 -11.6091 --27.5935 -11.8712 --27.4639 -12.1319 --27.3314 -12.3914 --27.196 -12.6495 --27.0577 -12.9063 --26.9166 -13.1618 --26.7725 -13.4158 --26.6257 -13.6684 --26.476 -13.9196 --26.3235 -14.1693 --26.1682 -14.4175 --26.0101 -14.6641 --25.8493 -14.9092 --25.6857 -15.1528 --25.5194 -15.3947 --25.3504 -15.635 --25.1787 -15.8736 --25.0043 -16.1105 --24.8273 -16.3457 --24.6476 -16.5792 --24.4654 -16.8109 --24.2805 -17.0409 --24.0931 -17.269 --23.9031 -17.4953 --23.7105 -17.7198 --23.5155 -17.9424 --23.3179 -18.163 --23.1179 -18.3818 --22.9155 -18.5986 --22.7106 -18.8134 --22.5032 -19.0262 --22.2935 -19.237 --22.0815 -19.4458 --21.8671 -19.6525 --21.6504 -19.8571 --21.4313 -20.0596 --21.2101 -20.26 --20.9865 -20.4582 --20.7607 -20.6543 --20.5328 -20.8482 --20.3026 -21.0398 --20.0703 -21.2293 --19.8359 -21.4164 --19.5994 -21.6014 --19.3608 -21.784 --19.1201 -21.9643 --18.8774 -22.1423 --18.6327 -22.3179 --18.386 -22.4911 --18.1374 -22.662 --17.8868 -22.8305 --17.6344 -22.9965 --17.3801 -23.1601 --17.1239 -23.3213 --16.8659 -23.48 --16.6062 -23.6361 --16.3446 -23.7898 --16.0813 -23.9409 --15.8164 -24.0896 --15.5497 -24.2356 --15.2814 -24.3791 --15.0115 -24.52 --14.74 -24.6583 --14.4669 -24.7939 --14.1922 -24.9269 --13.9161 -25.0573 --13.6385 -25.1851 --13.3594 -25.3101 --13.079 -25.4325 --12.7971 -25.5521 --12.5139 -25.6691 --12.2293 -25.7833 --11.9435 -25.8948 --11.6563 -26.0035 --11.368 -26.1094 --11.0784 -26.2126 --10.7876 -26.313 --10.4957 -26.4106 --10.2027 -26.5054 --9.90863 -26.5974 --9.61347 -26.6865 --9.3173 -26.7728 --9.02013 -26.8563 --8.722 -26.9369 --8.42294 -27.0146 --8.12299 -27.0895 --7.82217 -27.1614 --7.52052 -27.2305 --7.21807 -27.2967 --6.91486 -27.3599 --6.6109 -27.4203 --6.30624 -27.4777 --6.00091 -27.5322 --5.69494 -27.5838 --5.38836 -27.6324 --5.08121 -27.6781 --4.77352 -27.7209 --4.46532 -27.7606 --4.15664 -27.7975 --3.84752 -27.8313 --3.53799 -27.8622 --3.22808 -27.8901 --2.91783 -27.915 --2.60727 -27.937 --2.29642 -27.9559 --1.98533 -27.9719 --1.67403 -27.9849 --1.36255 -27.9949 --1.05093 -28.0019 --0.739192 -28.0059 --0.427375 -28.007 --0.115513 -28.005 -0.196361 -28 -0.508215 -27.9921 -0.820014 -27.9811 -1.13172 -27.9671 -1.44332 -27.9502 -1.75475 -27.9303 -2.066 -27.9073 -2.37702 -27.8814 -2.6878 -27.8525 -2.99828 -27.8206 -3.30844 -27.7858 -3.61825 -27.7479 -3.92767 -27.7071 -4.23667 -27.6633 -4.54521 -27.6166 -4.85327 -27.5668 -5.16081 -27.5142 -5.46779 -27.4585 -5.77419 -27.3999 -6.07997 -27.3384 -6.38509 -27.274 -6.68953 -27.2066 -6.99324 -27.1363 -7.29621 -27.063 -7.59839 -26.9869 -7.89976 -26.9079 -8.20027 -26.8259 -8.49991 -26.7411 -8.79862 -26.6534 -9.09639 -26.5629 -9.39318 -26.4695 -9.68896 -26.3732 -9.9837 -26.2741 -10.2774 -26.1721 -10.5699 -26.0674 -10.8613 -25.9598 -11.1516 -25.8494 -11.4406 -25.7363 -11.7284 -25.6203 -12.0149 -25.5016 -12.3002 -25.3802 -12.5841 -25.256 -12.8666 -25.129 -13.1478 -24.9994 -13.4275 -24.8671 -13.7058 -24.7321 -13.9826 -24.5944 -14.2579 -24.454 -14.5317 -24.311 -14.8039 -24.1654 -15.0744 -24.0171 -15.3434 -23.8663 -15.6107 -23.7128 -15.8763 -23.5568 -16.1401 -23.3983 -16.4022 -23.2372 -16.6626 -23.0736 -16.9211 -22.9075 -17.1778 -22.7389 -17.4327 -22.5678 -17.6856 -22.3943 -17.9366 -22.2184 -18.1857 -22.04 -18.4328 -21.8593 -18.6779 -21.6762 -18.921 -21.4907 -19.162 -21.3029 -19.4009 -21.1127 -19.6377 -20.9203 -19.8724 -20.7256 -20.1049 -20.5286 -20.3352 -20.3294 -20.5633 -20.128 -20.7892 -19.9244 -21.0128 -19.7187 -21.2341 -19.5107 -21.4531 -19.3007 -21.6698 -19.0885 -21.8841 -18.8743 -22.096 -18.658 -22.3055 -18.4397 -22.5126 -18.2193 -22.7172 -17.997 -22.9193 -17.7727 -23.1189 -17.5465 -23.316 -17.3183 -23.5105 -17.0882 -23.7025 -16.8563 -23.8919 -16.6226 -24.0786 -16.387 -24.2628 -16.1496 -24.4443 -15.9104 -24.6231 -15.6696 -24.7992 -15.427 -24.9725 -15.1827 -25.1432 -14.9367 -25.3111 -14.6891 -25.4762 -14.4399 -25.6385 -14.1891 -25.798 -13.9368 -25.9547 -13.6829 -26.1085 -13.4275 -26.2595 -13.1706 -26.4076 -12.9123 -26.5528 -12.6526 -26.695 -12.3915 -26.8343 -12.129 -26.9707 -11.8652 -27.1041 -11.6001 -27.2345 -11.3337 -27.362 -11.0661 -27.4864 -10.7972 -27.6078 -10.5272 -27.7261 -10.256 -27.8414 -9.98366 -27.9537 -9.71023 -28.0628 -9.43573 -28.1689 -9.16019 -28.2718 -8.88363 -28.3717 -8.6061 -28.4684 -8.32762 -28.5619 -8.04822 -28.6523 -7.76793 -28.7396 -7.48678 -28.8237 -7.20481 -28.9046 -6.92204 -28.9822 -6.6385 -29.0567 -6.35423 -29.128 -6.06926 -29.1961 -5.78362 -29.2609 -5.49733 -29.3225 -5.21044 -29.3808 -4.92297 -29.4359 -4.63496 -29.4878 -4.34643 -29.5364 -4.05742 -29.5817 -3.76796 -29.6237 -3.47808 -29.6624 -3.18781 -29.6979 -2.8972 -29.7301 -2.60626 -29.7589 -2.31503 -29.7845 -2.02354 -29.8068 -1.73183 -29.8257 -1.43993 -29.8414 -1.14787 -29.8537 -0.855677 -29.8628 -0.563392 -29.8685 -0.271044 -29.8709 0.021335 -29.87 0.313712 -29.8657 0.606054 -29.8582 0.898329 -29.8473 1.1905 -29.8331 1.48255 -29.8156 1.77443 -29.7948 2.06611 -29.7707 2.35756 -29.7432 2.64875 -29.7125 2.93965 -29.6784 3.23022 -29.641 3.52043 -29.6004 3.81025 -29.5564 4.09964 -29.5092 4.38858 -29.4586 4.67703 -29.4048 4.96495 -29.3477 5.25233 -29.2874 5.53912 -29.2237 5.82529 -29.1569 6.11081 -29.0867 6.39565 -29.0134 6.67978 -28.9367 6.96317 -28.8569 7.24577 -28.7739 7.52757 -28.6876 7.80853 -28.5981 8.08862 -28.5055 8.36781 -28.4096 8.64606 -28.3106 8.92335 -28.2085 9.19964 -28.1031 9.4749 -27.9947 9.74911 -27.8831 10.0222 -27.7684 10.2942 -27.6506 10.5651 -27.5297 10.8347 -27.4058 11.1032 -27.2787 11.3704 -27.1487 11.6364 -27.0156 11.901 -26.8794 12.1643 -26.7403 12.4263 -26.5982 12.6869 -26.4531 12.946 -26.3051 13.2037 -26.1541 13.46 -26.0002 13.7147 -25.8433 13.9679 -25.6836 14.2195 -25.521 14.4695 -25.3556 14.7179 -25.1873 14.9647 -25.0162 15.2098 -24.8423 15.4532 -24.6657 15.6949 -24.4863 15.9348 -24.3041 16.1729 -24.1192 16.4093 -23.9316 16.6437 -23.7414 16.8764 -23.5484 17.1071 -23.3529 17.3359 -23.1547 17.5628 -22.954 17.7877 -22.7506 18.0107 -22.5448 18.2316 -22.3364 18.4504 -22.1255 18.6672 -21.9121 18.882 -21.6963 19.0946 -21.478 19.305 -21.2574 19.5133 -21.0343 19.7195 -20.8089 19.9234 -20.5812 20.1251 -20.3512 20.3245 -20.1189 20.5217 -19.8844 20.7165 -19.6476 20.9091 -19.4086 21.0993 -19.1675 21.2871 -18.9242 21.4726 -18.6788 21.6557 -18.4313 21.8363 -18.1817 22.0145 -17.9301 22.1902 -17.6765 22.3635 -17.421 22.5342 -17.1635 22.7025 -16.904 22.8682 -16.6427 23.0313 -16.3795 23.1919 -16.1145 23.3498 -15.8476 23.5052 -15.579 23.6579 -15.3087 23.808 -15.0366 23.9554 -14.7629 24.1001 -14.4875 24.2422 -14.2105 24.3815 -13.9319 24.5181 -13.6518 24.652 -13.3701 24.7831 -13.087 24.9114 -12.8023 25.037 -12.5163 25.1597 -12.2288 25.2797 -11.94 25.3968 -11.6498 25.5111 -11.3584 25.6226 -11.0657 25.7311 -10.7717 25.8369 -10.4765 25.9397 -10.1802 26.0396 -9.88273 26.1366 -9.58416 26.2307 -9.28452 26.3219 -8.98384 26.4102 -8.68216 26.4955 -8.37951 26.5778 -8.07593 26.6572 -7.77145 26.7336 -7.4661 26.807 -7.15992 26.8775 -6.85294 26.9449 -6.54519 27.0094 -6.23672 27.0708 -5.92755 27.1292 -5.61773 27.1846 -5.30728 27.237 -4.99623 27.2863 -4.68463 27.3326 -4.37251 27.3759 -4.05991 27.4161 -3.74685 27.4533 -3.43338 27.4874 -3.11952 27.5184 -2.80532 27.5464 -2.4908 27.5714 -2.17601 27.5932 -1.86098 27.612 -1.54574 27.6278 -1.23033 27.6404 -0.914779 27.65 -0.599129 27.6566 -0.283412 27.66 --0.0323355 27.6604 --0.34808 27.6577 --0.663785 27.652 --0.979416 27.6432 --1.29494 27.6313 --1.61032 27.6163 --1.92552 27.5983 --2.2405 27.5773 --2.55524 27.5531 --2.8697 27.526 --3.18383 27.4957 --3.49762 27.4625 --3.81101 27.4262 --4.12399 27.3868 --4.4365 27.3444 --4.74853 27.299 --5.06003 27.2506 --5.37097 27.1992 --5.68132 27.1448 --5.99104 27.0873 --6.3001 27.0269 --6.60846 26.9635 --6.91609 26.8971 --7.22296 26.8277 --7.52903 26.7554 --7.83427 26.6801 --8.13865 26.6019 --8.44213 26.5207 --8.74468 26.4366 --9.04626 26.3496 --9.34685 26.2597 --9.6464 26.1669 --9.9449 26.0713 --10.2423 25.9727 --10.5386 25.8713 --10.8337 25.767 --11.1276 25.66 --11.4203 25.55 --11.7117 25.4373 --12.0019 25.3218 --12.2907 25.2035 --12.5782 25.0824 --12.8643 24.9586 --13.149 24.832 --13.4322 24.7027 --13.714 24.5707 --13.9942 24.436 --14.273 24.2986 --14.5501 24.1585 --14.8257 24.0158 --15.0996 23.8705 --15.3719 23.7225 --15.6425 23.572 --15.9114 23.4188 --16.1786 23.2631 --16.4439 23.1049 --16.7075 22.9441 --16.9693 22.7808 --17.2291 22.6151 --17.4872 22.4468 --17.7433 22.2761 --17.9974 22.103 --18.2496 21.9274 --18.4998 21.7495 --18.748 21.5692 --18.9941 21.3865 --19.2382 21.2015 --19.4801 21.0142 --19.72 20.8245 --19.9576 20.6327 --20.1931 20.4385 --20.4265 20.2422 --20.6575 20.0436 --20.8864 19.8428 --21.1129 19.6399 --21.3372 19.4349 --21.5591 19.2277 --21.7787 19.0185 --21.9959 18.8072 --22.2108 18.5938 --22.4232 18.3784 --22.6332 18.161 --22.8407 17.9417 --23.0457 17.7203 --23.2483 17.4971 --23.4483 17.272 --23.6457 17.045 --23.8406 16.8161 --24.033 16.5854 --24.2227 16.353 --24.4098 16.1187 --24.5942 15.8827 --24.776 15.645 --24.9551 15.4056 --25.1314 15.1645 --25.3051 14.9218 --25.476 14.6774 --25.6442 14.4315 --25.8096 14.184 --25.9722 13.935 --26.132 13.6845 --26.289 13.4325 --26.4432 13.179 --26.5944 12.9241 --26.7428 12.6679 --26.8884 12.4102 --27.031 12.1512 --27.1707 11.8909 --27.3075 11.6294 --27.4413 11.3665 --27.5722 11.1025 --27.7001 10.8372 --27.825 10.5708 --27.9469 10.3032 --28.0658 10.0346 --28.1817 9.76481 --28.2946 9.49401 --28.4044 9.22218 --28.5111 8.94937 --28.6148 8.67559 --28.7154 8.40088 --28.813 8.12527 --28.9074 7.84878 --28.9987 7.57145 --29.0869 7.29331 --29.172 7.01438 --29.254 6.7347 --29.3328 6.4543 --29.4084 6.17321 --29.481 5.89145 --29.5503 5.60906 --29.6165 5.32607 --29.6795 5.04251 --29.7393 4.75841 --29.7959 4.4738 --29.8494 4.18871 --29.8996 3.90317 --29.9466 3.61721 --29.9905 3.33087 --30.0311 3.04416 --30.0685 2.75714 --30.1027 2.46981 --30.1337 2.18223 --30.1614 1.89441 --30.1859 1.60638 --30.2072 1.31819 --30.2253 1.02986 --30.2401 0.741411 --30.2518 0.452887 --30.2601 0.164315 --30.2653 -0.124274 --30.2672 -0.412851 --30.2659 -0.701383 --30.2613 -0.98984 --30.2535 -1.27819 --30.2425 -1.56641 --30.2283 -1.85445 --30.2108 -2.1423 --30.1901 -2.42993 --30.1662 -2.71729 --30.1391 -3.00436 --30.1088 -3.29112 --30.0752 -3.57752 --30.0385 -3.86354 --29.9985 -4.14915 --29.9554 -4.43432 --29.9091 -4.71901 --29.8596 -5.00321 --29.8069 -5.28687 --29.751 -5.56997 --29.692 -5.85247 --29.6298 -6.13436 --29.5644 -6.41559 --29.4959 -6.69613 --29.4243 -6.97597 --29.3496 -7.25506 --29.2717 -7.53338 --29.1907 -7.81091 --29.1066 -8.0876 --29.0194 -8.36343 --28.9291 -8.63837 --28.8358 -8.91239 --28.7394 -9.18547 --28.6399 -9.45757 --28.5374 -9.72867 --28.4319 -9.99873 --28.3233 -10.2677 --28.2117 -10.5356 --28.0972 -10.8024 --27.9796 -11.0681 --27.8591 -11.3326 --27.7356 -11.5958 --27.6092 -11.8579 --27.4799 -12.1187 --27.3476 -12.3781 --27.2124 -12.6363 --27.0744 -12.8932 --26.9335 -13.1486 --26.7897 -13.4027 --26.6431 -13.6554 --26.4936 -13.9066 --26.3414 -14.1563 --26.1863 -14.4045 --26.0285 -14.6512 --25.8679 -14.8964 --25.7046 -15.14 --25.5385 -15.3819 --25.3697 -15.6222 --25.1983 -15.8609 --25.0242 -16.0979 --24.8474 -16.3332 --24.668 -16.5668 --24.4859 -16.7986 --24.3013 -17.0286 --24.1141 -17.2568 --23.9243 -17.4832 --23.7321 -17.7077 --23.5372 -17.9304 --23.3399 -18.1511 --23.1402 -18.3699 --22.9379 -18.5868 --22.7333 -18.8017 --22.5262 -19.0147 --22.3168 -19.2256 --22.1049 -19.4344 --21.8908 -19.6412 --21.6743 -19.846 --21.4555 -20.0486 --21.2344 -20.2491 --21.0111 -20.4474 --20.7856 -20.6436 --20.5578 -20.8376 --20.3279 -21.0294 --20.0958 -21.219 --19.8616 -21.4063 --19.6253 -21.5913 --19.3869 -21.7741 --19.1465 -21.9545 --18.904 -22.1326 --18.6595 -22.3084 --18.4131 -22.4818 --18.1647 -22.6528 --17.9144 -22.8215 --17.6621 -22.9877 --17.408 -23.1514 --17.1521 -23.3127 --16.8943 -23.4716 --16.6347 -23.6279 --16.3734 -23.7818 --16.1103 -23.9331 --15.8456 -24.0819 --15.5791 -24.2281 --15.311 -24.3718 --15.0413 -24.5129 --14.77 -24.6513 --14.4971 -24.7872 --14.2226 -24.9204 --13.9467 -25.051 --13.6693 -25.1789 --13.3904 -25.3042 --13.1101 -25.4268 --12.8284 -25.5466 --12.5454 -25.6638 --12.261 -25.7782 --11.9753 -25.8899 --11.6884 -25.9989 --11.4002 -26.105 --11.1108 -26.2084 --10.8202 -26.3091 --10.5284 -26.4069 --10.2356 -26.5019 --9.94165 -26.5941 --9.64665 -26.6835 --9.35063 -26.77 --9.05361 -26.8537 --8.75563 -26.9346 --8.45672 -27.0125 --8.15691 -27.0876 --7.85623 -27.1599 --7.55471 -27.2292 --7.25239 -27.2956 --6.9493 -27.3591 --6.64547 -27.4197 --6.34093 -27.4774 --6.03571 -27.5322 --5.72986 -27.584 --5.42339 -27.6329 --5.11634 -27.6789 --4.80875 -27.7219 --4.50065 -27.7619 --4.19207 -27.799 --3.88304 -27.8331 --3.5736 -27.8643 --3.26377 -27.8925 --2.9536 -27.9177 --2.64311 -27.9399 --2.33234 -27.9592 --2.02132 -27.9754 --1.71009 -27.9887 --1.39867 -27.999 --1.0871 -28.0063 --0.775419 -28.0106 --0.463652 -28.0119 --0.151836 -28.0102 -0.159997 -28.0056 -0.471812 -27.9979 -0.783578 -27.9873 -1.09526 -27.9736 -1.40682 -27.957 -1.71824 -27.9373 -2.02947 -27.9147 -2.34048 -27.8891 -2.65124 -27.8605 -2.96172 -27.8289 -3.27188 -27.7944 -3.58169 -27.7568 -3.89112 -27.7163 -4.20013 -27.6728 -4.50868 -27.6264 -4.81676 -27.577 -5.12432 -27.5246 -5.43133 -27.4693 -5.73775 -27.411 -6.04356 -27.3498 -6.34872 -27.2857 -6.6532 -27.2186 -6.95697 -27.1486 -7.25999 -27.0757 -7.56222 -26.9999 -7.86365 -26.9211 -8.16423 -26.8395 -8.46393 -26.755 -8.76272 -26.6676 -9.06056 -26.5774 -9.35744 -26.4843 -9.6533 -26.3883 -9.94812 -26.2895 -10.2419 -26.1879 -10.5345 -26.0834 -10.826 -25.9761 -11.1164 -25.8661 -11.4055 -25.7532 -11.6934 -25.6376 -11.9801 -25.5192 -12.2655 -25.398 -12.5495 -25.2742 -12.8322 -25.1475 -13.1135 -25.0182 -13.3933 -24.8862 -13.6718 -24.7514 -13.9487 -24.614 -14.2242 -24.474 -14.4981 -24.3312 -14.7704 -24.1859 -15.0412 -24.0379 -15.3103 -23.8874 -15.5777 -23.7342 -15.8435 -23.5785 -16.1075 -23.4202 -16.3699 -23.2594 -16.6304 -23.0961 -16.8891 -22.9303 -17.146 -22.7619 -17.401 -22.5912 -17.6542 -22.4179 -17.9054 -22.2422 -18.1547 -22.0641 -18.402 -21.8837 -18.6474 -21.7008 -18.8906 -21.5156 -19.1319 -21.328 -19.371 -21.1381 -19.6081 -20.946 -19.843 -20.7515 -20.0758 -20.5548 -20.3063 -20.3559 -20.5347 -20.1547 -20.7608 -19.9513 -20.9847 -19.7458 -21.2063 -19.5381 -21.4256 -19.3283 -21.6425 -19.1164 -21.8571 -18.9024 -22.0693 -18.6863 -22.279 -18.4682 -22.4864 -18.2481 -22.6913 -18.026 -22.8937 -17.8019 -23.0936 -17.5759 -23.291 -17.348 -23.4858 -17.1181 -23.6781 -16.8864 -23.8678 -16.6528 -24.0549 -16.4175 -24.2393 -16.1803 -24.4211 -15.9413 -24.6002 -15.7007 -24.7766 -15.4582 -24.9503 -15.2141 -25.1213 -14.9684 -25.2895 -14.721 -25.455 -14.4719 -25.6176 -14.2213 -25.7774 -13.9691 -25.9345 -13.7154 -26.0886 -13.4602 -26.2399 -13.2035 -26.3883 -12.9454 -26.5338 -12.6858 -26.6764 -12.4249 -26.8161 -12.1625 -26.9528 -11.8989 -27.0866 -11.6339 -27.2173 -11.3677 -27.3451 -11.1002 -27.4699 -10.8315 -27.5916 -10.5615 -27.7103 -10.2905 -27.826 -10.0182 -27.9386 -9.74493 -28.0481 -9.47054 -28.1545 -9.19511 -28.2578 -8.91866 -28.358 -8.64122 -28.455 -8.36284 -28.549 -8.08353 -28.6397 -7.80332 -28.7273 -7.52226 -28.8118 -7.24036 -28.893 -6.95767 -28.9711 -6.6742 -29.0459 -6.39 -29.1176 -6.10509 -29.186 -5.81951 -29.2512 -5.53328 -29.3131 -5.24643 -29.3719 -4.95901 -29.4273 -4.67104 -29.4795 -4.38255 -29.5285 -4.09357 -29.5741 -3.80414 -29.6165 -3.51429 -29.6556 -3.22405 -29.6915 -2.93345 -29.724 -2.64252 -29.7532 -2.3513 -29.7792 -2.05982 -29.8018 -1.76811 -29.8212 -1.47621 -29.8372 -1.18414 -29.8499 -0.891938 -29.8593 -0.599637 -29.8654 -0.307269 -29.8681 -0.0148671 -29.8676 0.277537 -29.8637 0.56991 -29.8565 0.86222 -29.846 1.15443 -29.8322 1.44652 -29.815 1.73845 -29.7945 2.03018 -29.7708 2.32169 -29.7437 2.61294 -29.7133 2.90389 -29.6796 3.19453 -29.6426 3.48481 -29.6022 3.7747 -29.5586 4.06418 -29.5117 4.35319 -29.4615 4.64173 -29.4081 4.92975 -29.3513 5.21722 -29.2913 5.5041 -29.228 5.79038 -29.1615 6.076 -29.0917 6.36095 -29.0186 6.64519 -28.9423 6.92869 -28.8628 7.21142 -28.7801 7.49334 -28.6942 7.77442 -28.605 8.05464 -28.5127 8.33396 -28.4172 8.61235 -28.3185 8.88977 -28.2166 9.1662 -28.1116 9.44161 -28.0035 9.71597 -27.8922 9.98924 -27.7778 10.2614 -27.6603 10.5324 -27.5397 10.8022 -27.416 11.0709 -27.2893 11.3382 -27.1595 11.6044 -27.0267 11.8692 -26.8908 12.1327 -26.752 12.3948 -26.6101 12.6556 -26.4653 12.9149 -26.3176 13.1728 -26.1668 13.4292 -26.0132 13.6842 -25.8566 13.9375 -25.6972 14.1894 -25.5348 14.4396 -25.3697 14.6882 -25.2016 14.9352 -25.0308 15.1805 -24.8571 15.4242 -24.6807 15.666 -24.5015 15.9062 -24.3196 16.1445 -24.1349 16.3811 -23.9476 16.6158 -23.7576 16.8486 -23.5649 17.0796 -23.3695 17.3087 -23.1716 17.5358 -22.971 17.7609 -22.7679 17.9841 -22.5623 18.2053 -22.3541 18.4244 -22.1434 18.6414 -21.9302 18.8564 -21.7146 19.0692 -21.4965 19.28 -21.276 19.4885 -21.0532 19.6949 -20.828 19.8991 -20.6004 20.101 -20.3706 20.3007 -20.1385 20.4981 -19.9041 20.6932 -19.6675 20.886 -19.4287 21.0765 -& -@target G0.S5 -@type xy --15.5389 -25.216 --15.262 -25.3851 --14.9833 -25.5513 --14.7029 -25.7146 --14.4209 -25.8751 --14.1373 -26.0327 --13.8522 -26.1874 --13.5655 -26.3392 --13.2773 -26.4881 --12.9876 -26.634 --12.6965 -26.7771 --12.404 -26.9171 --12.1101 -27.0543 --11.8149 -27.1884 --11.5184 -27.3196 --11.2207 -27.4479 --10.9218 -27.5731 --10.6216 -27.6954 --10.3203 -27.8146 --10.0179 -27.9309 --9.71447 -28.0442 --9.40996 -28.1544 --9.10445 -28.2617 --8.79797 -28.3659 --8.49055 -28.4672 --8.18223 -28.5654 --7.87306 -28.6606 --7.56305 -28.7529 --7.25226 -28.8421 --6.9407 -28.9282 --6.62843 -29.0114 --6.31547 -29.0916 --6.00185 -29.1688 --5.68762 -29.243 --5.37281 -29.3141 --5.05745 -29.3823 --4.74157 -29.4475 --4.42522 -29.5098 --4.10842 -29.569 --3.7912 -29.6253 --3.47361 -29.6786 --3.15567 -29.729 --2.83742 -29.7764 --2.51889 -29.8209 --2.20011 -29.8625 --1.88111 -29.9011 --1.56193 -29.9368 --1.2426 -29.9696 --0.923155 -29.9996 --0.603617 -30.0266 --0.284021 -30.0508 -0.0356029 -30.0721 -0.355223 -30.0905 -0.67481 -30.1061 -0.994334 -30.1189 -1.31377 -30.1289 -1.63308 -30.1361 -1.95223 -30.1405 -2.27121 -30.1421 -2.58998 -30.141 -2.90852 -30.1371 -3.22679 -30.1305 -3.54477 -30.1212 -3.86244 -30.1091 -4.17975 -30.0944 -4.4967 -30.077 -4.81325 -30.057 -5.12938 -30.0343 -5.44506 -30.009 -5.76026 -29.9811 -6.07497 -29.9506 -6.38916 -29.9175 -6.7028 -29.8818 -7.01586 -29.8436 -7.32834 -29.8029 -7.6402 -29.7597 -7.95142 -29.714 -8.26197 -29.6658 -8.57185 -29.6152 -8.88101 -29.5621 -9.18946 -29.5066 -9.49715 -29.4487 -9.80407 -29.3885 -10.1102 -29.3258 -10.4155 -29.2608 -10.72 -29.1935 -11.0237 -29.1239 -11.3265 -29.052 -11.6284 -28.9778 -11.9294 -28.9013 -12.2294 -28.8227 -12.5286 -28.7418 -12.8267 -28.6587 -13.1239 -28.5734 -13.4201 -28.486 -13.7153 -28.3964 -14.0095 -28.3047 -14.3026 -28.2109 -14.5947 -28.1151 -14.8857 -28.0171 -15.1756 -27.9172 -15.4645 -27.8151 -15.7522 -27.7111 -16.0387 -27.6051 -16.3242 -27.4972 -16.6084 -27.3873 -16.8915 -27.2754 -17.1735 -27.1617 -17.4542 -27.046 -17.7337 -26.9285 -18.012 -26.8091 -18.2891 -26.6879 -18.5649 -26.5649 -18.8395 -26.4401 -19.1128 -26.3135 -19.3848 -26.1852 -19.6555 -26.0551 -19.925 -25.9233 -20.1931 -25.7898 -20.4599 -25.6546 -20.7254 -25.5177 -20.9896 -25.3792 -21.2524 -25.2391 -21.5138 -25.0973 -21.7739 -24.954 -22.0326 -24.8091 -22.29 -24.6627 -22.5459 -24.5147 -22.8005 -24.3651 -23.0536 -24.2141 -23.3053 -24.0616 -23.5557 -23.9077 -23.8045 -23.7523 -24.052 -23.5954 -24.298 -23.4372 -24.5426 -23.2776 -24.7857 -23.1165 -25.0274 -22.9542 -25.2676 -22.7904 -25.5063 -22.6254 -25.7436 -22.4591 -25.9794 -22.2914 -26.2136 -22.1225 -26.4464 -21.9523 -26.6778 -21.7809 -26.9076 -21.6083 -27.1359 -21.4344 -27.3627 -21.2594 -27.588 -21.0832 -27.8117 -20.9058 -28.034 -20.7273 -28.2547 -20.5477 -28.4739 -20.3669 -28.6916 -20.1851 -28.9077 -20.0022 -29.1223 -19.8182 -29.3354 -19.6331 -29.5469 -19.4471 -29.7569 -19.26 -29.9653 -19.0719 -30.1722 -18.8828 -30.3775 -18.6928 -30.5813 -18.5018 -30.7835 -18.3099 -30.9841 -18.117 -31.1832 -17.9232 -31.3808 -17.7285 -31.5767 -17.533 -31.7711 -17.3366 -31.964 -17.1393 -32.1553 -16.9412 -32.345 -16.7422 -32.5331 -16.5424 -32.7197 -16.3419 -32.9046 -16.1405 -33.0881 -15.9384 -33.2699 -15.7355 -33.4502 -15.5319 -33.6289 -15.3276 -33.806 -15.1225 -33.9816 -14.9167 -34.1555 -14.7103 -34.3279 -14.5031 -34.4988 -14.2953 -34.668 -14.0869 -34.8357 -13.8778 -35.0018 -13.668 -35.1663 -13.4577 -35.3293 -13.2468 -35.4907 -13.0352 -35.6505 -12.8231 -35.8087 -12.6104 -35.9654 -12.3972 -36.1205 -12.1834 -36.274 -11.9691 -36.426 -11.7543 -36.5763 -11.539 -36.7252 -11.3232 -36.8724 -11.1069 -37.0181 -10.8901 -37.1622 -10.6729 -37.3048 -10.4552 -37.4458 -10.2371 -37.5852 -10.0185 -37.7231 -9.79959 -37.8594 -9.58022 -37.9942 -9.36046 -38.1274 -9.14032 -38.2591 -8.91981 -38.3892 -8.69893 -38.5178 -8.47771 -38.6448 -8.25614 -38.7702 -8.03425 -38.8942 -7.81203 -39.0166 -7.5895 -39.1374 -7.36668 -39.2567 -7.14356 -39.3745 -6.92017 -39.4907 -6.6965 -39.6054 -6.47258 -39.7186 -6.2484 -39.8302 -6.02399 -39.9403 -5.79934 -40.0489 -5.57448 -40.156 -5.3494 -40.2615 -5.12412 -40.3656 -4.89864 -40.4681 -4.67298 -40.5691 -4.44715 -40.6686 -4.22115 -40.7666 -3.995 -40.8631 -3.7687 -40.9581 -3.54226 -41.0516 -3.31569 -41.1435 -3.089 -41.234 -2.86219 -41.323 -2.63529 -41.4105 -2.40828 -41.4966 -2.18119 -41.5811 -1.95403 -41.6642 -1.72679 -41.7458 -1.49949 -41.8259 -1.27214 -41.9045 -1.04475 -41.9817 -0.817317 -42.0574 -0.589856 -42.1316 -0.362375 -42.2044 -0.134882 -42.2757 0.0926161 -42.3455 0.320111 -42.4139 0.547595 -42.4809 0.77506 -42.5464 1.0025 -42.6104 1.2299 -42.673 1.45727 -42.7342 1.68458 -42.794 1.91184 -42.8523 2.13903 -42.9091 2.36615 -42.9646 2.5932 -43.0186 2.82015 -43.0712 3.04702 -43.1224 3.27378 -43.1722 3.50044 -43.2206 3.72698 -43.2675 3.9534 -43.3131 4.17969 -43.3573 4.40585 -43.4 4.63186 -43.4414 4.85773 -43.4813 5.08344 -43.5199 5.30899 -43.5571 5.53437 -43.5929 5.75957 -43.6273 5.98459 -43.6604 6.20942 -43.6921 6.43406 -43.7224 6.65849 -43.7513 6.88272 -43.7789 7.10673 -43.8051 7.33052 -43.83 7.55409 -43.8535 7.77742 -43.8757 8.00051 -43.8965 8.22335 -43.9159 8.44595 -43.9341 8.66829 -43.9509 8.89036 -43.9663 9.11216 -43.9805 9.33369 -43.9933 9.55493 -44.0047 9.77589 -44.0149 9.99655 -44.0237 10.2169 -44.0312 10.437 -44.0375 10.6567 -44.0424 10.8762 -44.046 11.0953 -44.0483 11.3141 -44.0493 11.5325 -44.049 11.7506 -44.0474 11.9684 -44.0445 12.1858 -44.0404 12.4029 -44.0349 12.6196 -44.0282 12.8359 -44.0203 13.0519 -44.011 13.2675 -44.0005 13.4827 -43.9887 13.6975 -43.9756 13.9119 -43.9613 14.1259 -43.9458 14.3396 -43.929 14.5528 -43.9109 14.7656 -43.8916 14.978 -43.8711 15.1899 -43.8493 15.4015 -43.8263 15.6126 -43.8021 15.8232 -43.7766 16.0334 -43.7499 16.2432 -43.722 16.4525 -43.6929 16.6614 -43.6626 16.8698 -43.631 17.0777 -43.5983 17.2852 -43.5643 17.4922 -43.5292 17.6987 -43.4928 17.9047 -43.4553 18.1102 -43.4166 18.3152 -43.3766 18.5198 -43.3355 18.7238 -43.2933 18.9273 -43.2498 19.1303 -43.2052 19.3328 -43.1594 19.5347 -43.1124 19.7362 -43.0643 19.9371 -43.015 20.1374 -42.9646 20.3372 -42.913 20.5365 -42.8603 20.7352 -42.8064 20.9334 -42.7514 21.131 -42.6952 21.3281 -42.6379 21.5246 -42.5795 21.7205 -42.5199 21.9158 -42.4593 22.1106 -42.3975 22.3047 -42.3345 22.4983 -42.2705 22.6913 -42.2054 22.8837 -42.1391 23.0755 -42.0717 23.2667 -42.0033 23.4573 -41.9337 23.6473 -41.8631 23.8366 -41.7914 24.0253 -41.7185 24.2134 -41.6446 24.4009 -41.5696 24.5878 -41.4936 24.774 -41.4164 24.9595 -41.3382 25.1445 -41.2589 25.3287 -41.1786 25.5123 -41.0972 25.6953 -41.0147 25.8776 -40.9312 26.0592 -40.8467 26.2402 -40.761 26.4205 -40.6744 26.6001 -40.5867 26.7791 -40.498 26.9573 -40.4082 27.1349 -40.3174 27.3118 -40.2256 27.488 -40.1328 27.6634 -40.0389 27.8382 -39.9441 28.0123 -39.8482 28.1857 -39.7513 28.3583 -39.6534 28.5302 -39.5545 28.7015 -39.4546 28.8719 -39.3537 29.0417 -39.2518 29.2107 -39.1489 29.379 -39.0451 29.5466 -38.9402 29.7134 -38.8344 29.8795 -38.7276 30.0448 -38.6198 30.2093 -38.5111 30.3731 -38.4014 30.5362 -38.2908 30.6984 -38.1791 30.86 -38.0666 31.0207 -37.953 31.1807 -37.8386 31.3398 -37.7232 31.4982 -37.6068 31.6559 -37.4895 31.8127 -37.3713 31.9687 -37.2521 32.124 -37.1321 32.2784 -37.0111 32.4321 -36.8891 32.5849 -36.7663 32.7369 -36.6425 32.8881 -36.5179 33.0385 -36.3923 33.1881 -36.2658 33.3369 -36.1385 33.4848 -36.0102 33.6319 -35.8811 33.7781 -35.751 33.9236 -35.6201 34.0682 -35.4883 34.2119 -35.3556 34.3548 -35.222 34.4969 -35.0876 34.6381 -34.9523 34.7784 -34.8161 34.9179 -34.6791 35.0565 -34.5412 35.1942 -34.4025 35.3311 -34.2629 35.4671 -34.1224 35.6023 -33.9812 35.7365 -33.8391 35.8699 -33.6961 36.0024 -33.5523 36.134 -33.4077 36.2647 -33.2623 36.3945 -33.116 36.5234 -32.9689 36.6514 -32.8211 36.7785 -32.6724 36.9047 -32.5229 37.03 -32.3725 37.1544 -32.2214 37.2778 -32.0695 37.4003 -31.9168 37.5219 -31.7633 37.6426 -31.6091 37.7624 -31.454 37.8812 -31.2982 37.999 -31.1416 38.116 -30.9842 38.232 -30.826 38.347 -30.6671 38.4611 -30.5075 38.5742 -30.347 38.6864 -30.1859 38.7976 -30.0239 38.9079 -29.8613 39.0172 -29.6978 39.1255 -29.5337 39.2329 -29.3688 39.3393 -29.2032 39.4447 -29.0368 39.5491 -28.8698 39.6525 -28.702 39.755 -28.5335 39.8564 -28.3643 39.9569 -28.1944 40.0564 -28.0238 40.1549 -27.8524 40.2523 -27.6804 40.3488 -27.5077 40.4442 -27.3343 40.5387 -27.1602 40.6321 -26.9855 40.7245 -26.81 40.8159 -26.6339 40.9062 -26.4571 40.9956 -26.2797 41.0839 -26.1016 41.1711 -25.9228 41.2574 -25.7434 41.3426 -25.5633 41.4267 -25.3826 41.5098 -25.2012 41.5919 -25.0193 41.6729 -24.8366 41.7528 -24.6534 41.8317 -24.4695 41.9095 -24.285 41.9863 -24.0999 42.062 -23.9141 42.1366 -23.7278 42.2102 -23.5408 42.2826 -23.3533 42.354 -23.1651 42.4243 -22.9764 42.4936 -22.7871 42.5617 -22.5972 42.6288 -22.4067 42.6947 -22.2156 42.7596 -22.024 42.8233 -21.8318 42.886 -21.639 42.9475 -21.4457 43.0079 -21.2518 43.0672 -21.0573 43.1254 -20.8623 43.1825 -20.6668 43.2385 -20.4708 43.2933 -20.2742 43.347 -20.077 43.3996 -19.8794 43.4511 -19.6812 43.5014 -19.4825 43.5505 -19.2833 43.5985 -19.0836 43.6454 -18.8834 43.6912 -18.6827 43.7357 -18.4815 43.7791 -18.2798 43.8214 -18.0777 43.8625 -17.875 43.9024 -17.6719 43.9412 -17.4683 43.9788 -17.2642 44.0152 -17.0597 44.0505 -16.8547 44.0846 -16.6493 44.1174 -16.4434 44.1491 -16.2371 44.1797 -16.0303 44.209 -15.8231 44.2371 -15.6155 44.2641 -15.4075 44.2898 -15.199 44.3143 -14.9901 44.3376 -14.7808 44.3598 -14.5712 44.3807 -14.3611 44.4004 -14.1506 44.4188 -13.9397 44.4361 -13.7285 44.4521 -13.5168 44.4669 -13.3048 44.4805 -13.0924 44.4928 -12.8797 44.5039 -12.6666 44.5138 -12.4532 44.5224 -12.2394 44.5298 -12.0252 44.5359 -11.8107 44.5408 -11.5959 44.5444 -11.3808 44.5468 -11.1653 44.5479 -10.9496 44.5478 -10.7335 44.5464 -10.5171 44.5437 -10.3004 44.5397 -10.0834 44.5345 -9.86612 44.528 -9.64856 44.5202 -9.43072 44.5112 -9.21261 44.5008 -8.99424 44.4892 -8.7756 44.4762 -8.55671 44.462 -8.33757 44.4465 -8.11818 44.4297 -7.89856 44.4116 -7.67871 44.3922 -7.45862 44.3714 -7.23832 44.3494 -7.01781 44.326 -6.79708 44.3014 -6.57615 44.2754 -6.35503 44.2481 -6.13372 44.2194 -5.91222 44.1895 -5.69054 44.1582 -5.46869 44.1255 -5.24668 44.0916 -5.02451 44.0563 -4.80218 44.0196 -4.57971 43.9816 -4.3571 43.9423 -4.13435 43.9016 -3.91148 43.8596 -3.68848 43.8162 -3.46538 43.7715 -3.24216 43.7254 -3.01884 43.6779 -2.79543 43.629 -2.57193 43.5788 -2.34835 43.5273 -2.12469 43.4743 -1.90097 43.42 -1.67719 43.3643 -1.45335 43.3072 -1.22947 43.2487 -1.00555 43.1889 -0.781595 43.1276 -0.557616 43.065 -0.333619 43.001 -0.10961 42.9355 --0.114401 42.8687 --0.338409 42.8005 --0.562406 42.7308 --0.786384 42.6598 --1.01034 42.5874 --1.23425 42.5135 --1.45813 42.4382 --1.68196 42.3615 --1.90573 42.2834 --2.12944 42.2039 --2.35308 42.123 --2.57664 42.0406 --2.80011 41.9568 --3.02348 41.8715 --3.24675 41.7849 --3.46991 41.6968 --3.69295 41.6072 --3.91586 41.5162 --4.13864 41.4238 --4.36127 41.33 --4.58375 41.2347 --4.80607 41.1379 --5.02822 41.0397 --5.25019 40.94 --5.47198 40.8389 --5.69357 40.7364 --5.91495 40.6323 --6.13613 40.5269 --6.35708 40.4199 --6.5778 40.3115 --6.79829 40.2016 --7.01852 40.0903 --7.2385 39.9775 --7.45822 39.8632 --7.67765 39.7475 --7.89681 39.6302 --8.11567 39.5115 --8.33422 39.3914 --8.55246 39.2697 --8.77038 39.1466 --8.98797 39.022 --9.20522 38.8959 --9.42212 38.7683 --9.63865 38.6392 --9.85482 38.5087 --10.0706 38.3766 --10.286 38.2431 --10.501 38.108 --10.7156 37.9715 --10.9297 37.8335 --11.1434 37.694 --11.3567 37.553 --11.5696 37.4105 --11.7819 37.2665 --11.9938 37.121 --12.2052 36.974 --12.4162 36.8256 --12.6266 36.6756 --12.8365 36.5241 --13.0458 36.3711 --13.2547 36.2166 --13.4629 36.0606 --13.6707 35.9031 --13.8778 35.7441 --14.0844 35.5836 --14.2903 35.4216 --14.4957 35.258 --14.7004 35.093 --14.9045 34.9265 --15.108 34.7585 --15.3108 34.5889 --15.513 34.4179 --15.7144 34.2454 --15.9152 34.0713 --16.1153 33.8958 --16.3147 33.7187 --16.5133 33.5402 --16.7112 33.3601 --16.9083 33.1785 --17.1047 32.9955 --17.3003 32.8109 --17.4951 32.6249 --17.6891 32.4373 --17.8823 32.2483 --18.0747 32.0577 --18.2662 31.8657 --18.4569 31.6721 --18.6467 31.4771 --18.8356 31.2806 --19.0236 31.0826 --19.2107 30.8831 --19.3969 30.6821 --19.5822 30.4797 --19.7665 30.2758 --19.9498 30.0704 --20.1322 29.8635 --20.3135 29.6551 --20.4939 29.4453 --20.6732 29.234 --20.8515 29.0212 --21.0288 28.807 --21.205 28.5913 --21.3801 28.3742 --21.5541 28.1556 --21.727 27.9355 --21.8987 27.714 --22.0694 27.4911 --22.2389 27.2667 --22.4072 27.0409 --22.5743 26.8137 --22.7402 26.5851 --22.9049 26.355 --23.0684 26.1235 --23.2307 25.8906 --23.3916 25.6563 --23.5513 25.4205 --23.7097 25.1834 --23.8668 24.9449 --24.0225 24.705 --24.177 24.4637 --24.33 24.2211 --24.4817 23.977 --24.632 23.7317 --24.7808 23.4849 --24.9283 23.2368 --25.0743 22.9874 --25.2189 22.7366 --25.3619 22.4845 --25.5035 22.2311 --25.6436 21.9763 --25.7821 21.7203 --25.9191 21.4629 --26.0546 21.2043 --26.1885 20.9443 --26.3207 20.6831 --26.4514 20.4207 --26.5804 20.1569 --26.7078 19.8919 --26.8335 19.6257 --26.9575 19.3583 --27.0799 19.0896 --27.2005 18.8197 --27.3194 18.5486 --27.4365 18.2764 --27.5518 18.0029 --27.6654 17.7283 --27.7772 17.4525 --27.8871 17.1756 --27.9952 16.8975 --28.1014 16.6183 --28.2058 16.338 --28.3082 16.0566 --28.4088 15.7741 --28.5074 15.4906 --28.604 15.206 --28.6987 14.9203 --28.7914 14.6336 --28.8821 14.3459 --28.9708 14.0572 --29.0574 13.7675 --29.142 13.4768 --29.2244 13.1851 --29.3048 12.8925 --29.3831 12.599 --29.4592 12.3046 --29.5332 12.0092 --29.6051 11.713 --29.6747 11.4159 --29.7421 11.118 --29.8073 10.8192 --29.8703 10.5196 --29.931 10.2192 --29.9894 9.91809 --30.0456 9.61618 --30.0994 9.31353 --30.1509 9.01016 --30.2001 8.70609 --30.2468 8.40134 --30.2912 8.09592 --30.3333 7.78987 --30.3729 7.48319 --30.41 7.17592 --30.4447 6.86806 --30.477 6.55966 --30.5067 6.25071 --30.534 5.94126 --30.5588 5.63132 --30.581 5.32091 --30.6007 5.01006 --30.6178 4.69878 --30.6323 4.38712 --30.6442 4.07508 --30.6536 3.76269 --30.6603 3.44999 --30.6643 3.13698 --30.6657 2.82371 --30.6645 2.51019 --30.6606 2.19645 --30.6539 1.88251 --30.6446 1.56841 --30.6325 1.25418 --30.6177 0.939825 --30.6002 0.625391 --30.5798 0.3109 --30.5568 -0.00361878 --30.5309 -0.318137 --30.5022 -0.632626 --30.4707 -0.947056 --30.4364 -1.2614 --30.3993 -1.57562 --30.3593 -1.8897 --30.3165 -2.2036 --30.2708 -2.5173 --30.2222 -2.83075 --30.1708 -3.14393 --30.1165 -3.45682 --30.0593 -3.76937 --29.9991 -4.08156 --29.9361 -4.39335 --29.8701 -4.70471 --29.8013 -5.01562 --29.7294 -5.32602 --29.6547 -5.63591 --29.577 -5.94523 --29.4964 -6.25397 --29.4128 -6.56207 --29.3262 -6.86952 --29.2367 -7.17627 --29.1443 -7.4823 --29.0488 -7.78757 --28.9504 -8.09204 --28.8491 -8.39568 --28.7448 -8.69846 --28.6375 -9.00034 --28.5272 -9.30129 --28.414 -9.60127 --28.2978 -9.90024 --28.1786 -10.1982 --28.0565 -10.4951 --27.9314 -10.7908 --27.8033 -11.0854 --27.6724 -11.3789 --27.5384 -11.6711 --27.4015 -11.9621 --27.2617 -12.2518 --27.119 -12.5402 --26.9733 -12.8272 --26.8247 -13.1129 --26.6732 -13.3971 --26.5188 -13.6799 --26.3615 -13.9611 --26.2013 -14.2409 --26.0383 -14.5191 --25.8724 -14.7957 --25.7037 -15.0706 --25.5321 -15.344 --25.3577 -15.6156 --25.1805 -15.8855 --25.0005 -16.1536 --24.8177 -16.4199 --24.6321 -16.6844 --24.4438 -16.947 --24.2528 -17.2078 --24.0591 -17.4666 --23.8626 -17.7234 --23.6635 -17.9783 --23.4617 -18.2311 --23.2573 -18.4819 --23.0502 -18.7306 --22.8406 -18.9772 --22.6283 -19.2216 --22.4135 -19.4639 --22.1962 -19.704 --21.9764 -19.9418 --21.754 -20.1774 --21.5292 -20.4107 --21.302 -20.6417 --21.0723 -20.8703 --20.8402 -21.0966 --20.6058 -21.3204 --20.369 -21.5419 --20.13 -21.7608 --19.8886 -21.9774 --19.645 -22.1914 --19.3991 -22.4029 --19.151 -22.6118 --18.9008 -22.8182 --18.6484 -23.022 --18.3939 -23.2232 --18.1373 -23.4217 --17.8786 -23.6176 --17.6179 -23.8109 --17.3553 -24.0014 --17.0906 -24.1892 --16.8241 -24.3743 --16.5556 -24.5566 --16.2853 -24.7362 --16.0131 -24.913 --15.7392 -25.087 --15.4635 -25.2581 --15.186 -25.4265 --14.9068 -25.592 --14.626 -25.7546 --14.3436 -25.9144 --14.0595 -26.0713 --13.7739 -26.2252 --13.4868 -26.3763 --13.1981 -26.5245 --12.908 -26.6697 --12.6165 -26.812 --12.3236 -26.9513 --12.0294 -27.0877 --11.7338 -27.2211 --11.437 -27.3516 --11.1389 -27.479 --10.8396 -27.6035 --10.5391 -27.725 --10.2375 -27.8435 --9.93474 -27.959 --9.63096 -28.0715 --9.32614 -28.181 --9.02033 -28.2875 --8.71356 -28.391 --8.40587 -28.4915 --8.09728 -28.589 --7.78785 -28.6834 --7.47759 -28.7748 --7.16656 -28.8633 --6.85478 -28.9487 --6.54228 -29.0311 --6.22911 -29.1105 --5.9153 -29.1869 --5.60087 -29.2603 --5.28588 -29.3307 --4.97034 -29.3982 --4.6543 -29.4626 --4.33779 -29.5241 --4.02084 -29.5825 --3.70349 -29.6381 --3.38577 -29.6906 --3.06771 -29.7402 --2.74935 -29.7869 --2.43072 -29.8306 --2.11184 -29.8714 --1.79276 -29.9093 --1.47351 -29.9442 --1.15411 -29.9763 --0.834605 -30.0055 --0.515016 -30.0317 --0.195378 -30.0552 -0.124279 -30.0757 -0.443925 -30.0934 -0.763529 -30.1083 -1.08306 -30.1204 -1.40249 -30.1296 -1.7218 -30.1361 -2.04094 -30.1398 -2.3599 -30.1407 -2.67864 -30.1388 -2.99714 -30.1342 -3.31536 -30.1269 -3.63329 -30.1168 -3.95089 -30.1041 -4.26815 -30.0887 -4.58502 -30.0706 -4.90149 -30.0499 -5.21753 -30.0265 -5.53311 -30.0005 -5.84822 -29.9719 -6.16281 -29.9407 -6.47688 -29.907 -6.7904 -29.8706 -7.10334 -29.8318 -7.41568 -29.7904 -7.7274 -29.7466 -8.03847 -29.7002 -8.34887 -29.6514 -8.65859 -29.6001 -8.96759 -29.5464 -9.27586 -29.4903 -9.58338 -29.4318 -9.89012 -29.3709 -10.1961 -29.3076 -10.5012 -29.242 -10.8055 -29.1741 -11.1089 -29.1039 -11.4115 -29.0314 -11.7132 -28.9566 -12.014 -28.8796 -12.3138 -28.8004 -12.6127 -28.7189 -12.9107 -28.6353 -13.2076 -28.5494 -13.5036 -28.4615 -13.7985 -28.3714 -14.0925 -28.2791 -14.3853 -28.1848 -14.6772 -28.0884 -14.9679 -27.99 -15.2576 -27.8895 -15.5461 -27.787 -15.8335 -27.6825 -16.1198 -27.576 -16.405 -27.4675 -16.689 -27.3571 -16.9718 -27.2448 -17.2534 -27.1306 -17.5339 -27.0145 -17.8131 -26.8965 -18.0911 -26.7767 -18.3678 -26.655 -18.6434 -26.5315 -18.9176 -26.4063 -19.1906 -26.2793 -19.4623 -26.1505 -19.7327 -26.02 -20.0018 -25.8878 -20.2697 -25.7538 -20.5361 -25.6182 -20.8013 -25.481 -21.0651 -25.3421 -21.3276 -25.2016 -21.5887 -25.0595 -21.8485 -24.9157 -22.1068 -24.7705 -22.3638 -24.6236 -22.6194 -24.4753 -22.8736 -24.3254 -23.1264 -24.1741 -23.3778 -24.0212 -23.6278 -23.8669 -23.8763 -23.7112 -24.1234 -23.554 -24.3691 -23.3954 -24.6133 -23.2355 -24.8561 -23.0741 -25.0974 -22.9115 -25.3372 -22.7474 -25.5756 -22.5821 -25.8125 -22.4155 -26.0479 -22.2475 -26.2818 -22.0783 -26.5143 -21.9079 -26.7452 -21.7362 -26.9747 -21.5633 -27.2026 -21.3892 -27.429 -21.2139 -27.6539 -21.0374 -27.8774 -20.8598 -28.0992 -20.681 -28.3196 -20.5012 -28.5384 -20.3202 -28.7557 -20.1381 -28.9715 -19.955 -29.1857 -19.7708 -29.3984 -19.5855 -29.6096 -19.3992 -29.8192 -19.212 -30.0272 -19.0237 -30.2337 -18.8344 -30.4387 -18.6442 -30.6421 -18.453 -30.8439 -18.2609 -31.0442 -18.0678 -31.243 -17.8739 -31.4401 -17.679 -31.6357 -17.4833 -31.8298 -17.2867 -32.0222 -17.0893 -32.2131 -16.891 -32.4025 -16.6919 -32.5902 -16.492 -32.7764 -16.2913 -32.961 -16.0898 -33.1441 -15.8876 -33.3256 -15.6846 -33.5055 -15.4808 -33.6838 -15.2763 -33.8606 -15.0712 -34.0358 -14.8653 -34.2094 -14.6587 -34.3814 -14.4515 -34.5519 -14.2435 -34.7208 -14.035 -34.8881 -13.8258 -35.0539 -13.616 -35.218 -13.4055 -35.3806 -13.1945 -35.5417 -12.9829 -35.7011 -12.7707 -35.859 -12.558 -36.0153 -12.3447 -36.1701 -12.1308 -36.3232 -11.9165 -36.4748 -11.7016 -36.6249 -11.4862 -36.7734 -11.2703 -36.9203 -11.054 -37.0656 -10.8372 -37.2094 -10.6199 -37.3516 -10.4022 -37.4923 -10.184 -37.6314 -9.96543 -37.7689 -9.74643 -37.9049 -9.52704 -38.0394 -9.30725 -38.1722 -9.08709 -38.3036 -8.86655 -38.4334 -8.64566 -38.5616 -8.42442 -38.6883 -8.20284 -38.8134 -7.98093 -38.937 -7.75871 -39.0591 -7.53618 -39.1796 -7.31335 -39.2986 -7.09024 -39.416 -6.86684 -39.532 -6.64319 -39.6463 -6.41927 -39.7592 -6.19511 -39.8705 -5.9707 -39.9803 -5.74607 -40.0886 -5.52123 -40.1954 -5.29617 -40.3006 -5.07091 -40.4044 -4.84546 -40.5066 -4.61983 -40.6073 -4.39403 -40.7065 -4.16806 -40.8042 -3.94194 -40.9004 -3.71568 -40.9951 -3.48928 -41.0883 -3.26275 -41.18 -3.0361 -41.2702 -2.80934 -41.3589 -2.58249 -41.4461 -2.35553 -41.5319 -2.1285 -41.6161 -1.90138 -41.6989 -1.6742 -41.7802 -1.44696 -41.86 -1.21967 -41.9384 -0.99234 -42.0153 -0.764972 -42.0907 -0.537576 -42.1647 -0.310162 -42.2372 -0.0827375 -42.3082 0.14469 -42.3778 0.372113 -42.446 0.599523 -42.5126 0.826912 -42.5779 1.05427 -42.6417 1.2816 -42.7041 1.50888 -42.765 1.73611 -42.8245 1.96329 -42.8825 2.1904 -42.9392 2.41743 -42.9944 2.64439 -43.0482 2.87125 -43.1005 3.09803 -43.1515 3.3247 -43.201 3.55126 -43.2492 3.77771 -43.2959 4.00403 -43.3412 4.23022 -43.3852 4.45628 -43.4277 4.6822 -43.4688 4.90796 -43.5086 5.13357 -43.5469 5.35901 -43.5839 5.58428 -43.6195 5.80938 -43.6537 6.03429 -43.6865 6.25901 -43.718 6.48354 -43.7481 6.70786 -43.7768 6.93198 -43.8042 7.15588 -43.8302 7.37955 -43.8549 7.603 -43.8782 7.82621 -43.9002 8.04919 -43.9208 8.27191 -43.9401 8.49439 -43.958 8.7166 -43.9746 8.93855 -43.9899 9.16023 -44.0038 9.38164 -44.0164 9.60276 -44.0277 9.82359 -44.0377 10.0441 -44.0464 10.2644 -44.0537 10.4843 -44.0597 10.7039 -44.0645 10.9232 -44.0679 11.1422 -44.07 11.3609 -44.0709 11.5792 -44.0704 11.7972 -44.0687 12.0148 -44.0656 12.2321 -44.0613 12.449 -44.0557 12.6656 -44.0489 12.8818 -44.0407 13.0976 -44.0313 13.313 -44.0207 13.5281 -44.0087 13.7428 -43.9955 13.9571 -43.9811 14.171 -43.9654 14.3845 -43.9484 14.5975 -43.9303 14.8102 -43.9108 15.0224 -43.8902 15.2343 -43.8682 15.4457 -43.8451 15.6566 -43.8207 15.8671 -43.7952 16.0772 -43.7683 16.2869 -43.7403 16.496 -43.7111 16.7048 -43.6806 16.913 -43.649 17.1208 -43.6161 17.3281 -43.582 17.535 -43.5468 17.7413 -43.5103 17.9472 -43.4726 18.1526 -43.4338 18.3574 -43.3938 18.5618 -43.3526 18.7657 -43.3102 18.9691 -43.2667 19.1719 -43.2219 19.3743 -43.176 19.5761 -43.129 19.7774 -43.0808 19.9781 -43.0314 20.1783 -42.9809 20.378 -42.9292 20.5771 -42.8764 20.7757 -42.8224 20.9737 -42.7673 21.1712 -42.7111 21.3681 -42.6537 21.5644 -42.5952 21.7602 -42.5356 21.9554 -42.4748 22.15 -42.4129 22.344 -42.35 22.5375 -42.2859 22.7303 -42.2206 22.9226 -42.1543 23.1142 -42.0869 23.3053 -42.0184 23.4957 -41.9488 23.6856 -41.8781 23.8748 -41.8063 24.0633 -41.7334 24.2513 -41.6594 24.4386 -41.5844 24.6253 -41.5083 24.8114 -41.4311 24.9968 -41.3528 25.1816 -41.2735 25.3657 -41.1931 25.5492 -41.1117 25.732 -41.0292 25.9142 -40.9456 26.0957 -40.861 26.2765 -40.7754 26.4567 -40.6887 26.6362 -40.601 26.815 -40.5122 26.9931 -40.4225 27.1705 -40.3317 27.3473 -40.2398 27.5233 -40.147 27.6987 -40.0531 27.8733 -39.9582 28.0473 -39.8623 28.2205 -39.7654 28.393 -39.6675 28.5648 -39.5686 28.7359 -39.4686 28.9062 -39.3677 29.0759 -39.2659 29.2448 -39.163 29.4129 -39.0591 29.5803 -38.9543 29.747 -38.8484 29.913 -38.7416 30.0781 -38.6339 30.2426 -38.5252 30.4063 -38.4155 30.5692 -38.3048 30.7313 -38.1932 30.8927 -38.0806 31.0533 -37.9671 31.2132 -37.8527 31.3722 -37.7373 31.5305 -37.6209 31.688 -37.5037 31.8447 -37.3855 32.0006 -37.2663 32.1557 -37.1463 32.3101 -37.0253 32.4636 -36.9034 32.6163 -36.7806 32.7682 -36.6569 32.9193 -36.5322 33.0696 -36.4067 33.2191 -36.2803 33.3677 -36.1529 33.5155 -36.0247 33.6625 -35.8956 33.8086 -35.7656 33.954 -35.6347 34.0984 -35.5029 34.2421 -35.3703 34.3849 -35.2367 34.5268 -35.1023 34.6679 -34.9671 34.8081 -34.831 34.9475 -34.694 35.086 -34.5562 35.2237 -34.4175 35.3605 -34.2779 35.4964 -34.1376 35.6314 -33.9963 35.7655 -33.8543 35.8988 -33.7114 36.0312 -33.5677 36.1627 -33.4231 36.2933 -33.2777 36.423 -33.1316 36.5518 -32.9845 36.6798 -32.8367 36.8068 -32.6881 36.9329 -32.5386 37.0581 -32.3884 37.1823 -32.2374 37.3057 -32.0855 37.4281 -31.9329 37.5497 -31.7795 37.6703 -31.6253 37.7899 -31.4703 37.9086 -31.3146 38.0264 -31.158 38.1433 -31.0007 38.2592 -30.8427 38.3742 -30.6838 38.4882 -30.5242 38.6012 -30.3639 38.7134 -30.2028 38.8245 -30.041 38.9347 -29.8784 39.0439 -29.7151 39.1522 -29.551 39.2595 -29.3862 39.3658 -29.2207 39.4711 -29.0544 39.5755 -28.8874 39.6788 -28.7198 39.7812 -28.5514 39.8826 -28.3822 39.983 -28.2124 40.0824 -28.0419 40.1808 -27.8707 40.2783 -27.6988 40.3747 -27.5261 40.4701 -27.3528 40.5644 -27.1789 40.6578 -27.0042 40.7502 -26.8289 40.8415 -26.6529 40.9318 -26.4762 41.0211 -26.2988 41.1094 -26.1208 41.1966 -25.9422 41.2828 -25.7629 41.3679 -25.5829 41.452 -25.4023 41.5351 -25.2211 41.6171 -25.0392 41.6981 -24.8567 41.778 -24.6735 41.8568 -24.4898 41.9346 -24.3054 42.0113 -24.1204 42.087 -23.9348 42.1616 -23.7485 42.2351 -23.5617 42.3076 -23.3743 42.3789 -23.1862 42.4492 -22.9976 42.5184 -22.8084 42.5865 -22.6186 42.6536 -22.4283 42.7195 -22.2373 42.7843 -22.0458 42.8481 -21.8537 42.9107 -21.6611 42.9722 -21.4679 43.0327 -21.2741 43.092 -21.0798 43.1502 -20.8849 43.2072 -20.6895 43.2632 -20.4936 43.318 -20.2971 43.3717 -20.1001 43.4243 -19.9026 43.4757 -19.7046 43.5261 -19.506 43.5752 -19.3069 43.6233 -19.1074 43.6701 -18.9073 43.7159 -18.7067 43.7605 -18.5057 43.8039 -18.3041 43.8462 -18.1021 43.8873 -17.8995 43.9272 -17.6965 43.966 -17.4931 44.0036 -17.2891 44.0401 -17.0848 44.0753 -16.8799 44.1094 -16.6746 44.1423 -16.4689 44.1741 -16.2627 44.2046 -16.056 44.234 -15.849 44.2621 -15.6415 44.2891 -15.4336 44.3149 -15.2253 44.3394 -15.0165 44.3628 -14.8074 44.3849 -14.5978 44.4059 -14.3879 44.4256 -14.1775 44.4441 -13.9668 44.4614 -13.7556 44.4775 -13.5441 44.4924 -13.3323 44.506 -13.12 44.5184 -12.9074 44.5295 -12.6945 44.5394 -12.4811 44.5481 -12.2675 44.5556 -12.0535 44.5618 -11.8391 44.5667 -11.6244 44.5704 -11.4094 44.5728 -11.1941 44.574 -10.9785 44.5739 -10.7625 44.5726 -10.5462 44.57 -10.3297 44.5661 -10.1128 44.561 -9.89567 44.5545 -9.67824 44.5468 -9.46053 44.5378 -9.24255 44.5276 -9.0243 44.516 -8.80579 44.5032 -8.58702 44.4891 -8.36801 44.4736 -8.14875 44.4569 -7.92925 44.4389 -7.70952 44.4196 -7.48956 44.3989 -7.26938 44.377 -7.04899 44.3537 -6.82839 44.3292 -6.60758 44.3033 -6.38658 44.2761 -6.16539 44.2476 -5.94401 44.2177 -5.72245 44.1865 -5.50072 44.154 -5.27882 44.1202 -5.05677 44.085 -4.83456 44.0485 -4.6122 44.0106 -4.3897 43.9714 -4.16707 43.9308 -3.94431 43.8889 -3.72142 43.8457 -3.49843 43.801 -3.27532 43.7551 -3.05211 43.7077 -2.8288 43.659 -2.60541 43.609 -2.38194 43.5575 -2.15839 43.5047 -1.93477 43.4505 -1.71109 43.395 -1.48735 43.338 -1.26357 43.2797 -1.03975 43.22 -0.815891 43.1589 -0.592008 43.0965 -0.368105 43.0326 -0.144191 42.9673 --0.079728 42.9007 --0.303645 42.8326 --0.527551 42.7631 --0.751441 42.6922 --0.975306 42.62 --1.19914 42.5463 --1.42293 42.4712 --1.64668 42.3947 --1.87037 42.3167 --2.094 42.2374 --2.31755 42.1566 --2.54103 42.0744 --2.76443 41.9908 --2.98773 41.9058 --3.21093 41.8193 --3.43401 41.7314 --3.65698 41.642 --3.87983 41.5512 --4.10254 41.459 --4.3251 41.3654 --4.54752 41.2703 --4.76978 41.1737 --4.99187 41.0757 --5.21378 40.9763 --5.43551 40.8754 --5.65705 40.773 --5.87838 40.6692 --6.0995 40.5639 --6.32041 40.4572 --6.54108 40.349 --6.76152 40.2394 --6.98171 40.1282 --7.20165 40.0157 --7.42132 39.9016 --7.64072 39.7861 --7.85984 39.6691 --8.07867 39.5506 --8.29719 39.4307 --8.51541 39.3093 --8.7333 39.1864 --8.95086 39.062 --9.16809 38.9361 --9.38497 38.8088 --9.60148 38.68 --9.81763 38.5497 --10.0334 38.4179 --10.2488 38.2846 --10.4638 38.1498 --10.6783 38.0135 --10.8925 37.8758 --11.1062 37.7365 --11.3195 37.5958 --11.5324 37.4536 --11.7447 37.3098 --11.9566 37.1646 --12.1681 37.0179 --12.379 36.8697 --12.5894 36.7199 --12.7993 36.5687 --13.0087 36.416 --13.2176 36.2618 --13.4259 36.106 --13.6336 35.9488 --13.8408 35.7901 --14.0474 35.6299 --14.2534 35.4681 --14.4588 35.3049 --14.6636 35.1402 --14.8678 34.9739 --15.0713 34.8062 --15.2742 34.6369 --15.4764 34.4662 --15.6779 34.2939 --15.8787 34.1202 --16.0789 33.9449 --16.2783 33.7682 --16.477 33.5899 --16.675 33.4102 --16.8722 33.2289 --17.0687 33.0461 --17.2644 32.8619 --17.4593 32.6761 --17.6534 32.4889 --17.8467 32.3001 --18.0392 32.1099 --18.2308 31.9182 --18.4216 31.7249 --18.6115 31.5302 --18.8005 31.334 --18.9887 31.1363 --19.1759 30.9372 --19.3622 30.7365 --19.5476 30.5344 --19.732 30.3307 --19.9155 30.1256 --20.098 29.9191 --20.2795 29.711 --20.46 29.5015 --20.6395 29.2905 --20.818 29.0781 --20.9954 28.8642 --21.1718 28.6488 --21.347 28.432 --21.5212 28.2137 --21.6943 27.994 --21.8663 27.7729 --22.0371 27.5502 --22.2068 27.3262 --22.3753 27.1007 --22.5426 26.8738 --22.7088 26.6455 --22.8737 26.4157 --23.0374 26.1845 --23.1998 25.9519 --23.361 25.718 --23.5209 25.4826 --23.6796 25.2458 --23.8369 25.0076 --23.9929 24.768 --24.1476 24.527 --24.3009 24.2847 --24.4528 24.041 --24.6034 23.7959 --24.7525 23.5495 --24.9002 23.3017 --25.0465 23.0526 --25.1914 22.8022 --25.3347 22.5504 --25.4766 22.2973 --25.617 22.0428 --25.7558 21.7871 --25.8932 21.5301 --26.0289 21.2717 --26.1631 21.0121 --26.2957 20.7512 --26.4267 20.489 --26.5561 20.2256 --26.6838 19.961 --26.8099 19.695 --26.9343 19.4279 --27.057 19.1595 --27.1779 18.89 --27.2972 18.6192 --27.4147 18.3472 --27.5304 18.074 --27.6444 17.7997 --27.7565 17.5242 --27.8669 17.2476 --27.9754 16.9698 --28.082 16.6909 --28.1868 16.4109 --28.2896 16.1298 --28.3906 15.8476 --28.4897 15.5643 --28.5867 15.28 --28.6819 14.9946 --28.775 14.7082 --28.8662 14.4207 --28.9553 14.1323 --29.0424 13.8428 --29.1274 13.5524 --29.2104 13.261 --29.2913 12.9686 --29.37 12.6754 --29.4467 12.3812 --29.5212 12.0861 --29.5935 11.7901 --29.6637 11.4932 --29.7316 11.1955 --29.7973 10.897 --29.8608 10.5976 --29.9221 10.2975 --29.9811 9.99655 --30.0378 9.69485 --30.0921 9.39241 --30.1442 9.08924 --30.1939 8.78537 --30.2413 8.48081 --30.2863 8.17558 --30.3289 7.86971 --30.3691 7.56322 --30.4068 7.25611 --30.4421 6.94843 --30.475 6.64019 --30.5054 6.3314 --30.5333 6.0221 --30.5586 5.71231 --30.5815 5.40204 --30.6018 5.09132 --30.6196 4.78018 --30.6347 4.46864 --30.6473 4.15672 --30.6573 3.84445 --30.6647 3.53184 --30.6694 3.21894 --30.6715 2.90576 --30.6709 2.59232 --30.6677 2.27866 --30.6617 1.9648 --30.6531 1.65077 --30.6417 1.33659 --30.6276 1.02229 --30.6108 0.707904 --30.5912 0.393451 --30.5688 0.0789631 --30.5437 -0.235532 --30.5158 -0.550005 --30.485 -0.864428 --30.4515 -1.17877 --30.4151 -1.493 --30.3759 -1.80709 --30.3338 -2.12102 --30.2889 -2.43474 --30.2411 -2.74823 --30.1904 -3.06146 --30.1368 -3.3744 --30.0804 -3.68701 --30.021 -3.99927 --29.9588 -4.31114 --29.8936 -4.62259 --29.8255 -4.93359 --29.7545 -5.2441 --29.6805 -5.5541 --29.6036 -5.86355 --29.5238 -6.17241 --29.441 -6.48066 --29.3553 -6.78826 --29.2666 -7.09517 --29.1749 -7.40136 --29.0803 -7.70681 --28.9827 -8.01147 --28.8822 -8.3153 --28.7787 -8.61829 --28.6722 -8.92038 --28.5627 -9.22155 --28.4503 -9.52177 --28.3349 -9.82099 --28.2166 -10.1192 --28.0953 -10.4163 --27.971 -10.7123 --27.8438 -11.0072 --27.7136 -11.301 --27.5805 -11.5935 --27.4445 -11.8848 --27.3055 -12.1748 --27.1635 -12.4635 --27.0187 -12.7509 --26.8709 -13.0369 --26.7202 -13.3215 --26.5666 -13.6047 --26.4102 -13.8863 --26.2508 -14.1665 --26.0886 -14.4451 --25.9235 -14.7221 --25.7556 -14.9975 --25.5848 -15.2712 --25.4112 -15.5433 --25.2348 -15.8136 --25.0556 -16.0822 --24.8736 -16.349 --24.6889 -16.6139 --24.5014 -16.8771 --24.3111 -17.1383 --24.1182 -17.3976 --23.9225 -17.655 --23.7242 -17.9104 --23.5232 -18.1637 --23.3195 -18.4151 --23.1132 -18.6643 --22.9043 -18.9115 --22.6928 -19.1565 --22.4788 -19.3994 --22.2622 -19.64 --22.0431 -19.8785 --21.8215 -20.1147 --21.5974 -20.3486 --21.3709 -20.5802 --21.142 -20.8094 --20.9106 -21.0363 --20.6769 -21.2608 --20.4408 -21.4829 --20.2024 -21.7026 --19.9617 -21.9198 --19.7188 -22.1345 --19.4736 -22.3467 --19.2262 -22.5563 --18.9766 -22.7634 --18.7248 -22.9679 --18.471 -23.1698 --18.215 -23.3691 --17.957 -23.5657 --17.6969 -23.7597 --17.4349 -23.9509 --17.1708 -24.1395 --16.9049 -24.3253 --16.637 -24.5084 --16.3672 -24.6888 --16.0956 -24.8663 --15.8222 -25.0411 --15.5471 -25.2131 --15.2701 -25.3822 --14.9915 -25.5485 --14.7112 -25.7119 --14.4293 -25.8725 --14.1457 -26.0302 --13.8606 -26.185 --13.5739 -26.3369 --13.2858 -26.4859 --12.9961 -26.6319 --12.7051 -26.775 --12.4126 -26.9152 --12.1188 -27.0524 --11.8236 -27.1867 --11.5272 -27.318 --11.2295 -27.4463 --10.9306 -27.5717 --10.6305 -27.694 --10.3292 -27.8134 --10.0269 -27.9298 --9.72345 -28.0431 --9.41898 -28.1535 --9.11349 -28.2609 --8.80704 -28.3652 --8.49966 -28.4666 --8.19137 -28.5649 --7.88223 -28.6603 --7.57225 -28.7526 --7.26148 -28.8419 --6.94996 -28.9282 --6.63771 -29.0115 --6.32478 -29.0918 --6.01119 -29.1691 --5.69699 -29.2434 --5.3822 -29.3147 --5.06686 -29.383 --4.75101 -29.4483 --4.43468 -29.5107 --4.1179 -29.5701 --3.8007 -29.6265 --3.48313 -29.6799 --3.16521 -29.7304 --2.84697 -29.778 --2.52846 -29.8226 --2.2097 -29.8643 --1.89072 -29.903 --1.57155 -29.9389 --1.25223 -29.9718 --0.932797 -30.0019 --0.61327 -30.029 --0.293684 -30.0533 -0.0259299 -30.0748 -0.345541 -30.0934 -0.66512 -30.1091 -0.984636 -30.1221 -1.30406 -30.1322 -1.62336 -30.1395 -1.94252 -30.144 -2.26149 -30.1458 -2.58026 -30.1448 -2.89879 -30.1411 -3.21707 -30.1346 -3.53505 -30.1254 -3.85271 -30.1135 -4.17003 -30.0989 -4.48699 -30.0817 -4.80354 -30.0618 -5.11968 -30.0392 -5.43536 -30.0141 -5.75058 -29.9863 -6.0653 -29.9559 -6.3795 -29.923 -6.69315 -29.8875 -7.00623 -29.8495 -7.31872 -29.8089 -7.6306 -29.7658 -7.94184 -29.7203 -8.25241 -29.6722 -8.56231 -29.6218 -8.8715 -29.5688 -9.17997 -29.5135 -9.48768 -29.4558 -9.79464 -29.3957 -10.1008 -29.3332 -10.4062 -29.2683 -10.7107 -29.2012 -11.0144 -29.1317 -11.3172 -29.06 -11.6191 -28.9859 -11.9201 -28.9097 -12.2203 -28.8312 -12.5194 -28.7504 -12.8176 -28.6675 -13.1149 -28.5824 -13.4111 -28.4952 -13.7064 -28.4058 -14.0006 -28.3143 -14.2938 -28.2206 -14.5859 -28.1249 -14.877 -28.0272 -15.1669 -27.9274 -15.4558 -27.8256 -15.7436 -27.7217 -16.0302 -27.6159 -16.3157 -27.5081 -16.6 -27.3984 -16.8832 -27.2867 -17.1652 -27.1732 -17.446 -27.0577 -17.7256 -26.9404 -18.0039 -26.8212 -18.2811 -26.7002 -18.557 -26.5774 -18.8316 -26.4527 -19.105 -26.3263 -19.3771 -26.1982 -19.6479 -26.0683 -19.9174 -25.9367 -20.1856 -25.8033 -20.4525 -25.6683 -20.7181 -25.5317 -20.9823 -25.3934 -21.2452 -25.2534 -21.5067 -25.1119 -21.7669 -24.9687 -22.0257 -24.824 -22.2831 -24.6777 -22.5392 -24.5299 -22.7938 -24.3806 -23.047 -24.2298 -23.2989 -24.0775 -23.5493 -23.9237 -23.7983 -23.7685 -24.0458 -23.6119 -24.292 -23.4538 -24.5366 -23.2944 -24.7799 -23.1336 -25.0216 -22.9714 -25.262 -22.8079 -25.5008 -22.643 -25.7382 -22.4769 -25.9741 -22.3094 -26.2085 -22.1407 -26.4414 -21.9707 -26.6728 -21.7995 -26.9028 -21.6271 -27.1312 -21.4534 -27.3581 -21.2786 -27.5836 -21.1026 -27.8075 -20.9254 -28.0298 -20.7471 -28.2507 -20.5677 -28.4701 -20.3871 -28.6879 -20.2055 -28.9041 -20.0227 -29.1189 -19.839 -29.3321 -19.6541 -29.5438 -19.4683 -29.7539 -19.2814 -29.9625 -19.0935 -30.1695 -18.9046 -30.375 -18.7148 -30.5789 -18.524 -30.7813 -18.3323 -30.9821 -18.1396 -31.1813 -17.946 -31.379 -17.7515 -31.5752 -17.5562 -31.7698 -17.36 -31.9628 -17.1629 -32.1542 -16.965 -32.3441 -16.7662 -32.5324 -16.5666 -32.7191 -16.3663 -32.9043 -16.1651 -33.0879 -15.9632 -33.2699 -15.7605 -33.4504 -15.5571 -33.6293 -15.353 -33.8066 -15.1481 -33.9823 -14.9425 -34.1565 -14.7363 -34.3291 -14.5293 -34.5001 -14.3217 -34.6696 -14.1135 -34.8374 -13.9046 -35.0037 -13.695 -35.1685 -13.4849 -35.3316 -13.2741 -& diff --git a/libs/numeric/odeint/examples/solar_system.cpp b/libs/numeric/odeint/examples/solar_system.cpp deleted file mode 100644 index 3586d5b86..000000000 --- a/libs/numeric/odeint/examples/solar_system.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/* Boost libs/numeric/odeint/examples/solar_system.cpp - - Copyright 2010-2012 Karsten Ahnert - Copyright 2011 Mario Mulansky - - Solar system example for Hamiltonian stepper - - Distributed under the 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 -#include - -#include - -#include "point_type.hpp" - -//[ container_type_definition -// we simulate 5 planets and the sun -const size_t n = 6; - -typedef point< double , 3 > point_type; -typedef boost::array< point_type , n > container_type; -typedef boost::array< double , n > mass_type; -//] - - - - - - - -//[ coordinate_function -const double gravitational_constant = 2.95912208286e-4; - -struct solar_system_coor -{ - const mass_type &m_masses; - - solar_system_coor( const mass_type &masses ) : m_masses( masses ) { } - - void operator()( const container_type &p , container_type &dqdt ) const - { - for( size_t i=0 ; i - void operator()( const State &x , double t ) const - { - container_type &q = x.first; - m_out << t; - for( size_t i=0 ; i stepper_type; - const double dt = 100.0; - - integrate_const( - stepper_type() , - make_pair( solar_system_coor( masses ) , solar_system_momentum( masses ) ) , - make_pair( boost::ref( q ) , boost::ref( p ) ) , - 0.0 , 200000.0 , dt , streaming_observer( cout ) ); - //] - - - return 0; -} - - -/* -Plot with gnuplot: -p "solar_system.dat" u 2:4 w l,"solar_system.dat" u 5:7 w l,"solar_system.dat" u 8:10 w l,"solar_system.dat" u 11:13 w l,"solar_system.dat" u 14:16 w l,"solar_system.dat" u 17:19 w l - */ diff --git a/libs/numeric/odeint/examples/stepper_details.cpp b/libs/numeric/odeint/examples/stepper_details.cpp deleted file mode 100644 index d4ae8bd1e..000000000 --- a/libs/numeric/odeint/examples/stepper_details.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/* - * stepper_details.cpp - * - * This example demonstrates some details about the steppers in odeint. - * - * - * Copyright 2011-2012 Karsten Ahnert - * Copyright 2012 Mario Mulansky - * Copyright 2013 Pascal Germroth - * - * Distributed under the 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 -#include -#include -#include - -using namespace std; -using namespace boost::numeric::odeint; - -const size_t N = 3; - -typedef boost::array< double , N > state_type; - -//[ system_function_structure -void sys( const state_type & /*x*/ , state_type & /*dxdt*/ , const double /*t*/ ) -{ - // ... -} -//] - -void sys1( const state_type &/*x*/ , state_type &/*dxdt*/ , const double /*t*/ ) -{ -} - -void sys2( const state_type &/*x*/ , state_type &/*dxdt*/ , const double /*t*/ ) -{ -} - - -//[ symplectic_stepper_detail_system_function -typedef boost::array< double , 1 > vector_type; - - -struct harm_osc_f1 -{ - void operator()( const vector_type &p , vector_type &dqdt ) - { - dqdt[0] = p[0]; - } -}; - -struct harm_osc_f2 -{ - void operator()( const vector_type &q , vector_type &dpdt ) - { - dpdt[0] = -q[0]; - } -}; -//] - -//[ symplectic_stepper_detail_system_class -struct harm_osc -{ - void f1( const vector_type &p , vector_type &dqdt ) const - { - dqdt[0] = p[0]; - } - - void f2( const vector_type &q , vector_type &dpdt ) const - { - dpdt[0] = -q[0]; - } -}; -//] - -int main( int argc , char **argv ) -{ - using namespace std; - - // Explicit stepper example - { - double t( 0.0 ) , dt( 0.1 ); - state_type in , out , dxdtin , inout; - //[ explicit_stepper_detail_example - runge_kutta4< state_type > rk; - rk.do_step( sys1 , inout , t , dt ); // In-place transformation of inout - rk.do_step( sys2 , inout , t , dt ); // call with different system: Ok - rk.do_step( sys1 , in , t , out , dt ); // Out-of-place transformation - rk.do_step( sys1 , inout , dxdtin , t , dt ); // In-place tranformation of inout - rk.do_step( sys1 , in , dxdtin , t , out , dt ); // Out-of-place transformation - //] - } - - - - // FSAL stepper example - { - double t( 0.0 ) , dt( 0.1 ); - state_type in , in2 , in3 , out , dxdtin , dxdtout , inout , dxdtinout; - //[ fsal_stepper_detail_example - runge_kutta_dopri5< state_type > rk; - rk.do_step( sys1 , in , t , out , dt ); - rk.do_step( sys2 , in , t , out , dt ); // DONT do this, sys1 is assumed - - rk.do_step( sys2 , in2 , t , out , dt ); - rk.do_step( sys2 , in3 , t , out , dt ); // DONT do this, in2 is assumed - - rk.do_step( sys1 , inout , dxdtinout , t , dt ); - rk.do_step( sys2 , inout , dxdtinout , t , dt ); // Ok, internal derivative is not used, dxdtinout is updated - - rk.do_step( sys1 , in , dxdtin , t , out , dxdtout , dt ); - rk.do_step( sys2 , in , dxdtin , t , out , dxdtout , dt ); // Ok, internal derivative is not used - //] - } - - - // Symplectic harmonic oscillator example - { - double t( 0.0 ) , dt( 0.1 ); - //[ symplectic_stepper_detail_example - pair< vector_type , vector_type > x; - x.first[0] = 1.0; x.second[0] = 0.0; - symplectic_rkn_sb3a_mclachlan< vector_type > rkn; - rkn.do_step( make_pair( harm_osc_f1() , harm_osc_f2() ) , x , t , dt ); - //] - - //[ symplectic_stepper_detail_system_class_example - harm_osc h; - rkn.do_step( make_pair( boost::bind( &harm_osc::f1 , h , _1 , _2 ) , boost::bind( &harm_osc::f2 , h , _1 , _2 ) ) , - x , t , dt ); - //] - } - - // Simplified harmonic oscillator example - { - double t = 0.0, dt = 0.1; - //[ simplified_symplectic_stepper_example - pair< vector_type , vector_type > x; - x.first[0] = 1.0; x.second[0] = 0.0; - symplectic_rkn_sb3a_mclachlan< vector_type > rkn; - rkn.do_step( harm_osc_f1() , x , t , dt ); - //] - - vector_type q = {{ 1.0 }} , p = {{ 0.0 }}; - //[ symplectic_stepper_detail_ref_usage - rkn.do_step( harm_osc_f1() , make_pair( boost::ref( q ) , boost::ref( p ) ) , t , dt ); - rkn.do_step( harm_osc_f1() , q , p , t , dt ); - rkn.do_step( make_pair( harm_osc_f1() , harm_osc_f2() ) , q , p , t , dt ); - //] - } - - // adams_bashforth_moulton stepper example - { - double t = 0.0 , dt = 0.1; - state_type inout; - //[ multistep_detail_example - adams_bashforth_moulton< 5 , state_type > abm; - abm.initialize( sys , inout , t , dt ); - abm.do_step( sys , inout , t , dt ); - //] - - //[ multistep_detail_own_stepper_initialization - abm.initialize( runge_kutta_fehlberg78< state_type >() , sys , inout , t , dt ); - //] - } - - - - // dense output stepper examples - { - double t = 0.0 , dt = 0.1; - state_type in; - //[ dense_output_detail_example - dense_output_runge_kutta< controlled_runge_kutta< runge_kutta_dopri5< state_type > > > dense; - dense.initialize( in , t , dt ); - pair< double , double > times = dense.do_step( sys ); - (void)times; - //] - - state_type inout; - double t_start = 0.0 , t_end = 1.0; - //[ dense_output_detail_generation1 - typedef boost::numeric::odeint::result_of::make_dense_output< - runge_kutta_dopri5< state_type > >::type dense_stepper_type; - dense_stepper_type dense2 = make_dense_output( 1.0e-6 , 1.0e-6 , runge_kutta_dopri5< state_type >() ); - (void)dense2; - //] - - //[ dense_output_detail_generation2 - integrate_const( make_dense_output( 1.0e-6 , 1.0e-6 , runge_kutta_dopri5< state_type >() ) , sys , inout , t_start , t_end , dt ); - //] - } - - - return 0; -} diff --git a/libs/numeric/odeint/examples/stiff_system.cpp b/libs/numeric/odeint/examples/stiff_system.cpp deleted file mode 100644 index ca71f6600..000000000 --- a/libs/numeric/odeint/examples/stiff_system.cpp +++ /dev/null @@ -1,118 +0,0 @@ -/* - * rosenbrock4.cpp - * - * Copyright 2010-2012 Mario Mulansky - * Copyright 2011-2012 Karsten Ahnert - * Copyright 2012 Andreas Angelopoulos - * - * Distributed under the 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 -#include -#include - -#include - -#include - -#include -#include - -using namespace std; -using namespace boost::numeric::odeint; -namespace phoenix = boost::phoenix; - - - -//[ stiff_system_definition -typedef boost::numeric::ublas::vector< double > vector_type; -typedef boost::numeric::ublas::matrix< double > matrix_type; - -struct stiff_system -{ - void operator()( const vector_type &x , vector_type &dxdt , double /* t */ ) - { - dxdt[ 0 ] = -101.0 * x[ 0 ] - 100.0 * x[ 1 ]; - dxdt[ 1 ] = x[ 0 ]; - } -}; - -struct stiff_system_jacobi -{ - void operator()( const vector_type & /* x */ , matrix_type &J , const double & /* t */ , vector_type &dfdt ) - { - J( 0 , 0 ) = -101.0; - J( 0 , 1 ) = -100.0; - J( 1 , 0 ) = 1.0; - J( 1 , 1 ) = 0.0; - dfdt[0] = 0.0; - dfdt[1] = 0.0; - } -}; -//] - - - -/* -//[ stiff_system_alternative_definition -typedef boost::numeric::ublas::vector< double > vector_type; -typedef boost::numeric::ublas::matrix< double > matrix_type; - -struct stiff_system -{ - template< class State > - void operator()( const State &x , State &dxdt , double t ) - { - ... - } -}; - -struct stiff_system_jacobi -{ - template< class State , class Matrix > - void operator()( const State &x , Matrix &J , const double &t , State &dfdt ) - { - ... - } -}; -//] - */ - - - -int main( int argc , char **argv ) -{ -// typedef rosenbrock4< double > stepper_type; -// typedef rosenbrock4_controller< stepper_type > controlled_stepper_type; -// typedef rosenbrock4_dense_output< controlled_stepper_type > dense_output_type; - //[ integrate_stiff_system - vector_type x( 2 , 1.0 ); - - size_t num_of_steps = integrate_const( make_dense_output< rosenbrock4< double > >( 1.0e-6 , 1.0e-6 ) , - make_pair( stiff_system() , stiff_system_jacobi() ) , - x , 0.0 , 50.0 , 0.01 , - cout << phoenix::arg_names::arg2 << " " << phoenix::arg_names::arg1[0] << "\n" ); - //] - clog << num_of_steps << endl; - - - -// typedef runge_kutta_dopri5< vector_type > dopri5_type; -// typedef controlled_runge_kutta< dopri5_type > controlled_dopri5_type; -// typedef dense_output_runge_kutta< controlled_dopri5_type > dense_output_dopri5_type; - //[ integrate_stiff_system_alternative - - vector_type x2( 2 , 1.0 ); - - size_t num_of_steps2 = integrate_const( make_dense_output< runge_kutta_dopri5< vector_type > >( 1.0e-6 , 1.0e-6 ) , - stiff_system() , x2 , 0.0 , 50.0 , 0.01 , - cout << phoenix::arg_names::arg2 << " " << phoenix::arg_names::arg1[0] << "\n" ); - //] - clog << num_of_steps2 << endl; - - - return 0; -} diff --git a/libs/numeric/odeint/examples/stochastic_euler.cpp b/libs/numeric/odeint/examples/stochastic_euler.cpp deleted file mode 100644 index c98d27b09..000000000 --- a/libs/numeric/odeint/examples/stochastic_euler.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* - libs/numeric/odeint/examples/stochastic_euler.hpp - - Copyright 2012 Karsten Ahnert - Copyright 2012 Mario Mulansky - - Stochastic euler stepper example and Ornstein-Uhlenbeck process - - Distributed under the 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 -#include -#include -#include - -#include - - -/* -//[ stochastic_euler_class_definition -template< size_t N > class stochastic_euler -{ -public: - - typedef boost::array< double , N > state_type; - typedef boost::array< double , N > deriv_type; - typedef double value_type; - typedef double time_type; - typedef unsigned short order_type; - typedef boost::numeric::odeint::stepper_tag stepper_category; - - static order_type order( void ) { return 1; } - - // ... -}; -//] -*/ - - -/* -//[ stochastic_euler_do_step -template< size_t N > class stochastic_euler -{ -public: - - // ... - - template< class System > - void do_step( System system , state_type &x , time_type t , time_type dt ) const - { - deriv_type det , stoch ; - system.first( x , det ); - system.second( x , stoch ); - for( size_t i=0 ; i -class stochastic_euler -{ -public: - - typedef boost::array< double , N > state_type; - typedef boost::array< double , N > deriv_type; - typedef double value_type; - typedef double time_type; - typedef unsigned short order_type; - - typedef boost::numeric::odeint::stepper_tag stepper_category; - - static order_type order( void ) { return 1; } - - template< class System > - void do_step( System system , state_type &x , time_type t , time_type dt ) const - { - deriv_type det , stoch ; - system.first( x , det ); - system.second( x , stoch ); - for( size_t i=0 ; i state_type; - -struct ornstein_det -{ - void operator()( const state_type &x , state_type &dxdt ) const - { - dxdt[0] = -x[0]; - } -}; - -struct ornstein_stoch -{ - boost::mt19937 &m_rng; - boost::normal_distribution<> m_dist; - - ornstein_stoch( boost::mt19937 &rng , double sigma ) : m_rng( rng ) , m_dist( 0.0 , sigma ) { } - - void operator()( const state_type &x , state_type &dxdt ) - { - dxdt[0] = m_dist( m_rng ); - } -}; -//] - -struct streaming_observer -{ - template< class State > - void operator()( const State &x , double t ) const - { - std::cout << t << "\t" << x[0] << "\n"; - } -}; - - -int main( int argc , char **argv ) -{ - using namespace std; - using namespace boost::numeric::odeint; - - //[ ornstein_uhlenbeck_main - boost::mt19937 rng; - double dt = 0.1; - state_type x = {{ 1.0 }}; - integrate_const( stochastic_euler< N >() , make_pair( ornstein_det() , ornstein_stoch( rng , 1.0 ) ), - x , 0.0 , 10.0 , dt , streaming_observer() ); - //] - return 0; -} diff --git a/libs/numeric/odeint/examples/stuart_landau.cpp b/libs/numeric/odeint/examples/stuart_landau.cpp deleted file mode 100644 index 84f9b04d8..000000000 --- a/libs/numeric/odeint/examples/stuart_landau.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/* - * stuart_landau.cpp - * - * This example demonstrates how one can use odeint can be used with state types consisting of complex variables. - * - * Copyright 2011-2012 Karsten Ahnert - * Copyright 2011-2013 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) - */ - -#include -#include -#include - -#include - -using namespace std; -using namespace boost::numeric::odeint; - -//[ stuart_landau_system_function -typedef complex< double > state_type; - -struct stuart_landau -{ - double m_eta; - double m_alpha; - - stuart_landau( double eta = 1.0 , double alpha = 1.0 ) - : m_eta( eta ) , m_alpha( alpha ) { } - - void operator()( const state_type &x , state_type &dxdt , double t ) const - { - const complex< double > I( 0.0 , 1.0 ); - dxdt = ( 1.0 + m_eta * I ) * x - ( 1.0 + m_alpha * I ) * norm( x ) * x; - } -}; -//] - - -/* -//[ stuart_landau_system_function_alternative -double eta = 1.0; -double alpha = 1.0; - -void stuart_landau( const state_type &x , state_type &dxdt , double t ) -{ - const complex< double > I( 0.0 , 1.0 ); - dxdt = ( 1.0 + m_eta * I ) * x - ( 1.0 + m_alpha * I ) * norm( x ) * x; -} -//] -*/ - - -struct streaming_observer -{ - std::ostream& m_out; - - streaming_observer( std::ostream &out ) : m_out( out ) { } - - template< class State > - void operator()( const State &x , double t ) const - { - m_out << t; - m_out << "\t" << x.real() << "\t" << x.imag() ; - m_out << "\n"; - } -}; - - - - -int main( int argc , char **argv ) -{ - //[ stuart_landau_integration - state_type x = complex< double >( 1.0 , 0.0 ); - - const double dt = 0.1; - - typedef runge_kutta4< state_type > stepper_type; - - integrate_const( stepper_type() , stuart_landau( 2.0 , 1.0 ) , x , 0.0 , 10.0 , dt , streaming_observer( cout ) ); - //] - - return 0; -} diff --git a/libs/numeric/odeint/examples/thrust/Makefile b/libs/numeric/odeint/examples/thrust/Makefile deleted file mode 100644 index 5a33bdb32..000000000 --- a/libs/numeric/odeint/examples/thrust/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright 2011-2014 Mario Mulansky -# Copyright 2011-2012 Karsten Ahnert -# -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or -# copy at http://www.boost.org/LICENSE_1_0.txt) - -# make sure BOOST_ROOT is pointing to your boost directory -# otherwise, set it here: -# BOOST_ROOT = /path/to/boost - -# path to the cuda installation -CUDA_ROOT = /usr/local/cuda -# target architecture -ARCH = sm_13 - -NVCC = $(CUDA_ROOT)/bin/nvcc - -INCLUDES += -I../../include/ -I$(BOOST_ROOT) - -NVCCFLAGS = -O3 $(INCLUDES) -arch $(ARCH) - -%.o : %.cu - $(NVCC) $(NVCCFLAGS) -c $< -o $@ - -% : %.o - $(NVCC) $(NVCCFLAGS) -o $@ $< - - -all : phase_oscillator_chain phase_oscillator_ensemble lorenz_parameters relaxation - - -clean : - -rm *~ *.o phase_oscillator_chain phase_oscillator_ensemble lorenz_parameters relaxation diff --git a/libs/numeric/odeint/examples/thrust/lorenz_parameters.cu b/libs/numeric/odeint/examples/thrust/lorenz_parameters.cu deleted file mode 100644 index b3323756d..000000000 --- a/libs/numeric/odeint/examples/thrust/lorenz_parameters.cu +++ /dev/null @@ -1,296 +0,0 @@ -/* - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2013 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) - */ - -#include -#include -#include - - -#include -#include -#include - -#include - -#include - -#include -#include -#include - - -using namespace std; -using namespace boost::numeric::odeint; - -//change this to float if your device does not support double computation -typedef double value_type; - -//change this to host_vector< ... > of you want to run on CPU -typedef thrust::device_vector< value_type > state_type; -typedef thrust::device_vector< size_t > index_vector_type; -// typedef thrust::host_vector< value_type > state_type; -// typedef thrust::host_vector< size_t > index_vector_type; - - -const value_type sigma = 10.0; -const value_type b = 8.0 / 3.0; - - -//[ thrust_lorenz_parameters_define_simple_system -struct lorenz_system -{ - struct lorenz_functor - { - template< class T > - __host__ __device__ - void operator()( T t ) const - { - // unpack the parameter we want to vary and the Lorenz variables - value_type R = thrust::get< 3 >( t ); - value_type x = thrust::get< 0 >( t ); - value_type y = thrust::get< 1 >( t ); - value_type z = thrust::get< 2 >( t ); - thrust::get< 4 >( t ) = sigma * ( y - x ); - thrust::get< 5 >( t ) = R * x - y - x * z; - thrust::get< 6 >( t ) = -b * z + x * y ; - - } - }; - - lorenz_system( size_t N , const state_type &beta ) - : m_N( N ) , m_beta( beta ) { } - - template< class State , class Deriv > - void operator()( const State &x , Deriv &dxdt , value_type t ) const - { - thrust::for_each( - thrust::make_zip_iterator( thrust::make_tuple( - boost::begin( x ) , - boost::begin( x ) + m_N , - boost::begin( x ) + 2 * m_N , - m_beta.begin() , - boost::begin( dxdt ) , - boost::begin( dxdt ) + m_N , - boost::begin( dxdt ) + 2 * m_N ) ) , - thrust::make_zip_iterator( thrust::make_tuple( - boost::begin( x ) + m_N , - boost::begin( x ) + 2 * m_N , - boost::begin( x ) + 3 * m_N , - m_beta.begin() , - boost::begin( dxdt ) + m_N , - boost::begin( dxdt ) + 2 * m_N , - boost::begin( dxdt ) + 3 * m_N ) ) , - lorenz_functor() ); - } - size_t m_N; - const state_type &m_beta; -}; -//] - -struct lorenz_perturbation_system -{ - struct lorenz_perturbation_functor - { - template< class T > - __host__ __device__ - void operator()( T t ) const - { - value_type R = thrust::get< 1 >( t ); - value_type x = thrust::get< 0 >( thrust::get< 0 >( t ) ); - value_type y = thrust::get< 1 >( thrust::get< 0 >( t ) ); - value_type z = thrust::get< 2 >( thrust::get< 0 >( t ) ); - value_type dx = thrust::get< 3 >( thrust::get< 0 >( t ) ); - value_type dy = thrust::get< 4 >( thrust::get< 0 >( t ) ); - value_type dz = thrust::get< 5 >( thrust::get< 0 >( t ) ); - thrust::get< 0 >( thrust::get< 2 >( t ) ) = sigma * ( y - x ); - thrust::get< 1 >( thrust::get< 2 >( t ) ) = R * x - y - x * z; - thrust::get< 2 >( thrust::get< 2 >( t ) ) = -b * z + x * y ; - thrust::get< 3 >( thrust::get< 2 >( t ) ) = sigma * ( dy - dx ); - thrust::get< 4 >( thrust::get< 2 >( t ) ) = ( R - z ) * dx - dy - x * dz; - thrust::get< 5 >( thrust::get< 2 >( t ) ) = y * dx + x * dy - b * dz; - } - }; - - lorenz_perturbation_system( size_t N , const state_type &beta ) - : m_N( N ) , m_beta( beta ) { } - - template< class State , class Deriv > - void operator()( const State &x , Deriv &dxdt , value_type t ) const - { - thrust::for_each( - thrust::make_zip_iterator( thrust::make_tuple( - thrust::make_zip_iterator( thrust::make_tuple( - boost::begin( x ) , - boost::begin( x ) + m_N , - boost::begin( x ) + 2 * m_N , - boost::begin( x ) + 3 * m_N , - boost::begin( x ) + 4 * m_N , - boost::begin( x ) + 5 * m_N ) ) , - m_beta.begin() , - thrust::make_zip_iterator( thrust::make_tuple( - boost::begin( dxdt ) , - boost::begin( dxdt ) + m_N , - boost::begin( dxdt ) + 2 * m_N , - boost::begin( dxdt ) + 3 * m_N , - boost::begin( dxdt ) + 4 * m_N , - boost::begin( dxdt ) + 5 * m_N ) ) - ) ) , - thrust::make_zip_iterator( thrust::make_tuple( - thrust::make_zip_iterator( thrust::make_tuple( - boost::begin( x ) + m_N , - boost::begin( x ) + 2 * m_N , - boost::begin( x ) + 3 * m_N , - boost::begin( x ) + 4 * m_N , - boost::begin( x ) + 5 * m_N , - boost::begin( x ) + 6 * m_N ) ) , - m_beta.begin() , - thrust::make_zip_iterator( thrust::make_tuple( - boost::begin( dxdt ) + m_N , - boost::begin( dxdt ) + 2 * m_N , - boost::begin( dxdt ) + 3 * m_N , - boost::begin( dxdt ) + 4 * m_N , - boost::begin( dxdt ) + 5 * m_N , - boost::begin( dxdt ) + 6 * m_N ) ) - ) ) , - lorenz_perturbation_functor() ); - } - - size_t m_N; - const state_type &m_beta; -}; - -struct lyap_observer -{ - //[thrust_lorenz_parameters_observer_functor - struct lyap_functor - { - template< class T > - __host__ __device__ - void operator()( T t ) const - { - value_type &dx = thrust::get< 0 >( t ); - value_type &dy = thrust::get< 1 >( t ); - value_type &dz = thrust::get< 2 >( t ); - value_type norm = sqrt( dx * dx + dy * dy + dz * dz ); - dx /= norm; - dy /= norm; - dz /= norm; - thrust::get< 3 >( t ) += log( norm ); - } - }; - //] - - lyap_observer( size_t N , size_t every = 100 ) - : m_N( N ) , m_lyap( N ) , m_every( every ) , m_count( 0 ) - { - thrust::fill( m_lyap.begin() , m_lyap.end() , 0.0 ); - } - - template< class Lyap > - void fill_lyap( Lyap &lyap ) - { - thrust::copy( m_lyap.begin() , m_lyap.end() , lyap.begin() ); - for( size_t i=0 ; i - void operator()( State &x , value_type t ) - { - if( ( m_count != 0 ) && ( ( m_count % m_every ) == 0 ) ) - { - thrust::for_each( - thrust::make_zip_iterator( thrust::make_tuple( - boost::begin( x ) + 3 * m_N , - boost::begin( x ) + 4 * m_N , - boost::begin( x ) + 5 * m_N , - m_lyap.begin() ) ) , - thrust::make_zip_iterator( thrust::make_tuple( - boost::begin( x ) + 4 * m_N , - boost::begin( x ) + 5 * m_N , - boost::begin( x ) + 6 * m_N , - m_lyap.end() ) ) , - lyap_functor() ); - clog << t << "\n"; - } - ++m_count; - m_t_overall = t; - } - - size_t m_N; - state_type m_lyap; - size_t m_every; - size_t m_count; - value_type m_t_overall; -}; - -const size_t N = 1024*2; -const value_type dt = 0.01; - - -int main( int arc , char* argv[] ) -{ - int driver_version , runtime_version; - cudaDriverGetVersion( &driver_version ); - cudaRuntimeGetVersion ( &runtime_version ); - cout << driver_version << "\t" << runtime_version << endl; - - - //[ thrust_lorenz_parameters_define_beta - vector< value_type > beta_host( N ); - const value_type beta_min = 0.0 , beta_max = 56.0; - for( size_t i=0 ; i stepper_type; - - - lorenz_system lorenz( N , beta ); - lorenz_perturbation_system lorenz_perturbation( N , beta ); - lyap_observer obs( N , 1 ); - - // calculate transients - integrate_adaptive( make_controlled( 1.0e-6 , 1.0e-6 , stepper_type() ) , lorenz , std::make_pair( x.begin() , x.begin() + 3 * N ) , 0.0 , 10.0 , dt ); - - // calculate the Lyapunov exponents -- the main loop - double t = 0.0; - while( t < 10000.0 ) - { - integrate_adaptive( make_controlled( 1.0e-6 , 1.0e-6 , stepper_type() ) , lorenz_perturbation , x , t , t + 1.0 , 0.1 ); - t += 1.0; - obs( x , t ); - } - - vector< value_type > lyap( N ); - obs.fill_lyap( lyap ); - - for( size_t i=0 ; i -#include - -#include -#include -#include - -#include -#include -#include - -using namespace std; - -using namespace boost::numeric::odeint; - - -//change this to float if your device does not support double computation -typedef double value_type; - - -//[ thrust_phase_chain_system -//change this to host_vector< ... > if you want to run on CPU -typedef thrust::device_vector< value_type > state_type; -typedef thrust::device_vector< size_t > index_vector_type; -//typedef thrust::host_vector< value_type > state_type; -//typedef thrust::host_vector< size_t > index_vector_type; - -//<- -/* - * This implements the rhs of the dynamical equation: - * \phi'_0 = \omega_0 + sin( \phi_1 - \phi_0 ) - * \phi'_i = \omega_i + sin( \phi_i+1 - \phi_i ) + sin( \phi_i - \phi_i-1 ) - * \phi'_N-1 = \omega_N-1 + sin( \phi_N-1 - \phi_N-2 ) - */ -//-> -class phase_oscillators -{ - -public: - - struct sys_functor - { - template< class Tuple > - __host__ __device__ - void operator()( Tuple t ) // this functor works on tuples of values - { - // first, unpack the tuple into value, neighbors and omega - const value_type phi = thrust::get<0>(t); - const value_type phi_left = thrust::get<1>(t); // left neighbor - const value_type phi_right = thrust::get<2>(t); // right neighbor - const value_type omega = thrust::get<3>(t); - // the dynamical equation - thrust::get<4>(t) = omega + sin( phi_right - phi ) + sin( phi - phi_left ); - } - }; - - phase_oscillators( const state_type &omega ) - : m_omega( omega ) , m_N( omega.size() ) , m_prev( omega.size() ) , m_next( omega.size() ) - { - // build indices pointing to left and right neighbours - thrust::counting_iterator c( 0 ); - thrust::copy( c , c+m_N-1 , m_prev.begin()+1 ); - m_prev[0] = 0; // m_prev = { 0 , 0 , 1 , 2 , 3 , ... , N-1 } - - thrust::copy( c+1 , c+m_N , m_next.begin() ); - m_next[m_N-1] = m_N-1; // m_next = { 1 , 2 , 3 , ... , N-1 , N-1 } - } - - void operator() ( const state_type &x , state_type &dxdt , const value_type dt ) - { - thrust::for_each( - thrust::make_zip_iterator( - thrust::make_tuple( - x.begin() , - thrust::make_permutation_iterator( x.begin() , m_prev.begin() ) , - thrust::make_permutation_iterator( x.begin() , m_next.begin() ) , - m_omega.begin() , - dxdt.begin() - ) ), - thrust::make_zip_iterator( - thrust::make_tuple( - x.end() , - thrust::make_permutation_iterator( x.begin() , m_prev.end() ) , - thrust::make_permutation_iterator( x.begin() , m_next.end() ) , - m_omega.end() , - dxdt.end()) ) , - sys_functor() - ); - } - -private: - - const state_type &m_omega; - const size_t m_N; - index_vector_type m_prev; - index_vector_type m_next; -}; -//] - -const size_t N = 32768; -const value_type pi = 3.1415926535897932384626433832795029; -const value_type epsilon = 6.0 / ( N * N ); // should be < 8/N^2 to see phase locking -const value_type dt = 0.1; - -int main( int arc , char* argv[] ) -{ - //[ thrust_phase_chain_integration - // create initial conditions and omegas on host: - vector< value_type > x_host( N ); - vector< value_type > omega_host( N ); - for( size_t i=0 ; i stepper; - - // create phase oscillator system function - phase_oscillators sys( omega ); - - // integrate - integrate_const( stepper , sys , x , 0.0 , 10.0 , dt ); - - thrust::copy( x.begin() , x.end() , std::ostream_iterator< value_type >( std::cout , "\n" ) ); - std::cout << std::endl; - //] -} diff --git a/libs/numeric/odeint/examples/thrust/phase_oscillator_ensemble.cu b/libs/numeric/odeint/examples/thrust/phase_oscillator_ensemble.cu deleted file mode 100644 index d678b8f01..000000000 --- a/libs/numeric/odeint/examples/thrust/phase_oscillator_ensemble.cu +++ /dev/null @@ -1,280 +0,0 @@ -/* - The example how the phase_oscillator ensemble can be implemented using CUDA and thrust - - Copyright 2011-2013 Mario Mulansky - Copyright 2011 Karsten Ahnert - - Distributed under the 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 -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include -#include - -using namespace std; - -using namespace boost::numeric::odeint; - -/* - * Sorry for that dirty hack, but nvcc has large problems with boost::random. - * - * Nevertheless we need the cauchy distribution from boost::random, and therefore - * we need a generator. Here it is: - */ -struct drand48_generator -{ - typedef double result_type; - result_type operator()( void ) const { return drand48(); } - result_type min( void ) const { return 0.0; } - result_type max( void ) const { return 1.0; } -}; - -//[ thrust_phase_ensemble_state_type -//change this to float if your device does not support double computation -typedef double value_type; - -//change this to host_vector< ... > of you want to run on CPU -typedef thrust::device_vector< value_type > state_type; -// typedef thrust::host_vector< value_type > state_type; -//] - - -//[ thrust_phase_ensemble_mean_field_calculator -struct mean_field_calculator -{ - struct sin_functor : public thrust::unary_function< value_type , value_type > - { - __host__ __device__ - value_type operator()( value_type x) const - { - return sin( x ); - } - }; - - struct cos_functor : public thrust::unary_function< value_type , value_type > - { - __host__ __device__ - value_type operator()( value_type x) const - { - return cos( x ); - } - }; - - static std::pair< value_type , value_type > get_mean( const state_type &x ) - { - //[ thrust_phase_ensemble_sin_sum - value_type sin_sum = thrust::reduce( - thrust::make_transform_iterator( x.begin() , sin_functor() ) , - thrust::make_transform_iterator( x.end() , sin_functor() ) ); - //] - value_type cos_sum = thrust::reduce( - thrust::make_transform_iterator( x.begin() , cos_functor() ) , - thrust::make_transform_iterator( x.end() , cos_functor() ) ); - - cos_sum /= value_type( x.size() ); - sin_sum /= value_type( x.size() ); - - value_type K = sqrt( cos_sum * cos_sum + sin_sum * sin_sum ); - value_type Theta = atan2( sin_sum , cos_sum ); - - return std::make_pair( K , Theta ); - } -}; -//] - - - -//[ thrust_phase_ensemble_sys_function -class phase_oscillator_ensemble -{ - -public: - - struct sys_functor - { - value_type m_K , m_Theta , m_epsilon; - - sys_functor( value_type K , value_type Theta , value_type epsilon ) - : m_K( K ) , m_Theta( Theta ) , m_epsilon( epsilon ) { } - - template< class Tuple > - __host__ __device__ - void operator()( Tuple t ) - { - thrust::get<2>(t) = thrust::get<1>(t) + m_epsilon * m_K * sin( m_Theta - thrust::get<0>(t) ); - } - }; - - // ... - //<- - phase_oscillator_ensemble( size_t N , value_type g = 1.0 , value_type epsilon = 1.0 ) - : m_omega() , m_N( N ) , m_epsilon( epsilon ) - { - create_frequencies( g ); - } - - void create_frequencies( value_type g ) - { - boost::cauchy_distribution< value_type > cauchy( 0.0 , g ); -// boost::variate_generator< boost::mt19937&, boost::cauchy_distribution< value_type > > gen( rng , cauchy ); - drand48_generator d48; - vector< value_type > omega( m_N ); - for( size_t i=0 ; i - - void operator() ( const state_type &x , state_type &dxdt , const value_type dt ) const - { - std::pair< value_type , value_type > mean_field = mean_field_calculator::get_mean( x ); - - thrust::for_each( - thrust::make_zip_iterator( thrust::make_tuple( x.begin() , m_omega.begin() , dxdt.begin() ) ), - thrust::make_zip_iterator( thrust::make_tuple( x.end() , m_omega.end() , dxdt.end()) ) , - sys_functor( mean_field.first , mean_field.second , m_epsilon ) - ); - } - - // ... - //<- -private: - - state_type m_omega; - const size_t m_N; - value_type m_epsilon; - //-> -}; -//] - - -//[ thrust_phase_ensemble_observer -struct statistics_observer -{ - value_type m_K_mean; - size_t m_count; - - statistics_observer( void ) - : m_K_mean( 0.0 ) , m_count( 0 ) { } - - template< class State > - void operator()( const State &x , value_type t ) - { - std::pair< value_type , value_type > mean = mean_field_calculator::get_mean( x ); - m_K_mean += mean.first; - ++m_count; - } - - value_type get_K_mean( void ) const { return ( m_count != 0 ) ? m_K_mean / value_type( m_count ) : 0.0 ; } - - void reset( void ) { m_K_mean = 0.0; m_count = 0; } -}; -//] - - - -// const size_t N = 16384 * 128; -const size_t N = 16384; -const value_type pi = 3.1415926535897932384626433832795029; -const value_type dt = 0.1; -const value_type d_epsilon = 0.1; -const value_type epsilon_min = 0.0; -const value_type epsilon_max = 5.0; -const value_type t_transients = 10.0; -const value_type t_max = 100.0; - -int main( int arc , char* argv[] ) -{ - // initial conditions on host - vector< value_type > x_host( N ); - for( size_t i=0 ; i stepper_type; - //] - - ofstream fout( "phase_ensemble_dopri5.dat" ); - timer.restart(); - for( value_type epsilon = epsilon_min ; epsilon < epsilon_max ; epsilon += d_epsilon ) - { - ensemble.set_epsilon( epsilon ); - statistics_observer obs; - state_type x = x_host; - - timer_local.restart(); - - // calculate some transients steps - //[ thrust_phase_ensemble_integration - size_t steps1 = integrate_const( make_controlled( 1.0e-6 , 1.0e-6 , stepper_type() ) , boost::ref( ensemble ) , x , 0.0 , t_transients , dt ); - //] - - // integrate and compute the statistics - size_t steps2 = integrate_const( make_dense_output( 1.0e-6 , 1.0e-6 , stepper_type() ) , boost::ref( ensemble ) , x , 0.0 , t_max , dt , boost::ref( obs ) ); - - fout << epsilon << "\t" << obs.get_K_mean() << endl; - cout << "Dopri5 : " << epsilon << "\t" << obs.get_K_mean() << "\t" << timer_local.elapsed() << "\t" << steps1 << "\t" << steps2 << endl; - } - dopri5_time = timer.elapsed(); - } - - - - { - //[ thrust_phase_ensemble_define_rk4 - typedef runge_kutta4< state_type , value_type , state_type , value_type > stepper_type; - //] - - ofstream fout( "phase_ensemble_rk4.dat" ); - timer.restart(); - for( value_type epsilon = epsilon_min ; epsilon < epsilon_max ; epsilon += d_epsilon ) - { - ensemble.set_epsilon( epsilon ); - statistics_observer obs; - state_type x = x_host; - - timer_local.restart(); - - // calculate some transients steps - size_t steps1 = integrate_const( stepper_type() , boost::ref( ensemble ) , x , 0.0 , t_transients , dt ); - - // integrate and compute the statistics - size_t steps2 = integrate_const( stepper_type() , boost::ref( ensemble ) , x , 0.0 , t_max , dt , boost::ref( obs ) ); - fout << epsilon << "\t" << obs.get_K_mean() << endl; - cout << "RK4 : " << epsilon << "\t" << obs.get_K_mean() << "\t" << timer_local.elapsed() << "\t" << steps1 << "\t" << steps2 << endl; - } - rk4_time = timer.elapsed(); - } - - cout << "Dopri 5 : " << dopri5_time << " s\n"; - cout << "RK4 : " << rk4_time << "\n"; - - return 0; -} diff --git a/libs/numeric/odeint/examples/thrust/relaxation.cu b/libs/numeric/odeint/examples/thrust/relaxation.cu deleted file mode 100644 index f1d9f3a28..000000000 --- a/libs/numeric/odeint/examples/thrust/relaxation.cu +++ /dev/null @@ -1,81 +0,0 @@ -/* - Copyright 2011-2012 Karsten Ahnert - Copyright 2013 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) - */ - - -/* - * Solves many relaxation equations dxdt = - a * x in parallel and for different values of a. - * The relaxation equations are completely uncoupled. - */ - -#include - -#include - -#include -#include - - -using namespace std; -using namespace boost::numeric::odeint; - -// change to float if your GPU does not support doubles -typedef double value_type; -typedef thrust::device_vector< value_type > state_type; -typedef runge_kutta4< state_type , value_type , state_type , value_type > stepper_type; - -struct relaxation -{ - struct relaxation_functor - { - template< class T > - __host__ __device__ - void operator()( T t ) const - { - // unpack the parameter we want to vary and the Lorenz variables - value_type a = thrust::get< 1 >( t ); - value_type x = thrust::get< 0 >( t ); - thrust::get< 2 >( t ) = -a * x; - } - }; - - relaxation( size_t N , const state_type &a ) - : m_N( N ) , m_a( a ) { } - - void operator()( const state_type &x , state_type &dxdt , value_type t ) const - { - thrust::for_each( - thrust::make_zip_iterator( thrust::make_tuple( x.begin() , m_a.begin() , dxdt.begin() ) ) , - thrust::make_zip_iterator( thrust::make_tuple( x.end() , m_a.end() , dxdt.end() ) ) , - relaxation_functor() ); - } - - size_t m_N; - const state_type &m_a; -}; - -const size_t N = 1024 * 1024; -const value_type dt = 0.01; - -int main( int arc , char* argv[] ) -{ - // initialize the relaxation constants a - vector< value_type > a_host( N ); - for( size_t i=0 ; i -#include -#include -#include - -#ifndef M_PI //not there on windows -#define M_PI 3.1415927 //... -#endif - -#include - -using namespace std; -using namespace boost::numeric::odeint; - -//[ two_dimensional_phase_lattice_definition -typedef boost::numeric::ublas::matrix< double > state_type; - -struct two_dimensional_phase_lattice -{ - two_dimensional_phase_lattice( double gamma = 0.5 ) - : m_gamma( gamma ) { } - - void operator()( const state_type &x , state_type &dxdt , double /* t */ ) const - { - size_t size1 = x.size1() , size2 = x.size2(); - - for( size_t i=1 ; i map_type; - - write_snapshots( void ) : m_count( 0 ) { } - - void operator()( const state_type &x , double t ) - { - map< size_t , string >::const_iterator it = m_snapshots.find( m_count ); - if( it != m_snapshots.end() ) - { - ofstream fout( it->second.c_str() ); - for( size_t i=0 ; i( rand() ) / RAND_MAX * 2.0 * M_PI; - - write_snapshots snapshots; - snapshots.snapshots().insert( make_pair( size_t( 0 ) , string( "lat_0000.dat" ) ) ); - snapshots.snapshots().insert( make_pair( size_t( 100 ) , string( "lat_0100.dat" ) ) ); - snapshots.snapshots().insert( make_pair( size_t( 1000 ) , string( "lat_1000.dat" ) ) ); - observer_collection< state_type , double > obs; - obs.observers().push_back( write_for_gnuplot( 10 ) ); - obs.observers().push_back( snapshots ); - - cout << "set term x11" << endl; - cout << "set pm3d map" << endl; - - integrate_const( runge_kutta4() , two_dimensional_phase_lattice( 1.2 ) , - x , 0.0 , 1001.0 , 0.1 , boost::ref( obs ) ); - - // controlled steppers work only after ublas bugfix - //integrate_const( make_dense_output< runge_kutta_dopri5< state_type > >( 1E-6 , 1E-6 ) , two_dimensional_phase_lattice( 1.2 ) , - // x , 0.0 , 1001.0 , 0.1 , boost::ref( obs ) ); - - - return 0; -} diff --git a/libs/numeric/odeint/examples/ublas/Jamfile.v2 b/libs/numeric/odeint/examples/ublas/Jamfile.v2 deleted file mode 100644 index 7abff98ef..000000000 --- a/libs/numeric/odeint/examples/ublas/Jamfile.v2 +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2011 Mario Mulansky -# Copyright 2012 Karsten Ahnert -# Distributed under the Boost Software License, Version 1.0. (See -# accompanying file LICENSE_1_0.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt) - - -project - : requirements - BOOST_ALL_NO_LIB=1 - ; - -exe lorenz_ublas : lorenz_ublas.cpp ; diff --git a/libs/numeric/odeint/examples/ublas/lorenz_ublas.cpp b/libs/numeric/odeint/examples/ublas/lorenz_ublas.cpp deleted file mode 100644 index 0e3958d07..000000000 --- a/libs/numeric/odeint/examples/ublas/lorenz_ublas.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2011-2013 Mario Mulansky - * Copyright 2012 Karsten Ahnert - * - * Distributed under the 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 - -#include -#include - -typedef boost::numeric::ublas::vector< double > state_type; - -void lorenz( const state_type &x , state_type &dxdt , const double t ) -{ - const double sigma( 10.0 ); - const double R( 28.0 ); - const double b( 8.0 / 3.0 ); - - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; -} - -using namespace boost::numeric::odeint; - -//[ublas_main -int main() -{ - state_type x(3); - x[0] = 10.0; x[1] = 5.0 ; x[2] = 0.0; - typedef runge_kutta_dopri5< state_type > stepper; - integrate_const( make_dense_output< stepper >( 1E-6 , 1E-6 ) , lorenz , x , - 0.0 , 10.0 , 0.1 ); -} -//] diff --git a/libs/numeric/odeint/examples/van_der_pol_stiff.cpp b/libs/numeric/odeint/examples/van_der_pol_stiff.cpp deleted file mode 100644 index a53ae4dbe..000000000 --- a/libs/numeric/odeint/examples/van_der_pol_stiff.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - * van_der_pol_stiff.cpp - * - * Created on: Dec 12, 2011 - * - * Copyright 2012 Karsten Ahnert - * Copyright 2012-2013 Rajeev Singh - * Copyright 2012-2013 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) - */ - -#include -#include -#include - -#include - -#include -#include - -using namespace std; -using namespace boost::numeric::odeint; -namespace phoenix = boost::phoenix; - -const double mu = 1000.0; - - -typedef boost::numeric::ublas::vector< double > vector_type; -typedef boost::numeric::ublas::matrix< double > matrix_type; - -struct vdp_stiff -{ - void operator()( const vector_type &x , vector_type &dxdt , double t ) - { - dxdt[0] = x[1]; - dxdt[1] = -x[0] - mu * x[1] * (x[0]*x[0]-1.0); - } -}; - -struct vdp_stiff_jacobi -{ - void operator()( const vector_type &x , matrix_type &J , const double &t , vector_type &dfdt ) - { - J(0, 0) = 0.0; - J(0, 1) = 1.0; - J(1, 0) = -1.0 - 2.0*mu * x[0] * x[1]; - J(1, 1) = -mu * ( x[0] * x[0] - 1.0); - - dfdt[0] = 0.0; - dfdt[1] = 0.0; - } -}; - - -int main( int argc , char **argv ) -{ - //[ integrate_stiff_system - vector_type x( 2 ); - /* initialize random seed: */ - srand ( time(NULL) ); - - // initial conditions - for (int i=0; i<2; i++) - x[i] = 1.0; //(1.0 * rand()) / RAND_MAX; - - size_t num_of_steps = integrate_const( make_dense_output< rosenbrock4< double > >( 1.0e-6 , 1.0e-6 ) , - make_pair( vdp_stiff() , vdp_stiff_jacobi() ) , - x , 0.0 , 1000.0 , 1.0 - , cout << phoenix::arg_names::arg2 << " " << phoenix::arg_names::arg1[0] << " " << phoenix::arg_names::arg1[1] << "\n" - ); - //] - clog << num_of_steps << endl; - - - - //[ integrate_stiff_system_alternative - - vector_type x2( 2 ); - // initial conditions - for (int i=0; i<2; i++) - x2[i] = 1.0; //(1.0 * rand()) / RAND_MAX; - - //size_t num_of_steps2 = integrate_const( make_dense_output< runge_kutta_dopri5< vector_type > >( 1.0e-6 , 1.0e-6 ) , - // vdp_stiff() , x2 , 0.0 , 1000.0 , 1.0 - // , cout << phoenix::arg_names::arg2 << " " << phoenix::arg_names::arg1[0] << " " << phoenix::arg_names::arg1[1] << "\n" - // ); - //] - //clog << num_of_steps2 << endl; - - - return 0; -} diff --git a/libs/numeric/odeint/examples/vexcl/Jamfile.v2 b/libs/numeric/odeint/examples/vexcl/Jamfile.v2 deleted file mode 100644 index 73dc8dae0..000000000 --- a/libs/numeric/odeint/examples/vexcl/Jamfile.v2 +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright 2012 Karsten Ahnert -# Copyright 2013 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) - - -import boost ; -import os ; - -boost.use-project ; - - -# change these lines to fit you configuration -local HOME = [ os.environ HOME ] ; -local VEXCL_INCLUDE = [ os.environ VEXCL_ROOT ] ; -OPENCL_INCLUDE = /usr/local/cuda/include ; - - - -lib opencl : : OpenCL ; - -project : requirements - /boost//headers - $(VEXCL_INCLUDE) - $(OPENCL_INCLUDE) - gcc:-std=c++0x - /boost//system/ - ; - -exe lorenz_ensemble : lorenz_ensemble.cpp opencl ; \ No newline at end of file diff --git a/libs/numeric/odeint/examples/vexcl/lorenz_ensemble.cpp b/libs/numeric/odeint/examples/vexcl/lorenz_ensemble.cpp deleted file mode 100644 index 0e7594ca3..000000000 --- a/libs/numeric/odeint/examples/vexcl/lorenz_ensemble.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2012 Karsten Ahnert - * Copyright 2013 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) - */ - -#include -#include - -#include - -#include -//[ vexcl_includes -#include -//] - -namespace odeint = boost::numeric::odeint; - -//[ vexcl_state_types -typedef vex::vector< double > vector_type; -typedef vex::multivector< double, 3 > state_type; -//] - - -//[ vexcl_system -const double sigma = 10.0; -const double b = 8.0 / 3.0; - -struct sys_func -{ - const vector_type &R; - - sys_func( const vector_type &_R ) : R( _R ) { } - - void operator()( const state_type &x , state_type &dxdt , double t ) const - { - dxdt(0) = -sigma * ( x(0) - x(1) ); - dxdt(1) = R * x(0) - x(1) - x(0) * x(2); - dxdt(2) = - b * x(2) + x(0) * x(1); - } -}; -//] - - -int main( int argc , char **argv ) -{ - using namespace std; - using namespace odeint; - - //[ vexcl_main - // setup the opencl context - vex::Context ctx( vex::Filter::Type(CL_DEVICE_TYPE_GPU) ); - std::cout << ctx << std::endl; - - // set up number of system, time step and integration time - const size_t n = 1024 * 1024; - const double dt = 0.01; - const double t_max = 1000.0; - - // initialize R - double Rmin = 0.1 , Rmax = 50.0 , dR = ( Rmax - Rmin ) / double( n - 1 ); - std::vector x( n * 3 ) , r( n ); - for( size_t i=0 ; i stepper; - - // solve the system - integrate_const( stepper , sys_func( R ) , X , 0.0 , t_max , dt ); - //] - - std::vector< double > res( 3 * n ); - vex::copy( X(0) , res ); - for( size_t i=0 ; i\W*)(\(c\))?\s*?copyright\s*(\(c\))?\s+\d{4}(\s*-\s*\d{4})?\s+(?P.+?)\s*$', line, re.IGNORECASE) - if m: - d = m.groupdict() - prefix.add(d['prefix']) - lines.append(i) - names.append(d['name'].strip()) - if len(prefix) != 1: - print 'Not found:', filename - return - prefix = list(prefix)[0] - - print filename - new = iter(new_copyright(filename, names)) - with open(filename, 'w') as f: - for i, line in enumerate(content): - if i in lines: - for repl in new: - print >>f, prefix + repl - else: - print >>f, line, - pass - -def all_files(): - ls = run(['git', 'ls-files'], universal_newlines=True) - for filename in ls.splitlines(): - if magic.from_file(filename, mime=True).split('/')[0] == 'text': - yield filename - -for f in all_files(): - fix_copyright(f) diff --git a/libs/numeric/odeint/index.html b/libs/numeric/odeint/index.html deleted file mode 100644 index 20c131439..000000000 --- a/libs/numeric/odeint/index.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - -Automatic redirection failed, please go to -doc/html/index.html -
-

© Copyright Beman Dawes, 2001

-

Distributed under the Boost Software -License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at -www.boost.org/LICENSE_1_0.txt)

- - diff --git a/libs/numeric/odeint/meta/libraries.json b/libs/numeric/odeint/meta/libraries.json deleted file mode 100644 index 7825fec22..000000000 --- a/libs/numeric/odeint/meta/libraries.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "key": "numeric/odeint", - "name": "Odeint", - "authors": [ - "Karsten Ahnert", - "Mario Mulansky" - ], - "description": "Solving ordinary differential equations.", - "category": [ - "Math" - ], - "maintainers": [ - "Karsten Ahnert ", - "Mario Mulansky " - ] -} diff --git a/libs/numeric/odeint/performance/Jamfile.v2 b/libs/numeric/odeint/performance/Jamfile.v2 deleted file mode 100644 index e60e4ea12..000000000 --- a/libs/numeric/odeint/performance/Jamfile.v2 +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright 2012 Karsten Ahnert -# Copyright 2012 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) - -import os ; -import modules ; -import path ; - -project - : requirements - BOOST_ALL_NO_LIB=1 - ../../../.. - -std=c++11 - gcc:-ffast-math - intel:"-fast -inline-forceinline" - : default-build release - ; - - -lib libgsl : : gsl ; -lib libgslcblas : : gslcblas ; - -lib libmkl : : mkl_intel_lp64 shared ; -lib libmkl_core : : mkl_core shared ; -lib libmkl_intel_thread : : mkl_intel_thread ; -lib libiomp5 : : iomp5 ; -lib libpthread : : pthread ; - -exe odeint_rk4_array - : odeint_rk4_array.cpp - ; diff --git a/libs/numeric/odeint/performance/Makefile b/libs/numeric/odeint/performance/Makefile deleted file mode 100644 index 641cb0313..000000000 --- a/libs/numeric/odeint/performance/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright 2011-2014 Mario Mulansky -# Copyright 2011-2014 Karsten Ahnert -# -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or -# copy at http://www.boost.org/LICENSE_1_0.txt) - -# make sure BOOST_ROOT is pointing to your boost directory -# otherwise, set it here: -# BOOST_ROOT = /path/to/boost - -INCLUDES += -I../../include/ -I$(BOOST_ROOT) -GCCFLAGS = -O3 -ffast-math -DNDEBUG -# disabling -ffast-math might give slightly better performance -ICCFLAGS = -Ofast -xHost -ip -inline-forceinline -DNDEBUG -# Possible options: -fp-model source -no-fma -GFORTFLAGS = -Ofast - -bin/gcc: - mkdir -p bin/gcc - -bin/intel: - mkdir -p bin/intel - -bin/gfort: - mkdir -p bin/gfort - -bin/gcc/odeint_rk4_array: odeint_rk4_array.cpp bin/gcc - g++ ${GCCFLAGS} ${INCLUDES} -o bin/gcc/odeint_rk4_array odeint_rk4_array.cpp - -bin/gcc/c_lorenz: c_lorenz.c bin/gcc - gcc -std=c99 -Ofast -mtune=corei7-avx c_lorenz.c -o bin/gcc/c_lorenz - -bin/intel/odeint_rk4_array: odeint_rk4_array.cpp bin/intel - icpc ${ICCFLAGS} ${INCLUDES} -o bin/intel/odeint_rk4_array odeint_rk4_array.cpp - -bin/intel/c_lorenz: c_lorenz.c bin/intel - icc -std=c99 -Ofast -xHost -ansi-alias -o bin/intel/c_lorenz c_lorenz.c - -bin/gfort/fortran_lorenz: fortran_lorenz.f90 bin/gfort - gfortran ${GFORTFLAGS} fortran_lorenz.f90 -o bin/gfort/fortran_lorenz - -all: bin/gcc/odeint_rk4_array bin/intel/odeint_rk4_array bin/gcc/c_lorenz bin/intel/c_lorenz bin/gfort/fortran_lorenz diff --git a/libs/numeric/odeint/performance/SIMD/Makefile b/libs/numeric/odeint/performance/SIMD/Makefile deleted file mode 100644 index 811acd988..000000000 --- a/libs/numeric/odeint/performance/SIMD/Makefile +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright 2014 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) - -# make sure BOOST_ROOT is pointing to your boost directory -# otherwise, set it here: -# BOOST_ROOT = /path/to/boost -# you also need NT2s SIMD libary available set the include path here: -# SIMD_INCLUDE = /path/to/simd/include - -INCLUDES = -I$(BOOST_ROOT) -I${SIMD_INCLUDE} - -# INTEL COMPILER -# change this if you want to cross-compile -ARCH = Host -# ARCH = AVX -# ARCH = SSE4.2 - -CXX = icpc -CC = icpc -CXXFLAGS = -O3 -x${ARCH} -std=c++0x -fno-alias -inline-forceinline -DNDEBUG ${INCLUDES} -# -ip - -# GCC COMPILER -# change this if you want to cross-compile -# ARCH = native -# # ARCH = core-avx-i - -# CXX = g++ -# CC = g++ -# CXXFLAGS = -O3 -ffast-math -mtune=${ARCH} -march=${ARCH} -std=c++0x -DNDEBUG ${INCLUDES} diff --git a/libs/numeric/odeint/performance/SIMD/perf_roessler.sh b/libs/numeric/odeint/performance/SIMD/perf_roessler.sh deleted file mode 100644 index a1094f63a..000000000 --- a/libs/numeric/odeint/performance/SIMD/perf_roessler.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -echo "Running on ${HOSTNAME}" - -out_dir=perf_${HOSTNAME} -mkdir -p ${out_dir} - -for N in 256 1024 4096 16384 65536 262144 1048576 4194304 16777216 67108864 -do - steps=`expr 4 \* 67108864 / ${N}` - for exe in "roessler" "roessler_simd" - do - rm -f ${out_dir}/${exe}_N${N}.times - for i in {0..4} - do - likwid-pin -cS0:0 ./${exe} ${N} ${steps} >> ${out_dir}/${exe}_N${N}.times - done - for perf_ctr in "FLOPS_DP" "FLOPS_AVX" "L2" "L3" "MEM" - do - likwid-perfctr -CS0:0 -g ${perf_ctr} ./${exe} ${N} ${steps} > ${out_dir}/${exe}_N${N}_${perf_ctr}.perf - done - done -done diff --git a/libs/numeric/odeint/performance/SIMD/roessler.cpp b/libs/numeric/odeint/performance/SIMD/roessler.cpp deleted file mode 100644 index 4e6cc4229..000000000 --- a/libs/numeric/odeint/performance/SIMD/roessler.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Simulation of an ensemble of Roessler attractors - * - * Copyright 2014 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) - * - */ - - -#include -#include -#include - -#include -#include - -#include - -namespace odeint = boost::numeric::odeint; - -typedef boost::timer timer_type; - -typedef double fp_type; -//typedef float fp_type; - -typedef boost::array state_type; -typedef std::vector state_vec; - -//--------------------------------------------------------------------------- -struct roessler_system { - const fp_type m_a, m_b, m_c; - - roessler_system(const fp_type a, const fp_type b, const fp_type c) - : m_a(a), m_b(b), m_c(c) - {} - - void operator()(const state_type &x, state_type &dxdt, const fp_type t) const - { - dxdt[0] = -x[1] - x[2]; - dxdt[1] = x[0] + m_a * x[1]; - dxdt[2] = m_b + x[2] * (x[0] - m_c); - } -}; - -//--------------------------------------------------------------------------- -int main(int argc, char *argv[]) { -if(argc<3) -{ - std::cerr << "Expected size and steps as parameter" << std::endl; - exit(1); -} -const size_t n = atoi(argv[1]); -const size_t steps = atoi(argv[2]); -//const size_t steps = 50; - -const fp_type dt = 0.01; - -const fp_type a = 0.2; -const fp_type b = 1.0; -const fp_type c = 9.0; - -// random initial conditions on the device -std::vector x(n), y(n), z(n); -std::default_random_engine generator; -std::uniform_real_distribution distribution_xy(-8.0, 8.0); -std::uniform_real_distribution distribution_z(0.0, 20.0); -auto rand_xy = std::bind(distribution_xy, std::ref(generator)); -auto rand_z = std::bind(distribution_z, std::ref(generator)); -std::generate(x.begin(), x.end(), rand_xy); -std::generate(y.begin(), y.end(), rand_xy); -std::generate(z.begin(), z.end(), rand_z); - -state_vec state(n); -for(size_t i=0; i stepper; - -roessler_system sys(a, b, c); - -timer_type timer; - -fp_type t = 0.0; - -for (int step = 0; step < steps; step++) -{ - for(size_t i=0; i -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - - -namespace odeint = boost::numeric::odeint; -namespace simd = boost::simd; - -typedef boost::timer timer_type; - -static const size_t dim = 3; // roessler is 3D - -typedef double fp_type; -//typedef float fp_type; - -typedef simd::pack simd_pack; -typedef boost::array state_type; -// use the simd allocator to get properly aligned memory -typedef std::vector< state_type, simd::allocator< state_type > > state_vec; - -static const size_t pack_size = simd_pack::static_size; - -//--------------------------------------------------------------------------- -struct roessler_system { - const fp_type m_a, m_b, m_c; - - roessler_system(const fp_type a, const fp_type b, const fp_type c) - : m_a(a), m_b(b), m_c(c) - {} - - void operator()(const state_type &x, state_type &dxdt, const fp_type t) const - { - dxdt[0] = -1.0*x[1] - x[2]; - dxdt[1] = x[0] + m_a * x[1]; - dxdt[2] = m_b + x[2] * (x[0] - m_c); - } -}; - -//--------------------------------------------------------------------------- -int main(int argc, char *argv[]) { -if(argc<3) -{ - std::cerr << "Expected size and steps as parameter" << std::endl; - exit(1); -} -const size_t n = atoi(argv[1]); -const size_t steps = atoi(argv[2]); - -const fp_type dt = 0.01; - -const fp_type a = 0.2; -const fp_type b = 1.0; -const fp_type c = 9.0; - -// random initial conditions on the device -std::vector x(n), y(n), z(n); -std::default_random_engine generator; -std::uniform_real_distribution distribution_xy(-8.0, 8.0); -std::uniform_real_distribution distribution_z(0.0, 20.0); -auto rand_xy = std::bind(distribution_xy, std::ref(generator)); -auto rand_z = std::bind(distribution_z, std::ref(generator)); -std::generate(x.begin(), x.end(), rand_xy); -std::generate(y.begin(), y.end(), rand_xy); -std::generate(z.begin(), z.end(), rand_z); - -state_vec state(n/pack_size); -for(size_t i=0; i stepper; - -roessler_system sys(a, b, c); - -timer_type timer; - -fp_type t = 0.0; - -for(int step = 0; step < steps; step++) -{ - for(size_t i = 0; i < n/pack_size; ++i) - { - stepper.do_step(sys, state[i], t, dt); - } - t += dt; -} - -std::cout.precision(16); - -std::cout << "Integration finished, runtime for " << steps << " steps: "; -std::cout << timer.elapsed() << " s" << std::endl; - -// compute some accumulation to make sure all results have been computed -simd_pack s_pack = 0.0; -for(size_t i = 0; i < n/pack_size; ++i) -{ - s_pack += state[i][0]; -} - -fp_type s = 0.0; -for(size_t p=0; p -#include -#include - -void lorenz(const double *x, double *restrict y) { - y[0] = 10.0 * (x[1] - x[0]); - y[1] = 28.0 * x[0] - x[1] - x[0] * x[2]; - y[2] = x[0] * x[1] - (8.0 / 3.0) * x[2]; -} - -int main(int argc, const char *argv[]) -{ - const int nb_steps = 20000000; - const double h = 1.0e-10; - const double h2 = 0.5 * h; - const double nb_loops = 21; - double x[3]; - double y[3]; - double f1[3]; - double f2[3]; - double f3[3]; - double f4[3]; - double min_time = 1E6; - clock_t begin, end; - double time_spent; - - for (int j = 0; j < nb_loops; j++) { - x[0] = 8.5; - x[1] = 3.1; - x[2] = 1.2; - begin = clock(); - for (int k = 0; k < nb_steps; k++) { - lorenz(x, f1); - for (int i = 0; i < 3; i++) { - y[i] = x[i] + h2 * f1[i]; - } - lorenz(y, f2); - for (int i = 0; i < 3; i++) { - y[i] = x[i] + h2 * f2[i]; - } - lorenz(y, f3); - for (int i = 0; i < 3; i++) { - y[i] = x[i] + h * f3[i]; - } - lorenz(y, f4); - for (int i = 0; i < 3; i++) { - x[i] = x[i] + h * (f1[i] + 2 * (f2[i] + f3[i]) + f4[i]) / 6.0; - } - } - end = clock(); - min_time = fmin(min_time, (double)(end-begin)/CLOCKS_PER_SEC); - printf("Result: %f\t runtime: %f\n", x[0], (double)(end-begin)/CLOCKS_PER_SEC); - } - printf("Minimal Runtime: %f\n", min_time); - - return 0; -} diff --git a/libs/numeric/odeint/performance/fortran_lorenz.f90 b/libs/numeric/odeint/performance/fortran_lorenz.f90 deleted file mode 100644 index 26869973c..000000000 --- a/libs/numeric/odeint/performance/fortran_lorenz.f90 +++ /dev/null @@ -1,60 +0,0 @@ -program main - implicit none - - integer, parameter :: dp = 8 - real(dp), dimension(1:3) :: x - integer, parameter :: nstep = 20000000 - real(dp) :: t = 0.0_dp - real(dp) :: h = 1.0e-10_dp - integer, parameter :: nb_loops = 21 - integer, parameter :: n = 3 - integer :: k - integer :: time_begin - integer :: time_end - integer :: count_rate - real(dp) :: time - real(dp) :: min_time = 100.0 - - do k = 1, nb_loops - x = [ 8.5_dp, 3.1_dp, 1.2_dp ] - call system_clock(time_begin, count_rate) - call rk4sys(n, t, x, h, nstep) - call system_clock(time_end, count_rate) - time = real(time_end - time_begin, dp) / real(count_rate, dp) - min_time = min(time, min_time) - write (*,*) time, x(1) - end do - write (*,*) "Minimal Runtime:", min_time -contains - subroutine xpsys(x,f) - real(dp), dimension(1:3), intent(in) :: x - real(dp), dimension(1:3), intent(out) :: f - f(1) = 10.0_dp * ( x(2) - x(1) ) - f(2) = 28.0_dp * x(1) - x(2) - x(1) * x(3) - f(3) = x(1) * x(2) - (8.0_dp / 3.0_dp) * x(3) - end subroutine xpsys - - subroutine rk4sys(n, t, x, h, nstep) - integer, intent(in) :: n - real(dp), intent(in) :: t - real(dp), dimension(1:n), intent(inout) :: x - real(dp), intent(in) :: h - integer, intent(in) :: nstep - ! Local variables - real(dp) :: h2 - real(dp), dimension(1:n) :: y, f1, f2, f3, f4 - integer :: i, k - - h2 = 0.5_dp * h - do k = 1, nstep - call xpsys(x, f1) - y = x + h2 * f1 - call xpsys(y, f2) - y = x + h2 * f2 - call xpsys(y, f3) - y = x + h * f3 - call xpsys(y, f4) - x = x + h * (f1 + 2.0_dp * (f2 + f3) + f4) / 6.0_dp - end do - end subroutine rk4sys -end program main diff --git a/libs/numeric/odeint/performance/lorenz.hpp b/libs/numeric/odeint/performance/lorenz.hpp deleted file mode 100644 index c1ea37c9e..000000000 --- a/libs/numeric/odeint/performance/lorenz.hpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * lorenz.hpp - * - * Copyright 2011 Mario Mulansky - * Copyright 2012 Karsten Ahnert - * - * Distributed under the 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 LORENZ_HPP_ -#define LORENZ_HPP_ - -#include - -struct lorenz -{ - template< class state_type > - void inline operator()( const state_type &x , state_type &dxdt , const double t ) const - { - const double sigma = 10.0; - const double R = 28.0; - const double b = 8.0 / 3.0; - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = x[0]*x[1] - b * x[2]; - } -}; - - -#endif /* LORENZ_HPP_ */ diff --git a/libs/numeric/odeint/performance/odeint_rk4_array.cpp b/libs/numeric/odeint/performance/odeint_rk4_array.cpp deleted file mode 100644 index 6d60296f2..000000000 --- a/libs/numeric/odeint/performance/odeint_rk4_array.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * odeint_rk4_array - * - * Copyright 2011 Mario Mulansky - * Copyright 2012 Karsten Ahnert - * - * Distributed under the 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 - -#include -#include - -#include -#include -#include - -#include "lorenz.hpp" - -typedef boost::timer timer_type; - -typedef boost::array< double , 3 > state_type; - -using namespace boost::numeric::odeint; - -//typedef boost::numeric::odeint::runge_kutta4_classic< state_type > rk4_odeint_type; - -// use the never resizer explicitely for optimal performance with gcc, -// for the intel compiler this doesnt matter and the above definition -// gives the same performance -typedef runge_kutta4_classic< state_type , double , state_type , double , - array_algebra, default_operations, never_resizer > rk4_odeint_type; - - -const int loops = 21; -const int num_of_steps = 20000000; -const double dt = 1E-10; - - -int main() -{ - double min_time = 1E6; // something big - rk4_odeint_type stepper; - std::clog.precision(16); - std::cout.precision(16); - for( int n=0; nBOOST_ALL_NO_LIB=1 - # use test library - /boost//unit_test_framework - static - clang:-Wno-unused-variable - # -D_SCL_SECURE_NO_WARNINGS - ; - -test-suite "odeint" - : - [ run euler_stepper.cpp ] - [ run runge_kutta_concepts.cpp ] - [ run runge_kutta_error_concepts.cpp ] - [ run runge_kutta_controlled_concepts.cpp ] - [ run resizing.cpp ] - [ run default_operations.cpp ] - [ run range_algebra.cpp ] - [ run implicit_euler.cpp ] -# disable in clang - [ run fusion_algebra.cpp : : : clang:no ] - [ run stepper_with_units.cpp : : : clang:no ] - [ run stepper_copying.cpp ] - [ run stepper_with_ranges.cpp ] - [ run rosenbrock4.cpp ] - [ run rosenbrock4_mp.cpp ] - [ run is_pair.cpp ] - [ run adams_bashforth.cpp ] - [ run adams_moulton.cpp ] - [ run adams_bashforth_moulton.cpp ] - [ run generic_stepper.cpp ] - [ run generic_error_stepper.cpp ] - [ run bulirsch_stoer.cpp ] - [ run integrate_times.cpp ] - [ run integrate_times.cpp : : : ODEINT_INTEGRATE_ITERATOR : integrate_times_iterator ] - [ run integrate.cpp ] - [ run integrate.cpp : : : ODEINT_INTEGRATE_ITERATOR : integrate_iterator ] - [ run integrate_implicit.cpp ] - [ run integrate_implicit.cpp : : : ODEINT_INTEGRATE_ITERATOR : integrate_implicit_iterator ] - [ run generation.cpp ] - [ run trivial_state.cpp ] - [ run is_resizeable.cpp ] - [ run resize.cpp ] - [ run same_size.cpp ] - [ run split.cpp ] - [ run symplectic_steppers.cpp ] - [ run integrators_symplectic.cpp ] - [ run integrators_symplectic.cpp : : : ODEINT_INTEGRATE_ITERATOR : integrators_symplectic_iterator ] - [ run velocity_verlet.cpp ] - [ run multi_array.cpp ] - [ compile algebra_dispatcher.cpp ] - [ run integrate_stepper_refs.cpp ] - [ run const_step_iterator.cpp ] - [ run const_step_time_iterator.cpp ] - [ run adaptive_iterator.cpp ] - [ run adaptive_time_iterator.cpp ] - [ run n_step_iterator.cpp ] - [ run n_step_time_iterator.cpp ] - [ run times_iterator.cpp ] - [ run times_time_iterator.cpp ] - [ run step_size_limitation.cpp ] - [ run integrate_overflow.cpp ] - [ compile unwrap_boost_reference.cpp ] - [ compile unwrap_reference.cpp : -std=c++0x : unwrap_reference_C++11 ] - [ compile-fail unwrap_reference.cpp : -std=c++98 : unwrap_reference_C++98 ] - [ compile std_array.cpp : -std=c++0x ] - : - valgrind - ; - -# also run numeric tests -build-project numeric ; - -build-project regression ; - -# test-suite "odeint-iterator_integrate" -# : -# [ run integrate.cpp : : : : integrate_iterator ] -# : valgrind -# ODEINT_ITERATOR_INTEGRATE -# ; - diff --git a/libs/numeric/odeint/test/adams_bashforth.cpp b/libs/numeric/odeint/test/adams_bashforth.cpp deleted file mode 100644 index f7e5e2bf2..000000000 --- a/libs/numeric/odeint/test/adams_bashforth.cpp +++ /dev/null @@ -1,232 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/adams_bashforth.cpp - - [begin_description] - This file tests the use of the adams bashforth stepper. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2012 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) - */ - - -// disable checked iterator warning for msvc - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_adams_bashforth - -#include - -#include - -#include - -#include -#include -#include - - -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef double value_type; - -struct lorenz -{ - template< class State , class Deriv , class Value > - void operator()( const State &_x , Deriv &_dxdt , const Value &dt ) const - { - const value_type sigma = 10.0; - const value_type R = 28.0; - const value_type b = 8.0 / 3.0; - - typename boost::range_iterator< const State >::type x = boost::begin( _x ); - typename boost::range_iterator< Deriv >::type dxdt = boost::begin( _dxdt ); - - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = x[0]*x[1] - b * x[2]; - } -}; - -template< class State > -class rk4_decorator -{ -public: - - size_t do_count; - - template< class System , class StateIn , class DerivIn , class StateOut > - void do_step_dxdt_impl( System system , const StateIn &in , const DerivIn &dxdt , value_type t , StateOut &out , value_type dt ) - { - m_stepper.do_step( system , in , dxdt , t , out , dt ); - ++do_count; - } - - template< class System , class StateInOut , class DerivIn > - void do_step_dxdt_impl( System system , StateInOut &x , const DerivIn &dxdt , value_type t , value_type dt ) - { - m_stepper.do_step( system , x , dxdt , t , dt ); - ++do_count; - } - - - runge_kutta4< State > m_stepper; - -private: - - -}; - - -BOOST_AUTO_TEST_SUITE( adams_bashforth_test ) - -BOOST_AUTO_TEST_CASE( test_adams_bashforth_coefficients ) -{ - detail::adams_bashforth_coefficients< value_type , 1 > c1; - detail::adams_bashforth_coefficients< value_type , 2 > c2; - detail::adams_bashforth_coefficients< value_type , 3 > c3; - detail::adams_bashforth_coefficients< value_type , 4 > c4; - detail::adams_bashforth_coefficients< value_type , 5 > c5; - detail::adams_bashforth_coefficients< value_type , 6 > c6; - detail::adams_bashforth_coefficients< value_type , 7 > c7; - detail::adams_bashforth_coefficients< value_type , 8 > c8; -} - -BOOST_AUTO_TEST_CASE( test_rotating_buffer ) -{ - const size_t N = 5; - detail::rotating_buffer< size_t , N > buffer; - for( size_t i=0 ; i state_type; - typedef adams_bashforth< 2 , state_type > stepper_type; - - stepper_type s1; - s1.step_storage()[0].m_v[0] = 1.5; - s1.step_storage()[1].m_v[0] = 2.25; - - stepper_type s2( s1 ); - BOOST_CHECK_CLOSE( s1.step_storage()[0].m_v[0] , s2.step_storage()[0].m_v[0] , 1.0e-14 ); - BOOST_CHECK_CLOSE( s1.step_storage()[1].m_v[0] , s2.step_storage()[1].m_v[0] , 1.0e-14 ); - BOOST_CHECK( ( &(s1.step_storage()[0]) ) != ( &(s2.step_storage()[0]) ) ); - - stepper_type s3; - state_type *p1 = &( s3.step_storage()[0].m_v ) , *p2 = &( s3.step_storage()[1].m_v ); - s3 = s1; - BOOST_CHECK( p1 == ( &( s3.step_storage()[0].m_v ) ) ); - BOOST_CHECK( p2 == ( &( s3.step_storage()[1].m_v ) ) ); - - BOOST_CHECK_CLOSE( s1.step_storage()[0].m_v[0] , s3.step_storage()[0].m_v[0] , 1.0e-14 ); - BOOST_CHECK_CLOSE( s1.step_storage()[1].m_v[0] , s3.step_storage()[1].m_v[0] , 1.0e-14 ); -} - -typedef boost::mpl::range_c< size_t , 1 , 6 > vector_of_steps; - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_init_and_steps , step_type , vector_of_steps ) -{ - const static size_t steps = step_type::value; - typedef boost::array< value_type , 3 > state_type; - - adams_bashforth< steps , state_type > stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - const value_type dt = 0.01; - value_type t = 0.0; - - stepper.initialize( lorenz() , x , t , dt ); - BOOST_CHECK_CLOSE( t , value_type( steps - 1 ) * dt , 1.0e-14 ); - - stepper.do_step( lorenz() , x , t , dt ); -} - -BOOST_AUTO_TEST_CASE( test_instantiation ) -{ - typedef boost::array< double , 3 > state_type; - adams_bashforth< 1 , state_type > s1; - adams_bashforth< 2 , state_type > s2; - adams_bashforth< 3 , state_type > s3; - adams_bashforth< 4 , state_type > s4; - adams_bashforth< 5 , state_type > s5; - adams_bashforth< 6 , state_type > s6; - adams_bashforth< 7 , state_type > s7; - adams_bashforth< 8 , state_type > s8; - - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - value_type t = 0.0 , dt = 0.01; - s1.do_step( lorenz() , x , t , dt ); - s2.do_step( lorenz() , x , t , dt ); - s3.do_step( lorenz() , x , t , dt ); - s4.do_step( lorenz() , x , t , dt ); - s5.do_step( lorenz() , x , t , dt ); - s6.do_step( lorenz() , x , t , dt ); -// s7.do_step( lorenz() , x , t , dt ); -// s8.do_step( lorenz() , x , t , dt ); -} - -BOOST_AUTO_TEST_CASE( test_auto_initialization ) -{ - typedef boost::array< double , 3 > state_type; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - - adams_bashforth< 3 , state_type , value_type , state_type , value_type , range_algebra , default_operations , - initially_resizer , rk4_decorator< state_type > > adams; - - adams.initializing_stepper().do_count = 0; - adams.do_step( lorenz() , x , 0.0 , x , 0.1 ); - BOOST_CHECK_EQUAL( adams.initializing_stepper().do_count , size_t( 1 ) ); - - adams.do_step( lorenz() , x , 0.0 , x , 0.1 ); - BOOST_CHECK_EQUAL( adams.initializing_stepper().do_count , size_t( 2 ) ); - - adams.do_step( lorenz() , x , 0.0 , x , 0.1 ); - BOOST_CHECK_EQUAL( adams.initializing_stepper().do_count , size_t( 2 ) ); - - adams.do_step( lorenz() , x , 0.0 , x , 0.1 ); - BOOST_CHECK_EQUAL( adams.initializing_stepper().do_count , size_t( 2 ) ); - - adams.do_step( lorenz() , x , 0.0 , x , 0.1 ); - BOOST_CHECK_EQUAL( adams.initializing_stepper().do_count , size_t( 2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_manual_initialization ) -{ - typedef boost::array< double , 3 > state_type; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - - adams_bashforth< 3 , state_type , value_type , state_type , value_type , range_algebra , default_operations , - initially_resizer , rk4_decorator< state_type > > adams; - - adams.initializing_stepper().do_count = 0; - double t = 0.0 , dt = 0.1; - adams.initialize( lorenz() , x , t , dt ); - BOOST_CHECK_EQUAL( adams.initializing_stepper().do_count , size_t( 2 ) ); - - adams.do_step( lorenz() , x , 0.0 , x , 0.1 ); - BOOST_CHECK_EQUAL( adams.initializing_stepper().do_count , size_t( 2 ) ); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/adams_bashforth_moulton.cpp b/libs/numeric/odeint/test/adams_bashforth_moulton.cpp deleted file mode 100644 index c821ac791..000000000 --- a/libs/numeric/odeint/test/adams_bashforth_moulton.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/adams_bashforth_moulton.cpp - - [begin_description] - This file tests the use of the Adams-Bashforth-Moulton. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011 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) - */ - -#define BOOST_TEST_MODULE odeint_adams_bashforth_moulton - -#include - -#include - -#include -#include -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef double value_type; - -struct lorenz -{ - template< class State , class Deriv , class Value > - void operator()( const State &_x , Deriv &_dxdt , const Value &dt ) const - { - const value_type sigma = 10.0; - const value_type R = 28.0; - const value_type b = 8.0 / 3.0; - - typename boost::range_iterator< const State >::type x = boost::begin( _x ); - typename boost::range_iterator< Deriv >::type dxdt = boost::begin( _dxdt ); - - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = x[0]*x[1] - b * x[2]; - } -}; - -BOOST_AUTO_TEST_SUITE( adams_bashforth_moulton_test ) - -typedef boost::mpl::range_c< size_t , 1 , 6 > vector_of_steps; - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_init_and_steps , step_type , vector_of_steps ) -{ - const static size_t steps = step_type::value; - typedef boost::array< value_type , 3 > state_type; - - adams_bashforth_moulton< steps , state_type > stepper; - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - const value_type dt = 0.01; - value_type t = 0.0; - - stepper.initialize( lorenz() , x , t , dt ); - BOOST_CHECK_CLOSE( t , value_type( steps - 1 ) * dt , 1.0e-14 ); - - stepper.do_step( lorenz() , x , t , dt ); -} - - -BOOST_AUTO_TEST_CASE( test_copying ) -{ - typedef boost::array< double , 1 > state_type; - typedef adams_bashforth_moulton< 2 , state_type > stepper_type; - - stepper_type s1; - - stepper_type s2( s1 ); - - stepper_type s3; - s3 = s1; - } - - -BOOST_AUTO_TEST_CASE( test_instantiation ) -{ - typedef boost::array< double , 3 > state_type; - adams_bashforth_moulton< 1 , state_type > s1; - adams_bashforth_moulton< 2 , state_type > s2; - adams_bashforth_moulton< 3 , state_type > s3; - adams_bashforth_moulton< 4 , state_type > s4; - adams_bashforth_moulton< 5 , state_type > s5; - adams_bashforth_moulton< 6 , state_type > s6; - adams_bashforth_moulton< 7 , state_type > s7; - adams_bashforth_moulton< 8 , state_type > s8; - - state_type x = {{ 10.0 , 10.0 , 10.0 }}; - value_type t = 0.0 , dt = 0.01; - s1.do_step( lorenz() , x , t , dt ); - s2.do_step( lorenz() , x , t , dt ); - s3.do_step( lorenz() , x , t , dt ); - s4.do_step( lorenz() , x , t , dt ); - s5.do_step( lorenz() , x , t , dt ); - s6.do_step( lorenz() , x , t , dt ); -// s7.do_step( lorenz() , x , t , dt ); -// s8.do_step( lorenz() , x , t , dt ); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/adams_moulton.cpp b/libs/numeric/odeint/test/adams_moulton.cpp deleted file mode 100644 index faccdda5b..000000000 --- a/libs/numeric/odeint/test/adams_moulton.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/adams_moulton.cpp - - [begin_description] - This file tests the use of the Adams-Moulton stepper. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2012 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) - */ - - -#define BOOST_TEST_MODULE odeint_adams_moulton - -#include - -#include - -#include - -#include -#include -#include - - -#include -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef double value_type; - -struct lorenz -{ - template< class State , class Deriv , class Value > - void operator()( const State &_x , Deriv &_dxdt , const Value &dt ) const - { - const value_type sigma = 10.0; - const value_type R = 28.0; - const value_type b = 8.0 / 3.0; - - typename boost::range_iterator< const State >::type x = boost::begin( _x ); - typename boost::range_iterator< Deriv >::type dxdt = boost::begin( _dxdt ); - - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = x[0]*x[1] - b * x[2]; - } -}; - -BOOST_AUTO_TEST_SUITE( adams_moulton_test ) - -BOOST_AUTO_TEST_CASE( test_adams_moulton_coefficients ) -{ - detail::adams_moulton_coefficients< value_type , 1 > c1; - detail::adams_moulton_coefficients< value_type , 2 > c2; - detail::adams_moulton_coefficients< value_type , 3 > c3; - detail::adams_moulton_coefficients< value_type , 4 > c4; - detail::adams_moulton_coefficients< value_type , 5 > c5; - detail::adams_moulton_coefficients< value_type , 6 > c6; - detail::adams_moulton_coefficients< value_type , 7 > c7; - detail::adams_moulton_coefficients< value_type , 8 > c8; -} - -typedef boost::mpl::range_c< size_t , 1 , 6 > vector_of_steps; - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_init_and_steps , step_type , vector_of_steps ) -{ - const static size_t steps = step_type::value; - typedef boost::array< value_type , 3 > state_type; - - adams_moulton< steps , state_type > stepper; -// state_type x = {{ 10.0 , 10.0 , 10.0 }}; -// const value_type dt = 0.01; -// value_type t = 0.0; - -// stepper.do_step( lorenz() , x , t , dt ); -} - -BOOST_AUTO_TEST_CASE( test_instantiation ) -{ - typedef boost::array< double , 3 > state_type; - adams_moulton< 1 , state_type > s1; - adams_moulton< 2 , state_type > s2; - adams_moulton< 3 , state_type > s3; - adams_moulton< 4 , state_type > s4; - adams_moulton< 5 , state_type > s5; - adams_moulton< 6 , state_type > s6; - adams_moulton< 7 , state_type > s7; - adams_moulton< 8 , state_type > s8; - -// state_type x = {{ 10.0 , 10.0 , 10.0 }}; -// value_type t = 0.0 , dt = 0.01; -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/adaptive_iterator.cpp b/libs/numeric/odeint/test/adaptive_iterator.cpp deleted file mode 100644 index 8f3cfa74a..000000000 --- a/libs/numeric/odeint/test/adaptive_iterator.cpp +++ /dev/null @@ -1,346 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/adaptive_iterator.cpp - - [begin_description] - This file tests the adaptive iterators. - [end_description] - - Copyright 2012-2013 Karsten Ahnert - Copyright 2012-2013 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) - */ - - -#define BOOST_TEST_MODULE odeint_adaptive_iterator - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include "dummy_steppers.hpp" -#include "dummy_odes.hpp" -#include "dummy_observers.hpp" - -namespace mpl = boost::mpl; -using namespace boost::numeric::odeint; - -typedef dummy_stepper::state_type state_type; -typedef dummy_stepper::value_type value_type; - -BOOST_AUTO_TEST_SUITE( adaptive_iterator_test ) - -typedef mpl::vector< - dummy_controlled_stepper - , dummy_dense_output_stepper - > dummy_steppers; - - -BOOST_AUTO_TEST_CASE( copy_controlled_stepper_iterator ) -{ - typedef adaptive_iterator< dummy_controlled_stepper , empty_system , state_type > iterator_type; - - state_type x = {{ 1.0 }}; - iterator_type iter1( dummy_controlled_stepper() , empty_system() , x ); - iterator_type iter2( iter1 ); - - BOOST_CHECK_EQUAL( &( *iter1 ) , &x ); - BOOST_CHECK_EQUAL( &( *iter2 ) , &x ); - BOOST_CHECK_EQUAL( &( *iter1 ) , &( *iter2 ) ); - BOOST_CHECK( iter1.same( iter2 ) ); - - ++iter1; - ++iter2; - - BOOST_CHECK_EQUAL( &( *iter1 ) , &x ); - BOOST_CHECK_EQUAL( &( *iter2 ) , &x ); - BOOST_CHECK_EQUAL( &( *iter1 ) , &( *iter2 ) ); - BOOST_CHECK( iter1.same( iter2 ) ); - -} - -BOOST_AUTO_TEST_CASE( copy_dense_output_stepper_iterator ) -{ - typedef adaptive_iterator< dummy_dense_output_stepper , empty_system , state_type > iterator_type; - - state_type x = {{ 1.0 }}; - // fix by mario: do not dereference iterators at the end - made iter1 start iterator - iterator_type iter1( dummy_dense_output_stepper() , empty_system() , x , 0.0 , 1.0 , 0.1 ); - iterator_type iter2( iter1 ); - - // fix by mario: iterator dereference now always gives internal state also for dense output, consistent with other iterator implementations - // changed: iterators with dense output stepper do not have an internal state now to avoid a copy - BOOST_CHECK_NE( & (*iter1) , & (*iter2) ); - BOOST_CHECK( iter1.same( iter2 ) ); - - ++iter1; - ++iter2; - - BOOST_CHECK_NE( & (*iter1) , & (*iter2) ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - -BOOST_AUTO_TEST_CASE( copy_dense_output_stepper_iterator_with_reference_wrapper ) -{ - // bad use case, the same stepper is iterated twice - typedef adaptive_iterator< boost::reference_wrapper< dummy_dense_output_stepper > , empty_system , state_type > iterator_type; - - state_type x = {{ 1.0 }}; - dummy_dense_output_stepper stepper; - iterator_type iter1( boost::ref( stepper ) , empty_system() , x , 0.0 , 0.9 , 0.1 ); - iterator_type iter2( iter1 ); - - BOOST_CHECK_EQUAL( & (*iter1) , & (*iter2) ); - BOOST_CHECK( iter1.same( iter2 ) ); - - ++iter1; - ++iter2; - - BOOST_CHECK_EQUAL( & (*iter1) , & (*iter2) ); - BOOST_CHECK( !iter1.same( iter2 ) ); // they point to the same stepper, there the times will be different -} - - - -BOOST_AUTO_TEST_CASE( assignment_controlled_stepper_iterator ) -{ - typedef adaptive_iterator< dummy_controlled_stepper , empty_system , state_type > iterator_type; - state_type x1 = {{ 1.0 }} , x2 = {{ 2.0 }}; - iterator_type iter1 = iterator_type( dummy_controlled_stepper() , empty_system() , x1 , 0.0 , 1.0 , 0.1 ); - iterator_type iter2 = iterator_type( dummy_controlled_stepper() , empty_system() , x2 , 0.0 , 1.0 , 0.2 ); - BOOST_CHECK_EQUAL( &(*iter1) , &x1 ); - BOOST_CHECK_EQUAL( &(*iter2) , &x2 ); - // the iterators are indeed the same as this only checks the time values - BOOST_CHECK( !iter1.same( iter2 ) ); - iter2 = iter1; - BOOST_CHECK_EQUAL( &(*iter1) , &x1 ); - BOOST_CHECK_EQUAL( &(*iter2) , &x1 ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - - - -BOOST_AUTO_TEST_CASE( assignment_dense_output_stepper_iterator ) -{ - typedef adaptive_iterator< dummy_dense_output_stepper , empty_system , state_type > iterator_type; - state_type x1 = {{ 1.0 }}; - iterator_type iter1 = iterator_type( dummy_dense_output_stepper() , empty_system() , x1 , 0.0 , 1.0 , 0.1 ); - iterator_type iter2 = iterator_type( dummy_dense_output_stepper() , empty_system() , x1 , 0.0 , 1.0 , 0.2 ); - - BOOST_CHECK_NE( & (*iter1) , & (*iter2) ); - BOOST_CHECK( !iter1.same( iter2 ) ); - - iter2 = iter1; - // fix by mario: iterator dereference now always gives internal state also for dense output, consistent with other iterator implementations - // changed: iterators with dense output stepper do not have an internal state now to avoid a copy - BOOST_CHECK_NE( & (*iter1) , & (*iter2) ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - -BOOST_AUTO_TEST_CASE( assignment_dense_output_stepper_iterator_with_reference_wrapper ) -{ - typedef adaptive_iterator< boost::reference_wrapper< dummy_dense_output_stepper > , empty_system , state_type > iterator_type; - state_type x1 = {{ 1.0 }}; - - dummy_dense_output_stepper stepper; - iterator_type iter1 = iterator_type( boost::ref( stepper ) , empty_system() , x1 , 0.0 , 1.0 , 0.1 ); - iterator_type iter2 = iterator_type( boost::ref( stepper ) , empty_system() , x1 , 0.0 , 1.0 , 0.2 ); - - BOOST_CHECK_EQUAL( & (*iter1) , & (*iter2) ); - BOOST_CHECK( !iter1.same( iter2 ) ); - - iter2 = iter1; - - BOOST_CHECK_EQUAL( & (*iter1) , & (*iter2) ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - - - -BOOST_AUTO_TEST_CASE( controlled_stepper_iterator_factory ) -{ - dummy_controlled_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_adaptive_iterator_begin( stepper , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - make_adaptive_iterator_end( stepper , boost::ref( system ) , x ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-14 ); -} - -// just test if it compiles -BOOST_AUTO_TEST_CASE( dense_output_stepper_iterator_factory ) -{ - dummy_dense_output_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_adaptive_iterator_begin( stepper , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - make_adaptive_iterator_end( stepper , boost::ref( system ) , x ) , - dummy_observer() ); -} - - - -BOOST_AUTO_TEST_CASE( controlled_stepper_range ) -{ - dummy_controlled_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_adaptive_range( stepper , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-14 ); -} - -// just test if it compiles -BOOST_AUTO_TEST_CASE( dense_output_stepper_range ) -{ - dummy_dense_output_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_adaptive_range( stepper , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - dummy_observer() ); -} - - -BOOST_AUTO_TEST_CASE( controlled_stepper_iterator_with_reference_wrapper_factory ) -{ - dummy_controlled_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_adaptive_iterator_begin( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - make_adaptive_iterator_end( boost::ref( stepper ) , boost::ref( system ) , x ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-14 ); -} - -// just test if it compiles -BOOST_AUTO_TEST_CASE( dense_output_stepper_iterator_with_reference_wrapper_factory ) -{ - dummy_dense_output_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_adaptive_iterator_begin( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - make_adaptive_iterator_end( boost::ref( stepper ) , boost::ref( system ) , x ) , - dummy_observer() ); -} - -BOOST_AUTO_TEST_CASE( controlled_stepper_range_with_reference_wrapper ) -{ - dummy_controlled_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_adaptive_range( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-14 ); -} - -// just test if it compiles -BOOST_AUTO_TEST_CASE( dense_output_stepper_range_with_reference_wrapper ) -{ - dummy_dense_output_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_adaptive_range( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - dummy_observer() ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( transitivity1 , Stepper , dummy_steppers ) -{ - typedef adaptive_iterator< Stepper , empty_system , state_type > stepper_iterator; - - state_type x = {{ 1.0 }}; - stepper_iterator first1( Stepper() , empty_system() , x , 2.5 , 2.0 , 0.1 ); - stepper_iterator last1( Stepper() , empty_system() , x ); - stepper_iterator last2( Stepper() , empty_system() , x ); - - BOOST_CHECK( first1 == last1 ); - BOOST_CHECK( first1 == last2 ); - BOOST_CHECK( last1 == last2 ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm , Stepper , dummy_steppers ) -{ - typedef adaptive_iterator< Stepper , empty_system , state_type > stepper_iterator; - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - stepper_iterator first( Stepper() , empty_system() , x , 0.0 , 0.35 , 0.1 ); - stepper_iterator last( Stepper() , empty_system() , x ); - - std::copy( first , last , std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 5 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[4][0] , 2.0 , 1.0e-14 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - std::copy( make_adaptive_iterator_begin( Stepper() , empty_system() , x , 0.0 , 0.35 , 0.1 ) , - make_adaptive_iterator_end( Stepper() , empty_system() , x ) , - std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 5 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[4][0] , 2.0 , 1.0e-14 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_range_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - boost::range::copy( make_adaptive_range( Stepper() , empty_system() , x , 0.0 , 0.35 , 0.1 ) , - std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 5 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[4][0] , 2.0 , 1.0e-14 ); -} - - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/adaptive_time_iterator.cpp b/libs/numeric/odeint/test/adaptive_time_iterator.cpp deleted file mode 100644 index 406a71c65..000000000 --- a/libs/numeric/odeint/test/adaptive_time_iterator.cpp +++ /dev/null @@ -1,332 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/adaptive_time_iterator.cpp - - [begin_description] - This file tests the adaptive time iterator. - [end_description] - - Copyright 2012-2013 Karsten Ahnert - Copyright 2012-2013 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) - */ - - -#define BOOST_TEST_MODULE odeint_adaptive_time_iterator - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include "dummy_steppers.hpp" -#include "dummy_odes.hpp" -#include "dummy_observers.hpp" - -namespace mpl = boost::mpl; -using namespace boost::numeric::odeint; - - - -typedef dummy_stepper::state_type state_type; -typedef dummy_stepper::value_type value_type; -typedef dummy_stepper::time_type time_type; -typedef std::vector< std::pair< state_type , time_type > > result_vector; - -BOOST_AUTO_TEST_SUITE( adaptive_time_iterator_test ) - -typedef mpl::vector< - dummy_controlled_stepper - , dummy_dense_output_stepper - > dummy_steppers; - - -BOOST_AUTO_TEST_CASE( copy_stepper_iterator ) -{ - typedef adaptive_time_iterator< dummy_controlled_stepper , empty_system , state_type > iterator_type; - state_type x = {{ 1.0 }}; - iterator_type iter1 = iterator_type( dummy_controlled_stepper() , empty_system() , x , 0.0 , 1.0 , 0.1 ); - iterator_type iter2 = iter1; - BOOST_CHECK_EQUAL( &( iter1->first ) , &( iter2->first ) ); - BOOST_CHECK_EQUAL( &( iter1->first ) , &x ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - -BOOST_AUTO_TEST_CASE( copy_dense_output_stepper_iterator ) -{ - typedef adaptive_time_iterator< dummy_dense_output_stepper , empty_system , state_type > iterator_type; - state_type x = {{ 1.0 }}; - iterator_type iter1 = iterator_type( dummy_dense_output_stepper() , empty_system() , x , 0.0 , 1.0 , 0.1 ); - iterator_type iter2 = iter1; - BOOST_CHECK_NE( &( iter1->first ) , &( iter2->first ) ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - -BOOST_AUTO_TEST_CASE( copy_dense_output_stepper_iterator_with_reference_wrapper ) -{ - typedef adaptive_time_iterator< boost::reference_wrapper< dummy_dense_output_stepper > , empty_system , state_type > iterator_type; - state_type x = {{ 1.0 }}; - dummy_dense_output_stepper stepper; - iterator_type iter1 = iterator_type( boost::ref( stepper ) , empty_system() , x , 0.0 , 1.0 , 0.1 ); - iterator_type iter2 = iter1; - BOOST_CHECK_EQUAL( &( iter1->first ) , &( iter2->first ) ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - - -BOOST_AUTO_TEST_CASE( assignment_stepper_iterator ) -{ - typedef adaptive_time_iterator< dummy_controlled_stepper , empty_system , state_type > iterator_type; - state_type x1 = {{ 1.0 }} , x2 = {{ 2.0 }}; - iterator_type iter1 = iterator_type( dummy_controlled_stepper() , empty_system() , x1 , 0.0 , 1.0 , 0.1 ); - iterator_type iter2 = iterator_type( dummy_controlled_stepper() , empty_system() , x2 , 0.0 , 1.0 , 0.2 ); - BOOST_CHECK_EQUAL( &( iter1->first ) , &x1 ); - BOOST_CHECK_EQUAL( &( iter2->first ) , &x2 ); - BOOST_CHECK( !iter1.same( iter2 ) ); - iter2 = iter1; - BOOST_CHECK_EQUAL( &( iter1->first ) , &x1 ); - BOOST_CHECK_EQUAL( &( iter2->first ) , &x1 ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - -BOOST_AUTO_TEST_CASE( assignment_dense_output_stepper_iterator ) -{ - typedef adaptive_time_iterator< dummy_dense_output_stepper , empty_system , state_type > iterator_type; - state_type x1 = {{ 1.0 }} , x2 = {{ 2.0 }}; - iterator_type iter1 = iterator_type( dummy_dense_output_stepper() , empty_system() , x1 , 0.0 , 1.0 , 0.1 ); - iterator_type iter2 = iterator_type( dummy_dense_output_stepper() , empty_system() , x2 , 0.0 , 1.0 , 0.2 ); - BOOST_CHECK_NE( &( iter1->first ) , &x1 ); - BOOST_CHECK_NE( &( iter2->first ) , &x2 ); - BOOST_CHECK( !iter1.same( iter2 ) ); - iter2 = iter1; - BOOST_CHECK_NE( &( iter1->first ) , &x1 ); - BOOST_CHECK_NE( &( iter2->first ) , &x1 ); - BOOST_CHECK( iter1.same( iter2 ) ); - BOOST_CHECK_EQUAL( (iter1->first)[0] , (iter1->first)[0] ); -} - -BOOST_AUTO_TEST_CASE( assignment_dense_output_stepper_iterator_with_reference_wrapper ) -{ - typedef adaptive_time_iterator< boost::reference_wrapper< dummy_dense_output_stepper > , empty_system , state_type > iterator_type; - state_type x1 = {{ 1.0 }} , x2 = {{ 2.0 }}; - dummy_dense_output_stepper stepper; - iterator_type iter1 = iterator_type( boost::ref( stepper ) , empty_system() , x1 , 0.0 , 1.0 , 0.1 ); - iterator_type iter2 = iterator_type( boost::ref( stepper ) , empty_system() , x2 , 0.0 , 1.0 , 0.2 ); - - BOOST_CHECK_NE( &( iter1->first ) , &x1 ); - BOOST_CHECK_NE( &( iter2->first ) , &x2 ); - // same stepper instance -> same internal state - BOOST_CHECK_EQUAL( &( iter1->first ) , &( iter2->first ) ); - BOOST_CHECK( !iter1.same( iter2 ) ); - iter2 = iter1; - BOOST_CHECK_NE( &( iter1->first ) , &x1 ); - BOOST_CHECK_NE( &( iter2->first ) , &x1 ); - BOOST_CHECK( iter1.same( iter2 ) ); - BOOST_CHECK_EQUAL( &( iter1->first ) , &( iter2->first ) ); -} - - -BOOST_AUTO_TEST_CASE( stepper_iterator_factory ) -{ - dummy_controlled_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_adaptive_time_iterator_begin( stepper , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - make_adaptive_time_iterator_end( stepper , boost::ref( system ) , x ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-14 ); -} - -// just test if it compiles -BOOST_AUTO_TEST_CASE( dense_output_stepper_iterator_factory ) -{ - dummy_dense_output_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_adaptive_time_iterator_begin( stepper , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - make_adaptive_time_iterator_end( stepper , boost::ref( system ) , x ) , - dummy_observer() ); -} - - -BOOST_AUTO_TEST_CASE( stepper_range ) -{ - dummy_controlled_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_adaptive_time_range( stepper , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-14 ); -} - -// just test if it compiles -BOOST_AUTO_TEST_CASE( dense_output_stepper_range ) -{ - dummy_dense_output_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_adaptive_time_range( stepper , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - dummy_observer() ); -} - - -BOOST_AUTO_TEST_CASE( stepper_iterator_with_reference_wrapper_factory ) -{ - dummy_controlled_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_adaptive_time_iterator_begin( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - make_adaptive_time_iterator_end( boost::ref( stepper ) , boost::ref( system ) , x ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-14 ); -} - -// just test if it compiles -BOOST_AUTO_TEST_CASE( dense_output_stepper_iterator_with_reference_wrapper_factory ) -{ - dummy_dense_output_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_adaptive_time_iterator_begin( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - make_adaptive_time_iterator_end( boost::ref( stepper ) , boost::ref( system ) , x ) , - dummy_observer() ); -} - - - -BOOST_AUTO_TEST_CASE( stepper_range_with_reference_wrapper ) -{ - dummy_controlled_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_adaptive_time_range( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-14 ); -} - -// just test if it compiles -BOOST_AUTO_TEST_CASE( dense_output_stepper_range_with_reference_wrapper ) -{ - dummy_dense_output_stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_adaptive_time_range( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - dummy_observer() ); -} - - - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( transitivity1 , Stepper , dummy_steppers ) -{ - typedef adaptive_time_iterator< Stepper , empty_system , state_type > stepper_iterator; - - state_type x = {{ 1.0 }}; - stepper_iterator first1( Stepper() , empty_system() , x , 1.5 , 1.0 , 0.1 ); - stepper_iterator last1( Stepper() , empty_system() , x ); - stepper_iterator last2( Stepper() , empty_system() , x ); - - BOOST_CHECK( first1 == last1 ); - BOOST_CHECK( first1 == last2 ); - BOOST_CHECK( last1 == last2 ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm , Stepper , dummy_steppers ) -{ - typedef adaptive_time_iterator< Stepper , empty_system , state_type > stepper_iterator; - state_type x = {{ 1.0 }}; - result_vector res; - stepper_iterator first( Stepper() , empty_system() , x , 0.0 , 0.35 , 0.1 ); - stepper_iterator last( Stepper() , empty_system() , x ); - - std::copy( first , last , std::back_insert_iterator< result_vector >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 5 ) ); - BOOST_CHECK_CLOSE( res[0].first[0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[0].second , 0.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].first[0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].second , 0.1 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].first[0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].second , 0.2 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].first[0] , 1.75 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].second , 0.3 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[4].first[0] , 2.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[4].second , 0.35 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - result_vector res; - std::copy( make_adaptive_time_iterator_begin( Stepper() , empty_system() , x , 0.0 , 0.35 , 0.1 ) , - make_adaptive_time_iterator_end( Stepper() , empty_system() , x ) , - std::back_insert_iterator< result_vector >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 5 ) ); - BOOST_CHECK_CLOSE( res[0].first[0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[0].second , 0.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].first[0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].second , 0.1 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].first[0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].second , 0.2 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].first[0] , 1.75 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].second , 0.3 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[4].first[0] , 2.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[4].second , 0.35 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_range_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - result_vector res; - boost::range::copy( make_adaptive_time_range( Stepper() , empty_system() , x , 0.0 , 0.35 , 0.1 ) , - std::back_insert_iterator< result_vector >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 5 ) ); - BOOST_CHECK_CLOSE( res[0].first[0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[0].second , 0.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].first[0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].second , 0.1 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].first[0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].second , 0.2 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].first[0] , 1.75 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].second , 0.3 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[4].first[0] , 2.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[4].second , 0.35 , 1.0e-13 ); -} - - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/algebra_dispatcher.cpp b/libs/numeric/odeint/test/algebra_dispatcher.cpp deleted file mode 100644 index 66a292fd1..000000000 --- a/libs/numeric/odeint/test/algebra_dispatcher.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/algebra_dispatcher.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2013 Karsten Ahnert - Copyright 2013 Mario Mulansky - Copyright 2013 Pascal Germroth - - Distributed under the 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 -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_algebra_dispatcher - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - - -BOOST_AUTO_TEST_SUITE( algebra_dispatcher_test ) - -BOOST_AUTO_TEST_CASE( range_algebra_with_vector ) -{ - typedef runge_kutta4< std::vector< double > > stepper_type; - BOOST_STATIC_ASSERT(( boost::is_same< stepper_type::algebra_type , range_algebra >::value )); -} - -BOOST_AUTO_TEST_CASE( array_algebra_with_array ) -{ - typedef runge_kutta4< boost::array< double , 2 > > stepper_type; - BOOST_STATIC_ASSERT(( boost::is_same< stepper_type::algebra_type , array_algebra >::value )); -} - -BOOST_AUTO_TEST_CASE( range_algebra_with_array ) -{ - typedef runge_kutta4< boost::array< double , 2 > , double , boost::array< double , 2 > , double , range_algebra > stepper_type; - BOOST_STATIC_ASSERT(( boost::is_same< stepper_type::algebra_type , range_algebra >::value )); -} - -BOOST_AUTO_TEST_CASE( fusion_algebra_with_fusion_vector ) -{ - typedef runge_kutta4< boost::fusion::vector< double > > stepper_type; - BOOST_STATIC_ASSERT(( boost::is_same< stepper_type::algebra_type , fusion_algebra >::value )); -} - -BOOST_AUTO_TEST_CASE( fusion_algebra_with_fusion_vector2 ) -{ - typedef runge_kutta_fehlberg78< boost::fusion::vector< double > > stepper_type; - BOOST_STATIC_ASSERT(( boost::is_same< stepper_type::algebra_type , fusion_algebra >::value )); -} - -typedef boost::mpl::list< float , double , long double , std::complex< double > , std::complex< float > > fp_types; -BOOST_AUTO_TEST_CASE_TEMPLATE( vector_space_algebra_with_floating_point , T , fp_types ) -{ - typedef runge_kutta_fehlberg78< T > stepper_type; - BOOST_STATIC_ASSERT(( boost::is_same< typename stepper_type::algebra_type , vector_space_algebra >::value )); -} - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/boost_units_helpers.hpp b/libs/numeric/odeint/test/boost_units_helpers.hpp deleted file mode 100644 index 7ff427578..000000000 --- a/libs/numeric/odeint/test/boost_units_helpers.hpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/dummy_boost_units.hpp - - [begin_description] - tba. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012 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 LIBS_NUMERIC_ODEINT_TEST_DUMMY_BOOST_UNITS_HPP_DEFINED -#define LIBS_NUMERIC_ODEINT_TEST_DUMMY_BOOST_UNITS_HPP_DEFINED - -#include -#include -#include -#include -#include - -#include - - - -typedef double value_type; -typedef boost::units::quantity< boost::units::si::time , value_type > time_type; -typedef boost::units::quantity< boost::units::si::length , value_type > length_type; -typedef boost::units::quantity< boost::units::si::velocity , value_type > velocity_type; -typedef boost::units::quantity< boost::units::si::acceleration , value_type > acceleration_type; - - - -struct oscillator_mom_func_units -{ - template< class Coor , class MomDeriv > - void operator()( const Coor &q , MomDeriv &dp ) const - { - const boost::units::quantity< boost::units::si::frequency , value_type > omega = 1.0 * boost::units::si::hertz; - boost::fusion::at_c< 0 >( dp ) = - omega * omega * boost::fusion::at_c< 0 >( q ); - } -}; - -struct oscillator_coor_func_units -{ - template< class Mom , class CoorDeriv > - void operator()( const Mom &p , CoorDeriv &dq ) const - { - boost::fusion::at_c< 0 >( dq ) = boost::fusion::at_c< 0 >( p ); - } -}; - - -#endif // LIBS_NUMERIC_ODEINT_TEST_DUMMY_BOOST_UNITS_HPP_DEFINED diff --git a/libs/numeric/odeint/test/bulirsch_stoer.cpp b/libs/numeric/odeint/test/bulirsch_stoer.cpp deleted file mode 100644 index 2c6a0c95a..000000000 --- a/libs/numeric/odeint/test/bulirsch_stoer.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/bulirsch_stoer.cpp - - [begin_description] - This file tests the Bulirsch-Stoer stepper. - [end_description] - - Copyright 2011 Mario Mulansky - Copyright 2012 Karsten Ahnert - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or - copy at http://www.boost.org/LICENSE_1_0.txt) - */ - - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_bulirsch_stoer - -#include -#include - -#include - -#include - -#include -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef double value_type; -typedef boost::array< value_type , 3 > state_type; - -const double sigma = 10.0; -const double R = 28.0; -const double b = 8.0 / 3.0; - -struct lorenz -{ - template< class State , class Deriv > - void operator()( const State &x , Deriv &dxdt , double t ) const - { - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; - } -}; - -struct const_system -{ - template< class State , class Deriv > - void operator()( const State &x , Deriv &dxdt , double t ) const - { - dxdt[0] = 1.0; - dxdt[1] = 1.0; - dxdt[2] = 1.0; - } -}; - -struct sin_system -{ - template< class State , class Deriv > - void operator()( const State &x , Deriv &dxdt , double t ) const - { - dxdt[0] = sin( x[0] ); - dxdt[1] = cos( x[1] ); - dxdt[2] = sin( x[2] ) + cos( x[2] ); - } -}; - -BOOST_AUTO_TEST_SUITE( bulirsch_stoer_test ) - -BOOST_AUTO_TEST_CASE( test_bulirsch_stoer ) -{ - typedef bulirsch_stoer< state_type > stepper_type; - stepper_type stepper( 1E-9 , 1E-9 , 1.0 , 0.0 ); - - state_type x; - x[0] = 10.0 ; x[1] = 10.0 ; x[2] = 5.0; - - double dt = 0.1; - - //stepper.try_step( lorenz() , x , t , dt ); - - std::cout << "starting integration..." << std::endl; - - size_t steps = integrate_adaptive( stepper , lorenz() , x , 0.0 , 10.0 , dt ); - - std::cout << "required steps: " << steps << std::endl; - - bulirsch_stoer_dense_out< state_type > bs_do( 1E-9 , 1E-9 , 1.0 , 0.0 ); - x[0] = 10.0 ; x[1] = 10.0 ; x[2] = 5.0; - double t = 0.0; - dt = 1E-1; - bs_do.initialize( x , t , dt ); - bs_do.do_step( sin_system() ); - std::cout << "one step successful, new time: " << bs_do.current_time() << " (" << t << ")" << std::endl; - - x = bs_do.current_state(); - std::cout << "x( " << bs_do.current_time() << " ) = [ " << x[0] << " , " << x[1] << " , " << x[2] << " ]" << std::endl; - - bs_do.calc_state( bs_do.current_time()/3 , x ); - std::cout << "x( " << bs_do.current_time()/3 << " ) = [ " << x[0] << " , " << x[1] << " , " << x[2] << " ]" << std::endl; - - std::cout << std::endl << "=======================================================================" << std::endl << std::endl; - - x[0] = 10.0 ; x[1] = 10.0 ; x[2] = 5.0; - t = 0.0; dt /= 3; - bs_do.initialize( x , t , dt ); - bs_do.do_step( sin_system() ); - x = bs_do.current_state(); - std::cout << "x( " << bs_do.current_time() << " ) = [ " << x[0] << " , " << x[1] << " , " << x[2] << " ]" << std::endl; - - t = dt; - bs_do.initialize( x , t , dt ); - bs_do.do_step( sin_system() ); - x = bs_do.current_state(); - - t = 2*dt; - bs_do.initialize( x , t , dt ); - bs_do.do_step( sin_system() ); - x = bs_do.current_state(); - - std::cout << "x( " << bs_do.current_time() << " ) = [ " << x[0] << " , " << x[1] << " , " << x[2] << " ]" << std::endl << std::endl << std::endl; -} - -BOOST_AUTO_TEST_CASE( test_bulirsch_stoer_adjust_size ) -{ - typedef bulirsch_stoer< state_type > stepper_type; - stepper_type stepper( 1E-9 , 1E-9 , 1.0 , 0.0 ); - - state_type x; x[0] = 10.0 ; x[1] = 10.0 ; x[2] = 5.0; - - stepper.adjust_size( x ); - - - double dt = 0.1; - - size_t steps = integrate_adaptive( stepper , lorenz() , x , 0.0 , 10.0 , dt ); - - std::cout << "required steps: " << steps << std::endl; -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/const_range.hpp b/libs/numeric/odeint/test/const_range.hpp deleted file mode 100644 index d646b1d89..000000000 --- a/libs/numeric/odeint/test/const_range.hpp +++ /dev/null @@ -1,50 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/const_range.hpp - - [begin_description] - tba. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012 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 LIBS_NUMERIC_ODEINT_TEST_CONST_RANGE_HPP_DEFINED -#define LIBS_NUMERIC_ODEINT_TEST_CONST_RANGE_HPP_DEFINED - -#include -#include -#include -#include -#include -#include -#include - - -namespace mpl = boost::mpl; - - - -template< class N , class T > -struct const_range -{ - typedef typename mpl::copy< - mpl::range_c< typename N::value_type , 0 , N::value > , - mpl::inserter< - mpl::vector0<> , - mpl::insert< - mpl::_1 , - mpl::end< mpl::_1 > , - T - > - > - >::type type; -}; - -#endif // LIBS_NUMERIC_ODEINT_TEST_CONST_RANGE_HPP_DEFINED diff --git a/libs/numeric/odeint/test/const_step_iterator.cpp b/libs/numeric/odeint/test/const_step_iterator.cpp deleted file mode 100644 index 2d0ac9dbe..000000000 --- a/libs/numeric/odeint/test/const_step_iterator.cpp +++ /dev/null @@ -1,232 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/const_step_iterator.cpp - - [begin_description] - This file tests the const step iterator. - [end_description] - - Copyright 2012-2013 Karsten Ahnert - Copyright 2013 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) - */ - - -#define BOOST_TEST_MODULE odeint_const_step_iterator - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include "dummy_steppers.hpp" -#include "dummy_odes.hpp" -#include "dummy_observers.hpp" - -namespace mpl = boost::mpl; -using namespace boost::numeric::odeint; - -typedef dummy_stepper::state_type state_type; -typedef dummy_stepper::value_type value_type; - - -BOOST_AUTO_TEST_SUITE( const_step_iterator_test ) - -typedef mpl::vector< - dummy_stepper - , dummy_dense_output_stepper - > dummy_steppers; - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_stepper_iterator , Stepper , dummy_steppers ) -{ - typedef const_step_iterator< Stepper , empty_system , state_type > iterator_type; - state_type x = {{ 1.0 }}; - iterator_type iter1 = iterator_type( Stepper() , empty_system() , x , 0.0 , 0.999 , 0.1 ); - iterator_type iter2 = iter1; - BOOST_CHECK_EQUAL( &(*iter1) , &(*iter2) ); - BOOST_CHECK_EQUAL( &(*iter1) , &x ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( assignment_stepper_iterator , Stepper , dummy_steppers ) -{ - typedef const_step_iterator< Stepper , empty_system , state_type > iterator_type; - state_type x1 = {{ 1.0 }} , x2 = {{ 2.0 }}; - iterator_type iter1 = iterator_type( Stepper() , empty_system() , x1 , 0.0 , 1.0 , 0.1 ); - iterator_type iter2 = iterator_type( Stepper() , empty_system() , x2 , 0.0 , 1.0 , 0.2 ); - BOOST_CHECK_EQUAL( &(*iter1) , &x1 ); - BOOST_CHECK_EQUAL( &(*iter2) , &x2 ); - BOOST_CHECK( !iter1.same( iter2 ) ); - iter2 = iter1; - BOOST_CHECK_EQUAL( &(*iter1) , &x1 ); - BOOST_CHECK_EQUAL( &(*iter2) , &x1 ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_iterator_factory , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_const_step_iterator_begin( stepper , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - make_const_step_iterator_end( stepper , boost::ref( system ) , x ) , - dummy_observer() ); - - // dummy_steppers just add 0.25 at each step, the above for_each leads to 10 do_step calls so x should be 3.5 - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_range , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_const_step_range( stepper , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_iterator_with_reference_wrapper_factory , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_const_step_iterator_begin( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - make_const_step_iterator_end( boost::ref( stepper ) , boost::ref( system ) , x ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_range_with_reference_wrapper , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_const_step_range( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( transitivity1 , Stepper , dummy_steppers ) -{ - typedef const_step_iterator< Stepper , empty_system , state_type > stepper_iterator; - - state_type x = {{ 1.0 }}; - stepper_iterator first1( Stepper() , empty_system() , x , 2.5 , 2.0 , 0.1 ); - stepper_iterator last1( Stepper() , empty_system() , x ); - stepper_iterator last2( Stepper() , empty_system() , x ); - - BOOST_CHECK( first1 == last1 ); - BOOST_CHECK( first1 == last2 ); - BOOST_CHECK( last1 == last2 ); - - first1 = stepper_iterator( Stepper() , empty_system() , x , 2.0 , 2.0 , 0.1 ); - last1 = stepper_iterator( Stepper() , empty_system() , x ); - BOOST_CHECK( first1 != last1 ); - BOOST_CHECK( ++first1 == last1 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm , Stepper , dummy_steppers ) -{ - typedef const_step_iterator< Stepper , empty_system , state_type > stepper_iterator; - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - stepper_iterator first( Stepper() , empty_system() , x , 0.0 , 0.35 , 0.1 ); - stepper_iterator last( Stepper() , empty_system() , x ); - - std::copy( first , last , std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-14 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-14 ); // the iterator should not iterate over the end -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_negative_time_step , Stepper , dummy_steppers ) -{ - typedef const_step_iterator< Stepper , empty_system , state_type > stepper_iterator; - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - stepper_iterator first( Stepper() , empty_system() , x , 0.3 , -0.05 , -0.1 ); - stepper_iterator last( Stepper() , empty_system() , x ); - - std::copy( first , last , std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-14 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-14 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - std::copy( make_const_step_iterator_begin( Stepper() , empty_system() , x , 0.0 , 0.35 , 0.1 ) , - make_const_step_iterator_end( Stepper() , empty_system() , x ) , - std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-14 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-14 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_range_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - boost::range::copy( make_const_step_range( Stepper() , empty_system() , x , 0.0 , 0.35 , 0.1 ) , - std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-14 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-14 ); -} - - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/const_step_time_iterator.cpp b/libs/numeric/odeint/test/const_step_time_iterator.cpp deleted file mode 100644 index 9227f5c04..000000000 --- a/libs/numeric/odeint/test/const_step_time_iterator.cpp +++ /dev/null @@ -1,218 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/const_step_time_iterator.cpp - - [begin_description] - This file tests the const step time iterator. - [end_description] - - Copyright 2012-2013 Karsten Ahnert - Copyright 2012-2013 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) - */ - - -#define BOOST_TEST_MODULE odeint_const_step_time_iterator - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include "dummy_steppers.hpp" -#include "dummy_odes.hpp" -#include "dummy_observers.hpp" - -namespace mpl = boost::mpl; -using namespace boost::numeric::odeint; - -typedef dummy_stepper::state_type state_type; -typedef dummy_stepper::value_type value_type; -typedef dummy_stepper::time_type time_type; -typedef std::vector< std::pair< state_type , time_type > > result_vector; - -BOOST_AUTO_TEST_SUITE( const_step_time_iterator_test ) - -typedef mpl::vector< - dummy_stepper - , dummy_dense_output_stepper - > dummy_steppers; - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_stepper_iterator , Stepper , dummy_steppers ) -{ - typedef const_step_time_iterator< Stepper , empty_system , state_type > iterator_type; - state_type x = {{ 1.0 }}; - iterator_type iter1 = iterator_type( Stepper() , empty_system() , x , 0.0 , 1.0 , 0.1 ); - iterator_type iter2 = iter1; - BOOST_CHECK_EQUAL( &( iter1->first ) , &( iter2->first ) ); - BOOST_CHECK_EQUAL( &( iter1->first ) , &x ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( assignment_stepper_iterator , Stepper , dummy_steppers ) -{ - typedef const_step_time_iterator< Stepper , empty_system , state_type > iterator_type; - state_type x1 = {{ 1.0 }} , x2 = {{ 2.0 }}; - iterator_type iter1 = iterator_type( Stepper() , empty_system() , x1 , 0.0 , 1.0 , 0.1 ); - iterator_type iter2 = iterator_type( Stepper() , empty_system() , x2 , 0.0 , 1.0 , 0.2 ); - BOOST_CHECK_EQUAL( &( iter1->first ) , &x1 ); - BOOST_CHECK_EQUAL( &( iter2->first ) , &x2 ); - BOOST_CHECK( !iter1.same( iter2 ) ); - iter2 = iter1; - BOOST_CHECK_EQUAL( &( iter1->first ) , &x1 ); - BOOST_CHECK_EQUAL( &( iter2->first ) , &x1 ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_iterator_factory , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_const_step_time_iterator_begin( stepper , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - make_const_step_time_iterator_end( stepper , boost::ref( system ) , x ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_range , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_const_step_time_range( stepper , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_iterator_with_reference_wrapper_factory , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_const_step_time_iterator_begin( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - make_const_step_time_iterator_end( boost::ref( stepper ) , boost::ref( system ) , x ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_range_with_reference_wrapper , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_const_step_time_range( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 1.0 , 0.1 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( transitivity1 , Stepper , dummy_steppers ) -{ - typedef const_step_time_iterator< Stepper , empty_system , state_type > stepper_iterator; - - state_type x = {{ 1.0 }}; - stepper_iterator first1( Stepper() , empty_system() , x , 1.5 , 1.0 , 0.1 ); - stepper_iterator last1( Stepper() , empty_system() , x ); - stepper_iterator last2( Stepper() , empty_system() , x ); - - BOOST_CHECK( first1 == last1 ); - BOOST_CHECK( first1 == last2 ); - BOOST_CHECK( last1 == last2 ); - - first1 = stepper_iterator( Stepper() , empty_system() , x , 2.0 , 2.0 , 0.1 ); - last1 = stepper_iterator( Stepper() , empty_system() , x ); - BOOST_CHECK( first1 != last1 ); - BOOST_CHECK( ++first1 == last1 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm , Stepper , dummy_steppers ) -{ - typedef const_step_time_iterator< Stepper , empty_system , state_type > stepper_iterator; - state_type x = {{ 1.0 }}; - result_vector res; - stepper_iterator first( Stepper() , empty_system() , x , 0.0 , 0.35 , 0.1 ); - stepper_iterator last( Stepper() , empty_system() , x ); - - std::copy( first , last , std::back_insert_iterator< result_vector >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0].first[0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[0].second , 0.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].first[0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].second , 0.1 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].first[0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].second , 0.2 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].first[0] , 1.75 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].second , 0.3 , 1.0e-13 ); - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - result_vector res; - std::copy( make_const_step_time_iterator_begin( Stepper() , empty_system() , x , 0.0 , 0.35 , 0.1 ) , - make_const_step_time_iterator_end( Stepper() , empty_system() , x ) , - std::back_insert_iterator< result_vector >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0].first[0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[0].second , 0.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].first[0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].second , 0.1 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].first[0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].second , 0.2 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].first[0] , 1.75 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].second , 0.3 , 1.0e-13 ); - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_range_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - result_vector res; - boost::range::copy( make_const_step_time_range( Stepper() , empty_system() , x , 0.0 , 0.35 , 0.1 ) , - std::back_insert_iterator< result_vector >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0].first[0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[0].second , 0.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].first[0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].second , 0.1 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].first[0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].second , 0.2 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].first[0] , 1.75 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].second , 0.3 , 1.0e-13 ); - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/default_operations.cpp b/libs/numeric/odeint/test/default_operations.cpp deleted file mode 100644 index a2634b7fe..000000000 --- a/libs/numeric/odeint/test/default_operations.cpp +++ /dev/null @@ -1,257 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/default_operations.cpp - - [begin_description] - This file tests default_operations. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011 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) -*/ - - -#define BOOST_TEST_MODULE odeint_standard_operations - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include - -namespace units = boost::units; -namespace si = boost::units::si; -namespace mpl = boost::mpl; -using boost::numeric::odeint::default_operations; - - -template< class Value > struct internal_value_type { typedef Value type; }; -template< class T > struct internal_value_type< std::complex< T > > { typedef T type; }; - -template< class T > struct default_eps; -template<> struct default_eps< double > { static double def_eps( void ) { return 1.0e-10; } }; -template<> struct default_eps< float > { static float def_eps( void ) { return 1.0e-5; } }; - - -typedef units::unit< units::derived_dimension< units::time_base_dimension , 2 >::type , si::system > time_2; -typedef units::unit< units::derived_dimension< units::time_base_dimension , 3 >::type , si::system > time_3; -typedef units::unit< units::derived_dimension< units::time_base_dimension , 4 >::type , si::system > time_4; -typedef units::unit< units::derived_dimension< units::time_base_dimension , 5 >::type , si::system > time_5; -typedef units::unit< units::derived_dimension< units::time_base_dimension , 6 >::type , si::system > time_6; -typedef units::unit< units::derived_dimension< units::time_base_dimension , 7 >::type , si::system > time_7; - -const time_2 second2 = si::second * si::second; -const time_3 second3 = second2 * si::second; -const time_4 second4 = second3 * si::second; -const time_5 second5 = second4 * si::second; -const time_6 second6 = second5 * si::second; -const time_7 second7 = second6 * si::second; - - - - -template< class Value , class Compare = typename internal_value_type< Value >::type > -struct double_fixture -{ - typedef Value value_type; - typedef Compare compare_type; - - double_fixture( const compare_type &eps_ = default_eps< compare_type >::def_eps() ) - : m_eps( eps_ ) , res( 0.0 ) , x1( 1.0 ) , x2( 2.0 ) , x3( 3.0 ) , x4( 4.0 ) , x5( 5.0 ) , x6( 6.0 ) , x7( 7.0 ) , x8( 8.0 ) - {} - - ~double_fixture( void ) - { - using std::abs; - BOOST_CHECK_SMALL( abs( x1 - value_type( 1.0 ) ) , m_eps ); - BOOST_CHECK_SMALL( abs( x2 - value_type( 2.0 ) ) , m_eps ); - BOOST_CHECK_SMALL( abs( x3 - value_type( 3.0 ) ) , m_eps ); - BOOST_CHECK_SMALL( abs( x4 - value_type( 4.0 ) ) , m_eps ); - BOOST_CHECK_SMALL( abs( x5 - value_type( 5.0 ) ) , m_eps ); - BOOST_CHECK_SMALL( abs( x6 - value_type( 6.0 ) ) , m_eps ); - BOOST_CHECK_SMALL( abs( x7 - value_type( 7.0 ) ) , m_eps ); - } - - const compare_type m_eps; - value_type res; - value_type x1 , x2 , x3 , x4 , x5 , x6 , x7 , x8; -}; - -template< class Value , class Compare = typename internal_value_type< Value >::type > -struct unit_fixture -{ - typedef Value value_type; - typedef Compare compare_type; - typedef units::quantity< si::length , value_type > length_type; - - typedef units::quantity< si::time , value_type > time_type; - typedef units::quantity< time_2 , value_type > time_2_type; - typedef units::quantity< time_3 , value_type > time_3_type; - typedef units::quantity< time_4 , value_type > time_4_type; - typedef units::quantity< time_5 , value_type > time_5_type; - typedef units::quantity< time_6 , value_type > time_6_type; - typedef units::quantity< time_7 , value_type > time_7_type; - - typedef units::quantity< si::velocity , value_type > velocity_type; - typedef units::quantity< si::acceleration , value_type > acceleration_type; - - unit_fixture( const compare_type &eps_ = default_eps< compare_type >::def_eps() ) - : m_eps( eps_ ) - , res( 0.0 * si::meter ) - , x( 1.0 * si::meter ) - , d1x( 2.0 * si::meter / si::second ) - , d2x( 3.0 * si::meter / si::second / si::second ) - {} - - ~unit_fixture( void ) - { - using std::abs; - BOOST_CHECK_SMALL( abs( x.value() - value_type( 1.0 ) ) , m_eps ); - BOOST_CHECK_SMALL( abs( d1x.value() - value_type( 2.0 ) ) , m_eps ); - BOOST_CHECK_SMALL( abs( d2x.value() - value_type( 3.0 ) ) , m_eps ); - } - - compare_type m_eps; - length_type res; - length_type x; - velocity_type d1x; - acceleration_type d2x; -}; - - -typedef mpl::list< float , double , std::complex< double > > test_types; - -BOOST_AUTO_TEST_SUITE( check_operations_test ) - -using std::abs; - -BOOST_AUTO_TEST_CASE_TEMPLATE( scale_sum2_test , T , test_types ) -{ - typedef double_fixture< T > fix_type; - fix_type f; - typedef typename default_operations::scale_sum2< T , T > Op; - Op op( 1.25 , 9.81 ); - op( f.res , f.x1 , f.x2 ); - BOOST_CHECK_SMALL( abs( f.res - T( 20.87 ) ) , f.m_eps ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( scale_sum3_test , T , test_types ) -{ - typedef double_fixture< T > fix_type; - fix_type f; - typedef default_operations::scale_sum3< T , T , T > Op; - Op op( 1.25 , 9.81 , 0.87 ); - op( f.res , f.x1 , f.x2 , f.x3 ); - BOOST_CHECK_SMALL( abs( f.res - T( 23.48 ) ) , f.m_eps ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( scale_sum4_test , T , test_types ) -{ - typedef double_fixture< T > fix_type; - fix_type f; - typedef default_operations::scale_sum4< T , T , T , T > Op; - Op op( 1.25 , 9.81 , 0.87 , -0.15 ); - op( f.res , f.x1 , f.x2 , f.x3 , f.x4 ); - BOOST_CHECK_SMALL( abs( f.res - T( 22.88 ) ) , f.m_eps ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( scale_sum5_test , T , test_types ) -{ - typedef double_fixture< T > fix_type; - fix_type f; - typedef default_operations::scale_sum5< T , T , T , T , T > Op; - Op op( 1.25 , 9.81 , 0.87 , -0.15 , -3.3 ); - op( f.res , f.x1 , f.x2 , f.x3 , f.x4 , f.x5 ); - BOOST_CHECK_SMALL( abs( f.res - T( 6.38 ) ) , f.m_eps ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( scale_sum6_test , T , test_types ) -{ - typedef double_fixture< T > fix_type; - fix_type f; - typedef default_operations::scale_sum6< T , T , T , T , T , T > Op; - Op op( 1.25 , 9.81 , 0.87 , -0.15 , -3.3 , 4.2 ); - op( f.res , f.x1 , f.x2 , f.x3 , f.x4 , f.x5 , f.x6 ); - BOOST_CHECK_SMALL( abs( f.res - T( 31.58 ) ) , f.m_eps ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( scale_sum7_test , T , test_types ) -{ - typedef double_fixture< T > fix_type; - fix_type f; - typedef default_operations::scale_sum7< T , T , T , T , T , T , T > Op; - Op op( 1.25 , 9.81 , 0.87 , -0.15 , -3.3 , 4.2 , -0.22 ); - op( f.res , f.x1 , f.x2 , f.x3 , f.x4 , f.x5 , f.x6 , f.x7 ); - BOOST_CHECK_SMALL( abs( f.res - T( 30.04 ) ) , f.m_eps ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( rel_error_test , T , test_types ) -{ - typedef double_fixture< T > fix_type; - fix_type f; - f.res = -1.1; - typedef default_operations::rel_error< T > Op; - Op op( 0.1 , 0.2 , 0.15 , 0.12 ); - op( f.res , -f.x1 , -f.x2 ); - BOOST_CHECK_SMALL( abs( f.res - T( 6.17978 ) ) , typename fix_type::compare_type( 1.0e-4 ) ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( maximum_test , T , test_types ) -{ - typedef double_fixture< T > fix_type; - fix_type f; - typedef default_operations::maximum< typename fix_type::compare_type > Op; - Op op; - f.res = op( f.x1 , f.x2 ); - BOOST_CHECK_SMALL( abs( f.res - T( 2.0 ) ) , f.m_eps ); -} - - - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( scale_sum2_units_test , T , test_types ) -{ - typedef unit_fixture< T > fix_type; - typedef typename fix_type::value_type value_type; - typedef typename fix_type::time_type time_type; - - fix_type f; - typedef default_operations::scale_sum2< value_type , time_type > Op; - Op op( 1.0 , time_type( 1.0 * si::second ) ); - op( f.res , f.x , f.d1x ); - BOOST_CHECK_SMALL( abs( f.res.value() - T( 3.0 ) ) , f.m_eps ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( scale_sum3_units_test , T , test_types ) -{ - typedef unit_fixture< T > fix_type; - typedef typename fix_type::value_type value_type; - typedef typename fix_type::time_type time_type; - typedef typename fix_type::time_2_type time_2_type; - - fix_type f; - typedef default_operations::scale_sum3< value_type , time_type , time_2_type > Op; - Op op( 1.0 , time_type( 1.0 * si::second ) , time_2_type( 1.0 * second2 ) ); - op( f.res , f.x , f.d1x , f.d2x ); - BOOST_CHECK_SMALL( abs( f.res.value() - T( 6.0 ) ) , f.m_eps ); -} - - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/diagnostic_state_type.hpp b/libs/numeric/odeint/test/diagnostic_state_type.hpp deleted file mode 100644 index 0c21013ea..000000000 --- a/libs/numeric/odeint/test/diagnostic_state_type.hpp +++ /dev/null @@ -1,185 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/diagnostic_state_type.hpp - - [begin_description] - tba. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012 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 LIBS_NUMERIC_ODEINT_TEST_DIAGNOSTIC_STATE_TYPE_HPP_DEFINED -#define LIBS_NUMERIC_ODEINT_TEST_DIAGNOSTIC_STATE_TYPE_HPP_DEFINED - -#include -#include -#include -#include -#include - -template< size_t N > -struct counter -{ - static size_t& adjust_size_count( void ) - { - static size_t m_adjust_size_count; - return m_adjust_size_count; - } - - static size_t& construct_count( void ) - { - static size_t m_construct_count; - return m_construct_count; - } - - static size_t& copy_count( void ) - { - static size_t m_copy_count; - return m_copy_count; - } - - static size_t& destroy_count( void ) - { - static size_t m_destroy_count; - return m_destroy_count; - } - - - static void init_counter( void ) - { - counter< N >::adjust_size_count() = 0; - counter< N >::construct_count() = 0; - counter< N >::copy_count() = 0; - counter< N >::destroy_count() = 0; - } -}; - -template< size_t N > -class diagnostic_type : public boost::array< double , 1 > { }; - - -typedef diagnostic_type< 0 > diagnostic_state_type; -typedef diagnostic_type< 1 > diagnostic_deriv_type; -typedef diagnostic_type< 2 > diagnostic_state_type2; -typedef diagnostic_type< 3 > diagnostic_deriv_type2; - -typedef counter< 0 > counter_state; -typedef counter< 1 > counter_deriv; -typedef counter< 2 > counter_state2; -typedef counter< 3 > counter_deriv2; - - - -namespace boost { -namespace numeric { -namespace odeint { - - template< size_t N > - struct is_resizeable< diagnostic_type< N > > - { - typedef boost::true_type type; - const static bool value = type::value; - }; - - template< size_t N , size_t M > - struct same_size_impl< diagnostic_type< N > , diagnostic_type< M > > - { - static bool same_size( const diagnostic_type< N > &x1 , const diagnostic_type< M > &x2 ) - { - return false; - } - }; - - template< size_t N , class State1 > - struct same_size_impl< diagnostic_type< N > , State1 > - { - static bool same_size( const diagnostic_type< N > &x1 , const State1 &x2 ) - { - return false; - } - }; - - template< class State1 , size_t N > - struct same_size_impl< State1 , diagnostic_type< N > > - { - static bool same_size( const State1 &x1 , const diagnostic_type< N > &x2 ) - { - return false; - } - }; - - - - template< size_t N , class StateIn > - struct resize_impl< diagnostic_type< N > , StateIn > - { - static void resize( diagnostic_type< N > &x1 , const StateIn &x2 ) - { - counter< N >::adjust_size_count()++; - } - }; - - template< size_t N > - struct state_wrapper< diagnostic_type< N > > - { - typedef state_wrapper< diagnostic_type< N > > state_wrapper_type; - typedef diagnostic_type< N > state_type; - typedef double value_type; - - state_type m_v; - - state_wrapper() : m_v() - { - counter< N >::construct_count()++; - } - - state_wrapper( const state_type &v ) : m_v( v ) - { - counter< N >::construct_count()++; - counter< N >::copy_count()++; - } - - state_wrapper( const state_wrapper_type &x ) : m_v( x.m_v ) - { - counter< N >::construct_count()++; - counter< N >::copy_count()++; - } - - state_wrapper_type& operator=( const state_wrapper_type &x ) - { - counter< N >::copy_count()++; - return *this; - } - - ~state_wrapper() - { - counter< N >::destroy_count()++; - } - }; - - -} // namespace odeint -} // namespace numeric -} // namespace boost - -#define TEST_COUNTERS( c , s1 , s2 , s3 ,s4 ) \ - BOOST_CHECK_EQUAL( c::adjust_size_count() , size_t( s1 ) ); \ - BOOST_CHECK_EQUAL( c::construct_count() , size_t( s2 ) ); \ - BOOST_CHECK_EQUAL( c::copy_count() , size_t( s3 ) ); \ - BOOST_CHECK_EQUAL( c::destroy_count() , size_t( s4 ) ); - -#define TEST_COUNTERS_MSG( c , s1 , s2 , s3 ,s4 , msg ) \ - BOOST_CHECK_EQUAL( c::adjust_size_count() , size_t( s1 ) ); \ - BOOST_CHECK_EQUAL( c::construct_count() , size_t( s2 ) ); \ - BOOST_CHECK_EQUAL( c::copy_count() , size_t( s3 ) ); \ - BOOST_CHECK_EQUAL( c::destroy_count() , size_t( s4 ) ); - - -#endif // LIBS_NUMERIC_ODEINT_TEST_DIAGNOSTIC_STATE_TYPE_HPP_DEFINED diff --git a/libs/numeric/odeint/test/dummy_observers.hpp b/libs/numeric/odeint/test/dummy_observers.hpp deleted file mode 100644 index 744c374f1..000000000 --- a/libs/numeric/odeint/test/dummy_observers.hpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/dummy_observers.hpp - - [begin_description] - tba. - [end_description] - - Copyright 2013 Karsten Ahnert - Copyright 2013 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 LIBS_NUMERIC_ODEINT_TEST_DUMMY_OBSERVERS_HPP_DEFINED -#define LIBS_NUMERIC_ODEINT_TEST_DUMMY_OBSERVERS_HPP_DEFINED - - -namespace boost { -namespace numeric { -namespace odeint { - - -struct dummy_observer -{ - template< class State > - void operator()( const State &s ) const - { - } -}; - - -} // namespace odeint -} // namespace numeric -} // namespace boost - - -#endif // LIBS_NUMERIC_ODEINT_TEST_DUMMY_OBSERVERS_HPP_DEFINED diff --git a/libs/numeric/odeint/test/dummy_odes.hpp b/libs/numeric/odeint/test/dummy_odes.hpp deleted file mode 100644 index 7a92363f6..000000000 --- a/libs/numeric/odeint/test/dummy_odes.hpp +++ /dev/null @@ -1,151 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/dummy_odes.hpp - - [begin_description] - tba. - [end_description] - - Copyright 2012-2013 Karsten Ahnert - Copyright 2013 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 LIBS_NUMERIC_ODEINT_TEST_DUMMY_ODES_HPP_DEFINED -#define LIBS_NUMERIC_ODEINT_TEST_DUMMY_ODES_HPP_DEFINED - -#include - - - - - - -/* - * rhs functors/functions for different state types - */ -struct constant_system_functor_standard -{ - template< class State , class Deriv , class Time > - void operator()( const State &x , Deriv &dxdt , const Time t ) const - { - dxdt[0] = 1.0; - } -}; - -struct constant_system_functor_vector_space -{ - template< class State , class Deriv , class Time > - void operator()( const State &x , Deriv &dxdt , const Time t ) const - { - dxdt = 1.0; - } -}; - -struct constant_system_functor_fusion -{ - template< class State , class Deriv , class Time > - void operator()( const State &x , Deriv &dxdt , const Time t ) const - { - boost::fusion::at_c< 0 >( dxdt ) = boost::fusion::at_c< 0 >( x ) / Time( 1.0 ); - } -}; - -struct lorenz -{ - template< typename State , typename Deriv , typename Time > - void operator()( const State& x , Deriv& dxdt , const Time& t ) const - { - const Time sigma = 10.0; - const Time R = 28.0; - const Time b = 8.0 / 3.0; - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; - } -}; - -template< class State , class Deriv , class Time > -void constant_system_standard( const State &x , Deriv &dxdt , const Time t ) -{ - dxdt[0] = 1.0; -} - -template< class State , class Deriv , class Time > -void constant_system_vector_space( const State &x , Deriv &dxdt , const Time t ) -{ - dxdt = 1.0; -} - -template< class State , class Deriv , class Time > -void constant_system_fusion( const State &x , Deriv &dxdt , const Time t ) -{ - boost::fusion::at_c< 0 >( dxdt ) = boost::fusion::at_c< 0 >( x ) / Time( 1.0 ); -} - - - - -/* - * rhs functors for symplectic steppers - */ -struct constant_mom_func -{ - template< class StateIn , class StateOut > - void operator()( const StateIn &q , StateOut &dp ) const - { - dp[0] = 1.0; - } -}; - -struct default_coor_func -{ - template< class StateIn , class StateOut > - void operator()( const StateIn &p , StateOut &dq ) const - { - dq[0] = p[0]; - } -}; - - - -struct constant_mom_func_vector_space_1d -{ - template< class T > - void operator()( const T &q , T &dp ) const - { - dp = 1.0; - } -}; - -struct default_coor_func_vector_space_1d -{ - template< class T > - void operator()( const T &p , T &dq ) const - { - dq = p; - } -}; - - - - - - - -struct empty_system -{ - template - void operator()( const State &x , State &dxdt , double t ) const - { - } -}; - - - - -#endif // LIBS_NUMERIC_ODEINT_TEST_DUMMY_ODES_HPP_DEFINED diff --git a/libs/numeric/odeint/test/dummy_steppers.hpp b/libs/numeric/odeint/test/dummy_steppers.hpp deleted file mode 100644 index 5f8d749fd..000000000 --- a/libs/numeric/odeint/test/dummy_steppers.hpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/dummy_steppers.hpp - - [begin_description] - Dummy steppers for several tests. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012 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_LIBS_NUMERIC_ODEINT_TEST_DUMMY_STEPPER_HPP_INCLUDED -#define BOOST_LIBS_NUMERIC_ODEINT_TEST_DUMMY_STEPPER_HPP_INCLUDED - -#include -#include -#include - -namespace boost { -namespace numeric { -namespace odeint { - -struct dummy_stepper -{ - typedef double value_type; - typedef value_type time_type; - typedef boost::array< value_type , 1 > state_type; - typedef state_type deriv_type; - typedef unsigned short order_type; - typedef stepper_tag stepper_category; - - order_type order( void ) const { return 1; } - - template< class System > - void do_step( System sys , state_type &x , time_type t , time_type dt ) const - { - x[0] += 0.25; - } -}; - -struct dummy_dense_output_stepper -{ - typedef double value_type; - typedef value_type time_type; - typedef boost::array< value_type , 1 > state_type; - typedef state_type deriv_type; - typedef dense_output_stepper_tag stepper_category; - - void initialize( const state_type &x0 , time_type t0 , time_type dt0 ) - { - m_x = x0; - m_t = t0; - m_dt = dt0; - } - - template< class System > - std::pair< time_type , time_type > do_step( System sys ) - { - m_x[0] += 0.25; - m_t += m_dt; - return std::make_pair( m_t - m_dt , m_t ); - } - - void calc_state( time_type t_inter , state_type &x ) const - { - value_type theta = ( m_t - t_inter ) / m_dt; - x[0] = m_x[0] - 0.25 * theta; - - } - - const time_type& current_time( void ) const - { - return m_t; - } - - const state_type& current_state( void ) const - { - return m_x; - } - - const time_type& current_time_step( void ) const - { - return m_dt; - } - - state_type m_x; - time_type m_t; - time_type m_dt; -}; - - - -struct dummy_controlled_stepper -{ - typedef double value_type; - typedef value_type time_type; - typedef boost::array< value_type , 1 > state_type; - typedef state_type deriv_type; - typedef controlled_stepper_tag stepper_category; - - template< class Sys > - controlled_step_result try_step( Sys sys , state_type &x , time_type &t , time_type &dt ) const - { - x[0] += 0.25; - t += dt; - return success; - } -}; - - -} // odeint -} // numeric -} // boost - - -#endif // BOOST_LIBS_NUMERIC_ODEINT_TEST_DUMMY_STEPPER_HPP_INCLUDED diff --git a/libs/numeric/odeint/test/euler_stepper.cpp b/libs/numeric/odeint/test/euler_stepper.cpp deleted file mode 100644 index a274de4b2..000000000 --- a/libs/numeric/odeint/test/euler_stepper.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/euler_stepper.cpp - - [begin_description] - This file tests explicit Euler stepper. - [end_description] - - Copyright 2011 Mario Mulansky - Copyright 2012 Karsten Ahnert - - Distributed under the 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_TEST_MODULE odeint_explicit_euler - -#include - -#include -#include -#include - -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -// test with own vector implementation - -class my_vec : public std::vector< double > { - -public: - - my_vec() : std::vector< double >() - { } - - my_vec( const my_vec &x ) : std::vector< double >( x ) - { } - - - my_vec( size_t dim ) - : std::vector< double >( dim ) - { } - -}; - -namespace boost { -namespace numeric { -namespace odeint { - -template<> -struct is_resizeable< my_vec > -{ - //struct type : public boost::true_type { }; - typedef boost::true_type type; - const static bool value = type::value; -}; -} } } - -typedef double value_type; -//typedef std::vector< value_type > state_type; -typedef my_vec state_type; - -/* use functors, because functions don't work with msvc 10, I guess this is a bug */ -struct sys -{ - void operator()( const state_type &x , state_type &dxdt , const value_type t ) const - { - std::cout << "sys start " << dxdt.size() << std::endl; - dxdt[0] = x[0] + 2 * x[1]; - dxdt[1] = x[1]; - std::cout << "sys done" << std::endl; - } -}; - - -BOOST_AUTO_TEST_SUITE( explicit_euler_test ) - -BOOST_AUTO_TEST_CASE( test_euler ) -{ - range_algebra algebra; - euler< state_type > stepper( algebra ); - state_type x( 2 ); - x[0] = 0.0; x[1] = 1.0; - - std::cout << "initialized" << std::endl; - - const value_type eps = 1E-12; - const value_type dt = 0.1; - - stepper.do_step( sys() , x , 0.0 , dt ); - - using std::abs; - - // compare with analytic solution of above system - BOOST_CHECK_MESSAGE( abs( x[0] - 2.0*1.0*dt ) < eps , x[0] - 2.0*1.0*dt ); - BOOST_CHECK_MESSAGE( abs( x[1] - (1.0 + dt) ) < eps , x[1] - (1.0+dt) ); - -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/fusion_algebra.cpp b/libs/numeric/odeint/test/fusion_algebra.cpp deleted file mode 100644 index cc63fa921..000000000 --- a/libs/numeric/odeint/test/fusion_algebra.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/fusion_algebra.cpp - - [begin_description] - This file tests the Fusion algebra. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2013 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) - */ - - -#define BOOST_TEST_MODULE odeint_fusion_algebra - -// using fusion vectors as state types requires increased macro variables -#define BOOST_FUSION_INVOKE_MAX_ARITY 15 -#define BOOST_RESULT_OF_NUM_ARGS 15 - -#include -#include -#include -#include - -#include - -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include -#include - -namespace units = boost::units; -namespace si = boost::units::si; -namespace fusion = boost::fusion; - -using boost::numeric::odeint::default_operations; -using boost::numeric::odeint::fusion_algebra; - -typedef double value_type; -typedef units::quantity< si::time , value_type > time_type; -typedef units::quantity< si::length , value_type > length_type; -typedef units::quantity< si::velocity , value_type > velocity_type; -typedef units::quantity< si::acceleration , value_type > acceleration_type; -typedef fusion::vector< length_type , velocity_type > state_type; -typedef fusion::vector< velocity_type , acceleration_type > deriv_type; - -const time_type dt = 0.1 * si::second; - - -struct fusion_fixture -{ - fusion_fixture( void ) - : res( 0.0 * si::meter , 0.0 * si::meter_per_second ) , - x( 1.0 * si::meter , 1.0 * si::meter_per_second ) , - k1( 1.0 * si::meter_per_second , 1.0 * si::meter_per_second_squared ) , - k2( 2.0 * si::meter_per_second , 2.0 * si::meter_per_second_squared ) , - k3( 3.0 * si::meter_per_second , 3.0 * si::meter_per_second_squared ) , - k4( 4.0 * si::meter_per_second , 4.0 * si::meter_per_second_squared ) , - k5( 5.0 * si::meter_per_second , 5.0 * si::meter_per_second_squared ) , - k6( 6.0 * si::meter_per_second , 6.0 * si::meter_per_second_squared ) { } - - ~fusion_fixture( void ) - { - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( x ).value() , 1.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( x ).value() , 1.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( k1 ).value() , 1.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( k1 ).value() , 1.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( k2 ).value() , 2.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( k2 ).value() , 2.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( k3 ).value() , 3.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( k3 ).value() , 3.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( k4 ).value() , 4.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( k4 ).value() , 4.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( k5 ).value() , 5.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( k5 ).value() , 5.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( k6 ).value() , 6.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( k6 ).value() , 6.0 , 1.0e-10 ); - } - - state_type res , x; - deriv_type k1 , k2 , k3 , k4 , k5 , k6 ; -}; - - - -BOOST_AUTO_TEST_SUITE( fusion_algebra_test ) - -fusion_algebra algebra; - -BOOST_AUTO_TEST_CASE( for_each2 ) -{ - fusion_fixture f; - algebra.for_each2( f.res , f.k1 , - default_operations::scale_sum1< time_type >( dt ) ); - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( f.res ).value() , 0.1 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( f.res ).value() , 0.1 , 1.0e-10 ); -} - -BOOST_AUTO_TEST_CASE( for_each3 ) -{ - fusion_fixture f; - algebra.for_each3( f.res , f.x , f.k1 , - default_operations::scale_sum2< value_type , time_type >( 1.0 , dt ) ); - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( f.res ).value() , 1.1 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( f.res ).value() , 1.1 , 1.0e-10 ); -} - -BOOST_AUTO_TEST_CASE( for_each4 ) -{ - fusion_fixture f; - algebra.for_each4( f.res , f.x , f.k1 , f.k2 , - default_operations::scale_sum3< value_type , time_type , time_type >( 1.0 , dt , dt ) ); - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( f.res ).value() , 1.3 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( f.res ).value() , 1.3 , 1.0e-10 ); -} - -BOOST_AUTO_TEST_CASE( for_each5 ) -{ - fusion_fixture f; - algebra.for_each5( f.res , f.x , f.k1 , f.k2 , f.k3 , - default_operations::scale_sum4< value_type , time_type , time_type , time_type >( 1.0 , dt , dt , dt ) ); - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( f.res ).value() , 1.6 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( f.res ).value() , 1.6 , 1.0e-10 ); -} - -BOOST_AUTO_TEST_CASE( for_each6 ) -{ - fusion_fixture f; - algebra.for_each6( f.res , f.x , f.k1 , f.k2 , f.k3 , f.k4 , - default_operations::scale_sum5< value_type , time_type , time_type , time_type , time_type >( 1.0 , dt , dt , dt , dt ) ); - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( f.res ).value() , 2.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( f.res ).value() , 2.0 , 1.0e-10 ); -} - -BOOST_AUTO_TEST_CASE( for_each7 ) -{ - fusion_fixture f; - algebra.for_each7( f.res , f.x , f.k1 , f.k2 , f.k3 , f.k4 , f.k5 , - default_operations::scale_sum6< value_type , time_type , time_type , time_type , time_type , time_type >( 1.0 , dt , dt , dt , dt , dt ) ); - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( f.res ).value() , 2.5 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( f.res ).value() , 2.5 , 1.0e-10 ); -} - -BOOST_AUTO_TEST_CASE( for_each8 ) -{ - fusion_fixture f; - algebra.for_each8( f.res , f.x , f.k1 , f.k2 , f.k3 , f.k4 , f.k5 , f.k6 , - default_operations::scale_sum7< value_type , time_type , time_type , time_type , time_type , time_type , time_type >( 1.0 , dt , dt , dt , dt , dt , dt ) ); - BOOST_CHECK_CLOSE( fusion::at_c< 0 >( f.res ).value() , 3.1 , 1.0e-10 ); - BOOST_CHECK_CLOSE( fusion::at_c< 1 >( f.res ).value() , 3.1 , 1.0e-10 ); -} - -BOOST_AUTO_TEST_CASE( for_each15 ) -{ - fusion_fixture f; - algebra.for_each15( f.res , f.x , f.k1 , f.k2 , f.k3 , f.k4 , f.k5 , f.k6 , f.k1 , f.k2 , f.k3 , f.k4 , f.k5 , f.k6 , f.k1 , - default_operations::scale_sum14< value_type , time_type , time_type , time_type , time_type , time_type , time_type , - time_type , time_type , time_type , time_type , time_type , time_type , time_type >( 1.0 , dt , dt , dt , dt , dt , dt , dt , dt , dt , dt , dt , dt , dt ) ); - //BOOST_CHECK_CLOSE( fusion::at_c< 0 >( f.res ).value() , 3.1 , 1.0e-10 ); - //BOOST_CHECK_CLOSE( fusion::at_c< 1 >( f.res ).value() , 3.1 , 1.0e-10 ); -} - - -BOOST_AUTO_TEST_CASE( norm_inf ) -{ - double nrm = algebra.norm_inf( fusion::make_vector( 1.0 , 2.0 , 3.0 ) ); - BOOST_CHECK_CLOSE( nrm , 3.0 , 1.0e-10 ); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/generation.cpp b/libs/numeric/odeint/test/generation.cpp deleted file mode 100644 index 6432692d7..000000000 --- a/libs/numeric/odeint/test/generation.cpp +++ /dev/null @@ -1,87 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/generation.cpp - - [begin_description] - This file tests the generation functions. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2012 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) - */ - - -#define BOOST_TEST_MODULE odeint_generation - -#include - -#include -#include -#include - -#include -#include - -using namespace boost::numeric::odeint; - -template< class Stepper1 , class Stepper2 > -void check_stepper_type( const Stepper1 &s1 , const Stepper2 &s2 ) -{ - BOOST_STATIC_ASSERT(( boost::is_same< Stepper1 , Stepper2 >::value )); -} - -BOOST_AUTO_TEST_SUITE( generation_test ) - -typedef std::vector< double > state_type; - -typedef runge_kutta_cash_karp54< state_type > rk54_type; -typedef runge_kutta_cash_karp54_classic< state_type > rk54_classic_type; -typedef runge_kutta_dopri5< state_type > dopri5_type; -typedef runge_kutta_fehlberg78< state_type > fehlberg78_type; -typedef rosenbrock4< double > rosenbrock4_type; - - -BOOST_AUTO_TEST_CASE( test_generation_dopri5 ) -{ - check_stepper_type( make_controlled( 1.0e-6 , 1.0e-10 , dopri5_type() ) , controlled_runge_kutta< dopri5_type >() ); - check_stepper_type( make_controlled< dopri5_type >( 1.0e-6 , 1.0e-10 ) , controlled_runge_kutta< dopri5_type >() ); - - check_stepper_type( make_dense_output( 1.0e-6 , 1.0e-10 , dopri5_type() ) , dense_output_runge_kutta< controlled_runge_kutta< dopri5_type > >() ); - check_stepper_type( make_dense_output< dopri5_type >( 1.0e-6 , 1.0e-10 ) , dense_output_runge_kutta< controlled_runge_kutta< dopri5_type > >() ); -} - -BOOST_AUTO_TEST_CASE( test_generation_cash_karp54 ) -{ - check_stepper_type( make_controlled( 1.0e-6 , 1.0e-10 , rk54_type() ) , controlled_runge_kutta< rk54_type >() ); - check_stepper_type( make_controlled< rk54_type >( 1.0e-6 , 1.0e-10 ) , controlled_runge_kutta< rk54_type >() ); -} - -BOOST_AUTO_TEST_CASE( test_generation_cash_karp54_classic ) -{ - check_stepper_type( make_controlled( 1.0e-6 , 1.0e-10 , rk54_classic_type() ) , controlled_runge_kutta< rk54_classic_type >() ); - check_stepper_type( make_controlled< rk54_classic_type >( 1.0e-6 , 1.0e-10 ) , controlled_runge_kutta< rk54_classic_type >() ); -} - - -BOOST_AUTO_TEST_CASE( test_generation_fehlberg78 ) -{ - check_stepper_type( make_controlled( 1.0e-6 , 1.0e-10 , fehlberg78_type() ) , controlled_runge_kutta< fehlberg78_type >() ); - check_stepper_type( make_controlled< fehlberg78_type >( 1.0e-6 , 1.0e-10 ) , controlled_runge_kutta< fehlberg78_type >() ); -} - - -BOOST_AUTO_TEST_CASE( test_generation_rosenbrock4 ) -{ - check_stepper_type( make_controlled( 1.0e-6 , 1.0e-10 , rosenbrock4_type() ) , rosenbrock4_controller< rosenbrock4_type >() ); - check_stepper_type( make_controlled< rosenbrock4_type >( 1.0e-6 , 1.0e-10 ) , rosenbrock4_controller< rosenbrock4_type >() ); - - check_stepper_type( make_dense_output( 1.0e-6 , 1.0e-10 , rosenbrock4_type() ) , rosenbrock4_dense_output< rosenbrock4_controller< rosenbrock4_type > >() ); - check_stepper_type( make_dense_output< rosenbrock4_type >( 1.0e-6 , 1.0e-10 ) , rosenbrock4_dense_output< rosenbrock4_controller< rosenbrock4_type > >() ); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/generic_error_stepper.cpp b/libs/numeric/odeint/test/generic_error_stepper.cpp deleted file mode 100644 index 0b18da89b..000000000 --- a/libs/numeric/odeint/test/generic_error_stepper.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/generic_error_stepper.cpp - - [begin_description] - This file tests the generic error stepper. - [end_description] - - Copyright 2011 Mario Mulansky - Copyright 2012 Karsten Ahnert - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or - copy at http://www.boost.org/LICENSE_1_0.txt) - */ - - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_generic_error_stepper - -#include -#include - -#include - -#include -#include -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -namespace fusion = boost::fusion; - -typedef double value_type; -typedef boost::array< value_type , 2 > state_type; - -void sys( const state_type &x , state_type &dxdt , const value_type &t ) -{ - dxdt[ 0 ] = x[ 0 ] + 2 * x[ 1 ]; - dxdt[ 1 ] = x[ 1 ]; -} - -typedef explicit_error_generic_rk< 6 , 5 , 4 , 5 , state_type> error_rk_generic_type; - -const boost::array< double , 1 > a1 = {{ 0.2 }}; -const boost::array< double , 2 > a2 = {{ 3.0/40.0 , 9.0/40 }}; -const boost::array< double , 3 > a3 = {{ 0.3 , -0.9 , 1.2 }}; -const boost::array< double , 4 > a4 = {{ -11.0/54.0 , 2.5 , -70.0/27.0 , 35.0/27.0 }}; -const boost::array< double , 5 > a5 = {{ 1631.0/55296.0 , 175.0/512.0 , 575.0/13824.0 , 44275.0/110592.0 , 253.0/4096.0 }}; - -const error_rk_generic_type::coef_a_type a = fusion::make_vector( a1 , a2 , a3 , a4 , a5 ); -const error_rk_generic_type::coef_b_type b = {{ 37.0/378.0 , 0.0 , 250.0/621.0 , 125.0/594.0 , 0.0 , 512.0/1771.0 }}; -const error_rk_generic_type::coef_b_type b2 = {{ b[0]-2825.0/27648.0 , b[1]-0.0 , b[2]-18575.0/48384.0 , b[3]-13525.0/55296.0 , b[4]-277.0/14336.0 , b[5]-0.25 }}; -const error_rk_generic_type::coef_c_type c = {{ 0.0 , 0.2 , 0.3 , 0.6 , 1.0 , 7.0/8 }}; - -typedef runge_kutta_cash_karp54< state_type > error_rk54_ck_generic_type; -typedef runge_kutta_cash_karp54_classic< state_type > rk54_ck_type; - -BOOST_AUTO_TEST_SUITE( generic_error_stepper_test ) - -BOOST_AUTO_TEST_CASE( test_generic_error_stepper ) -{ - //simultaneously test copying - error_rk_generic_type rk_generic_( a , b , b2 , c ); - error_rk_generic_type rk_generic = rk_generic_; - - error_rk54_ck_generic_type rk54_ck_generic_; - error_rk54_ck_generic_type rk54_ck_generic = rk54_ck_generic_; - - //std::cout << stepper; - - rk54_ck_type rk54_ck_; - rk54_ck_type rk54_ck = rk54_ck_; - - typedef error_rk_generic_type::state_type state_type; - typedef error_rk_generic_type::value_type stepper_value_type; - typedef error_rk_generic_type::deriv_type deriv_type; - typedef error_rk_generic_type::time_type time_type; - - state_type x = {{ 0.0 , 1.0 }}; - state_type y = x; - state_type z = x; - state_type x_err , y_err , z_err; - - rk_generic.do_step( sys , x , 0.0 , 0.1 , x_err ); - - rk54_ck_generic.do_step( sys , y , 0.0 , 0.1 , y_err); - - rk54_ck.do_step( sys , z , 0.0 , 0.1 , z_err ); - - BOOST_CHECK_NE( 0.0 , x[0] ); - BOOST_CHECK_NE( 1.0 , x[1] ); - BOOST_CHECK_NE( 0.0 , x_err[0] ); - BOOST_CHECK_NE( 0.0 , x_err[1] ); - // compare with analytic solution of above system - BOOST_CHECK_EQUAL( x[0] , y[0] ); - BOOST_CHECK_EQUAL( x[1] , y[1] ); - BOOST_CHECK_EQUAL( x[0] , z[0] ); - BOOST_CHECK_EQUAL( x[1] , z[1] ); - -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/generic_stepper.cpp b/libs/numeric/odeint/test/generic_stepper.cpp deleted file mode 100644 index e2c18272f..000000000 --- a/libs/numeric/odeint/test/generic_stepper.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/generic_stepper.cpp - - [begin_description] - This file tests the generic stepper. - [end_description] - - Copyright 2011 Mario Mulansky - Copyright 2012 Karsten Ahnert - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or - copy at http://www.boost.org/LICENSE_1_0.txt) - */ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_generic_stepper - -#include -#include - -#include - -#include -#include -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -namespace fusion = boost::fusion; - -typedef double value_type; -typedef boost::array< value_type , 2 > state_type; - -void sys( const state_type &x , state_type &dxdt , const value_type &t ) -{ - dxdt[ 0 ] = x[ 0 ] + 2 * x[ 1 ]; - dxdt[ 1 ] = x[ 1 ]; -} - -typedef explicit_generic_rk< 4 , 4 , state_type> rk_generic_type; -typedef runge_kutta4< state_type > rk4_generic_type; - -const boost::array< double , 1 > a1 = {{ 0.5 }}; -const boost::array< double , 2 > a2 = {{ 0.0 , 0.5 }}; -const boost::array< double , 3 > a3 = {{ 0.0 , 0.0 , 1.0 }}; - -const rk_generic_type::coef_a_type a = fusion::make_vector( a1 , a2 , a3 ); -const rk_generic_type::coef_b_type b = {{ 1.0/6 , 1.0/3 , 1.0/3 , 1.0/6 }}; -const rk_generic_type::coef_c_type c = {{ 0.0 , 0.5 , 0.5 , 1.0 }}; - -typedef runge_kutta4_classic< state_type > rk4_type; - -BOOST_AUTO_TEST_SUITE( generic_stepper_test ) - -BOOST_AUTO_TEST_CASE( test_generic_stepper ) -{ - //simultaneously test copying - rk_generic_type rk_generic_( a , b , c ); - rk_generic_type rk_generic = rk_generic_; - - rk4_generic_type rk4_generic_; - rk4_generic_type rk4_generic = rk4_generic_; - - //std::cout << stepper; - - rk4_type rk4_; - rk4_type rk4 = rk4_; - - typedef rk_generic_type::state_type state_type; - typedef rk_generic_type::value_type stepper_value_type; - typedef rk_generic_type::deriv_type deriv_type; - typedef rk_generic_type::time_type time_type; - - state_type x = {{ 0.0 , 1.0 }}; - state_type y = x; - state_type z = x; - - rk_generic.do_step( sys , x , 0.0 , 0.1 ); - - rk4_generic.do_step( sys , y , 0.0 , 0.1 ); - - rk4.do_step( sys , z , 0.0 , 0.1 ); - - BOOST_CHECK_NE( 0.0 , x[0] ); - BOOST_CHECK_NE( 1.0 , x[1] ); - // compare with analytic solution of above system - BOOST_CHECK_EQUAL( x[0] , y[0] ); - BOOST_CHECK_EQUAL( x[1] , y[1] ); - BOOST_CHECK_EQUAL( x[0] , z[0] ); - BOOST_CHECK_EQUAL( x[1] , z[1] ); - -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/implicit_euler.cpp b/libs/numeric/odeint/test/implicit_euler.cpp deleted file mode 100644 index 575c896a8..000000000 --- a/libs/numeric/odeint/test/implicit_euler.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/implicit_euler.cpp - - [begin_description] - This file tests the implicit Euler stepper. - [end_description] - - Copyright 2010-2011 Mario Mulansky - Copyright 2010-2012 Karsten Ahnert - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or - copy at http://www.boost.org/LICENSE_1_0.txt) - */ - - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_implicit_euler - -#include - -#include -#include - -#include -//#include - -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef double value_type; -typedef boost::numeric::ublas::vector< value_type > state_type; -typedef boost::numeric::ublas::matrix< value_type > matrix_type; - -/* use functors, because functions don't work with msvc 10, I guess this is a bug */ -struct sys -{ - void operator()( const state_type &x , state_type &dxdt , const value_type t ) const - { - dxdt( 0 ) = x( 0 ) + 2 * x( 1 ); - dxdt( 1 ) = x( 1 ); - } -}; - -struct jacobi -{ - void operator()( const state_type &x , matrix_type &jacobi , const value_type t ) const - { - jacobi( 0 , 0 ) = 1; - jacobi( 0 , 1 ) = 2; - jacobi( 1 , 0 ) = 0; - jacobi( 1 , 1 ) = 1; - } -}; - -BOOST_AUTO_TEST_SUITE( implicit_euler_test ) - -BOOST_AUTO_TEST_CASE( test_euler ) -{ - implicit_euler< value_type > stepper; - state_type x( 2 ); - x(0) = 0.0; x(1) = 1.0; - - value_type eps = 1E-12; - - /* make_pair doesn't work with function pointers on msvc 10 */ - stepper.do_step( std::make_pair( sys() , jacobi() ) , x , 0.0 , 0.1 ); - - using std::abs; - - // compare with analytic solution of above system - BOOST_CHECK_MESSAGE( abs( x(0) - 20.0/81.0 ) < eps , x(0) - 20.0/81.0 ); - BOOST_CHECK_MESSAGE( abs( x(1) - 10.0/9.0 ) < eps , x(0) - 10.0/9.0 ); - -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/integrate.cpp b/libs/numeric/odeint/test/integrate.cpp deleted file mode 100644 index a90e8b373..000000000 --- a/libs/numeric/odeint/test/integrate.cpp +++ /dev/null @@ -1,285 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/integrate.cpp - - [begin_description] - This file tests the integrate function and its variants. - [end_description] - - Copyright 2011-2012 Mario Mulansky - Copyright 2011-2012 Karsten Ahnert - - Distributed under the 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_TEST_MODULE odeint_integrate_functions - -#include -#include -#include - -#include - -#include -#include -#include - -#include - -#include - -// nearly everything from odeint is used in these tests -#ifndef ODEINT_INTEGRATE_ITERATOR -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - - -typedef double value_type; -typedef std::vector< value_type > state_type; - -void lorenz( const state_type &x , state_type &dxdt , const value_type t ) -{ - //const value_type sigma( 10.0 ); - const value_type R( 28.0 ); - const value_type b( value_type( 8.0 ) / value_type( 3.0 ) ); - - // first component trivial - dxdt[0] = 1.0; //sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; -} - -struct push_back_time -{ - std::vector< double >& m_times; - - state_type& m_x; - - push_back_time( std::vector< double > × , state_type &x ) - : m_times( times ) , m_x( x ) { } - - void operator()( const state_type &x , double t ) - { - m_times.push_back( t ); - boost::numeric::odeint::copy( x , m_x ); - } -}; - -template< class Stepper > -struct perform_integrate_const_test -{ - void operator()( const value_type t_end , const value_type dt ) - { - // std::cout << "Testing integrate_const with " << typeid( Stepper ).name() << std::endl; - - state_type x( 3 , 10.0 ) , x_end( 3 ); - - std::vector< value_type > times; - - size_t steps = integrate_const( Stepper() , lorenz , x , 0.0 , t_end , - dt , push_back_time( times , x_end ) ); - - std::cout.precision(16); - std::cout << t_end << " (" << dt << "), " << steps << " , " << times.size() << " , " << 10.0+dt*steps << "=" << x_end[0] << std::endl; - - std::cout << static_cast(floor(t_end/dt)) << " , " << t_end/dt << std::endl; - - BOOST_CHECK_EQUAL( static_cast(times.size()) , static_cast(floor(t_end/dt))+1 ); - - for( size_t i=0 ; i(i)*dt << std::endl; - // check if observer was called at times 0,1,2,... - BOOST_CHECK_SMALL( times[i] - static_cast< value_type >(i)*dt , (i+1) * 2E-16 ); - } - - // check first, trivial, component - BOOST_CHECK_SMALL( (10.0 + times[times.size()-1]) - x_end[0] , 1E-6 ); // precision of steppers: 1E-6 - //BOOST_CHECK_EQUAL( x[1] , x_end[1] ); - //BOOST_CHECK_EQUAL( x[2] , x_end[2] ); - } -}; - -template< class Stepper > -struct perform_integrate_adaptive_test -{ - void operator()( const value_type t_end = 10.0 , const value_type dt = 0.03 ) - { - // std::cout << "Testing integrate_adaptive with " << typeid( Stepper ).name() << std::endl; - - state_type x( 3 , 10.0 ) , x_end( 3 ); - - std::vector< value_type > times; - - size_t steps = integrate_adaptive( Stepper() , lorenz , x , 0.0 , t_end , - dt , push_back_time( times , x_end ) ); - - // std::cout << t_end << " , " << steps << " , " << times.size() << " , " << dt << " , " << 10.0+t_end << "=" << x_end[0] << std::endl; - - BOOST_CHECK_EQUAL( times.size() , steps+1 ); - - BOOST_CHECK_SMALL( times[0] - 0.0 , 2E-16 ); - BOOST_CHECK_SMALL( times[times.size()-1] - t_end , times.size() * 2E-16 ); - - // check first, trivial, component - BOOST_CHECK_SMALL( (10.0 + t_end) - x_end[0] , 1E-6 ); // precision of steppers: 1E-6 -// BOOST_CHECK_EQUAL( x[1] , x_end[1] ); -// BOOST_CHECK_EQUAL( x[2] , x_end[2] ); - } -}; - - -template< class Stepper > -struct perform_integrate_times_test -{ - void operator()( const int n = 10 , const int dn=1 , const value_type dt = 0.03 ) - { - // std::cout << "Testing integrate_times with " << typeid( Stepper ).name() << std::endl; - - state_type x( 3 ) , x_end( 3 ); - x[0] = x[1] = x[2] = 10.0; - - std::vector< double > times; - - std::vector< double > obs_times( abs(n) ); - for( int i=0 ; boost::numeric::odeint::detail::less_with_sign( static_cast(i) , - static_cast(obs_times.size()) , - dt ) ; i+=dn ) - { - obs_times[i] = i; - } - // simple stepper - integrate_times( Stepper() , lorenz , x , obs_times.begin() , obs_times.end() , - dt , push_back_time( times , x_end ) ); - - BOOST_CHECK_EQUAL( static_cast(times.size()) , abs(n) ); - - for( size_t i=0 ; i(i) ); - - // check first, trivial, component - BOOST_CHECK_SMALL( (10.0 + 1.0*times[times.size()-1]) - x_end[0] , 1E-6 ); // precision of steppers: 1E-6 -// BOOST_CHECK_EQUAL( x[1] , x_end[1] ); -// BOOST_CHECK_EQUAL( x[2] , x_end[2] ); - } -}; - -template< class Stepper > -struct perform_integrate_n_steps_test -{ - void operator()( const int n = 200 , const value_type dt = 0.01 ) - { - // std::cout << "Testing integrate_n_steps with " << typeid( Stepper ).name() << ". "; - // std::cout << "dt=" << dt << std::endl; - - state_type x( 3 ) , x_end( 3 ); - x[0] = x[1] = x[2] = 10.0; - - std::vector< double > times; - - // simple stepper - value_type end_time = integrate_n_steps( Stepper() , lorenz , x , 0.0 , dt , n , push_back_time( times , x_end ) ); - - BOOST_CHECK_SMALL( end_time - n*dt , 2E-16 ); - BOOST_CHECK_EQUAL( static_cast(times.size()) , n+1 ); - - for( size_t i=0 ; i(i) * dt, 2E-16); - } - // check first, trivial, component - BOOST_CHECK_SMALL( (10.0 + end_time) - x_end[0] , 1E-6 ); // precision of steppers: 1E-6 -// BOOST_CHECK_EQUAL( x[1] , x_end[1] ); -// BOOST_CHECK_EQUAL( x[2] , x_end[2] ); - - } -}; - - - -class stepper_methods : public mpl::vector< - euler< state_type > , - modified_midpoint< state_type > , - runge_kutta4< state_type > , - runge_kutta_cash_karp54< state_type > , - runge_kutta_dopri5< state_type > , - runge_kutta_fehlberg78< state_type > , - controlled_runge_kutta< runge_kutta_cash_karp54< state_type > > , - controlled_runge_kutta< runge_kutta_dopri5< state_type > > , - controlled_runge_kutta< runge_kutta_fehlberg78< state_type > > , - bulirsch_stoer< state_type > , - dense_output_runge_kutta< controlled_runge_kutta< runge_kutta_dopri5< state_type > > > - //bulirsch_stoer_dense_out< state_type > -> { }; - - - -BOOST_AUTO_TEST_SUITE( integrate_test ) - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_const_test_case , Stepper, stepper_methods ) -{ - perform_integrate_const_test< Stepper > tester; - tester( 1.005 , 0.01 ); - tester( 1.0 , 0.01 ); - tester( 1.1 , 0.01 ); - tester( -1.005 , -0.01 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_adaptive_test_case , Stepper, stepper_methods ) -{ - perform_integrate_adaptive_test< Stepper > tester; - tester( 1.005 , 0.01 ); - tester( 1.0 , 0.01 ); - tester( 1.1 , 0.01 ); - tester( -1.005 , -0.01 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_times_test_case , Stepper, stepper_methods ) -{ - perform_integrate_times_test< Stepper > tester; - tester(); - //tester( -10 , -0.01 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_n_steps_test_case , Stepper, stepper_methods ) -{ - perform_integrate_n_steps_test< Stepper > tester; - tester(); - tester( 200 , 0.01 ); - tester( 200 , 0.01 ); - tester( 200 , 0.01 ); - tester( 200 , -0.01 ); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/integrate_implicit.cpp b/libs/numeric/odeint/test/integrate_implicit.cpp deleted file mode 100644 index 4bff200ae..000000000 --- a/libs/numeric/odeint/test/integrate_implicit.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/integrate_implicit.cpp - - [begin_description] - This file tests the integrate function and its variants with the implicit steppers. - [end_description] - - Copyright 2011 Mario Mulansky - Copyright 2011-2013 Karsten Ahnert - - Distributed under the 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_TEST_MODULE odeint_integrate_functions_implicit - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include - -#include - -#ifndef ODEINT_INTEGRATE_ITERATOR -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif -#include -#include -#include - - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; -namespace ublas = boost::numeric::ublas; - -typedef double value_type; -typedef ublas::vector< value_type > state_type; -typedef boost::numeric::ublas::matrix< value_type > matrix_type; - -struct sys -{ - void operator()( const state_type &x , state_type &dxdt , const value_type &t ) const - { - dxdt( 0 ) = x( 0 ) + 2 * x( 1 ); - dxdt( 1 ) = x( 1 ); - } -}; - -struct jacobi -{ - void operator()( const state_type &x , matrix_type &jacobi , const value_type &t , state_type &dfdt ) const - { - jacobi( 0 , 0 ) = 1; - jacobi( 0 , 1 ) = 2; - jacobi( 1 , 0 ) = 0; - jacobi( 1 , 1 ) = 1; - dfdt( 0 ) = 0.0; - dfdt( 1 ) = 0.0; - } -}; - -struct push_back_time -{ - std::vector< double >& m_times; - - push_back_time( std::vector< double > × ) - : m_times( times ) { } - - void operator()( const state_type &x , double t ) - { - m_times.push_back( t ); - } -}; - -template< class Stepper > -struct perform_integrate_const_test -{ - void operator()( void ) - { - state_type x( 2 , 1.0 ); - const value_type dt = 0.03; - const value_type t_end = 10.0; - - std::vector< value_type > times; - - integrate_const( Stepper() , std::make_pair( sys() , jacobi() ) , x , 0.0 , t_end , - dt , push_back_time( times ) ); - - BOOST_CHECK_EQUAL( static_cast(times.size()) , static_cast(std::floor(t_end/dt))+1 ); - - for( size_t i=0 ; i(i)*dt , (i+1) * 2.0e-16 ); - } - } -}; - -template< class Stepper > -struct perform_integrate_adaptive_test -{ - void operator()( void ) - { - state_type x( 2 , 1.0 ); - const value_type dt = 0.03; - const value_type t_end = 10.0; - - std::vector< value_type > times; - - size_t steps = integrate_adaptive( Stepper() , std::make_pair( sys() , jacobi() ) , x , 0.0 , t_end , - dt , push_back_time( times ) ); - - BOOST_CHECK_EQUAL( times.size() , steps+1 ); - - BOOST_CHECK_SMALL( times[0] - 0.0 , 2.0e-16 ); - BOOST_CHECK_SMALL( times[times.size()-1] - t_end , times.size() * 3.0e-16 ); - } -}; - - -template< class Stepper > -struct perform_integrate_times_test -{ - void operator()( void ) - { - state_type x( 2 , 1.0 ); - - const value_type dt = 0.03; - - std::vector< double > times; - - // simple stepper - integrate_times( Stepper() , std::make_pair( sys() , jacobi() ) , x , - boost::counting_iterator(0) , boost::counting_iterator(10) , - dt , push_back_time( times ) ); - - BOOST_CHECK_EQUAL( static_cast(times.size()) , 10 ); - - for( size_t i=0 ; i(i) ); - } -}; - -template< class Stepper > -struct perform_integrate_n_steps_test -{ - void operator()( void ) - { - state_type x( 2 , 1.0 ); - - const value_type dt = 0.03; - const int n = 200; - - std::vector< double > times; - - // simple stepper - value_type end_time = integrate_n_steps( Stepper() , std::make_pair( sys() , jacobi() ) , x , 0.0 , dt , n , push_back_time( times ) ); - - BOOST_CHECK_SMALL( end_time - n*dt , 3.0e-16 ); - BOOST_CHECK_EQUAL( static_cast(times.size()) , n+1 ); - - for( size_t i=0 ; i(i)*dt , (i+1) * 2.0e-16 ); - } -}; - - - -class stepper_methods : public mpl::vector< - rosenbrock4< value_type > , - rosenbrock4_controller< rosenbrock4< value_type > > , - rosenbrock4_dense_output< rosenbrock4_controller< rosenbrock4< value_type > > > -> { }; - - - -BOOST_AUTO_TEST_SUITE( integrate_test ) - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_const_test_case , Stepper, stepper_methods ) -{ - perform_integrate_const_test< Stepper > tester; - tester(); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_adaptive_test_case , Stepper, stepper_methods ) -{ - perform_integrate_adaptive_test< Stepper > tester; - tester(); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_times_test_case , Stepper, stepper_methods ) -{ - perform_integrate_times_test< Stepper > tester; - tester(); -} - - -class simple_stepper_methods : public mpl::vector< - rosenbrock4< value_type > -> { }; - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_n_steps_test_case , Stepper, simple_stepper_methods ) -{ - perform_integrate_n_steps_test< Stepper > tester; - tester(); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/integrate_overflow.cpp b/libs/numeric/odeint/test/integrate_overflow.cpp deleted file mode 100644 index 0dba4046a..000000000 --- a/libs/numeric/odeint/test/integrate_overflow.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/integrate_overflow.cpp - - [begin_description] - This file tests the overflow exception of the integrate functions. - [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) - */ - - -#define BOOST_TEST_MODULE odeint_integrate_overflow - -#include - -#include -#include -#include - - -#include -#include -#include - -#include - -#include - - -using namespace boost::numeric::odeint; - - -typedef double value_type; -typedef std::vector< value_type > state_type; - -// the famous lorenz system as usual -void lorenz( const state_type &x , state_type &dxdt , const value_type t ) -{ - //const value_type sigma( 10.0 ); - const value_type R( 28.0 ); - const value_type b( value_type( 8.0 ) / value_type( 3.0 ) ); - - // first component trivial - dxdt[0] = 1.0; //sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; -} - -struct push_back_time -{ - std::vector< double >& m_times; - - push_back_time( std::vector< double > × ) - : m_times( times ) { } - - void operator()( const state_type &x , double t ) - { - m_times.push_back( t ); - } -}; - -typedef runge_kutta_dopri5 stepper_type; -typedef runge_kutta_cash_karp54 cash_karp_type; - - -BOOST_AUTO_TEST_SUITE( integrate_overflow ) - -BOOST_AUTO_TEST_CASE( test_integrate_const ) -{ - state_type x(3, 5.0); - std::vector times; - - // check the function signatures with normal stepper - integrate_const(stepper_type(), lorenz, x, 0.0, 10.0, 1.0); - integrate_const(stepper_type(), lorenz, x, 0.0, 10.0, 1.0, null_observer()); - // no exceptions expected for normal steppers - integrate_const(stepper_type(), lorenz, x, 0.0, 10.0, 1.0, null_observer(), max_step_checker(10)); - - - // check exceptions for controlled stepper - integrate_const(make_controlled(1E-5, 1E-5), lorenz, x, 0.0, 10.0, 1.0); - // very small error terms -> standard overflow threshold of 500 should fire an exception - BOOST_CHECK_THROW(integrate_const(make_controlled(1E-15, 1E-15), lorenz, x, - 0.0, 10.0, 1.0, push_back_time(times), max_step_checker()), - std::runtime_error); - // small threshold of 10 -> larger error still gives an exception - BOOST_CHECK_THROW(integrate_const(make_controlled(1E-5, 1E-5), lorenz, x, - 0.0, 10.0, 1.0, push_back_time(times), max_step_checker(10)), - std::runtime_error); - - // check exceptions for dense output stepper - integrate_const(make_dense_output(1E-5, 1E-5), lorenz, x, 0.0, 10.0, 1.0); - integrate_const(make_dense_output(1E-5, 1E-5), lorenz, x, 0.0, 10.0, 1.0); - // very small error terms -> standard overflow threshold of 500 should fire an exception - BOOST_CHECK_THROW(integrate_const(make_dense_output(1E-15, 1E-15), lorenz, x, - 0.0, 10.0, 1.0, push_back_time(times), max_step_checker()), - std::runtime_error); - // small threshold of 10 -> larger error still gives an exception - BOOST_CHECK_THROW(integrate_const(make_dense_output(1E-5, 1E-5), lorenz, x, - 0.0, 10.0, 1.0, push_back_time(times), max_step_checker(10)), - std::runtime_error); -} - -BOOST_AUTO_TEST_CASE( test_integrate_n_steps ) -{ - state_type x(3, 5.0); - std::vector times; - - // check the function signatures with normal stepper - integrate_n_steps(stepper_type(), lorenz, x, 0.0, 1.0, 10); - integrate_n_steps(stepper_type(), lorenz, x, 0.0, 1.0, 10, null_observer()); - // no exceptions expected for normal steppers - integrate_n_steps(stepper_type(), lorenz, x, 0.0, 1.0, 10, null_observer(), max_step_checker(10)); - - - // check exceptions for controlled stepper - integrate_n_steps(make_controlled(1E-5, 1E-5), lorenz, x, 0.0, 1.0, 10); - // very small error terms -> standard overflow threshold of 500 should fire an exception - BOOST_CHECK_THROW(integrate_n_steps(make_controlled(1E-15, 1E-15), lorenz, x, - 0.0, 1.0, 10, push_back_time(times), max_step_checker()), - std::runtime_error); - // small threshold of 10 -> larger error still gives an exception - BOOST_CHECK_THROW(integrate_n_steps(make_controlled(1E-5, 1E-5), lorenz, x, - 0.0, 1.0, 10, push_back_time(times), max_step_checker(10)), - std::runtime_error); - - // check exceptions for dense output stepper - integrate_n_steps(make_dense_output(1E-5, 1E-5), lorenz, x, 0.0, 1.0, 10); - integrate_n_steps(make_dense_output(1E-5, 1E-5), lorenz, x, 0.0, 1.0, 10, push_back_time(times)); - // very small error terms -> standard overflow threshold of 500 should fire an exception - BOOST_CHECK_THROW(integrate_n_steps(make_dense_output(1E-15, 1E-15), lorenz, x, - 0.0, 1.0, 10, push_back_time(times), max_step_checker()), - std::runtime_error); - // small threshold of 10 -> larger error still gives an exception - BOOST_CHECK_THROW(integrate_n_steps(make_dense_output(1E-5, 1E-5), lorenz, x, - 0.0, 1.0, 10, push_back_time(times), max_step_checker(10)), - std::runtime_error); -} - -BOOST_AUTO_TEST_CASE( test_integrate_times ) -{ - state_type x(3, 5.0); - std::vector times; - boost::counting_iterator t0(0); - boost::counting_iterator t1(10); - - // check the function signatures with normal stepper - integrate_times(stepper_type(), lorenz, x, t0, t1, 1.0 , push_back_time(times)); - // no exceptions expected for big enough step size - integrate_times(stepper_type(), lorenz, x, t0, t1, 1.0 , push_back_time(times), max_step_checker(10)); - // if dt*max_steps < observer time difference we expect an exception - BOOST_CHECK_THROW(integrate_times(stepper_type(), lorenz, x, t0, t1, 0.01, push_back_time(times), - max_step_checker(10)), - std::runtime_error); - - // check exceptions for controlled stepper - // no exception if no checker is provided - integrate_times(make_controlled(1E-5, 1E-5), lorenz, x, t0, t1, 1.0 , push_back_time(times)); - // very small error terms -> standard overflow threshold of 500 should fire an exception - BOOST_CHECK_THROW(integrate_times(make_controlled(1E-15, 1E-15), lorenz, x, - t0, t1, 1.0 , push_back_time(times), max_step_checker()), - std::runtime_error); - - // small threshold of 10 -> larger error still gives an exception - BOOST_CHECK_THROW(integrate_times(make_controlled(1E-5, 1E-5), lorenz, x, - t0, t1, 1.0 , push_back_time(times), max_step_checker(10)), - std::runtime_error); - - // check cash karp controlled stepper - // no exception if no checker is provided - integrate_times(make_controlled(1E-5, 1E-5), lorenz, x, t0, t1, 1.0 , push_back_time(times)); - // very small error terms -> standard overflow threshold of 500 should fire an exception - BOOST_CHECK_THROW(integrate_times(make_controlled(1E-15, 1E-15), lorenz, x, - t0, t1, 1.0 , push_back_time(times), max_step_checker()), - std::runtime_error); - - // small threshold of 10 -> larger error still gives an exception - BOOST_CHECK_THROW(integrate_times(make_controlled(1E-5, 1E-5), lorenz, x, - t0, t1, 1.0 , push_back_time(times), max_step_checker(10)), - std::runtime_error); - - // check exceptions for dense output stepper - integrate_times(make_dense_output(1E-5, 1E-5), lorenz, x, t0, t1, 1.0 , - push_back_time(times)); - // very small error terms -> standard overflow threshold of 500 should fire an exception - BOOST_CHECK_THROW(integrate_times(make_dense_output(1E-15, 1E-15), lorenz, x, - t0, t1, 1.0 , push_back_time(times), max_step_checker()), - std::runtime_error); - // small threshold of 10 -> larger error still gives an exception - BOOST_CHECK_THROW(integrate_times(make_dense_output(1E-5, 1E-5), lorenz, x, - t0, t1, 1.0 , push_back_time(times), max_step_checker(10)), - std::runtime_error); -} - -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file diff --git a/libs/numeric/odeint/test/integrate_stepper_refs.cpp b/libs/numeric/odeint/test/integrate_stepper_refs.cpp deleted file mode 100644 index 5d6d34c94..000000000 --- a/libs/numeric/odeint/test/integrate_stepper_refs.cpp +++ /dev/null @@ -1,271 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/integrate_stepper_refs.cpp - - [begin_description] - Tests the integrate functions with boost::ref( stepper) - [end_description] - - Copyright 2009-2013 Karsten Ahnert - Copyright 2009-2013 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) - */ - - -#define BOOST_TEST_MODULE odeint_integrate_stepper_refs - -#include -#include -#include - -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -typedef double value_type; -typedef std::vector< value_type > state_type; - -// minimal non-copyable basic stepper -template< -class State -> -class simple_stepper_nc : boost::noncopyable -{ -public : - typedef State state_type; - typedef double value_type; - typedef state_type deriv_type; - typedef double time_type; - typedef size_t order_type; - typedef stepper_tag stepper_category; - - template< class System > - void do_step( System system , state_type &in , time_type t , time_type dt ) - { - // empty - - } -}; - -// minimal non-copyable controlled stepper -template< -class State -> -class controlled_stepper_nc : boost::noncopyable -{ -public : - typedef State state_type; - typedef double value_type; - typedef state_type deriv_type; - typedef double time_type; - typedef size_t order_type; - typedef controlled_stepper_tag stepper_category; - - template< class System > - controlled_step_result try_step( System system , state_type &in , time_type &t , time_type &dt ) - { - std::cout << "dense out stepper: " << t << " , " << dt << std::endl; - t += dt; - return success; - } -}; - -// minimal non-copyable dense_output stepper -template< -class State -> -class dense_out_stepper_nc : boost::noncopyable -{ -public : - typedef State state_type; - typedef double value_type; - typedef state_type deriv_type; - typedef double time_type; - typedef size_t order_type; - typedef dense_output_stepper_tag stepper_category; - - void initialize( const state_type &x0 , const time_type t0 , const time_type dt0 ) - { - m_x = x0; - m_t = t0; - m_dt = dt0; - std::cout << "initialize: " << m_t << " , " << m_dt << std::endl; - } - - template< class System > - void do_step( System system ) - { - std::cout << "dense out stepper: " << m_t << " , " << m_dt << std::endl; - m_t += m_dt; - } - - void calc_state( const time_type t_inter , state_type &x ) - { - x = m_x; - } - - const state_type& current_state() const - { return m_x; } - - time_type current_time() const - { return m_t; } - - time_type current_time_step() const - { return m_dt; } - - -private : - time_type m_t; - time_type m_dt; - state_type m_x; -}; - - -void lorenz( const state_type &x , state_type &dxdt , const value_type t ) -{ - //const value_type sigma( 10.0 ); - const value_type R( 28.0 ); - const value_type b( value_type( 8.0 ) / value_type( 3.0 ) ); - - // first component trivial - dxdt[0] = 1.0; //sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; -} - -struct push_back_time -{ - std::vector< double >& m_times; - - state_type& m_x; - - push_back_time( std::vector< double > × , state_type &x ) - : m_times( times ) , m_x( x ) { } - - void operator()( const state_type &x , double t ) - { - m_times.push_back( t ); - boost::numeric::odeint::copy( x , m_x ); - } -}; - -template< class Stepper > -struct perform_integrate_const_test -{ - void operator()() - { - state_type x( 3 , 10.0 ) , x_end( 3 ); - - std::vector< value_type > times; - - Stepper stepper; - - integrate_const( boost::ref(stepper) , lorenz , x , 0.0 , 1.0 , - 0.1, push_back_time( times , x_end ) ); - } -}; - -template< class Stepper > -struct perform_integrate_adaptive_test -{ - void operator()() - { - state_type x( 3 , 10.0 ) , x_end( 3 ); - - std::vector< value_type > times; - - Stepper stepper; - - integrate_adaptive( boost::ref(stepper) , lorenz , x , 0.0 , 1.0 , - 0.1, push_back_time( times , x_end ) ); - } -}; - -template< class Stepper > -struct perform_integrate_n_steps_test -{ - void operator()() - { - state_type x( 3 , 10.0 ) , x_end( 3 ); - - std::vector< value_type > times; - - Stepper stepper; - - integrate_n_steps( boost::ref(stepper) , lorenz , x , 0.0 , 0.1 , - 10 , push_back_time( times , x_end ) ); - } -}; - -template< class Stepper > -struct perform_integrate_times_test -{ - void operator()() - { - state_type x( 3 , 10.0 ) , x_end( 3 ); - - std::vector< value_type > times; - - Stepper stepper; - - integrate_times( boost::ref(stepper) , lorenz , x , - boost::counting_iterator(0) , boost::counting_iterator(10) , 0.1 , - push_back_time( times , x_end ) ); - } -}; - -class stepper_methods : public mpl::vector< - simple_stepper_nc< state_type > , - controlled_stepper_nc< state_type >, - dense_out_stepper_nc< state_type > > { }; - -BOOST_AUTO_TEST_SUITE( integrate_stepper_refs ) - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_const_test_case , Stepper, stepper_methods ) -{ - std::cout << "integrate const" << std::endl; - perform_integrate_const_test< Stepper > tester; - tester(); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_adaptive_test_case , Stepper, stepper_methods ) -{ - std::cout << "integrate adaptive" << std::endl; - perform_integrate_adaptive_test< Stepper > tester; - tester(); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_n_steps_test_case , Stepper, stepper_methods ) -{ - std::cout << "integrate n steps" << std::endl; - perform_integrate_n_steps_test< Stepper > tester; - tester(); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_times_test_case , Stepper, stepper_methods ) -{ - std::cout << "integrate times" << std::endl; - perform_integrate_times_test< Stepper > tester; - tester(); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/integrate_times.cpp b/libs/numeric/odeint/test/integrate_times.cpp deleted file mode 100644 index 2837f09e3..000000000 --- a/libs/numeric/odeint/test/integrate_times.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/integrate_times.cpp - - [begin_description] - This file tests the integrate_times function and its variants. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2012 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) - */ - -#define BOOST_TEST_MODULE odeint_integrate_times - -#include - -#include -#include -#include - -#include -#include - -#ifndef ODEINT_INTEGRATE_ITERATOR -#include -#include -#else -#include -#include -#endif -#include -#include -#include -#include -#include -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef double value_type; -typedef std::vector< value_type > state_type; - - -void lorenz( const state_type &x , state_type &dxdt , const value_type t ) -{ - BOOST_CHECK( t >= 0.0 ); - - const value_type sigma( 10.0 ); - const value_type R( 28.0 ); - const value_type b( value_type( 8.0 ) / value_type( 3.0 ) ); - - dxdt[0] = sigma * ( x[1] - x[0] ); - dxdt[1] = R * x[0] - x[1] - x[0] * x[2]; - dxdt[2] = -b * x[2] + x[0] * x[1]; -} - -struct push_back_time -{ - std::vector< double >& m_times; - - push_back_time( std::vector< double > × ) - : m_times( times ) { } - - void operator()( const state_type &x , double t ) - { - m_times.push_back( t ); - } -}; - -BOOST_AUTO_TEST_SUITE( integrate_times_test ) - -BOOST_AUTO_TEST_CASE( test_integrate_times ) -{ - - state_type x( 3 ); - x[0] = x[1] = x[2] = 10.0; - - const value_type dt = 0.03; - - std::vector< double > times; - - std::cout << "test rk4 stepper" << std::endl; - - // simple stepper - integrate_times( runge_kutta4< state_type >() , lorenz , x , boost::counting_iterator(0) , boost::counting_iterator(10) , - dt , push_back_time( times ) ); - - for( int i=0 ; i<10 ; ++i ) - // check if observer was called at times 0,1,2,... - BOOST_CHECK_EQUAL( times[i] , static_cast(i) ); - times.clear(); - - std::cout << "test dopri5 stepper" << std::endl; - - // controlled stepper - integrate_times( controlled_runge_kutta< runge_kutta_dopri5< state_type > >() , lorenz , x , - boost::counting_iterator(0) , boost::counting_iterator(10) , - dt , push_back_time( times ) ); - - for( int i=0 ; i<10 ; ++i ) - // check if observer was called at times 0,1,2,... - BOOST_CHECK_EQUAL( times[i] , static_cast(i) ); - times.clear(); - - std::cout << "test BS stepper" << std::endl; - - //another controlled stepper - integrate_times( bulirsch_stoer< state_type >() , lorenz , x , - boost::counting_iterator(0) , boost::counting_iterator(10) , - dt , push_back_time( times ) ); - - for( int i=0 ; i<10 ; ++i ) - // check if observer was called at times 0,1,2,... - BOOST_CHECK_EQUAL( times[i] , static_cast(i) ); - times.clear(); - - std::cout << "test dense_out stepper" << std::endl; - - // dense output stepper - integrate_times( dense_output_runge_kutta< controlled_runge_kutta< runge_kutta_dopri5< state_type > > >() , - lorenz , x , - boost::counting_iterator(0) , boost::counting_iterator(10) , - dt , push_back_time( times ) ); - - for( int i=0 ; i<10 ; ++i ) - // check if observer was called at times 0,1,2,... - BOOST_CHECK_EQUAL( times[i] , static_cast(i) ); - - std::cout << "test BS_do stepper" << std::endl; - - integrate_times( bulirsch_stoer_dense_out< state_type >() , lorenz , x , - boost::counting_iterator(0) , boost::counting_iterator(10) , - dt , push_back_time( times ) ); - - for( int i=0 ; i<10 ; ++i ) - // check if observer was called at times 0,1,2,... - BOOST_CHECK_EQUAL( times[i] , static_cast(i) ); - -} - - -BOOST_AUTO_TEST_CASE( test_integrate_times_ranges ) -{ - - state_type x( 3 ); - x[0] = x[1] = x[2] = 10.0; - - const value_type dt = 0.03; - - std::vector< double > times; - - // simple stepper - integrate_times( runge_kutta4< state_type >() , lorenz , x , - std::make_pair( boost::counting_iterator(0) , boost::counting_iterator(10) ) , - dt , push_back_time( times ) ); - - for( int i=0 ; i<10 ; ++i ) - // check if observer was called at times 0,1,2,... - BOOST_CHECK_EQUAL( times[i] , static_cast(i) ); - times.clear(); - - // controlled stepper - integrate_times( controlled_runge_kutta< runge_kutta_dopri5< state_type > >() , lorenz , x , - std::make_pair( boost::counting_iterator(0) , boost::counting_iterator(10) ) , - dt , push_back_time( times ) ); - - for( int i=0 ; i<10 ; ++i ) - // check if observer was called at times 0,1,2,... - BOOST_CHECK_EQUAL( times[i] , static_cast(i) ); - times.clear(); - - //another controlled stepper - integrate_times( bulirsch_stoer< state_type >() , lorenz , x , - std::make_pair( boost::counting_iterator(0) , boost::counting_iterator(10) ) , - dt , push_back_time( times ) ); - - for( int i=0 ; i<10 ; ++i ) - // check if observer was called at times 0,1,2,... - BOOST_CHECK_EQUAL( times[i] , static_cast(i) ); - times.clear(); - - - // dense output stepper - integrate_times( bulirsch_stoer_dense_out< state_type >() , lorenz , x , - std::make_pair( boost::counting_iterator(0) , boost::counting_iterator(10) ) , - dt , push_back_time( times ) ); - - for( int i=0 ; i<10 ; ++i ) - // check if observer was called at times 0,1,2,... - BOOST_CHECK_EQUAL( times[i] , static_cast(i) ); - -} - -BOOST_AUTO_TEST_CASE( test_integrate_times_overshoot ) -{ - state_type x( 3 ); - x[0] = x[1] = x[2] = 10.0; - double dt = -0.1; - - std::vector times( 10 ); - for( int i=0 ; i<10 ; ++i ) - times[i] = 1.0-i*1.0/9.0; - - std::cout << "test rk4 stepper" << std::endl; - // simple stepper - std::vector obs_times; - int steps = integrate_times( runge_kutta4< state_type >() , lorenz , x , - times.begin() , times.end() , - dt , push_back_time( obs_times ) ); -// different behavior for the iterator based integrate implementaton -#ifndef ODEINT_INTEGRATE_ITERATOR - BOOST_CHECK_EQUAL( steps , 18 ); // we really need 18 steps because dt and - // the difference of the observation times - // are so out of sync -#else - // iterator based implementation can only return the number of iteration steps - BOOST_CHECK_EQUAL( steps , 9 ); -#endif - for( int i=0 ; i<10 ; ++i ) - BOOST_CHECK_EQUAL( times[i] , obs_times[i] ); - - std::cout << "test rk_ck stepper" << std::endl; - // controlled stepper - obs_times.clear(); - integrate_times( controlled_runge_kutta< runge_kutta_cash_karp54< state_type > >() , lorenz , x , - times.begin() , times.end() , - dt , push_back_time( obs_times ) ); - for( int i=0 ; i<10 ; ++i ) - BOOST_CHECK_EQUAL( times[i] , obs_times[i] ); - - std::cout << "test dopri5 stepper" << std::endl; - // controlled stepper - obs_times.clear(); - integrate_times( dense_output_runge_kutta< controlled_runge_kutta< runge_kutta_dopri5< state_type > > >() , lorenz , x , - times.begin() , times.end() , - dt , push_back_time( obs_times ) ); - for( int i=0 ; i<10 ; ++i ) - BOOST_CHECK_EQUAL( times[i] , obs_times[i] ); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/integrators_symplectic.cpp b/libs/numeric/odeint/test/integrators_symplectic.cpp deleted file mode 100644 index 2c2861950..000000000 --- a/libs/numeric/odeint/test/integrators_symplectic.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/integrators_symplectic.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2009-2013 Karsten Ahnert - Copyright 2009-2013 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) - */ - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_iterators_symplectic - -#define BOOST_FUSION_INVOKE_MAX_ARITY 15 -#define BOOST_RESULT_OF_NUM_ARGS 15 -#define FUSION_MAX_VECTOR_SIZE 15 - -#include - -#include - -#ifndef ODEINT_INTEGRATE_ITERATOR -#include -#else -#include -#endif -#include -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; -namespace fusion = boost::fusion; - -typedef std::vector container_type; - -struct harm_osc { - void operator()( const container_type &q , container_type &dpdt ) - { - dpdt[0] = -q[0]; - } -}; - -class complete_steppers : public mpl::vector< - symplectic_euler< container_type > - , symplectic_rkn_sb3a_mclachlan< container_type > - , symplectic_rkn_sb3a_m4_mclachlan< container_type > - > {}; - -BOOST_AUTO_TEST_SUITE( symplectic_steppers_test ) - - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_integrate_const , Stepper , complete_steppers ) -{ - container_type q( 1 , 1.0 ) , p( 1 , 0.0 ); - size_t steps = integrate_const( Stepper() , harm_osc() , - std::make_pair( boost::ref(q) , boost::ref(p) ) , - 0.0 , 1.0 , 0.1 ); - BOOST_CHECK( steps == 10 ); - BOOST_CHECK_CLOSE( q[0] , std::cos(1.0) , 100*std::pow( 0.1 , Stepper::order_value ) ); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/is_pair.cpp b/libs/numeric/odeint/test/is_pair.cpp deleted file mode 100644 index bf3bc35b0..000000000 --- a/libs/numeric/odeint/test/is_pair.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/is_pair.cpp - - [begin_description] - This file tests the is_pair meta-function. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2012 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) -*/ - -#define BOOST_TEST_MODULE odeint_is_pair - -#include - -#include -#include - -#include - -using namespace boost::numeric::odeint; - - - -BOOST_AUTO_TEST_SUITE( is_pair_test ) - -BOOST_AUTO_TEST_CASE( test_is_pair ) -{ - typedef std::pair< int , int > type1; - typedef std::pair< int& , int > type2; - typedef std::pair< int , int& > type3; - typedef std::pair< int& , int& > type4; - typedef std::pair< const int , int > type5; - typedef std::pair< const int& , int > type6; - - BOOST_STATIC_ASSERT(( is_pair< type1 >::value )); - BOOST_STATIC_ASSERT(( is_pair< type2 >::value )); - BOOST_STATIC_ASSERT(( is_pair< type3 >::value )); - BOOST_STATIC_ASSERT(( is_pair< type4 >::value )); - BOOST_STATIC_ASSERT(( is_pair< type5 >::value )); - BOOST_STATIC_ASSERT(( is_pair< type6 >::value )); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/is_resizeable.cpp b/libs/numeric/odeint/test/is_resizeable.cpp deleted file mode 100644 index cb8e9c1c7..000000000 --- a/libs/numeric/odeint/test/is_resizeable.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/is_resizeable.cpp - - [begin_description] - This file tests is_resizeable meta-function of odeint. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012 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) - */ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_is_resizeable - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -template< typename T > struct my_seq1 {}; -template< typename T > struct my_seq2 {}; - -namespace boost { namespace fusion { namespace traits { - - template< typename T > struct is_sequence< my_seq1< T > > : boost::true_type {}; - template< typename T > struct is_sequence< my_seq2< T > > : boost::true_type {}; -} } } // boost::fusion::traits - -namespace boost { namespace numeric { namespace odeint { - - template< typename T > - struct is_resizeable< my_seq2< T > > : boost::true_type {}; - -} } } // boost::numeric::odeint - - - -BOOST_AUTO_TEST_CASE( test_vector ) -{ - BOOST_CHECK( is_resizeable< std::vector< int > >::value ); -} - -BOOST_AUTO_TEST_CASE( test_double ) -{ - BOOST_CHECK( !( is_resizeable< double >::value ) ); -} - -BOOST_AUTO_TEST_CASE( test_fusion_vector_of_vector ) -{ - typedef boost::fusion::vector< std::vector< double > , std::vector< double > > state_type; - BOOST_CHECK( is_resizeable< state_type >::value ); -} - -BOOST_AUTO_TEST_CASE( test_fusion_vector_of_double ) -{ - typedef boost::fusion::vector< double , double > state_type; - BOOST_CHECK( !( is_resizeable< state_type >::value ) ); -} - -BOOST_AUTO_TEST_CASE( test_fusion_vector_mixed1 ) -{ - typedef boost::fusion::vector< double , std::vector< double > > state_type; - BOOST_CHECK( is_resizeable< state_type >::value); -} - -BOOST_AUTO_TEST_CASE( test_fusion_vector_mixed2 ) -{ - typedef boost::fusion::vector< std::vector< double > , double > state_type; - BOOST_CHECK( is_resizeable< state_type >::value ); -} - -BOOST_AUTO_TEST_CASE( test_fusion_quantity_sequence ) -{ - namespace units = boost::units; - namespace si = boost::units::si; - - typedef double value_type; - typedef units::quantity< si::time , value_type > time_type; - typedef units::quantity< si::length , value_type > length_type; - typedef units::quantity< si::velocity , value_type > velocity_type; - typedef boost::fusion::vector< length_type , velocity_type > state_type; - - BOOST_CHECK( !( is_resizeable< state_type >::value ) ); -} - -BOOST_AUTO_TEST_CASE( test_my_seq1 ) -{ - BOOST_CHECK( !is_resizeable< my_seq1< double > >::value ); -} - -BOOST_AUTO_TEST_CASE( test_my_seq2 ) -{ - BOOST_CHECK( is_resizeable< my_seq2< double > >::value ); -} \ No newline at end of file diff --git a/libs/numeric/odeint/test/multi_array.cpp b/libs/numeric/odeint/test/multi_array.cpp deleted file mode 100644 index 67b7f964d..000000000 --- a/libs/numeric/odeint/test/multi_array.cpp +++ /dev/null @@ -1,211 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/multi_array.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2009-2012 Karsten Ahnert - Copyright 2009-2012 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) - */ - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_multi_array - -#include - -#include -#include -#include -#include -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef boost::multi_array< double , 1 > vector_type; -typedef boost::multi_array< double , 2 > matrix_type; -typedef boost::multi_array< double , 3 > tensor_type; - - -BOOST_AUTO_TEST_SUITE( multi_array_test ) - -BOOST_AUTO_TEST_CASE( test_resizeable ) -{ - BOOST_CHECK( is_resizeable< vector_type >::value ); - BOOST_CHECK( is_resizeable< matrix_type >::value ); - BOOST_CHECK( is_resizeable< tensor_type >::value ); -} - -BOOST_AUTO_TEST_CASE( test_same_size_vector1 ) -{ - vector_type v1( boost::extents[12] ); - vector_type v2( boost::extents[12] ); - BOOST_CHECK( same_size( v1 , v2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_same_size_vector2 ) -{ - vector_type v1( boost::extents[12] ); - vector_type v2( boost::extents[13] ); - BOOST_CHECK( !same_size( v1 , v2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_same_size_vector3 ) -{ - vector_type v1( boost::extents[12] ); - vector_type v2( boost::extents[vector_type::extent_range(-1,11)] ); - BOOST_CHECK( !same_size( v1 , v2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_same_size_vector4 ) -{ - vector_type v1( boost::extents[12] ); - vector_type v2( boost::extents[vector_type::extent_range(-1,10)] ); - BOOST_CHECK( !same_size( v1 , v2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_same_size_vector5 ) -{ - vector_type v1( boost::extents[vector_type::extent_range(-1,10)] ); - vector_type v2( boost::extents[vector_type::extent_range(-1,10)] ); - BOOST_CHECK( same_size( v1 , v2 ) ); -} - - - -BOOST_AUTO_TEST_CASE( test_same_size_matrix1 ) -{ - matrix_type m1( boost::extents[12][4] ); - matrix_type m2( boost::extents[12][4] ); - BOOST_CHECK( same_size( m1 , m2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_same_size_matrix2 ) -{ - matrix_type m1( boost::extents[12][4] ); - matrix_type m2( boost::extents[12][3] ); - BOOST_CHECK( !same_size( m1 , m2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_same_size_matrix3 ) -{ - matrix_type m1( boost::extents[12][matrix_type::extent_range(-1,2)] ); - matrix_type m2( boost::extents[12][3] ); - BOOST_CHECK( !same_size( m1 , m2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_same_size_matrix4 ) -{ - matrix_type m1( boost::extents[12][matrix_type::extent_range(-1,1)] ); - matrix_type m2( boost::extents[12][3] ); - BOOST_CHECK( !same_size( m1 , m2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_same_size_tensor1 ) -{ - tensor_type t1( boost::extents[ tensor_type::extent_range( -2 , 9 ) ] - [ tensor_type::extent_range( 5 , 11 ) ] - [ tensor_type::extent_range( -1 , 2 ) ] ); - tensor_type t2( boost::extents[ tensor_type::extent_range( 2 , 13 ) ] - [ tensor_type::extent_range( -1 , 5 ) ] - [ tensor_type::extent_range( 1 , 4 ) ] ); - BOOST_CHECK( !same_size( t1 , t2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_same_size_tensor2 ) -{ - tensor_type t1( boost::extents[ tensor_type::extent_range( -2 , 9 ) ] - [ tensor_type::extent_range( 5 , 11 ) ] - [ tensor_type::extent_range( -1 , 2 ) ] ); - tensor_type t2( boost::extents[ tensor_type::extent_range( -2 , 9 ) ] - [ tensor_type::extent_range( 5 , 11 ) ] - [ tensor_type::extent_range( -1 , 2 ) ] ); - BOOST_CHECK( same_size( t1 , t2 ) ); -} - - -// Tests for tensor_type - -BOOST_AUTO_TEST_CASE( test_resize_vector1 ) -{ - vector_type v1( boost::extents[4] ); - vector_type v2; - resize( v2 , v1 ); - BOOST_CHECK( same_size( v1 , v2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_resize_vector2 ) -{ - vector_type v1( boost::extents[ vector_type::extent_range( -2 , 9 ) ] ); - vector_type v2; - resize( v2 , v1 ); - BOOST_CHECK( same_size( v1 , v2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_resize_vector3 ) -{ - vector_type v1( boost::extents[ vector_type::extent_range( -2 , 9 ) ] ); - vector_type v2( boost::extents[ vector_type::extent_range( 2 , 9 ) ] ); - BOOST_CHECK( !same_size( v1 , v2 ) ); - resize( v2 , v1 ); - BOOST_CHECK( same_size( v1 , v2 ) ); -} - -struct mult4 -{ - void operator()( double &a , double const &b ) const - { - a = b * 4.0; - } -}; - -BOOST_AUTO_TEST_CASE( test_for_each2_vector ) -{ - vector_type v1( boost::extents[ vector_type::extent_range( -2 , 9 ) ] ); - vector_type v2( boost::extents[ vector_type::extent_range( 2 , 13 ) ] ); - for( int i=-2 ; i<9 ; ++i ) - v1[i] = i * 2; - multi_array_algebra::for_each2( v2 , v1 , mult4() ); - for( int i=2 ; i<13 ; ++i ) - BOOST_CHECK_EQUAL( v2[i] , v1[i-4]*4.0 ); -} - -struct vector_ode -{ - const static size_t n = 128; - void operator()( const vector_type &x , vector_type &dxdt , double t ) const - { - dxdt[-1] = x[n] - 2.0 * x[-1] + x[0]; - for( size_t i=0 ; i() , vector_ode() , v1 , 0.0 , 1.0 , 0.01 ); -} - -BOOST_AUTO_TEST_CASE( test_dopri5_vector ) -{ - vector_type v1( boost::extents[ vector_type::extent_range( -1 , vector_ode::n+1 ) ] ); - integrate_const( make_dense_output( 1.0e-6 , 1.0e-6 , runge_kutta_dopri5< vector_type >() ) , vector_ode() , v1 , 0.0 , 1.0 , 0.01 ); -} - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/n_step_iterator.cpp b/libs/numeric/odeint/test/n_step_iterator.cpp deleted file mode 100644 index bebcf6dab..000000000 --- a/libs/numeric/odeint/test/n_step_iterator.cpp +++ /dev/null @@ -1,225 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/n_step_iterator.cpp - - [begin_description] - This file tests the n-step iterator. - [end_description] - - Copyright 2009-2013 Karsten Ahnert - Copyright 2009-2013 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) - */ - - -#define BOOST_TEST_MODULE odeint_n_step_iterator - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include "dummy_steppers.hpp" -#include "dummy_odes.hpp" -#include "dummy_observers.hpp" - -namespace mpl = boost::mpl; -using namespace boost::numeric::odeint; - -typedef dummy_stepper::state_type state_type; -typedef dummy_stepper::value_type value_type; - - -BOOST_AUTO_TEST_SUITE( n_step_iterator_test ) - -typedef mpl::vector< - dummy_stepper - , dummy_dense_output_stepper - > dummy_steppers; - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_stepper_iterator , Stepper , dummy_steppers ) -{ - typedef n_step_iterator< Stepper , empty_system , state_type > iterator_type; - state_type x = {{ 1.0 }}; - iterator_type iter1 = iterator_type( Stepper() , empty_system() , x , 0.0 , 0.1 , 10 ); - iterator_type iter2 = iter1; - BOOST_CHECK_EQUAL( &(*iter1) , &(*iter2) ); - BOOST_CHECK_EQUAL( &(*iter1) , &x ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( assignment_stepper_iterator , Stepper , dummy_steppers ) -{ - typedef n_step_iterator< Stepper , empty_system , state_type > iterator_type; - state_type x1 = {{ 1.0 }} , x2 = {{ 2.0 }}; - iterator_type iter1 = iterator_type( Stepper() , empty_system() , x1 , 0.0 , 0.1 , 10 ); - iterator_type iter2 = iterator_type( Stepper() , empty_system() , x2 , 0.0 , 0.2 , 10 ); - BOOST_CHECK_EQUAL( &(*iter1) , &x1 ); - BOOST_CHECK_EQUAL( &(*iter2) , &x2 ); - BOOST_CHECK( !iter1.same( iter2 ) ); - iter2 = iter1; - BOOST_CHECK_EQUAL( &(*iter1) , &x1 ); - BOOST_CHECK_EQUAL( &(*iter2) , &x1 ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_iterator_factory , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_n_step_iterator_begin( stepper , boost::ref( system ) , x , 0.0 , 0.1 , 10 ) , - make_n_step_iterator_end( stepper , boost::ref( system ) , x ) , - dummy_observer() ); - - // dummy_steppers just add 0.25 at each step, the above for_each leads to 10 do_step calls so x should be 3.5 - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_range , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_n_step_range( stepper , boost::ref( system ) , x , 0.0 , 0.1 , 10 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_iterator_with_reference_wrapper_factory , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_n_step_iterator_begin( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 0.1 , 10 ) , - make_n_step_iterator_end( boost::ref( stepper ) , boost::ref( system ) , x ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_range_with_reference_wrapper , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_n_step_range( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 0.1 , 10 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( transitivity1 , Stepper , dummy_steppers ) -{ - typedef n_step_iterator< Stepper , empty_system , state_type > stepper_iterator; - - state_type x = {{ 1.0 }}; - stepper_iterator first1( Stepper() , empty_system() , x , 2.5 , 0.1 , 0 ); - stepper_iterator last1( Stepper() , empty_system() , x ); - stepper_iterator last2( Stepper() , empty_system() , x ); - - BOOST_CHECK( last1 == last2 ); - BOOST_CHECK( first1 != last1 ); - BOOST_CHECK( ++first1 == last1 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm , Stepper , dummy_steppers ) -{ - typedef n_step_iterator< Stepper , empty_system , state_type > stepper_iterator; - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - stepper_iterator first( Stepper() , empty_system() , x , 0.0 , 0.1 , 3 ); - stepper_iterator last( Stepper() , empty_system() , x ); - - std::copy( first , last , std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-14 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-14 ); // the iterator should not iterate over the end -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_negative_time_step , Stepper , dummy_steppers ) -{ - typedef n_step_iterator< Stepper , empty_system , state_type > stepper_iterator; - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - stepper_iterator first( Stepper() , empty_system() , x , 0.3 , -0.1 , 3 ); - stepper_iterator last( Stepper() , empty_system() , x ); - - std::copy( first , last , std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-14 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-14 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - std::copy( make_n_step_iterator_begin( Stepper() , empty_system() , x , 0.0 , 0.1 , 3 ) , - make_n_step_iterator_end( Stepper() , empty_system() , x ) , - std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-14 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-14 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_range_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - boost::range::copy( make_n_step_range( Stepper() , empty_system() , x , 0.0 , 0.1 , 3 ) , - std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-14 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-14 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-14 ); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/n_step_time_iterator.cpp b/libs/numeric/odeint/test/n_step_time_iterator.cpp deleted file mode 100644 index fbce86767..000000000 --- a/libs/numeric/odeint/test/n_step_time_iterator.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/n_step_time_iterator.cpp - - [begin_description] - This file tests the n-step time iterator. - [end_description] - - Copyright 2009-2013 Karsten Ahnert - Copyright 2009-2013 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) - */ - - -#define BOOST_TEST_MODULE odeint_n_step_time_iterator - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include "dummy_steppers.hpp" -#include "dummy_odes.hpp" -#include "dummy_observers.hpp" - -namespace mpl = boost::mpl; -using namespace boost::numeric::odeint; - -typedef dummy_stepper::state_type state_type; -typedef dummy_stepper::value_type value_type; -typedef dummy_stepper::time_type time_type; -typedef std::vector< std::pair< state_type , time_type > > result_vector; - -BOOST_AUTO_TEST_SUITE( n_step_time_iterator_test ) - -typedef mpl::vector< - dummy_stepper - , dummy_dense_output_stepper - > dummy_steppers; - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_stepper_iterator , Stepper , dummy_steppers ) -{ - typedef n_step_time_iterator< Stepper , empty_system , state_type > iterator_type; - state_type x = {{ 1.0 }}; - iterator_type iter1 = iterator_type( Stepper() , empty_system() , x , 0.0 , 0.1 , 10 ); - iterator_type iter2 = iter1; - BOOST_CHECK_EQUAL( &( iter1->first ) , &( iter2->first ) ); - BOOST_CHECK_EQUAL( &( iter1->first ) , &x ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( assignment_stepper_iterator , Stepper , dummy_steppers ) -{ - typedef n_step_time_iterator< Stepper , empty_system , state_type > iterator_type; - state_type x1 = {{ 1.0 }} , x2 = {{ 2.0 }}; - iterator_type iter1 = iterator_type( Stepper() , empty_system() , x1 , 0.0 , 0.1 , 10 ); - iterator_type iter2 = iterator_type( Stepper() , empty_system() , x2 , 0.0 , 0.2 , 10 ); - BOOST_CHECK_EQUAL( &( iter1->first ) , &x1 ); - BOOST_CHECK_EQUAL( &( iter2->first ) , &x2 ); - BOOST_CHECK( !iter1.same( iter2 ) ); - iter2 = iter1; - BOOST_CHECK_EQUAL( &( iter1->first ) , &x1 ); - BOOST_CHECK_EQUAL( &( iter2->first ) , &x1 ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_iterator_factory , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_n_step_time_iterator_begin( stepper , boost::ref( system ) , x , 0.0 , 0.1 , 10 ) , - make_n_step_time_iterator_end( stepper , boost::ref( system ) , x ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_range , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_n_step_time_range( stepper , boost::ref( system ) , x , 0.0 , 0.1 , 10 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_iterator_with_reference_wrapper_factory , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_n_step_time_iterator_begin( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 0.1 , 10 ) , - make_n_step_time_iterator_end( boost::ref( stepper ) , boost::ref( system ) , x ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_range_with_reference_wrapper , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_n_step_time_range( boost::ref( stepper ) , boost::ref( system ) , x , 0.0 , 0.1 , 10 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 3.5 , 1.0e-13 ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( transitivity1 , Stepper , dummy_steppers ) -{ - typedef n_step_time_iterator< Stepper , empty_system , state_type > stepper_iterator; - - state_type x = {{ 1.0 }}; - stepper_iterator first1( Stepper() , empty_system() , x , 0.0 , 0.1 , 0 ); - stepper_iterator last1( Stepper() , empty_system() , x ); - stepper_iterator last2( Stepper() , empty_system() , x ); - - BOOST_CHECK( last1 == last2 ); - BOOST_CHECK( first1 != last1 ); - BOOST_CHECK( ++first1 == last1 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm , Stepper , dummy_steppers ) -{ - typedef n_step_time_iterator< Stepper , empty_system , state_type > stepper_iterator; - state_type x = {{ 1.0 }}; - result_vector res; - stepper_iterator first( Stepper() , empty_system() , x , 0.0 , 0.1 , 3 ); - stepper_iterator last( Stepper() , empty_system() , x ); - - std::copy( first , last , std::back_insert_iterator< result_vector >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0].first[0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[0].second , 0.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].first[0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].second , 0.1 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].first[0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].second , 0.2 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].first[0] , 1.75 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].second , 0.3 , 1.0e-13 ); - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - result_vector res; - std::copy( make_n_step_time_iterator_begin( Stepper() , empty_system() , x , 0.0 , 0.1 , 3 ) , - make_n_step_time_iterator_end( Stepper() , empty_system() , x ) , - std::back_insert_iterator< result_vector >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0].first[0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[0].second , 0.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].first[0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].second , 0.1 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].first[0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].second , 0.2 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].first[0] , 1.75 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].second , 0.3 , 1.0e-13 ); - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_range_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - result_vector res; - boost::range::copy( make_n_step_time_range( Stepper() , empty_system() , x , 0.0 , 0.1 , 3 ) , - std::back_insert_iterator< result_vector >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0].first[0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[0].second , 0.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].first[0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].second , 0.1 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].first[0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].second , 0.2 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].first[0] , 1.75 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].second , 0.3 , 1.0e-13 ); - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/numeric/Jamfile.v2 b/libs/numeric/odeint/test/numeric/Jamfile.v2 deleted file mode 100644 index 1915a3259..000000000 --- a/libs/numeric/odeint/test/numeric/Jamfile.v2 +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2012 Karsten Ahnert -# Copyright 2012 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) - -# bring in rules for testing - - -import testing ; - -use-project boost : $(BOOST_ROOT) ; - -project - : requirements - /boost/test//boost_unit_test_framework - BOOST_ALL_NO_LIB=1 - ../../include - static - clang:-Wno-unused-variable - -# -D_SCL_SECURE_NO_WARNINGS - ; - -test-suite "odeint" - : - [ run runge_kutta.cpp ] - [ run symplectic.cpp ] - [ run rosenbrock.cpp ] - [ run adams_bashforth.cpp ] - [ run adams_bashforth_moulton.cpp ] - [ run abm_time_dependent.cpp ] - [ run order_quadrature_formula.cpp ] - [ run velocity_verlet.cpp ] - : valgrind - ; diff --git a/libs/numeric/odeint/test/numeric/abm_time_dependent.cpp b/libs/numeric/odeint/test/numeric/abm_time_dependent.cpp deleted file mode 100644 index 019a17d6c..000000000 --- a/libs/numeric/odeint/test/numeric/abm_time_dependent.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* Boost numeric test of the adams-bashforth-moulton steppers test file - - Copyright 2013 Karsten Ahnert - Copyright 2013-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) -*/ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE numeric_adams_bashforth_moulton - -#include -#include - -#include - -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -typedef double value_type; - -typedef value_type state_type; - - -// simple time-dependent rhs, analytic solution x = 0.5*t^2 -struct simple_rhs -{ - void operator()( const state_type& x , state_type &dxdt , const double t ) const - { - dxdt = t; - } -}; - -BOOST_AUTO_TEST_SUITE( numeric_abm_time_dependent_test ) - - -/* generic test for all adams bashforth moulton steppers */ -template< class Stepper > -struct perform_abm_time_dependent_test -{ - void operator()( void ) - { - Stepper stepper; - const int o = stepper.order()+1; //order of the error is order of approximation + 1 - - const state_type x0 = 0.0; - state_type x1 = x0; - double t = 0.0; - double dt = 0.1; - const int steps = 10; - - integrate_n_steps( boost::ref(stepper) , simple_rhs(), x1 , t , dt , steps ); - BOOST_CHECK_LT( std::abs( 0.5 - x1 ) , std::pow( dt , o ) ); - } -}; - -typedef mpl::vector< - adams_bashforth_moulton< 2 , state_type > , - adams_bashforth_moulton< 3 , state_type > , - adams_bashforth_moulton< 4 , state_type > , - adams_bashforth_moulton< 5 , state_type > , - adams_bashforth_moulton< 6 , state_type > , - adams_bashforth_moulton< 7 , state_type > , - adams_bashforth_moulton< 8 , state_type > - > adams_bashforth_moulton_steppers; - -BOOST_AUTO_TEST_CASE_TEMPLATE( abm_time_dependent_test , Stepper, adams_bashforth_moulton_steppers ) -{ - perform_abm_time_dependent_test< Stepper > tester; - tester(); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/numeric/adams_bashforth.cpp b/libs/numeric/odeint/test/numeric/adams_bashforth.cpp deleted file mode 100644 index ca8a6cee9..000000000 --- a/libs/numeric/odeint/test/numeric/adams_bashforth.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* Boost numeric test of the adams-bashforth steppers test file - - Copyright 2013 Karsten Ahnert - Copyright 2013-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) -*/ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE numeric_adams_bashforth - -#include -#include - -#include - -#include - -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -typedef double value_type; - -typedef boost::array< double , 2 > state_type; - -// harmonic oscillator, analytic solution x[0] = sin( t ) -struct osc -{ - void operator()( const state_type &x , state_type &dxdt , const double t ) const - { - dxdt[0] = x[1]; - dxdt[1] = -x[0]; - } -}; - -BOOST_AUTO_TEST_SUITE( numeric_adams_bashforth_test ) - - -/* generic test for all adams bashforth steppers */ -template< class Stepper > -struct perform_adams_bashforth_test -{ - void operator()( void ) - { - Stepper stepper; - const int o = stepper.order()+1; //order of the error is order of approximation + 1 - - const state_type x0 = {{ 0.0 , 1.0 }}; - state_type x1 = x0; - double t = 0.0; - double dt = 0.2; - // initialization, does a number of steps already to fill internal buffer, t is increased - stepper.initialize( osc() , x1 , t , dt ); - double A = std::sqrt( x1[0]*x1[0] + x1[1]*x1[1] ); - double phi = std::asin(x1[0]/A) - t; - // do a number of steps to fill the buffer with results from adams bashforth - for( size_t n=0 ; n < stepper.steps ; ++n ) - { - stepper.do_step( osc() , x1 , t , dt ); - t += dt; - } - // now we do the actual step - stepper.do_step( osc() , x1 , t , dt ); - // only examine the error of the adams-bashforth step, not the initialization - const double f = 2.0 * std::abs( A*sin(t+dt+phi) - x1[0] ) / std::pow( dt , o ); // upper bound - - std::cout << o << " , " - << Stepper::initializing_stepper_type::order_value+1 << " , " - << f << std::endl; - - /* as long as we have errors above machine precision */ - while( f*std::pow( dt , o ) > 1E-16 ) - { - x1 = x0; - t = 0.0; - stepper.initialize( osc() , x1 , t , dt ); - A = std::sqrt( x1[0]*x1[0] + x1[1]*x1[1] ); - phi = std::asin(x1[0]/A) - t; - // now we do the actual step - stepper.do_step( osc() , x1 , t , dt ); - // only examine the error of the adams-bashforth step, not the initialization - std::cout << "Testing dt=" << dt << " , " << std::abs( A*sin(t+dt+phi) - x1[0] ) << std::endl; - BOOST_CHECK_LT( std::abs( A*sin(t+dt+phi) - x1[0] ) , f*std::pow( dt , o ) ); - dt *= 0.5; - } - } -}; - -typedef mpl::vector< - adams_bashforth< 2 , state_type > , - adams_bashforth< 3 , state_type > , - adams_bashforth< 4 , state_type > , - adams_bashforth< 5 , state_type > , - adams_bashforth< 6 , state_type > , - adams_bashforth< 7 , state_type > , - adams_bashforth< 8 , state_type > - > adams_bashforth_steppers; - -BOOST_AUTO_TEST_CASE_TEMPLATE( adams_bashforth_test , Stepper, adams_bashforth_steppers ) -{ - perform_adams_bashforth_test< Stepper > tester; - tester(); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/numeric/adams_bashforth_moulton.cpp b/libs/numeric/odeint/test/numeric/adams_bashforth_moulton.cpp deleted file mode 100644 index dea57182a..000000000 --- a/libs/numeric/odeint/test/numeric/adams_bashforth_moulton.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* Boost numeric test of the adams-bashforth-moulton steppers test file - - Copyright 2013 Karsten Ahnert - Copyright 2013 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) -*/ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE numeric_adams_bashforth_moulton - -#include -#include - -#include - -#include - -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -typedef double value_type; - -typedef boost::array< double , 2 > state_type; -typedef runge_kutta_fehlberg78 initializing_stepper; - -// harmonic oscillator, analytic solution x[0] = sin( t ) -struct osc -{ - void operator()( const state_type &x , state_type &dxdt , const double t ) const - { - dxdt[0] = x[1]; - dxdt[1] = -x[0]; - } -}; - -BOOST_AUTO_TEST_SUITE( numeric_adams_bashforth_moulton_test ) - - -/* generic test for all adams bashforth moulton steppers */ -template< class Stepper > -struct perform_adams_bashforth_moulton_test -{ - void operator()( void ) - { - Stepper stepper; - initializing_stepper init_stepper; - const int o = stepper.order()+1; //order of the error is order of approximation + 1 - - const state_type x0 = {{ 0.0 , 1.0 }}; - state_type x1 = x0; - double t = 0.0; - double dt = 0.25; - // initialization, does a number of steps already to fill internal buffer, t is increased - // we use the rk78 as initializing stepper - stepper.initialize( boost::ref(init_stepper) , osc() , x1 , t , dt ); - // do a number of steps to fill the buffer with results from adams bashforth - for( size_t n=0 ; n < stepper.steps ; ++n ) - { - stepper.do_step( osc() , x1 , t , dt ); - t += dt; - } - double A = std::sqrt( x1[0]*x1[0] + x1[1]*x1[1] ); - double phi = std::asin(x1[0]/A) - t; - // now we do the actual step - stepper.do_step( osc() , x1 , t , dt ); - // only examine the error of the adams-bashforth-moulton step, not the initialization - const double f = 2.0 * std::abs( A*sin(t+dt+phi) - x1[0] ) / std::pow( dt , o ); // upper bound - - std::cout << o << " , " << f << std::endl; - - /* as long as we have errors above machine precision */ - while( f*std::pow( dt , o ) > 1E-16 ) - { - x1 = x0; - t = 0.0; - stepper.initialize( boost::ref(init_stepper) , osc() , x1 , t , dt ); - A = std::sqrt( x1[0]*x1[0] + x1[1]*x1[1] ); - phi = std::asin(x1[0]/A) - t; - // now we do the actual step - stepper.do_step( osc() , x1 , t , dt ); - // only examine the error of the adams-bashforth-moulton step, not the initialization - std::cout << "Testing dt=" << dt << " , " << std::abs( A*sin(t+dt+phi) - x1[0] ) << std::endl; - BOOST_CHECK_LT( std::abs( A*sin(t+dt+phi) - x1[0] ) , f*std::pow( dt , o ) ); - dt *= 0.5; - } - } -}; - -typedef mpl::vector< - adams_bashforth_moulton< 1 , state_type > , - adams_bashforth_moulton< 2 , state_type > , - adams_bashforth_moulton< 3 , state_type > , - adams_bashforth_moulton< 4 , state_type > , - adams_bashforth_moulton< 5 , state_type > , - adams_bashforth_moulton< 6 , state_type > , - adams_bashforth_moulton< 7 , state_type > , - adams_bashforth_moulton< 8 , state_type > - > adams_bashforth_moulton_steppers; - -BOOST_AUTO_TEST_CASE_TEMPLATE( adams_bashforth_moulton_test , Stepper, adams_bashforth_moulton_steppers ) -{ - perform_adams_bashforth_moulton_test< Stepper > tester; - tester(); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/numeric/order_quadrature_formula.cpp b/libs/numeric/odeint/test/numeric/order_quadrature_formula.cpp deleted file mode 100644 index bdf2ae462..000000000 --- a/libs/numeric/odeint/test/numeric/order_quadrature_formula.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* Boost numeric test for orders of quadrature formulas test file - - Copyright 2015 Gregor de Cillia - 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) -*/ - -// disable checked iterator warning for msvc -#include - -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE order_quadrature_formula - -#include -#include - -#include - -#include - -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -typedef double value_type; -typedef value_type time_type; -typedef value_type state_type; - -BOOST_AUTO_TEST_SUITE( order_of_convergence_test ) - -/* defines the simple monomial f(t) = (p+1) * t^p.*/ -struct monomial -{ - int power; - - monomial(int p = 0) : power( p ){}; - - void operator()( const state_type &x , state_type &dxdt , const time_type t ) - { - dxdt = ( 1.0 + power ) * pow( t, power ); - } -}; - - -/* generic test for all steppers that support integrate_const */ -template< class Stepper > -struct stepper_order_test -{ - void operator()( int steps = 1 ) - { - const int estimated_order = estimate_order( steps ); - const int defined_order = Stepper::order_value; - - std::cout << boost::format( "%-20i%-20i\n" ) - % estimated_order % defined_order; - - BOOST_REQUIRE_EQUAL( estimated_order, defined_order ); - } - - /* - the order of the stepper is estimated by trying to solve the ODE - x'(t) = (p+1) * t^p - until the errors are too big to be justified by finite precision. - the first value p for which the problem is *not* solved within the - finite precision tolerance is the estimate for the order of the scheme. - */ - int estimate_order( int steps ) - { - const double dt = 1.0/steps; - const double tolerance = steps*1E-15; - int p; - for( p = 0; true; p++ ) - { - // begin with x'(t) = t^0 = 1 - // => x (t) = t - // then use x'(t) = 2*t^1 - // => x (t) = t^2 - // ... - state_type x = 0.0; - - double t = integrate_n_steps( Stepper(), monomial( p ), x, 0.0, dt, - steps ); - if( fabs( x - pow( t, ( 1.0 + p ) ) ) > tolerance ) - break; - } - // the smallest power p for which the test failed is the estimated order, - // as the solution for this power is x(t) = t^{p+1} - return p; - } -}; - - -typedef mpl::vector< - euler< state_type > , - modified_midpoint< state_type > , - runge_kutta4< state_type > , - runge_kutta4_classic< state_type > , - runge_kutta_cash_karp54_classic< state_type > , - runge_kutta_cash_karp54< state_type > , - runge_kutta_dopri5< state_type > , - runge_kutta_fehlberg78< state_type > - > runge_kutta_steppers; - -typedef mpl::vector< - adams_bashforth< 2, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, runge_kutta_fehlberg78< state_type > >, - adams_bashforth< 3, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, runge_kutta_fehlberg78< state_type > >, - adams_bashforth< 4, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, runge_kutta_fehlberg78< state_type > >, - adams_bashforth< 5, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, runge_kutta_fehlberg78< state_type > >, - adams_bashforth< 6, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, runge_kutta_fehlberg78< state_type > >, - adams_bashforth< 7, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, runge_kutta_fehlberg78< state_type > >, - adams_bashforth< 8, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, runge_kutta_fehlberg78< state_type > > - > ab_steppers; - - -typedef mpl::vector< - adams_bashforth_moulton< 2, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, - runge_kutta_fehlberg78< state_type > >, - adams_bashforth_moulton< 3, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, - runge_kutta_fehlberg78< state_type > >, - adams_bashforth_moulton< 4, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, - runge_kutta_fehlberg78< state_type > >, - adams_bashforth_moulton< 5, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, - runge_kutta_fehlberg78< state_type > >, - adams_bashforth_moulton< 6, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, - runge_kutta_fehlberg78< state_type > >, - adams_bashforth_moulton< 7, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, - runge_kutta_fehlberg78< state_type > >, - adams_bashforth_moulton< 8, state_type, double, state_type, double, - vector_space_algebra, default_operations, - initially_resizer, - runge_kutta_fehlberg78< state_type > > - > abm_steppers; - - -BOOST_AUTO_TEST_CASE_TEMPLATE( runge_kutta_test , Stepper, runge_kutta_steppers ) -{ - stepper_order_test< Stepper > tester; - tester(10); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( adams_bashforth_test , Stepper, ab_steppers ) -{ - stepper_order_test< Stepper > tester; - tester(16); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( adams_bashforth_moultion_test , Stepper, abm_steppers ) -{ - stepper_order_test< Stepper > tester; - tester(16); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/numeric/rosenbrock.cpp b/libs/numeric/odeint/test/numeric/rosenbrock.cpp deleted file mode 100644 index 2b6a26788..000000000 --- a/libs/numeric/odeint/test/numeric/rosenbrock.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* Boost numeric test of the rosenbrock4 stepper test file - - Copyright 2012 Karsten Ahnert - Copyright 2012 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) -*/ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE numeric_rosenbrock - -#include -#include - -#include - -#include - -#include -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef double value_type; -typedef boost::numeric::ublas::vector< value_type > state_type; -typedef boost::numeric::ublas::matrix< value_type > matrix_type; - -// harmonic oscillator, analytic solution x[0] = sin( t ) -struct sys -{ - void operator()( const state_type &x , state_type &dxdt , const value_type &t ) const - { - dxdt( 0 ) = x( 1 ); - dxdt( 1 ) = -x( 0 ); - } -}; - -struct jacobi -{ - void operator()( const state_type &x , matrix_type &jacobi , const value_type &t , state_type &dfdt ) const - { - jacobi( 0 , 0 ) = 0; - jacobi( 0 , 1 ) = 1; - jacobi( 1 , 0 ) = -1; - jacobi( 1 , 1 ) = 0; - dfdt( 0 ) = 0.0; - dfdt( 1 ) = 0.0; - } -}; - - -BOOST_AUTO_TEST_SUITE( numeric_rosenbrock4 ) - -BOOST_AUTO_TEST_CASE( rosenbrock4_numeric_test ) -{ - typedef rosenbrock4< value_type > stepper_type; - stepper_type stepper; - - const int o = stepper.order()+1; - - state_type x0( 2 ) , x1( 2 ); - x0(0) = 0.0; x0(1) = 1.0; - - double dt = 0.5; - - stepper.do_step( std::make_pair( sys() , jacobi() ) , x0 , 0.0 , x1 , dt ); - const double f = 2.0 * std::abs( std::sin(dt) - x1(0) ) / std::pow( dt , o ); - - std::cout << o << " , " << f << std::endl; - - while( f*std::pow( dt , o ) > 1E-16 ) - { - stepper.do_step( std::make_pair( sys() , jacobi() ) , x0 , 0.0 , x1 , dt ); - std::cout << "Testing dt=" << dt << std::endl; - BOOST_CHECK_SMALL( std::abs( std::sin(dt) - x1(0) ) , f*std::pow( dt , o ) ); - dt *= 0.5; - } -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/numeric/runge_kutta.cpp b/libs/numeric/odeint/test/numeric/runge_kutta.cpp deleted file mode 100644 index a71701bde..000000000 --- a/libs/numeric/odeint/test/numeric/runge_kutta.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* Boost numeric test of the runge kutta steppers test file - - Copyright 2012 Mario Mulansky - Copyright 2012 Karsten Ahnert - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or - copy at http://www.boost.org/LICENSE_1_0.txt) -*/ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE numeric_runge_kutta - -#include -#include - -#include - -#include - -#include - -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -typedef double value_type; - -typedef boost::array< double , 2 > state_type; - -// harmonic oscillator, analytic solution x[0] = sin( t ) -struct osc -{ - void operator()( const state_type &x , state_type &dxdt , const double t ) const - { - dxdt[0] = x[1]; - dxdt[1] = -x[0]; - } -}; - -/* reset dispatcher */ -template< class StepperCategory > -struct resetter -{ - template< class Stepper > - static void reset( Stepper &stepper ) { } -}; - -template< > -struct resetter< explicit_error_stepper_fsal_tag > -{ - template< class Stepper > - static void reset( Stepper &stepper ) - { stepper.reset(); } -}; - - -BOOST_AUTO_TEST_SUITE( numeric_runge_kutta_test ) - - -/* generic test for all runge kutta steppers */ -template< class Stepper > -struct perform_runge_kutta_test -{ - void operator()( void ) - { - - Stepper stepper; - const int o = stepper.order()+1; //order of the error is order of approximation + 1 - - const state_type x0 = {{ 0.0 , 1.0 }}; - state_type x1; - const double t = 0.0; - /* do a first step with dt=0.1 to get an estimate on the prefactor of the error dx = f * dt^(order+1) */ - double dt = 0.5; - stepper.do_step( osc() , x0 , t , x1 , dt ); - const double f = 2.0 * std::abs( sin(dt) - x1[0] ) / std::pow( dt , o ); // upper bound - - std::cout << o << " , " << f << std::endl; - - /* as long as we have errors above machine precision */ - while( f*std::pow( dt , o ) > 1E-16 ) - { - // reset stepper which require resetting (fsal steppers) - resetter< typename Stepper::stepper_category >::reset( stepper ); - - stepper.do_step( osc() , x0 , t , x1 , dt ); - std::cout << "Testing dt=" << dt << std::endl; - BOOST_CHECK_LT( std::abs( sin(dt) - x1[0] ) , f*std::pow( dt , o ) ); - dt *= 0.5; - } - } -}; - - -/* generic error test for all runge kutta steppers */ -template< class Stepper > -struct perform_runge_kutta_error_test -{ - void operator()( void ) - { - Stepper stepper; - const int o = stepper.error_order()+1; //order of the error is order of approximation + 1 - - const state_type x0 = {{ 0.0 , 1.0 }}; - state_type x1 , x_err; - const double t = 0.0; - /* do a first step with dt=0.1 to get an estimate on the prefactor of the error dx = f * dt^(order+1) */ - double dt = 0.5; - stepper.do_step( osc() , x0 , t , x1 , dt , x_err ); - const double f = 2.0 * std::abs( x_err[0] ) / std::pow( dt , o ); - - std::cout << o << " , " << f << " , " << x0[0] << std::endl; - - /* as long as we have errors above machine precision */ - while( f*std::pow( dt , o ) > 1E-16 ) - { - // reset stepper which require resetting (fsal steppers) - resetter< typename Stepper::stepper_category >::reset( stepper ); - - stepper.do_step( osc() , x0 , t , x1 , dt , x_err ); - std::cout << "Testing dt=" << dt << ": " << x_err[1] << std::endl; - BOOST_CHECK_SMALL( std::abs( x_err[0] ) , f*std::pow( dt , o ) ); - dt *= 0.5; - } - } -}; - - -typedef mpl::vector< - euler< state_type > , - modified_midpoint< state_type > , - runge_kutta4< state_type > , - runge_kutta4_classic< state_type > , - runge_kutta_cash_karp54_classic< state_type > , - runge_kutta_cash_karp54< state_type > , - runge_kutta_dopri5< state_type > , - runge_kutta_fehlberg78< state_type > , - extrapolation_stepper< 4, state_type > , - extrapolation_stepper< 6, state_type > , - extrapolation_stepper< 8, state_type > , - extrapolation_stepper< 10, state_type > - > runge_kutta_steppers; - -BOOST_AUTO_TEST_CASE_TEMPLATE( runge_kutta_test , Stepper, runge_kutta_steppers ) -{ - perform_runge_kutta_test< Stepper > tester; - tester(); -} - - -typedef mpl::vector< - runge_kutta_cash_karp54_classic< state_type > , - runge_kutta_cash_karp54< state_type > , - runge_kutta_dopri5< state_type > , - runge_kutta_fehlberg78< state_type > , - extrapolation_stepper< 4, state_type > , - extrapolation_stepper< 6, state_type > , - extrapolation_stepper< 8, state_type > , - extrapolation_stepper< 10, state_type > - > runge_kutta_error_steppers; - -BOOST_AUTO_TEST_CASE_TEMPLATE( runge_kutta_error_test , Stepper, runge_kutta_error_steppers ) -{ - perform_runge_kutta_error_test< Stepper > tester; - tester(); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/numeric/symplectic.cpp b/libs/numeric/odeint/test/numeric/symplectic.cpp deleted file mode 100644 index 6d3f75b15..000000000 --- a/libs/numeric/odeint/test/numeric/symplectic.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* Boost numeric test of the symplectic steppers test file - - Copyright 2012 Mario Mulansky - Copyright 2012 Karsten Ahnert - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or - copy at http://www.boost.org/LICENSE_1_0.txt) -*/ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE numeric_symplectic - -#include -#include - -#include - -#include - -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -typedef double value_type; - -typedef boost::array< double ,1 > state_type; - -// harmonic oscillator, analytic solution x[0] = sin( t ) -struct osc -{ - void operator()( const state_type &q , state_type &dpdt ) const - { - dpdt[0] = -q[0]; - } -}; - -BOOST_AUTO_TEST_SUITE( numeric_symplectic_test ) - - -/* generic test for all symplectic steppers */ -template< class Stepper > -struct perform_symplectic_test -{ - void operator()( void ) - { - - Stepper stepper; - const int o = stepper.order()+1; //order of the error is order of approximation + 1 - - const state_type q0 = {{ 0.0 }}; - const state_type p0 = {{ 1.0 }}; - state_type q1,p1; - std::pair< state_type , state_type >x1( q1 , p1 ); - const double t = 0.0; - /* do a first step with dt=0.1 to get an estimate on the prefactor of the error dx = f * dt^(order+1) */ - double dt = 0.5; - stepper.do_step( osc() , std::make_pair( q0 , p0 ) , t , x1 , dt ); - const double f = 2.0 * std::abs( sin(dt) - x1.first[0] ) / std::pow( dt , o ); - - std::cout << o << " , " << f << std::endl; - - /* as long as we have errors above machine precision */ - while( f*std::pow( dt , o ) > 1E-16 ) - { - stepper.do_step( osc() , std::make_pair( q0 , p0 ) , t , x1 , dt ); - std::cout << "Testing dt=" << dt << std::endl; - BOOST_CHECK_SMALL( std::abs( sin(dt) - x1.first[0] ) , f*std::pow( dt , o ) ); - dt *= 0.5; - } - } -}; - - -typedef mpl::vector< - symplectic_euler< state_type > , - symplectic_rkn_sb3a_mclachlan< state_type > - > symplectic_steppers; - -BOOST_AUTO_TEST_CASE_TEMPLATE( symplectic_test , Stepper, symplectic_steppers ) -{ - perform_symplectic_test< Stepper > tester; - tester(); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/numeric/velocity_verlet.cpp b/libs/numeric/odeint/test/numeric/velocity_verlet.cpp deleted file mode 100644 index 5ac77807b..000000000 --- a/libs/numeric/odeint/test/numeric/velocity_verlet.cpp +++ /dev/null @@ -1,93 +0,0 @@ -/* Boost numeric test of the runge kutta steppers test file - - Copyright 2012 Mario Mulansky - Copyright 2012 Karsten Ahnert - - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or - copy at http://www.boost.org/LICENSE_1_0.txt) -*/ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE numeric_runge_kutta - -#include -#include - -#include - -#include - -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -typedef double value_type; - -typedef boost::array< double , 1 > state_type; - -// harmonic oscillator, analytic solution x[0] = sin( t ) -struct osc -{ - void operator()( const state_type &x, const state_type &v, state_type &a, - const double t ) const - { - a[0] = -x[0]; - } -}; - -BOOST_AUTO_TEST_SUITE( velocity_verlet_test ) - -BOOST_AUTO_TEST_CASE( numeric_velocity_verlet_test ) -{ - - velocity_verlet stepper; - const int steps = 10; - // order of the error is order of approximation + 1 - const int o = stepper.order() + 1; - - const state_type x0 = {{ 0.0 }}; - const state_type v0 = {{ 1.0 }}; - state_type x = x0; - state_type v = v0; - const double t = 0.0; - /* do a first step with dt=0.1 to get an estimate on the prefactor of the error dx = f * dt^(order+1) */ - double dt = 0.5; - for ( int step = 0; step < steps; ++step ) - { - stepper.do_step( - osc(), std::make_pair( boost::ref( x ), boost::ref( v ) ), t, dt ); - } - const double f = steps * std::abs( sin( steps * dt ) - x[0] ) / - std::pow( dt, o ); // upper bound - - std::cout << o << " , " << f << std::endl; - - /* as long as we have errors above machine precision */ - while( f*std::pow( dt , o ) > 1E-16 ) - { - x = x0; - v = v0; - stepper.reset(); - for ( int step = 0; step < steps; ++step ) - { - stepper.do_step( osc() , std::make_pair(boost::ref(x), boost::ref(v)) , t , dt ); - } - std::cout << "Testing dt=" << dt << std::endl; - BOOST_CHECK_LT( std::abs( sin( steps * dt ) - x[0] ), - f * std::pow( dt, o ) ); - dt *= 0.5; - } -}; - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/prepare_stepper_testing.hpp b/libs/numeric/odeint/test/prepare_stepper_testing.hpp deleted file mode 100644 index 10c0c84e9..000000000 --- a/libs/numeric/odeint/test/prepare_stepper_testing.hpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/prepare_stepper_testing.hpp - - [begin_description] - This file defines some helper functions for the stepper tests. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2012-2013 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 PREPARE_STEPPER_TESTING_HPP_ -#define PREPARE_STEPPER_TESTING_HPP_ - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -namespace mpl = boost::mpl; -namespace fusion = boost::fusion; - -using namespace boost::numeric::odeint; - -/* the state types that will be tested */ -typedef std::vector< double > vector_type; -typedef std::vector< std::complex > complex_vector_type; -typedef double vector_space_type; -typedef boost::array< double , 1 > array_type; -typedef boost::array< std::complex , 1 > complex_array_type; - -typedef boost::multiprecision::cpp_dec_float_50 mp_type; -typedef boost::array< mp_type , 1 > mp_array_type; - -typedef mpl::vector< vector_type , complex_vector_type , vector_space_type , - array_type , complex_array_type , mp_type , mp_array_type - >::type container_types; - -namespace boost { namespace numeric { namespace odeint { - - // mp_type forms a vector space - template<> - struct algebra_dispatcher< mp_type > - { - typedef vector_space_algebra algebra_type; - }; - - // add norm computation - template<> - struct vector_space_norm_inf< mp_type > - { - typedef mp_type result_type; - mp_type operator()( mp_type x ) const - { - using std::abs; - return abs(x); - } - }; - -} } } - -#endif /* PREPARE_STEPPER_TESTING_HPP_ */ diff --git a/libs/numeric/odeint/test/range_algebra.cpp b/libs/numeric/odeint/test/range_algebra.cpp deleted file mode 100644 index d80e9519d..000000000 --- a/libs/numeric/odeint/test/range_algebra.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/check_operations.cpp - - [begin_description] - This file tests interaction between the algebras and the operations. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2013 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) - */ - -#define BOOST_TEST_MODULE odeint_standard_algebra - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include - -namespace units = boost::units; -namespace si = boost::units::si; - -using boost::numeric::odeint::default_operations; -using boost::numeric::odeint::range_algebra; -using boost::numeric::odeint::array_algebra; - - -BOOST_AUTO_TEST_SUITE( standard_algebra_test ) - -typedef boost::mpl::list< range_algebra , array_algebra > algebra_types; -range_algebra algebra; - -BOOST_AUTO_TEST_CASE_TEMPLATE( for_each2 , algebra_type , algebra_types ) -{ - algebra_type algebra; - boost::array< double , 2 > x1 = {{ 1.0 , 1.0 }} , x2 = {{ 2.0 , 2.0 }}; - algebra.for_each2( x1 , x2 , default_operations::scale_sum1<>( 1.0 ) ); - BOOST_CHECK_CLOSE( x1[0] , 2.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( x1[1] , 2.0 , 1.0e-10 ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( for_each3 , algebra_type , algebra_types ) -{ - algebra_type algebra; - boost::array< double , 2 > x1 = {{ 1.0 , 1.0 }} , x2 = {{ 2.0 , 2.0 }} , x3 = {{ 3.0 , 3.0 }}; - algebra.for_each3( x1 , x2 , x3 , default_operations::scale_sum2<>( 1.0 , 2.0 ) ); - BOOST_CHECK_CLOSE( x1[0] , 8.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( x1[1] , 8.0 , 1.0e-10 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( for_each4 , algebra_type , algebra_types ) -{ - algebra_type algebra; - boost::array< double , 2 > x1 = {{ 1.0 , 1.0 }} , x2 = {{ 2.0 , 2.0 }} , x3 = {{ 3.0 , 3.0 }} , x4 = {{ 4.0 , 4.0 }}; - algebra.for_each4( x1 , x2 , x3 , x4 , default_operations::scale_sum3<>( 1.0 , 2.0 , 3.0 ) ); - BOOST_CHECK_CLOSE( x1[0] , 20.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( x1[1] , 20.0 , 1.0e-10 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( for_each5 , algebra_type , algebra_types ) -{ - algebra_type algebra; - boost::array< double , 2 > x1 = {{ 1.0 , 1.0 }} , x2 = {{ 2.0 , 2.0 }} , x3 = {{ 3.0 , 3.0 }} , x4 = {{ 4.0 , 4.0 }} , x5 = {{ 5.0 , 5.0 }}; - algebra.for_each5( x1 , x2 , x3 , x4 , x5 , default_operations::scale_sum4<>( 1.0 , 2.0 , 3.0 , 4.0 ) ); - BOOST_CHECK_CLOSE( x1[0] , 40.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( x1[1] , 40.0 , 1.0e-10 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( for_each6 , algebra_type , algebra_types ) -{ - algebra_type algebra; - boost::array< double , 2 > x1 = {{ 1.0 , 1.0 }} , x2 = {{ 2.0 , 2.0 }} , x3 = {{ 3.0 , 3.0 }} , x4 = {{ 4.0 , 4.0 }} , x5 = {{ 5.0 , 5.0 }} , x6 = {{ 6.0 , 6.0 }}; - algebra.for_each6( x1 , x2 , x3 , x4 , x5 , x6 ,default_operations::scale_sum5<>( 1.0 , 2.0 , 3.0 , 4.0 , 5.0 ) ); - BOOST_CHECK_CLOSE( x1[0] , 70.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( x1[1] , 70.0 , 1.0e-10 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( for_each7 , algebra_type , algebra_types ) -{ - algebra_type algebra; - boost::array< double , 2 > x1 = {{ 1.0 , 1.0 }} , x2 = {{ 2.0 , 2.0 }} , x3 = {{ 3.0 , 3.0 }} , x4 = {{ 4.0 , 4.0 }} , x5 = {{ 5.0 , 5.0 }} , x6 = {{ 6.0 , 6.0 }} , x7 = {{ 7.0 , 7.0 }}; - algebra.for_each7( x1 , x2 , x3 , x4 , x5 , x6 , x7 , default_operations::scale_sum6<>( 1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 ) ); - BOOST_CHECK_CLOSE( x1[0] , 112.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( x1[1] , 112.0 , 1.0e-10 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( for_each8 , algebra_type , algebra_types ) -{ - algebra_type algebra; - boost::array< double , 2 > x1 = {{ 1.0 , 1.0 }} , x2 = {{ 2.0 , 2.0 }} , x3 = {{ 3.0 , 3.0 }} , x4 = {{ 4.0 , 4.0 }} , x5 = {{ 5.0 , 5.0 }} , x6 = {{ 6.0 , 6.0 }} , x7 = {{ 7.0 , 7.0 }} , x8 = {{ 8.0 , 8.0 }}; - algebra.for_each8( x1 , x2 , x3 , x4 , x5 , x6 , x7 , x8 , default_operations::scale_sum7<>( 1.0 , 2.0 , 3.0 , 4.0 , 5.0 , 6.0 , 7.0 ) ); - BOOST_CHECK_CLOSE( x1[0] , 168.0 , 1.0e-10 ); - BOOST_CHECK_CLOSE( x1[1] , 168.0 , 1.0e-10 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( norm_inf , algebra_type , algebra_types ) -{ - algebra_type algebra; - boost::array< double , 2 > x = {{ 1.25 , 2.25 }}; - double nrm = algebra.norm_inf( x ); - BOOST_CHECK_CLOSE( nrm , 2.25 , 1.0e-10 ); - BOOST_CHECK_CLOSE( x[0] , 1.25 , 1.0e-10 ); - BOOST_CHECK_CLOSE( x[1] , 2.25 , 1.0e-10 ); -} - - -BOOST_AUTO_TEST_CASE( for_each2_with_units ) -{ - range_algebra algebra; - typedef units::quantity< si::time , double > time_type; - typedef units::quantity< si::length , double > length_type; - typedef units::quantity< si::velocity , double > velocity_type; - boost::array< length_type , 2 > x1 = {{ 1.0 * si::meter , 1.0 * si::meter }}; - boost::array< velocity_type , 2 > x2 = {{ 2.0 * si::meter / si::seconds , 2.0 * si::meter / si::seconds }}; - algebra.for_each2( x1 , x2 , default_operations::scale_sum1< time_type >( 0.1 * si::second ) ); - BOOST_CHECK_CLOSE( x1[0].value() , 0.2 , 1.0e-10 ); - BOOST_CHECK_CLOSE( x1[1].value() , 0.2 , 1.0e-10 ); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/regression/Jamfile.v2 b/libs/numeric/odeint/test/regression/Jamfile.v2 deleted file mode 100644 index 25bbf0c1f..000000000 --- a/libs/numeric/odeint/test/regression/Jamfile.v2 +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2012 Karsten Ahnert -# Copyright 2012 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) - -# bring in rules for testing - - -import testing ; - -use-project boost : $(BOOST_ROOT) ; - -project - : requirements - /boost/test//boost_unit_test_framework - BOOST_ALL_NO_LIB=1 - ../../include - static - clang:-Wno-unused-variable - -# -D_SCL_SECURE_NO_WARNINGS - ; - -test-suite "odeint" - : - [ run regression_147.cpp ] - [ compile regression_149.cpp : -std=c++0x ] - [ run regression_168.cpp ] - : valgrind - ; diff --git a/libs/numeric/odeint/test/regression/regression_147.cpp b/libs/numeric/odeint/test/regression/regression_147.cpp deleted file mode 100644 index 7373782df..000000000 --- a/libs/numeric/odeint/test/regression/regression_147.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - - [begin_description] - Test case for issue 147 - [end_description] - - Copyright 2011-2015 Karsten Ahnert - Copyright 2011-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) - */ - - -// disable checked iterator warning for msvc - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_regression_147 - -#include - -#include - -#include - -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -typedef double state_type; - -void rhs( const state_type &x , state_type &dxdt , const double t ) -{ - dxdt = 1; -} - - -template -struct perform_init_test -{ - void operator()( void ) - { - double t = 0; - const double dt = 0.1; - - state_type x = 0; - - Stepper stepper; - InitStepper init_stepper; - stepper.initialize( init_stepper, rhs, x, t, dt ); - - // ab-stepper needs order-1 init steps: t and x should be (order-1)*dt - BOOST_CHECK_CLOSE( t , (stepper.order()-1)*dt , 1E-16 ); - BOOST_CHECK_CLOSE( x, ( stepper.order() - 1 ) * dt, 2E-14 ); - } -}; - -typedef mpl::vector< - euler< state_type > , - modified_midpoint< state_type > , - runge_kutta4< state_type > , - runge_kutta4_classic< state_type > , - runge_kutta_cash_karp54_classic< state_type > , - runge_kutta_cash_karp54< state_type > , - runge_kutta_dopri5< state_type > , - runge_kutta_fehlberg78< state_type > - > runge_kutta_steppers; - - -BOOST_AUTO_TEST_SUITE( regression_147_test ) - -BOOST_AUTO_TEST_CASE_TEMPLATE( init_test , InitStepper, - runge_kutta_steppers ) -{ - perform_init_test< adams_bashforth<4, state_type>, InitStepper > tester; - tester(); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/regression/regression_149.cpp b/libs/numeric/odeint/test/regression/regression_149.cpp deleted file mode 100644 index a61082b30..000000000 --- a/libs/numeric/odeint/test/regression/regression_149.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* - - [begin_description] - Test case for issue 149: - Error C2582 with msvc-10 when using iterator-based integration - [end_description] - - Copyright 2011-2015 Karsten Ahnert - Copyright 2011-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) - */ - - -// disable checked iterator warning for msvc - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_regression_147 - -#include -#include - -#include - -#include -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -typedef std::vector state_type; - -void rhs( const state_type &x , state_type &dxdt , const double t ) -{ -} - - -template -struct perform_test -{ - void operator()( void ) - { - bulirsch_stoer< state_type > stepper( 1e-9, 0.0, 0.0, 0.0 ); - state_type x( 3, 10.0 ); - - auto iter = boost::find_if( - make_adaptive_time_range( stepper, rhs, x, 0.0, 1.0, 0.01 ), - []( const std::pair< const state_type &, double > &x ) - { return ( x.first[0] < 0.0 ); } ); - - std::cout << iter->second << "\t" << iter->first[0] << "\t" - << iter->first[1] << "\t" << iter->first[2] << "\n"; - } -}; - -typedef mpl::vector< - euler< state_type > , - runge_kutta4< state_type > , - runge_kutta_cash_karp54< state_type > , - runge_kutta_dopri5< state_type > , - runge_kutta_fehlberg78< state_type > , - bulirsch_stoer< state_type > - > steppers; - - -BOOST_AUTO_TEST_SUITE( regression_147_test ) - -BOOST_AUTO_TEST_CASE_TEMPLATE( regression_147_test , Stepper, - steppers ) -{ - perform_test< Stepper > tester; - tester(); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/regression/regression_168.cpp b/libs/numeric/odeint/test/regression/regression_168.cpp deleted file mode 100644 index 8349261a6..000000000 --- a/libs/numeric/odeint/test/regression/regression_168.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - - [begin_description] - Test case for issue 149: - Error C2582 with msvc-10 when using iterator-based integration - [end_description] - - Copyright 2011-2015 Karsten Ahnert - Copyright 2011-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) - */ - - -// disable checked iterator warning for msvc - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_regression_147 - -#include -#include - -#include - -#include - -#include -#include - -#include -#include -#include - - -#include -#include -#include -#include -#include - -#include - - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -namespace fusion = boost::fusion; -namespace units = boost::units; -namespace si = boost::units::si; - -typedef units::quantity< si::time , double > time_type; -typedef units::quantity< si::length , double > length_type; -typedef units::quantity< si::velocity , double > velocity_type; -typedef units::quantity< si::acceleration , double > acceleration_type; -typedef units::quantity< si::frequency , double > frequency_type; - -typedef fusion::vector< length_type , velocity_type > state_type; -typedef fusion::vector< velocity_type , acceleration_type > deriv_type; - - -struct oscillator -{ - frequency_type m_omega; - - oscillator( const frequency_type &omega = 1.0 * si::hertz ) : m_omega( omega ) { } - - void operator()( const state_type &x , deriv_type &dxdt , time_type t ) const - { - fusion::at_c< 0 >( dxdt ) = fusion::at_c< 1 >( x ); - fusion::at_c< 1 >( dxdt ) = - m_omega * m_omega * fusion::at_c< 0 >( x ); - } -}; - - -BOOST_AUTO_TEST_CASE( regression_168 ) -{ - typedef runge_kutta_dopri5< state_type , double , deriv_type , time_type > stepper_type; - - state_type x( 1.0 * si::meter , 0.0 * si::meter_per_second ); - - integrate_const( make_dense_output( 1.0e-6 , 1.0e-6 , stepper_type() ) , oscillator( 2.0 * si::hertz ) , - x , 0.0 * si::second , 100.0 * si::second , 0.1 * si::second); -} \ No newline at end of file diff --git a/libs/numeric/odeint/test/resize.cpp b/libs/numeric/odeint/test/resize.cpp deleted file mode 100644 index db40f4bfe..000000000 --- a/libs/numeric/odeint/test/resize.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/resize.cpp - - [begin_description] - This file tests the resize function of odeint. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012 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) - */ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_resize - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -BOOST_AUTO_TEST_CASE( test_vector ) -{ - std::vector< double > x1( 10 ); - std::vector< double > x2; - resize( x2 , x1 ); - BOOST_CHECK( x2.size() == 10 ); -} - - -BOOST_AUTO_TEST_CASE( test_fusion_vector_of_vector ) -{ - typedef boost::fusion::vector< std::vector< double > , std::vector< double > > state_type; - state_type x1; - boost::fusion::at_c< 0 >( x1 ).resize( 10 ); - boost::fusion::at_c< 1 >( x1 ).resize( 10 ); - state_type x2; - resize( x2 , x1 ); - BOOST_CHECK( boost::fusion::at_c< 0 >( x2 ).size() == 10 ); - BOOST_CHECK( boost::fusion::at_c< 1 >( x2 ).size() == 10 ); -} - - -BOOST_AUTO_TEST_CASE( test_fusion_vector_mixed1 ) -{ - typedef boost::fusion::vector< std::vector< double > , double > state_type; - state_type x1; - boost::fusion::at_c< 0 >( x1 ).resize( 10 ); - state_type x2; - resize( x2 , x1 ); - BOOST_CHECK( boost::fusion::at_c< 0 >( x2 ).size() == 10 ); -} - -BOOST_AUTO_TEST_CASE( test_fusion_vector_mixed2 ) -{ - typedef boost::fusion::vector< double , std::vector< double > , double > state_type; - state_type x1; - boost::fusion::at_c< 1 >( x1 ).resize( 10 ); - state_type x2; - resize( x2 , x1 ); - BOOST_CHECK( boost::fusion::at_c< 1 >( x2 ).size() == 10 ); -} - -BOOST_AUTO_TEST_CASE( test_fusion_quantity_sequence ) -{ - namespace units = boost::units; - namespace si = boost::units::si; - - typedef double value_type; - typedef units::quantity< si::time , value_type > time_type; - typedef units::quantity< si::length , value_type > length_type; - typedef units::quantity< si::velocity , value_type > velocity_type; - typedef boost::fusion::vector< length_type , velocity_type > state_type; - - state_type x1 , x2; - resize( x2 , x1 ); -} diff --git a/libs/numeric/odeint/test/resizing.cpp b/libs/numeric/odeint/test/resizing.cpp deleted file mode 100644 index 751795195..000000000 --- a/libs/numeric/odeint/test/resizing.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/resizing.cpp - - [begin_description] - This file tests the resizing mechanism of odeint. - [end_description] - - Copyright 2010-2012 Karsten Ahnert - Copyright 2010-2012 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) - */ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_resize - -#include -#include - -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - -#include "resizing_test_state_type.hpp" - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -namespace mpl = boost::mpl; - - - - - - -void constant_system( const test_array_type &x , test_array_type &dxdt , double t ) { dxdt[0] = 1.0; } - - -BOOST_AUTO_TEST_SUITE( check_resize_test ) - - -typedef euler< test_array_type , double , test_array_type , double , range_algebra , default_operations , never_resizer > euler_manual_type; -typedef euler< test_array_type , double , test_array_type , double , range_algebra , default_operations , initially_resizer > euler_initially_type; -typedef euler< test_array_type , double , test_array_type , double , range_algebra , default_operations , always_resizer > euler_always_type; - -typedef runge_kutta4_classic< test_array_type , double , test_array_type , double , range_algebra , default_operations , never_resizer > rk4_manual_type; -typedef runge_kutta4_classic< test_array_type , double , test_array_type , double , range_algebra , default_operations , initially_resizer > rk4_initially_type; -typedef runge_kutta4_classic< test_array_type , double , test_array_type , double , range_algebra , default_operations , always_resizer > rk4_always_type; - - -typedef runge_kutta4< test_array_type , double , test_array_type , double , range_algebra , default_operations , never_resizer > rk4_gen_manual_type; -typedef runge_kutta4< test_array_type , double , test_array_type , double , range_algebra , default_operations , initially_resizer > rk4_gen_initially_type; -typedef runge_kutta4< test_array_type , double , test_array_type , double , range_algebra , default_operations , always_resizer > rk4_gen_always_type; - - -typedef mpl::vector< - mpl::vector< euler_manual_type , mpl::int_<1> , mpl::int_<0> > , - mpl::vector< euler_initially_type , mpl::int_<1> , mpl::int_<1> > , - mpl::vector< euler_always_type , mpl::int_<1> , mpl::int_<3> > , - mpl::vector< rk4_manual_type , mpl::int_<5> , mpl::int_<0> > , - mpl::vector< rk4_initially_type , mpl::int_<5> , mpl::int_<1> > , - mpl::vector< rk4_always_type , mpl::int_<5> , mpl::int_<3> > , - mpl::vector< rk4_gen_manual_type , mpl::int_<5> , mpl::int_<0> > , - mpl::vector< rk4_gen_initially_type , mpl::int_<5> , mpl::int_<1> > , - mpl::vector< rk4_gen_always_type , mpl::int_<5> , mpl::int_<3> > - >::type resize_check_types; - - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_resize , T, resize_check_types ) -{ - typedef typename mpl::at< T , mpl::int_< 0 > >::type stepper_type; - const size_t resize_calls = mpl::at< T , mpl::int_< 1 > >::type::value; - const size_t multiplicity = mpl::at< T , mpl::int_< 2 > >::type::value; - adjust_size_count = 0; - - stepper_type stepper; - test_array_type x; - stepper.do_step( constant_system , x , 0.0 , 0.1 ); - stepper.do_step( constant_system , x , 0.0 , 0.1 ); - stepper.do_step( constant_system , x , 0.0 , 0.1 ); - - BOOST_TEST_MESSAGE( "adjust_size_count : " << adjust_size_count ); - BOOST_CHECK_MESSAGE( adjust_size_count == resize_calls * multiplicity , "adjust_size_count : " << adjust_size_count << " expected: " << resize_calls * multiplicity ); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/resizing_test_state_type.hpp b/libs/numeric/odeint/test/resizing_test_state_type.hpp deleted file mode 100644 index af55937ad..000000000 --- a/libs/numeric/odeint/test/resizing_test_state_type.hpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/resizing_test_state_type.hpp - - [begin_description] - tba. - [end_description] - - Copyright 2009-2012 Karsten Ahnert - Copyright 2009-2012 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 LIBS_NUMERIC_ODEINT_TEST_RESIZING_TEST_STATE_TYPE_HPP_DEFINED -#define LIBS_NUMERIC_ODEINT_TEST_RESIZING_TEST_STATE_TYPE_HPP_DEFINED - -#include -#include -#include - -#include - - - -// Mario: velocity verlet tests need arrays of size 2 -// some ugly detailed dependency, maybe this can be improved? -class test_array_type : public boost::array< double , 2 > { }; - -size_t adjust_size_count; - -namespace boost { -namespace numeric { -namespace odeint { - - template<> - struct is_resizeable< test_array_type > - { - typedef boost::true_type type; - const static bool value = type::value; - }; - - template<> - struct same_size_impl< test_array_type , test_array_type > - { - static bool same_size( const test_array_type &x1 , const test_array_type &x2 ) - { - return false; - } - }; - - template<> - struct resize_impl< test_array_type , test_array_type > - { - static void resize( test_array_type &x1 , const test_array_type &x2 ) - { - adjust_size_count++; - } - }; - -} // namespace odeint -} // namespace numeric -} // namespace boost - - -#endif // LIBS_NUMERIC_ODEINT_TEST_RESIZING_TEST_STATE_TYPE_HPP_DEFINED diff --git a/libs/numeric/odeint/test/rosenbrock4.cpp b/libs/numeric/odeint/test/rosenbrock4.cpp deleted file mode 100644 index f0b79d514..000000000 --- a/libs/numeric/odeint/test/rosenbrock4.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/rosenbrock4.cpp - - [begin_description] - This file tests the Rosenbrock 4 stepper and its controller and dense output stepper. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011 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) - */ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_rosenbrock4 - -#include -#include - -#include - -#include -#include -#include - -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef double value_type; -typedef boost::numeric::ublas::vector< value_type > state_type; -typedef boost::numeric::ublas::matrix< value_type > matrix_type; - - -struct sys -{ - void operator()( const state_type &x , state_type &dxdt , const value_type &t ) const - { - dxdt( 0 ) = x( 0 ) + 2 * x( 1 ); - dxdt( 1 ) = x( 1 ); - } -}; - -struct jacobi -{ - void operator()( const state_type &x , matrix_type &jacobi , const value_type &t , state_type &dfdt ) const - { - jacobi( 0 , 0 ) = 1; - jacobi( 0 , 1 ) = 2; - jacobi( 1 , 0 ) = 0; - jacobi( 1 , 1 ) = 1; - dfdt( 0 ) = 0.0; - dfdt( 1 ) = 0.0; - } -}; - -BOOST_AUTO_TEST_SUITE( rosenbrock4_test ) - -BOOST_AUTO_TEST_CASE( test_rosenbrock4_stepper ) -{ - typedef rosenbrock4< value_type > stepper_type; - stepper_type stepper; - - typedef stepper_type::state_type state_type; - typedef stepper_type::value_type stepper_value_type; - typedef stepper_type::deriv_type deriv_type; - typedef stepper_type::time_type time_type; - - state_type x( 2 ) , xerr( 2 ); - x(0) = 0.0; x(1) = 1.0; - - stepper.do_step( std::make_pair( sys() , jacobi() ) , x , 0.0 , 0.1 , xerr ); - - stepper.do_step( std::make_pair( sys() , jacobi() ) , x , 0.0 , 0.1 ); - -// using std::abs; -// value_type eps = 1E-12; -// -// // compare with analytic solution of above system -// BOOST_CHECK_SMALL( abs( x(0) - 20.0/81.0 ) , eps ); -// BOOST_CHECK_SMALL( abs( x(1) - 10.0/9.0 ) , eps ); - -} - -BOOST_AUTO_TEST_CASE( test_rosenbrock4_controller ) -{ - typedef rosenbrock4_controller< rosenbrock4< value_type > > stepper_type; - stepper_type stepper; - - typedef stepper_type::state_type state_type; - typedef stepper_type::value_type stepper_value_type; - typedef stepper_type::deriv_type deriv_type; - typedef stepper_type::time_type time_type; - - state_type x( 2 ); - x( 0 ) = 0.0 ; x(1) = 1.0; - - value_type t = 0.0 , dt = 0.01; - stepper.try_step( std::make_pair( sys() , jacobi() ) , x , t , dt ); -} - -BOOST_AUTO_TEST_CASE( test_rosenbrock4_dense_output ) -{ - typedef rosenbrock4_dense_output< rosenbrock4_controller< rosenbrock4< value_type > > > stepper_type; - typedef rosenbrock4_controller< rosenbrock4< value_type > > controlled_stepper_type; - controlled_stepper_type c_stepper; - stepper_type stepper( c_stepper ); - - typedef stepper_type::state_type state_type; - typedef stepper_type::value_type stepper_value_type; - typedef stepper_type::deriv_type deriv_type; - typedef stepper_type::time_type time_type; - state_type x( 2 ); - x( 0 ) = 0.0 ; x(1) = 1.0; - stepper.initialize( x , 0.0 , 0.1 ); - std::pair< value_type , value_type > tr = stepper.do_step( std::make_pair( sys() , jacobi() ) ); - stepper.calc_state( 0.5 * ( tr.first + tr.second ) , x ); -} - -BOOST_AUTO_TEST_CASE( test_rosenbrock4_copy_dense_output ) -{ - typedef rosenbrock4_controller< rosenbrock4< value_type > > controlled_stepper_type; - typedef rosenbrock4_dense_output< controlled_stepper_type > stepper_type; - - controlled_stepper_type c_stepper; - stepper_type stepper( c_stepper ); - stepper_type stepper2( stepper ); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/rosenbrock4_mp.cpp b/libs/numeric/odeint/test/rosenbrock4_mp.cpp deleted file mode 100644 index dc295c473..000000000 --- a/libs/numeric/odeint/test/rosenbrock4_mp.cpp +++ /dev/null @@ -1,143 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/rosenbrock4.cpp - - [begin_description] - This file tests the Rosenbrock 4 stepper and its controller and dense output stepper. - [end_description] - - Copyright 2009-2012 Karsten Ahnert - Copyright 2009-2012 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) - */ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_rosenbrock4 - -#include -#include - -#include -#include - -#include -#include -#include - -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef boost::multiprecision::cpp_dec_float_50 value_type; -typedef boost::numeric::ublas::vector< value_type > state_type; -typedef boost::numeric::ublas::matrix< value_type > matrix_type; - - -struct sys -{ - void operator()( const state_type &x , state_type &dxdt , const value_type &t ) const - { - dxdt( 0 ) = x( 0 ) + 2 * x( 1 ); - dxdt( 1 ) = x( 1 ); - } -}; - -struct jacobi -{ - void operator()( const state_type &x , matrix_type &jacobi , const value_type &t , state_type &dfdt ) const - { - jacobi( 0 , 0 ) = 1; - jacobi( 0 , 1 ) = 2; - jacobi( 1 , 0 ) = 0; - jacobi( 1 , 1 ) = 1; - dfdt( 0 ) = 0.0; - dfdt( 1 ) = 0.0; - } -}; - -BOOST_AUTO_TEST_SUITE( rosenbrock4_test ) - -BOOST_AUTO_TEST_CASE( test_rosenbrock4_stepper ) -{ - typedef rosenbrock4< value_type > stepper_type; - stepper_type stepper; - - typedef stepper_type::state_type state_type; - typedef stepper_type::value_type stepper_value_type; - typedef stepper_type::deriv_type deriv_type; - typedef stepper_type::time_type time_type; - - state_type x( 2 ) , xerr( 2 ); - x(0) = 0.0; x(1) = 1.0; - - stepper.do_step( std::make_pair( sys() , jacobi() ) , x , - static_cast(0.0) , static_cast(0.1) , xerr ); - - stepper.do_step( std::make_pair( sys() , jacobi() ) , x , - static_cast(0.0) , static_cast(0.1) ); - -// using std::abs; -// value_type eps = 1E-12; -// -// // compare with analytic solution of above system -// BOOST_CHECK_SMALL( abs( x(0) - 20.0/81.0 ) , eps ); -// BOOST_CHECK_SMALL( abs( x(1) - 10.0/9.0 ) , eps ); - -} - -BOOST_AUTO_TEST_CASE( test_rosenbrock4_controller ) -{ - typedef rosenbrock4_controller< rosenbrock4< value_type > > stepper_type; - stepper_type stepper; - - typedef stepper_type::state_type state_type; - typedef stepper_type::value_type stepper_value_type; - typedef stepper_type::deriv_type deriv_type; - typedef stepper_type::time_type time_type; - - state_type x( 2 ); - x( 0 ) = 0.0 ; x(1) = 1.0; - - value_type t = 0.0 , dt = 0.01; - stepper.try_step( std::make_pair( sys() , jacobi() ) , x , t , dt ); -} - -BOOST_AUTO_TEST_CASE( test_rosenbrock4_dense_output ) -{ - typedef rosenbrock4_dense_output< rosenbrock4_controller< rosenbrock4< value_type > > > stepper_type; - typedef rosenbrock4_controller< rosenbrock4< value_type > > controlled_stepper_type; - controlled_stepper_type c_stepper; - stepper_type stepper( c_stepper ); - - typedef stepper_type::state_type state_type; - typedef stepper_type::value_type stepper_value_type; - typedef stepper_type::deriv_type deriv_type; - typedef stepper_type::time_type time_type; - state_type x( 2 ); - x( 0 ) = 0.0 ; x(1) = 1.0; - stepper.initialize( x , 0.0 , 0.1 ); - std::pair< value_type , value_type > tr = stepper.do_step( std::make_pair( sys() , jacobi() ) ); - stepper.calc_state( 0.5 * ( tr.first + tr.second ) , x ); -} - -BOOST_AUTO_TEST_CASE( test_rosenbrock4_copy_dense_output ) -{ - typedef rosenbrock4_controller< rosenbrock4< value_type > > controlled_stepper_type; - typedef rosenbrock4_dense_output< controlled_stepper_type > stepper_type; - - controlled_stepper_type c_stepper; - stepper_type stepper( c_stepper ); - stepper_type stepper2( stepper ); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/runge_kutta_concepts.cpp b/libs/numeric/odeint/test/runge_kutta_concepts.cpp deleted file mode 100644 index a16b04fda..000000000 --- a/libs/numeric/odeint/test/runge_kutta_concepts.cpp +++ /dev/null @@ -1,216 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/runge_kutta_concepts.cpp - - [begin_description] - This file tests the Stepper concepts of odeint with all Runge-Kutta steppers. It's one of the main tests - of odeint. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012-2013 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) - */ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_runge_kutta_concepts - -#include -#include -#include - -#include - -#include - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "prepare_stepper_testing.hpp" -#include "dummy_odes.hpp" - -using std::vector; - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -const double result = 2.2; - -const double eps = 1.0e-14; - -template< class Stepper , class System > -void check_stepper_concept( Stepper &stepper , System system , typename Stepper::state_type &x ) -{ - typedef Stepper stepper_type; - typedef typename stepper_type::deriv_type container_type; - typedef typename stepper_type::order_type order_type; - typedef typename stepper_type::time_type time_type; - - stepper.do_step( system , x , static_cast(0.0) , static_cast(0.1) ); -} - -// default case is used for vector space types like plain double -template< class Stepper , typename T > -struct perform_stepper_test -{ - typedef T vector_space_type; - void operator()( void ) const - { - vector_space_type x; - x = 2.0; - Stepper stepper; - constant_system_functor_vector_space sys; -#ifndef _MSC_VER - // dont run this for MSVC due to compiler bug 697006 - check_stepper_concept( stepper , constant_system_vector_space< vector_space_type , vector_space_type , typename Stepper::time_type > , x ); -#else - check_stepper_concept( stepper , boost::cref( sys ) , x ); -#endif - check_stepper_concept( stepper , boost::cref( sys ) , x ); - std::cout << x << " ?= " << result << std::endl; - BOOST_CHECK( (abs( x - result )) < eps ); - } -}; - -template< class Stepper , typename T > -struct perform_stepper_test< Stepper , std::vector > -{ - typedef std::vector vector_type; - void operator()( void ) - { - using std::abs; - vector_type x( 1 , static_cast(2.0) ); - Stepper stepper; - constant_system_functor_standard sys; -#ifndef _MSC_VER - // dont run this for MSVC due to compiler bug 697006 - check_stepper_concept( stepper , constant_system_standard< vector_type , vector_type , typename Stepper::time_type > , x ); -#else - check_stepper_concept( stepper , boost::cref( sys ) , x ); -#endif - check_stepper_concept( stepper , boost::cref( sys ) , x ); - std::cout << x[0] << " ?= " << result << std::endl; - BOOST_CHECK( (abs( x[0] - result )) < eps ); - } -}; - -template< class Stepper , typename T > -struct perform_stepper_test< Stepper , boost::array > -{ - typedef boost::array array_type; - void operator()( void ) - { - using std::abs; - array_type x; - x[0] = static_cast(2.0); - Stepper stepper; - constant_system_functor_standard sys; -#ifndef _MSC_VER - // dont run this for MSVC due to compiler bug 697006 - check_stepper_concept( stepper , constant_system_standard< array_type , array_type , typename Stepper::time_type > , x ); -#else - check_stepper_concept( stepper , boost::cref( sys ) , x ); -#endif - check_stepper_concept( stepper , boost::cref( sys ) , x ); - std::cout << x[0] << " ?= " << result << std::endl; - BOOST_CHECK( (abs( x[0] - result )) < eps ); - } -}; - -// split stepper methods to ensure the final vector has less than 30(?) elements -// (stepper_methods*container_types) < 30(?) -template< class State > class stepper_methods1 : public mpl::vector< - euler< State , typename detail::extract_value_type::type > , - modified_midpoint< State , typename detail::extract_value_type::type > , - runge_kutta4< State , typename detail::extract_value_type::type > , - runge_kutta4_classic< State , typename detail::extract_value_type::type > - > { }; - -template< class State > class stepper_methods2 : public mpl::vector< - runge_kutta_cash_karp54_classic< State , typename detail::extract_value_type::type > , - runge_kutta_cash_karp54< State , typename detail::extract_value_type::type > , - runge_kutta_dopri5< State , typename detail::extract_value_type::type > , - runge_kutta_fehlberg78< State , typename detail::extract_value_type::type > - > { }; - - - -typedef mpl::copy -< - container_types , - mpl::inserter - < - mpl::vector0<> , - mpl::insert_range - < - mpl::_1 , - mpl::end< mpl::_1 > , - stepper_methods1< mpl::_2 > - > - > ->::type stepper_combinations1; - -typedef mpl::copy -< - container_types , - mpl::inserter - < - mpl::vector0<> , - mpl::insert_range - < - mpl::_1 , - mpl::end< mpl::_1 > , - stepper_methods2< mpl::_2 > - > - > ->::type stepper_combinations2; - - -BOOST_AUTO_TEST_SUITE( runge_kutta_concept_test ) - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_test1 , Stepper, stepper_combinations1 ) -{ - perform_stepper_test< Stepper , typename Stepper::deriv_type > tester; - tester(); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_test2 , Stepper, stepper_combinations2 ) -{ - perform_stepper_test< Stepper , typename Stepper::deriv_type > tester; - tester(); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/runge_kutta_controlled_concepts.cpp b/libs/numeric/odeint/test/runge_kutta_controlled_concepts.cpp deleted file mode 100644 index 2132b0928..000000000 --- a/libs/numeric/odeint/test/runge_kutta_controlled_concepts.cpp +++ /dev/null @@ -1,210 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/runge_kutta_controlled_concepts.cpp - - [begin_description] - This file tests the Stepper concepts of odeint with all Controlled Runge-Kutta steppers. - It's one of the main tests of odeint. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012-2013 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) - */ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_runge_kutta_controlled_concepts - -#include -#include -#include - -#include - -#include - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "prepare_stepper_testing.hpp" -#include "dummy_odes.hpp" - -using std::vector; - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -const double result = 2.2; // two steps - -const double eps = 1.0e-14; - -template< class Stepper , class System > -void check_controlled_stepper_concept( Stepper &stepper , System system , typename Stepper::state_type &x ) -{ - typedef Stepper stepper_type; - typedef typename stepper_type::deriv_type container_type; - //typedef typename stepper_type::order_type order_type; controlled_error_stepper don't necessarily have a order (burlish-stoer) - typedef typename stepper_type::time_type time_type; - - time_type t = 0.0 , dt = 0.1; - controlled_step_result step_result = stepper.try_step( system , x , t , dt ); - - BOOST_CHECK_MESSAGE( step_result == success , "step result: " << step_result ); // error = 0 for constant system -> step size is always too small -} - - -template< class ControlledStepper , typename T > -struct perform_controlled_stepper_test -{ - typedef T vector_space_type; - void operator()( void ) const - { - vector_space_type x; - x = 2.0; - ControlledStepper controlled_stepper; - constant_system_functor_vector_space sys; -#ifndef _MSC_VER - // dont run this for MSVC due to compiler bug 697006 - check_controlled_stepper_concept( controlled_stepper , - constant_system_vector_space< vector_space_type , vector_space_type , typename ControlledStepper::time_type > - , x ); -#else - check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x ); -#endif - check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x ); - BOOST_CHECK( (abs( x - result )) < eps ); - } -}; - -template< class ControlledStepper , typename T > -struct perform_controlled_stepper_test< ControlledStepper , std::vector > -{ - typedef std::vector vector_type; - void operator()( void ) - { - using std::abs; - vector_type x( 1 , 2.0 ); - ControlledStepper controlled_stepper; - constant_system_functor_standard sys; -#ifndef _MSC_VER - // dont run this for MSVC due to compiler bug 697006 - - check_controlled_stepper_concept( controlled_stepper , - constant_system_standard< vector_type , vector_type , typename ControlledStepper::time_type > , - x ); -#else - check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x ); -#endif - check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x ); - BOOST_CHECK( (abs( x[0] - result )) < eps ); - } -}; - - -template< class ControlledStepper > -struct perform_controlled_stepper_test< ControlledStepper , vector_space_type > -{ - void operator()( void ) const - { - vector_space_type x; - x = 2.0; - ControlledStepper controlled_stepper; - constant_system_functor_vector_space sys; -#ifndef _MSC_VER - // dont run this for MSVC due to compiler bug 697006 - check_controlled_stepper_concept( controlled_stepper , - constant_system_vector_space< vector_space_type , vector_space_type , typename ControlledStepper::time_type > - , x ); -#else - check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x ); -#endif - check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x ); - BOOST_CHECK( (abs( x - result )) < eps ); - } -}; - -template< class ControlledStepper , typename T > -struct perform_controlled_stepper_test< ControlledStepper , boost::array > -{ - typedef boost::array array_type; - void operator()( void ) - { - using std::abs; - array_type x; - x[0] = 2.0; - ControlledStepper controlled_stepper; - constant_system_functor_standard sys; -#ifndef _MSC_VER - // dont run this for MSVC due to compiler bug 697006 - check_controlled_stepper_concept( controlled_stepper , constant_system_standard< array_type , array_type , typename ControlledStepper::time_type > , x ); -#else - check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x ); -#endif - check_controlled_stepper_concept( controlled_stepper , boost::cref( sys ) , x ); - BOOST_CHECK( (abs( x[0] - result )) < eps ); - } -}; - - -template< class State > class controlled_stepper_methods : public mpl::vector< - controlled_runge_kutta< runge_kutta_cash_karp54_classic< State , typename detail::extract_value_type::type > > , - controlled_runge_kutta< runge_kutta_dopri5< State , typename detail::extract_value_type::type > > , - controlled_runge_kutta< runge_kutta_fehlberg78< State , typename detail::extract_value_type::type > > , - bulirsch_stoer< State , typename detail::extract_value_type::type > - > { }; - -typedef mpl::copy -< - container_types , - mpl::inserter - < - mpl::vector0<> , - mpl::insert_range - < - mpl::_1 , - mpl::end< mpl::_1 > , - controlled_stepper_methods< mpl::_2 > - > - > - >::type all_controlled_stepper_methods; - - - - -BOOST_AUTO_TEST_SUITE( controlled_runge_kutta_concept_test ) - -BOOST_AUTO_TEST_CASE_TEMPLATE( controlled_stepper_test , ControlledStepper , all_controlled_stepper_methods ) -{ - perform_controlled_stepper_test< ControlledStepper , typename ControlledStepper::state_type > tester; - tester(); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/runge_kutta_error_concepts.cpp b/libs/numeric/odeint/test/runge_kutta_error_concepts.cpp deleted file mode 100644 index 06980772a..000000000 --- a/libs/numeric/odeint/test/runge_kutta_error_concepts.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/runge_kutta_error_concepts.cpp - - [begin_description] - This file tests the Stepper concepts of odeint with all Runge-Kutta Error steppers. - It's one of the main tests of odeint. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012-2013 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) - */ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_runge_kutta_error_concepts - -#include -#include -#include - -#include - -#include - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "prepare_stepper_testing.hpp" -#include "dummy_odes.hpp" - -using std::vector; - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; - -const double result = 2.4; // four steps total... - -const double eps = 1.0e-14; - -template< class Stepper , class System > -void check_error_stepper_concept( Stepper &stepper , System system , typename Stepper::state_type &x , typename Stepper::state_type &xerr ) -{ - typedef Stepper stepper_type; - typedef typename stepper_type::deriv_type container_type; - typedef typename stepper_type::order_type order_type; - typedef typename stepper_type::time_type time_type; - - stepper.do_step( system , x , static_cast(0.0) , static_cast(0.1) ); - stepper.do_step( system , x , static_cast(0.0) , static_cast(0.1) , xerr ); -} - -// default case is used for vector space types like plain double -template< class Stepper , typename T > -struct perform_error_stepper_test -{ - typedef T vector_space_type; - void operator()( void ) const - { - using std::abs; - vector_space_type x , xerr; - x = 2.0; - Stepper stepper; - constant_system_functor_vector_space sys; -#ifndef _MSC_VER - // dont run this for MSVC due to compiler bug 697006 - check_error_stepper_concept( stepper , - constant_system_vector_space< vector_space_type , vector_space_type , typename Stepper::time_type > , - x , - xerr ); -#else - check_error_stepper_concept( stepper , boost::cref( sys ) , x , xerr ); -#endif - check_error_stepper_concept( stepper , boost::cref( sys ) , x , xerr ); - - BOOST_CHECK_MESSAGE( (abs( x - result )) < eps , x ); - } -}; - -template< class Stepper , typename T > -struct perform_error_stepper_test< Stepper , std::vector > -{ - typedef std::vector vector_type; - void operator()( void ) - { - using std::abs; - vector_type x( 1 , 2.0 ) , xerr( 1 ); - Stepper stepper; - constant_system_functor_standard sys; -#ifndef _MSC_VER - // dont run this for MSVC due to compiler bug 697006 - check_error_stepper_concept( stepper , constant_system_standard< vector_type , vector_type , typename Stepper::time_type > , x , xerr ); -#else - check_error_stepper_concept( stepper , boost::cref( sys ) , x , xerr ); -#endif - check_error_stepper_concept( stepper , boost::cref( sys ) , x , xerr ); - BOOST_CHECK( (abs( x[0] - result )) < eps ); - } -}; - - -template< class Stepper , typename T > -struct perform_error_stepper_test< Stepper , boost::array > -{ - typedef boost::array array_type; - void operator()( void ) - { - using std::abs; - array_type x , xerr; - x[0] = 2.0; - Stepper stepper; - constant_system_functor_standard sys; -#ifndef _MSC_VER - // dont run this for MSVC due to compiler bug 697006 - check_error_stepper_concept( stepper , constant_system_standard< array_type , array_type , typename Stepper::time_type > , x , xerr ); -#else - check_error_stepper_concept( stepper , boost::cref( sys ) , x , xerr ); -#endif - check_error_stepper_concept( stepper , boost::cref( sys ) , x , xerr ); - BOOST_CHECK( (abs( x[0] - result )) < eps ); - } -}; - -template< class State > class error_stepper_methods : public mpl::vector< - runge_kutta_cash_karp54_classic< State , typename detail::extract_value_type::type > , - runge_kutta_cash_karp54< State , typename detail::extract_value_type::type > , - runge_kutta_dopri5< State , typename detail::extract_value_type::type > , - runge_kutta_fehlberg78< State , typename detail::extract_value_type::type > - > { }; - - -typedef mpl::copy -< - container_types , - mpl::inserter - < - mpl::vector0<> , - mpl::insert_range - < - mpl::_1 , - mpl::end< mpl::_1 > , - error_stepper_methods< mpl::_2 > - > - > - >::type all_error_stepper_methods; - - -BOOST_AUTO_TEST_SUITE( runge_kutta_error_concept_test ) - -BOOST_AUTO_TEST_CASE_TEMPLATE( error_stepper_test , Stepper , all_error_stepper_methods ) -{ - perform_error_stepper_test< Stepper , typename Stepper::state_type > tester; - tester(); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/same_size.cpp b/libs/numeric/odeint/test/same_size.cpp deleted file mode 100644 index 09a04c199..000000000 --- a/libs/numeric/odeint/test/same_size.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/same_size.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2012 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) - */ - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_dummy - -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - - -BOOST_AUTO_TEST_SUITE( same_size_test ) - -BOOST_AUTO_TEST_CASE( test_vector_true ) -{ - std::vector< double > v1( 10 ) , v2( 10 ); - BOOST_CHECK_EQUAL( true , same_size( v1 , v2 ) ); -} - - -BOOST_AUTO_TEST_CASE( test_vector_false ) -{ - std::vector< double > v1( 10 ) , v2( 20 ); - BOOST_CHECK_EQUAL( false , same_size( v1 , v2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_fusion_true ) -{ - boost::fusion::vector< double , std::vector< double > > v1 , v2; - boost::fusion::at_c< 1 >( v1 ).resize( 10 ); - boost::fusion::at_c< 1 >( v2 ).resize( 10 ); - BOOST_CHECK_EQUAL( true , same_size( v1 , v2 ) ); -} - -BOOST_AUTO_TEST_CASE( test_fusion_false ) -{ - boost::fusion::vector< double , std::vector< double > > v1 , v2; - boost::fusion::at_c< 1 >( v1 ).resize( 10 ); - boost::fusion::at_c< 1 >( v2 ).resize( 20 ); - BOOST_CHECK_EQUAL( false , same_size( v1 , v2 ) ); -} - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/split.cpp b/libs/numeric/odeint/test/split.cpp deleted file mode 100644 index b8f056be9..000000000 --- a/libs/numeric/odeint/test/split.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/split.cpp - - [begin_description] - Test the range split. - [end_description] - - Copyright 2013 Karsten Ahnert - Copyright 2013 Mario Mulansky - Copyright 2013 Pascal Germroth - - Distributed under the 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_TEST_MODULE odeint_split - -#include - -#include -#include -#include - -template -inline void dump_range(const T &r) { - std::cout << '['; - std::copy(boost::begin(r), boost::end(r), std::ostream_iterator< - typename std::iterator_traits< - typename boost::range_iterator::type - >::value_type >(std::cout, " ") ); - std::cout << ']'; -} - -template -inline void check_equal_range(const A a, const B b) { - BOOST_CHECK_EQUAL_COLLECTIONS( boost::begin(a), boost::end(a), boost::begin(b), boost::end(b) ); -} - - -using namespace boost::unit_test; -using namespace boost::numeric::odeint::detail; -using namespace boost; - -BOOST_AUTO_TEST_CASE( test_eleven ) -{ - // 0 1 2 3 | 4 5 6 7 | 8 9 10 11 - check_equal_range( irange(0, 12) | split(0, 3), irange(0, 4) ); - check_equal_range( irange(0, 12) | split(1, 3), irange(4, 8) ); - check_equal_range( irange(0, 12) | split(2, 3), irange(8, 12) ); -} - -BOOST_AUTO_TEST_CASE( test_ten ) -{ - // 0 1 2 3 | 4 5 6 7 | 8 9 10 - check_equal_range( irange(0, 11) | split(0, 3), irange(0, 4) ); - check_equal_range( irange(0, 11) | split(1, 3), irange(4, 8) ); - check_equal_range( irange(0, 11) | split(2, 3), irange(8, 11) ); -} - -BOOST_AUTO_TEST_CASE( test_nine ) -{ - // 0 1 2 3 | 4 5 6 | 7 8 9 - check_equal_range( irange(0, 10) | split(0, 3), irange(0, 4) ); - check_equal_range( irange(0, 10) | split(1, 3), irange(4, 7) ); - check_equal_range( irange(0, 10) | split(2, 3), irange(7, 10) ); -} diff --git a/libs/numeric/odeint/test/std_array.cpp b/libs/numeric/odeint/test/std_array.cpp deleted file mode 100644 index 350a387a8..000000000 --- a/libs/numeric/odeint/test/std_array.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - [auto_generated] - test/std_array.cpp - - [begin_description] - Checks if odeint compiles fine with the std::array using the array algebra - [end_description] - - Copyright 2009-2014 Karsten Ahnert - Copyright 2009-2014 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) - */ - - -#define BOOST_TEST_MODULE odeint_std_array - -#include -#include -#include -#include -#include - -using namespace boost::unit_test; - -typedef std::array state_type; - -void rhs(const state_type &x, state_type &dxdt, const double t) -{ -} - -BOOST_AUTO_TEST_SUITE( unwrap_reference_test ) - -BOOST_AUTO_TEST_CASE( test_case ) -{ - state_type x = {0.0, 0.0, 0.0}; - - typedef boost::numeric::odeint::runge_kutta4 stepper_type; -// check if array algebra is selected, but only if odeint detects c++11 -#ifdef BOOST_NUMERIC_ODEINT_CXX11 - BOOST_STATIC_ASSERT(( boost::is_same< stepper_type::algebra_type , - boost::numeric::odeint::array_algebra >::value )); -#endif - stepper_type stepper1; - stepper1.do_step(rhs, x, 0.0, 0.1); - - boost::numeric::odeint::runge_kutta4< - state_type, double, state_type, double, - boost::numeric::odeint::array_algebra > stepper; - stepper.do_step(rhs, x, 0.0, 0.1); - -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/step_size_limitation.cpp b/libs/numeric/odeint/test/step_size_limitation.cpp deleted file mode 100644 index 2d8e4725d..000000000 --- a/libs/numeric/odeint/test/step_size_limitation.cpp +++ /dev/null @@ -1,268 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/step_size_limitation.cpp - - [begin_description] - Tests the step size limitation functionality - [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) - */ - -#define BOOST_TEST_MODULE odeint_integrate_times - -#include - -#include -#include -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef double value_type; -typedef std::vector< value_type > state_type; - -/*********************************************** - * first part of the tests: explicit methods - *********************************************** - */ - -void damped_osc( const state_type &x , state_type &dxdt , const value_type t ) -{ - const value_type gam( 0.1); - - dxdt[0] = x[1]; - dxdt[1] = -x[0] - gam*x[1]; -} - - -struct push_back_time -{ - std::vector< double >& m_times; - - push_back_time( std::vector< double > × ) - : m_times( times ) { } - - template - void operator()( const State &x , double t ) - { - m_times.push_back( t ); - } -}; - -BOOST_AUTO_TEST_SUITE( step_size_limitation_test ) - -BOOST_AUTO_TEST_CASE( test_step_adjuster ) -{ - // first use adjuster without step size limitation - default_step_adjuster step_adjuster; - const double dt = 0.1; - double dt_new = step_adjuster.decrease_step(dt, 1.5, 2); - BOOST_CHECK(dt_new < dt*2.0/3.0); - - dt_new = step_adjuster.increase_step(dt, 0.8, 1); - // for errors > 0.5 no increase is performed - BOOST_CHECK(dt_new == dt); - - dt_new = step_adjuster.increase_step(dt, 0.4, 1); - // smaller errors should lead to step size increase - std::cout << dt_new << std::endl; - BOOST_CHECK(dt_new > dt); - - - // now test with step size limitation max_dt = 0.1 - default_step_adjuster - limited_adjuster(dt); - - dt_new = limited_adjuster.decrease_step(dt, 1.5, 2); - // decreasing works as before - BOOST_CHECK(dt_new < dt*2.0/3.0); - - dt_new = limited_adjuster.decrease_step(2*dt, 1.1, 2); - // decreasing a large step size should give max_dt - BOOST_CHECK(dt_new == dt); - - dt_new = limited_adjuster.increase_step(dt, 0.8, 1); - // for errors > 0.5 no increase is performed, still valid - BOOST_CHECK(dt_new == dt); - - dt_new = limited_adjuster.increase_step(dt, 0.4, 1); - // but even for smaller errors, we should at most get 0.1 - BOOST_CHECK_EQUAL(dt_new, dt); - - dt_new = limited_adjuster.increase_step(0.9*dt, 0.1, 1); - std::cout << dt_new << std::endl; - // check that we don't increase beyond max_dt - BOOST_CHECK(dt_new == dt); -} - - -template -void test_explicit_stepper(Stepper stepper, const double max_dt) -{ - state_type x( 2 ); - x[0] = x[1] = 10.0; - const size_t steps = 100; - - std::vector times; - - integrate_adaptive(stepper, damped_osc, x, 0.0, steps*max_dt, max_dt, push_back_time(times)); - - BOOST_CHECK_EQUAL(times.size(), steps+1); - // check that dt remains at exactly max_dt - for( size_t i=0 ; i(i)*max_dt , 1E-15); - times.clear(); - - // this should also work when we provide some bigger initial dt - integrate_adaptive(stepper, damped_osc, x, 0.0, steps*max_dt, 10*max_dt, push_back_time(times)); - - BOOST_CHECK_EQUAL(times.size(), steps+1); - // check that dt remains at exactly max_dt - for( size_t i=0 ; i(i)*max_dt , 1E-15); - times.clear(); -} - - -BOOST_AUTO_TEST_CASE( test_controlled ) -{ - const double max_dt = 0.01; - - test_explicit_stepper(make_controlled(1E-2, 1E-2, max_dt, - runge_kutta_dopri5()), - max_dt); - test_explicit_stepper(make_controlled(1E-2, 1E-2, -max_dt, - runge_kutta_dopri5()), - -max_dt); - - test_explicit_stepper(make_controlled(1E-2, 1E-2, max_dt, - runge_kutta_cash_karp54()), - max_dt); - test_explicit_stepper(make_controlled(1E-2, 1E-2, -max_dt, - runge_kutta_cash_karp54()), - -max_dt); - - test_explicit_stepper(bulirsch_stoer(1E-2, 1E-2, 1.0, 1.0, max_dt), - max_dt); - test_explicit_stepper(bulirsch_stoer(1E-2, 1E-2, 1.0, 1.0, -max_dt), - -max_dt); -} - - -BOOST_AUTO_TEST_CASE( test_dense_out ) -{ - const double max_dt = 0.01; - test_explicit_stepper(make_dense_output(1E-2, 1E-2, max_dt, - runge_kutta_dopri5()), - max_dt); - test_explicit_stepper(make_dense_output(1E-2, 1E-2, -max_dt, - runge_kutta_dopri5()), - -max_dt); - - test_explicit_stepper(bulirsch_stoer_dense_out(1E-2, 1E-2, 1, 1, max_dt), - max_dt); - - test_explicit_stepper(bulirsch_stoer_dense_out(1E-2, 1E-2, 1, 1, -max_dt), - -max_dt); -} - - -/*********************************************** - * second part of the tests: implicit Rosenbrock - *********************************************** - */ - -typedef boost::numeric::ublas::vector< value_type > vector_type; -typedef boost::numeric::ublas::matrix< value_type > matrix_type; - - -// harmonic oscillator, analytic solution x[0] = sin( t ) -struct osc_rhs -{ - void operator()( const vector_type &x , vector_type &dxdt , const value_type &t ) const - { - dxdt( 0 ) = x( 1 ); - dxdt( 1 ) = -x( 0 ); - } -}; - -struct osc_jacobi -{ - void operator()( const vector_type &x , matrix_type &jacobi , const value_type &t , vector_type &dfdt ) const - { - jacobi( 0 , 0 ) = 0; - jacobi( 0 , 1 ) = 1; - jacobi( 1 , 0 ) = -1; - jacobi( 1 , 1 ) = 0; - dfdt( 0 ) = 0.0; - dfdt( 1 ) = 0.0; - } -}; - - -template -void test_rosenbrock_stepper(Stepper stepper, const double max_dt) -{ - vector_type x( 2 ); - x(0) = x(1) = 10.0; - const size_t steps = 100; - - std::vector times; - - integrate_adaptive(stepper, - std::make_pair(osc_rhs(), osc_jacobi()), - x, 0.0, steps*max_dt, max_dt, push_back_time(times)); - - BOOST_CHECK_EQUAL(times.size(), steps+1); - // check that dt remains at exactly max_dt - for( size_t i=0 ; i(i)*max_dt , 1E-15); - times.clear(); - - // this should also work when we provide some bigger initial dt - integrate_adaptive(stepper, - std::make_pair(osc_rhs(), osc_jacobi()), - x, 0.0, steps*max_dt, 10*max_dt, push_back_time(times)); - - BOOST_CHECK_EQUAL(times.size(), steps+1); - // check that dt remains at exactly max_dt - for( size_t i=0 ; i(i)*max_dt , 1E-15); - times.clear(); -} - - -BOOST_AUTO_TEST_CASE( test_controlled_rosenbrock ) -{ - const double max_dt = 0.01; - - test_rosenbrock_stepper(make_controlled(1E-2, 1E-2, max_dt, rosenbrock4()), - max_dt); - test_rosenbrock_stepper(make_controlled(1E-2, 1E-2, -max_dt, rosenbrock4()), - -max_dt); -} - - -BOOST_AUTO_TEST_CASE( test_dense_out_rosenbrock ) -{ - const double max_dt = 0.01; - - test_rosenbrock_stepper(make_dense_output(1E-2, 1E-2, max_dt, rosenbrock4()), - max_dt); - test_rosenbrock_stepper(make_dense_output(1E-2, 1E-2, -max_dt, rosenbrock4()), - -max_dt); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/stepper_copying.cpp b/libs/numeric/odeint/test/stepper_copying.cpp deleted file mode 100644 index c29e4de19..000000000 --- a/libs/numeric/odeint/test/stepper_copying.cpp +++ /dev/null @@ -1,856 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/stepper_copying.cpp - - [begin_description] - This file tests the copying of the steppers. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2012 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) -*/ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC -#pragma warning(disable:4996) -#endif - - -#define BOOST_TEST_MODULE odeint_stepper_copying - -#include -#include - -//#include -//#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -template< class T , size_t Dim > -class test_array -{ -public: - - const static size_t dim = Dim; - typedef T value_type; - typedef value_type* iterator; - typedef const value_type* const_iterator; - - value_type& operator[]( size_t i ) - { - return m_data[i]; - } - - const value_type& operator[]( size_t i ) const - { - return m_data[i]; - } - - iterator begin( void ) - { - return m_data; - } - - iterator end( void ) - { - return m_data + dim; - } - - const_iterator begin( void ) const - { - return m_data; - } - - const_iterator end( void ) const - { - return m_data + dim; - } - - -private: - - value_type m_data[dim]; -}; - -template< class T , size_t Dim > -class test_array2 : public test_array< T , Dim > -{ -}; - - - -/* - * Explicit testing if copying was successful is difficult, - * hence we only test if the number of copy operations is right. - * - * Otherwise one has to prepare the states. - */ - -size_t construct_count = 0; -size_t construct2_count = 0; -size_t destruct_count = 0; -size_t destruct2_count = 0; -size_t copy_count = 0; -size_t copy2_count = 0; - -void reset_counter( void ) -{ - construct_count = 0; - construct2_count = 0; - destruct_count = 0; - destruct2_count = 0; - copy_count = 0; - copy2_count = 0; -} - - -namespace boost { namespace numeric { namespace odeint { - -//provide the state_wrapper - template< class T , size_t Dim > - struct state_wrapper< test_array< T , Dim > > - { - typedef state_wrapper< test_array< T , Dim > > state_wrapper_type; - typedef test_array< T , Dim > state_type; - typedef T value_type; - - state_type m_v; - - state_wrapper() : m_v() - { - construct_count++; - } - - state_wrapper( const state_type &v ) : m_v( v ) - { - construct_count++; - copy_count++; - } - - state_wrapper( const state_wrapper_type &x ) : m_v( x.m_v ) - { - construct_count++; - copy_count++; - } - - state_wrapper_type& operator=( const state_wrapper_type &x ) - { - copy_count++; - return *this; - } - - ~state_wrapper() - { - destruct_count++; - } - }; - -//provide the state_wrapper - template< class T , size_t Dim > - struct state_wrapper< test_array2< T , Dim > > - { - typedef state_wrapper< test_array2< T , Dim > > state_wrapper_type; - typedef test_array2< T , Dim > state_type; - typedef T value_type; - - state_type m_v; - - state_wrapper() : m_v() - { - construct2_count++; - } - - state_wrapper( const state_type &v ) : m_v( v ) - { - construct2_count++; - copy2_count++; - } - - state_wrapper( const state_wrapper_type &x ) : m_v( x.m_v ) - { - construct2_count++; - copy2_count++; - } - - state_wrapper_type& operator=( const state_wrapper_type &x ) - { - copy2_count++; - return *this; - } - - ~state_wrapper() - { - destruct2_count++; - } - }; - - - } } } - - - -typedef test_array< double , 3 > state_type; -typedef test_array2< double , 3 > deriv_type; -typedef boost::numeric::odeint::euler< state_type , double , deriv_type > euler_type; -typedef boost::numeric::odeint::runge_kutta4_classic< state_type , double , deriv_type > rk4_type; -typedef boost::numeric::odeint::runge_kutta4< state_type , double , deriv_type > rk4_generic_type; -typedef boost::numeric::odeint::runge_kutta_cash_karp54_classic< state_type , double , deriv_type > rk54_type; -typedef boost::numeric::odeint::runge_kutta_cash_karp54< state_type , double , deriv_type > rk54_generic_type; -typedef boost::numeric::odeint::runge_kutta_dopri5< state_type , double , deriv_type > dopri5_type; -typedef boost::numeric::odeint::controlled_runge_kutta< rk54_type > controlled_rk54_type; -typedef boost::numeric::odeint::controlled_runge_kutta< rk54_generic_type > controlled_rk54_generic_type; -typedef boost::numeric::odeint::controlled_runge_kutta< dopri5_type > controlled_dopri5_type; -typedef boost::numeric::odeint::dense_output_runge_kutta< euler_type > dense_output_euler_type; -typedef boost::numeric::odeint::dense_output_runge_kutta< controlled_dopri5_type > dense_output_dopri5_type; - -#define CHECK_COUNTERS( c1 , c2 , c3 , c4 , c5 , c6 ) \ - BOOST_CHECK_EQUAL( construct_count , size_t( c1 ) ); \ - BOOST_CHECK_EQUAL( construct2_count , size_t( c2 ) ); \ - BOOST_CHECK_EQUAL( destruct_count , size_t( c3 ) ); \ - BOOST_CHECK_EQUAL( destruct2_count , size_t( c4) ); \ - BOOST_CHECK_EQUAL( copy_count , size_t( c5 ) ) ; \ - BOOST_CHECK_EQUAL( copy2_count, size_t( c6 ) ) - -BOOST_AUTO_TEST_SUITE( stepper_copying ) - -/* - * Construct + Destruct - * 1 deriv_type in explicit_stepper_base - */ -BOOST_AUTO_TEST_CASE( explicit_euler_construct ) -{ - reset_counter(); - { - euler_type euler; - } - CHECK_COUNTERS( 0 , 1 , 0 , 1 , 0 , 0 ); -} - - -/* - * Construct + Destruct - * 2 * 1 deriv_type in explicit_stepper_base - * - * Copying - * 1 deriv_type in explicit_stepper_base - */ -BOOST_AUTO_TEST_CASE( explicit_euler_copy_construct ) -{ - reset_counter(); - { - euler_type euler; - euler_type euler2( euler ); - } - CHECK_COUNTERS( 0 , 1 + 1 , 0 , 1 + 1 , 0 , 1 ); -} - -/* - * Construct + Destruct - * 2 * 1 deriv_type in explicit_stepper_base - * - * Copying - * 1 deriv_type in explicit_stepper_base - */ -BOOST_AUTO_TEST_CASE( explicit_euler_assign ) -{ - reset_counter(); - { - euler_type euler; - euler_type euler2; - euler2 = euler; - } - CHECK_COUNTERS( 0 , 2 , 0 , 2 , 0 , 1 ); -} - -/* - * Construct + Destruct - * 1 deriv_type in explicit_stepper_base - * 3 deriv_type in explicit_rk4 - * 1 state_type in explicit_rk4 - */ -BOOST_AUTO_TEST_CASE( explicit_rk4_construct ) -{ - reset_counter(); - { - rk4_type rk4; - } - CHECK_COUNTERS( 1 , 4 , 1 , 4 , 0 , 0 ); -} - -/* - * Construct + Destruct - * 2 * 1 deriv_type in explicit_stepper_base - * 2 * 3 deriv_type in explicit_rk4 - * 2 * 1 state_type in explicit_rk4 - * - * Copying - * 1 deriv_type in explicit_stepper_base - * 3 deriv_type in explicit_stepper_base - * 1 state_type in explicit_stepper_base - */ -BOOST_AUTO_TEST_CASE( explicit_rk4_copy_construct ) -{ - reset_counter(); - { - rk4_type rk4; - rk4_type rk4_2( rk4 ); - } - CHECK_COUNTERS( 2 , 8 , 2 , 8 , 1 , 4 ); -} - -/* - * Construct + Destruct - * 2 * 1 deriv_type in explicit_stepper_base - * 2 * 3 deriv_type in explicit_rk4 - * 2 * 1 state_type in explicit_rk4 - * - * Copying - * 1 deriv_type in explicit_stepper_base - * 3 deriv_type in explicit_stepper_base - * 1 state_type in explicit_stepper_base - */ -BOOST_AUTO_TEST_CASE( explicit_rk4_assign ) -{ - reset_counter(); - { - rk4_type rk4; - rk4_type rk4_2; - rk4 = rk4_2; - } - CHECK_COUNTERS( 2 , 8 , 2 , 8 , 1 , 4 ); -} - - -/* - * Construct + Destruct - * 1 deriv_type in explicit_stepper_base - * 3 deriv_type in explicit_rk4 - * 1 state_type in explicit_rk4 - */ -BOOST_AUTO_TEST_CASE( explicit_rk4_generic_construct ) -{ - reset_counter(); - { - rk4_generic_type rk4; - } - CHECK_COUNTERS( 1 , 4 , 1 , 4 , 0 , 0 ); -} - -/* - * Construct + Destruct - * 2 * 1 deriv_type in explicit_stepper_base - * 2 * 3 deriv_type in explicit_rk4 - * 2 * 1 state_type in explicit_rk4 - * - * Copying - * 1 deriv_type in explicit_stepper_base - * 3 deriv_type in explicit_stepper_base - * 1 state_type in explicit_stepper_base - */ -BOOST_AUTO_TEST_CASE( explicit_rk4_generic_copy_construct ) -{ - reset_counter(); - { - rk4_generic_type rk4; - rk4_generic_type rk4_2( rk4 ); - } - CHECK_COUNTERS( 2 , 8 , 2 , 8 , 1 , 4 ); -} - -/* - * Construct + Destruct - * 2 * 1 deriv_type in explicit_stepper_base - * 2 * 3 deriv_type in explicit_rk4 - * 2 * 1 state_type in explicit_rk4 - * - * Copying - * 1 deriv_type in explicit_stepper_base - * 3 deriv_type in explicit_stepper_base - * 1 state_type in explicit_stepper_base - */ -BOOST_AUTO_TEST_CASE( explicit_rk4_generic_assign ) -{ - reset_counter(); - { - rk4_generic_type rk4; - rk4_generic_type rk4_2; - rk4 = rk4_2; - } - CHECK_COUNTERS( 2 , 8 , 2 , 8 , 1 , 4 ); -} - -/* - * Construct + Destruct - * 2 explicit_rk54_ck: - * 2 * 1 deriv_type in explicit_error_stepper_base - * 2 * 5 deriv_type in explicit_error_rk54_ck - * 2 * 1 state_type in explicit_error_rk4 - * 1 controlled_stepper: - * 1 deriv_type - * 2 state_type - * - * Copying - * 1 copy process of explicit_rk54_ck: - * 1 deriv_type from explicit_error_stepper_base - * 5 deriv_type from explicit_error_rk54_ck - * 1 state_type from explicit_error_rk54_ck - */ -BOOST_AUTO_TEST_CASE( controlled_rk54_construct ) -{ - reset_counter(); - { - controlled_rk54_type stepper; - } - CHECK_COUNTERS( 4 , 13 , 4 , 13 , 1 , 6 ); -} - - -/* - * Construct + Destruct - * 3 explicit_rk54_ck: - * 3 * 1 deriv_type in explicit_error_stepper_base - * 3 * 5 deriv_type in explicit_error_rk54_ck - * 3 * 1 state_type in explicit_error_rk4 - * 2 controlled_stepper: - * 2 * 1 deriv_type - * 2 * 2 state_type - * - * Copying - * 1 copy process of explicit_rk54_ck: - * 1 deriv_type from explicit_error_stepper_base - * 5 deriv_type from explicit_error_rk54_ck - * 1 state_type from explicit_error_rk54_ck - * - * 1 process of copying controlled_error_stepper - * 1 deriv_type from explicit_error_stepper_base - * 5 deriv_type from explicit_error_rk54_ck - * 1 state_type from explicit_error_rk54_ck - * 1 deriv_type from controlled_error_stepper - * 2 state_type from controlled_error_stepper - */ -BOOST_AUTO_TEST_CASE( controlled_rk54_copy_construct ) -{ - reset_counter(); - { - controlled_rk54_type stepper; - controlled_rk54_type stepper2( stepper ); - } - CHECK_COUNTERS( 7 , 20 , 7 , 20 , 4 , 13 ); -} - -/* - * Construct + Destruct - * 4 explicit_rk54_ck: - * 4 * 1 deriv_type in explicit_error_stepper_base - * 4 * 5 deriv_type in explicit_error_rk54_ck - * 4 * 1 state_type in explicit_error_rk4 - * 2 controlled_stepper: - * 2 * 1 deriv_type - * 2 * 2 state_type - * - * Copying - * 2 copy process of explicit_rk54_ck: - * 2 * 1 deriv_type from explicit_error_stepper_base - * 2 * 5 deriv_type from explicit_error_rk54_ck - * 2 * 1 state_type from explicit_error_rk54_ck - * - * 1 process of copying controlled_error_stepper - * 1 deriv_type from explicit_error_stepper_base - * 5 deriv_type from explicit_error_rk54_ck - * 1 state_type from explicit_error_rk54_ck - * 1 deriv_type from controlled_error_stepper - * 2 state_type from controlled_error_stepper - */ -BOOST_AUTO_TEST_CASE( controlled_rk54_assign ) -{ - reset_counter(); - { - controlled_rk54_type stepper; - controlled_rk54_type stepper2; - stepper2 = stepper; - } - CHECK_COUNTERS( 8 , 26 , 8 , 26 , 5 , 19 ); -} - - - -/* - * Construct + Destruct - * 2 explicit_rk54_ck_generic: - * 2 * 1 deriv_type in explicit_error_stepper_base - * 2 * 5 deriv_type in explicit_error_rk54_ck_generic - * 2 * 1 state_type in explicit_error_rk54_ck_generic - * 1 controlled_stepper: - * 1 deriv_type - * 2 state_type - * - * Copying - * 1 copy process of explicit_rk54_ck_generic: - * 1 deriv_type from explicit_error_stepper_base - * 5 deriv_type from explicit_error_rk54_ck_generic - * 1 state_type from explicit_error_rk54_ck_generic - */ -BOOST_AUTO_TEST_CASE( controlled_rk54_generic_construct ) -{ - reset_counter(); - { - controlled_rk54_generic_type stepper; - } - CHECK_COUNTERS( 4 , 13 , 4 , 13 , 1 , 6 ); -} - - -/* - * Construct + Destruct - * 3 explicit_rk54_ck_generic: - * 3 * 1 deriv_type in explicit_error_stepper_base - * 3 * 5 deriv_type in explicit_error_rk54_ck_generic - * 3 * 1 state_type in explicit_error_rk4_generic - * 2 controlled_stepper: - * 2 * 1 deriv_type - * 2 * 2 state_type - * - * Copying - * 1 copy process of explicit_rk54_ck_generic: - * 1 deriv_type from explicit_error_stepper_base - * 5 deriv_type from explicit_error_rk54_ck_generic - * 1 state_type from explicit_error_rk54_ck_generic - * - * 1 process of copying controlled_error_stepper - * 1 deriv_type from explicit_error_stepper_base - * 5 deriv_type from explicit_error_rk54_ck_generic - * 1 state_type from explicit_error_rk54_ck_generic - * 1 deriv_type from controlled_error_stepper - * 2 state_type from controlled_error_stepper - */ -BOOST_AUTO_TEST_CASE( controlled_rk54_generic_copy_construct ) -{ - reset_counter(); - { - controlled_rk54_generic_type stepper; - controlled_rk54_generic_type stepper2( stepper ); - } - CHECK_COUNTERS( 7 , 20 , 7 , 20 , 4 , 13 ); -} - -/* - * Construct + Destruct - * 4 explicit_rk54_ck_generic: - * 4 * 1 deriv_type in explicit_error_stepper_base - * 4 * 5 deriv_type in explicit_error_rk54_ck_generic - * 4 * 1 state_type in explicit_error_rk4_generic - * 2 controlled_stepper: - * 2 * 1 deriv_type - * 2 * 2 state_type - * - * Copying - * 2 copy process of explicit_rk54_ck_generic: - * 2 * 1 deriv_type from explicit_error_stepper_base - * 2 * 5 deriv_type from explicit_error_rk54_ck_generic - * 2 * 1 state_type from explicit_error_rk54_ck_generic - * - * 1 process of copying controlled_error_stepper - * 1 deriv_type from explicit_error_stepper_base - * 5 deriv_type from explicit_error_rk54_ck_generic - * 1 state_type from explicit_error_rk54_ck_generic - * 1 deriv_type from controlled_error_stepper - * 2 state_type from controlled_error_stepper - */ -BOOST_AUTO_TEST_CASE( controlled_rk54_generic_assign ) -{ - reset_counter(); - { - controlled_rk54_generic_type stepper; - controlled_rk54_generic_type stepper2; - stepper2 = stepper; - } - CHECK_COUNTERS( 8 , 26 , 8 , 26 , 5 , 19 ); -} - - -/* - * Construct + Destruct - * 2 explicit_error_dopri5: - * 2 * 1 deriv_type in explicit_error_stepper_base_fsal - * 2 * 6 deriv_type in explicit_error_dopri5 - * 2 * 1 state_type in explicit_error_dopri5 - * 1 controlled_error_stepper (fsal): - * 2 deriv_type - * 2 state_type - * - * Copying - * 1 copy process of explicit_dopri5: - * 1 deriv_type from explicit_error_stepper_base_fsal - * 6 deriv_type from explicit_error_dopri5 - * 1 state_type from explicit_error_dopri5 - */ - -BOOST_AUTO_TEST_CASE( controlled_dopri5_construct ) -{ - reset_counter(); - { - controlled_dopri5_type dopri5; - } - CHECK_COUNTERS( 2 * 1 + 2 , 2 * (6+1) + 2 , 2 * 1 + 2 , 2 * (6+1) + 2 , 1 , 1 + 6 ); -} - - -/* - * Construct + Destruct - * 3 explicit_error_dopri5: - * 3 * 1 deriv_type in explicit_error_stepper_base_fsal - * 3 * 6 deriv_type in explicit_error_dopri5 - * 3 * 1 state_type in explicit_error_dopri5 - * 2 controlled_error_stepper (fsal): - * 2 * 2 deriv_type - * 2 * 2 state_type - * - * Copying - * 1 copy process of explicit_error_dopri5: - * 1 deriv_type from explicit_error_stepper_base_fsal - * 6 deriv_type from explicit_error_error_dopri5 - * 1 state_type from explicit_error_error_dopri5 - * - * 1 process of copying controlled_error_stepper - * 1 deriv_type from explicit_error_stepper_base_fsal - * 6 deriv_type from explicit_error_dopri5 - * 1 state_type from explicit_error_dopri5 - * 2 deriv_type from controlled_error_stepper (fsal) - * 2 state_type from controlled_error_stepper (fsal) - */ -BOOST_AUTO_TEST_CASE( controlled_dopri5_copy_construct ) -{ - reset_counter(); - { - controlled_dopri5_type dopri5; - controlled_dopri5_type dopri5_2( dopri5 ); - } - CHECK_COUNTERS( 3 * 1 + 2 * 2 , 3 * (6+1) + 2 * 2 , 3 * 1 + 2 * 2 , 3 * (6+1) + 2 * 2 , 1 + 1 + 2 , 1 + 6 + 1 + 6 + 2 ); -} - -/* - * Construct + Destruct - * 4 explicit_error_dopri5: - * 4 * 1 deriv_type in explicit_error_stepper_base_fsal - * 4 * 6 deriv_type in explicit_error_dopri5 - * 4 * 1 state_type in explicit_error_dopri5 - * 2 controlled_error_stepper (fsal): - * 2 * 2 deriv_type - * 2 * 2 state_type - * - * Copying - * 2 copy process of explicit_error_dopri5: - * 2 * 1 deriv_type from explicit_error_stepper_base_fsal - * 2 * 6 deriv_type from explicit_error_dopri5 - * 2 * 1 state_type from explicit_error_dopri5 - * - * 1 process of copying controlled_error_stepper - * 1 deriv_type from explicit_error_stepper_base - * 6 deriv_type from explicit_error_dopri5 - * 1 state_type from explicit_error_dopri5 - * 2 deriv_type from controlled_error_stepper (fsal) - * 2 state_type from controlled_error_stepper (fsal) - */ -BOOST_AUTO_TEST_CASE( controlled_dopri5_assign ) -{ - reset_counter(); - { - controlled_dopri5_type dopri5; - controlled_dopri5_type dopri5_2; - dopri5_2 = dopri5; - } - CHECK_COUNTERS( 4 * 1 + 2 * 2 , 4 * (1+6) + 2 * 2 , 4 * 1 + 2 * 2 , 4 * (1+6) + 2 * 2 , 2 * 1 + 1 + 2 , 2 * (6+1) + 1 + 6 + 2 ); -} - - -/* - * Construct + Destruct - * 2 explicit_euler: - * 2 * 1 deriv_type in explicit_stepper_base - * 1 dense_output_explicit: - * 2 state_type - * - * Copying - * 1 copy process of explicit_euler: - * 1 deriv_type from explicit_stepper_base - */ -BOOST_AUTO_TEST_CASE( dense_output_euler_construct ) -{ - reset_counter(); - { - dense_output_euler_type euler; - } - CHECK_COUNTERS( 2 , 2 * 1 , 2 , 2 * 1 , 0 , 1 ); -} - -/* - * Construct + Destruct - * 3 explicit_euler: - * 3 * 1 deriv_type in explicit_stepper_base - * 2 dense_output_explicit: - * 2 * 2 state_type - * - * Copying - * 1 copy process of explicit_euler: - * 1 deriv_type from explicit_stepper_base - * - * 1 process of copying - * 1 deriv_type from explicit_stepper_base - * 2 state_type from dense_output_explicit - */ -BOOST_AUTO_TEST_CASE( dense_output_euler_copy_construct ) -{ - reset_counter(); - { - dense_output_euler_type euler; - dense_output_euler_type euler2( euler ); - } - CHECK_COUNTERS( 2 * 2 , 3 * 1 , 2 * 2 , 3 * 1 , 2 , 1 + 1 ); -} - -/* - * Construct + Destruct - * 4 explicit_euler: - * 4 * 1 deriv_type in explicit_stepper_base - * 2 dense_output_explicit: - * 2 * 2 state_type - * - * Copying - * 2 copy process of explicit_euler: - * 2 * 1 deriv_type from explicit_stepper_base - * - * 1 process of copying dense_ouput_explicit - * 1 deriv_type from explicit_stepper_base - * 2 state_type from dense_output_explicit - */ -BOOST_AUTO_TEST_CASE( dense_output_euler_assign ) -{ - reset_counter(); - { - dense_output_euler_type euler; - dense_output_euler_type euler2; - euler2 = euler; - } - CHECK_COUNTERS( 2 * 2 , 4 * 1 , 2 * 2 , 4 * 1 , 2 , 2 * 1 + 1 ); -} - -/* - * Construct + Destruct - * 3 dense_output_dopri5: - * 3 * 1 deriv_type in explicit_error_stepper_base_fsal - * 3 * 6 deriv_type in explicit_error_dopri5 - * 3 * 1 state_type in explicit_error_dopri5 - * 2 controlled_error_stepper (fsal): - * 2 * 2 state_type - * 2 * 2 deriv_type - * 1 dense_output_controlled_explicit: - * 2 state_type - * 2 deriv_type - * - * Copying - * 2 copy process of explicit_error_dopri5: - * 2 * 1 deriv_type from explicit_erro_stepper_base_fsal - * 2 * 6 deriv_type in explicit_error_dopri5 - * 2 * 1 state_type in explicit_error_dopri5 - * 1 copy process of dense_output_controlled (fsal) - * 2 state_type - * 2 deriv_type - */ -BOOST_AUTO_TEST_CASE( dense_output_dopri5_construct ) -{ - reset_counter(); - { - dense_output_dopri5_type dopri5; - } - CHECK_COUNTERS( 3*1 + 2*2 + 2 , 3*(1+6) + 2*2 + 2 , 3*1 + 2*2 + 2 , 3*(1+6) + 2*2 + 2 , 2*1 + 2 , 2*(1+6) + 2 ); -} - -/* - * Construct + Destruct - * 4 dense_output_dopri5: - * 4 * 1 deriv_type in explicit_error_stepper_base_fsal - * 4 * 5 deriv_type in explicit_error_dopri5 - * 4 * 1 state_type in explicit_error_dopri5 - * 3 controlled_error_stepper (fsal): - * 3 * 2 state_type - * 3 * 2 deriv_type - * 2 dense_output_controlled_explicit: - * 2 * 2 state_type - * 2 * 2 deriv_type - * - * Copying - * 3 copy process of explicit_error_dopri5: - * 3 * 1 deriv_type from explicit_erro_stepper_base_fsal - * 3 * 6 deriv_type in explicit_error_dopri5 - * 3 * 1 state_type in explicit_error_dopri5 - * 2 copy process of controlled_error_stepper (fsal): - * 2 * 2 state_type - * 2 * 2 deriv_type - * 1 copy process of dense_output_controlled_explicit: - * 2 state_type - * 2 deriv_type - */ -BOOST_AUTO_TEST_CASE( dense_output_dopri5_copy_construct ) -{ - reset_counter(); - { - dense_output_dopri5_type dopri5; - dense_output_dopri5_type dopri5_2( dopri5 ); - } - CHECK_COUNTERS( 4*1 + 3*2 + 2*2 , 4*(1+6) + 3*2 + 2*2 , 4*1 + 3*2 + 2*2 , 4*(1+6) + 3*2 + 2*2 , 3*1 + 2*2 + 1*2 , 3*(6+1) + 2*2 + 2 ); -} - -/* - * Construct + Destruct - * 6 dense_output_dopri5: - * 6 * 1 deriv_type in explicit_error_stepper_base_fsal - * 6 * 6 deriv_type in explicit_error_dopri5 - * 6 * 1 state_type in explicit_error_dopri5 - * 4 controlled_error_stepper (fsal): - * 4 * 2 state_type - * 4 * 2 deriv_type - * 2 dense_output_controlled_explicit: - * 2 * 2 state_type - * 2 * 2 deriv_type - * - * Copying - * 5 copy process of explicit_error_dopri5: - * 5 * 1 deriv_type from explicit_erro_stepper_base_fsal - * 5 * 6 deriv_type in explicit_error_dopri5 - * 5 * 1 state_type in explicit_error_dopri5 - * 3 copy process of controlled_error_stepper (fsal): - * 3 * 2 state_type - * 3 * 2 deriv_type - * 1 copy process of dense_output_controlled_explicit: - * 2 state_type - * 2 deriv_type - */ -BOOST_AUTO_TEST_CASE( dense_output_dopri5_assign ) -{ - reset_counter(); - { - dense_output_dopri5_type dopri5; - dense_output_dopri5_type dopri5_2; - dopri5_2 = dopri5; - } - CHECK_COUNTERS( 6*1 + 4*2 + 2*2 , 6*(6+1) + 4*2 + 2*2 , 6*1 + 4*2 + 2*2 , 6*(6+1) + 4*2 + 2*2 , 5*1 + 3*2 + 2 , 5*(6+1) + 3*2 + 2 ); -} - - -BOOST_AUTO_TEST_SUITE_END() - diff --git a/libs/numeric/odeint/test/stepper_with_ranges.cpp b/libs/numeric/odeint/test/stepper_with_ranges.cpp deleted file mode 100644 index 59f007f2d..000000000 --- a/libs/numeric/odeint/test/stepper_with_ranges.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/stepper_with_ranges.cpp - - [begin_description] - This file tests if the steppers play well with Boost.Range. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2013 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) - */ - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_stepper_with_ranges - -#include - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -typedef std::vector< double > state_type; -typedef boost::array< double , 3 > state_type2; - -/* explicitly force range algebra for this array! */ -namespace boost { namespace numeric { namespace odeint { - -template<> -struct algebra_dispatcher< state_type2 > -{ typedef range_algebra algebra_type; }; - -} } } - - -/* - * The two systems are needed, since for steppers with more than - * one internal step it is difficult to calculate the exact result - * - * system1 is suited for euler - */ -struct system1 -{ - template< class State , class Deriv > - void operator()( const State &x_ , Deriv &dxdt_ , double t ) - { - typename boost::range_iterator< const State >::type x = boost::begin( x_ ); - typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ ); - - dxdt[0] = x[0]; - dxdt[1] = 2.0; - dxdt[2] = 3.0; - } - - template< class State , class Deriv > - void operator()( const State &x_ , const Deriv &dxdt_ , double t ) - { - typename boost::range_iterator< const State >::type x = boost::begin( x_ ); - typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ ); - - dxdt[0] = x[0]; - dxdt[1] = 2.0; - dxdt[2] = 3.0; - } -}; - -/* - * system2 is suited for all steppers, it allows you to calculate the result analytically. - */ -struct system2 -{ - template< class State , class Deriv > - void operator()( const State &x_ , Deriv &dxdt_ , double t ) - { - typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ ); - - dxdt[0] = 1.0; - dxdt[1] = 2.0; - dxdt[2] = 3.0; - } - - template< class State , class Deriv > - void operator()( const State &x_ , const Deriv &dxdt_ , double t ) - { - typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ ); - - dxdt[0] = 1.0; - dxdt[1] = 2.0; - dxdt[2] = 3.0; - } -}; - - -/* - * Useful for Hamiltonian systems - */ -struct ham_sys -{ - template< class State , class Deriv > - void operator()( const State &x_ , Deriv &dxdt_ ) - { - typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ ); - dxdt[0] = 1.0; - dxdt[1] = 2.0; - dxdt[2] = 3.0; - } - - template< class State , class Deriv > - void operator()( const State &x_ , const Deriv &dxdt_ ) - { - typename boost::range_iterator< Deriv >::type dxdt = boost::begin( dxdt_ ); - dxdt[0] = 1.0; - dxdt[1] = 2.0; - dxdt[2] = 3.0; - } -}; - - -struct vector_fixture -{ - const static size_t dim = 6; - boost::array< double , dim > in; - boost::array< double , dim > q; - boost::array< double , dim > p; - state_type err; - - vector_fixture( void ) - : in() , err( 3 ) - { - for( size_t i=0 ; i euler; - euler.do_step( system1() , std::make_pair( f.in.begin() + 1 , f.in.begin() + 4 ) , 0.1 , 0.1 ); - CHECK_VALUES( f.in , 0.0 , 1.1 , 2.2 , 3.3 , 4.0 , 5.0 ); -} - - - -BOOST_AUTO_TEST_CASE( explicit_error_k54_with_range_v1 ) -{ - vector_fixture f; - boost::numeric::odeint::runge_kutta_cash_karp54_classic< state_type > rk54; - rk54.do_step( system2() , std::make_pair( f.in.begin() + 1 , f.in.begin() + 4 ) , 0.1 , 0.1 ); - CHECK_VALUES( f.in , 0.0 , 1.1 , 2.2 , 3.3 , 4.0 , 5.0 ); -} - -BOOST_AUTO_TEST_CASE( explicit_error_k54_with_range_v5 ) -{ - vector_fixture f; - boost::numeric::odeint::runge_kutta_cash_karp54_classic< state_type > rk54; - rk54.do_step( system2() , std::make_pair( f.in.begin() + 1 , f.in.begin() + 4 ) , 0.1 , 0.1 , f.err ); - CHECK_VALUES( f.in , 0.0 , 1.1 , 2.2 , 3.3 , 4.0 , 5.0 ); -} - - -BOOST_AUTO_TEST_CASE( runge_kutta_dopri5_with_range_v1 ) -{ - vector_fixture f; - boost::numeric::odeint::runge_kutta_dopri5< state_type > dopri5; - dopri5.do_step( system2() , std::make_pair( f.in.begin() + 1 , f.in.begin() + 4 ) , 0.1 , 0.1 ); - CHECK_VALUES( f.in , 0.0 , 1.1 , 2.2 , 3.3 , 4.0 , 5.0 ); -} - - -BOOST_AUTO_TEST_CASE( runge_kutta_dopri5_with_range_v5 ) -{ - vector_fixture f; - boost::numeric::odeint::runge_kutta_dopri5< state_type > dopri5; - dopri5.do_step( system2() , std::make_pair( f.in.begin() + 1 , f.in.begin() + 4 ) , 0.1 , 0.1 , f.err ); - CHECK_VALUES( f.in , 0.0 , 1.1 , 2.2 , 3.3 , 4.0 , 5.0 ); -} - - -BOOST_AUTO_TEST_CASE( controlled_error_stepper_rk54 ) -{ - double t = 0.0 , dt = 0.1; - vector_fixture f; - boost::numeric::odeint::controlled_runge_kutta< boost::numeric::odeint::runge_kutta_cash_karp54_classic< state_type > > stepper; - stepper.try_step( system2() , std::make_pair( f.in.begin() + 1 , f.in.begin() + 4 ) , t , dt ); - CHECK_VALUES( f.in , 0.0 , 1.1 , 2.2 , 3.3 , 4.0 , 5.0 ); -} - -BOOST_AUTO_TEST_CASE( controlled_error_stepper_dopri5 ) -{ - double t = 0.0 , dt = 0.1; - vector_fixture f; - boost::numeric::odeint::controlled_runge_kutta< boost::numeric::odeint::runge_kutta_dopri5< state_type > > stepper; - stepper.try_step( system2() , std::make_pair( f.in.begin() + 1 , f.in.begin() + 4 ) , t , dt ); - CHECK_VALUES( f.in , 0.0 , 1.1 , 2.2 , 3.3 , 4.0 , 5.0 ); -} - - -BOOST_AUTO_TEST_CASE( symplectic_euler_coor_func ) -{ - vector_fixture f; - boost::numeric::odeint::symplectic_euler< state_type > euler; - euler.do_step( ham_sys() , - std::make_pair( f.q.begin() + 1 , f.q.begin() + 4 ) , - std::make_pair( f.p.begin() + 3 , f.p.begin() + 6 ) , - 0.0 , 0.1 ); - CHECK_VALUES( f.q , 0.0 , 1.3 , 2.4 , 3.5 , 4.0 , 5.0 ); - CHECK_VALUES( f.p , 0.0 , 1.0 , 2.0 , 3.1 , 4.2 , 5.3 ); -} - -BOOST_AUTO_TEST_CASE( symplectic_euler_coor_and_mom_func ) -{ - vector_fixture f; - boost::numeric::odeint::symplectic_euler< state_type > euler; - euler.do_step( std::make_pair( ham_sys() , ham_sys() ) , - std::make_pair( f.q.begin() + 1 , f.q.begin() + 4 ) , - std::make_pair( f.p.begin() + 3 , f.p.begin() + 6 ) , - 0.0 , 0.1 ); - CHECK_VALUES( f.q , 0.0 , 1.1 , 2.2 , 3.3 , 4.0 , 5.0 ); - CHECK_VALUES( f.p , 0.0 , 1.0 , 2.0 , 3.1 , 4.2 , 5.3 ); -} - - -BOOST_AUTO_TEST_CASE( dense_output_euler_with_ranges ) -{ - using namespace boost::numeric::odeint; - vector_fixture f; - dense_output_runge_kutta< euler< state_type > > stepper; - stepper.initialize( std::make_pair( f.in.begin() + 1, f.in.begin() + 4 ) , 0.0 , 0.1 ); - stepper.do_step( system1() ); - stepper.calc_state( 0.05 , std::make_pair( f.in.begin() + 1 ,f.in.begin() +4 ) ); - CHECK_VALUES( f.in , 0.0 , 1.05 , 2.1 , 3.15 , 4.0 , 5.0 ); -} - -BOOST_AUTO_TEST_CASE( dense_output_dopri5_with_ranges ) -{ - using namespace boost::numeric::odeint; - vector_fixture f; - dense_output_runge_kutta< - controlled_runge_kutta< - runge_kutta_dopri5< state_type > - > > stepper; - stepper.initialize( std::make_pair( f.in.begin() + 1, f.in.begin() + 4 ) , 0.0 , 0.1 ); - stepper.do_step( system2() ); - stepper.calc_state( 0.05 , std::make_pair( f.in.begin() + 1 ,f.in.begin() +4 ) ); - CHECK_VALUES( f.in , 0.0 , 1.05 , 2.1 , 3.15 , 4.0 , 5.0 ); -} - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/stepper_with_units.cpp b/libs/numeric/odeint/test/stepper_with_units.cpp deleted file mode 100644 index 3e3a64508..000000000 --- a/libs/numeric/odeint/test/stepper_with_units.cpp +++ /dev/null @@ -1,328 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/stepper_with_units.cpp - - [begin_description] - This file tests if the steppers play well with Boost.Units. - [end_description] - - Copyright 2011-2012 Karsten Ahnert - Copyright 2011-2013 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) - */ - -#define BOOST_TEST_MODULE odeint_stepper_with_units - -// the runge-kutta 78 stepper invoked with boost units requires increased fusion macro variables! -// note that by default the rk78 + units test case is disabled as it requires enormous memory when compiling (5 GB) -#define BOOST_FUSION_INVOKE_MAX_ARITY 15 -#define BOOST_RESULT_OF_NUM_ARGS 15 - - -#include - -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -using namespace boost::numeric::odeint; -using namespace boost::unit_test; -namespace mpl = boost::mpl; -namespace fusion = boost::fusion; -namespace units = boost::units; -namespace si = boost::units::si; - -typedef double value_type; -typedef units::quantity< si::time , value_type > time_type; -typedef units::quantity< si::length , value_type > length_type; -typedef units::quantity< si::velocity , value_type > velocity_type; -typedef units::quantity< si::acceleration , value_type > acceleration_type; -typedef fusion::vector< length_type , velocity_type > state_type; -typedef fusion::vector< velocity_type , acceleration_type > deriv_type; - -void oscillator( const state_type &x , deriv_type &dxdt , time_type t ) -{ - const units::quantity< si::frequency , value_type > omega = 1.0 * si::hertz; - fusion::at_c< 0 >( dxdt ) = fusion::at_c< 1 >( x ); - fusion::at_c< 1 >( dxdt ) = - omega * omega * fusion::at_c< 0 >( x ); -} - -template< class Stepper > -void check_stepper( Stepper &stepper ) -{ - typedef Stepper stepper_type; - 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; - typedef typename stepper_type::order_type order_type; - typedef typename stepper_type::algebra_type algebra_type; - typedef typename stepper_type::operations_type operations_type; - - const time_type t( 0.0 * si::second ); - time_type dt( 0.1 * si::second ); - state_type x( 1.0 * si::meter , 0.0 * si::meter_per_second ); - - // test call method one - stepper.do_step( oscillator , x , t , dt ); - - // test call method two - stepper.do_step( oscillator , x , t , x , dt ); - - // test call method three - deriv_type dxdt; - oscillator( x , dxdt , t ); - stepper.do_step( oscillator , x , dxdt , t , dt ); - - // test call method four - oscillator( x , dxdt , t ); - stepper.do_step( oscillator , x , dxdt , t , x , dt ); -} - -template< class Stepper > -void check_fsal_stepper( Stepper &stepper ) -{ - typedef Stepper stepper_type; - 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; - typedef typename stepper_type::order_type order_type; - typedef typename stepper_type::algebra_type algebra_type; - typedef typename stepper_type::operations_type operations_type; - - const time_type t( 0.0 * si::second ); - time_type dt( 0.1 * si::second ); - state_type x( 1.0 * si::meter , 0.0 * si::meter_per_second ); - - // test call method one - stepper.do_step( oscillator , x , t , dt ); - - // test call method two - stepper.do_step( oscillator , x , t , x , dt ); - - // test call method three - deriv_type dxdt; - oscillator( x , dxdt , t ); - stepper.do_step( oscillator , x , dxdt , t , dt ); - - // test call method four - stepper.do_step( oscillator , x , dxdt , t , x , dxdt , dt ); -} - -template< class Stepper > -void check_error_stepper( Stepper &stepper ) -{ - typedef Stepper stepper_type; - 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; - typedef typename stepper_type::order_type order_type; - typedef typename stepper_type::algebra_type algebra_type; - typedef typename stepper_type::operations_type operations_type; - - const time_type t( 0.0 * si::second ); - time_type dt( 0.1 * si::second ); - state_type x( 1.0 * si::meter , 0.0 * si::meter_per_second ) , xerr; - - // test call method one - stepper.do_step( oscillator , x , t , dt , xerr ); - - // test call method two - stepper.do_step( oscillator , x , t , x , dt , xerr ); - - // test call method three - deriv_type dxdt; - oscillator( x , dxdt , t ); - stepper.do_step( oscillator , x , dxdt , t , dt , xerr ); - - // test call method four - stepper.do_step( oscillator , x , dxdt , t , x , dt , xerr ); -} - -template< class Stepper > -void check_fsal_error_stepper( Stepper &stepper ) -{ - typedef Stepper stepper_type; - 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; - typedef typename stepper_type::order_type order_type; - typedef typename stepper_type::algebra_type algebra_type; - typedef typename stepper_type::operations_type operations_type; - - const time_type t( 0.0 * si::second ); - time_type dt( 0.1 * si::second ); - state_type x( 1.0 * si::meter , 0.0 * si::meter_per_second ) , xerr; - - // test call method one - stepper.do_step( oscillator , x , t , dt , xerr ); - - // test call method two - stepper.do_step( oscillator , x , t , x , dt , xerr ); - - // test call method three - deriv_type dxdt; - oscillator( x , dxdt , t ); - stepper.do_step( oscillator , x , dxdt , t , dt , xerr ); - - // test call method four - stepper.do_step( oscillator , x , dxdt , t , x , dxdt , dt , xerr ); -} - -template< class Stepper > -void check_controlled_stepper( Stepper &stepper ) -{ - typedef Stepper stepper_type; - 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; - - time_type t( 0.0 * si::second ); - time_type dt( 0.1 * si::second ); - state_type x( 1.0 * si::meter , 0.0 * si::meter_per_second ); - - // test call method one - stepper.try_step( oscillator , x , t , dt ); -} - - -template< class Stepper > -void check_dense_output_stepper( Stepper &stepper ) -{ - typedef Stepper stepper_type; - 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; -// typedef typename stepper_type::order_type order_type; - - time_type t( 0.0 * si::second ); - time_type dt( 0.1 * si::second ); - state_type x( 1.0 * si::meter , 0.0 * si::meter_per_second ) , x2; - - stepper.initialize( x , t , dt ); - stepper.do_step( oscillator ); - stepper.calc_state( dt / 2.0 , x2 ); -} - - - - - - -class stepper_types : public mpl::vector -< - euler< state_type , value_type , deriv_type , time_type >, - runge_kutta4< state_type , value_type , deriv_type , time_type > , - runge_kutta4_classic< state_type , value_type , deriv_type , time_type > , - runge_kutta_cash_karp54< state_type , value_type , deriv_type , time_type >, - runge_kutta_cash_karp54_classic< state_type , value_type , deriv_type , time_type > - // don't run rk78 test - gcc requires > 5GB RAM to compile this - //, runge_kutta_fehlberg78< state_type , value_type , deriv_type , time_type > - > { }; - -class fsal_stepper_types : public mpl::vector -< - runge_kutta_dopri5< state_type , value_type , deriv_type , time_type > - > { }; - -class error_stepper_types : public mpl::vector -< - runge_kutta_cash_karp54_classic< state_type , value_type , deriv_type , time_type > - //, runge_kutta_fehlberg78< state_type , value_type , deriv_type , time_type > - > { }; - -class fsal_error_stepper_types : public mpl::vector -< - runge_kutta_dopri5< state_type , value_type , deriv_type , time_type > - > { }; - -class controlled_stepper_types : public mpl::vector -< - controlled_runge_kutta< runge_kutta_cash_karp54_classic< state_type , value_type , deriv_type , time_type > > , - controlled_runge_kutta< runge_kutta_dopri5< state_type , value_type , deriv_type , time_type > > - , bulirsch_stoer< state_type , value_type , deriv_type , time_type > - // rk78 with units needs up to 3GB memory to compile - disable testing... - //, controlled_runge_kutta< runge_kutta_fehlberg78< state_type , value_type , deriv_type , time_type > > - > { }; - -class dense_output_stepper_types : public mpl::vector -< - dense_output_runge_kutta< euler< state_type , value_type , deriv_type , time_type > > , - dense_output_runge_kutta< - controlled_runge_kutta< runge_kutta_dopri5< state_type , value_type , deriv_type , time_type > > > - //, bulirsch_stoer_dense_out< state_type , value_type , deriv_type , time_type > - > { }; - - - - -BOOST_AUTO_TEST_SUITE( stepper_with_units ) - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_test , Stepper , stepper_types ) -{ - Stepper stepper; - check_stepper( stepper ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( fsl_stepper_test , Stepper , fsal_stepper_types ) -{ - Stepper stepper; - check_fsal_stepper( stepper ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( error_stepper_test , Stepper , error_stepper_types ) -{ - Stepper stepper; - check_error_stepper( stepper ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( fsal_error_stepper_test , Stepper , fsal_error_stepper_types ) -{ - Stepper stepper; - check_fsal_error_stepper( stepper ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( controlled_stepper_test , Stepper , controlled_stepper_types ) -{ - Stepper stepper; - check_controlled_stepper( stepper ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( dense_ouput_test , Stepper , dense_output_stepper_types ) -{ - Stepper stepper; - check_dense_output_stepper( stepper ); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/symplectic_steppers.cpp b/libs/numeric/odeint/test/symplectic_steppers.cpp deleted file mode 100644 index 498983bdd..000000000 --- a/libs/numeric/odeint/test/symplectic_steppers.cpp +++ /dev/null @@ -1,391 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/symplectic_steppers.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2012 Karsten Ahnert - Copyright 2013 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) - */ - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_symplectic_steppers - -#define BOOST_FUSION_INVOKE_MAX_ARITY 15 -#define BOOST_RESULT_OF_NUM_ARGS 15 -#define FUSION_MAX_VECTOR_SIZE 15 - - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "diagnostic_state_type.hpp" -#include "const_range.hpp" -#include "dummy_odes.hpp" -#include "boost_units_helpers.hpp" - - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; -namespace mpl = boost::mpl; -namespace fusion = boost::fusion; - -class custom_range_algebra : public range_algebra { }; -class custom_default_operations : public default_operations { }; - - -template< class Coor , class Mom , class Value , class CoorDeriv , class MomDeriv , class Time , - class Algebra , class Operations , class Resizer > -class complete_steppers : public mpl::vector< - symplectic_euler< Coor , Mom , Value , CoorDeriv , MomDeriv , Time , - Algebra , Operations , Resizer > - , symplectic_rkn_sb3a_mclachlan< Coor , Mom , Value , CoorDeriv , MomDeriv , Time , - Algebra , Operations , Resizer > - , symplectic_rkn_sb3a_m4_mclachlan< Coor , Mom , Value , CoorDeriv , MomDeriv , Time , - Algebra , Operations , Resizer > - > {}; - -template< class Resizer > -class vector_steppers : public complete_steppers< - diagnostic_state_type , diagnostic_state_type2 , double , - diagnostic_deriv_type , diagnostic_deriv_type2 , double , - custom_range_algebra , custom_default_operations , Resizer - > { }; - - -typedef mpl::vector< initially_resizer , always_resizer , never_resizer > resizers; -typedef mpl::vector_c< int , 1 , 3 , 0 > resizer_multiplicities ; - - -typedef mpl::copy< - resizers , - mpl::inserter< - mpl::vector0<> , - mpl::insert_range< - mpl::_1 , - mpl::end< mpl::_1 > , - vector_steppers< mpl::_2 > - > - > - >::type all_stepper_methods; - - -typedef mpl::size< vector_steppers< initially_resizer > >::type num_steppers; -typedef mpl::copy< - resizer_multiplicities , - mpl::inserter< - mpl::vector0<> , - mpl::insert_range< - mpl::_1 , - mpl::end< mpl::_1 > , - const_range< num_steppers , mpl::_2 > - > - > - >::type all_multiplicities; - - - - - - - -BOOST_AUTO_TEST_SUITE( symplectic_steppers_test ) - - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_assoc_types , Stepper , vector_steppers< initially_resizer > ) -{ - BOOST_STATIC_ASSERT_MSG( - ( boost::is_same< typename Stepper::coor_type , diagnostic_state_type >::value ) , - "Coordinate type" ); - BOOST_STATIC_ASSERT_MSG( - ( boost::is_same< typename Stepper::momentum_type , diagnostic_state_type2 >::value ) , - "Momentum type" ); - BOOST_STATIC_ASSERT_MSG( - ( boost::is_same< typename Stepper::coor_deriv_type , diagnostic_deriv_type >::value ) , - "Coordinate deriv type" ); - BOOST_STATIC_ASSERT_MSG( - ( boost::is_same< typename Stepper::momentum_deriv_type , diagnostic_deriv_type2 >::value ) , - "Momentum deriv type" ); - - BOOST_STATIC_ASSERT_MSG( - ( boost::is_same< typename Stepper::state_type , std::pair< diagnostic_state_type , diagnostic_state_type2 > >::value ) , - "State type" ); - BOOST_STATIC_ASSERT_MSG( - ( boost::is_same< typename Stepper::deriv_type , std::pair< diagnostic_deriv_type , diagnostic_deriv_type2 > >::value ) , - "Deriv type" ); - - BOOST_STATIC_ASSERT_MSG( ( boost::is_same< typename Stepper::value_type , double >::value ) , "Value type" ); - BOOST_STATIC_ASSERT_MSG( ( boost::is_same< typename Stepper::time_type , double >::value ) , "Time type" ); - BOOST_STATIC_ASSERT_MSG( ( boost::is_same< typename Stepper::algebra_type , custom_range_algebra >::value ) , "Algebra type" ); - BOOST_STATIC_ASSERT_MSG( ( boost::is_same< typename Stepper::operations_type , custom_default_operations >::value ) , "Operations type" ); - - BOOST_STATIC_ASSERT_MSG( ( boost::is_same< typename Stepper::resizer_type , initially_resizer >::value ) , "Resizer type" ); - BOOST_STATIC_ASSERT_MSG( ( boost::is_same< typename Stepper::stepper_category , stepper_tag >::value ) , "Stepper category" ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_adjust_size , Stepper , vector_steppers< initially_resizer > ) -{ - counter_state::init_counter(); - counter_deriv::init_counter(); - counter_state2::init_counter(); - counter_deriv2::init_counter(); - - { - Stepper stepper; - diagnostic_state_type x; - stepper.adjust_size( x ); - } - - TEST_COUNTERS( counter_state , 0 , 0 , 0 , 0 ); - TEST_COUNTERS( counter_state2 , 0 , 0 , 0 , 0 ); - TEST_COUNTERS( counter_deriv , 1 , 1 , 0 , 1 ); - TEST_COUNTERS( counter_deriv2 , 1 , 1 , 0 , 1 ); -} - - -typedef mpl::zip_view< mpl::vector< all_stepper_methods , all_multiplicities > >::type zipped_steppers; -BOOST_AUTO_TEST_CASE_TEMPLATE( test_resizing , Stepper , zipped_steppers ) -{ - typedef typename mpl::at_c< Stepper , 0 >::type stepper_type; - const size_t multiplicity = mpl::at_c< Stepper , 1 >::type::value; - - counter_state::init_counter(); - counter_deriv::init_counter(); - counter_state2::init_counter(); - counter_deriv2::init_counter(); - - { - stepper_type stepper; - std::pair< diagnostic_state_type , diagnostic_state_type2 > x; - stepper.do_step( constant_mom_func() , x , 0.0 , 0.1 ); - stepper.do_step( constant_mom_func() , x , 0.0 , 0.1 ); - stepper.do_step( constant_mom_func() , x , 0.0 , 0.1 ); - } - - TEST_COUNTERS( counter_state , 0 , 0 , 0 , 0 ); - TEST_COUNTERS( counter_state2 , 0 , 0 , 0 , 0 ); - // dqdt is not needed when called with mom func only, so no resizing - // TEST_COUNTERS( counter_deriv , multiplicity , 1 , 0 , 1 ); - TEST_COUNTERS( counter_deriv2 , multiplicity , 1 , 0 , 1 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_copying1 , Stepper , vector_steppers< initially_resizer > ) -{ - counter_state::init_counter(); - counter_deriv::init_counter(); - counter_state2::init_counter(); - counter_deriv2::init_counter(); - - { - Stepper stepper; - Stepper stepper2( stepper ); - } - - TEST_COUNTERS( counter_state , 0 , 0 , 0 , 0 ); - TEST_COUNTERS( counter_state2 , 0 , 0 , 0 , 0 ); - TEST_COUNTERS( counter_deriv , 0 , 2 , 1 , 2 ); - TEST_COUNTERS( counter_deriv2 , 0 , 2 , 1 , 2 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_copying2 , Stepper , vector_steppers< initially_resizer > ) -{ - counter_state::init_counter(); - counter_deriv::init_counter(); - counter_state2::init_counter(); - counter_deriv2::init_counter(); - - { - Stepper stepper; - std::pair< diagnostic_state_type , diagnostic_state_type2 > x; - stepper.do_step( constant_mom_func() , x , 0.0 , 0.1 ); - Stepper stepper2( stepper ); - } - - TEST_COUNTERS( counter_state , 0 , 0 , 0 , 0 ); - TEST_COUNTERS( counter_state2 , 0 , 0 , 0 , 0 ); - // dqdt is not needed when called with mom func only, so no resizing - //TEST_COUNTERS( counter_deriv , 1 , 2 , 1 , 2 ); - TEST_COUNTERS( counter_deriv2 , 1 , 2 , 1 , 2 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_do_step_v1 , Stepper , vector_steppers< initially_resizer > ) -{ - Stepper s; - std::pair< diagnostic_state_type , diagnostic_state_type2 > x1 , x2 , x3 , x4; - x1.first[0] = 1.0; - x1.second[0] = 2.0; - x2 = x3 = x4 = x1; - diagnostic_state_type x5_coor , x5_mom; - x5_coor[0] = x1.first[0]; - x5_mom[0] = x1.second[0]; - - s.do_step( constant_mom_func() , x1 , 0.0 , 0.1 ); - - s.do_step( std::make_pair( default_coor_func() , constant_mom_func() ) , x2 , 0.0 , 0.1 ); - - default_coor_func cf; - constant_mom_func mf; - s.do_step( std::make_pair( boost::ref( cf ) , boost::ref( mf ) ) , x3 , 0.0 , 0.1 ); - - std::pair< default_coor_func , constant_mom_func > pf; - s.do_step( boost::ref( pf ) , x4 , 0.0 , 0.1 ); - - s.do_step( constant_mom_func() , std::make_pair( boost::ref( x5_coor ) , boost::ref( x5_mom ) ) , 0.0 , 0.1 ); - - // checking for absolute values is not possible here, since the steppers are to different - BOOST_CHECK_CLOSE( x1.first[0] , x2.first[0] , 1.0e-14 ); - BOOST_CHECK_CLOSE( x2.first[0] , x3.first[0] , 1.0e-14 ); - BOOST_CHECK_CLOSE( x3.first[0] , x4.first[0] , 1.0e-14 ); - BOOST_CHECK_CLOSE( x4.first[0] , x5_coor[0] , 1.0e-14 ); - - BOOST_CHECK_CLOSE( x1.second[0] , x2.second[0] , 1.0e-14 ); - BOOST_CHECK_CLOSE( x2.second[0] , x3.second[0] , 1.0e-14 ); - BOOST_CHECK_CLOSE( x3.second[0] , x4.second[0] , 1.0e-14 ); - BOOST_CHECK_CLOSE( x4.second[0] , x5_mom[0] , 1.0e-14 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_do_step_range , Stepper , vector_steppers< initially_resizer > ) -{ - Stepper s; - diagnostic_state_type q , p ; - q[0] = 1.0; - p[0] = 2.0; - - std::vector< double > x; - x.push_back( 1.0 ); - x.push_back( 2.0 ); - s.do_step( constant_mom_func() , - std::make_pair( x.begin() , x.begin() + 1 ) , - std::make_pair( x.begin() + 1 , x.begin() + 2 ) , - 0.0 , 0.1 ); - - s.do_step( constant_mom_func() , q , p , 0.0 , 0.1 ); - - BOOST_CHECK_CLOSE( q[0] , x[0] , 1.0e-14 ); - BOOST_CHECK_CLOSE( p[0] , x[1] , 1.0e-14 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_do_step_v2 , Stepper , vector_steppers< initially_resizer > ) -{ - Stepper s; - diagnostic_state_type q , p ; - q[0] = 1.0; - p[0] = 2.0; - diagnostic_state_type q2 = q , p2 = p; - - - s.do_step( constant_mom_func() , q , p , 0.0 , 0.1 ); - s.do_step( constant_mom_func() , std::make_pair( boost::ref( q2 ) , boost::ref( p2 ) ) , 0.0 , 0.1 ); - - BOOST_CHECK_CLOSE( q[0] , q2[0] , 1.0e-14 ); - BOOST_CHECK_CLOSE( p[0] , p2[0] , 1.0e-14 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_do_step_v3 , Stepper , vector_steppers< initially_resizer > ) -{ - Stepper s; - std::pair< diagnostic_state_type , diagnostic_state_type2 > x_in , x_out; - x_in.first[0] = 1.0; - x_in.second[0] = 2.0; - diagnostic_state_type q2 , p2; - q2[0] = x_in.first[0]; - p2[0] = x_in.second[0]; - - - s.do_step( constant_mom_func() , x_in , 0.0 , x_out , 0.1 ); - s.do_step( constant_mom_func() , std::make_pair( boost::ref( q2 ) , boost::ref( p2 ) ) , 0.0 , 0.1 ); - - BOOST_CHECK_CLOSE( x_in.first[0] , 1.0 , 1.0e-14 ); - BOOST_CHECK_CLOSE( x_in.second[0] , 2.0 , 1.0e-14 ); - BOOST_CHECK_CLOSE( x_out.first[0] , q2[0] , 1.0e-14 ); - BOOST_CHECK_CLOSE( x_out.second[0] , p2[0] , 1.0e-14 ); -} - - -typedef double vector_space; -typedef complete_steppers< vector_space , vector_space , double , - vector_space , vector_space , double , - vector_space_algebra , default_operations , initially_resizer > vector_space_steppers; -BOOST_AUTO_TEST_CASE_TEMPLATE( test_with_vector_space_algebra , Stepper , vector_space_steppers ) -{ - Stepper s; - std::pair< vector_space , vector_space > x; - s.do_step( constant_mom_func_vector_space_1d() , x , 0.0 , 0.1 ); - - s.do_step( std::make_pair( default_coor_func_vector_space_1d() , constant_mom_func_vector_space_1d() ) , x , 0.0 , 0.1 ); -} - - -typedef boost::fusion::vector< length_type > coor_type; -typedef boost::fusion::vector< velocity_type > mom_type; -typedef boost::fusion::vector< acceleration_type > acc_type; -typedef complete_steppers< coor_type , mom_type , double , - mom_type , acc_type , time_type, - fusion_algebra , default_operations , initially_resizer > boost_unit_steppers; -BOOST_AUTO_TEST_CASE_TEMPLATE( test_with_boost_units , Stepper , boost_unit_steppers ) -{ - namespace fusion = boost::fusion; - namespace si = boost::units::si; - Stepper s; - - coor_type q = fusion::make_vector( 1.0 * si::meter ); - mom_type p = fusion::make_vector( 2.0 * si::meter_per_second ); - time_type t = 0.0 * si::second; - time_type dt = 0.1 * si::second; - - coor_type q1 = q , q2 = q; - mom_type p1 = p , p2 = p; - - s.do_step( oscillator_mom_func_units() , std::make_pair( boost::ref( q ) , boost::ref( p ) ) , t , dt ); - - s.do_step( std::make_pair( oscillator_coor_func_units() , oscillator_mom_func_units() ) , - std::make_pair( boost::ref( q1 ) , boost::ref( p1 ) ) , t , dt ); - - s.do_step( oscillator_mom_func_units() , q2 , p2 , t , dt ); - - BOOST_CHECK_CLOSE( ( fusion::at_c< 0 >( q ).value() ) , ( fusion::at_c< 0 >( q1 ).value() ) , 1.0e-14 ); - BOOST_CHECK_CLOSE( ( fusion::at_c< 0 >( q1 ).value() ) , ( fusion::at_c< 0 >( q2 ).value() ) , 1.0e-14 ); - BOOST_CHECK_CLOSE( ( fusion::at_c< 0 >( p ).value() ) , ( fusion::at_c< 0 >( p1 ).value() ) , 1.0e-14 ); - BOOST_CHECK_CLOSE( ( fusion::at_c< 0 >( p1 ).value() ) , ( fusion::at_c< 0 >( p2 ).value() ) , 1.0e-14 ); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/times_iterator.cpp b/libs/numeric/odeint/test/times_iterator.cpp deleted file mode 100644 index 552d5af78..000000000 --- a/libs/numeric/odeint/test/times_iterator.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/times_iterator.cpp - - [begin_description] - This file tests the n-step iterator. - [end_description] - - Copyright 2009-2013 Karsten Ahnert - Copyright 2009-2013 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) - */ - - -#define BOOST_TEST_MODULE odeint_times_iterator - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include "dummy_steppers.hpp" -#include "dummy_odes.hpp" -#include "dummy_observers.hpp" - -namespace mpl = boost::mpl; -using namespace boost::numeric::odeint; - -typedef dummy_stepper::state_type state_type; -typedef dummy_stepper::value_type value_type; - - -BOOST_AUTO_TEST_SUITE( times_iterator_test ) - -typedef mpl::vector< - dummy_stepper - , dummy_dense_output_stepper - > dummy_steppers; - -boost::array times = {{ 0.0 , 0.1, 0.2, 0.3 }}; -typedef boost::array::iterator time_iterator_type; - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_stepper_iterator , Stepper , dummy_steppers ) -{ - typedef times_iterator< Stepper , empty_system , state_type , time_iterator_type > iterator_type; - state_type x = {{ 1.0 }}; - iterator_type iter1 = iterator_type( Stepper() , empty_system() , x , times.begin() , times.end() , 0.1 ); - iterator_type iter2 = iter1; - BOOST_CHECK_EQUAL( &(*iter1) , &(*iter2) ); - BOOST_CHECK_EQUAL( &(*iter1) , &x ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( assignment_stepper_iterator , Stepper , dummy_steppers ) -{ - std::cout << "assignment" << std::endl; - typedef times_iterator< Stepper , empty_system , state_type , time_iterator_type> iterator_type; - state_type x1 = {{ 1.0 }} , x2 = {{ 2.0 }}; - iterator_type iter1 = iterator_type( Stepper() , empty_system() , x1 , times.begin() , times.end() , 0.1 ); - iterator_type iter2 = iterator_type( Stepper() , empty_system() , x2 , times.begin() , times.end() , 0.2 ); - BOOST_CHECK_EQUAL( &(*iter1) , &x1 ); - BOOST_CHECK_EQUAL( &(*iter2) , &x2 ); - BOOST_CHECK( !iter1.same( iter2 ) ); - iter2 = iter1; - BOOST_CHECK_EQUAL( &(*iter1) , &x1 ); - BOOST_CHECK_EQUAL( &(*iter2) , &x1 ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_iterator_factory , Stepper , dummy_steppers ) -{ - std::cout << "factory" << std::endl; - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_times_iterator_begin( stepper , boost::ref( system ) , x , times.begin(), times.end() , 0.1 ) , - make_times_iterator_end( stepper , boost::ref( system ) , x ) , - dummy_observer() ); - - // dummy_steppers just add 0.25 at each step, the above for_each leads to 3 do_step calls so x should be 1.75 - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_range , Stepper , dummy_steppers ) -{ - std::cout << "range" << std::endl; - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_times_range( stepper , boost::ref( system ) , x , times.begin() , times.end() , 0.1 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_iterator_with_reference_wrapper_factory , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_times_iterator_begin( boost::ref( stepper ) , boost::ref( system ) , x , times.begin() , times.end() , 0.1 ) , - make_times_iterator_end( boost::ref( stepper ) , boost::ref( system ) , x ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_range_with_reference_wrapper , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_times_range( boost::ref( stepper ) , boost::ref( system ) , x , times.begin() , times.end(), 0.1 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( transitivity1 , Stepper , dummy_steppers ) -{ - typedef times_iterator< Stepper , empty_system , state_type , time_iterator_type > stepper_iterator; - std::cout << "transitivity1" << std::endl; - state_type x = {{ 1.0 }}; - stepper_iterator first1( Stepper() , empty_system() , x , times.end() , times.end() , 0.1 ); - stepper_iterator last1( Stepper() , empty_system() , x ); - stepper_iterator last2( Stepper() , empty_system() , x ); - - BOOST_CHECK( first1 == last1 ); - BOOST_CHECK( first1 == last2 ); - BOOST_CHECK( last1 == last2 ); - - first1 = stepper_iterator( Stepper() , empty_system() , x , times.end()-1 , times.end() , 0.1 ); - last1 = stepper_iterator( Stepper() , empty_system() , x ); - BOOST_CHECK( first1 != last1 ); - BOOST_CHECK( ++first1 == last1 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm , Stepper , dummy_steppers ) -{ - typedef times_iterator< Stepper , empty_system , state_type , time_iterator_type> stepper_iterator; - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - stepper_iterator first( Stepper() , empty_system() , x , times.begin() , times.end() , 0.1 ); - stepper_iterator last( Stepper() , empty_system() , x ); - - std::copy( first , last , std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-13 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); // the iterator should not iterate over the end -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_negative_time_step , Stepper , dummy_steppers ) -{ - typedef times_iterator< Stepper , empty_system , state_type , time_iterator_type > stepper_iterator; - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - boost::array neg_times = {{ 0.0 , -0.1, -0.2, -0.3 }}; - stepper_iterator first( Stepper() , empty_system() , x , neg_times.begin() , neg_times.end() , -0.1 ); - stepper_iterator last( Stepper() , empty_system() , x ); - - std::copy( first , last , std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-13 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - std::copy( make_times_iterator_begin( Stepper() , empty_system() , x , times.begin() , times.end() , 0.1 ) , - make_times_iterator_end( Stepper() , empty_system() , x ) , - std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-13 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_range_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - std::vector< state_type > res; - boost::range::copy( make_times_range( Stepper() , empty_system() , x , times.begin() , times.end() , 0.1 ) , - std::back_insert_iterator< std::vector< state_type > >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0][0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1][0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2][0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3][0] , 1.75 , 1.0e-13 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/times_time_iterator.cpp b/libs/numeric/odeint/test/times_time_iterator.cpp deleted file mode 100644 index 274f8a621..000000000 --- a/libs/numeric/odeint/test/times_time_iterator.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/times_time_iterator.cpp - - [begin_description] - This file tests the times iterator. - [end_description] - - Copyright 2009-2013 Karsten Ahnert - Copyright 2009-2013 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) - */ - - -#define BOOST_TEST_MODULE odeint_times_time_iterator - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include "dummy_steppers.hpp" -#include "dummy_odes.hpp" -#include "dummy_observers.hpp" - -namespace mpl = boost::mpl; -using namespace boost::numeric::odeint; - -typedef dummy_stepper::state_type state_type; -typedef dummy_stepper::value_type value_type; -typedef dummy_stepper::time_type time_type; - -BOOST_AUTO_TEST_SUITE( times_time_iterator_test ) - -typedef mpl::vector< - dummy_stepper - , dummy_dense_output_stepper - > dummy_steppers; - -boost::array times = {{ 0.0 , 0.1, 0.2, 0.3 }}; -typedef boost::array::iterator time_iterator_type; -typedef std::vector< std::pair< state_type , time_type > > result_vector; - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_stepper_iterator , Stepper , dummy_steppers ) -{ - typedef times_time_iterator< Stepper , empty_system , state_type , time_iterator_type > iterator_type; - state_type x = {{ 1.0 }}; - iterator_type iter1 = iterator_type( Stepper() , empty_system() , x , times.begin() , times.end() , 0.1 ); - iterator_type iter2 = iter1; - BOOST_CHECK_EQUAL( &(iter1->first) , &(iter2->first) ); - BOOST_CHECK_EQUAL( &(iter1->first) , &x ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( assignment_stepper_iterator , Stepper , dummy_steppers ) -{ - std::cout << "assignment" << std::endl; - typedef times_time_iterator< Stepper , empty_system , state_type , time_iterator_type> iterator_type; - state_type x1 = {{ 1.0 }} , x2 = {{ 2.0 }}; - iterator_type iter1 = iterator_type( Stepper() , empty_system() , x1 , times.begin() , times.end() , 0.1 ); - iterator_type iter2 = iterator_type( Stepper() , empty_system() , x2 , times.begin() , times.end() , 0.2 ); - BOOST_CHECK_EQUAL( &(iter1->first) , &x1 ); - BOOST_CHECK_EQUAL( &(iter2->first) , &x2 ); - BOOST_CHECK( !iter1.same( iter2 ) ); - iter2 = iter1; - BOOST_CHECK_EQUAL( &(iter1->first) , &x1 ); - BOOST_CHECK_EQUAL( &(iter2->first) , &x1 ); - BOOST_CHECK( iter1.same( iter2 ) ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_iterator_factory , Stepper , dummy_steppers ) -{ - std::cout << "factory" << std::endl; - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_times_time_iterator_begin( stepper , boost::ref( system ) , x , times.begin(), times.end() , 0.1 ) , - make_times_time_iterator_end( stepper , boost::ref( system ) , x ) , - dummy_observer() ); - - // dummy_steppers just add 0.25 at each step, the above for_each leads to 3 do_step calls so x should be 1.75 - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_range , Stepper , dummy_steppers ) -{ - std::cout << "range" << std::endl; - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_times_time_range( stepper , boost::ref( system ) , x , times.begin() , times.end() , 0.1 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_iterator_with_reference_wrapper_factory , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - std::for_each( - make_times_time_iterator_begin( boost::ref( stepper ) , boost::ref( system ) , x , times.begin() , times.end() , 0.1 ) , - make_times_time_iterator_end( boost::ref( stepper ) , boost::ref( system ) , x ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( stepper_range_with_reference_wrapper , Stepper , dummy_steppers ) -{ - Stepper stepper; - empty_system system; - state_type x = {{ 1.0 }}; - - boost::for_each( make_times_time_range( boost::ref( stepper ) , boost::ref( system ) , x , times.begin() , times.end(), 0.1 ) , - dummy_observer() ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - - - -BOOST_AUTO_TEST_CASE_TEMPLATE( transitivity1 , Stepper , dummy_steppers ) -{ - typedef times_time_iterator< Stepper , empty_system , state_type , time_iterator_type > stepper_iterator; - std::cout << "transitivity1" << std::endl; - state_type x = {{ 1.0 }}; - stepper_iterator first1( Stepper() , empty_system() , x , times.end() , times.end() , 0.1 ); - stepper_iterator last1( Stepper() , empty_system() , x ); - stepper_iterator last2( Stepper() , empty_system() , x ); - - BOOST_CHECK( first1 == last1 ); - BOOST_CHECK( first1 == last2 ); - BOOST_CHECK( last1 == last2 ); - - first1 = stepper_iterator( Stepper() , empty_system() , x , times.end()-1 , times.end() , 0.1 ); - last1 = stepper_iterator( Stepper() , empty_system() , x ); - BOOST_CHECK( first1 != last1 ); - BOOST_CHECK( ++first1 == last1 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm , Stepper , dummy_steppers ) -{ - typedef times_time_iterator< Stepper , empty_system , state_type , time_iterator_type> stepper_iterator; - state_type x = {{ 1.0 }}; - result_vector res; - stepper_iterator first( Stepper() , empty_system() , x , times.begin() , times.end() , 0.1 ); - stepper_iterator last( Stepper() , empty_system() , x ); - - std::copy( first , last , std::back_insert_iterator< result_vector >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0].first[0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].first[0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].first[0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].first[0] , 1.75 , 1.0e-13 ); - - for( size_t n=0 ; n<4 ; ++n ) - BOOST_CHECK_CLOSE( res[n].second , times[n] , 1.0e-13 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); // the iterator should not iterate over the end -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_negative_time_step , Stepper , dummy_steppers ) -{ - typedef times_time_iterator< Stepper , empty_system , state_type , time_iterator_type > stepper_iterator; - state_type x = {{ 1.0 }}; - result_vector res; - boost::array neg_times = {{ 0.0 , -0.1, -0.2, -0.3 }}; - stepper_iterator first( Stepper() , empty_system() , x , neg_times.begin() , neg_times.end() , -0.1 ); - stepper_iterator last( Stepper() , empty_system() , x ); - - std::copy( first , last , std::back_insert_iterator< result_vector >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0].first[0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].first[0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].first[0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].first[0] , 1.75 , 1.0e-13 ); - - for( size_t n=0 ; n<4 ; ++n ) - BOOST_CHECK_CLOSE( res[n].second , neg_times[n] , 1.0e-13 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - result_vector res; - std::copy( make_times_time_iterator_begin( Stepper() , empty_system() , x , times.begin() , times.end() , 0.1 ) , - make_times_time_iterator_end( Stepper() , empty_system() , x ) , - std::back_insert_iterator< result_vector >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0].first[0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].first[0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].first[0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].first[0] , 1.75 , 1.0e-13 ); - - for( size_t n=0 ; n<4 ; ++n ) - BOOST_CHECK_CLOSE( res[n].second , times[n] , 1.0e-13 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE_TEMPLATE( copy_algorithm_with_range_factory , Stepper , dummy_steppers ) -{ - state_type x = {{ 1.0 }}; - result_vector res; - boost::range::copy( make_times_time_range( Stepper() , empty_system() , x , times.begin() , times.end() , 0.1 ) , - std::back_insert_iterator< result_vector >( res ) ); - - BOOST_CHECK_EQUAL( res.size() , size_t( 4 ) ); - BOOST_CHECK_CLOSE( res[0].first[0] , 1.0 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[1].first[0] , 1.25 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[2].first[0] , 1.5 , 1.0e-13 ); - BOOST_CHECK_CLOSE( res[3].first[0] , 1.75 , 1.0e-13 ); - - for( size_t n=0 ; n<4 ; ++n ) - BOOST_CHECK_CLOSE( res[n].second , times[n] , 1.0e-13 ); - - BOOST_CHECK_CLOSE( x[0] , 1.75 , 1.0e-13 ); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/trivial_state.cpp b/libs/numeric/odeint/test/trivial_state.cpp deleted file mode 100644 index 9976db7fb..000000000 --- a/libs/numeric/odeint/test/trivial_state.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/trivial_state.cpp - - [begin_description] - This file tests if the steppers can integrate the trivial state consisting of a single double. - [end_description] - - Copyright 2012-2013 Mario Mulansky - Copyright 2012 Karsten Ahnert - - Distributed under the 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 - -// disable checked iterator warning for msvc -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_trivial_state - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -namespace mpl = boost::mpl; - -struct constant_system -{ - template< typename T > - void operator()( const T &x , T &dxdt , const T t ) const - { dxdt = 1.0; } -}; - - -BOOST_AUTO_TEST_SUITE( trivial_state_test ) - -/* test different do_step methods of simple steppers */ - -typedef mpl::vector< - euler< double > , - runge_kutta4< double > , - // with floats all four parameters have to be given explicitly to override default double - euler< float , float , float , float > , - runge_kutta4< float , float , float , float > - >::type stepper_types; - - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_do_step , T, stepper_types ) -{ - typedef T stepper_type; - stepper_type stepper; - typename stepper_type::state_type x = 0.0; - typename stepper_type::time_type t = 0.0; - typename stepper_type::time_type dt = 0.1; - stepper.do_step( constant_system() , x , t , dt ); - BOOST_CHECK_CLOSE( x , 0.1 , 100*std::numeric_limits< typename stepper_type::state_type >::epsilon() ); - - // this overload is not allowed if the types of dxdt and dt are the same - // deriv_type dxdt = 1.0; - // stepper.do_step( constant_system , x , dxdt , t , dt ); - - typename stepper_type::state_type x_out; - stepper.do_step( constant_system() , x , t , x_out , dt ); - BOOST_CHECK_CLOSE( x , 0.1 , 100*std::numeric_limits< typename stepper_type::state_type >::epsilon() ); - BOOST_CHECK_CLOSE( x_out , 0.2 , 100*std::numeric_limits< typename stepper_type::state_type >::epsilon() ); -} - - -/* test integrate_adaptive with controlled steppers */ - -typedef mpl::vector< - runge_kutta_cash_karp54< double > , - runge_kutta_dopri5< double > , - // with floats all four parameters have to be given explicitly to override default double - runge_kutta_cash_karp54< float , float , float , float > , - runge_kutta_dopri5< float , float , float , float > - > error_stepper_types; - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_integrate , T , error_stepper_types ) -{ - typedef T stepper_type; - typename stepper_type::state_type x = 0.0; - typename stepper_type::time_type t0 = 0.0; - typename stepper_type::time_type t1 = 1.0; - typename stepper_type::time_type dt = 0.1; - integrate_adaptive( make_controlled< stepper_type >( 1e-6 , 1e-6 ) , constant_system() , x , t0 , t1 , dt ); - BOOST_CHECK_CLOSE( x , 1.0 , 100*std::numeric_limits< typename stepper_type::state_type >::epsilon() ); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/unwrap_boost_reference.cpp b/libs/numeric/odeint/test/unwrap_boost_reference.cpp deleted file mode 100644 index 4106fdf20..000000000 --- a/libs/numeric/odeint/test/unwrap_boost_reference.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/unwrap_boost_reference.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2009-2012 Karsten Ahnert - Copyright 2009-2012 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) - */ - -#define BOOST_TEST_MODULE odeint_unwrap_boost_reference - -#include -#include - -using namespace boost::unit_test; - -template< typename T > -void func( T t ) -{ - typedef typename boost::numeric::odeint::unwrap_reference< T >::type type; -} - -BOOST_AUTO_TEST_SUITE( unwrap_boost_reference_test ) - -BOOST_AUTO_TEST_CASE( test_case ) -{ - int a; - func( boost::ref( a ) ); - func( a ); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/unwrap_reference.cpp b/libs/numeric/odeint/test/unwrap_reference.cpp deleted file mode 100644 index 7337ddd3a..000000000 --- a/libs/numeric/odeint/test/unwrap_reference.cpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/unwrap_reference.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2009-2012 Karsten Ahnert - Copyright 2009-2012 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) - */ - - -#define BOOST_TEST_MODULE odeint_unwrap_reference - -#include - -#include - -using namespace boost::unit_test; - -template< typename T > -void func( T t ) -{ - typedef typename boost::numeric::odeint::unwrap_reference< T >::type type; -} - -BOOST_AUTO_TEST_SUITE( unwrap_reference_test ) - -BOOST_AUTO_TEST_CASE( test_case ) -{ - int a; - func( std::ref( a ) ); - func( a ); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test/velocity_verlet.cpp b/libs/numeric/odeint/test/velocity_verlet.cpp deleted file mode 100644 index 93a2e97ca..000000000 --- a/libs/numeric/odeint/test/velocity_verlet.cpp +++ /dev/null @@ -1,298 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test/velocity_verlet.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2009-2012 Karsten Ahnert - Copyright 2009-2012 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) - */ - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_velocity_verlet - -#define BOOST_FUSION_INVOKE_MAX_ARITY 15 -#define BOOST_RESULT_OF_NUM_ARGS 15 - -#include - -#include "resizing_test_state_type.hpp" - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -namespace fusion = boost::fusion; -namespace units = boost::units; -namespace si = boost::units::si; - -typedef double value_type; -typedef units::quantity< si::time , value_type > time_type; -typedef units::unit< units::derived_dimension< units::time_base_dimension , 2 >::type , si::system > time_2; -typedef units::quantity< time_2 , value_type > time_2_type; -typedef units::quantity< si::length , value_type > length_type; -typedef units::quantity< si::velocity , value_type > velocity_type; -typedef units::quantity< si::acceleration , value_type > acceleration_type; -typedef fusion::vector< length_type , length_type > coor_vector; -typedef fusion::vector< velocity_type , velocity_type > velocity_vector; -typedef fusion::vector< acceleration_type , acceleration_type > accelartion_vector; - - - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -size_t ode_call_count; - -struct velocity_verlet_fixture -{ - velocity_verlet_fixture( void ) { ode_call_count = 0; adjust_size_count = 0; } -}; - -struct ode -{ - template< class CoorIn , class MomentumIn , class AccelerationOut , class Time > - void operator()( const CoorIn &q , const MomentumIn &p , AccelerationOut &a , Time t ) const - { - a[0] = -q[0] - p[0]; - a[1] = -q[1] - p[1]; - ++ode_call_count; - } -}; - -struct ode_units -{ - void operator()( coor_vector const &q , velocity_vector const &p , accelartion_vector &a , time_type t ) const - { - const units::quantity< si::frequency , value_type > omega = 1.0 * si::hertz; - const units::quantity< si::frequency , value_type > friction = 0.001 * si::hertz; - fusion::at_c< 0 >( a ) = omega * omega * fusion::at_c< 0 >( q ) - friction * fusion::at_c< 0 >( p ); - fusion::at_c< 1 >( a ) = omega * omega * fusion::at_c< 1 >( q ) - friction * fusion::at_c< 0 >( p ); - ++ode_call_count; - } -}; - -template< class Q , class P > -void init_state( Q &q , P &p ) -{ - q[0] = 1.0 ; q[1] = 0.5; - p[0] = 2.0 ; p[1] = -1.0; -} - -typedef boost::array< double , 2 > array_type; -typedef std::vector< double > vector_type; - -typedef velocity_verlet< array_type > array_stepper; -typedef velocity_verlet< vector_type > vector_stepper; - -template< typename Resizer > -struct get_resizer_test_stepper -{ - typedef velocity_verlet< test_array_type , test_array_type , double , test_array_type , - double , double , range_algebra , default_operations , Resizer > type; -}; - - - - - -BOOST_AUTO_TEST_SUITE( velocity_verlet_test ) - -BOOST_FIXTURE_TEST_CASE( test_with_array_ref , velocity_verlet_fixture ) -{ - array_stepper stepper; - array_type q , p ; - init_state( q , p ); - stepper.do_step( ode() , std::make_pair( boost::ref( q ) , boost::ref( p ) ) , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 2 ) ); -} - -BOOST_FIXTURE_TEST_CASE( test_with_array_pair , velocity_verlet_fixture ) -{ - array_stepper stepper; - std::pair< array_type , array_type > xxx; - init_state( xxx.first , xxx.second ); - stepper.do_step( ode() , xxx , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 2 ) ); -} - -BOOST_FIXTURE_TEST_CASE( test_with_vector_ref , velocity_verlet_fixture ) -{ - vector_stepper stepper; - vector_type q( 2 ) , p( 2 ); - init_state( q , p ); - stepper.do_step( ode() , std::make_pair( boost::ref( q ) , boost::ref( p ) ) , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 2 ) ); -} - -BOOST_FIXTURE_TEST_CASE( test_with_vector_pair , velocity_verlet_fixture ) -{ - vector_stepper stepper; - std::pair< vector_type , vector_type > x; - x.first.resize( 2 ) ; x.second.resize( 2 ); - init_state( x.first , x.second ); - stepper.do_step( ode() , x , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 2 ) ); -} - -BOOST_FIXTURE_TEST_CASE( test_initial_resizer , velocity_verlet_fixture ) -{ - typedef get_resizer_test_stepper< initially_resizer >::type stepper_type; - std::pair< test_array_type , test_array_type > x; - init_state( x.first , x.second ); - stepper_type stepper; - stepper.do_step( ode() , x , 0.0 , 0.01 ); - stepper.do_step( ode() , x , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 2 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 3 ) ); -} - -BOOST_FIXTURE_TEST_CASE( test_always_resizer , velocity_verlet_fixture ) -{ - typedef get_resizer_test_stepper< always_resizer >::type stepper_type; - std::pair< test_array_type , test_array_type > x; - init_state( x.first , x.second ); - stepper_type stepper; - stepper.do_step( ode() , x , 0.0 , 0.01 ); - stepper.do_step( ode() , x , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 4 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 4 ) ); // attention: one more system call, since the size of the state has been changed -} - -BOOST_FIXTURE_TEST_CASE( test_with_never_resizer , velocity_verlet_fixture ) -{ - typedef get_resizer_test_stepper< never_resizer >::type stepper_type; - std::pair< test_array_type , test_array_type > x; - init_state( x.first , x.second ); - stepper_type stepper; - stepper.do_step( ode() , x , 0.0 , 0.01 ); - stepper.do_step( ode() , x , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 0 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 3 ) ); -} - -BOOST_FIXTURE_TEST_CASE( test_reset , velocity_verlet_fixture ) -{ - typedef get_resizer_test_stepper< initially_resizer >::type stepper_type; - std::pair< test_array_type , test_array_type > x; - init_state( x.first , x.second ); - stepper_type stepper; - stepper.do_step( ode() , x , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 2 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 2 ) ); - stepper.do_step( ode() , x , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 2 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 3 ) ); - stepper.reset(); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 2 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 3 ) ); - stepper.do_step( ode() , x , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 2 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 5 ) ); -} - -BOOST_FIXTURE_TEST_CASE( test_initialize1 , velocity_verlet_fixture ) -{ - typedef get_resizer_test_stepper< initially_resizer >::type stepper_type; - std::pair< test_array_type , test_array_type > x; - init_state( x.first , x.second ); - stepper_type stepper; - test_array_type ain; - ode()( x.first , x.second , ain , 0.0 ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 0 ) ); - stepper.initialize( ain ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 2 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 1 ) ); - stepper.do_step( ode() , x , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 2 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 2 ) ); -} - -BOOST_FIXTURE_TEST_CASE( test_initialize2 , velocity_verlet_fixture ) -{ - typedef get_resizer_test_stepper< initially_resizer >::type stepper_type; - std::pair< test_array_type , test_array_type > x; - init_state( x.first , x.second ); - stepper_type stepper; - stepper.initialize( ode() , x.first , x.second , 0.0 ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 2 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 1 ) ); - stepper.do_step( ode() , x , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 2 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 2 ) ); -} - - -BOOST_FIXTURE_TEST_CASE( test_adjust_size , velocity_verlet_fixture ) -{ - typedef get_resizer_test_stepper< initially_resizer >::type stepper_type; - std::pair< test_array_type , test_array_type > x; - init_state( x.first , x.second ); - stepper_type stepper; - stepper.do_step( ode() , x , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 2 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 2 ) ); - stepper.adjust_size( x.first ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 4 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 2 ) ); - stepper.do_step( ode() , x , 0.0 , 0.01 ); - BOOST_CHECK_EQUAL( adjust_size_count , size_t( 4 ) ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 4 ) ); -} - -BOOST_FIXTURE_TEST_CASE( test_with_unit_pair , velocity_verlet_fixture ) -{ - typedef velocity_verlet< coor_vector , velocity_vector , value_type , accelartion_vector , - time_type , time_2_type , fusion_algebra , default_operations > stepper_type; - - std::pair< coor_vector , velocity_vector > x; - fusion::at_c< 0 >( x.first ) = 1.0 * si::meter; - fusion::at_c< 1 >( x.first ) = 0.5 * si::meter; - fusion::at_c< 0 >( x.second ) = 2.0 * si::meter_per_second; - fusion::at_c< 1 >( x.second ) = -1.0 * si::meter_per_second; - stepper_type stepper; - stepper.do_step( ode_units() , x , 0.0 * si::second , 0.01 * si::second ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 2 ) ); -} - - -BOOST_FIXTURE_TEST_CASE( test_with_unit_ref , velocity_verlet_fixture ) -{ - typedef velocity_verlet< coor_vector , velocity_vector , value_type , accelartion_vector , - time_type , time_2_type , fusion_algebra , default_operations > stepper_type; - - coor_vector q; - velocity_vector p; - fusion::at_c< 0 >( q ) = 1.0 * si::meter; - fusion::at_c< 1 >( q ) = 0.5 * si::meter; - fusion::at_c< 0 >( p ) = 2.0 * si::meter_per_second; - fusion::at_c< 1 >( p ) = -1.0 * si::meter_per_second; - stepper_type stepper; - stepper.do_step( ode_units() , std::make_pair( boost::ref( q ) , boost::ref( p ) ) , 0.0 * si::second , 0.01 * si::second ); - BOOST_CHECK_EQUAL( ode_call_count , size_t( 2 ) ); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test_external/eigen/Jamfile.v2 b/libs/numeric/odeint/test_external/eigen/Jamfile.v2 deleted file mode 100644 index 489f67ce4..000000000 --- a/libs/numeric/odeint/test_external/eigen/Jamfile.v2 +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2012-2013 Karsten Ahnert -# Copyright 2012-2013 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) - -# bring in rules for testing - - -import testing ; -import os ; - -use-project boost : $(BOOST_ROOT) ; - -local EIGEN_ROOT = [ os.environ EIGEN_ROOT ] ; - -project - : requirements - /boost/test//boost_unit_test_framework - BOOST_ALL_NO_LIB=1 - $(EIGEN_ROOT) - ../../test - static - # -D_SCL_SECURE_NO_WARNINGS - ; - -test-suite "odeint" - : - [ compile is_resizeable.cpp ] - [ run same_size.cpp ] - [ run resize.cpp ] - [ run runge_kutta4.cpp ] - [ run runge_kutta_dopri5.cpp ] - [ run integrate.cpp ] - [ compile-fail fail_integrate.cpp ] - : valgrind - ; diff --git a/libs/numeric/odeint/test_external/eigen/fail_integrate.cpp b/libs/numeric/odeint/test_external/eigen/fail_integrate.cpp deleted file mode 100644 index 4c71b0186..000000000 --- a/libs/numeric/odeint/test_external/eigen/fail_integrate.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - [auto_generated] - fail_integrate.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2009-2012 Karsten Ahnert - Copyright 2009-2012 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) - */ - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_dummy - -#include -#include - -#include - -#include "dummy_odes.hpp" - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - - -BOOST_AUTO_TEST_SUITE( eigen_fail_integrate ) - -BOOST_AUTO_TEST_CASE( test ) -{ - typedef Eigen::Matrix< double , 1 , 1 > state_type; - state_type x; - x[0] = 10.0; - double t_start = 0.0 , t_end = 1.0 , dt = 0.1; - integrate( constant_system_functor_standard() , x , t_start , t_end , dt ); -} - -BOOST_AUTO_TEST_SUITE_END() - diff --git a/libs/numeric/odeint/test_external/eigen/integrate.cpp b/libs/numeric/odeint/test_external/eigen/integrate.cpp deleted file mode 100644 index c64496a83..000000000 --- a/libs/numeric/odeint/test_external/eigen/integrate.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/* - [auto_generated] - integrate.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2009-2012 Karsten Ahnert - Copyright 2009-2012 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) - */ - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_eigen_integrate - -#include -#include - -#include - -#include "dummy_odes.hpp" - - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - - -BOOST_AUTO_TEST_SUITE( eigen_integrate ) - -BOOST_AUTO_TEST_CASE( test_const_sys ) -{ - typedef Eigen::Matrix< double , 1 , 1 > state_type; - state_type x; - x[0] = 10.0; - double t_start = 0.0 , t_end = 1.0 , dt = 0.1; - integrate< double >( constant_system_functor_standard() , x , t_start , t_end , dt ); - BOOST_CHECK_CLOSE( x[0] , 11.0 , 1.0e-13 ); -} - -BOOST_AUTO_TEST_CASE( test_lorenz ) -{ - typedef Eigen::Matrix< double , 3 , 1 > state_type; - state_type x; - x[0] = 10.0; - x[1] = 10.0; - x[2] = 10.0; - double t_start = 0.0 , t_end = 1000.0 , dt = 0.1; - integrate< double >( lorenz() , x , t_start , t_end , dt ); - - std::vector< double > x2( 3 ); - x2[0] = 10.0; - x2[1] = 10.0; - x2[2] = 10.0; - integrate( lorenz() , x2 , t_start , t_end , dt ); - - BOOST_CHECK_CLOSE( x[0] , x2[0] , 1.0e-13 ); - BOOST_CHECK_CLOSE( x[1] , x2[1] , 1.0e-13 ); - BOOST_CHECK_CLOSE( x[2] , x2[2] , 1.0e-13 ); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test_external/eigen/is_resizeable.cpp b/libs/numeric/odeint/test_external/eigen/is_resizeable.cpp deleted file mode 100644 index 5f29ee536..000000000 --- a/libs/numeric/odeint/test_external/eigen/is_resizeable.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test_external/eigen/is_resizeable.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2013 Karsten Ahnert - Copyright 2013 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) - */ - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_eigen_is_resizeable - -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - - -BOOST_AUTO_TEST_SUITE( is_resizeable ) - -BOOST_AUTO_TEST_CASE( test_compile_time_matrix ) -{ - typedef Eigen::Matrix< double , 1 , 1 > matrix_type; - BOOST_STATIC_ASSERT(( boost::numeric::odeint::is_resizeable< matrix_type >::value )); -} - -BOOST_AUTO_TEST_CASE( test_compile_time_array ) -{ - typedef Eigen::Array< double , 1 , 1 > array_type; - BOOST_STATIC_ASSERT(( boost::numeric::odeint::is_resizeable< array_type >::value )); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test_external/eigen/resize.cpp b/libs/numeric/odeint/test_external/eigen/resize.cpp deleted file mode 100644 index 4efcdd4d3..000000000 --- a/libs/numeric/odeint/test_external/eigen/resize.cpp +++ /dev/null @@ -1,145 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test_external/eigen/resize.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2013 Karsten Ahnert - Copyright 2013 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) - */ - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_eigen_resize - -#include -#include - - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - - -BOOST_AUTO_TEST_SUITE( eigen_resize ) - -BOOST_AUTO_TEST_CASE( test_compile_time_matrix ) -{ - typedef Eigen::Matrix< double , 1 , 1 > matrix_type; - matrix_type a , b; - boost::numeric::odeint::resize( a , b ); - BOOST_CHECK( boost::numeric::odeint::same_size( a , b ) ); - BOOST_CHECK_EQUAL( a.rows() , 1 ); - BOOST_CHECK_EQUAL( a.cols() , 1 ); -} - -BOOST_AUTO_TEST_CASE( test_rumtime_matrix ) -{ - typedef Eigen::Matrix< double , Eigen::Dynamic , Eigen::Dynamic > matrix_type; - matrix_type a( 5 , 2 ) , b; - - BOOST_CHECK_EQUAL( a.rows() , 5 ); - BOOST_CHECK_EQUAL( a.cols() , 2 ); - BOOST_CHECK_EQUAL( b.rows() , 0 ); - BOOST_CHECK_EQUAL( b.cols() , 0 ); - BOOST_CHECK( !boost::numeric::odeint::same_size( a , b ) ); - - boost::numeric::odeint::resize( b , a ); - - BOOST_CHECK_EQUAL( a.rows() , 5 ); - BOOST_CHECK_EQUAL( a.cols() , 2 ); - BOOST_CHECK_EQUAL( b.rows() , 5 ); - BOOST_CHECK_EQUAL( b.cols() , 2 ); - - BOOST_CHECK( boost::numeric::odeint::same_size( a , b ) ); -} - -BOOST_AUTO_TEST_CASE( test_rumtime_matrix2 ) -{ - typedef Eigen::Matrix< double , Eigen::Dynamic , Eigen::Dynamic > matrix_type; - matrix_type a( 5 , 2 ) , b( 2 , 3 ); - - BOOST_CHECK_EQUAL( a.rows() , 5 ); - BOOST_CHECK_EQUAL( a.cols() , 2 ); - BOOST_CHECK_EQUAL( b.rows() , 2 ); - BOOST_CHECK_EQUAL( b.cols() , 3 ); - BOOST_CHECK( !boost::numeric::odeint::same_size( a , b ) ); - - boost::numeric::odeint::resize( b , a ); - - BOOST_CHECK_EQUAL( a.rows() , 5 ); - BOOST_CHECK_EQUAL( a.cols() , 2 ); - BOOST_CHECK_EQUAL( b.rows() , 5 ); - BOOST_CHECK_EQUAL( b.cols() , 2 ); - - BOOST_CHECK( boost::numeric::odeint::same_size( a , b ) ); -} - - - - - - -BOOST_AUTO_TEST_CASE( test_compile_time_array ) -{ - typedef Eigen::Array< double , 1 , 1 > array_type; - array_type a , b; - boost::numeric::odeint::resize( a , b ); - BOOST_CHECK( boost::numeric::odeint::same_size( a , b ) ); - BOOST_CHECK_EQUAL( a.rows() , 1 ); - BOOST_CHECK_EQUAL( a.cols() , 1 ); -} - -BOOST_AUTO_TEST_CASE( test_rumtime_array ) -{ - typedef Eigen::Array< double , Eigen::Dynamic , Eigen::Dynamic > array_type; - array_type a( 5 , 2 ) , b; - - BOOST_CHECK_EQUAL( a.rows() , 5 ); - BOOST_CHECK_EQUAL( a.cols() , 2 ); - BOOST_CHECK_EQUAL( b.rows() , 0 ); - BOOST_CHECK_EQUAL( b.cols() , 0 ); - BOOST_CHECK( !boost::numeric::odeint::same_size( a , b ) ); - - boost::numeric::odeint::resize( b , a ); - - BOOST_CHECK_EQUAL( a.rows() , 5 ); - BOOST_CHECK_EQUAL( a.cols() , 2 ); - BOOST_CHECK_EQUAL( b.rows() , 5 ); - BOOST_CHECK_EQUAL( b.cols() , 2 ); - - BOOST_CHECK( boost::numeric::odeint::same_size( a , b ) ); -} - -BOOST_AUTO_TEST_CASE( test_rumtime_array2 ) -{ - typedef Eigen::Array< double , Eigen::Dynamic , Eigen::Dynamic > array_type; - array_type a( 5 , 2 ) , b( 2 , 3 ); - - BOOST_CHECK_EQUAL( a.rows() , 5 ); - BOOST_CHECK_EQUAL( a.cols() , 2 ); - BOOST_CHECK_EQUAL( b.rows() , 2 ); - BOOST_CHECK_EQUAL( b.cols() , 3 ); - BOOST_CHECK( !boost::numeric::odeint::same_size( a , b ) ); - - boost::numeric::odeint::resize( b , a ); - - BOOST_CHECK_EQUAL( a.rows() , 5 ); - BOOST_CHECK_EQUAL( a.cols() , 2 ); - BOOST_CHECK_EQUAL( b.rows() , 5 ); - BOOST_CHECK_EQUAL( b.cols() , 2 ); - - BOOST_CHECK( boost::numeric::odeint::same_size( a , b ) ); -} - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test_external/eigen/runge_kutta4.cpp b/libs/numeric/odeint/test_external/eigen/runge_kutta4.cpp deleted file mode 100644 index c4054fd15..000000000 --- a/libs/numeric/odeint/test_external/eigen/runge_kutta4.cpp +++ /dev/null @@ -1,94 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test_external/eigen/runge_kutta4.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2013 Karsten Ahnert - Copyright 2013 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) - */ - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_eigen_runge_kutta4 - -#include - -#include -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -struct sys -{ - template< class State , class Deriv > - void operator()( const State &x , Deriv &dxdt , double t ) const - { - dxdt[0] = 1.0; - } -}; - - -BOOST_AUTO_TEST_SUITE( eigen_runge_kutta4 ) - -BOOST_AUTO_TEST_CASE( compile_time_matrix ) -{ - typedef Eigen::Matrix< double , 1 , 1 > state_type; - state_type x; - x[0] = 10.0; - runge_kutta4< state_type , double , state_type , double , vector_space_algebra > rk4; - rk4.do_step( sys() , x , 0.0 , 0.1 ); - BOOST_CHECK_CLOSE( x[0] , 10.1 , 1.0e-13 ); - -} - -BOOST_AUTO_TEST_CASE( runtime_matrix ) -{ - typedef Eigen::Matrix< double , Eigen::Dynamic , 1 > state_type; - state_type x( 1 ); - x[0] = 10.0; - runge_kutta4< state_type , double , state_type , double , vector_space_algebra > rk4; - rk4.do_step( sys() , x , 0.0 , 0.1 ); - BOOST_CHECK_CLOSE( x[0] , 10.1 , 1.0e-13 ); -} - - - - - - -BOOST_AUTO_TEST_CASE( compile_time_array ) -{ - typedef Eigen::Array< double , 1 , 1 > state_type; - state_type x; - x[0] = 10.0; - runge_kutta4< state_type , double , state_type , double , vector_space_algebra > rk4; - rk4.do_step( sys() , x , 0.0 , 0.1 ); - BOOST_CHECK_CLOSE( x[0] , 10.1 , 1.0e-13 ); - -} - -BOOST_AUTO_TEST_CASE( runtime_array ) -{ - typedef Eigen::Array< double , Eigen::Dynamic , 1 > state_type; - state_type x( 1 ); - x[0] = 10.0; - runge_kutta4< state_type , double , state_type , double , vector_space_algebra > rk4; - rk4.do_step( sys() , x , 0.0 , 0.1 ); - BOOST_CHECK_CLOSE( x[0] , 10.1 , 1.0e-13 ); -} - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test_external/eigen/runge_kutta_dopri5.cpp b/libs/numeric/odeint/test_external/eigen/runge_kutta_dopri5.cpp deleted file mode 100644 index 516f04f75..000000000 --- a/libs/numeric/odeint/test_external/eigen/runge_kutta_dopri5.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test_external/eigen/runge_kutta_dopri5.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2013 Karsten Ahnert - Copyright 2013 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) - */ - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_eigen_runge_kutta4 - -#include - -#include -#include -#include -#include -#include - -// #include -#include - - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -struct sys -{ - template< class State , class Deriv > - void operator()( const State &x , Deriv &dxdt , double t ) const - { - dxdt[0] = 1.0; - } -}; - -template< class State > -struct stepper -{ - typedef runge_kutta_dopri5< State , double , State , double , vector_space_algebra > type; -}; - -template< class State > -struct controlled_stepper -{ - typedef controlled_runge_kutta< typename stepper< State >::type > type; -}; - -template< class State > -struct dense_output_stepper -{ - typedef dense_output_runge_kutta< typename controlled_stepper< State >::type > type; -}; - - - - -BOOST_AUTO_TEST_SUITE( eigen_runge_kutta_dopri5 ) - -BOOST_AUTO_TEST_CASE( compile_time_matrix ) -{ - typedef Eigen::Matrix< double , 1 , 1 > state_type; - state_type x; - x[0] = 10.0; - double t = 0.0 , dt = 0.1 ; - - // dense_output_stepper< state_type >::type s; - // s.initialize( x , t , dt ); - - // controlled_stepper< state_type >::type s; - // s.try_step( sys() , x , t , dt ); - - stepper< state_type >::type s; - s.do_step( sys() , x , t , dt ); - - // runge_kutta4< state_type , double , state_type , double , vector_space_algebra > rk4; - // rk4.do_step( sys() , x , 0.0 , 0.1 ); - // BOOST_CHECK_CLOSE( x[0] , 10.1 , 1.0e-13 ); - -} - -BOOST_AUTO_TEST_CASE( runtime_matrix ) -{ - typedef Eigen::Matrix< double , Eigen::Dynamic , 1 > state_type; - state_type x( 1 ); - x[0] = 10.0; - - // runge_kutta4< state_type , double , state_type , double , vector_space_algebra > rk4; - // rk4.do_step( sys() , x , 0.0 , 0.1 ); - // BOOST_CHECK_CLOSE( x[0] , 10.1 , 1.0e-13 ); -} - - - - - - -BOOST_AUTO_TEST_CASE( compile_time_array ) -{ - typedef Eigen::Array< double , 1 , 1 > state_type; - state_type x; - x[0] = 10.0; - // runge_kutta4< state_type , double , state_type , double , vector_space_algebra > rk4; - // rk4.do_step( sys() , x , 0.0 , 0.1 ); - // BOOST_CHECK_CLOSE( x[0] , 10.1 , 1.0e-13 ); - -} - -BOOST_AUTO_TEST_CASE( runtime_array ) -{ - typedef Eigen::Array< double , Eigen::Dynamic , 1 > state_type; - state_type x( 1 ); - x[0] = 10.0; - // runge_kutta4< state_type , double , state_type , double , vector_space_algebra > rk4; - // rk4.do_step( sys() , x , 0.0 , 0.1 ); - // BOOST_CHECK_CLOSE( x[0] , 10.1 , 1.0e-13 ); -} - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test_external/eigen/same_size.cpp b/libs/numeric/odeint/test_external/eigen/same_size.cpp deleted file mode 100644 index ea771f920..000000000 --- a/libs/numeric/odeint/test_external/eigen/same_size.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - [auto_generated] - libs/numeric/odeint/test_external/eigen/same_size.cpp - - [begin_description] - tba. - [end_description] - - Copyright 2013 Karsten Ahnert - Copyright 2013 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) - */ - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_eigen_same_size - -#include - -#include - - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - - -BOOST_AUTO_TEST_SUITE( eigen_same_size ) - -BOOST_AUTO_TEST_CASE( compile_time_matrix ) -{ - typedef Eigen::Matrix< double , 1 , 1 > matrix_type; - matrix_type a , b; - BOOST_CHECK( boost::numeric::odeint::same_size( a , b ) ); -} - -BOOST_AUTO_TEST_CASE( runtime_matrix ) -{ - typedef Eigen::Matrix< double , Eigen::Dynamic , Eigen::Dynamic > matrix_type; - matrix_type a( 10 , 2 ) , b( 10 , 2 ); - BOOST_CHECK( boost::numeric::odeint::same_size( a , b ) ); -} - -BOOST_AUTO_TEST_CASE( fail_runtime_matrix ) -{ - typedef Eigen::Matrix< double , Eigen::Dynamic , Eigen::Dynamic > matrix_type; - matrix_type a( 11 , 2 ) , b( 10 , 2 ); - BOOST_CHECK( !boost::numeric::odeint::same_size( a , b ) ); - -} - - - -BOOST_AUTO_TEST_CASE( compile_time_array ) -{ - typedef Eigen::Array< double , 1 , 1 > array_type; - array_type a , b; - BOOST_CHECK( boost::numeric::odeint::same_size( a , b ) ); -} - -BOOST_AUTO_TEST_CASE( runtime_array ) -{ - typedef Eigen::Array< double , Eigen::Dynamic , Eigen::Dynamic > array_type; - array_type a( 10 , 2 ) , b( 10 , 2 ); - BOOST_CHECK( boost::numeric::odeint::same_size( a , b ) ); -} - -BOOST_AUTO_TEST_CASE( fail_runtime_array ) -{ - typedef Eigen::Array< double , Eigen::Dynamic , Eigen::Dynamic > array_type; - array_type a( 11 , 2 ) , b( 10 , 2 ); - BOOST_CHECK( !boost::numeric::odeint::same_size( a , b ) ); - -} - - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test_external/gmp/Jamfile.v2 b/libs/numeric/odeint/test_external/gmp/Jamfile.v2 deleted file mode 100644 index f0e6af02c..000000000 --- a/libs/numeric/odeint/test_external/gmp/Jamfile.v2 +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 2012 Karsten Ahnert -# Copyright 2012 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) - -# bring in rules for testing - -import testing ; -use-project boost : $(BOOST_ROOT) ; - -project gmp - : requirements - /boost/test//boost_unit_test_framework - ; - - -lib libgmp : : gmp shared ; -lib libgmpxx : : gmpxx shared ; - -test-suite "gmp" - : - [ run check_gmp.cpp libgmpxx libgmp : : : shared:BOOST_TEST_DYN_LINK=1 ] - [ run gmp_integrate.cpp libgmpxx libgmp : : : shared:BOOST_TEST_DYN_LINK=1 ] - ; - - diff --git a/libs/numeric/odeint/test_external/gmp/check_gmp.cpp b/libs/numeric/odeint/test_external/gmp/check_gmp.cpp deleted file mode 100644 index 04b3e101d..000000000 --- a/libs/numeric/odeint/test_external/gmp/check_gmp.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* Boost check_gmp.cpp test file - - Copyright 2010-2012 Mario Mulansky - Copyright 2011-2012 Karsten Ahnert - - This file tests the odeint library with the gmp arbitrary precision types - - Distributed under the 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_TEST_MODULE odeint_gmp - -#include - -#include - -#include -#include - -#include - -#include -//#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -namespace mpl = boost::mpl; - -const int precision = 1024; - -typedef mpf_class value_type; -typedef mpf_class state_type; - -//provide min, max and pow functions for mpf types - required for controlled steppers -value_type min( const value_type a , const value_type b ) -{ - if( ab ) return a; - else return b; -} -value_type pow( const value_type a , const value_type b ) -{ - // do calculation in double precision - return value_type( std::pow( a.get_d() , b.get_d() ) ); -} - - -//provide vector_space reduce: - -namespace boost { namespace numeric { namespace odeint { - -template<> -struct vector_space_reduce< state_type > -{ - template< class Op > - state_type operator()( state_type x , Op op , state_type init ) const - { - init = op( init , x ); - return init; - } -}; - -} } } - - -void constant_system( const state_type &x , state_type &dxdt , value_type t ) -{ - dxdt = value_type( 1.0 , precision ); -} - - -/* check runge kutta stepers */ -typedef mpl::vector< - euler< state_type , value_type , state_type , value_type , vector_space_algebra > , - modified_midpoint< state_type , value_type , state_type , value_type , vector_space_algebra > , - runge_kutta4< state_type , value_type , state_type , value_type , vector_space_algebra > , - runge_kutta4_classic< state_type , value_type , state_type , value_type , vector_space_algebra > , - runge_kutta_cash_karp54_classic< state_type , value_type , state_type , value_type , vector_space_algebra > , - runge_kutta_cash_karp54< state_type , value_type , state_type , value_type , vector_space_algebra > , - runge_kutta_dopri5< state_type , value_type , state_type , value_type , vector_space_algebra > , - runge_kutta_fehlberg78< state_type , value_type , state_type , value_type , vector_space_algebra > - > stepper_types; - - -template< class Stepper > -struct perform_runge_kutta_test { - - void operator()( void ) - { - /* We have to specify the desired precision in advance! */ - mpf_set_default_prec( precision ); - - mpf_t eps_ , unity; - mpf_init( eps_ ); mpf_init( unity ); - mpf_set_d( unity , 1.0 ); - mpf_div_2exp( eps_ , unity , precision-1 ); // 2^(-precision+1) : smallest number that can be represented with used precision - value_type eps( eps_ ); - - Stepper stepper; - state_type x; - x = 0.0; - - stepper.do_step( constant_system , x , 0.0 , 0.1 ); - - BOOST_MESSAGE( eps ); - BOOST_CHECK_MESSAGE( abs( x - value_type( 0.1 , precision ) ) < eps , x - 0.1 ); - } -}; - - -BOOST_AUTO_TEST_CASE_TEMPLATE( runge_kutta_stepper_test , Stepper , stepper_types ) -{ - perform_runge_kutta_test< Stepper > tester; - tester(); -} - - -/* check controlled steppers */ -typedef mpl::vector< - controlled_runge_kutta< runge_kutta_cash_karp54_classic< state_type , value_type , state_type , value_type , vector_space_algebra > > , - controlled_runge_kutta< runge_kutta_dopri5< state_type , value_type , state_type , value_type , vector_space_algebra > > , - controlled_runge_kutta< runge_kutta_fehlberg78< state_type , value_type , state_type , value_type , vector_space_algebra > > , - bulirsch_stoer< state_type , value_type , state_type , value_type , vector_space_algebra > - > controlled_stepper_types; - - -template< class Stepper > -struct perform_controlled_test { - - void operator()( void ) - { - mpf_set_default_prec( precision ); - - mpf_t eps_ , unity; - mpf_init( eps_ ); mpf_init( unity ); - mpf_set_d( unity , 1.0 ); - mpf_div_2exp( eps_ , unity , precision-1 ); // 2^(-precision+1) : smallest number that can be represented with used precision - value_type eps( eps_ ); - - Stepper stepper; - state_type x; - x = 0.0; - - value_type t(0.0); - value_type dt(0.1); - - stepper.try_step( constant_system , x , t , dt ); - - BOOST_MESSAGE( eps ); - BOOST_CHECK_MESSAGE( abs( x - value_type( 0.1 , precision ) ) < eps , x - 0.1 ); - } -}; - -BOOST_AUTO_TEST_CASE_TEMPLATE( controlled_stepper_test , Stepper , controlled_stepper_types ) -{ - perform_controlled_test< Stepper > tester; - tester(); -} diff --git a/libs/numeric/odeint/test_external/gmp/gmp_integrate.cpp b/libs/numeric/odeint/test_external/gmp/gmp_integrate.cpp deleted file mode 100644 index 0a6be30b1..000000000 --- a/libs/numeric/odeint/test_external/gmp/gmp_integrate.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/* Boost check_gmp.cpp test file - - Copyright 2010-2012 Mario Mulansky - Copyright 2011-2012 Karsten Ahnert - - This file tests the odeint library with the gmp arbitrary precision types - - Distributed under the 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_TEST_MODULE odeint_gmp - -#include - -#include -#include - -#include - -#include -//#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -namespace mpl = boost::mpl; - -const int precision = 1024; - -typedef mpf_class value_type; -typedef mpf_class state_type; - -//provide min, max and pow functions for mpf types - required for controlled steppers -value_type min( const value_type a , const value_type b ) -{ - if( ab ) return a; - else return b; -} -value_type pow( const value_type a , const value_type b ) -{ - // do the calculation in double precision... - return value_type( std::pow( a.get_d() , b.get_d() ) ); -} - - -//provide vector_space reduce: - -namespace boost { namespace numeric { namespace odeint { - -template<> -struct vector_space_reduce< state_type > -{ - template< class Op > - state_type operator()( state_type x , Op op , state_type init ) const - { - init = op( init , x ); - return init; - } -}; - -} } } - - -void constant_system( const state_type &x , state_type &dxdt , value_type t ) -{ - dxdt = value_type( 1.0 , precision ); -} - -/* check runge kutta stepers */ -typedef mpl::vector< - euler< state_type , value_type , state_type , value_type , vector_space_algebra > , - modified_midpoint< state_type , value_type , state_type , value_type , vector_space_algebra > , - runge_kutta4< state_type , value_type , state_type , value_type , vector_space_algebra > , - runge_kutta4_classic< state_type , value_type , state_type , value_type , vector_space_algebra > , - runge_kutta_cash_karp54_classic< state_type , value_type , state_type , value_type , vector_space_algebra > , - runge_kutta_cash_karp54< state_type , value_type , state_type , value_type , vector_space_algebra > , - runge_kutta_dopri5< state_type , value_type , state_type , value_type , vector_space_algebra > , - runge_kutta_fehlberg78< state_type , value_type , state_type , value_type , vector_space_algebra > - > stepper_types; - - -template< class Stepper > -struct perform_integrate_const_test { - - void operator()( void ) - { - /* We have to specify the desired precision in advance! */ - mpf_set_default_prec( precision ); - - mpf_t eps_ , unity; - mpf_init( eps_ ); mpf_init( unity ); - mpf_set_d( unity , 1.0 ); - mpf_div_2exp( eps_ , unity , precision-1 ); // 2^(-precision+1) : smallest number that can be represented with used precision - value_type eps( eps_ ); - - Stepper stepper; - state_type x; - x = 0.0; - value_type t0( 0.0 ); - value_type tend( 1.0 ); - value_type dt(0.1); - - integrate_const( stepper , constant_system , x , t0 , tend , dt ); - - x = 0.0; - t0 = 0.0; - dt = 0.1; - size_t steps = 10; - - integrate_n_steps( stepper , constant_system , x , t0 , dt , steps ); - - BOOST_CHECK_MESSAGE( abs( x - 10*dt ) < eps , x ); - } -}; - - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_const_test , Stepper , stepper_types ) -{ - perform_integrate_const_test< Stepper > tester; - tester(); -} - - -typedef mpl::vector< - controlled_runge_kutta< runge_kutta_cash_karp54_classic< state_type , value_type , state_type , value_type , vector_space_algebra > > , - controlled_runge_kutta< runge_kutta_dopri5< state_type , value_type , state_type , value_type , vector_space_algebra > > , - controlled_runge_kutta< runge_kutta_fehlberg78< state_type , value_type , state_type , value_type , vector_space_algebra > > , - bulirsch_stoer< state_type , value_type , state_type , value_type , vector_space_algebra > - > controlled_stepper_types; - - -template< class Stepper > -struct perform_integrate_adaptive_test { - - void operator()( void ) - { - mpf_set_default_prec( precision ); - - mpf_t eps_ , unity; - mpf_init( eps_ ); mpf_init( unity ); - mpf_set_d( unity , 1.0 ); - mpf_div_2exp( eps_ , unity , precision-1 ); // 2^(-precision+1) : smallest number that can be represented with used precision - value_type eps( eps_ ); - - Stepper stepper; - state_type x; - x = 0.0; - value_type t0( 0.0 ); - value_type tend( 1.0 ); - value_type dt(0.1); - - integrate_adaptive( stepper , constant_system , x , t0 , tend , dt ); - - BOOST_CHECK_MESSAGE( abs( x - tend ) < eps , x - 0.1 ); - } -}; - -BOOST_AUTO_TEST_CASE_TEMPLATE( integrate_adaptive__test , Stepper , controlled_stepper_types ) -{ - perform_integrate_adaptive_test< Stepper > tester; - tester(); -} diff --git a/libs/numeric/odeint/test_external/gsl/Jamfile.v2 b/libs/numeric/odeint/test_external/gsl/Jamfile.v2 deleted file mode 100644 index 086edf6ea..000000000 --- a/libs/numeric/odeint/test_external/gsl/Jamfile.v2 +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2012 Karsten Ahnert -# Copyright 2012 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) - -# bring in rules for testing - -import testing ; -use-project boost : $(BOOST_ROOT) ; - -project - : requirements - /boost/test//boost_unit_test_framework - ; - - -lib libgsl : : gsl shared ; -lib libgslcblas : : gslcblas shared ; - -test-suite "gsl" - : - [ run check_gsl.cpp libgslcblas libgsl - : - : - : shared:BOOST_TEST_DYN_LINK=1 - ] - ; - diff --git a/libs/numeric/odeint/test_external/gsl/check_gsl.cpp b/libs/numeric/odeint/test_external/gsl/check_gsl.cpp deleted file mode 100644 index 3e7856dd2..000000000 --- a/libs/numeric/odeint/test_external/gsl/check_gsl.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* Boost check_gmp.cpp test file - - Copyright 2010-2011 Karsten Ahnert - Copyright 2011 Mario Mulansky - - This file tests the odeint library with the gmp arbitrary precision types - - Distributed under the 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_TEST_MODULE odeint_gsl - -#include -#include -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef gsl_vector *state_type; - -const double sigma = 10.0; -const double R = 28.0; -const double b = 8.0 / 3.0; - -void lorenz( const state_type x , state_type dxdt , double t ) -{ - gsl_vector_set( dxdt , 0 , sigma * ( gsl_vector_get(x , 1 ) - gsl_vector_get( x , 0 ) ) ); - gsl_vector_set( dxdt , 1 , R * gsl_vector_get( x , 0 ) - gsl_vector_get( x , 1 ) - gsl_vector_get( x , 0 ) * gsl_vector_get( x , 2) ); - gsl_vector_set( dxdt , 2 , gsl_vector_get( x , 0 ) * gsl_vector_get( x , 1 ) - b * gsl_vector_get( x , 2) ); -} - -BOOST_AUTO_TEST_CASE( gsl ) -{ - euler< state_type > euler; - - state_type x = gsl_vector_alloc( 3 ); - - // check resizing - state_type y = 0; - boost::numeric::odeint::resize( y , x ); - BOOST_CHECK( 0 != y ); - - gsl_vector_set( x , 0 , 1.0); - gsl_vector_set( x , 1 , 1.0); - gsl_vector_set( x , 2 , 2.0); - - euler.do_step( lorenz , x , 0.0 , 0.1 ); - - //cout << gsl_vector_get( x , 0 ) << " " << gsl_vector_get( x , 1 ) << " " << gsl_vector_get( x , 2 ) << endl; - - gsl_vector_free( x ); - -} diff --git a/libs/numeric/odeint/test_external/mkl/Jamfile.v2 b/libs/numeric/odeint/test_external/mkl/Jamfile.v2 deleted file mode 100644 index f585fa83d..000000000 --- a/libs/numeric/odeint/test_external/mkl/Jamfile.v2 +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2012 Karsten Ahnert -# Copyright 2012 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) - -# bring in rules for testing - -import testing ; -use-project boost : $(BOOST_ROOT) ; - -project - : requirements - /boost/test//boost_unit_test_framework - ; - - -lib libmkl : : mkl_intel_lp64 shared ; -lib libmkl_core : : mkl_core shared ; -lib libmkl_intel_thread : : mkl_intel_thread ; -lib libiomp5 : : iomp5 ; -lib libpthread : : pthread ; - -test-suite "mkl" - : - [ run check_mkl.cpp libpthread libiomp5 libmkl_core libmkl_intel_thread libmkl - : - : - : shared:BOOST_TEST_DYN_LINK=1 - ] - ; diff --git a/libs/numeric/odeint/test_external/mkl/check_mkl.cpp b/libs/numeric/odeint/test_external/mkl/check_mkl.cpp deleted file mode 100644 index bedbd66de..000000000 --- a/libs/numeric/odeint/test_external/mkl/check_mkl.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* Boost check_mkl.cpp test file - - Copyright 2010-2011 Mario Mulansky - Copyright 2011 Karsten Ahnert - - This file tests the odeint library with the intel mkl blas1 routines - - Distributed under the 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_TEST_MODULE test_mkl - -#include - -#include -#include -#include -#include - -using namespace boost::numeric::odeint; - -typedef double value_type; -typedef boost::array< value_type , 1 > state_type; - - -void constant_system( state_type &x , state_type &dxdt , value_type t ) -{ - dxdt[0] = 1.0; -} - -const double eps = 1E-14; - - -BOOST_AUTO_TEST_CASE( test_mkl ) -{ - - //to use mkl routines we have to use the vector_space_algebra and the mkl_operations - runge_kutta4< state_type , value_type , state_type , value_type , vector_space_algebra , mkl_operations > stepper; - state_type x; - x[0] = 0.0; - - stepper.do_step( constant_system , x , 0.0 , 0.1 ); - - using std::abs; - - std::cout << x[0] << " ?= " << 0.1 << std::endl; - BOOST_CHECK_SMALL( abs( x[0] - 0.1 ) , eps ); - -} diff --git a/libs/numeric/odeint/test_external/mpi/Jamfile.v2 b/libs/numeric/odeint/test_external/mpi/Jamfile.v2 deleted file mode 100644 index 0a02bccff..000000000 --- a/libs/numeric/odeint/test_external/mpi/Jamfile.v2 +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2012 Karsten Ahnert -# Copyright 2012-2013 Mario Mulansky -# Copyright 2013 Pascal Germroth -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -import testing ; -import mpi : mpi-test ; - -use-project boost : $(BOOST_ROOT) ; - -project - : requirements - /boost/test//boost_unit_test_framework - /boost//mpi - static - BOOST_ALL_NO_LIB=1 - ; - -# mpi-test name : source : req : np=1 2 3 4 7 8 13 17 -test-suite "odeint-mpi" - : - [ mpi-test split_test ] - [ mpi-test state_test ] - [ mpi-test norm_test ] - ; - diff --git a/libs/numeric/odeint/test_external/mpi/norm_test.cpp b/libs/numeric/odeint/test_external/mpi/norm_test.cpp deleted file mode 100644 index 69f1d4065..000000000 --- a/libs/numeric/odeint/test_external/mpi/norm_test.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/* - Copyright 2013 Karsten Ahnert - Copyright 2013 Mario Mulansky - Copyright 2013 Pascal Germroth - - Distributed under the 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 -#include -#include - -#define BOOST_TEST_MODULE odeint_mpi -#include - -#include - -using namespace boost::numeric::odeint; - -boost::mpi::environment env; - -BOOST_AUTO_TEST_SUITE( norm_test_suite ) - -BOOST_AUTO_TEST_CASE( norm_test ) -{ - boost::mpi::communicator world; - - int ref_value = 0; - std::vector in_data; - mpi_state< std::vector > state(world); - - // generate data and reference value on master - if(world.rank() == 0) { - for(size_t i = 0 ; i < 400 ; i++) - in_data.push_back( rand() % 10000 ); - ref_value = *std::max_element(in_data.begin(), in_data.end()); - } - boost::mpi::broadcast(world, ref_value, 0); - - // copy to nodes - split( in_data, state ); - - int value = mpi_nested_algebra< range_algebra >::norm_inf( state ); - - { - std::ostringstream ss; - ss << "state[" << world.rank() << "]" - << " local:" << range_algebra::norm_inf( state() ) - << " global:" << value - << " ref:" << ref_value << "\n"; - std::clog << ss.str() << std::flush; - } - - BOOST_REQUIRE_EQUAL( value, ref_value ); -} - - -BOOST_AUTO_TEST_SUITE_END() - - diff --git a/libs/numeric/odeint/test_external/mpi/split_test.cpp b/libs/numeric/odeint/test_external/mpi/split_test.cpp deleted file mode 100644 index f78a60149..000000000 --- a/libs/numeric/odeint/test_external/mpi/split_test.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/* - Copyright 2013 Karsten Ahnert - Copyright 2013 Mario Mulansky - Copyright 2013 Pascal Germroth - - Distributed under the 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 -#include - -#define BOOST_TEST_MODULE odeint_mpi -#include - -#include - -using namespace boost::numeric::odeint; - -boost::mpi::environment env; - -BOOST_AUTO_TEST_SUITE( split_test_suite ) - -BOOST_AUTO_TEST_CASE( split_test ) -{ - boost::mpi::communicator world; - - const size_t total_size = 31; - - std::vector in_data, out_data; - mpi_state< std::vector > state(world); - - // generate data on master - if(world.rank() == 0) - for(size_t i = 0 ; i < total_size ; i++) in_data.push_back(i); - - // copy to nodes - split( in_data, state ); - - BOOST_REQUIRE((state().size() == total_size / world.size()) - || (state().size() == total_size / world.size() + 1)); - - { - std::ostringstream ss; - ss << "state[" << world.rank() << "].data = {"; - std::copy(state().begin(), state().end(), std::ostream_iterator(ss, ", ")); - ss << "}\n"; - std::clog << ss.str() << std::flush; - } - - // copy back to master - if(world.rank() == 0) out_data.resize(in_data.size()); - unsplit( state, out_data ); - - if(world.rank() == 0) - BOOST_REQUIRE_EQUAL_COLLECTIONS(in_data.begin(), in_data.end(), out_data.begin(), out_data.end()); -} - - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test_external/mpi/state_test.cpp b/libs/numeric/odeint/test_external/mpi/state_test.cpp deleted file mode 100644 index 490b46e0d..000000000 --- a/libs/numeric/odeint/test_external/mpi/state_test.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - Copyright 2013 Karsten Ahnert - Copyright 2013 Mario Mulansky - Copyright 2013 Pascal Germroth - - Distributed under the 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 -#include - -#define BOOST_TEST_MODULE odeint_mpi -#include - -#include - -using namespace boost::numeric::odeint; - -boost::mpi::environment env; - -BOOST_AUTO_TEST_SUITE( state_test_suite ) - -BOOST_AUTO_TEST_CASE( state_test ) -{ - boost::mpi::communicator world; - - std::vector in_data1, in_data2; - mpi_state< std::vector > state1(world), state2(world); - - // generate data on master - if(world.rank() == 0) { - in_data1.resize(31); - in_data2.resize(33); - for(size_t i = 0 ; i < in_data2.size() ; i++) - in_data2[i] = i; - } - - // copy to nodes - split( in_data1, state1 ); - split( in_data2, state2 ); - - { - std::ostringstream ss; - ss << "state[" << world.rank() << "] {" - << state1().size() << ", " - << state2().size() << "}\n"; - std::clog << ss.str() << std::flush; - } - - // compare size - BOOST_REQUIRE( !same_size( state1, state2 ) ); - - // resize state1 to match state2. - resize( state1, state2 ); - - { - std::ostringstream ss; - ss << "state[" << world.rank() << "] 1:" - << state1().size() << " 2:" - << state2().size() << "\n"; - std::clog << ss.str() << std::flush; - } - - // compare size - BOOST_REQUIRE( same_size( state1, state2 ) ); - - // copy state2 to state1 - copy( state2, state1 ); - - BOOST_REQUIRE_EQUAL_COLLECTIONS(state1().begin(), state1().end(), - state2().begin(), state2().end()); -} - - -BOOST_AUTO_TEST_SUITE_END() - diff --git a/libs/numeric/odeint/test_external/mtl4/Jamfile.v2 b/libs/numeric/odeint/test_external/mtl4/Jamfile.v2 deleted file mode 100644 index de9d87f2c..000000000 --- a/libs/numeric/odeint/test_external/mtl4/Jamfile.v2 +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2012 Karsten Ahnert -# Copyright 2013 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) - -import testing ; -import boost ; - -# boost.use-project ; -use-project boost : $(BOOST_ROOT) ; - -# set your MTL4 directory here -MTL4_INCLUDE = /home/mario/MTL4/usr/include ; - -project - : requirements - /boost/test//boost_unit_test_framework - $(MTL4_INCLUDE) - BOOST_ALL_NO_LIB=1 - static - : - : default-build release - ; - -test-suite "odeint-mtl4" - : - [ run mtl4_resize.cpp ] - : valgrind - ; diff --git a/libs/numeric/odeint/test_external/mtl4/mtl4_resize.cpp b/libs/numeric/odeint/test_external/mtl4/mtl4_resize.cpp deleted file mode 100644 index 7ef985d3d..000000000 --- a/libs/numeric/odeint/test_external/mtl4/mtl4_resize.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* Boost mtl4_resize.cpp test file - - Copyright 2012 Karsten Ahnert - Copyright 2012 Mario Mulansky - - This file tests the odeint library with the mtl4 routines. - - Distributed under the 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_TEST_MODULE test_mtl4_resize - -#include - -#include -#include - -namespace odeint = boost::numeric::odeint; - - -BOOST_AUTO_TEST_CASE( test_dense_vector_resizeability ) -{ - BOOST_CHECK( odeint::is_resizeable< mtl::dense_vector< double > >::value ); -} - -BOOST_AUTO_TEST_CASE( test_dense2D_resizeability ) -{ - BOOST_CHECK( odeint::is_resizeable< mtl::dense2D< double > >::value ); -} - -BOOST_AUTO_TEST_CASE( test_compressed2D_resizeability ) -{ - BOOST_CHECK( odeint::is_resizeable< mtl::compressed2D< double > >::value ); -} - - - -BOOST_AUTO_TEST_CASE( test_dense_vector_vector_same_size ) -{ - mtl::dense_vector< double > v1( 10 ) , v2( 10 ); - BOOST_CHECK( odeint::same_size( v2 , v1 ) ); -} - -BOOST_AUTO_TEST_CASE( test_dense_vector_dense2D_same_size ) -{ - mtl::dense_vector< double > v( 10 ); - mtl::dense2D< double > m( 10 , 10 ); - BOOST_CHECK( odeint::same_size( m , v ) ); -} - -BOOST_AUTO_TEST_CASE( test_dense_vector_compressed2D_same_size ) -{ - mtl::dense_vector< double > v( 10 ); - mtl::compressed2D< double > m( 10 , 10 ); - BOOST_CHECK( odeint::same_size( m , v ) ); -} - - - - -BOOST_AUTO_TEST_CASE( test_dense_vector_vector_resize ) -{ - mtl::dense_vector< double > v1( 10 ); - mtl::dense_vector< double > v2; - odeint::resize( v2 , v1 ); - BOOST_CHECK( mtl::size( v2 ) == mtl::size( v1 ) ); -} - -BOOST_AUTO_TEST_CASE( test_dense_vector_dense2D_resize ) -{ - mtl::dense_vector< double > v( 10 ); - mtl::dense2D< double > m; - - odeint::resize( m , v ); - BOOST_CHECK( m.num_cols() == mtl::size( v ) ); - BOOST_CHECK( m.num_rows() == mtl::size( v ) ); -} - -BOOST_AUTO_TEST_CASE( test_dense_vector_compressed2D_resize ) -{ - mtl::dense_vector< double > v( 10 ); - mtl::compressed2D< double > m; - - odeint::resize( m , v ); - BOOST_CHECK( m.num_cols() == mtl::size( v ) ); - BOOST_CHECK( m.num_rows() == mtl::size( v ) ); -} diff --git a/libs/numeric/odeint/test_external/nt2/Jamfile.v2 b/libs/numeric/odeint/test_external/nt2/Jamfile.v2 deleted file mode 100644 index 26763da6e..000000000 --- a/libs/numeric/odeint/test_external/nt2/Jamfile.v2 +++ /dev/null @@ -1,44 +0,0 @@ -#============================================================================== -# Copyright 2014 LRI UMR 8623 CNRS/Univ Paris Sud XI -# Copyright 2014 NumScale SAS -# -# Distributed under the Boost Software License, Version 1.0. -# See accompanying file LICENSE.txt or copy at -# http://www.boost.org/LICENSE_1_0.txt -#============================================================================== - -import testing ; -import os ; - -# This must be built using an NT2 installation. -# NT2_ROOT_PATH should point to the build directory. -# Currently, cxxflags needs to be set to the required architecture -# if using avx/avx2, set the environemnt variable NT2_SIMD_FLAGS to the -# required value for your compiler (i.e. -mavx2 on g++) -# If using sse2/3/4 in 64 bits, this is set automatically. - -local NT2_ROOT_PATH = [ os.environ NT2_ROOT_PATH ] ; -local NT2_SIMD_FLAGS = [ os.environ NT2_SIMD_FLAGS ] ; - -use-project boost : $(BOOST_ROOT) ; - -project - : requirements - $(BOOST_ROOT)/boost/test/included/unit_test_framework.hpp - BOOST_ALL_NO_LIB=1 - $(NT2_ROOT_PATH)/include/ - static - gcc:-DBOOST_SIMD_NO_STRICT_ALIASING - gcc:-fno-strict-aliasing - $(NT2_SIMD_FLAGS) - ; - -test-suite "odeint" - : - [ run copy.cpp ] - [ run norm_inf.cpp ] - [ run resize.cpp ] - [ run is_resizeable.cpp ] - [ run algebra_dispatcher.cpp ] - : valgrind - ; diff --git a/libs/numeric/odeint/test_external/nt2/algebra_dispatcher.cpp b/libs/numeric/odeint/test_external/nt2/algebra_dispatcher.cpp deleted file mode 100644 index bea6349eb..000000000 --- a/libs/numeric/odeint/test_external/nt2/algebra_dispatcher.cpp +++ /dev/null @@ -1,55 +0,0 @@ -//============================================================================== -// Copyright 2014 LRI UMR 8623 CNRS/Univ Paris Sud XI -// Copyright 2014 NumScale SAS -// -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt -//============================================================================== -#define BOOST_TEST_MODULE odeint_nt2_algebra_dispatcher - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef boost::mpl::list< float , double > fp_types; - -#define TABLE(z,n,text) nt2::table y ## n = \ - nt2::ones(1,2,nt2::meta::as_() )*T(BOOST_PP_ADD(n,1)); - -#define PARAMS(z,n,text) T(BOOST_PP_ADD(n,1)), - -#define SUM(z,n,text) +BOOST_PP_MUL(BOOST_PP_ADD(n,3),BOOST_PP_ADD(n,2)) - -#define TEST(z,n,text) BOOST_CHECK_SMALL( y0(BOOST_PP_ADD(n,1)) \ - -T( 2 BOOST_PP_REPEAT(text, SUM, text) ), T(1e-10) ); - -#define TEST_CASE(z,n,text) BOOST_AUTO_TEST_CASE_TEMPLATE ( \ - BOOST_PP_CAT(odeint_foreach, n), T, fp_types ) \ -{ \ - vector_space_algebra algebra; \ - BOOST_PP_REPEAT(BOOST_PP_ADD(n,2),TABLE,tt) \ - BOOST_PP_CAT(algebra.for_each,BOOST_PP_ADD(n,2))( \ - BOOST_PP_ENUM_PARAMS(BOOST_PP_ADD(n,2),y), default_operations:: \ - BOOST_PP_CAT(scale_sum,BOOST_PP_ADD(n,1)) ( \ - BOOST_PP_REPEAT(n, PARAMS, text ) T(BOOST_PP_ADD(n,1)))); \ - BOOST_PP_REPEAT(2,TEST,n) \ -} - -BOOST_AUTO_TEST_SUITE( nt2_algebra ) - -BOOST_PP_REPEAT(7,TEST_CASE,dummy) - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test_external/nt2/copy.cpp b/libs/numeric/odeint/test_external/nt2/copy.cpp deleted file mode 100644 index 841728efc..000000000 --- a/libs/numeric/odeint/test_external/nt2/copy.cpp +++ /dev/null @@ -1,44 +0,0 @@ -//============================================================================== -// Copyright 2014 LRI UMR 8623 CNRS/Univ Paris Sud XI -// Copyright 2014 NumScale SAS -// -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt -//============================================================================== -#include -#include -#include - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_nt2_copy - -#include -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef boost::mpl::list< float , double > fp_types; - -BOOST_AUTO_TEST_SUITE( nt2_copy ) - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_copy, T, fp_types ) -{ - nt2::table x = nt2::linspace(T(1),T(0),7); - - nt2::table y; - - copy(y,x); - - for (std::size_t ii=1; ii<=x.size();ii++) - BOOST_CHECK_EQUAL(x(ii),y(ii)); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test_external/nt2/is_resizeable.cpp b/libs/numeric/odeint/test_external/nt2/is_resizeable.cpp deleted file mode 100644 index 10ecdbb56..000000000 --- a/libs/numeric/odeint/test_external/nt2/is_resizeable.cpp +++ /dev/null @@ -1,36 +0,0 @@ -//============================================================================== -// Copyright 2014 LRI UMR 8623 CNRS/Univ Paris Sud XI -// Copyright 2014 NumScale SAS -// -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt -//============================================================================== -#include -#include - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_nt2_resize - -#include -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef boost::mpl::list< float , double > fp_types; - -BOOST_AUTO_TEST_SUITE( nt2_is_resizeable ) - -BOOST_AUTO_TEST_CASE_TEMPLATE( is_resizeable, T, fp_types ) -{ - BOOST_STATIC_ASSERT(( boost::numeric::odeint::is_resizeable< nt2::table >::value )); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test_external/nt2/norm_inf.cpp b/libs/numeric/odeint/test_external/nt2/norm_inf.cpp deleted file mode 100644 index 1e1206164..000000000 --- a/libs/numeric/odeint/test_external/nt2/norm_inf.cpp +++ /dev/null @@ -1,46 +0,0 @@ -//============================================================================== -// Copyright 2014 LRI UMR 8623 CNRS/Univ Paris Sud XI -// Copyright 2014 NumScale SAS -// -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt -//============================================================================== -#include -#include -#include -#include - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_nt2_copy - -#include -#include -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef boost::mpl::list< float , double > fp_types; - -BOOST_AUTO_TEST_SUITE( nt2_norm_inf ) - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_norm_inf, T, fp_types ) -{ - nt2::table x = nt2::ones(10,1, nt2::meta::as_() ); - x(4) = 55; - - nt2::table y = nt2::zeros(8,8, nt2::meta::as_() ); - y(6,4) = -42; - - BOOST_CHECK_SMALL(vector_space_norm_inf >()(x) - T(55), T(1e-10)); - BOOST_CHECK_SMALL(vector_space_norm_inf >()(y) - T(42), T(1e-10)); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test_external/nt2/resize.cpp b/libs/numeric/odeint/test_external/nt2/resize.cpp deleted file mode 100644 index 56d7ce4a6..000000000 --- a/libs/numeric/odeint/test_external/nt2/resize.cpp +++ /dev/null @@ -1,45 +0,0 @@ -//============================================================================== -// Copyright 2014 LRI UMR 8623 CNRS/Univ Paris Sud XI -// Copyright 2014 NumScale SAS -// -// Distributed under the Boost Software License, Version 1.0. -// See accompanying file LICENSE.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt -//============================================================================== -#include -#include - -#include -#ifdef BOOST_MSVC - #pragma warning(disable:4996) -#endif - -#define BOOST_TEST_MODULE odeint_nt2_resize - -#include -#include - -#include - -using namespace boost::unit_test; -using namespace boost::numeric::odeint; - -typedef boost::mpl::list< float , double > fp_types; - -BOOST_AUTO_TEST_SUITE( nt2_resize ) - -BOOST_AUTO_TEST_CASE_TEMPLATE( test_resize, T, fp_types ) -{ - nt2::table x; - x.resize(nt2::of_size(10,10)); - - nt2::table y; - - BOOST_CHECK_EQUAL(same_size(x,y),false); - - resize(y,x); - - BOOST_CHECK_EQUAL(same_size(x,y),true); -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/libs/numeric/odeint/test_external/thrust/Makefile b/libs/numeric/odeint/test_external/thrust/Makefile deleted file mode 100644 index 49d9cd71a..000000000 --- a/libs/numeric/odeint/test_external/thrust/Makefile +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright 2010-2014 Mario Mulansky -# Copyright 2010-2012 Karsten Ahnert -# -# Distributed under the Boost Software License, Version 1.0. -# (See accompanying file LICENSE_1_0.txt or -# copy at http://www.boost.org/LICENSE_1_0.txt) - -# make sure BOOST_ROOT is pointing to your boost directory -# otherwise, set it here: -# BOOST_ROOT = /path/to/boost - -# path to the cuda installation -CUDA_ROOT = /usr/local/cuda -# target architecture -ARCH = sm_13 - -NVCC = $(CUDA_ROOT)/bin/nvcc - -INCLUDES += -I../../include/ -I$(BOOST_ROOT) - -NVCCFLAGS = -O3 $(INCLUDES) -arch $(ARCH) - -%.o : %.cu - $(NVCC) $(NVCCFLAGS) -c $< -o $@ - -% : %.o - $(NVCC) $(NVCCFLAGS) -o $@ $< - - -all : check_thrust - - -clean : - -rm *~ *.o check_thrust diff --git a/libs/numeric/odeint/test_external/thrust/check_thrust.cu b/libs/numeric/odeint/test_external/thrust/check_thrust.cu deleted file mode 100644 index 3623c3721..000000000 --- a/libs/numeric/odeint/test_external/thrust/check_thrust.cu +++ /dev/null @@ -1,72 +0,0 @@ -/* Boost check_thrust.cu test file - - Copyright 2010-2013 Mario Mulansky - Copyright 2010-2011 Karsten Ahnert - - This file tests the use of the euler stepper - - Distributed under the 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 - -#include -#include - -#include -#include - -using namespace boost::numeric::odeint; - -typedef float base_type; -// typedef thrust::device_vector< base_type > state_type; -typedef thrust::host_vector< base_type > state_type; - -void constant_system( const state_type &x , state_type &dxdt , base_type t ) -{ - thrust::fill( dxdt.begin() , dxdt.end() , static_cast(1.0) ); -} - -const base_type eps = 1.0e-7; - - -template< class Stepper , class System > -void check_stepper_concept( Stepper &stepper , System system , typename Stepper::state_type &x ) -{ - typedef Stepper stepper_type; - typedef typename stepper_type::state_type container_type; - typedef typename stepper_type::order_type order_type; - typedef typename stepper_type::time_type time_type; - - stepper.do_step( system , x , 0.0 , 0.1 ); - base_type xval = *boost::begin( x ); - if( fabs( xval - 0.1 ) < eps ) - std::clog << "TEST PASSED" << std::endl; - else - std::clog << "TEST FAILED" << std::endl; -} - -void test_euler_with_thrust( void ) -{ - state_type x(1); - thrust::fill( x.begin() , x.end() , static_cast(0.0) ); - euler< state_type , base_type , state_type , base_type > euler; - check_stepper_concept( euler , constant_system , x ); - - -} - -/*test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - test_suite *test = BOOST_TEST_SUITE("check stepper with thrust"); - - test->add( BOOST_TEST_CASE( &test_euler_with_thrust ) ); - - return test; -}*/ - -int main() { - test_euler_with_thrust(); -} diff --git a/libs/numeric/odeint/test_external/vexcl/Jamfile.v2 b/libs/numeric/odeint/test_external/vexcl/Jamfile.v2 deleted file mode 100644 index 9b76b4305..000000000 --- a/libs/numeric/odeint/test_external/vexcl/Jamfile.v2 +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2012 Karsten Ahnert -# Copyright 2013 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) - -# bring in rules for testing - - -import testing ; - -use-project boost : $(BOOST_ROOT) ; -VEXCL_INCLUDE = /home/karsten/boost/testing/vexcl ; -OPENCL_INCLUDE = /usr/local/cuda/include ; -#OPENCL_INCLUDE = /usr/include ; - -project - : requirements - /boost/test//boost_unit_test_framework - BOOST_ALL_NO_LIB=1 - $(VEXCL_INCLUDE) - $(OPENCL_INCLUDE) - -std=c++0x - /boost//system/ - ; - -lib OpenCL : : OpenCL shared ; - -test-suite "odeint" - : - [ run lorenz.cpp OpenCL ] - [ run norm_inf.cpp OpenCL ] - : valgrind - : - : shared:BOOST_TEST_DYN_LINK=1 - ; \ No newline at end of file diff --git a/libs/numeric/odeint/test_external/vexcl/lorenz.cpp b/libs/numeric/odeint/test_external/vexcl/lorenz.cpp deleted file mode 100644 index 6bde91f68..000000000 --- a/libs/numeric/odeint/test_external/vexcl/lorenz.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* Boost lorenz.cpp test file - - Copyright 2012 Karsten Ahnert - Copyright 2012 Mario Mulansky - - This file tests the odeint library with the vexcl types - - Distributed under the 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_TEST_MODULE odeint_vexcl - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -using namespace boost::unit_test; -namespace odeint = boost::numeric::odeint; - - -typedef vex::vector< double > vector_type; -typedef vex::multivector< double, 3 > state_type; - - - -const double sigma = 10.0; -const double b = 8.0 / 3.0; - -struct sys_func -{ - const vector_type &R; - - sys_func( const vector_type &_R ) : R( _R ) { } - - void operator()( const state_type &x , state_type &dxdt , double t ) const - { - dxdt(0) = -sigma * ( x(0) - x(1) ); - dxdt(1) = R * x(0) - x(1) - x(0) * x(2); - dxdt(2) = - b * x(2) + x(0) * x(1); - } -}; - -const size_t n = 1024 ; -const double dt = 0.01; -const double t_max = 1.0; - - -BOOST_AUTO_TEST_CASE( integrate_const_rk4 ) -{ - vex::Context ctx( vex::Filter::Type(CL_DEVICE_TYPE_GPU) ); - - double Rmin = 0.1 , Rmax = 50.0 , dR = ( Rmax - Rmin ) / double( n - 1 ); - std::vector x( n * 3 ) , r( n ); - for( size_t i=0 ; i stepper; - - odeint::integrate_const( stepper , sys_func( R ) , X , 0.0 , t_max , dt ); - - std::vector< double > res( 3 * n ); - vex::copy( X(0) , res ); - std::cout << res[0] << std::endl; -} - -BOOST_AUTO_TEST_CASE( integrate_const_controlled_rk54 ) -{ - vex::Context ctx( vex::Filter::Type(CL_DEVICE_TYPE_GPU) ); - - double Rmin = 0.1 , Rmax = 50.0 , dR = ( Rmax - Rmin ) / double( n - 1 ); - std::vector x( n * 3 ) , r( n ); - for( size_t i=0 ; i stepper_type; - typedef odeint::controlled_runge_kutta< stepper_type > controlled_stepper_type; - - odeint::integrate_const( controlled_stepper_type() , sys_func( R ) , X , 0.0 , t_max , dt ); - - std::vector< double > res( 3 * n ); - vex::copy( X(0) , res ); - std::cout << res[0] << std::endl; -} - -BOOST_AUTO_TEST_CASE( integrate_const_dense_output_dopri5 ) -{ - vex::Context ctx( vex::Filter::Type(CL_DEVICE_TYPE_GPU) ); - - double Rmin = 0.1 , Rmax = 50.0 , dR = ( Rmax - Rmin ) / double( n - 1 ); - std::vector x( n * 3 ) , r( n ); - for( size_t i=0 ; i stepper_type; - typedef odeint::controlled_runge_kutta< stepper_type > controlled_stepper_type; - typedef odeint::dense_output_runge_kutta< controlled_stepper_type > dense_output_stepper_type; - - odeint::integrate_const( dense_output_stepper_type() , sys_func( R ) , X , 0.0 , t_max , dt ); - - std::vector< double > res( 3 * n ); - vex::copy( X(0) , res ); - std::cout << res[0] << std::endl; -} - - - diff --git a/libs/numeric/odeint/test_external/vexcl/norm_inf.cpp b/libs/numeric/odeint/test_external/vexcl/norm_inf.cpp deleted file mode 100644 index 71481d296..000000000 --- a/libs/numeric/odeint/test_external/vexcl/norm_inf.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#define BOOST_TEST_MODULE odeint_vexcl_norm_inf - -#include -#include - -template -double norm(const T &x) { - return boost::numeric::odeint::vector_space_norm_inf()(x); -} - -BOOST_AUTO_TEST_CASE( norm_inf ) -{ - vex::Context ctx(vex::Filter::Env); - std::cout << ctx << std::endl; - - vex::vector x(ctx, 1024); - x = 41; - - vex::multivector y(ctx, 1024); - y = 42; - - BOOST_CHECK_EQUAL( norm(x), 41 ); - BOOST_CHECK_EQUAL( norm(y), 42 ); -} - diff --git a/libs/numeric/odeint/toolset.jam.patch b/libs/numeric/odeint/toolset.jam.patch deleted file mode 100644 index dca997d5a..000000000 --- a/libs/numeric/odeint/toolset.jam.patch +++ /dev/null @@ -1,61 +0,0 @@ -diff --git a/src/build/toolset.jam b/src/build/toolset.jam -index b5defd5..a942cd9 100644 ---- a/src/build/toolset.jam -+++ b/src/build/toolset.jam -@@ -17,6 +17,8 @@ import regex ; - import sequence ; - import set ; - import property-set ; -+import order ; -+import "class" : new ; - - - .flag-no = 1 ; -@@ -237,6 +239,7 @@ rule handle-flag-value ( value * : properties * ) - if $(value:G) - { - local matches = [ property.select $(value) : $(properties) ] ; -+ local order ; - for local p in $(matches) - { - local att = [ feature.attributes $(p:G) ] ; -@@ -263,11 +266,24 @@ rule handle-flag-value ( value * : properties * ) - } - if path in $(att) - { -- result += [ sequence.transform path.native : $(values) ] ; -+ values = [ sequence.transform path.native : $(values) ] ; - } -- else -+ result += $(values) ; -+ if $(values[2]) - { -- result += $(values) ; -+ if ! $(order) -+ { -+ order = [ new order ] ; -+ } -+ local prev ; -+ for local v in $(values) -+ { -+ if $(prev) -+ { -+ $(order).add-pair $(prev) $(v) ; -+ } -+ prev = $(v) ; -+ } - } - } - else -@@ -275,6 +291,11 @@ rule handle-flag-value ( value * : properties * ) - result += $(p:G=) ; - } - } -+ if $(order) -+ { -+ result = [ $(order).order [ sequence.unique $(result) : stable ] ] ; -+ DELETE_MODULE $(order) ; -+ } - } - else - { diff --git a/libs/numeric/sublibs b/libs/numeric/sublibs deleted file mode 100644 index 721d7c4a9..000000000 --- a/libs/numeric/sublibs +++ /dev/null @@ -1 +0,0 @@ -The existance of this file tells the regression reporting programs that the directory contains sub-directories which are libraries. \ No newline at end of file diff --git a/libs/numeric/ublas/Changelog b/libs/numeric/ublas/Changelog deleted file mode 100644 index 0d71a949c..000000000 --- a/libs/numeric/ublas/Changelog +++ /dev/null @@ -1,25 +0,0 @@ -Version 1.1.0 -------------- - -2014-09-16: Nasos Iliopoulos <> - * feature: Merged matrix row and column facades ( matrix as a vector of rows/columns ) - -2014-05-03: David Bellot - * removed doxygen documentation from main source - * changed the changelog file for GNU format - * changed doc extension to a more "standard" .html - -2014-04-08 Nasos Iliopoulos <> - - * bugfix: introduced an additional swap implementation for index_pair_array and - index_triple_array to allow proper compilation of sparse containers - with g++>4.8 (4.7 also?) in C++11 mode. - -2014-04-02 Nasos Iliopoulos <> - - * Added changelog - * bugfix: corrected a big number of warnings coming from stray typedefs. Other - similar issues may be present that are not triggered by the unit tests - * bugfix: Corrected the banded matrix bug (https://svn.boost.org/trac/boost/ticket/7549) - and updated appropriate unit tests. To enable the old (incorrect though) - behaviour one should define BOOST_UBLAS_LEGACY_BANDED. diff --git a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench1/bench1.pro b/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench1/bench1.pro deleted file mode 100644 index 685802b31..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench1/bench1.pro +++ /dev/null @@ -1,16 +0,0 @@ -TEMPLATE = app -TARGET = bench1 - -!include (../configuration.pri) - -OTHER_FILES += \ - ../../../../benchmarks/bench1/Jamfile.v2 - -HEADERS += \ - ../../../../benchmarks/bench1/bench1.hpp - -SOURCES += \ - ../../../../benchmarks/bench1/bench13.cpp \ - ../../../../benchmarks/bench1/bench12.cpp \ - ../../../../benchmarks/bench1/bench11.cpp \ - ../../../../benchmarks/bench1/bench1.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench2/bench2.pro b/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench2/bench2.pro deleted file mode 100644 index b667a3fd4..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench2/bench2.pro +++ /dev/null @@ -1,16 +0,0 @@ -TEMPLATE = app -TARGET = bench2 - -!include (../configuration.pri) - -OTHER_FILES += \ - ../../../../benchmarks/bench2/Jamfile.v2 - -HEADERS += \ - ../../../../benchmarks/bench2/bench2.hpp - -SOURCES += \ - ../../../../benchmarks/bench2/bench23.cpp \ - ../../../../benchmarks/bench2/bench22.cpp \ - ../../../../benchmarks/bench2/bench21.cpp \ - ../../../../benchmarks/bench2/bench2.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench3/bench3.pro b/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench3/bench3.pro deleted file mode 100644 index 21f561fc6..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench3/bench3.pro +++ /dev/null @@ -1,16 +0,0 @@ -TEMPLATE = app -TARGET = bench3 - -!include (../configuration.pri) - -OTHER_FILES += \ - ../../../../benchmarks/bench3/Jamfile.v2 - -HEADERS += \ - ../../../../benchmarks/bench3/bench3.hpp - -SOURCES += \ - ../../../../benchmarks/bench3/bench33.cpp \ - ../../../../benchmarks/bench3/bench32.cpp \ - ../../../../benchmarks/bench3/bench31.cpp \ - ../../../../benchmarks/bench3/bench3.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench4/bench4.pro b/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench4/bench4.pro deleted file mode 100644 index 354bb478b..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench4/bench4.pro +++ /dev/null @@ -1,15 +0,0 @@ -TEMPLATE = app -TARGET = bench4 - -!include (../configuration.pri) - -DEFINES += BOOST_UBLAS_USE_INTERVAL - -OTHER_FILES += \ - ../../../../benchmarks/bench4/Jamfile.v2 - -SOURCES += \ - ../../../../benchmarks/bench4/bench43.cpp \ - ../../../../benchmarks/bench4/bench42.cpp \ - ../../../../benchmarks/bench4/bench41.cpp \ - ../../../../benchmarks/bench4/bench4.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench5/bench5.pro b/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench5/bench5.pro deleted file mode 100644 index e450911f0..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/bench5/bench5.pro +++ /dev/null @@ -1,12 +0,0 @@ -TEMPLATE = app -TARGET = bench5 - -!include (../configuration.pri) - -DEFINES += BOOST_UBLAS_USE_INTERVAL - -OTHER_FILES += \ - ../../../../benchmarks/bench5/Jamfile.v2 - -SOURCES += \ - ../../../../benchmarks/bench5/assignment_bench.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/benchmarks.pro b/libs/numeric/ublas/IDEs/qtcreator/benchmarks/benchmarks.pro deleted file mode 100644 index 4acf2d693..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/benchmarks.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = bench1 bench2 bench3 bench4 bench5 diff --git a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/configuration.pri b/libs/numeric/ublas/IDEs/qtcreator/benchmarks/configuration.pri deleted file mode 100644 index 07ffcae1c..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/benchmarks/configuration.pri +++ /dev/null @@ -1,13 +0,0 @@ -CONFIG -= qt -CONFIG += depend_includepath - -# ublas include directory -INCLUDEPATH += \ - ../../../../include - -# If ublas tests are build with boost source code then, -# then boost headers and boost libraries should be used. -exists(../../../../../../../boost-build.jam) { - INCLUDEPATH += ../../../../../../.. - #LIBS += -L../../../../../../../stage/lib -} diff --git a/libs/numeric/ublas/IDEs/qtcreator/include/detail/detail.pri b/libs/numeric/ublas/IDEs/qtcreator/include/detail/detail.pri deleted file mode 100644 index 711972db4..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/include/detail/detail.pri +++ /dev/null @@ -1,12 +0,0 @@ -HEADERS += \ - $${INCLUDE_DIR}/boost/numeric/ublas/detail/vector_assign.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/detail/temporary.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/detail/returntype_deduction.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/detail/raw.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/detail/matrix_assign.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/detail/iterator.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/detail/duff.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/detail/documentation.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/detail/definitions.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/detail/config.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/detail/concepts.hpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/include/experimental/experimental.pri b/libs/numeric/ublas/IDEs/qtcreator/include/experimental/experimental.pri deleted file mode 100644 index 41dc6c46b..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/include/experimental/experimental.pri +++ /dev/null @@ -1,2 +0,0 @@ -HEADERS += \ - $${INCLUDE_DIR}/boost/numeric/ublas/experimental/sparse_view.hpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/include/include.pro b/libs/numeric/ublas/IDEs/qtcreator/include/include.pro deleted file mode 100644 index 5815a01fe..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/include/include.pro +++ /dev/null @@ -1,47 +0,0 @@ -TEMPLATE = lib -TARGET = ublas - -CONFIG += \ - staticlib \ - depend_includepath -CONFIG -= qt - -INCLUDE_DIR = ../../../include - -include(detail/detail.pri) -include(experimental/experimental.pri) -include(operation/operation.pri) -include(traits/traits.pri) - -HEADERS += \ - $${INCLUDE_DIR}/boost/numeric/ublas/vector_sparse.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/vector_proxy.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/vector_of_vector.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/vector_expression.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/vector.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/triangular.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/traits.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/tags.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/symmetric.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/storage_sparse.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/storage.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/operation_sparse.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/operations.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/operation_blocked.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/operation.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/matrix_sparse.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/matrix_proxy.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/matrix_expression.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/matrix.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/lu.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/io.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/hermitian.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/fwd.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/functional.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/expression_types.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/exception.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/doxydoc.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/blas.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/banded.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/assignment.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/matrix_vector.hpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/include/operation/operation.pri b/libs/numeric/ublas/IDEs/qtcreator/include/operation/operation.pri deleted file mode 100644 index 519c4f4a6..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/include/operation/operation.pri +++ /dev/null @@ -1,7 +0,0 @@ -HEADERS += \ - $${INCLUDE_DIR}/boost/numeric/ublas/operation/size.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/operation/num_rows.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/operation/num_columns.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/operation/end.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/operation/c_array.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/operation/begin.hpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/include/traits/traits.pri b/libs/numeric/ublas/IDEs/qtcreator/include/traits/traits.pri deleted file mode 100644 index de327dc68..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/include/traits/traits.pri +++ /dev/null @@ -1,4 +0,0 @@ -HEADERS += \ - $${INCLUDE_DIR}/boost/numeric/ublas/traits/iterator_type.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/traits/const_iterator_type.hpp \ - $${INCLUDE_DIR}/boost/numeric/ublas/traits/c_array.hpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/begin_end.pro b/libs/numeric/ublas/IDEs/qtcreator/test/begin_end.pro deleted file mode 100644 index 03c4c6276..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/begin_end.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app -TARGET = begin_end - -!include (configuration.pri) - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/begin_end.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/comp_mat_erase.pro b/libs/numeric/ublas/IDEs/qtcreator/test/comp_mat_erase.pro deleted file mode 100644 index 63960aefe..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/comp_mat_erase.pro +++ /dev/null @@ -1,7 +0,0 @@ -TEMPLATE = app -TARGET = comp_mat_erase - -!include (configuration.pri) - -SOURCES += \ - ../../../test/comp_mat_erase.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/concepts.pro b/libs/numeric/ublas/IDEs/qtcreator/test/concepts.pro deleted file mode 100644 index c4c0bca9f..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/concepts.pro +++ /dev/null @@ -1,16 +0,0 @@ -TEMPLATE = app -TARGET = concepts - -!include (configuration.pri) - -DEFINES += \ - EXTERNAL -# INTERAL -# SKIP_BAD - -linux: icc: QMAKE_CXXFLAGS += -Xc -macx: QMAKE_CXXFLAGS += -fabi-version=0 - - -SOURCES += \ - ../../../test/concepts.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/configuration.pri b/libs/numeric/ublas/IDEs/qtcreator/test/configuration.pri deleted file mode 100644 index 3fdb4aa52..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/configuration.pri +++ /dev/null @@ -1,51 +0,0 @@ -CONFIG -= qt -CONFIG += \ - depend_includepath \ - debug -QMAKE_CXXFLAGS += -fno-inline - -# Create a directory for each test. -DESTDIR = $${TARGET} -OBJECTS_DIR = $${TARGET} - -UBLAS_TESTSET = \ - USE_DOUBLE USE_STD_COMPLEX \ - USE_RANGE USE_SLICE \ - USE_UNBOUNDED_ARRAY USE_STD_VECTOR USE_BOUNDED_VECTOR USE_MATRIX - -UBLAS_TESTSET_SPARSE = \ - USE_DOUBLE USE_STD_COMPLEX \ - USE_UNBOUNDED_ARRAY \ - USE_MAP_ARRAY USE_STD_MAP \ - USE_MAPPED_VECTOR USE_COMPRESSED_VECTOR \ - USE_MAPPED_MATRIX USE_COMPRESSED_MATRIX - # USE_RANGE USE_SLICE # Too complex for regression testing - -UBLAS_TESTSET_SPARSE_COO = \ - USE_DOUBLE USE_STD_COMPLEX \ - USE_UNBOUNDED_ARRAY \ - USE_COORDINATE_VECTOR \ - USE_COORDINATE_MATRIX - -DEFINES += BOOST_UBLAS_NO_EXCEPTIONS - -#Visual age IBM -xlc: DEFINES += BOOST_UBLAS_NO_ELEMENT_PROXIES - -# ublas include and test directory are included -INCLUDEPATH += \ - ../../../include \ - ../../test - -# If ublas tests are build with boost source code then, -# then boost headers and boost libraries should be used. -exists(../../../../../../boost-build.jam) { - INCLUDEPATH += ../../../../../.. - LIBS += -L../../../../../../stage/lib - QMAKE_RPATHDIR += ../../../../../../stage/lib -} - -# Execute test once compiled. -win32: QMAKE_POST_LINK = ./$${DESTDIR}/$${TARGET}.exe -else: QMAKE_POST_LINK = ./$${DESTDIR}/$${TARGET} - diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/num_columns.pro b/libs/numeric/ublas/IDEs/qtcreator/test/num_columns.pro deleted file mode 100644 index 8a28199c6..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/num_columns.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app -TARGET = num_columns - -!include (configuration.pri) - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/num_columns.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/num_rows.pro b/libs/numeric/ublas/IDEs/qtcreator/test/num_rows.pro deleted file mode 100644 index dc0a22904..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/num_rows.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app -TARGET = num_rows - -!include (configuration.pri) - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/num_rows.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/placement_new.pro b/libs/numeric/ublas/IDEs/qtcreator/test/placement_new.pro deleted file mode 100644 index d19a74743..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/placement_new.pro +++ /dev/null @@ -1,7 +0,0 @@ -TEMPLATE = app -TARGET = placement_new - -!include (configuration.pri) - -SOURCES += \ - ../../../test/placement_new.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/size.pro b/libs/numeric/ublas/IDEs/qtcreator/test/size.pro deleted file mode 100644 index 59a040334..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/size.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app -TARGET = size - -!include (configuration.pri) - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/size.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/sparse_view_test.pro b/libs/numeric/ublas/IDEs/qtcreator/test/sparse_view_test.pro deleted file mode 100644 index 02b3eb089..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/sparse_view_test.pro +++ /dev/null @@ -1,7 +0,0 @@ -TEMPLATE = app -TARGET = sparse_view_test - -!include (configuration.pri) - -SOURCES += \ - ../../../test/sparse_view_test.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test1.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test1.pro deleted file mode 100644 index d1123c44e..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test1.pro +++ /dev/null @@ -1,14 +0,0 @@ -TEMPLATE = app -TARGET = test1 - -!include (configuration.pri) - -DEFINES += $$UBLAS_TESTSET - -HEADERS += ../../../test/test1.hpp - -SOURCES += \ - ../../../test/test13.cpp \ - ../../../test/test12.cpp \ - ../../../test/test11.cpp \ - ../../../test/test1.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test2.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test2.pro deleted file mode 100644 index 00fb53f54..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test2.pro +++ /dev/null @@ -1,14 +0,0 @@ -TEMPLATE = app -TARGET = test2 - -!include (configuration.pri) - -DEFINES += $$UBLAS_TESTSET - -HEADERS += ../../../test/test2.hpp - -SOURCES += \ - ../../../test/test23.cpp \ - ../../../test/test22.cpp \ - ../../../test/test21.cpp \ - ../../../test/test2.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test3.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test3.pro deleted file mode 100644 index f4fd021fa..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test3.pro +++ /dev/null @@ -1,14 +0,0 @@ -TEMPLATE = app -TARGET = test3 - -!include (configuration.pri) - -DEFINES += $$UBLAS_TESTSET_SPARSE - -HEADERS += ../../../test/test3.hpp - -SOURCES += \ - ../../../test/test33.cpp \ - ../../../test/test32.cpp \ - ../../../test/test31.cpp \ - ../../../test/test3.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test3_coo.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test3_coo.pro deleted file mode 100644 index 27e3ca384..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test3_coo.pro +++ /dev/null @@ -1,14 +0,0 @@ -TEMPLATE = app -TARGET = test3_coo - -!include (configuration.pri) - -DEFINES += $$UBLAS_TESTSET_SPARSE_COO - -HEADERS += ../../../test/test3.hpp - -SOURCES += \ - ../../../test/test33.cpp \ - ../../../test/test32.cpp \ - ../../../test/test31.cpp \ - ../../../test/test3.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test3_mvov.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test3_mvov.pro deleted file mode 100644 index f0a46dcd2..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test3_mvov.pro +++ /dev/null @@ -1,19 +0,0 @@ -TEMPLATE = app -TARGET = test3_mvov - -!include (configuration.pri) - -DEFINES += \ - USE_FLOAT \ - USE_DOUBLE \ - USE_STD_COMPLEX \ - USE_STD_MAP \ - USE_MAPPED_VECTOR_OF_MAPPED_VECTOR - -HEADERS += ../../../test/test3.hpp - -SOURCES += \ - ../../../test/test33.cpp \ - ../../../test/test32.cpp \ - ../../../test/test31.cpp \ - ../../../test/test3.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test4.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test4.pro deleted file mode 100644 index 19da3f872..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test4.pro +++ /dev/null @@ -1,13 +0,0 @@ -TEMPLATE = app -TARGET = test4 - -!include (configuration.pri) - -DEFINES += $$UBLAS_TESTSET - -HEADERS += ../../../test/test4.hpp - -SOURCES += \ - ../../../test/test43.cpp \ - ../../../test/test42.cpp \ - ../../../test/test4.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test5.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test5.pro deleted file mode 100644 index 3f27384ec..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test5.pro +++ /dev/null @@ -1,13 +0,0 @@ -TEMPLATE = app -TARGET = test5 - -!include (configuration.pri) - -DEFINES += $$UBLAS_TESTSET - -HEADERS += ../../../test/test5.hpp - -SOURCES += \ - ../../../test/test53.cpp \ - ../../../test/test52.cpp \ - ../../../test/test5.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test6.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test6.pro deleted file mode 100644 index 0664ce454..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test6.pro +++ /dev/null @@ -1,13 +0,0 @@ -TEMPLATE = app -TARGET = test6 - -!include (configuration.pri) - -DEFINES += $$UBLAS_TESTSET - -HEADERS += ../../../test/test6.hpp - -SOURCES += \ - ../../../test/test63.cpp \ - ../../../test/test62.cpp \ - ../../../test/test6.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test7.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test7.pro deleted file mode 100644 index 541018492..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test7.pro +++ /dev/null @@ -1,16 +0,0 @@ -TEMPLATE = app -TARGET = test7 - -!include (configuration.pri) - -DEFINES += \ - BOOST_UBLAS_USE_INTERVAL \ - $${UBLAS_TESTSET} - -HEADERS += ../../../test/test7.hpp - -SOURCES += \ - ../../../test/test73.cpp \ - ../../../test/test72.cpp \ - ../../../test/test71.cpp \ - ../../../test/test7.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_assignment.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_assignment.pro deleted file mode 100644 index 1ad6ca391..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_assignment.pro +++ /dev/null @@ -1,13 +0,0 @@ -TEMPLATE = app -TARGET = test_assignment - -!include (configuration.pri) - -DEFINES += \ - BOOST_UBLAS_COO_ALWAYS_DO_FULL_SORT - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/test_assignment.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_banded_storage_layout.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_banded_storage_layout.pro deleted file mode 100644 index 78a96dc42..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_banded_storage_layout.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app -TARGET = test_banded_storage_layout - -!include (configuration.pri) - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/test_banded_storage_layout.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_complex_norms.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_complex_norms.pro deleted file mode 100644 index e7c431e4a..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_complex_norms.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app -TARGET = test_complex_norms - -!include (configuration.pri) - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/test_complex_norms.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_matrix_always_do_full_sort.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_matrix_always_do_full_sort.pro deleted file mode 100644 index 0c93dd04b..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_matrix_always_do_full_sort.pro +++ /dev/null @@ -1,13 +0,0 @@ -TEMPLATE = app -TARGET = test_coordinate_matrix_always_do_full_sort - -!include (configuration.pri) - -DEFINES += \ - BOOST_UBLAS_COO_ALWAYS_DO_FULL_SORT - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/test_coordinate_matrix_sort.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_matrix_inplace_merge.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_matrix_inplace_merge.pro deleted file mode 100644 index 0dee5eb39..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_matrix_inplace_merge.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app -TARGET = test_coordinate_matrix_inplace_merge - -!include (configuration.pri) - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/test_coordinate_matrix_inplace_merge.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_matrix_sort.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_matrix_sort.pro deleted file mode 100644 index ea94561d1..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_matrix_sort.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app -TARGET = test_coordinate_matrix_sort - -!include (configuration.pri) - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/test_coordinate_matrix_sort.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_vector_inplace_merge.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_vector_inplace_merge.pro deleted file mode 100644 index a86ce2aeb..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_coordinate_vector_inplace_merge.pro +++ /dev/null @@ -1,9 +0,0 @@ -TEMPLATE = app -TARGET = test_coordinate_vector_inplace_merge - -!include (configuration.pri) -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/test_coordinate_vector_inplace_merge.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_fixed_containers.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_fixed_containers.pro deleted file mode 100644 index 60127482f..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_fixed_containers.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app -TARGET = test_fixed_containers - -!include (configuration.pri) - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/test_fixed_containers.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_inplace_solve_basic.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_inplace_solve_basic.pro deleted file mode 100644 index 42bc3db6f..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_inplace_solve_basic.pro +++ /dev/null @@ -1,13 +0,0 @@ -TEMPLATE = app -TARGET = test_inplace_solve_basic - -!include (configuration.pri) - -DEFINES += \ - $$UBLAS_TESTSET - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/test_inplace_solve.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_inplace_solve_mvov.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_inplace_solve_mvov.pro deleted file mode 100644 index a1d1316d6..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_inplace_solve_mvov.pro +++ /dev/null @@ -1,13 +0,0 @@ -TEMPLATE = app -TARGET = test_inplace_solve_mvov - -!include (configuration.pri) - -DEFINES += \ - USE_MAPPED_VECTOR_OF_MAPPED_VECTOR - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/test_inplace_solve.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_inplace_solve_sparse.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_inplace_solve_sparse.pro deleted file mode 100644 index 9f9a32a09..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_inplace_solve_sparse.pro +++ /dev/null @@ -1,14 +0,0 @@ -TEMPLATE = app -TARGET = test_inplace_solve_sparse - -!include (configuration.pri) - -DEFINES += \ - $$UBLAS_TESTSET_SPARSE \ - $$UBLAS_TESTSET_SPARSE_COO - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/test_inplace_solve.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_lu.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_lu.pro deleted file mode 100644 index 0f2033971..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_lu.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app -TARGET = test_lu - -!include (configuration.pri) - -HEADERS += \ - ../../../test/common/testhelper.hpp - -SOURCES += \ - ../../../test/test_lu.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_matrix_vector.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_matrix_vector.pro deleted file mode 100644 index d61b70bfb..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_matrix_vector.pro +++ /dev/null @@ -1,13 +0,0 @@ -TEMPLATE = app -TARGET = test_matrix_vector - -!include (configuration.pri) - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/test_matrix_vector.cpp - -INCLUDEPATH += \ - ../../../include diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_ticket7296.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_ticket7296.pro deleted file mode 100644 index 98752cf75..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_ticket7296.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = app -TARGET = test_ticket7296 - -!include (configuration.pri) - -HEADERS += \ - ../../../test/utils.hpp - -SOURCES += \ - ../../../test/test_ticket7296.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/test_triangular.pro b/libs/numeric/ublas/IDEs/qtcreator/test/test_triangular.pro deleted file mode 100644 index 15c8ce110..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/test_triangular.pro +++ /dev/null @@ -1,16 +0,0 @@ -TEMPLATE = app -TARGET = test_triangular - -!include (configuration.pri) - -DEFINES += \ - BOOST_CHRONO_DYN_LINK=1 \ - BOOST_CHRONO_THREAD_DISABLED \ - BOOST_SYSTEM_DYN_LINK=1 \ - BOOST_SYSTEM_NO_DEPRECATED \ - BOOST_TIMER_DYN_LINK=1 - -SOURCES += \ - ../../../test/test_triangular.cpp - -LIBS += -lboost_timer -lboost_system -lboost_chrono diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/triangular_access.pro b/libs/numeric/ublas/IDEs/qtcreator/test/triangular_access.pro deleted file mode 100644 index 98a87063b..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/triangular_access.pro +++ /dev/null @@ -1,12 +0,0 @@ -TEMPLATE = app -TARGET = triangular_access - -!include (configuration.pri) - -DEFINES += NOMESSAGES - -HEADERS += \ - ../../../test/common/testhelper.hpp - -SOURCES += \ - ../../../test/triangular_access.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/test/triangular_layout.pro b/libs/numeric/ublas/IDEs/qtcreator/test/triangular_layout.pro deleted file mode 100644 index dcfd36f6f..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/test/triangular_layout.pro +++ /dev/null @@ -1,7 +0,0 @@ -TEMPLATE = app -TARGET = triangular_layout - -!include (configuration.pri) - -SOURCES += \ - ../../../test/triangular_layout.cpp diff --git a/libs/numeric/ublas/IDEs/qtcreator/tests.pri b/libs/numeric/ublas/IDEs/qtcreator/tests.pri deleted file mode 100644 index 6ece4acd5..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/tests.pri +++ /dev/null @@ -1,74 +0,0 @@ -OTHER_FILES += \ - ../../test/README \ - ../../test/Jamfile.v2 - -SUBDIRS += \ - begin_end \ - comp_mat_erase \ - concepts \ - num_columns \ - num_rows \ - placement_new \ - size \ - sparse_view_test \ - test1 \ - test2 \ - test3 \ - test3_coo \ - test3_mvov \ - test4 \ - test5 \ - test6 \ - test7 \ - test_assignment \ - test_banded_storage_layout \ - test_complex_norms \ - test_coordinate_matrix_inplace_merge \ - test_coordinate_matrix_sort \ - test_coordinate_matrix_always_do_full_sort \ - test_coordinate_vector_inplace_merge \ - test_fixed_containers \ - test_inplace_solve_basic \ - test_inplace_solve_sparse \ - test_inplace_solve_mvov \ - test_lu \ - test_matrix_vector \ - test_ticket7296 \ - test_triangular \ - triangular_access \ - triangular_layout - -begin_end.file = test/begin_end.pro -comp_mat_erase.file = test/comp_mat_erase.pro -concepts.file = test/concepts.pro -num_columns.file = test/num_columns.pro -num_rows.file = test/num_rows.pro -placement_new.file = test/placement_new.pro -size.file = test/size.pro -sparse_view_test.file = test/sparse_view_test.pro -test1.file = test/test1.pro -test2.file = test/test2.pro -test3.file = test/test3.pro -test3_coo.file = test/test3_coo.pro -test3_mvov.file = test/test3_mvov.pro -test4.file = test/test4.pro -test5.file = test/test5.pro -test6.file = test/test6.pro -test7.file = test/test7.pro -test_assignment.file = test/test_assignment.pro -test_banded_storage_layout.file = test/test_banded_storage_layout.pro -test_complex_norms.file = test/test_complex_norms.pro -test_coordinate_matrix_inplace_merge.file = test/test_coordinate_matrix_inplace_merge.pro -test_coordinate_matrix_sort.file = test/test_coordinate_matrix_sort.pro -test_coordinate_matrix_always_do_full_sort.file = test/test_coordinate_matrix_always_do_full_sort.pro -test_coordinate_vector_inplace_merge.file = test/test_coordinate_vector_inplace_merge.pro -test_fixed_containers.file = test/test_fixed_containers.pro -test_inplace_solve_basic.file = test/test_inplace_solve_basic.pro -test_inplace_solve_sparse.file = test/test_inplace_solve_sparse.pro -test_inplace_solve_mvov.file = test/test_inplace_solve_mvov.pro -test_lu.file = test/test_lu.pro -test_matrix_vector.file = test/test_matrix_vector.pro -test_ticket7296.file = test/test_ticket7296.pro -test_triangular.file = test/test_triangular.pro -triangular_access.file = test/triangular_access.pro -triangular_layout.file = test/triangular_layout.pro diff --git a/libs/numeric/ublas/IDEs/qtcreator/ublas_develop.pro b/libs/numeric/ublas/IDEs/qtcreator/ublas_develop.pro deleted file mode 100644 index 7364283a9..000000000 --- a/libs/numeric/ublas/IDEs/qtcreator/ublas_develop.pro +++ /dev/null @@ -1,6 +0,0 @@ -TEMPLATE = subdirs -CONFIG += ordered -SUBDIRS = include benchmarks -OTHER_FILES += ../../changelog.txt - -include (tests.pri) diff --git a/libs/numeric/ublas/README.md b/libs/numeric/ublas/README.md deleted file mode 100644 index a0387df25..000000000 --- a/libs/numeric/ublas/README.md +++ /dev/null @@ -1,15 +0,0 @@ -ublas -===== - -The Boost.uBLAS Linear Algebra Library v1.0 - -- To follow development and test experimental features, you can clone the Github project uBLAS/ublas -at https://github.com/uBLAS/ublas -- A development wiki is available at https://github.com/uBLAS/ublas/wiki -- A mailing-list is available at http://lists.boost.org/ublas/ -- For any other questions, you can contact David at david.bellot@gmail.com - -- version numbers have never been used for this library until 02 March 2014. - So we start at v1.0 on that day. - -last update: 1 April 2014 diff --git a/libs/numeric/ublas/benchmarks/bench1/Jamfile.v2 b/libs/numeric/ublas/benchmarks/bench1/Jamfile.v2 deleted file mode 100644 index 77b11c77e..000000000 --- a/libs/numeric/ublas/benchmarks/bench1/Jamfile.v2 +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2004 Michael Stevens -# 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) - -# bench1 - measure the abstraction penalty of dense matrix and vector operations. - -exe bench1 - : bench1.cpp bench11.cpp bench12.cpp bench13.cpp - ; diff --git a/libs/numeric/ublas/benchmarks/bench1/bench1.cpp b/libs/numeric/ublas/benchmarks/bench1/bench1.cpp deleted file mode 100644 index 87478e139..000000000 --- a/libs/numeric/ublas/benchmarks/bench1/bench1.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "bench1.hpp" - -void header (std::string text) { - std::cout << text << std::endl; -} - -template -struct peak_c_plus { - typedef T value_type; - - void operator () (int runs) const { - try { - static T s (0); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - s += T (0); -// sink_scalar (s); - } - footer () (0, 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct peak_c_multiplies { - typedef T value_type; - - void operator () (int runs) const { - try { - static T s (1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - s *= T (1); -// sink_scalar (s); - } - footer () (0, 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -template -void peak::operator () (int runs) { - header ("peak"); - - header ("plus"); - peak_c_plus () (runs); - - header ("multiplies"); - peak_c_multiplies () (runs); -} - - -template -void do_bench (std::string type_string, int scale) -{ - header (type_string); - peak () (1000000 * scale); - - header (type_string + ", 3"); - bench_1 () (1000000 * scale); - bench_2 () (300000 * scale); - bench_3 () (100000 * scale); - - header (type_string + ", 10"); - bench_1 () (300000 * scale); - bench_2 () (30000 * scale); - bench_3 () (3000 * scale); - - header (type_string + ", 30"); - bench_1 () (100000 * scale); - bench_2 () (3000 * scale); - bench_3 () (100 * scale); - - header (type_string + ", 100"); - bench_1 () (30000 * scale); - bench_2 () (300 * scale); - bench_3 () (3 * scale); -} - -int main (int argc, char *argv []) { - - int scale = 1; - if (argc > 1) - scale = std::atoi (argv [1]); - -#ifdef USE_FLOAT - do_bench ("FLOAT", scale); -#endif - -#ifdef USE_DOUBLE - do_bench ("DOUBLE", scale); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - do_bench > ("COMPLEX", scale); -#endif - -#ifdef USE_DOUBLE - do_bench > ("COMPLEX", scale); -#endif -#endif - - return 0; -} diff --git a/libs/numeric/ublas/benchmarks/bench1/bench1.hpp b/libs/numeric/ublas/benchmarks/bench1/bench1.hpp deleted file mode 100644 index d799463d4..000000000 --- a/libs/numeric/ublas/benchmarks/bench1/bench1.hpp +++ /dev/null @@ -1,159 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#ifndef BENCH1_H -#define BENCH1_H - -#include -#include -#include - -#include -#include - -#include - - -#define BOOST_UBLAS_NOT_USED(x) (void)(x) - - -namespace ublas = boost::numeric::ublas; - -void header (std::string text); - -template -struct footer { - void operator () (int multiplies, int plus, int runs, double elapsed) { - std::cout << "elapsed: " << elapsed << " s, " - << (multiplies * ublas::type_traits::multiplies_complexity + - plus * ublas::type_traits::plus_complexity) * runs / - (1024 * 1024 * elapsed) << " Mflops" << std::endl; - } -}; - -template -struct c_vector_traits { - typedef T type [N]; -}; -template -struct c_matrix_traits { - typedef T type [N] [M]; -}; - -template -struct initialize_c_vector { - void operator () (typename c_vector_traits::type &v) { - for (int i = 0; i < N; ++ i) - v [i] = std::rand () * 1.f; -// v [i] = 0.f; - } -}; -template -BOOST_UBLAS_INLINE -void initialize_vector (V &v) { - int size = v.size (); - for (int i = 0; i < size; ++ i) - v [i] = std::rand () * 1.f; -// v [i] = 0.f; -} - -template -struct initialize_c_matrix { - void operator () (typename c_matrix_traits::type &m) { - for (int i = 0; i < N; ++ i) - for (int j = 0; j < M; ++ j) - m [i] [j] = std::rand () * 1.f; -// m [i] [j] = 0.f; - } -}; -template -BOOST_UBLAS_INLINE -void initialize_matrix (M &m) { - int size1 = m.size1 (); - int size2 = m.size2 (); - for (int i = 0; i < size1; ++ i) - for (int j = 0; j < size2; ++ j) - m (i, j) = std::rand () * 1.f; -// m (i, j) = 0.f; -} - -template -BOOST_UBLAS_INLINE -void sink_scalar (const T &s) { - static T g_s = s; -} - -template -struct sink_c_vector { - void operator () (const typename c_vector_traits::type &v) { - static typename c_vector_traits::type g_v; - for (int i = 0; i < N; ++ i) - g_v [i] = v [i]; - } -}; -template -BOOST_UBLAS_INLINE -void sink_vector (const V &v) { - static V g_v (v); -} - -template -struct sink_c_matrix { - void operator () (const typename c_matrix_traits::type &m) { - static typename c_matrix_traits::type g_m; - for (int i = 0; i < N; ++ i) - for (int j = 0; j < M; ++ j) - g_m [i] [j] = m [i] [j]; - } -}; -template -BOOST_UBLAS_INLINE -void sink_matrix (const M &m) { - static M g_m (m); -} - -template -struct peak { - void operator () (int runs); -}; - -template -struct bench_1 { - void operator () (int runs); -}; - -template -struct bench_2 { - void operator () (int runs); -}; - -template -struct bench_3 { - void operator () (int runs); -}; - -struct safe_tag {}; -struct fast_tag {}; - -//#define USE_FLOAT -#define USE_DOUBLE -// #define USE_STD_COMPLEX - -#define USE_C_ARRAY -// #define USE_BOUNDED_ARRAY -#define USE_UNBOUNDED_ARRAY -// #define USE_STD_VALARRAY -//#define USE_STD_VECTOR - -#endif - - diff --git a/libs/numeric/ublas/benchmarks/bench1/bench11.cpp b/libs/numeric/ublas/benchmarks/bench1/bench11.cpp deleted file mode 100644 index 806a422b0..000000000 --- a/libs/numeric/ublas/benchmarks/bench1/bench11.cpp +++ /dev/null @@ -1,287 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "bench1.hpp" - -template -struct bench_c_inner_prod { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_vector_traits::type v1, v2; - initialize_c_vector () (v1); - initialize_c_vector () (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - static value_type s (0); - for (int j = 0; j < N; ++ j) { - s += v1 [j] * v2 [j]; - } -// sink_scalar (s); - } - footer () (N, N - 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_inner_prod { - typedef typename V::value_type value_type; - - void operator () (int runs) const { - try { - static V v1 (N), v2 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - static value_type s (0); - s = ublas::inner_prod (v1, v2); -// sink_scalar (s); - BOOST_UBLAS_NOT_USED(s); - } - footer () (N, N - 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_inner_prod { - typedef typename V::value_type value_type; - - void operator () (int runs) const { - try { - static V v1 (N), v2 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - static value_type s (0); - s = (v1 * v2).sum (); -// sink_scalar (s); - } - footer () (N, N - 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -template -struct bench_c_vector_add { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_vector_traits::type v1, v2, v3; - initialize_c_vector () (v1); - initialize_c_vector () (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - v3 [j] = - (v1 [j] + v2 [j]); - } -// sink_c_vector () (v3); - BOOST_UBLAS_NOT_USED(v3); - } - footer () (0, 2 * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_vector_add { - typedef typename V::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static V v1 (N), v2 (N), v3 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - v3 = - (v1 + v2); -// sink_vector (v3); - } - footer () (0, 2 * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static V v1 (N), v2 (N), v3 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - v3.assign (- (v1 + v2)); -// sink_vector (v3); - } - footer () (0, 2 * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_vector_add { - typedef typename V::value_type value_type; - - void operator () (int runs) const { - try { - static V v1 (N), v2 (N), v3 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - v3 = - (v1 + v2); -// sink_vector (v3); - } - footer () (0, 2 * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -// Benchmark O (n) -template -void bench_1::operator () (int runs) { - header ("bench_1"); - - header ("inner_prod"); - - header ("C array"); - bench_c_inner_prod () (runs); - -#ifdef USE_C_ARRAY - header ("c_vector"); - bench_my_inner_prod, N> () (runs); -#endif - -#ifdef USE_BOUNDED_ARRAY - header ("vector"); - bench_my_inner_prod >, N> () (runs); -#endif - -#ifdef USE_UNBOUNDED_ARRAY - header ("vector"); - bench_my_inner_prod >, N> () (runs); -#endif - -#ifdef USE_STD_VALARRAY - header ("vector"); - bench_my_inner_prod >, N> () (); -#endif - -#ifdef USE_STD_VECTOR - header ("vector"); - bench_my_inner_prod >, N> () (runs); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_inner_prod, N> () (runs); -#endif - - header ("vector + vector"); - - header ("C array"); - bench_c_vector_add () (runs); - -#ifdef USE_C_ARRAY - header ("c_vector safe"); - bench_my_vector_add, N> () (runs, safe_tag ()); - - header ("c_vector fast"); - bench_my_vector_add, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_BOUNDED_ARRAY - header ("vector safe"); - bench_my_vector_add >, N> () (runs, safe_tag ()); - - header ("vector fast"); - bench_my_vector_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_UNBOUNDED_ARRAY - header ("vector safe"); - bench_my_vector_add >, N> () (runs, safe_tag ()); - - header ("vector fast"); - bench_my_vector_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("vector safe"); - bench_my_vector_add >, N> () (runs, safe_tag ()); - - header ("vector fast"); - bench_my_vector_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VECTOR - header ("vector safe"); - bench_my_vector_add >, N> () (runs, safe_tag ()); - - header ("vector fast"); - bench_my_vector_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_vector_add, N> () (runs); -#endif -} - -#ifdef USE_FLOAT -template struct bench_1; -template struct bench_1; -template struct bench_1; -template struct bench_1; -#endif - -#ifdef USE_DOUBLE -template struct bench_1; -template struct bench_1; -template struct bench_1; -template struct bench_1; -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT -template struct bench_1, 3>; -template struct bench_1, 10>; -template struct bench_1, 30>; -template struct bench_1, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_1, 3>; -template struct bench_1, 10>; -template struct bench_1, 30>; -template struct bench_1, 100>; -#endif -#endif diff --git a/libs/numeric/ublas/benchmarks/bench1/bench12.cpp b/libs/numeric/ublas/benchmarks/bench1/bench12.cpp deleted file mode 100644 index 439188f67..000000000 --- a/libs/numeric/ublas/benchmarks/bench1/bench12.cpp +++ /dev/null @@ -1,491 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "bench1.hpp" - -template -struct bench_c_outer_prod { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_matrix_traits::type m; - static typename c_vector_traits::type v1, v2; - initialize_c_vector () (v1); - initialize_c_vector () (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - for (int k = 0; k < N; ++ k) { - m [j] [k] = - v1 [j] * v2 [k]; - } - } -// sink_c_matrix () (m); - } - BOOST_UBLAS_NOT_USED(m); - - footer () (N * N, N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_outer_prod { - typedef typename M::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static M m (N, N); - static V v1 (N), v2 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m = - ublas::outer_prod (v1, v2); -// sink_matrix (m); - } - footer () (N * N, N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static M m (N, N); - static V v1 (N), v2 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m.assign (- ublas::outer_prod (v1, v2)); -// sink_matrix (m); - } - footer () (N * N, N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_outer_prod { - typedef typename M::value_type value_type; - - void operator () (int runs) const { - try { - static M m (N * N); - static V v1 (N), v2 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - for (int k = 0; k < N; ++ k) { - m [N * j + k] = - v1 [j] * v2 [k]; - } - } -// sink_vector (m); - } - footer () (N * N, N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -template -struct bench_c_matrix_vector_prod { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_matrix_traits::type m; - static typename c_vector_traits::type v1, v2; - initialize_c_matrix () (m); - initialize_c_vector () (v1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - v2 [j] = 0; - for (int k = 0; k < N; ++ k) { - v2 [j] += m [j] [k] * v1 [k]; - } - } -// sink_c_vector () (v2); - } - footer () (N * N, N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_matrix_vector_prod { - typedef typename M::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static M m (N, N); - static V v1 (N), v2 (N); - initialize_matrix (m); - initialize_vector (v1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - v2 = ublas::prod (m, v1); -// sink_vector (v2); - } - footer () (N * N, N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static M m (N, N); - static V v1 (N), v2 (N); - initialize_matrix (m); - initialize_vector (v1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - v2.assign (ublas::prod (m, v1)); -// sink_vector (v2); - } - footer () (N * N, N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_matrix_vector_prod { - typedef typename M::value_type value_type; - - void operator () (int runs) const { - try { - static M m (N * N); - static V v1 (N), v2 (N); - initialize_vector (m); - initialize_vector (v1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - std::valarray row (m [std::slice (N * j, N, 1)]); - v2 [j] = (row * v1).sum (); - } -// sink_vector (v2); - } - footer () (N * N, N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -template -struct bench_c_matrix_add { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_matrix_traits::type m1, m2, m3; - initialize_c_matrix () (m1); - initialize_c_matrix () (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - for (int k = 0; k < N; ++ k) { - m3 [j] [k] = - (m1 [j] [k] + m2 [j] [k]); - } - } -// sink_c_matrix () (m3); - } - BOOST_UBLAS_NOT_USED(m3); - - footer () (0, 2 * N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_matrix_add { - typedef typename M::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static M m1 (N, N), m2 (N, N), m3 (N, N); - initialize_matrix (m1); - initialize_matrix (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m3 = - (m1 + m2); -// sink_matrix (m3); - } - footer () (0, 2 * N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static M m1 (N, N), m2 (N, N), m3 (N, N); - initialize_matrix (m1); - initialize_matrix (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m3.assign (- (m1 + m2)); -// sink_matrix (m3); - } - footer () (0, 2 * N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_matrix_add { - typedef typename M::value_type value_type; - - void operator () (int runs) const { - try { - static M m1 (N * N), m2 (N * N), m3 (N * N); - initialize_vector (m1); - initialize_vector (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m3 = - (m1 + m2); -// sink_vector (m3); - } - footer () (0, 2 * N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -// Benchmark O (n ^ 2) -template -void bench_2::operator () (int runs) { - header ("bench_2"); - - header ("outer_prod"); - - header ("C array"); - bench_c_outer_prod () (runs); - -#ifdef USE_C_ARRAY - header ("c_matrix, c_vector safe"); - bench_my_outer_prod, - ublas::c_vector, N> () (runs, safe_tag ()); - - header ("c_matrix, c_vector fast"); - bench_my_outer_prod, - ublas::c_vector, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_BOUNDED_ARRAY - header ("matrix, vector safe"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_UNBOUNDED_ARRAY - header ("matrix, vector safe"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("matrix, vector safe"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VECTOR - header ("matrix, vector safe"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_outer_prod, std::valarray, N> () (runs); -#endif - - header ("prod (matrix, vector)"); - - header ("C array"); - bench_c_matrix_vector_prod () (runs); - -#ifdef USE_C_ARRAY - header ("c_matrix, c_vector safe"); - bench_my_matrix_vector_prod, - ublas::c_vector, N> () (runs, safe_tag ()); - - header ("c_matrix, c_vector fast"); - bench_my_matrix_vector_prod, - ublas::c_vector, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_BOUNDED_ARRAY - header ("matrix, vector safe"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_UNBOUNDED_ARRAY - header ("matrix, vector safe"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("matrix, vector safe"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VECTOR - header ("matrix, vector safe"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_matrix_vector_prod, std::valarray, N> () (runs); -#endif - - header ("matrix + matrix"); - - header ("C array"); - bench_c_matrix_add () (runs); - -#ifdef USE_C_ARRAY - header ("c_matrix safe"); - bench_my_matrix_add, N> () (runs, safe_tag ()); - - header ("c_matrix fast"); - bench_my_matrix_add, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_BOUNDED_ARRAY - header ("matrix safe"); - bench_my_matrix_add >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_UNBOUNDED_ARRAY - header ("matrix safe"); - bench_my_matrix_add >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("matrix safe"); - bench_my_matrix_add >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VECTOR - header ("matrix safe"); - bench_my_matrix_add >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_matrix_add, N> () (runs); -#endif -} - -#ifdef USE_FLOAT -template struct bench_2; -template struct bench_2; -template struct bench_2; -template struct bench_2; -#endif - -#ifdef USE_DOUBLE -template struct bench_2; -template struct bench_2; -template struct bench_2; -template struct bench_2; -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT -template struct bench_2, 3>; -template struct bench_2, 10>; -template struct bench_2, 30>; -template struct bench_2, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_2, 3>; -template struct bench_2, 10>; -template struct bench_2, 30>; -template struct bench_2, 100>; -#endif -#endif diff --git a/libs/numeric/ublas/benchmarks/bench1/bench13.cpp b/libs/numeric/ublas/benchmarks/bench1/bench13.cpp deleted file mode 100644 index fadb0b673..000000000 --- a/libs/numeric/ublas/benchmarks/bench1/bench13.cpp +++ /dev/null @@ -1,192 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "bench1.hpp" - -template -struct bench_c_matrix_prod { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_matrix_traits::type m1, m2, m3; - initialize_c_matrix () (m1); - initialize_c_matrix () (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - for (int k = 0; k < N; ++ k) { - m3 [j] [k] = 0; - for (int l = 0; l < N; ++ l) { - m3 [j] [k] += m1 [j] [l] * m2 [l] [k]; - } - } - } -// sink_c_matrix () (m3); - } - footer () (N * N * N, N * N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_matrix_prod { - typedef typename M::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static M m1 (N, N), m2 (N, N), m3 (N, N); - initialize_matrix (m1); - initialize_matrix (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m3 = ublas::prod (m1, m2); -// sink_matrix (m3); - } - footer () (N * N * N, N * N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static M m1 (N, N), m2 (N, N), m3 (N, N); - initialize_matrix (m1); - initialize_matrix (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m3.assign (ublas::prod (m1, m2)); -// sink_matrix (m3); - } - footer () (N * N * N, N * N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_matrix_prod { - typedef typename M::value_type value_type; - - void operator () (int runs) const { - try { - static M m1 (N * N), m2 (N * N), m3 (N * N); - initialize_vector (m1); - initialize_vector (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - std::valarray row (m1 [std::slice (N * j, N, 1)]); - for (int k = 0; k < N; ++ k) { - std::valarray column (m2 [std::slice (k, N, N)]); - m3 [N * j + k] = (row * column).sum (); - } - } -// sink_vector (m3); - } - footer () (N * N * N, N * N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -// Benchmark O (n ^ 3) -template -void bench_3::operator () (int runs) { - header ("bench_3"); - - header ("prod (matrix, matrix)"); - - header ("C array"); - bench_c_matrix_prod () (runs); - -#ifdef USE_C_ARRAY - header ("c_matrix safe"); - bench_my_matrix_prod, N> () (runs, safe_tag ()); - - header ("c_matrix fast"); - bench_my_matrix_prod, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_BOUNDED_ARRAY - header ("matrix safe"); - bench_my_matrix_prod >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_prod >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_UNBOUNDED_ARRAY - header ("matrix safe"); - bench_my_matrix_prod >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_prod >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("matrix safe"); - bench_my_matrix_prod >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_prod >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VECTOR - header ("matrix safe"); - bench_my_matrix_prod >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_prod >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_matrix_prod, N> () (runs); -#endif -} - -#ifdef USE_FLOAT -template struct bench_3; -template struct bench_3; -template struct bench_3; -template struct bench_3; -#endif - -#ifdef USE_DOUBLE -template struct bench_3; -template struct bench_3; -template struct bench_3; -template struct bench_3; -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT -template struct bench_3, 3>; -template struct bench_3, 10>; -template struct bench_3, 30>; -template struct bench_3, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_3, 3>; -template struct bench_3, 10>; -template struct bench_3, 30>; -template struct bench_3, 100>; -#endif -#endif diff --git a/libs/numeric/ublas/benchmarks/bench2/Jamfile.v2 b/libs/numeric/ublas/benchmarks/bench2/Jamfile.v2 deleted file mode 100644 index 4eb801591..000000000 --- a/libs/numeric/ublas/benchmarks/bench2/Jamfile.v2 +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2004 Michael Stevens -# 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) - -# bench2 - measurs the performance of sparse matrix and vector operations. - -exe bench2 - : bench2.cpp bench21.cpp bench22.cpp bench23.cpp - ; diff --git a/libs/numeric/ublas/benchmarks/bench2/bench2.cpp b/libs/numeric/ublas/benchmarks/bench2/bench2.cpp deleted file mode 100644 index 43ba152f5..000000000 --- a/libs/numeric/ublas/benchmarks/bench2/bench2.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "bench2.hpp" - -void header (std::string text) { - std::cout << text << std::endl; -} - -template -struct peak_c_plus { - typedef T value_type; - - void operator () (int runs) const { - try { - static T s (0); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - s += T (0); -// sink_scalar (s); - } - footer () (0, 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct peak_c_multiplies { - typedef T value_type; - - void operator () (int runs) const { - try { - static T s (1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - s *= T (1); -// sink_scalar (s); - } - footer () (0, 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -template -void peak::operator () (int runs) { - header ("peak"); - - header ("plus"); - peak_c_plus () (runs); - - header ("multiplies"); - peak_c_multiplies () (runs); -} - - -template -void do_bench (std::string type_string, int scale) -{ - header (type_string); - peak () (1000000 * scale); - - header (type_string + ", 3"); - bench_1 () (1000000 * scale); - bench_2 () (300000 * scale); - bench_3 () (100000 * scale); - - header (type_string + ", 10"); - bench_1 () (300000 * scale); - bench_2 () (30000 * scale); - bench_3 () (3000 * scale); - - header (type_string + ", 30"); - bench_1 () (100000 * scale); - bench_2 () (3000 * scale); - bench_3 () (100 * scale); - - header (type_string + ", 100"); - bench_1 () (30000 * scale); - bench_2 () (300 * scale); - bench_3 () (3 * scale); -} - -int main (int argc, char *argv []) { - - int scale = 1; - if (argc > 1) - scale = std::atoi (argv [1]); - -#ifdef USE_FLOAT - do_bench ("FLOAT", scale); -#endif - -#ifdef USE_DOUBLE - do_bench ("DOUBLE", scale); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - do_bench > ("COMPLEX", scale); -#endif - -#ifdef USE_DOUBLE - do_bench > ("COMPLEX", scale); -#endif -#endif - - return 0; -} diff --git a/libs/numeric/ublas/benchmarks/bench2/bench2.hpp b/libs/numeric/ublas/benchmarks/bench2/bench2.hpp deleted file mode 100644 index efb20a27a..000000000 --- a/libs/numeric/ublas/benchmarks/bench2/bench2.hpp +++ /dev/null @@ -1,182 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#ifndef BENCH2_H -#define BENCH2_H - -#include -#include -#include - -#include -#include -#include -#include - -#include - - -#define BOOST_UBLAS_NOT_USED(x) (void)(x) - - -namespace ublas = boost::numeric::ublas; - -void header (std::string text); - -template -struct footer { - void operator () (int multiplies, int plus, int runs, double elapsed) { - std::cout << "elapsed: " << elapsed << " s, " - << (multiplies * ublas::type_traits::multiplies_complexity + - plus * ublas::type_traits::plus_complexity) * runs / - (1024 * 1024 * elapsed) << " Mflops" << std::endl; - } -}; - -template -struct c_vector_traits { - typedef T type [N]; -}; -template -struct c_matrix_traits { - typedef T type [N] [M]; -}; - -template -struct initialize_c_vector { - void operator () (typename c_vector_traits::type &v) { - for (int i = 0; i < N; ++ i) - v [i] = std::rand () * 1.f; -// v [i] = 0.f; - } -}; -template -BOOST_UBLAS_INLINE -void initialize_vector (V &v) { - int size = v.size (); - for (int i = 0; i < size; ++ i) - v [i] = std::rand () * 1.f; -// v [i] = 0.f; -} - -template -struct initialize_c_matrix { - void operator () (typename c_matrix_traits::type &m) { - for (int i = 0; i < N; ++ i) - for (int j = 0; j < M; ++ j) - m [i] [j] = std::rand () * 1.f; -// m [i] [j] = 0.f; - } -}; -template -BOOST_UBLAS_INLINE -void initialize_matrix (M &m, ublas::row_major_tag) { - int size1 = m.size1 (); - int size2 = m.size2 (); - for (int i = 0; i < size1; ++ i) - for (int j = 0; j < size2; ++ j) - m (i, j) = std::rand () * 1.f; -// m (i, j) = 0.f; -} -template -BOOST_UBLAS_INLINE -void initialize_matrix (M &m, ublas::column_major_tag) { - int size1 = m.size1 (); - int size2 = m.size2 (); - for (int j = 0; j < size2; ++ j) - for (int i = 0; i < size1; ++ i) - m (i, j) = std::rand () * 1.f; -// m (i, j) = 0.f; -} -template -BOOST_UBLAS_INLINE -void initialize_matrix (M &m) { - typedef typename M::orientation_category orientation_category; - initialize_matrix (m, orientation_category ()); -} - -template -BOOST_UBLAS_INLINE -void sink_scalar (const T &s) { - static T g_s = s; -} - -template -struct sink_c_vector { - void operator () (const typename c_vector_traits::type &v) { - static typename c_vector_traits::type g_v; - for (int i = 0; i < N; ++ i) - g_v [i] = v [i]; - } -}; -template -BOOST_UBLAS_INLINE -void sink_vector (const V &v) { - static V g_v (v); -} - -template -struct sink_c_matrix { - void operator () (const typename c_matrix_traits::type &m) { - static typename c_matrix_traits::type g_m; - for (int i = 0; i < N; ++ i) - for (int j = 0; j < M; ++ j) - g_m [i] [j] = m [i] [j]; - } -}; -template -BOOST_UBLAS_INLINE -void sink_matrix (const M &m) { - static M g_m (m); -} - -template -struct peak { - void operator () (int runs); -}; - -template -struct bench_1 { - void operator () (int runs); -}; - -template -struct bench_2 { - void operator () (int runs); -}; - -template -struct bench_3 { - void operator () (int runs); -}; - -struct safe_tag {}; -struct fast_tag {}; - -// #define USE_FLOAT -#define USE_DOUBLE -// #define USE_STD_COMPLEX - -#define USE_MAP_ARRAY -// #define USE_STD_MAP -// #define USE_STD_VALARRAY - -#define USE_MAPPED_VECTOR -#define USE_COMPRESSED_VECTOR -#define USE_COORDINATE_VECTOR - -#define USE_MAPPED_MATRIX -// #define USE_SPARSE_VECTOR_OF_SPARSE_VECTOR -#define USE_COMPRESSED_MATRIX -#define USE_COORDINATE_MATRIX - -#endif diff --git a/libs/numeric/ublas/benchmarks/bench2/bench21.cpp b/libs/numeric/ublas/benchmarks/bench2/bench21.cpp deleted file mode 100644 index 50d70a405..000000000 --- a/libs/numeric/ublas/benchmarks/bench2/bench21.cpp +++ /dev/null @@ -1,282 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "bench2.hpp" - -template -struct bench_c_inner_prod { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_vector_traits::type v1, v2; - initialize_c_vector () (v1); - initialize_c_vector () (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - static value_type s (0); - for (int j = 0; j < N; ++ j) { - s += v1 [j] * v2 [j]; - } -// sink_scalar (s); - } - footer () (N, N - 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_inner_prod { - typedef typename V::value_type value_type; - - void operator () (int runs) const { - try { - static V v1 (N, N), v2 (N, N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - static value_type s (0); - s = ublas::inner_prod (v1, v2); -// sink_scalar (s); - BOOST_UBLAS_NOT_USED(s); - } - footer () (N, N - 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_inner_prod { - typedef typename V::value_type value_type; - - void operator () (int runs) const { - try { - static V v1 (N), v2 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - static value_type s (0); - s = (v1 * v2).sum (); -// sink_scalar (s); - } - footer () (N, N - 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -template -struct bench_c_vector_add { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_vector_traits::type v1, v2, v3; - initialize_c_vector () (v1); - initialize_c_vector () (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - v3 [j] = - (v1 [j] + v2 [j]); - } -// sink_c_vector () (v3); - BOOST_UBLAS_NOT_USED(v3); - } - footer () (0, 2 * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_vector_add { - typedef typename V::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static V v1 (N, N), v2 (N, N), v3 (N, N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - v3 = - (v1 + v2); -// sink_vector (v3); - } - footer () (0, 2 * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static V v1 (N, N), v2 (N, N), v3 (N, N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - v3.assign (- (v1 + v2)); -// sink_vector (v3); - } - footer () (0, 2 * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_vector_add { - typedef typename V::value_type value_type; - - void operator () (int runs) const { - try { - static V v1 (N), v2 (N), v3 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - v3 = - (v1 + v2); -// sink_vector (v3); - } - footer () (0, 2 * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -// Benchmark O (n) -template -void bench_1::operator () (int runs) { - header ("bench_1"); - - header ("inner_prod"); - - header ("C array"); - bench_c_inner_prod () (runs); - -#ifdef USE_MAPPED_VECTOR -#ifdef USE_MAP_ARRAY - header ("mapped_vector"); - bench_my_inner_prod >, N> () (runs); -#endif - -#ifdef USE_STD_MAP - header ("mapped_vector"); - bench_my_inner_prod >, N> () (runs); -#endif -#endif - -#ifdef USE_COMPRESSED_VECTOR - header ("compressed_vector"); - bench_my_inner_prod, N> () (runs); -#endif - -#ifdef USE_COORDINATE_VECTOR - header ("coordinate_vector"); - bench_my_inner_prod, N> () (runs); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_inner_prod, N> () (runs); -#endif - - header ("vector + vector"); - - header ("C array"); - bench_c_vector_add () (runs); - -#ifdef USE_MAPPED_VECTOR -#ifdef USE_MAP_ARRAY - header ("mapped_vector safe"); - bench_my_vector_add >, N> () (runs, safe_tag ()); - - header ("maped_vector fast"); - bench_my_vector_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_MAP - header ("mapped_vector safe"); - bench_my_vector_add >, N> () (runs, safe_tag ()); - - header ("mapped_vector fast"); - bench_my_vector_add >, N> () (runs, fast_tag ()); -#endif -#endif - -#ifdef USE_COMPRESSED_VECTOR -#ifdef USE_MAP_ARRAY - header ("compressed_vector safe"); - bench_my_vector_add, N> () (runs, safe_tag ()); - - header ("compressed_vector fast"); - bench_my_vector_add, N> () (runs, fast_tag ()); -#endif -#endif - -#ifdef USE_COORDINATE_VECTOR -#ifdef USE_MAP_ARRAY - header ("coordinate_vector safe"); - bench_my_vector_add, N> () (runs, safe_tag ()); - - header ("coordinate_vector fast"); - bench_my_vector_add, N> () (runs, fast_tag ()); -#endif -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_vector_add, N> () (runs); -#endif -} - -#ifdef USE_FLOAT -template struct bench_1; -template struct bench_1; -template struct bench_1; -template struct bench_1; -#endif - -#ifdef USE_DOUBLE -template struct bench_1; -template struct bench_1; -template struct bench_1; -template struct bench_1; -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT -template struct bench_1, 3>; -template struct bench_1, 10>; -template struct bench_1, 30>; -template struct bench_1, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_1, 3>; -template struct bench_1, 10>; -template struct bench_1, 30>; -template struct bench_1, 100>; -#endif -#endif diff --git a/libs/numeric/ublas/benchmarks/bench2/bench22.cpp b/libs/numeric/ublas/benchmarks/bench2/bench22.cpp deleted file mode 100644 index f40df79ae..000000000 --- a/libs/numeric/ublas/benchmarks/bench2/bench22.cpp +++ /dev/null @@ -1,469 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "bench2.hpp" - -template -struct bench_c_outer_prod { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_matrix_traits::type m; - static typename c_vector_traits::type v1, v2; - initialize_c_vector () (v1); - initialize_c_vector () (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - for (int k = 0; k < N; ++ k) { - m [j] [k] = - v1 [j] * v2 [k]; - } - } -// sink_c_matrix () (m); - BOOST_UBLAS_NOT_USED(m); - } - footer () (N * N, N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_outer_prod { - typedef typename M::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static M m (N, N, N * N); - static V v1 (N, N), v2 (N, N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m = - ublas::outer_prod (v1, v2); -// sink_matrix (m); - BOOST_UBLAS_NOT_USED(m); - } - footer () (N * N, N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static M m (N, N, N * N); - static V v1 (N, N), v2 (N, N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m.assign (- ublas::outer_prod (v1, v2)); -// sink_matrix (m); - BOOST_UBLAS_NOT_USED(m); - } - footer () (N * N, N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_outer_prod { - typedef typename M::value_type value_type; - - void operator () (int runs) const { - try { - static M m (N * N); - static V v1 (N), v2 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - for (int k = 0; k < N; ++ k) { - m [N * j + k] = - v1 [j] * v2 [k]; - } - } -// sink_vector (m); - } - footer () (N * N, N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -template -struct bench_c_matrix_vector_prod { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_matrix_traits::type m; - static typename c_vector_traits::type v1, v2; - initialize_c_matrix () (m); - initialize_c_vector () (v1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - v2 [j] = 0; - for (int k = 0; k < N; ++ k) { - v2 [j] += m [j] [k] * v1 [k]; - } - } -// sink_c_vector () (v2); - } - footer () (N * N, N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_matrix_vector_prod { - typedef typename M::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static M m (N, N, N * N); - static V v1 (N, N), v2 (N, N); - initialize_matrix (m); - initialize_vector (v1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - v2 = ublas::prod (m, v1); -// sink_vector (v2); - } - footer () (N * N, N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static M m (N, N, N * N); - static V v1 (N, N), v2 (N, N); - initialize_matrix (m); - initialize_vector (v1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - v2.assign (ublas::prod (m, v1)); -// sink_vector (v2); - } - footer () (N * N, N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_matrix_vector_prod { - typedef typename M::value_type value_type; - - void operator () (int runs) const { - try { - static M m (N * N); - static V v1 (N), v2 (N); - initialize_vector (m); - initialize_vector (v1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - std::valarray row (m [std::slice (N * j, N, 1)]); - v2 [j] = (row * v1).sum (); - } -// sink_vector (v2); - } - footer () (N * N, N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -template -struct bench_c_matrix_add { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_matrix_traits::type m1, m2, m3; - initialize_c_matrix () (m1); - initialize_c_matrix () (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - for (int k = 0; k < N; ++ k) { - m3 [j] [k] = - (m1 [j] [k] + m2 [j] [k]); - } - } -// sink_c_matrix () (m3); - BOOST_UBLAS_NOT_USED(m3); - } - footer () (0, 2 * N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_matrix_add { - typedef typename M::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static M m1 (N, N, N * N), m2 (N, N, N * N), m3 (N, N, N * N); - initialize_matrix (m1); - initialize_matrix (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m3 = - (m1 + m2); -// sink_matrix (m3); - } - footer () (0, 2 * N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static M m1 (N, N, N * N), m2 (N, N, N * N), m3 (N, N, N * N); - initialize_matrix (m1); - initialize_matrix (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m3.assign (- (m1 + m2)); -// sink_matrix (m3); - } - footer () (0, 2 * N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_matrix_add { - typedef typename M::value_type value_type; - - void operator () (int runs) const { - try { - static M m1 (N * N), m2 (N * N), m3 (N * N); - initialize_vector (m1); - initialize_vector (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m3 = - (m1 + m2); -// sink_vector (m3); - } - footer () (0, 2 * N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -// Benchmark O (n ^ 2) -template -void bench_2::operator () (int runs) { - header ("bench_2"); - - header ("outer_prod"); - - header ("C array"); - bench_c_outer_prod () (runs); - -#ifdef USE_SPARSE_MATRIX -#ifdef USE_MAP_ARRAY - header ("sparse_matrix, sparse_vector safe"); - bench_my_outer_prod >, - ublas::sparse_vector >, N> () (runs, safe_tag ()); - - header ("sparse_matrix, sparse_vector fast"); - bench_my_outer_prod >, - ublas::sparse_vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_MAP - header ("sparse_matrix, sparse_vector safe"); - bench_my_outer_prod >, - ublas::sparse_vector >, N> () (runs, safe_tag ()); - - header ("sparse_matrix, sparse_vector fast"); - bench_my_outer_prod >, - ublas::sparse_vector >, N> () (runs, fast_tag ()); -#endif -#endif - -#ifdef USE_COMPRESSED_MATRIX - header ("compressed_matrix, compressed_vector safe"); - bench_my_outer_prod, - ublas::compressed_vector, N> () (runs, safe_tag ()); - - header ("compressed_matrix, compressed_vector fast"); - bench_my_outer_prod, - ublas::compressed_vector, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_COORDINATE_MATRIX - header ("coordinate_matrix, coordinate_vector safe"); - bench_my_outer_prod, - ublas::coordinate_vector, N> () (runs, safe_tag ()); - - header ("coordinate_matrix, coordinate_vector fast"); - bench_my_outer_prod, - ublas::coordinate_vector, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_outer_prod, std::valarray, N> () (runs); -#endif - - header ("prod (matrix, vector)"); - - header ("C array"); - bench_c_matrix_vector_prod () (runs); - -#ifdef USE_SPARSE_MATRIX -#ifdef USE_MAP_ARRAY - header ("sparse_matrix, sparse_vector safe"); - bench_my_matrix_vector_prod >, - ublas::sparse_vector >, N> () (runs, safe_tag ()); - - header ("sparse_matrix, sparse_vector fast"); - bench_my_matrix_vector_prod >, - ublas::sparse_vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_MAP - header ("sparse_matrix, sparse_vector safe"); - bench_my_matrix_vector_prod >, - ublas::sparse_vector >, N> () (runs, safe_tag ()); - - header ("sparse_matrix, sparse_vector fast"); - bench_my_matrix_vector_prod >, - ublas::sparse_vector >, N> () (runs, fast_tag ()); -#endif -#endif - -#ifdef USE_COMPRESSED_MATRIX - header ("compressed_matrix, compressed_vector safe"); - bench_my_matrix_vector_prod, - ublas::compressed_vector, N> () (runs, safe_tag ()); - - header ("compressed_matrix, compressed_vector fast"); - bench_my_matrix_vector_prod, - ublas::compressed_vector, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_COORDINATE_MATRIX - header ("coordinate_matrix, coordinate_vector safe"); - bench_my_matrix_vector_prod, - ublas::coordinate_vector, N> () (runs, safe_tag ()); - - header ("coordinate_matrix, coordinate_vector fast"); - bench_my_matrix_vector_prod, - ublas::coordinate_vector, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_matrix_vector_prod, std::valarray, N> () (runs); -#endif - - header ("matrix + matrix"); - - header ("C array"); - bench_c_matrix_add () (runs); - -#ifdef USE_SPARSE_MATRIX -#ifdef USE_MAP_ARRAY - header ("sparse_matrix safe"); - bench_my_matrix_add >, N> () (runs, safe_tag ()); - - header ("sparse_matrix fast"); - bench_my_matrix_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_MAP - header ("sparse_matrix safe"); - bench_my_matrix_add >, N> () (runs, safe_tag ()); - - header ("sparse_matrix fast"); - bench_my_matrix_add >, N> () (runs, fast_tag ()); -#endif -#endif - -#ifdef USE_COMPRESSED_MATRIX - header ("compressed_matrix safe"); - bench_my_matrix_add, N> () (runs, safe_tag ()); - - header ("compressed_matrix fast"); - bench_my_matrix_add, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_COORDINATE_MATRIX - header ("coordinate_matrix safe"); - bench_my_matrix_add, N> () (runs, safe_tag ()); - - header ("coordinate_matrix fast"); - bench_my_matrix_add, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_matrix_add, N> () (runs); -#endif -} - -#ifdef USE_FLOAT -template struct bench_2; -template struct bench_2; -template struct bench_2; -template struct bench_2; -#endif - -#ifdef USE_DOUBLE -template struct bench_2; -template struct bench_2; -template struct bench_2; -template struct bench_2; -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT -template struct bench_2, 3>; -template struct bench_2, 10>; -template struct bench_2, 30>; -template struct bench_2, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_2, 3>; -template struct bench_2, 10>; -template struct bench_2, 30>; -template struct bench_2, 100>; -#endif -#endif diff --git a/libs/numeric/ublas/benchmarks/bench2/bench23.cpp b/libs/numeric/ublas/benchmarks/bench2/bench23.cpp deleted file mode 100644 index bb363f537..000000000 --- a/libs/numeric/ublas/benchmarks/bench2/bench23.cpp +++ /dev/null @@ -1,196 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "bench2.hpp" - -template -struct bench_c_matrix_prod { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_matrix_traits::type m1, m2, m3; - initialize_c_matrix () (m1); - initialize_c_matrix () (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - for (int k = 0; k < N; ++ k) { - m3 [j] [k] = 0; - for (int l = 0; l < N; ++ l) { - m3 [j] [k] += m1 [j] [l] * m2 [l] [k]; - } - } - } -// sink_c_matrix () (m3); - } - footer () (N * N * N, N * N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_matrix_prod { - typedef typename M1::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static M1 m1 (N, N, N * N), m3 (N, N, N * N); - static M2 m2 (N, N, N * N); - initialize_matrix (m1); - initialize_matrix (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m3 = ublas::prod (m1, m2); -// sink_matrix (m3); - } - footer () (N * N * N, N * N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static M1 m1 (N, N, N * N), m3 (N, N, N * N); - static M2 m2 (N, N, N * N); - initialize_matrix (m1); - initialize_matrix (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m3.assign (ublas::prod (m1, m2)); -// sink_matrix (m3); - } - footer () (N * N * N, N * N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_matrix_prod { - typedef typename M::value_type value_type; - - void operator () (int runs) const { - try { - static M m1 (N * N), m2 (N * N), m3 (N * N); - initialize_vector (m1); - initialize_vector (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - std::valarray row (m1 [std::slice (N * j, N, 1)]); - for (int k = 0; k < N; ++ k) { - std::valarray column (m2 [std::slice (k, N, N)]); - m3 [N * j + k] = (row * column).sum (); - } - } -// sink_vector (m3); - } - footer () (N * N * N, N * N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -// Benchmark O (n ^ 3) -template -void bench_3::operator () (int runs) { - header ("bench_3"); - - header ("prod (matrix, matrix)"); - - header ("C array"); - bench_c_matrix_prod () (runs); - -#ifdef USE_SPARSE_MATRIX -#ifdef USE_MAP_ARRAY - header ("sparse_matrix, sparse_matrix safe"); - bench_my_matrix_prod >, - ublas::sparse_matrix >, N> () (runs, safe_tag ()); - - header ("sparse_matrix, sparse_matrix fast"); - bench_my_matrix_prod >, - ublas::sparse_matrix >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_MAP - header ("sparse_matrix, sparse_matrix safe"); - bench_my_matrix_prod >, - ublas::sparse_matrix >, N> () (runs, safe_tag ()); - - header ("sparse_matrix, sparse_matrix fast"); - bench_my_matrix_prod >, - ublas::sparse_matrix >, N> () (runs, fast_tag ()); -#endif -#endif - -#ifdef USE_COMPRESSED_MATRIX - header ("compressed_matrix, compressed_matrix safe"); - bench_my_matrix_prod, - ublas::compressed_matrix, N> () (runs, safe_tag ()); - - header ("compressed_matrix, compressed_matrix fast"); - bench_my_matrix_prod, - ublas::compressed_matrix, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_COORDINATE_MATRIX - header ("coordinate_matrix, coordinate_matrix safe"); - bench_my_matrix_prod, - ublas::coordinate_matrix, N> () (runs, safe_tag ()); - - header ("coordinate_matrix, coordinate_matrix fast"); - bench_my_matrix_prod, - ublas::coordinate_matrix, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_matrix_prod, N> () (runs); -#endif -} - -#ifdef USE_FLOAT -template struct bench_3; -template struct bench_3; -template struct bench_3; -template struct bench_3; -#endif - -#ifdef USE_DOUBLE -template struct bench_3; -template struct bench_3; -template struct bench_3; -template struct bench_3; -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT -template struct bench_3, 3>; -template struct bench_3, 10>; -template struct bench_3, 30>; -template struct bench_3, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_3, 3>; -template struct bench_3, 10>; -template struct bench_3, 30>; -template struct bench_3, 100>; -#endif -#endif diff --git a/libs/numeric/ublas/benchmarks/bench3/Jamfile.v2 b/libs/numeric/ublas/benchmarks/bench3/Jamfile.v2 deleted file mode 100644 index 7ce9c9b85..000000000 --- a/libs/numeric/ublas/benchmarks/bench3/Jamfile.v2 +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) 2004 Michael Stevens -# 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) - -# bench3 - measure the performance of vector and matrix proxy's operations. - -exe bench3 - : bench3.cpp bench31.cpp bench32.cpp bench33.cpp - ; diff --git a/libs/numeric/ublas/benchmarks/bench3/bench3.cpp b/libs/numeric/ublas/benchmarks/bench3/bench3.cpp deleted file mode 100644 index 390d226ca..000000000 --- a/libs/numeric/ublas/benchmarks/bench3/bench3.cpp +++ /dev/null @@ -1,122 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "bench3.hpp" - -void header (std::string text) { - std::cout << text << std::endl; -} - -template -struct peak_c_plus { - typedef T value_type; - - void operator () (int runs) const { - try { - static T s (0); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - s += T (0); -// sink_scalar (s); - } - footer () (0, 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct peak_c_multiplies { - typedef T value_type; - - void operator () (int runs) const { - try { - static T s (1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - s *= T (1); -// sink_scalar (s); - } - footer () (0, 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -template -void peak::operator () (int runs) { - header ("peak"); - - header ("plus"); - peak_c_plus () (runs); - - header ("multiplies"); - peak_c_multiplies () (runs); -} - - -template -void do_bench (std::string type_string, int scale) -{ - header (type_string); - peak () (1000000 * scale); - - header (type_string + ", 3"); - bench_1 () (1000000 * scale); - bench_2 () (300000 * scale); - bench_3 () (100000 * scale); - - header (type_string + ", 10"); - bench_1 () (300000 * scale); - bench_2 () (30000 * scale); - bench_3 () (3000 * scale); - - header (type_string + ", 30"); - bench_1 () (100000 * scale); - bench_2 () (3000 * scale); - bench_3 () (100 * scale); - - header (type_string + ", 100"); - bench_1 () (30000 * scale); - bench_2 () (300 * scale); - bench_3 () (3 * scale); -} - -int main (int argc, char *argv []) { - - int scale = 1; - if (argc > 1) - scale = std::atoi (argv [1]); - -#ifdef USE_FLOAT - do_bench ("FLOAT", scale); -#endif - -#ifdef USE_DOUBLE - do_bench ("DOUBLE", scale); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - do_bench > ("COMPLEX", scale); -#endif - -#ifdef USE_DOUBLE - do_bench > ("COMPLEX", scale); -#endif -#endif - - return 0; -} diff --git a/libs/numeric/ublas/benchmarks/bench3/bench3.hpp b/libs/numeric/ublas/benchmarks/bench3/bench3.hpp deleted file mode 100644 index 5b64b59af..000000000 --- a/libs/numeric/ublas/benchmarks/bench3/bench3.hpp +++ /dev/null @@ -1,159 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#ifndef BENCH3_H -#define BENCH3_H - -#include -#include -#include - -#include -#include -#include -#include - -#include - - -#define BOOST_UBLAS_NOT_USED(x) (void)(x) - - -namespace ublas = boost::numeric::ublas; - -void header (std::string text); - -template -struct footer { - void operator () (int multiplies, int plus, int runs, double elapsed) { - std::cout << "elapsed: " << elapsed << " s, " - << (multiplies * ublas::type_traits::multiplies_complexity + - plus * ublas::type_traits::plus_complexity) * runs / - (1024 * 1024 * elapsed) << " Mflops" << std::endl; - } -}; - -template -struct c_vector_traits { - typedef T type [N]; -}; -template -struct c_matrix_traits { - typedef T type [N] [M]; -}; - -template -struct initialize_c_vector { - void operator () (typename c_vector_traits::type &v) { - for (int i = 0; i < N; ++ i) - v [i] = std::rand () * 1.f; -// v [i] = 0.f; - } -}; -template -BOOST_UBLAS_INLINE -void initialize_vector (V &v) { - int size = v.size (); - for (int i = 0; i < size; ++ i) - v [i] = std::rand () * 1.f; -// v [i] = 0.f; -} - -template -struct initialize_c_matrix { - void operator () (typename c_matrix_traits::type &m) { - for (int i = 0; i < N; ++ i) - for (int j = 0; j < M; ++ j) - m [i] [j] = std::rand () * 1.f; -// m [i] [j] = 0.f; - } -}; -template -BOOST_UBLAS_INLINE -void initialize_matrix (M &m) { - int size1 = m.size1 (); - int size2 = m.size2 (); - for (int i = 0; i < size1; ++ i) - for (int j = 0; j < size2; ++ j) - m (i, j) = std::rand () * 1.f; -// m (i, j) = 0.f; -} - -template -BOOST_UBLAS_INLINE -void sink_scalar (const T &s) { - static T g_s = s; -} - -template -struct sink_c_vector { - void operator () (const typename c_vector_traits::type &v) { - static typename c_vector_traits::type g_v; - for (int i = 0; i < N; ++ i) - g_v [i] = v [i]; - } -}; -template -BOOST_UBLAS_INLINE -void sink_vector (const V &v) { - static V g_v (v); -} - -template -struct sink_c_matrix { - void operator () (const typename c_matrix_traits::type &m) { - static typename c_matrix_traits::type g_m; - for (int i = 0; i < N; ++ i) - for (int j = 0; j < M; ++ j) - g_m [i] [j] = m [i] [j]; - } -}; -template -BOOST_UBLAS_INLINE -void sink_matrix (const M &m) { - static M g_m (m); -} - -template -struct peak { - void operator () (int runs); -}; - -template -struct bench_1 { - void operator () (int runs); -}; - -template -struct bench_2 { - void operator () (int runs); -}; - -template -struct bench_3 { - void operator () (int runs); -}; - -struct safe_tag {}; -struct fast_tag {}; - -// #define USE_FLOAT -#define USE_DOUBLE -// #define USE_STD_COMPLEX - -#define USE_C_ARRAY -// #define USE_BOUNDED_ARRAY -#define USE_UNBOUNDED_ARRAY -// #define USE_STD_VALARRAY -#define USE_STD_VECTOR - -#endif diff --git a/libs/numeric/ublas/benchmarks/bench3/bench31.cpp b/libs/numeric/ublas/benchmarks/bench3/bench31.cpp deleted file mode 100644 index 9181eb1cf..000000000 --- a/libs/numeric/ublas/benchmarks/bench3/bench31.cpp +++ /dev/null @@ -1,296 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "bench3.hpp" - -template -struct bench_c_inner_prod { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_vector_traits::type v1, v2; - initialize_c_vector () (v1); - initialize_c_vector () (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - static value_type s (0); - for (int j = 0; j < N; ++ j) { - s += v1 [j] * v2 [j]; - } -// sink_scalar (s); - } - footer () (N, N - 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_inner_prod { - typedef typename V::value_type value_type; - - void operator () (int runs) const { - try { - static V v1 (N), v2 (N); - ublas::vector_range vr1 (v1, ublas::range (0, N)), - vr2 (v2, ublas::range (0, N)); - initialize_vector (vr1); - initialize_vector (vr2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - static value_type s (0); - s = ublas::inner_prod (vr1, vr2); -// sink_scalar (s); - BOOST_UBLAS_NOT_USED(s); - } - footer () (N, N - 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_inner_prod { - typedef typename V::value_type value_type; - - void operator () (int runs) const { - try { - static V v1 (N), v2 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - static value_type s (0); - s = (v1 * v2).sum (); -// sink_scalar (s); - } - footer () (N, N - 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -template -struct bench_c_vector_add { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_vector_traits::type v1, v2, v3; - initialize_c_vector () (v1); - initialize_c_vector () (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - v3 [j] = - (v1 [j] + v2 [j]); - } -// sink_c_vector () (v3); - BOOST_UBLAS_NOT_USED(v3); - } - footer () (0, 2 * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_vector_add { - typedef typename V::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static V v1 (N), v2 (N), v3 (N); - ublas::vector_range vr1 (v1, ublas::range (0, N)), - vr2 (v2, ublas::range (0, N)), - vr3 (v2, ublas::range (0, N)); - initialize_vector (vr1); - initialize_vector (vr2); - initialize_vector (vr3); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - vr3 = - (vr1 + vr2); -// sink_vector (vr3); - } - footer () (0, 2 * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static V v1 (N), v2 (N), v3 (N); - ublas::vector_range vr1 (v1, ublas::range (0, N)), - vr2 (v2, ublas::range (0, N)), - vr3 (v2, ublas::range (0, N)); - initialize_vector (vr1); - initialize_vector (vr2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - vr3.assign (- (vr1 + vr2)); -// sink_vector (vr3); - } - footer () (0, 2 * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_vector_add { - typedef typename V::value_type value_type; - - void operator () (int runs) const { - try { - static V v1 (N), v2 (N), v3 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - v3 = - (v1 + v2); -// sink_vector (v3); - } - footer () (0, 2 * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -// Benchmark O (n) -template -void bench_1::operator () (int runs) { - header ("bench_1"); - - header ("inner_prod"); - - header ("C array"); - bench_c_inner_prod () (runs); - -#ifdef USE_C_ARRAY - header ("c_vector"); - bench_my_inner_prod, N> () (runs); -#endif - -#ifdef USE_BOUNDED_ARRAY - header ("vector"); - bench_my_inner_prod >, N> () (runs); -#endif - -#ifdef USE_UNBOUNDED_ARRAY - header ("vector"); - bench_my_inner_prod >, N> () (runs); -#endif - -#ifdef USE_STD_VALARRAY - header ("vector"); - bench_my_inner_prod >, N> () (); -#endif - -#ifdef USE_STD_VECTOR - header ("vector"); - bench_my_inner_prod >, N> () (runs); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_inner_prod, N> () (runs); -#endif - - header ("vector + vector"); - - header ("C array"); - bench_c_vector_add () (runs); - -#ifdef USE_C_ARRAY - header ("c_vector safe"); - bench_my_vector_add, N> () (runs, safe_tag ()); - - header ("c_vector fast"); - bench_my_vector_add, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_BOUNDED_ARRAY - header ("vector safe"); - bench_my_vector_add >, N> () (runs, safe_tag ()); - - header ("vector fast"); - bench_my_vector_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_UNBOUNDED_ARRAY - header ("vector safe"); - bench_my_vector_add >, N> () (runs, safe_tag ()); - - header ("vector fast"); - bench_my_vector_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("vector safe"); - bench_my_vector_add >, N> () (runs, safe_tag ()); - - header ("vector fast"); - bench_my_vector_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VECTOR - header ("vector safe"); - bench_my_vector_add >, N> () (runs, safe_tag ()); - - header ("vector fast"); - bench_my_vector_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_vector_add, N> () (runs); -#endif -} - -#ifdef USE_FLOAT -template struct bench_1; -template struct bench_1; -template struct bench_1; -template struct bench_1; -#endif - -#ifdef USE_DOUBLE -template struct bench_1; -template struct bench_1; -template struct bench_1; -template struct bench_1; -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT -template struct bench_1, 3>; -template struct bench_1, 10>; -template struct bench_1, 30>; -template struct bench_1, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_1, 3>; -template struct bench_1, 10>; -template struct bench_1, 30>; -template struct bench_1, 100>; -#endif -#endif diff --git a/libs/numeric/ublas/benchmarks/bench3/bench32.cpp b/libs/numeric/ublas/benchmarks/bench3/bench32.cpp deleted file mode 100644 index 3819090bb..000000000 --- a/libs/numeric/ublas/benchmarks/bench3/bench32.cpp +++ /dev/null @@ -1,501 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "bench3.hpp" - -template -struct bench_c_outer_prod { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_matrix_traits::type m; - static typename c_vector_traits::type v1, v2; - initialize_c_vector () (v1); - initialize_c_vector () (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - for (int k = 0; k < N; ++ k) { - m [j] [k] = - v1 [j] * v2 [k]; - } - } -// sink_c_matrix () (m); - BOOST_UBLAS_NOT_USED(m); - } - footer () (N * N, N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_outer_prod { - typedef typename M::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static M m (N, N); - ublas::matrix_range mr (m, ublas::range (0, N), ublas::range (0, N)); - static V v1 (N), v2 (N); - ublas::vector_range vr1 (v1, ublas::range (0, N)), - vr2 (v2, ublas::range (0, N)); - initialize_vector (vr1); - initialize_vector (vr2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - mr = - ublas::outer_prod (vr1, vr2); -// sink_matrix (mr); - } - footer () (N * N, N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static M m (N, N); - ublas::matrix_range mr (m, ublas::range (0, N), ublas::range (0, N)); - static V v1 (N), v2 (N); - ublas::vector_range vr1 (v1, ublas::range (0, N)), - vr2 (v2, ublas::range (0, N)); - initialize_vector (vr1); - initialize_vector (vr2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - mr.assign (- ublas::outer_prod (vr1, vr2)); -// sink_matrix (mr); - } - footer () (N * N, N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_outer_prod { - typedef typename M::value_type value_type; - - void operator () (int runs) const { - try { - static M m (N * N); - static V v1 (N), v2 (N); - initialize_vector (v1); - initialize_vector (v2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - for (int k = 0; k < N; ++ k) { - m [N * j + k] = - v1 [j] * v2 [k]; - } - } -// sink_vector (m); - } - footer () (N * N, N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -template -struct bench_c_matrix_vector_prod { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_matrix_traits::type m; - static typename c_vector_traits::type v1, v2; - initialize_c_matrix () (m); - initialize_c_vector () (v1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - v2 [j] = 0; - for (int k = 0; k < N; ++ k) { - v2 [j] += m [j] [k] * v1 [k]; - } - } -// sink_c_vector () (v2); - } - footer () (N * N, N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_matrix_vector_prod { - typedef typename M::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static M m (N, N); - ublas::matrix_range mr (m, ublas::range (0, N), ublas::range (0, N)); - static V v1 (N), v2 (N); - ublas::vector_range vr1 (v1, ublas::range (0, N)), - vr2 (v2, ublas::range (0, N)); - initialize_matrix (mr); - initialize_vector (vr1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - vr2 = ublas::prod (mr, vr1); -// sink_vector (vr2); - } - footer () (N * N, N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static M m (N, N); - ublas::matrix_range mr (m, ublas::range (0, N), ublas::range (0, N)); - static V v1 (N), v2 (N); - ublas::vector_range vr1 (v1, ublas::range (0, N)), - vr2 (v2, ublas::range (0, N)); - initialize_matrix (mr); - initialize_vector (vr1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - vr2.assign (ublas::prod (mr, vr1)); -// sink_vector (vr2); - } - footer () (N * N, N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_matrix_vector_prod { - typedef typename M::value_type value_type; - - void operator () (int runs) const { - try { - static M m (N * N); - static V v1 (N), v2 (N); - initialize_vector (m); - initialize_vector (v1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - std::valarray row (m [std::slice (N * j, N, 1)]); - v2 [j] = (row * v1).sum (); - } -// sink_vector (v2); - } - footer () (N * N, N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -template -struct bench_c_matrix_add { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_matrix_traits::type m1, m2, m3; - initialize_c_matrix () (m1); - initialize_c_matrix () (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - for (int k = 0; k < N; ++ k) { - m3 [j] [k] = - (m1 [j] [k] + m2 [j] [k]); - } - } -// sink_c_matrix () (m3); - BOOST_UBLAS_NOT_USED(m3); - } - footer () (0, 2 * N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_matrix_add { - typedef typename M::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static M m1 (N, N), m2 (N, N), m3 (N, N); - initialize_matrix (m1); - initialize_matrix (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m3 = - (m1 + m2); -// sink_matrix (m3); - } - footer () (0, 2 * N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static M m1 (N, N), m2 (N, N), m3 (N, N); - initialize_matrix (m1); - initialize_matrix (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m3.assign (- (m1 + m2)); -// sink_matrix (m3); - } - footer () (0, 2 * N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_matrix_add { - typedef typename M::value_type value_type; - - void operator () (int runs) const { - try { - static M m1 (N * N), m2 (N * N), m3 (N * N); - initialize_vector (m1); - initialize_vector (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - m3 = - (m1 + m2); -// sink_vector (m3); - } - footer () (0, 2 * N * N, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -// Benchmark O (n ^ 2) -template -void bench_2::operator () (int runs) { - header ("bench_2"); - - header ("outer_prod"); - - header ("C array"); - bench_c_outer_prod () (runs); - -#ifdef USE_C_ARRAY - header ("c_matrix, c_vector safe"); - bench_my_outer_prod, - ublas::c_vector, N> () (runs, safe_tag ()); - - header ("c_matrix, c_vector fast"); - bench_my_outer_prod, - ublas::c_vector, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_BOUNDED_ARRAY - header ("matrix, vector safe"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_UNBOUNDED_ARRAY - header ("matrix, vector safe"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("matrix, vector safe"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VECTOR - header ("matrix, vector safe"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_outer_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_outer_prod, std::valarray, N> () (runs); -#endif - - header ("prod (matrix, vector)"); - - header ("C array"); - bench_c_matrix_vector_prod () (runs); - -#ifdef USE_C_ARRAY - header ("c_matrix, c_vector safe"); - bench_my_matrix_vector_prod, - ublas::c_vector, N> () (runs, safe_tag ()); - - header ("c_matrix, c_vector fast"); - bench_my_matrix_vector_prod, - ublas::c_vector, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_BOUNDED_ARRAY - header ("matrix, vector safe"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_UNBOUNDED_ARRAY - header ("matrix, vector safe"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("matrix, vector safe"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VECTOR - header ("matrix, vector safe"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, safe_tag ()); - - header ("matrix, vector fast"); - bench_my_matrix_vector_prod >, - ublas::vector >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_matrix_vector_prod, std::valarray, N> () (runs); -#endif - - header ("matrix + matrix"); - - header ("C array"); - bench_c_matrix_add () (runs); - -#ifdef USE_C_ARRAY - header ("c_matrix safe"); - bench_my_matrix_add, N> () (runs, safe_tag ()); - - header ("c_matrix fast"); - bench_my_matrix_add, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_BOUNDED_ARRAY - header ("matrix safe"); - bench_my_matrix_add >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_UNBOUNDED_ARRAY - header ("matrix safe"); - bench_my_matrix_add >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("matrix safe"); - bench_my_matrix_add >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VECTOR - header ("matrix safe"); - bench_my_matrix_add >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_add >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_matrix_add, N> () (runs); -#endif -} - -#ifdef USE_FLOAT -template struct bench_2; -template struct bench_2; -template struct bench_2; -template struct bench_2; -#endif - -#ifdef USE_DOUBLE -template struct bench_2; -template struct bench_2; -template struct bench_2; -template struct bench_2; -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT -template struct bench_2, 3>; -template struct bench_2, 10>; -template struct bench_2, 30>; -template struct bench_2, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_2, 3>; -template struct bench_2, 10>; -template struct bench_2, 30>; -template struct bench_2, 100>; -#endif -#endif diff --git a/libs/numeric/ublas/benchmarks/bench3/bench33.cpp b/libs/numeric/ublas/benchmarks/bench3/bench33.cpp deleted file mode 100644 index 9b8e1070e..000000000 --- a/libs/numeric/ublas/benchmarks/bench3/bench33.cpp +++ /dev/null @@ -1,198 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "bench3.hpp" - -template -struct bench_c_matrix_prod { - typedef T value_type; - - void operator () (int runs) const { - try { - static typename c_matrix_traits::type m1, m2, m3; - initialize_c_matrix () (m1); - initialize_c_matrix () (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - for (int k = 0; k < N; ++ k) { - m3 [j] [k] = 0; - for (int l = 0; l < N; ++ l) { - m3 [j] [k] += m1 [j] [l] * m2 [l] [k]; - } - } - } -// sink_c_matrix () (m3); - } - footer () (N * N * N, N * N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_my_matrix_prod { - typedef typename M::value_type value_type; - - void operator () (int runs, safe_tag) const { - try { - static M m1 (N, N), m2 (N, N), m3 (N, N); - ublas::matrix_range mr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mr2 (m2, ublas::range (0, N), ublas::range (0, N)), - mr3 (m3, ublas::range (0, N), ublas::range (0, N)); - initialize_matrix (mr1); - initialize_matrix (mr2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - mr3 = ublas::prod (mr1, mr2); -// sink_matrix (mr3); - } - footer () (N * N * N, N * N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } - void operator () (int runs, fast_tag) const { - try { - static M m1 (N, N), m2 (N, N), m3 (N, N); - ublas::matrix_range mr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mr2 (m2, ublas::range (0, N), ublas::range (0, N)), - mr3 (m3, ublas::range (0, N), ublas::range (0, N)); - initialize_matrix (mr1); - initialize_matrix (mr2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - mr3.assign (ublas::prod (mr1, mr2)); -// sink_matrix (mr3); - } - footer () (N * N * N, N * N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct bench_cpp_matrix_prod { - typedef typename M::value_type value_type; - - void operator () (int runs) const { - try { - static M m1 (N * N), m2 (N * N), m3 (N * N); - initialize_vector (m1); - initialize_vector (m2); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - for (int j = 0; j < N; ++ j) { - std::valarray row (m1 [std::slice (N * j, N, 1)]); - for (int k = 0; k < N; ++ k) { - std::valarray column (m2 [std::slice (k, N, N)]); - m3 [N * j + k] = (row * column).sum (); - } - } -// sink_vector (m3); - } - footer () (N * N * N, N * N * (N - 1), runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -// Benchmark O (n ^ 3) -template -void bench_3::operator () (int runs) { - header ("bench_3"); - - header ("prod (matrix, matrix)"); - - header ("C array"); - bench_c_matrix_prod () (runs); - -#ifdef USE_C_ARRAY - header ("c_matrix safe"); - bench_my_matrix_prod, N> () (runs, safe_tag ()); - - header ("c_matrix fast"); - bench_my_matrix_prod, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_BOUNDED_ARRAY - header ("matrix safe"); - bench_my_matrix_prod >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_prod >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_UNBOUNDED_ARRAY - header ("matrix safe"); - bench_my_matrix_prod >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_prod >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("matrix safe"); - bench_my_matrix_prod >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_prod >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VECTOR - header ("matrix safe"); - bench_my_matrix_prod >, N> () (runs, safe_tag ()); - - header ("matrix fast"); - bench_my_matrix_prod >, N> () (runs, fast_tag ()); -#endif - -#ifdef USE_STD_VALARRAY - header ("std::valarray"); - bench_cpp_matrix_prod, N> () (runs); -#endif -} - -#ifdef USE_FLOAT -template struct bench_3; -template struct bench_3; -template struct bench_3; -template struct bench_3; -#endif - -#ifdef USE_DOUBLE -template struct bench_3; -template struct bench_3; -template struct bench_3; -template struct bench_3; -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT -template struct bench_3, 3>; -template struct bench_3, 10>; -template struct bench_3, 30>; -template struct bench_3, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_3, 3>; -template struct bench_3, 10>; -template struct bench_3, 30>; -template struct bench_3, 100>; -#endif -#endif diff --git a/libs/numeric/ublas/benchmarks/bench4/Jamfile.v2 b/libs/numeric/ublas/benchmarks/bench4/Jamfile.v2 deleted file mode 100644 index 94a9f0700..000000000 --- a/libs/numeric/ublas/benchmarks/bench4/Jamfile.v2 +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2004 Michael Stevens -# 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) - -# bench4 measurs the abstraction penalty of dense matrix and vector -# operations with boost::numeric::interval(s). - -exe bench4 - : bench4.cpp bench41.cpp bench42.cpp bench43.cpp - : BOOST_UBLAS_USE_INTERVAL - ; diff --git a/libs/numeric/ublas/benchmarks/bench4/bench4.cpp b/libs/numeric/ublas/benchmarks/bench4/bench4.cpp deleted file mode 100644 index 6d460eb16..000000000 --- a/libs/numeric/ublas/benchmarks/bench4/bench4.cpp +++ /dev/null @@ -1,135 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include "../bench1/bench1.hpp" - -void header (std::string text) { - std::cout << text << std::endl; -} - -template -struct peak_c_plus { - typedef T value_type; - - void operator () (int runs) const { - try { - static T s (0); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - s += T (0); -// sink_scalar (s); - } - footer () (0, 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; -template -struct peak_c_multiplies { - typedef T value_type; - - void operator () (int runs) const { - try { - static T s (1); - boost::timer t; - for (int i = 0; i < runs; ++ i) { - s *= T (1); -// sink_scalar (s); - } - footer () (0, 1, runs, t.elapsed ()); - } - catch (std::exception &e) { - std::cout << e.what () << std::endl; - } - } -}; - -template -void peak::operator () (int runs) { - header ("peak"); - - header ("plus"); - peak_c_plus () (runs); - - header ("multiplies"); - peak_c_multiplies () (runs); -} - -template struct peak >; -template struct peak >; - -#ifdef USE_BOOST_COMPLEX - -template struct peak > >; -template struct peak > >; - -#endif - - - -template -void do_bench (std::string type_string, int scale) -{ - header (type_string); - peak () (1000000 * scale); - - header (type_string + ", 3"); - bench_1 () (1000000 * scale); - bench_2 () (300000 * scale); - bench_3 () (100000 * scale); - - header (type_string + ", 10"); - bench_1 () (300000 * scale); - bench_2 () (30000 * scale); - bench_3 () (3000 * scale); - - header (type_string + ", 30"); - bench_1 () (100000 * scale); - bench_2 () (3000 * scale); - bench_3 () (100 * scale); - - header (type_string + ", 100"); - bench_1 () (30000 * scale); - bench_2 () (300 * scale); - bench_3 () (3 * scale); -} - -int main (int argc, char *argv []) { - - int scale = 1; - if (argc > 1) - scale = std::atoi (argv [1]); - -#ifdef USE_FLOAT - do_bench > ("boost::numeric::interval", scale); -#endif - -#ifdef USE_DOUBLE - do_bench > ("boost::numeric::interval", scale); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - do_bench > > ("boost::numeric::interval>", scale); -#endif - -#ifdef USE_DOUBLE - do_bench > > ("boost::numeric::interval>", scale); -#endif -#endif - - return 0; -} diff --git a/libs/numeric/ublas/benchmarks/bench4/bench41.cpp b/libs/numeric/ublas/benchmarks/bench4/bench41.cpp deleted file mode 100644 index 2ef2d696f..000000000 --- a/libs/numeric/ublas/benchmarks/bench4/bench41.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include "../bench1/bench11.cpp" - - -#ifdef USE_FLOAT -template struct bench_1, 3>; -template struct bench_1, 10>; -template struct bench_1, 30>; -template struct bench_1, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_1, 3>; -template struct bench_1, 10>; -template struct bench_1, 30>; -template struct bench_1, 100>; -#endif - -#ifdef USE_BOOST_COMPLEX -#ifdef USE_FLOAT -template struct bench_1 >, 3>; -template struct bench_1 >, 10>; -template struct bench_1 >, 30>; -template struct bench_1 >, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_1 >, 3>; -template struct bench_1 >, 10>; -template struct bench_1 >, 30>; -template struct bench_1 >, 100>; -#endif -#endif diff --git a/libs/numeric/ublas/benchmarks/bench4/bench42.cpp b/libs/numeric/ublas/benchmarks/bench4/bench42.cpp deleted file mode 100644 index 55f9060bc..000000000 --- a/libs/numeric/ublas/benchmarks/bench4/bench42.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include "../bench1/bench12.cpp" - - -#ifdef USE_FLOAT -template struct bench_2, 3>; -template struct bench_2, 10>; -template struct bench_2, 30>; -template struct bench_2, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_2, 3>; -template struct bench_2, 10>; -template struct bench_2, 30>; -template struct bench_2, 100>; -#endif - -#ifdef USE_BOOST_COMPLEX -#ifdef USE_FLOAT -template struct bench_2 >, 3>; -template struct bench_2 >, 10>; -template struct bench_2 >, 30>; -template struct bench_2 >, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_2 >, 3>; -template struct bench_2 >, 10>; -template struct bench_2 >, 30>; -template struct bench_2 >, 100>; -#endif -#endif diff --git a/libs/numeric/ublas/benchmarks/bench4/bench43.cpp b/libs/numeric/ublas/benchmarks/bench4/bench43.cpp deleted file mode 100644 index c39655a43..000000000 --- a/libs/numeric/ublas/benchmarks/bench4/bench43.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include "../bench1/bench13.cpp" - - -#ifdef USE_FLOAT -template struct bench_3, 3>; -template struct bench_3, 10>; -template struct bench_3, 30>; -template struct bench_3, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_3, 3>; -template struct bench_3, 10>; -template struct bench_3, 30>; -template struct bench_3, 100>; -#endif - -#ifdef USE_BOOST_COMPLEX -#ifdef USE_FLOAT -template struct bench_3 >, 3>; -template struct bench_3 >, 10>; -template struct bench_3 >, 30>; -template struct bench_3 >, 100>; -#endif - -#ifdef USE_DOUBLE -template struct bench_3 >, 3>; -template struct bench_3 >, 10>; -template struct bench_3 >, 30>; -template struct bench_3 >, 100>; -#endif -#endif diff --git a/libs/numeric/ublas/benchmarks/bench5/Jamfile.v2 b/libs/numeric/ublas/benchmarks/bench5/Jamfile.v2 deleted file mode 100644 index d180f5c63..000000000 --- a/libs/numeric/ublas/benchmarks/bench5/Jamfile.v2 +++ /dev/null @@ -1,11 +0,0 @@ -# Copyright (c) 2004-2010 Michael Stevens, David Bellot -# 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) - -# bench5 measures performance of the assignment operator - -exe bench5 - : assignment_bench.cpp - : BOOST_UBLAS_USE_INTERVAL - ; diff --git a/libs/numeric/ublas/benchmarks/bench5/assignment_bench.cpp b/libs/numeric/ublas/benchmarks/bench5/assignment_bench.cpp deleted file mode 100644 index 532f37911..000000000 --- a/libs/numeric/ublas/benchmarks/bench5/assignment_bench.cpp +++ /dev/null @@ -1,141 +0,0 @@ -// -// Copyright (c) 2010 Athanasios Iliopoulos -// -// Distributed under the 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 -#include -#include -#include -#include - -using namespace boost::numeric::ublas; - -int main() { - - boost::timer timer; - - unsigned int iterations = 1000000000; - double elapsed_exp, elapsed_assigner; - - std::cout << "Ublas vector Benchmarks------------------------ " << "\n"; - - { - std::cout << "Size 2 vector: " << "\n"; - vector a(2); - - timer.restart(); - for(unsigned int i=0; i!=iterations; i++) { - a(0)=0; a(1)=1; - } - elapsed_exp = timer.elapsed(); - std::cout << "Explicit element assign time: " << elapsed_exp << " secs" << "\n"; - - timer.restart(); - for(unsigned int i=0; i!=iterations; i++) - a <<= 0, 1; - elapsed_assigner = timer.elapsed(); - std::cout << "Assigner time: " << elapsed_assigner << " secs" << "\n"; - std::cout << "Difference: " << (elapsed_assigner/elapsed_exp-1)*100 << "%" << std::endl; - } - - { - std::cout << "Size 3 vector: " << "\n"; - vector a(3); - - timer.restart(); - for(unsigned int i=0; i!=iterations; i++) { - a(0)=0; a(1)=1; a(2)=2; - } - elapsed_exp = timer.elapsed(); - std::cout << "Explicit element assign time: " << elapsed_exp << " secs" << "\n"; - - timer.restart(); - for(unsigned int i=0; i!=iterations; i++) - a <<= 0, 1, 2; - elapsed_assigner = timer.elapsed(); - std::cout << "Assigner time: " << elapsed_assigner << " secs" << "\n"; - std::cout << "Difference: " << (elapsed_assigner/elapsed_exp-1)*100 << "%" << std::endl; - } - - iterations = 100000000; - - { - std::cout << "Size 8 vector: " << "\n"; - vector a(8); - - timer.restart(); - for(unsigned int i=0; i!=iterations; i++) { - a(0)=0; a(1)=1; a(2)=2; a(3)=3; a(4)=4; a(5)=5; a(6)=6; a(7)=7; - } - elapsed_exp = timer.elapsed(); - std::cout << "Explicit element assign time: " << elapsed_exp << " secs" << "\n"; - - timer.restart(); - for(unsigned int i=0; i!=iterations; i++) - a <<= 0, 1, 2, 3, 4, 5, 6, 7; - elapsed_assigner = timer.elapsed(); - std::cout << "Assigner time: " << elapsed_assigner << " secs" << "\n"; - std::cout << "Difference: " << (elapsed_assigner/elapsed_exp-1)*100 << "%" << std::endl; - } - - - std::cout << "Ublas matrix Benchmarks------------------------ " << "\n"; - - iterations = 200000000; - { - std::cout << "Size 3x3 matrix: " << "\n"; - matrix a(3,3); - - timer.restart(); - for(unsigned int i=0; i!=iterations; i++) { - a(0,0)=0; a(0,1)=1; a(0,2)=2; - a(1,0)=3; a(1,1)=4; a(1,2)=5; - a(2,0)=6; a(2,1)=7; a(2,2)=8; - } - elapsed_exp = timer.elapsed(); - std::cout << "Explicit element assign time: " << elapsed_exp << " secs" << "\n"; - - timer.restart(); - for(unsigned int i=0; i!=iterations; i++) - a <<= 0, 1, 2, 3, 4, 5, 6, 7, 8; - elapsed_assigner = timer.elapsed(); - std::cout << "Assigner time: " << elapsed_assigner << " secs" << "\n"; - std::cout << "Difference: " << (elapsed_assigner/elapsed_exp-1)*100 << "%" << std::endl; - } - - std::cout << "Size 2x2 matrix: " << "\n"; - iterations = 500000000; - { - matrix a(2,2); - - timer.restart(); - for(unsigned int i=0; i!=iterations; i++) { - a(0,0)=0; a(0,1)=1; - a(1,0)=3; a(1,1)=4; - } - elapsed_exp = timer.elapsed(); - std::cout << "Explicit element assign time: " << elapsed_exp << " secs" << "\n"; - - timer.restart(); - for(unsigned int i=0; i!=iterations; i++) - a <<= 0, 1, 3, 4; - elapsed_assigner = timer.elapsed(); - std::cout << "Assigner time: " << elapsed_assigner << " secs" << "\n"; - - std::cout << "Difference: " << (elapsed_assigner/elapsed_exp-1)*100 << "%" << std::endl; - - timer.restart(); - for(unsigned int i=0; i!=iterations; i++) - a <<= traverse_policy::by_row_no_wrap(), 0, 1, next_row(), 3, 4; - elapsed_assigner = timer.elapsed(); - std::cout << "Assigner time no_wrap: " << elapsed_assigner << " secs" << "\n"; - std::cout << "Difference: " << (elapsed_assigner/elapsed_exp-1)*100 << "%" << std::endl; - } - - return 0; -} - diff --git a/libs/numeric/ublas/doc/banded.html b/libs/numeric/ublas/doc/banded.html deleted file mode 100644 index 6ce82f2df..000000000 --- a/libs/numeric/ublas/doc/banded.html +++ /dev/null @@ -1,580 +0,0 @@ - - - - - - - - - -Banded Matrix - - -

Banded Matrix

-
-

Banded Matrix

-

Description

-

The templated class banded_matrix<T, F, A> is -the base container adaptor for banded matrices. For a (m x -n)-dimensional banded matrix with l lower and -u upper diagonals and 0 <= i < m, 0 -<= j < n holds bi, j = -0, if i > j + l or i < j - u. The -storage of banded matrices is packed.

-

Example

-
-#include <boost/numeric/ublas/banded.hpp>
-#include <boost/numeric/ublas/io.hpp>
-
-int main () {
-    using namespace boost::numeric::ublas;
-    banded_matrix<double> m (3, 3, 1, 1);
-    for (signed i = 0; i < signed (m.size1 ()); ++ i)
-        for (signed j = std::max (i - 1, 0); j < std::min (i + 2, signed (m.size2 ())); ++ j)
-            m (i, j) = 3 * i + j;
-    std::cout << m << std::endl;
-}
-
-

Definition

-

Defined in the header banded.hpp.

-

Template parameters

- - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault
TThe type of object stored in the matrix.
FFunctor describing the storage organization. [1]row_major
AThe type of the adapted array. [2]unbounded_array<T>
-

Model of

-

Matrix .

-

Type requirements

-

None, except for those imposed by the requirements of Matrix .

-

Public base classes

-

matrix_container<banded_matrix<T, F, A> ->

-

Members

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MemberDescription
banded_matrix ()Allocates an uninitialized banded_matrix that -holds zero rows of zero elements.
banded_matrix (size_type size1, size_type size2, -size_type lower = 0, size_type upper = 0)Allocates an uninitialized banded_matrix that -holds (lower + 1 + upper) diagonals around the main -diagonal of a matrix with size1 rows of -size2 elements.
banded_matrix (const banded_matrix &m)The copy constructor.
template<class AE>
-banded_matrix (const matrix_expression<AE> -&ae)
The extended copy constructor.
void resize (size_type size1, size_type size2, size_type -lower = 0, size_type upper = 0, bool preserve = true)Reallocates a banded_matrix to hold (lower + -1 + upper) diagonals around the main diagonal of a matrix -with size1 rows of size2 elements. The -existing elements of the banded_matrix are preseved -when specified.
size_type size1 () constReturns the number of rows.
size_type size2 () constReturns the number of columns.
size_type lower () constReturns the number of diagonals below the main diagonal.
size_type upper () constReturns the number of diagonals above the main diagonal.
const_reference operator () (size_type i, size_type j) -constReturns a const reference of the j --th element in the i-th row.
reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
banded_matrix &operator = (const banded_matrix -&m)The assignment operator.
banded_matrix &assign_temporary (banded_matrix -&m)Assigns a temporary. May change the banded matrix -m .
template<class AE>
-banded_matrix &operator = (const matrix_expression<AE> -&ae)
The extended assignment operator.
template<class AE>
-banded_matrix &assign (const matrix_expression<AE> -&ae)
Assigns a matrix expression to the banded matrix. Left and -right hand side of the assignment should be independent.
template<class AE>
-banded_matrix &operator += (const matrix_expression<AE> -&ae)
A computed assignment operator. Adds the matrix expression to -the banded matrix.
template<class AE>
-banded_matrix &plus_assign (const matrix_expression<AE> -&ae)
Adds a matrix expression to the banded matrix. Left and right -hand side of the assignment should be independent.
template<class AE>
-banded_matrix &operator -= (const matrix_expression<AE> -&ae)
A computed assignment operator. Subtracts the matrix expression -from the banded matrix.
template<class AE>
-banded_matrix &minus_assign (const matrix_expression<AE> -&ae)
Subtracts a matrix expression from the banded matrix. Left and -right hand side of the assignment should be independent.
template<class AT>
-banded_matrix &operator *= (const AT &at)
A computed assignment operator. Multiplies the banded matrix -with a scalar.
template<class AT>
-banded_matrix &operator /= (const AT &at)
A computed assignment operator. Divides the banded matrix -through a scalar.
void swap (banded_matrix &m)Swaps the contents of the banded matrices.
void insert (size_type i, size_type j, const_reference -t)Inserts the value t at the j-th -element of the i-th row.
void erase (size_type i, size_type j)Erases the value at the j-th elemenst of the -i-th row.
void clear ()Clears the matrix.
const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the banded_matrix.
const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the banded_matrix.
iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the banded_matrix.
iterator1 end1 ()Returns a iterator1 pointing to the end of the -banded_matrix.
const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the banded_matrix.
const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the banded_matrix.
iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the banded_matrix.
iterator2 end2 ()Returns a iterator2 pointing to the end of the -banded_matrix.
const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed banded_matrix.
const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed banded_matrix.
reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed banded_matrix.
reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed banded_matrix.
const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed banded_matrix.
const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed banded_matrix.
reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed banded_matrix.
reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed banded_matrix.
-

Notes

-

[1] Supported -parameters for the storage organization are row_major -and column_major.

-

[2] Supported -parameters for the adapted array are -unbounded_array<T> , -bounded_array<T> and -std::vector<T> .

-

Banded Adaptor

-

Description

-

The templated class banded_adaptor<M> is a -banded matrix adaptor for other matrices.

-

Example

-
-#include <boost/numeric/ublas/banded.hpp>
-#include <boost/numeric/ublas/io.hpp>
-
-int main () {
-    using namespace boost::numeric::ublas;
-    matrix<double> m (3, 3);
-    banded_adaptor<matrix<double> > ba (m, 1, 1);
-    for (signed i = 0; i < signed (ba.size1 ()); ++ i)
-        for (signed j = std::max (i - 1, 0); j < std::min (i + 2, signed (ba.size2 ())); ++ j)
-            ba (i, j) = 3 * i + j;
-    std::cout << ba << std::endl;
-}
-
-

Definition

-

Defined in the header banded.hpp.

-

Template parameters

- - - - - - - - - - - - - -
ParameterDescriptionDefault
MThe type of the adapted matrix.
-

Model of

-

Matrix Expression -.

-

Type requirements

-

None, except for those imposed by the requirements of Matrix Expression .

-

Public base classes

-

matrix_expression<banded_adaptor<M> ->

-

Members

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MemberDescription
banded_adaptor (matrix_type &data, size_type lower = -0, size_type upper = 0)Constructs a banded_adaptor that holds -(lower + 1 + upper) diagonals around the main diagonal -of a matrix.
banded_adaptor (const banded_adaptor &m)The copy constructor.
template<class AE>
-banded_adaptor (const matrix_expression<AE> -&ae)
The extended copy constructor.
size_type size1 () constReturns the number of rows.
size_type size2 () constReturns the number of columns.
size_type lower () constReturns the number of diagonals below the main diagonal.
size_type upper () constReturns the number of diagonals above the main diagonal.
const_reference operator () (size_type i, size_type j) -constReturns a const reference of the j --th element in the i-th row.
reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
banded_adaptor &operator = (const banded_adaptor -&m)The assignment operator.
banded_adaptor &assign_temporary (banded_adaptor -&m)Assigns a temporary. May change the banded adaptor -m .
template<class AE>
-banded_adaptor &operator = (const matrix_expression<AE> -&ae)
The extended assignment operator.
template<class AE>
-banded_adaptor &assign (const matrix_expression<AE> -&ae)
Assigns a matrix expression to the banded adaptor. Left and -right hand side of the assignment should be independent.
template<class AE>
-banded_adaptor &operator += (const matrix_expression<AE> -&ae)
A computed assignment operator. Adds the matrix expression to -the banded adaptor.
template<class AE>
-banded_adaptor &plus_assign (const matrix_expression<AE> -&ae)
Adds a matrix expression to the banded adaptor. Left and right -hand side of the assignment should be independent.
template<class AE>
-banded_adaptor &operator -= (const matrix_expression<AE> -&ae)
A computed assignment operator. Subtracts the matrix expression -from the banded adaptor.
template<class AE>
-banded_adaptor &minus_assign (const matrix_expression<AE> -&ae)
Subtracts a matrix expression from the banded adaptor. Left and -right hand side of the assignment should be independent.
template<class AT>
-banded_adaptor &operator *= (const AT &at)
A computed assignment operator. Multiplies the banded adaptor -with a scalar.
template<class AT>
-banded_adaptor &operator /= (const AT &at)
A computed assignment operator. Divides the banded adaptor -through a scalar.
void swap (banded_adaptor &m)Swaps the contents of the banded adaptors.
const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the banded_adaptor.
const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the banded_adaptor.
iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the banded_adaptor.
iterator1 end1 ()Returns a iterator1 pointing to the end of the -banded_adaptor.
const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the banded_adaptor.
const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the banded_adaptor.
iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the banded_adaptor.
iterator2 end2 ()Returns a iterator2 pointing to the end of the -banded_adaptor.
const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed banded_adaptor.
const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed banded_adaptor.
reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed banded_adaptor.
reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed banded_adaptor.
const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed banded_adaptor.
const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed banded_adaptor.
reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed banded_adaptor.
reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed banded_adaptor.
-
-

Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
- 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). -

- - - diff --git a/libs/numeric/ublas/doc/blas.html b/libs/numeric/ublas/doc/blas.html deleted file mode 100644 index 07573e835..000000000 --- a/libs/numeric/ublas/doc/blas.html +++ /dev/null @@ -1,452 +0,0 @@ - - - - - BLAS - - - - - - - - - - - -

Level 3 BLAS

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Functions

template<class M1, class T, class M2, class M3> M1 & boost::numeric::ublas::blas_3::tmm (M1 &m1, const T &t, const M2 &m2, const M3 &m3)
 triangular matrix multiplication

template<class M1, class T, class M2, class C> M1 & boost::numeric::ublas::blas_3::tsm (M1 &m1, const T &t, const M2 &m2, C)
 triangular solve m2 * x = t * m1 in place, m2 is a triangular matrix

template<class M1, class T1, class T2, class M2, class M3> M1 & boost::numeric::ublas::blas_3::gmm (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2, const M3 &m3)
 general matrix multiplication

template<class M1, class T1, class T2, class M2> M1 & boost::numeric::ublas::blas_3::srk (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2)
 symmetric rank k update: m1 = t * m1 + t2 * (m2 * m2T)

template<class M1, class T1, class T2, class M2> M1 & boost::numeric::ublas::blas_3::hrk (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2)
 hermitian rank k update: m1 = t * m1 + t2 * (m2 * m2H)

template<class M1, class T1, class T2, class M2, class M3> M1 & boost::numeric::ublas::blas_3::sr2k (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2, const M3 &m3)
 generalized symmetric rank k update: m1 = t1 * m1 + t2 * (m2 * m3T) + t2 * (m3 * m2T)

template<class M1, class T1, class T2, class M2, class M3> M1 & boost::numeric::ublas::blas_3::hr2k (M1 &m1, const T1 &t1, const T2 &t2, const M2 &m2, const M3 &m3)
 generalized hermitian rank k update: m1 = t1 * m1 + t2 * (m2 * m3H) + (m3 * (t2 * m2)H)

template<class M, class E1, class E2> BOOST_UBLAS_INLINE M & boost::numeric::ublas::axpy_prod (const matrix_expression< E1 > &e1, const matrix_expression< E2 > &e2, M &m, bool init=true)
 computes M += A X or M = A X in an optimized fashion.

template<class M, class E1, class E2> BOOST_UBLAS_INLINE M & boost::numeric::ublas::opb_prod (const matrix_expression< E1 > &e1, const matrix_expression< E2 > &e2, M &m, bool init=true)
 computes M += A X or M = A X in an optimized fashion.

- -
- -

Function Documentation

- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
M1& tmm M1 &  m1,
const T &  t,
const M2 &  m2,
const M3 &  m3
-
- - - - - -
-   - -

triangular matrix multiplication

-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
M1& tsm M1 &  m1,
const T &  t,
const M2 &  m2,
-
- - - - - -
-   - - -

-triangular solve m2 * x = t * m1 in place, m2 is a triangular matrix -

-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
M1& gmm M1 &  m1,
const T1 &  t1,
const T2 &  t2,
const M2 &  m2,
const M3 &  m3
-
- - - - - -
-   - - -

-general matrix multiplication -

-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
M1& srk M1 &  m1,
const T1 &  t1,
const T2 &  t2,
const M2 &  m2
-
- - - - - -
-   - - -

-symmetric rank k update: m1 = t * m1 + t2 * (m2 * m2T) -

-
Todo:
use opb_prod()
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
M1& hrk M1 &  m1,
const T1 &  t1,
const T2 &  t2,
const M2 &  m2
-
- - - - - -
-   - - -

-hermitian rank k update: m1 = t * m1 + t2 * (m2 * m2H) -

-
Todo:
use opb_prod()
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
M1& sr2k M1 &  m1,
const T1 &  t1,
const T2 &  t2,
const M2 &  m2,
const M3 &  m3
-
- - - - - -
-   - - -

-generalized symmetric rank k update: m1 = t1 * m1 + t2 * (m2 * m3T) + t2 * (m3 * m2T) -

-
Todo:
use opb_prod()
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
M1& hr2k M1 &  m1,
const T1 &  t1,
const T2 &  t2,
const M2 &  m2,
const M3 &  m3
-
- - - - - -
-   - - -

-generalized hermitian rank k update: m1 = t1 * m1 + t2 * (m2 * m3H) + (m3 * (t2 * m2)H) -

-
Todo:
use opb_prod()
-
- - - -
-

Copyright (©) 2000-2004 Michael Stevens, Mathias Koch, -Joerg Walter, Gunter Winkler
-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). -

- - - diff --git a/libs/numeric/ublas/doc/bounded_array.html b/libs/numeric/ublas/doc/bounded_array.html deleted file mode 100644 index fea0d7b53..000000000 --- a/libs/numeric/ublas/doc/bounded_array.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - - -Bounded Array; - - -

Bounded Array Storage

-
-

Bounded Array

-

Description

-

The templated class bounded_array<T, N, ALLOC> implements a bounded storage array. The bounded array is similar to a C++ array type in that its maximum size is bounded by N and is allocated on the stack instead of the heap. Similarly a bounded_array requires no secondary storage and ALLOC is only used to specify size_type and difference_type. -

-

When resized bounded_array never reallocated the storage. It is therefore always efficient to resize a bounded_array but the size bound N must not be exceeded.

-

Example

-
-#include <boost/numeric/ublas/storage.hpp>
-
-int main () {
-    using namespace boost::numeric::ublas;
-    bounded_array<double, 3> a (3);
-    for (unsigned i = 0; i < a.size (); ++ i) {
-        a [i] = i;
-        std::cout << a [i] << std::endl;
-    }
-}
-
-

Definition

-

Defined in the header storage.hpp.

-

Template parameters

- - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault
TThe type of object stored in the array.
NThe allocation size of the array.
ALLOCAn STL Allocatorstd::allocator
-

Model of

-

Storage

-

Type requirements

-

None, except for those imposed by the requirements of Storage.

-

Public base classes

-

None.

-

Members

-
    -
  • The description does not describe what the member actually does, this can be looked up -in the corresponding concept documentation, but instead contains a remark on the implementation of the -member inside this model of the concept.
  • -
  • Typography: -
      -
    • Members that are not part of the implemented concepts are in blue.
    • -
    -
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MemberWhere definedDescription
value_typeContainer
pointerContainerDefined as value_type*
const_pointerContainerDefined as const value_type*
referenceContainerDefined as value_type&
const_referenceContainerDefined as const value_type&
size_typeContainerDefined as Alloc::size_type
difference_typeContainerDefined as Alloc::difference_type
iteratorContainerDefined as pointer
const_iteratorContainerDefined as const_pointer
revere_iteratorContainerDefined as std::reverse_iterator<iterator>
const_revere_iteratorContainerDefined as std::reverse_iterator<const_iterator>
bounded_array ()StorageCreates an unbounded_array that holds zero elements.
bounded_array (size_type size)StorageCreates a uninitialized bounded_array that holds size elements. All the elements are default constructed.
bounded_array (size_type size, const T& init)StorageCreates an initialized bounded_array that holds size elements. All the elements are constructed from the init value.
bounded_array (const bounded_array &c)ContainerThe copy constructor.
~bounded_array ()ContainerDeallocates the bounded_array itself.
void resize (size_type size)Storage -Reallocates a bounded_array to hold size elements.
void resize (size_type size, const T& t)Storage -Reallocates a bounded_array to hold size elements.
size_type size () constContainerReturns the size of the bounded_array.
const_reference operator [] (size_type i) constContainerReturns a const reference of the i -th element.
reference operator [] (size_type i)ContainerReturns a reference of the i-th element.
bounded_array &operator = (const bounded_array &a)ContainerThe assignment operator.
bounded_array &assign_temporary (bounded_array &a)Assigns a temporary. May change the array a.
void swap (bounded_array &a)ContainerSwaps the contents of the arrays.
const_iterator begin () constContainerReturns a const_iterator pointing to the beginning of the bounded_array.
const_iterator end () constContainerReturns a const_iterator pointing to the end of the bounded_array.
iterator begin ()ContainerReturns a iterator pointing to the beginning of the bounded_array.
iterator end ()ContainerReturns a iterator pointing to the end of the bounded_array.
const_reverse_iterator rbegin () constReversible ContainerReturns a const_reverse_iterator pointing to the beginning of the reversed bounded_array.
const_reverse_iterator rend () constReversible ContainerReturns a const_reverse_iterator pointing to the end of the reversed bounded_array.
reverse_iterator rbegin ()Reversible ContainerReturns a reverse_iterator pointing to the beginning of the reversed bounded_array.
reverse_iterator rend ()Reversible ContainerReturns a reverse_iterator pointing to the end of the reversed bounded_array.
-
-

- Copyright (©) 2000-2004 Michael Stevens, Mathias Koch, - Joerg Walter, Gunter Winkler
- 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 - ). -

- - - diff --git a/libs/numeric/ublas/doc/container_concept.html b/libs/numeric/ublas/doc/container_concept.html deleted file mode 100644 index 6c8346f80..000000000 --- a/libs/numeric/ublas/doc/container_concept.html +++ /dev/null @@ -1,424 +0,0 @@ - - - - - - - - - -Container Concepts - - -

Container Concepts

-
-

Vector

-

Description

-

A Vector describes common aspects of dense, packed and sparse -vectors.

-

Refinement of

-

DefaultConstructible, -Vector Expression -[1].

-

Associated types

-

In addition to the types defined by Vector Expression

- - - - - - - - - - - - - -
Public basevector_container<V>V must be derived from this public base type.
Storage arrayV::array_type -Dense Vector ONLY. The type of underlying storage array used to store the elements. The array_type must model the -Storage concept.
-

Notation

- - - - - - - - - - - - - - - - - - - - - - - -
VA type that is a model of Vector
vObjects of type V
n, iObjects of a type convertible to size_type
tObject of a type convertible to value_type
pObject of a type convertible to bool
-

Definitions

-

Valid expressions

-

In addition to the expressions defined in DefaultConstructible, -Vector Expression the following expressions must be valid.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Sizing constructorV v (n) V
Insertv.insert_element (i, t)v is mutable.void
Erasev.erase_element (i)v is mutable.void
Clearv.clear ()v is mutable.void
Resizev.resize (n)
-v.resize (n, p)
v is mutable.void
Storagev.data()v is mutable and Dense.array_type& if v is mutable, const array_type& otherwise
-

Expression semantics

-

Semantics of an expression is defined only where it differs -from, or is not defined in Vector Expression .

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionPreconditionSemanticsPostcondition
Sizing constructorV v (n)n >= 0Allocates a vector ofn elements.v.size () == n.
Element access [2]v[n]0<n>v.size()returns the n-th element in v 
Insertv.insert_element (i, t)0 <= i < v.size ().Inserts an element at v (i) with value t. -The storage requirement of the Vector may be increased.v (i) is equal to t.
Erasev.erase_element (i)0 <= i < v.size ()Destroys the element as v (i) and replaces it with the default -value_type (). -The storage requirement of the Vector may be decreased.v (i) is equal to value_type ().
Clearv.clear () Equivalent to
-for (i = 0; i < v.size (); ++ i)
v.erase_element (i);
 
Resizev.resize (n) -
v.resize (n, p)
 Reallocates the vector so that it can hold n -elements.
-Erases or appends elements in order to bring the vector to the prescribed size. Appended elements copies of value_type(). -
-When p == false then existing elements are not preserved and elements will not appended as normal. Instead the vector is in the same state as that after an equivalent sizing constructor.
v.size () == n.
Storagev.data()Returns a reference to the underlying dense storage. 
-

Complexity guarantees

-

The run-time complexity of the sizing constructor is linear in -the vector's size.

-

The run-time complexity of insert_element and erase_element is specific for the -Vector model and it depends on increases/decreases in storage requirements.

-

The run-time complexity of resize is linear in the vector's -size.

-

Invariants

-

Models

-
    -
  • vector, bounded_vector, c_vector
  • -
  • unit_vector, zero_vector, scalar_vector
  • -
  • mapped_vector;, compressed_vector, coordinate_vector
  • -
-

Notes

-

[1] -As a user you need not care about Vector being a refinement of the VectorExpression. Being a refinement of the VectorExpression is only important for the template-expression engine but not the user.

-

[2] -The operator[] is added purely for convenience -and compatibility with the std::vector. In uBLAS however, -generally operator() is used for indexing because this can be -used for both vectors and matrices.

-

Matrix

-

Description

-

A Matrix describes common aspects of dense, packed and sparse -matrices.

-

Refinement of

-

DefaultConstructible, -Matrix Expression -[1] -.

-

Associated types

-

In addition to the types defined by Matrix Expression

- - - - - - - - - - - - - -
Public basematrix_container<M>M must be derived from this public base type.
Storage arrayM::array_typeDense Matrix ONLY. The type of underlying storage array used to store the elements. The array_type must model -the Storage concept.
-

Notation

- - - - - - - - - - - - - - - - - - - - - - - -
MA type that is a model of Matrix
mObjects of type M
n1, n2, i, jObjects of a type convertible to size_type
tObject of a type convertible to value_type
pObject of a type convertible to bool
-

Definitions

-

Valid expressions

-

In addition to the expressions defined in Matrix Expression the -following expressions must be valid.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Sizing constructorM m (n1, n2) M
Insertm.insert_element (i, j, t)m is mutable.void
Erasem.erase_element (i, j)m is mutable.void
Clearm.clear ()m is mutable.void
Resizem.resize (n1, n2)
-m.resize (n1, n2, p)
m is mutable.void
Storagem.data()m is mutable and Dense.array_type& if m is mutable, const array_type& otherwise
-

Expression semantics

-

Semantics of an expression is defined only where it differs -from, or is not defined in Matrix Expression .

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionPreconditionSemanticsPostcondition
Sizing constructorM m (n1, n2)n1 >= 0 and n2 >= 0Allocates a matrix of n1 rows and n2 -columns.m.size1 () == n1 and m.size2 () == -n2.
Insertm.insert_element (i, j, t)0 <= i < m.size1 (),
-0 <= j < m.size2 ().
Inserts an element at m (i, j) with value t. -The storage requirement of the Matrix may be increased.m (i, j) is equal to t.
Erasem.erase_element (i, j)0 <= i < m.size1 ()and
-0 <= j < m.size2
Destroys the element as m (i, j) and replaces it with the default -value_type (). -The storage requirement of the Matrix may be decreased.m (i, j) is equal to value_type ().
Clearm.clear () Equivalent to
-for (i = 0; i < m.size1 (); ++ i)
for (j = 0; j < m.size2 (); ++ j)
-    m.erase_element (i, j);
 
Resizem.resize (n1, n2) -
-m.resize (n1, n2, p) -
 Reallocate the matrix so that it can hold n1 rows -and n2 columns.
-Erases or appends elements in order to bring the matrix to the -prescribed size. Appended elements are value_type() -copies.
-When p == false then existing elements are not preserved and elements will not appended as normal. Instead the matrix is in the same state as that after an equivalent sizing constructor.
m.size1 () == n1 and m.size2 () == n2.
Storagem.data()Returns a reference to the underlying dense storage. 
-

Complexity guarantees

-

The run-time complexity of the sizing constructor is quadratic -in the matrix's size.

-

The run-time complexity of insert_element and erase_element is specific for the -Matrix model and it depends on increases/decreases in storage requirements.

-

The run-time complexity of resize is quadratic in the matrix's -size.

-

Invariants

-

Models

-
    -
  • matrix, bounded_matrix, c_matrix
  • -
  • identity_matrix , zero_matrix , scalar_matrix
  • -
  • triangular_matrix , symmetric_matrix , banded_matrix
  • -
  • mapped_matrix , compressed_matrix , coordinate_matrix
  • -
-

Notes

-

[1] -As a user you need not care about Matrix being a refinement of the MatrixExpression. Being a refinement of the MatrixExpression is only important for the template-expression engine but not the user.

-
-

Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
- 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 - ). -

- - - diff --git a/libs/numeric/ublas/doc/expression_concept.html b/libs/numeric/ublas/doc/expression_concept.html deleted file mode 100644 index ffbfd1481..000000000 --- a/libs/numeric/ublas/doc/expression_concept.html +++ /dev/null @@ -1,1074 +0,0 @@ - - - - - - - - -Expression Concepts - - -

Expression Concepts

-
-

Scalar Expression

-

Description

-

A Scalar Expression is an expression convertible to a scalar -type.

-

Refinement of

-

Default Constructible.

-

Associated types

- - - - - - - - - - - - - -
Public basescaler_expression<S>S must be derived from this public base type.
Value typevalue_typeThe type of the scalar expression.
-

Notation

- - - - - - - -
SA type that is a model of Scalar Expression
-

Definitions

-

Valid expressions

-

In addition to the expressions defined in Default Constructible -the following expressions must be valid.

- - - - - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Evaluationoperator value_type () const value_type
-

Expression semantics

-

Semantics of an expression is defined only where it differs -from, or is not defined in Default Constructible.

- - - - - - - - - - - - - - - - - -
NameExpressionPreconditionSemanticsPostcondition
Evaluationoperator value_type () const   Evaluates the scalar expression. 
-

Complexity guarantees

-

The run-time complexity of the evaluation is specific for the -evaluated scalar expression.

-

Invariants

-

Models

-
    -
  • vector_scalar_unary
  • -
  • vector_scalar_binary
  • -
-

Vector Expression

-

Description

-

A Vector Expression is an expression evaluatable to a vector. -Vector Expression provides an Indexed Bidirectional -Iterator or an Indexed Random Access -Iterator .

-

Refinement of

-

Default Constructible.

-

Associated types

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Public basevector_expression<V>V must be derived from this public base type.
Value typevalue_type -The element type of the vector expression. -
Reference typereference -The return type when accessing an element of a vector expression. -
-Convertable to avalue_type. -
Const reference typeconst_reference -The return type when accessing an element of a constant vector expression. -
-Convertable to avalue_type. -
Size typesize_type -The index type of the vector expression. Am unsigned integral type used to represent size and index values. -
-Can represent any nonnegative value of difference_type. -
Distance typedifference_type -A signed integral type used to represent the distance between two of the vector expression's iterators. -
Const iterator typeconst_iteratorA type of iterator that may be used to examine a vector -expression's elements.
Iterator typeiteratorA type of iterator that may be used to modify a vector -expression's elements.
Const reverse iterator typeconst_reverse_iteratorA Reverse Iterator adaptor whose base iterator type is the -vector expression's const iterator type.
Reverse iterator typereverse_iteratorA Reverse Iterator adaptor whose base iterator type is the -vector expression's iterator type.
-

Notation

- - - - - - - - - - - - - - - - - - - -
VA type that is a model of Vector Expression
v, v1, v2Object of type V
iObject of a type convertible to size_type
tObject of a type convertible to value_type
-

Definitions

-

Valid expressions

-

In addition to the expressions defined in Default Constructible -the following expressions must be valid.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Beginning of rangev.begin () const_iterator
v.begin ()v is mutable.iterator
End of rangev.end () const_iterator
v.end ()v is mutable.iterator
Sizev.size () size_type
Swapv1.swap (v2)v1 and v2 are mutable.void
Beginning of reverse rangev.rbegin () const_reverse_iterator
v.rbegin ()v is mutable.reverse_iterator
End of reverse rangev.rend () const_reverse_iterator
v.rend ()v is mutable.reverse_iterator
Element accessv (i)i is convertible to size_type.Convertible to value_type.
Assignmentv2 = v1v2 is mutable and v1 is convertible -to V.V &
v2.assign (v1)v2 is mutable and v1 is convertible -to V.V &
Computed assignmentv2 += v1v2 is mutable and v1 is convertible -to V.V &
v2.plus_assign (v1)v2 is mutable and v1 is convertible -to V.V &
v2 -= v1v2 is mutable and v1 is convertible -to V.V &
v2.minus_assign (v1)v2 is mutable and v1 is convertible -to V.V &
v *= tv is mutable and t is convertible to -value_type.V &
-

Expression semantics

-

Semantics of an expression is defined only where it differs -from, or is not defined in Default Constructible.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionPreconditionSemanticsPostcondition
Beginning of rangev.begin () Returns an iterator pointing to the first element in the vector -expression.v.begin () is either dereferenceable or -past-the-end. It is past-the-end if and only if v.size () == -0.
End of rangev.end () Returns an iterator pointing one past the last element in the -vector expression.v.end () is past-the-end.
Sizev.size () Returns the size of the vector expression, that is, its number -of elements.v.size () >= 0
Swapv1.swap (v2) Equivalent to swap (v1, v2). 
Beginning of reverse rangev.rbegin () Equivalent to reverse_iterator (v.end ()).v.rbegin () is either dereferenceable or -past-the-end. It is past-the-end if and only if v.size () == -0.
End of reverse rangev.rend () Equivalent to reverse_iterator (v.begin ()).v.rend () is past-the-end.
Element accessv (i)0 <= i < v.size ()Returns the i-th element of the vector -expression. 
Assignmentv2 = v1v1.size () == v2.size ()Assigns every element of the evaluated vector expression -v1 to the corresponding element of v2 -. 
v2.assign (v1)v1.size () == v2.size ()Assigns every element of v1 to the corresponding -element of v2. 
Computed assignmentv2 += v1v1.size () == v2.size ()Adds every element of the evaluated vector expression -v1 to the corresponding element of -v2. 
v2.plus_assign (v1)v1.size () == v2.size ()Adds every element of v1 to the corresponding -element of v2. 
v2 -= v1v1.size () == v2.size ()Subtracts every element of the evaluated vector expression -v1 from the corresponding element of v2 -. 
v2.minus_assign (v1)v1.size () == v2.size ()Subtracts every element of v1 from the -corresponding element of v2. 
v *= t Multiplies every element of v with t -. 
-

Complexity guarantees

-

The run-time complexity of begin () and end -() is specific for the evaluated vector expression, -typically amortized constant time.

-

The run-time complexity of size () is constant -time.

-

The run-time complexity of swap () is specific for -the evaluated vector expression, typically constant time.

-

The run-time complexity of rbegin () and rend -() is specific for the evaluated vector expression, -typically amortized constant time.

-

The run-time complexity of the element access is specific for -the evaluated vector expression, typically amortized constant time -for the dense and logarithmic for the sparse case.

-

The run-time complexity of the arithmetic operations is specific -for the evaluated vector expressions, typically linear in the size -of the expressions.

-

Invariants

- - - - - - - - - - - - - - - - - - - -
Valid rangeFor any vector expression v, [v.begin (), -v.end ()) is a valid range.
CompletenessAn algorithm that iterates through the range [v.begin (), -v.end ()) will pass through every element of v -.
Valid reverse range[v.rbegin (), v.rend ()) is a valid range.
Equivalence of rangesThe distance from v.begin () to v.end -() is the same as the distance from v.rbegin () -to v.rend ().
-

Models

-
    -
  • vector_range;
  • -
  • vector_slice
  • -
  • matrix_row
  • -
  • matrix_column
  • -
  • matrix_vector_range
  • -
  • matrix_vector_slice
  • -
  • vector_unary
  • -
  • vector_binary
  • -
  • vector_binary_scalar1
  • -
  • vector_binary_scalar2
  • -
  • matrix_vector_unary1
  • -
  • matrix_vector_unary2
  • -
  • matrix_vector_binary1
  • -
  • matrix_vector_binary2
  • -
- -

Matrix Expression

-

Description

-

A Matrix Expression is an expression evaluatable to a matrix. -Matrix Expression provides an Indexed -Bidirectional Column/Row Iterator or an Indexed Random -Access Column/Row Iterator .

-

Refinement of

-

Default Constructible.

- -

Associated types

-
immutable types
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Public basematrix_expression<M>M must be derived from this public base type.
Value typevalue_type -The element type of the matrix expression. -
Const reference typeconst_reference -The return type when accessing an element of a constant matrix expression. -
-Convertable to a value_type. -
Size typesize_type -The index type of the matrix expression. Am unsigned integral type used to represent size and index values. -
-Can represent any nonnegative value of difference_type. -
Distance typedifference_type -A signed integral type used to represent the distance between two of the matrix expression's iterators. -
Const iterator typesconst_iterator1A type of column iterator that may be used to examine a matrix -expression's elements.
const_iterator2A type of row iterator that may be used to examine a matrix -expression's elements.
Const reverse iterator typesconst_reverse_iterator1A Reverse Iterator adaptor whose base iterator type is the -matrix expression's const column iterator type.
const_reverse_iterator2A Reverse Iterator adaptor whose base iterator type is the -matrix expression's const row iterator type.
- -
mutable types
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Reference typereference -The return type when accessing an element of a matrix expression. -
-Convertable to a value_type. -
Iterator typesiterator1A type of column iterator that may be used to modify a matrix -expression's elements.
iterator2A type of row iterator that may be used to modify a matrix -expression's elements.
Reverse iterator typesreverse_iterator1A Reverse Iterator adaptor whose base iterator type is the -matrix expression's column iterator type.
reverse_iterator2A Reverse Iterator adaptor whose base iterator type is the -matrix expression's row iterator type.
- - -

Notation

- - - - - - - - - - - - - - - - - - - -
MA type that is a model of Matrix Expression
m, m1, m2Object of type M
i, jObjects of a type convertible to size_type
tObject of a type convertible to value_type
-

Definitions

-

Valid expressions

-

In addition to the expressions defined in Default Constructible -the following expressions must be valid.

- -
immutable expressions
- - - - - - - - - - - - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Sizem.size1 () size_type
m.size2 () size_type
- -
possibly mutable expressions
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Beginning of rangem.begin1 () const_iterator1
m.begin2 () const_iterator2
m.begin1 ()m is mutable. iterator1
m.begin2 ()m is mutable.iterator2
End of rangem.end1 () const_iterator1
m.end2 () const_iterator2
m.end1 ()m is mutable. iterator1
m.end2 ()m is mutable.iterator2
Swapm1.swap (m2)m1 and m2 are mutable. void
Beginning of reverse rangem.rbegin1 () const_reverse_iterator1
m.rbegin2 () const_reverse_iterator2
m.rbegin1 ()m is mutable. reverse_iterator1
m.rbegin2 ()m is mutable.reverse_iterator2
End of reverse rangem.rend1 () const_reverse_iterator1
m.rend2 () const_reverse_iterator2
m.rend1 ()m is mutable.reverse_iterator1
m.rend2 ()m is mutable.reverse_iterator2
Element accessm (i, j)i and j are convertible to -size_type .Convertible to value_type.
Assignmentm2 = m1m2 is mutable and m1 is convertible -to M.M &
m2.assign (m1)m2 is mutable and m1 is convertible -to M.M &
Computed assignmentm2 += m1m2 is mutable and m1 is convertible -to M.M &
m2.plus_assign (m1)m2 is mutable and m1 is convertible -to M.M &
m2 -= m1m2 is mutable and m1 is convertible -to M.M &
m2.minus_assign (m1)m2 is mutable and m1 is convertible -to M.M &
m *= tm is mutable and t is convertible to -value_type.M &
-

Expression semantics

-

Semantics of an expression is defined only where it differs -from, or is not defined in Default Constructible.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionPreconditionSemanticsPostcondition
Beginning of rangem.begin1 () Returns an iterator pointing to the first element in the first -column of a matrix expression.m.begin1 () is either dereferenceable or -past-the-end. It is past-the-end if and only if m.size1 () == -0.
m.begin2 () Returns an iterator pointing to the first element in the first -row of a matrix expression.m.begin2 () is either dereferenceable or -past-the-end. It is past-the-end if and only if m.size2 () == -0.
End of rangem.end1 () Returns an iterator pointing one past the last element in the -matrix expression.m.end1 () is past-the-end.
m.end2 () Returns an iterator pointing one past the last element in the -matrix expression.m.end2 () is past-the-end.
Sizem.size1 () Returns the number of rows of the matrix expression.m.size1 () >= 0
m.size2 () Returns the number of columns of the matrix expression.m.size2 () >= 0
Swapm1.swap (m2) Equivalent to swap (m1, m2). 
Beginning of reverse rangem.rbegin1 () Equivalent to reverse_iterator1 (m.end1 ()).m.rbegin1 () is either dereferenceable or -past-the-end. It is past-the-end if and only if m.size1 () == -0.
m.rbegin2 () Equivalent to reverse_iterator2 (m.end2 ()).m.rbegin2 () is either dereferenceable or -past-the-end. It is past-the-end if and only if m.size2 () == -0.
End of reverse rangem.rend1 () Equivalent to reverse_iterator1 (m.begin1 -()).m.rend1 () is past-the-end.
m.rend2 () Equivalent to reverse_iterator2 (m.begin2 -()).m.rend2 () is past-the-end.
Element accessm (i, j)0 <= i < m.size1 () and 0 <= j < -m.size2 ()Returns the j-th element of the i-th -row of the matrix expression. 
Assignmentm2 = m1m1.size1 () == m2.size1 () and
-m1.size2 () == m2.size2 ()
Assigns every element of the evaluated matrix expression -m1 to the corresponding element of m2 -. 
m2.assign (m1)m1.size1 () == m2.size1 () and
-m1.size2 () == m2.size2 ()
Assigns every element of m1 to the corresponding -element of m2. 
Computed assignmentm2 += m1m1.size1 () == m2.size1 () and
-m1.size2 () == m2.size2 ()
Adds every element of the evaluated matrix expression -m1 to the corresponding element of -m2. 
m2.plus_assign (m1)m1.size1 () == m2.size1 () and
-m1.size2 () == m2.size2 ()
Adds every element of m1 to the corresponding -element of m2. 
m2 -= m1m1.size1 () == m2.size1 () and
-m1.size2 () == m2.size2 ()
Subtracts every element of the evaluated matrix expression -m1 from the corresponding element of m2 -. 
m2.minus_assign (m1)m1.size1 () == m2.size1 () and
-m1.size2 () == m2.size2 ()
Subtracts every element of m1 from the -corresponding element of m2. 
m *= t Multiplies every element of m with t -. 
-

Complexity guarantees

-

The run-time complexity of begin1 (), begin2 -() , end1 () and end2 () is -specific for the evaluated matrix expression.

-

The run-time complexity of size1 () and size2 -() is constant time.

-

The run-time complexity of swap () is specific for -the evaluated matrix expression, typically constant time.

-

The run-time complexity of rbegin1 (), -rbegin2 () , rend1 () and rend2 -() is specific for the evaluated matrix expression.

-

The run-time complexity of the element access is specific for -the evaluated matrix expression, typically amortized constant time -for the dense and logarithmic for the sparse case.

-

The run-time complexity of the arithmetic operations is specific -for the evaluated matrix expressions, typically quadratic in the -size of the proxies.

-

Invariants

- - - - - - - - - - - - - - - - - - - -
Valid rangeFor any matrix expression m, [m.begin1 (), -m.end1 ()) and [m.begin2 (), m.end2 ()) are -valid ranges.
CompletenessAn algorithm that iterates through the range [m.begin1 -(), m.end1 ()) will pass through every row of m -, an algorithm that iterates through the range [m.begin2 (), -m.end2 ()) will pass through every column of m -.
Valid reverse range[m.rbegin1 (), m.rend1 ()) and [m.rbegin2 -(), m.rend2 ()) are valid ranges.
Equivalence of rangesThe distance from m.begin1 () to m.end1 -() is the same as the distance from m.rbegin1 -() to m.rend1 () and the distance from -m.begin2 () to m.end2 () is the same as -the distance from m.rbegin2 () to m.rend2 -().
-

Models

-
    -
  • matrix_range
  • -
  • matrix_slice;
  • -
  • triangular_adaptor
  • -
  • symmetric_adaptor
  • -
  • banded_adaptor
  • -
  • vector_matrix_binary
  • -
  • matrix_unary1
  • -
  • matrix_unary2
  • -
  • matrix_binary
  • -
  • matrix_binary_scalar1
  • -
  • matrix_binary_scalar2
  • -
  • matrix_matrix_binary
  • -
-
-

Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
- 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 - ). -

- - - diff --git a/libs/numeric/ublas/doc/hermitian.html b/libs/numeric/ublas/doc/hermitian.html deleted file mode 100644 index f6a4f62ae..000000000 --- a/libs/numeric/ublas/doc/hermitian.html +++ /dev/null @@ -1,597 +0,0 @@ - - - - - - - - - -Hermitian Matrix - - -

Hermitian Matrix

-
-

Hermitian Matrix

-

Description

-

The templated class hermitian_matrix<T, F1, F2, -A> is the base container adaptor for hermitian matrices. -For a (n x n )-dimensional hermitian matrix and 0 -<= i < n, 0 <= j < n holds -hi, j = hj, -i-. The storage of hermitian -matrices is packed.

-

Example

-
-#include <boost/numeric/ublas/hermitian.hpp>
-#include <boost/numeric/ublas/io.hpp>
-
-int main () {
-    using namespace boost::numeric::ublas;
-    hermitian_matrix<std::complex<double>, lower> ml (3, 3);
-    for (unsigned i = 0; i < ml.size1 (); ++ i) {
-        for (unsigned j = 0; j < i; ++ j)
-            ml (i, j) = std::complex<double> (3 * i + j, 3 * i + j);
-        ml (i, i) = std::complex<double> (4 * i, 0);
-    }
-    std::cout << ml << std::endl;
-    hermitian_matrix<std::complex<double>, upper> mu (3, 3);
-    for (unsigned i = 0; i < mu.size1 (); ++ i) {
-        mu (i, i) = std::complex<double> (4 * i, 0);
-        for (unsigned j = i + 1; j < mu.size2 (); ++ j)
-            mu (i, j) = std::complex<double> (3 * i + j, 3 * i + j);
-    }
-    std::cout << mu << std::endl;
-}
-
-

Definition

-

Defined in the header hermitian.hpp.

-

Template parameters

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault
TThe type of object stored in the matrix.
F1Functor describing the type of the hermitian matrix. [1]lower
F2Functor describing the storage organization. [2]row_major
AThe type of the adapted array. [3]unbounded_array<T>
-

Model of

-

Matrix .

-

Type requirements

-

None, except for those imposed by the requirements of Matrix .

-

Public base classes

-

matrix_container<hermitian_matrix<T, F1, F2, A> ->

-

Members

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MemberDescription
hermitian_matrix ()Allocates an uninitialized hermitian_matrix that -holds zero rows of zero elements.
hermitian_matrix (size_type size)Allocates an uninitialized hermitian_matrix that -holds size rows of size elements.
hermitian_matrix (const hermitian_matrix -&m)The copy constructor.
template<class AE>
-hermitian_matrix (const matrix_expression<AE> -&ae)
The extended copy constructor.
void resize (size_type size, bool preserve = -true)Reallocates a hermitian_matrix to hold -size rows of size elements. The existing -elements of the hermitian_matrix are preseved when -specified.
size_type size1 () constReturns the number of rows.
size_type size2 () constReturns the number of columns.
const_reference operator () (size_type i, size_type j) -constReturns a const reference of the j --th element in the i-th row.
reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
hermitian_matrix &operator = (const hermitian_matrix -&m)The assignment operator.
hermitian_matrix &assign_temporary (hermitian_matrix -&m)Assigns a temporary. May change the hermitian matrix -m .
template<class AE>
-hermitian_matrix &operator = (const matrix_expression<AE> -&ae)
The extended assignment operator.
template<class AE>
-hermitian_matrix &assign (const matrix_expression<AE> -&ae)
Assigns a matrix expression to the hermitian matrix. Left and -right hand side of the assignment should be independent.
template<class AE>
-hermitian_matrix &operator += (const -matrix_expression<AE> &ae)
A computed assignment operator. Adds the matrix expression to -the hermitian matrix.
template<class AE>
-hermitian_matrix &plus_assign (const -matrix_expression<AE> &ae)
Adds a matrix expression to the hermitian matrix. Left and -right hand side of the assignment should be independent.
template<class AE>
-hermitian_matrix &operator -= (const -matrix_expression<AE> &ae)
A computed assignment operator. Subtracts the matrix expression -from the hermitian matrix.
template<class AE>
-hermitian_matrix &minus_assign (const -matrix_expression<AE> &ae)
Subtracts a matrix expression from the hermitian matrix. Left -and right hand side of the assignment should be independent.
template<class AT>
-hermitian_matrix &operator *= (const AT &at)
A computed assignment operator. Multiplies the hermitian matrix -with a scalar.
template<class AT>
-hermitian_matrix &operator /= (const AT &at)
A computed assignment operator. Divides the hermitian matrix -through a scalar.
void swap (hermitian_matrix &m)Swaps the contents of the hermitian matrices.
void insert (size_type i, size_type j, const_reference -t)Inserts the value t at the j-th -element of the i-th row.
void erase (size_type i, size_type j)Erases the value at the j-th elemenst of the -i-th row.
void clear ()Clears the matrix.
const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the hermitian_matrix.
const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the hermitian_matrix.
iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the hermitian_matrix.
iterator1 end1 ()Returns a iterator1 pointing to the end of the -hermitian_matrix.
const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the hermitian_matrix.
const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the hermitian_matrix.
iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the hermitian_matrix.
iterator2 end2 ()Returns a iterator2 pointing to the end of the -hermitian_matrix.
const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed hermitian_matrix.
const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed hermitian_matrix.
reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed hermitian_matrix.
reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed hermitian_matrix.
const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed hermitian_matrix.
const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed hermitian_matrix.
reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed hermitian_matrix.
reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed hermitian_matrix.
-

Notes

-

[1] -Supported parameters for the type of the hermitian matrix are -lower and upper.

-

[2] -Supported parameters for the storage organization are -row_major and column_major.

-

[3] -Supported parameters for the adapted array are -unbounded_array<T> , -bounded_array<T> and -std::vector<T> .

-

Hermitian Adaptor

-

Description

-

The templated class hermitian_adaptor<M, F> -is a hermitian matrix adaptor for other matrices.

-

Example

-
-#include <boost/numeric/ublas/hermitian.hpp>
-#include <boost/numeric/ublas/io.hpp>
-
-int main () {
-    using namespace boost::numeric::ublas;
-    matrix<std::complex<double> > m (3, 3);
-    hermitian_adaptor<matrix<std::complex<double> >, lower> hal (m);
-    for (unsigned i = 0; i < hal.size1 (); ++ i) {
-        for (unsigned j = 0; j < i; ++ j)
-            hal (i, j) = std::complex<double> (3 * i + j, 3 * i + j);
-        hal (i, i) = std::complex<double> (4 * i, 0);
-    }
-    std::cout << hal << std::endl;
-    hermitian_adaptor<matrix<std::complex<double> >, upper> hau (m);
-    for (unsigned i = 0; i < hau.size1 (); ++ i) {
-        hau (i, i) = std::complex<double> (4 * i, 0);
-        for (unsigned j = i + 1; j < hau.size2 (); ++ j)
-            hau (i, j) = std::complex<double> (3 * i + j, 3 * i + j);
-    }
-    std::cout << hau << std::endl;
-}
-
-

Definition

-

Defined in the header hermitian.hpp.

-

Template parameters

- - - - - - - - - - - - - - - - - - -
ParameterDescriptionDefault
MThe type of the adapted matrix.
FFunctor describing the type of the hermitian adaptor. [1]lower
-

Model of

-

Matrix Expression -.

-

Type requirements

-

None, except for those imposed by the requirements of Matrix Expression .

-

Public base classes

-

matrix_expression<hermitian_adaptor<M, F> ->

-

Members

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
MemberDescription
hermitian_adaptor (matrix_type &data)Constructs a hermitian_adaptor of a matrix.
hermitian_adaptor (const hermitian_adaptor -&m)The copy constructor.
template<class AE>
-hermitian_adaptor (const matrix_expression<AE> -&ae)
The extended copy constructor.
size_type size1 () constReturns the number of rows.
size_type size2 () constReturns the number of columns.
const_reference operator () (size_type i, size_type j) -constReturns a const reference of the j --th element in the i-th row.
reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
hermitian_adaptor &operator = (const -hermitian_adaptor &m)The assignment operator.
hermitian_adaptor &assign_temporary -(hermitian_adaptor &m)Assigns a temporary. May change the hermitian adaptor -m.
template<class AE>
-hermitian_adaptor &operator = (const -matrix_expression<AE> &ae)
The extended assignment operator.
template<class AE>
-hermitian_adaptor &assign (const matrix_expression<AE> -&ae)
Assigns a matrix expression to the hermitian adaptor. Left and -right hand side of the assignment should be independent.
template<class AE>
-hermitian_adaptor &operator += (const -matrix_expression<AE> &ae)
A computed assignment operator. Adds the matrix expression to -the hermitian adaptor.
template<class AE>
-hermitian_adaptor &plus_assign (const -matrix_expression<AE> &ae)
Adds a matrix expression to the hermitian adaptor. Left and -right hand side of the assignment should be independent.
template<class AE>
-hermitian_adaptor &operator -= (const -matrix_expression<AE> &ae)
A computed assignment operator. Subtracts the matrix expression -from the hermitian adaptor.
template<class AE>
-hermitian_adaptor &minus_assign (const -matrix_expression<AE> &ae)
Subtracts a matrix expression from the hermitian adaptor. Left -and right hand side of the assignment should be independent.
template<class AT>
-hermitian_adaptor &operator *= (const AT &at)
A computed assignment operator. Multiplies the hermitian -adaptor with a scalar.
template<class AT>
-hermitian_adaptor &operator /= (const AT &at)
A computed assignment operator. Divides the hermitian adaptor -through a scalar.
void swap (hermitian_adaptor &m)Swaps the contents of the hermitian adaptors.
const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the hermitian_adaptor.
const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the hermitian_adaptor.
iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the hermitian_adaptor.
iterator1 end1 ()Returns a iterator1 pointing to the end of the -hermitian_adaptor.
const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the hermitian_adaptor.
const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the hermitian_adaptor.
iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the hermitian_adaptor.
iterator2 end2 ()Returns a iterator2 pointing to the end of the -hermitian_adaptor.
const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed hermitian_adaptor.
const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed hermitian_adaptor.
reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed hermitian_adaptor.
reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed hermitian_adaptor.
const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed hermitian_adaptor.
const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed hermitian_adaptor.
reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed hermitian_adaptor.
reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed hermitian_adaptor.
-

Notes

-

[1] -Supported parameters for the type of the hermitian adaptor are -lower and upper.

-
-

Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
- 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 - ). -

- - - diff --git a/libs/numeric/ublas/doc/index.html b/libs/numeric/ublas/doc/index.html deleted file mode 100644 index 6a3a15dfd..000000000 --- a/libs/numeric/ublas/doc/index.html +++ /dev/null @@ -1,391 +0,0 @@ - - - - - - - - -Boost Basic Linear Algebra - - -

logoBasic Linear Algebra Library

-
- -

uBLAS is a C++ template class library that provides BLAS level 1, 2, 3 -functionality for dense, packed and sparse matrices. The design and implementation unify mathematical notation via -operator overloading and efficient code generation via expression templates.

- -

Functionality

- -

uBLAS provides templated C++ classes for dense, unit and sparse vectors, dense, identity, triangular, banded, -symmetric, hermitian and sparse matrices. Views into vectors and matrices can be constructed via ranges, slices, -adaptor classes and indirect arrays. The library covers the usual basic linear algebra operations on vectors and matrices: reductions like -different norms, addition and subtraction of vectors and matrices and multiplication with a scalar, inner and outer -products of vectors, matrix vector and matrix matrix products and triangular solver. The glue between containers, views -and expression templated operations is a mostly STL conforming iterator interface.

- -

Documentation

- - - - -

Known limitations:

- -
    -
  • The implementation assumes a linear memory address model.
  • - -
  • Tuning was focussed on dense matrices.
  • -
- -

Further Information

- -

Project Location and Download

- -

The latest stable release of uBLAS is part of the Boost libraries.

- -

Documentation and Discussion

- -

Visit the Effective -uBLAS wiki for up to date information and contributions.

- -

There is also an active uBLAS mailing list where uBLAS specific user and -development questions are answered.

- -

uBLAS and Boost Project

- -

There is also an active uBLAS mailing list where uBLAS specific from the -latest uBLAS project code. You can view the Boost -CVS archive directly. You will find the library here. Documentation and test -programs reside here.

- -

Authors and Credits

- -

uBLAS initially was written by Joerg Walter and Mathias Koch. We would like to thank all, which supported and -contributed to the development of this library: David Abrahams, Ed Brey, Fernando Cacciola, Juan Jose Gomez Cadenas, -Beman Dawes, Matt Davies, Bob Fletcher, Kresimir Fresl, Joachim Kessel, Patrick Kowalzick, Toon Knapen, Hendrik Kueck, -John Maddock, Jens Maurer, Alexei Novakov, Gary Powell, Joachim Pyras, Peter Schmitteckert, Jeremy Siek, Markus Steffl, -Michael Stevens, Benedikt Weber, Martin Weiser, Gunter Winkler, Marc Zimmermann, Marco Guazzone, Nasos Iliopoulus, the members of Boost and all others contributors around the world. I promise I will try to add their names to this list.

-

-This library is currently maintained by David Bellot. -

Frequently Asked Questions

- -

Q: Should I use uBLAS for new projects?
-A: At the time of writing (09/2012) there are a lot of good matrix libraries available, e.g., -MTL4, -armadillo, -eigen. uBLAS offers a stable, well tested set of vector and -matrix classes, the typical operations for linear algebra and solvers for triangular systems of equations. uBLAS offers -dense, structured and sparse matrices - all using similar interfaces. And finally uBLAS offers good (but not outstanding) -performance. On the other side, the last major improvement of uBLAS was in 2008 and no significant change was committed -since 2009. So one should ask himself some questions to aid the decision: Availability? uBLAS is part of boost -and thus available in many environments. Easy to use? uBLAS is easy to use for simple things, but needs decent -C++ knowledge when you leave the path. Performance? There are faster alternatives. Cutting edge? uBLAS -is more than 10 years old and missed all new stuff from C++11.

- -

Q: I'm running the uBLAS dense vector and matrix benchmarks. Why do I see a significant performance difference -between the native C and library implementations?
-A: uBLAS distinguishes debug mode (size and type conformance checks enabled, expression templates disabled) and release -mode (size and type conformance checks disabled, expression templates enabled). Please check, if the preprocessor -symbol NDEBUG of cassert is defined. NDEBUG enables release mode, which in turn -uses expression templates. You can optionally define BOOST_UBLAS_NDEBUG to disable all bounds, structure -and similar checks of uBLAS.

- -

Q: I've written some uBLAS tests, which try to incorrectly assign different matrix types or overrun vector and -matrix dimensions. Why don't I get a compile time or runtime diagnostic?
-A: uBLAS distinguishes debug mode (size and type conformance checks enabled, expression templates disabled) and release -mode (size and type conformance checks disabled, expression templates enabled). Please check, if the preprocessor -symbol NDEBUG of cassert is defined. NDEBUG disables debug mode, which is needed -to get size and type conformance checks.

- -

Q: I've written some uBLAS benchmarks to measure the performance of matrix chain multiplications like prod (A, -prod (B, C)) and see a significant performance penalty due to the use of expression templates. How can I disable -expression templates?
-A: You do not need to disable expression templates. Please try reintroducing temporaries using either prod -(A, matrix_type (prod (B, C))) or prod (A, -prod<matrix_type > (B, C)).

- -
- -

Copyright (©) 2000-2011 Joerg Walter, Mathias Koch, Gunter Winkler, David Bellot
-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 -).

- - - diff --git a/libs/numeric/ublas/doc/iterator_concept.html b/libs/numeric/ublas/doc/iterator_concept.html deleted file mode 100644 index c9e4c9951..000000000 --- a/libs/numeric/ublas/doc/iterator_concept.html +++ /dev/null @@ -1,1168 +0,0 @@ - - - - - - - - - -Iterator Concepts - - -

Iterator Concepts

-
-

An Iterator is a restricted pointer-like object pointing into a -vector or matrix container.

-

Indexed Bidirectional Iterator

-

Description

-

An Indexed Bidirectional Iterator is an iterator of a container -that can be dereferenced, incremented, decremented and carries -index information.

-

Refinement of

-

Assignable, Equality Comparable, Default Constructible.

-

Associated types

- - - - - - - - - - - -
Value typeThe type of the value obtained by dereferencing a Indexed -Bidirectional Iterator
Container typeThe type of the container a Indexed Bidirectional Iterator -points into.
-

Notation

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
IA type that is a model of Indexed Bidirectional Iterator
TThe value type of I
CThe container type of I
it, itt, it1, it2Objects of type I
tObject of type T
cObject of type C
-

Definitions

-

A Indexed Bidirectional Iterator may be mutable, meaning -that the values referred to by objects of that type may be -modified, or constant , meaning that they may not. If an -iterator type is mutable, this implies that its value type is a -model of Assignable; the converse, though, is not necessarily -true.

-

A Indexed Bidirectional Iterator may have a singular -value, meaning that the results of most operations, including -comparison for equality, are undefined. The only operation that is -guaranteed to be supported is assigning a nonsingular iterator to a -singular iterator.

-

A Indexed Bidirectional Iterator may have a -dereferenceable value, meaning that dereferencing it yields -a well-defined value. Dereferenceable iterators are always -nonsingular, but the converse is not true.

-

An Indexed Bidirectional Iterator is past-the-end if it -points beyond the last element of a container. Past-the-end values -are nonsingular and nondereferenceable.

-

Valid expressions

-

In addition to the expressions defined for Assignable, Equality -Comparable and Default Constructible, the following expressions -must be valid.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Default constructorI it  
Dereference*it Convertible to T.
Dereference assignment*it = tI is mutable. 
Member accessit->mT is a type for which t.m is -defined. 
Preincrement++ it I &
Postincrementit ++ I
Predecrement-- it I &
Postdecrementit -- I
Indexit.index () C::size_type
-

Expression Semantics

-

Semantics of an expression is defined only where it differs -from, or is not defined in, Assignable, Equality Comparable and -Default Constructible.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionPreconditionSemanticsPostcondition
Default constructorI it  it is singular.
Dereference*itit is dereferenceable.  
Dereference assignment*it = tSame as for *it. *it is a copy of t.
Member accessit->mit is dereferenceable.Equivalent to (*it).m 
Preincrement++ itit is dereferenceable.it is modified to point to the next element.it is dereferenceable or past-the-end. -
-&it == &++ it
.
-If it1 == it2,
-then ++ it1 == ++ it2.
Postincrementit ++Same as for ++ it.Equivalent to
-{
- I itt = it;
- ++ it;
- return itt;
-}
it is dereferenceable or past-the-end.
Predecrement-- itit is dereferenceable or past-the-end.
-There exists a dereferenceable iterator itt such that -it == ++ itt.
it is modified to point to the previous -element.it is dereferenceable.
-&it = &-- it.
-If it1 == it2,
-then -- it1 == -- it2.
-If it2 is dereferenceable and it1 == -++it2,
-then --it1 == it2.
Postdecrementit --Same as for -- it.Equivalent to
-{
- I itt = it;
- -- it;
- return itt;
-}
it is dereferenceable. 
Indexit.index ()it is dereferenceable.it.index () >= 0
-and
-it.index () < it ().size ()
If it1 == it2,
-then it1.index () == it2.index ().
-If it1 == it2,
-then it1.index () < (++ it2).index -().
-If it1 == it2,
-then it1.index () > (-- it2).index -().
-

Complexity guarantees

-

The complexity of operations on indexed bidirectional iterators -is guaranteed to be amortized constant time.

-

Invariants

- - - - - - - - - - - - - - - -
Identityit1 == it2 if and only if &*it1 == -&*it2.
Symmetry of increment and decrementIf it is dereferenceable, then ++ it; ---it; is a null operation. Similarly, -- it; ++ -it; is a null operation.
Relation between iterator index and container element -operatorIf it is dereferenceable, *it == it () -(it.index ()).
-

Models

-
    -
  • sparse_vector::iterator
  • -
-

Indexed Random Access Iterator

-

Description

-

An Indexed Random Access Iterator is an iterator of a container -that can be dereferenced, moved forward, moved backward and carries -index information.

-

Refinement of

-

LessThanComparable, Indexed Bidirectional -Iterator .

-

Associated types

- - - - - - - - - - - -
Value typeThe type of the value obtained by dereferencing a Indexed -Random Access Iterator
Container typeThe type of the container a Indexed Random Access Iterator -points into.
-

Notation

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
IA type that is a model of Indexed Random Access Iterator
TThe value type of I
CThe container type of I
it, itt, it1, it2Objects of type I
tObject of type T
nObject of type C::difference_type
-

Definitions

-

An Indexed Random Access Iterator it1 is -reachable from an Indexed Random Access Iterator -it2 if, after applying operator ++ to -it2 a finite number of times, it1 == -it2.

-

Valid expressions

-

In addition to the expressions defined for Indexed Bidirectional -Iterator , the following expressions must be valid.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Forward motionit += n I &
Iterator additionit + n I
Backward motioni -= n I &
Iterator subtractionit - n I 
Differenceit1 - it2 C::difference_type
Element operatorit [n] Convertible to T.
Element assignmentit [n] = tI is mutableConvertible to T.
-

Expression Semantics

-

Semantics of an expression is defined only where it differs -from, or is not defined in, Indexed Bidirectional -Iterator .

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionPreconditionSemanticsPostcondition
Forward motionit += nIncluding it itself, there must be n -dereferenceable or past-the-end iterators following or preceding -it, depending on whether n is positive or -negative.If n > 0, equivalent to executing ++ -it n times. If n < 0, -equivalent to executing -- it n times. If -n == 0, this is a null operation.it is dereferenceable or past-the-end.
Iterator additionit + nSame as for i += n.Equivalent to
-{
- I itt = it;
- return itt += n;
-}
Result is dereferenceable or past-the-end.
Backward motionit -= nIncluding it itself, there must be n -dereferenceable or past-the-end iterators preceding or following -it, depending on whether n is positive or -negative.Equivalent to it += (-n).it is dereferenceable or past-the-end.
Iterator subtractionit - nSame as for i -= n.Equivalent to
-{
- I itt = it;
- return itt -= n;
-}
Result is dereferenceable or past-the-end.
Differenceit1 - it2Either it1 is reachable from it2 or -it2 is reachable from it1, or both.Returns a number n such that it1 == it2 + -n 
Element operatorit [n]it + n exists and is dereferenceable.Equivalent to *(it + n) 
Element assignmenti[n] = tSame as for it [n].Equivalent to *(it + n) = t 
-

Complexity guarantees

-

The complexity of operations on indexed random access iterators -is guaranteed to be amortized constant time.

-

Invariants

- - - - - - - - - - - - - - - -
Symmetry of addition and subtractionIf it + n is well-defined, then it += n; it --= n; and (it + n) - n are null operations. -Similarly, if it - n is well-defined, then it -= -n; it += n; and (it - n) + n are null -operations.
Relation between distance and additionIf it1 - it2 is well-defined, then it1 == -it2 + (it1 - it2).
Reachability and distanceIf it1 is reachable from it2, then -it1 - it2 >= 0.
-

Models

-
    -
  • vector::iterator
  • -
-

Indexed Bidirectional Column/Row Iterator

-

Description

-

An Indexed Bidirectional Column/Row Iterator is an iterator of a -container that can be dereferenced, incremented, decremented and -carries index information.

-

Refinement of

-

Assignable, Equality Comparable, Default Constructible.

-

Associated types

- - - - - - - - - - - -
Value typeThe type of the value obtained by dereferencing a Indexed -Bidirectional Column/Row Iterator
Container typeThe type of the container a Indexed Bidirectional Column/Row -Iterator points into.
-

Notation

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
I1A type that is a model of Indexed Bidirectional Column/Row -Iterator
I2A type that is a model of Indexed Bidirectional Row/Column -Iterator
TThe value type of I1 and I2
CThe container type of I1 and I2
it1, it1t, it11, -it12Objects of type I1
it2, it2tObjects of type I2
tObject of type T
cObject of type C
-

Definitions

-

Valid expressions

-

In addition to the expressions defined for Assignable, Equality -Comparable and Default Constructible, the following expressions -must be valid.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Default constructorI1 it  
Dereference*it Convertible to T.
Dereference assignment*it = tI1 is mutable. 
Member accessit->mT is a type for which t.m is -defined. 
Preincrement++ it I1 &
Postincrementit ++ I1
Predecrement-- it I1 &
Postdecrementit -- I1
Row Indexit.index1 () C::size_type
Column Indexit.index2 () C::size_type
Row/Column Beginit.begin () I2
Row/Column Endit.end () I2
Reverse Row/Column Beginit.rbegin () reverse_iterator<I2>
Reverse Row/Column Endit.rend () reverse_iterator<I2>
-

Expression Semantics

-

Semantics of an expression is defined only where it differs -from, or is not defined in, Assignable, Equality Comparable and -Default Constructible.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionPreconditionSemanticsPostcondition
Default constructorI1 it  it is singular.
Dereference*itit is dereferenceable.  
Dereference assignment*it = tSame as for *it. *it is a copy of t.
Member accessit->mit is dereferenceable.Equivalent to (*it).m 
Preincrement++ itit is dereferenceable.it is modified to point to the next element of -the column/row, i.e. for column iterators holds
-it.index1 () < (++ it).index1 () and
-it.index2 () == (++ it).index2 (),
-for row iterators holds
-it.index1 () == (++ it).index1 () and
-it.index2 () < (++ it).index2 ().
it is dereferenceable or past-the-end. -
-&it == &++ it
.
-If it1 == it2,
-then ++ it1 == ++ it2.
Postincrementit ++Same as for ++ it.Equivalent to
-{
- I1 itt = it;
- ++ it;
- return itt;
-}
it is dereferenceable or past-the-end.
Predecrement-- itit is dereferenceable or past-the-end.
-There exists a dereferenceable iterator itt such that -it == ++ itt.
it is modified to point to the previous  -element of the column/row, i.e. for column iterators holds
-it.index1 () > (-- it).index1 () and
-it.index2 () == (-- it).index2 (),
-for row iterators holds
-it.index1 () == (-- it).index1 () and
-it.index2 () > (-- it).index2 ().
it is dereferenceable.
-&it = &-- it.
-If it1 == it2,
-then -- it1 == -- it2.
Postdecrementit --Same as for -- it.Equivalent to
-{
- I1 itt = it;
- -- it;
- return itt;
-}
it is dereferenceable. 
Row Indexit.index1 ()If it is a Row iterator then it must be dereferenceable.it.index1 () >= 0 and
-it.index1 () < it () .size1 ()
If it1 == it2,
-then it1.index1 () == 12.index1 ().
-If it1, it2 are Row Iterators with it1 == it2,
-then it1.index1 () < (++ it2).index1 ().
-and it1.index1 () > (-- it2).index1 ().
Column Indexit.index2 ()If it is a Column iterator then it must be dereferenceable.it.index2 () >= 0 and
-it.index2 () < it () .size2 ()
If it1 == it2,
-then it1.index2 () == it2.index2 () -.
-If it1, it2 are Column Iterators with it1 == i12,
-then it1.index2 () < (++ it2).index2 ().
-end it1.index2 () > (-- it2).index2 ().
Row/Column Beginit.begin ()it is dereferenceable.If it is a Column Iterator,
-then it2 = it.begin () is a Row Iterator
-with it2.index1 () == it.index1 (). -

If it is a Row Iterator,
-then it2 = it.begin () is a Column Iterator
-with it2.index2 () == it.index2 ().

-
 
Row/Column Endit.end ()it is dereferenceable.If it is a Column Iterator,
-then it2 = it.end () is a Row Iterator
-with it2.index1 () == it.index1 (). -

If it is a Row Iterator,
-then it2 = it.end () is a Column Iterator
-with it2.index2 () == it.index2 ().

-
 
Reverse Row/Column Beginit.rbegin ()it is dereferenceable.Equivalent to reverse_iterator<I2> (it.end -()). 
Reverse Row/Column Endit.rend ()it is dereferenceable.Equivalent to reverse_iterator<I2> (it.begin -()). 
-

Complexity guarantees

-

The complexity of operations on indexed bidirectional column/row -iterators is guaranteed to be logarithmic depending on the size of -the container. The complexity of one iterator (depending on the -storage layout) can be lifted to be amortized constant time. The -complexity of the other iterator (depending on the storage layout -and the container) can be lifted to be amortized constant time for -the first row/first column respectively.

-

Invariants

- - - - - - - - - - - - - - - - - - - - - - - -
Identityit1 == it2 if and only if &*it1 == -&*it2.
Symmetry of increment and decrementIf it is dereferenceable, then ++ it; ---it; is a null operation. Similarly, -- it; ++ -it; is a null operation.
Relation between iterator index and container element -operatorIf it is dereferenceable, *it == it () -(it.index1 (), it.index2 ())
Relation between iterator column/row begin and iterator -indexIf it is a Column Iterator -and it2 = it.begin () then it2.index2 () < -it2t.index2 () for all it2t with it2t () -== it2 () and it2t ().index1 () == it2 ().index1 -(). -

If it is a Row Iterator and -it2 = it.begin () then it2.index1 () < -it2t.index1 () for all it2t with it2t () -== it2 () and it2t ().index2 () == it2 ().index2 -().

-
Relation between iterator column/row end and iterator -indexIf it is a Column Iterator -and it2 = it.end () then it2.index2 () > -it2t.index2 () for all it2t with it2t () -== it2 () and it2t ().index1 () == it2 ().index1 -(). -

If it is a Row Iterator and -it2 = it.end () then it2.index1 () > -it2t.index1 () for all it2t with it2t () -== it2 () and it2t ().index2 () == it2 ().index2 -().

-
-

Models

-
    -
  • sparse_matrix::iterator1
  • -
  • sparse_matrix::iterator2
  • -
-

Indexed Random Access Column/Row Iterator

-

Description

-

An Indexed Random Access Column/Row Iterator is an iterator of a -container that can be dereferenced, incremented, decremented and -carries index information.

-

Refinement of

-

Indexed -Bidirectional Column/Row Iterator .

-

Associated types

- - - - - - - - - - - -
Value typeThe type of the value obtained by dereferencing a Indexed -Random Access Column/Row Iterator
Container typeThe type of the container a Indexed Random Access Column/Row -Iterator points into.
-

Notation

- - - - - - - - - - - - - - - - - - - - - - - - - - - -
IA type that is a model of Indexed Random Access Column/Row -Iterator
TThe value type of I
CThe container type of I
it, itt, it1, it2Objects of type I
tObject of type T
cObject of type C
-

Definitions

-

Valid expressions

-

In addition to the expressions defined for Indexed Bidirectional -Column/Row Iterator , the following expressions must be -valid.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionType requirementsReturn type
Forward motionit += n I &
Iterator additionit + n I
Backward motioni -= n I &
Iterator subtractionit - n I 
Differenceit1 - it2 C::difference_type
Element operatorit [n] Convertible to T.
Element assignmentit [n] = tI is mutableConvertible to T.
-

Expression Semantics

-

Semantics of an expression is defined only where it differs -from, or is not defined in, Indexed Bidirectional -Column/Row Iterator .

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameExpressionPreconditionSemanticsPostcondition
Forward motionit += nIncluding it itself, there must be n -dereferenceable or past-the-end iterators following or preceding -it, depending on whether n is positive or -negative.If n > 0, equivalent to executing ++ -it n times. If n < 0, -equivalent to executing -- it n times. If -n == 0, this is a null operation.it is dereferenceable or past-the-end.
Iterator additionit + nSame as for i += n.Equivalent to
-{
- I itt = it;
- return itt += n;
-}
Result is dereferenceable or past-the-end.
Backward motionit -= nIncluding it itself, there must be n -dereferenceable or past-the-end iterators preceding or following -it, depending on whether n is positive or -negative.Equivalent to it += (-n).it is dereferenceable or past-the-end.
Iterator subtractionit - nSame as for i -= n.Equivalent to
-{
- I itt = it;
- return itt -= n;
-}
Result is dereferenceable or past-the-end.
Differenceit1 - it2Either it1 is reachable from it2 or -it2 is reachable from it1, or both.Returns a number n such that it1 == it2 + -n 
Element operatorit [n]it + n exists and is dereferenceable.Equivalent to *(it + n) 
Element assignmenti[n] = tSame as for it [n].Equivalent to *(it + n) = t 
-

Complexity guarantees

-

The complexity of operations on indexed random access Column/Row -iterators is guaranteed to be amortized constant time.

-

Invariants

- - - - - - - - - - - - - - - -
Symmetry of addition and subtractionIf it + n is well-defined, then it += n; it --= n; and (it + n) - n are null operations. -Similarly, if it - n is well-defined, then it -= -n; it += n; and (it - n) + n are null -operations.
Relation between distance and additionIf it1 - it2 is well-defined, then it1 == -it2 + (it1 - it2).
Reachability and distanceIf it1 is reachable from it2, then -it1 - it2 >= 0.
-

Models

-
    -
  • matrix::iterator1
  • -
  • matrix::iterator2
  • -
-
-

Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
- 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 - ). -

- - - diff --git a/libs/numeric/ublas/doc/js/jquery-1.3.2.min.js b/libs/numeric/ublas/doc/js/jquery-1.3.2.min.js deleted file mode 100644 index b1ae21d8b..000000000 --- a/libs/numeric/ublas/doc/js/jquery-1.3.2.min.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * jQuery JavaScript Library v1.3.2 - * http://jquery.com/ - * - * Copyright (c) 2009 John Resig - * Dual licensed under the MIT and GPL licenses. - * http://docs.jquery.com/License - * - * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) - * Revision: 6246 - */ -(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); -/* - * Sizzle CSS Selector Engine - v0.9.3 - * Copyright 2009, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff --git a/libs/numeric/ublas/doc/js/jquery.toc-gw.js b/libs/numeric/ublas/doc/js/jquery.toc-gw.js deleted file mode 100644 index d48dd4be6..000000000 --- a/libs/numeric/ublas/doc/js/jquery.toc-gw.js +++ /dev/null @@ -1,166 +0,0 @@ -/*! - * jQuery TOC Plugin v1.1.x based on - * samaxesJS JavaScript Library - * http://code.google.com/p/samaxesjs/ - * - * Copyright (c) 2008 samaxes.com - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * 2009-10-04, guwi17: modified and extended to meet uBLAS' needs - */ - -(function($) { - /* - * The TOC plugin dynamically builds a table of contents from the headings in - * a document and prepends legal-style section numbers to each of the headings. - */ - $.fn.toc = function(options) { - var opts = $.extend({}, $.fn.toc.defaults, options); - - return this.each(function() { - var toc = $(this).append('
    ').children('ul'); - var headers = {h1: 0, h2: 0, h3: 0, h4: 0, h5: 0, h6: 0}; - var index = 0; - var indexes = { - h1: (opts.exclude.match('h1') == null && $('h1').length > 0) ? ++index : 0, - h2: (opts.exclude.match('h2') == null && $('h2').length > 0) ? ++index : 0, - h3: (opts.exclude.match('h3') == null && $('h3').length > 0) ? ++index : 0, - h4: (opts.exclude.match('h4') == null && $('h4').length > 0) ? ++index : 0, - h5: (opts.exclude.match('h5') == null && $('h5').length > 0) ? ++index : 0, - h6: (opts.exclude.match('h6') == null && $('h6').length > 0) ? ++index : 0 - }; - - $(':header').not(opts.exclude).each(function() { - var linkId = ""; - if ($(this).is('h6')) { - checkContainer(headers.h6, toc); - updateNumeration(headers, 'h6'); - $(this).text(addNumeration(headers, 'h6', $(this).text())); - linkId = fixAnchor($(this)); - appendToTOC(toc, indexes.h6, linkId, $(this).text(), headers); - } else if ($(this).is('h5')) { - checkContainer(headers.h5, toc); - updateNumeration(headers, 'h5'); - $(this).text(addNumeration(headers, 'h5', $(this).text())); - linkId = fixAnchor($(this)); - appendToTOC(toc, indexes.h5, linkId, $(this).text(), headers); - } else if ($(this).is('h4')) { - checkContainer(headers.h4, toc); - updateNumeration(headers, 'h4'); - $(this).text(addNumeration(headers, 'h4', $(this).text())); - linkId = fixAnchor($(this)); - appendToTOC(toc, indexes.h4, linkId, $(this).text(), headers); - } else if ($(this).is('h3')) { - checkContainer(headers.h3, toc); - updateNumeration(headers, 'h3'); - $(this).text(addNumeration(headers, 'h3', $(this).text())); - linkId = fixAnchor($(this)); - appendToTOC(toc, indexes.h3, linkId, $(this).text(), headers); - } else if ($(this).is('h2')) { - checkContainer(headers.h2, toc); - updateNumeration(headers, 'h2'); - $(this).text(addNumeration(headers, 'h2', $(this).text())); - linkId = fixAnchor($(this)); - appendToTOC(toc, indexes.h2, linkId, $(this).text(), headers); - } else if ($(this).is('h1')) { - updateNumeration(headers, 'h1'); - $(this).text(addNumeration(headers, 'h1', $(this).text())); - linkId = fixAnchor($(this)); - appendToTOC(toc, indexes.h1, linkId, $(this).text(), headers); - } - }); - }); - }; - - /* - * Checks if the last node is an 'ul' element. - * If not, a new one is created. - */ - function checkContainer(header, toc) { - if (header == 0 && !toc.find(':last').is('ul')) { - toc.find('li:last').append('
      '); - } - }; - - /* - * Updates headers numeration. - */ - function updateNumeration(headers, header) { - $.each(headers, function(i, val) { - if (i == header) { - ++headers[i]; - } else if (i > header) { - headers[i] = 0; - } - }); - }; - - /* - * Prepends the numeration to a heading. - */ - function addNumeration(headers, header, text) { - var numeration = ''; - - $.each(headers, function(i, val) { - if (i <= header && headers[i] > 0) { - numeration += headers[i] + '.'; - } - }); - - return removeFinalDot(numeration) + ' ' + text; - }; - - function removeFinalDot(text) { - return (text||"").replace(/\.$/g, "" ) - } - - function fixAnchor(element) { - // use existing id by default - var linkId = element.attr('id'); - // next, look for an anchor and use its id or name - if ( !linkId ) { - element.find('> a:first').each( function() { - linkId = $(this).attr('id') || $(this).attr('name'); - }); - } - // next, use the text content as last resort - if ( !linkId ) { - linkId = (element.text()||"unknown").replace(/[^a-zA-Z0-9]/g,""); - } - - element.attr('id',linkId); - return linkId; - } - - /* - * Appends a new node to the TOC. - */ - function appendToTOC(toc, index, id, text, headers) { - var parent = toc; - - for (var i = 1; i < index; i++) { - if (parent.find('> li:last > ul').length == 0) { - parent = parent.append('
      • '); - } - parent = parent.find('> li:last > ul'); - } - if (id) { - parent.append('
      • ' + text + '
      • '); - } else { - parent.append('
      • ' + text + '
      • '); - } - }; - - $.fn.toc.defaults = {exclude: 'h1, h5, h6'} -})(jQuery); diff --git a/libs/numeric/ublas/doc/matrix.html b/libs/numeric/ublas/doc/matrix.html deleted file mode 100644 index 0342d04a2..000000000 --- a/libs/numeric/ublas/doc/matrix.html +++ /dev/null @@ -1,768 +0,0 @@ - - - - - - - - - -Matrix - - -

        Matrix

        -
        -

        Matrix

        -

        Description

        -

        The templated class matrix<T, F, A> is the -base container adaptor for dense matrices. For a (m x -n)-dimensional matrix and 0 <= i < m, 0 -<= j < n every element mi, -j is mapped to the (i x n + j)-th element of -the container for row major orientation or the (i + j x -m)-th element of the container for column major -orientation.

        -

        Example

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    for (unsigned i = 0; i < m.size1 (); ++ i)
        -        for (unsigned j = 0; j < m.size2 (); ++ j)
        -            m (i, j) = 3 * i + j;
        -    std::cout << m << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header matrix.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the matrix.
        FFunctor describing the storage organization. [1]row_major
        AThe type of the Storage array. [2]unbounded_array<T>
        -

        Model of

        -

        Matrix .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix .

        -

        Public base classes

        -

        matrix_container<matrix<T, F, A> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        matrix ()Allocates an uninitialized matrix that holds zero -rows of zero elements.
        matrix (size_type size1, size_type size2)Allocates an uninitialized matrix that holds -size1 rows of size2 elements.
        matrix (const matrix &m)The copy constructor.
        template<class AE>
        -matrix (const matrix_expression<AE> &ae)
        The extended copy constructor.
        void resize (size_type size1, size_type size2, bool -preserve = true)Reallocates a matrix to hold size1 -rows of size2 elements. The existing elements of the -matrix are preseved when specified.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const array_type& data () const
        array_type& data ()
        const_reference operator () (size_type i, size_type j) -constReturns a const reference of the j --th element in the i-th row.
        reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
        matrix &operator = (const matrix &m)The assignment operator.
        matrix &assign_temporary (matrix &m)Assigns a temporary. May change the matrix m.
        template<class AE>
        -matrix &operator = (const matrix_expression<AE> -&ae)
        The extended assignment operator.
        template<class AE>
        -matrix &assign (const matrix_expression<AE> -&ae)
        Assigns a matrix expression to the matrix. Left and right hand -side of the assignment should be independent.
        template<class AE>
        -matrix &operator += (const matrix_expression<AE> -&ae)
        A computed assignment operator. Adds the matrix expression to -the matrix.
        template<class AE>
        -matrix &plus_assign (const matrix_expression<AE> -&ae)
        Adds a matrix expression to the matrix. Left and right hand -side of the assignment should be independent.
        template<class AE>
        -matrix &operator -= (const matrix_expression<AE> -&ae)
        A computed assignment operator. Subtracts the matrix expression -from the matrix.
        template<class AE>
        -matrix &minus_assign (const matrix_expression<AE> -&ae)
        Subtracts a matrix expression from the matrix. Left and right -hand side of the assignment should be independent.
        template<class AT>
        -matrix &operator *= (const AT &at)
        A computed assignment operator. Multiplies the matrix with a -scalar.
        template<class AT>
        -matrix &operator /= (const AT &at)
        A computed assignment operator. Divides the matrix through a -scalar.
        void swap (matrix &m)Swaps the contents of the matrices.
        void insert_element (size_type i, size_type j, const_reference -t)Inserts the value t at the j-th -element of the i-th row.
        void erase_element (size_type i, size_type j)Erases the value at the j-th element of the -i-th row.
        void clear ()Clears the matrix.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the matrix.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the matrix.
        iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the matrix.
        iterator1 end1 ()Returns a iterator1 pointing to the end of the -matrix.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the matrix.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the matrix.
        iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the matrix.
        iterator2 end2 ()Returns a iterator2 pointing to the end of the -matrix.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed matrix.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed matrix.
        reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed matrix.
        reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed matrix.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed matrix.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed matrix.
        reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed matrix.
        reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed matrix.
        -

        Notes

        -

        [1] Supported parameters -for the storage organization are row_major and -column_major.

        -

        [2] Common parameters -for the storage array are unbounded_array<T> , -bounded_array<T> and -std::vector<T> .

        -

        Identity Matrix

        -

        Description

        -

        The templated class identity_matrix<T, ALLOC> -represents identity matrices. For a (m x n)-dimensional -identity matrix and 0 <= i < m, 0 <= j < -n holds idi, j = 0, if -i <> j, and idi, i= -1.

        -

        Example

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    identity_matrix<double> m (3);
        -    std::cout << m << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header matrix.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the matrix.int
        ALLOCAn STL Allocator for size_type and difference_type.std::allocator
        -

        Model of

        -

        Matrix .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of -Matrix .

        -

        Public base classes

        -

        matrix_container<identity_matrix<T> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        identity_matrix ()Constructs an identity_matrix that holds zero rows -of zero elements.
        identity_matrix (size_type size)Constructs an identity_matrix that holds -size rows of size elements.
        identity_matrix (const identity_matrix -&m)The copy constructor.
        void resize (size_type size, bool preserve = -true)Resizes a identity_matrix to hold -size rows of size elements. Therefore the -existing elements of the itendity_matrix are always -preseved.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        identity_matrix &operator = (const identity_matrix -&m)The assignment operator.
        identity_matrix &assign_temporary (identity_matrix -&m)Assigns a temporary. May change the identity matrix -m .
        void swap (identity_matrix &m)Swaps the contents of the identity matrices.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the identity_matrix.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the identity_matrix.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the identity_matrix.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the identity_matrix.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed identity_matrix.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed identity_matrix.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed identity_matrix.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed identity_matrix.
        -

        Zero Matrix

        -

        Description

        -

        The templated class zero_matrix<T, ALLOC> represents -zero matrices. For a (m x n)-dimensional zero matrix and -0 <= i < m, 0 <= j < n holds -zi, j = 0.

        -

        Example

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    zero_matrix<double> m (3, 3);
        -    std::cout << m << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header matrix.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the matrix.int
        ALLOCAn STL Allocator for size_type and difference_type.std::allocator
        -

        Model of

        -

        Matrix .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of -Matrix .

        -

        Public base classes

        -

        matrix_container<zero_matrix<T> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        zero_matrix ()Constructs a zero_matrix that holds zero rows of -zero elements.
        zero_matrix (size_type size1, size_type -size2)Constructs a zero_matrix that holds -size1 rows of size2 elements.
        zero_matrix (const zero_matrix &m)The copy constructor.
        void resize (size_type size1, size_type size2, bool -preserve = true)Resizes a zero_matrix to hold size1 -rows of size2 elements. Therefore the existing -elements of the zero_matrix are always preseved.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        zero_matrix &operator = (const zero_matrix -&m)The assignment operator.
        zero_matrix &assign_temporary (zero_matrix -&m)Assigns a temporary. May change the zero matrix m -.
        void swap (zero_matrix &m)Swaps the contents of the zero matrices.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the zero_matrix.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the zero_matrix.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the zero_matrix.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the zero_matrix.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed zero_matrix.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed zero_matrix.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed zero_matrix.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed zero_matrix.
        -

        Scalar Matrix

        -

        Description

        -

        The templated class scalar_matrix<T, ALLOC> -represents scalar matrices. For a (m x n)-dimensional -scalar matrix and 0 <= i < m, 0 <= j < -n holds zi, j = s.

        -

        Example

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    scalar_matrix<double> m (3, 3);
        -    std::cout << m << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header matrix.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the matrix.int
        ALLOCAn STL Allocator for size_type and difference_type.std::allocator
        -

        Model of

        -

        Matrix .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of -Matrix .

        -

        Public base classes

        -

        matrix_container<scalar_matrix<T> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        scalar_matrix ()Constructs a scalar_matrix that holds scalar rows -of zero elements.
        scalar_matrix (size_type size1, size_type size2, const -value_type &value)Constructs a scalar_matrix that holds -size1 rows of size2 elements each of the -specified value.
        scalar_matrix (const scalar_matrix &m)The copy constructor.
        void resize (size_type size1, size_type size2, bool -preserve = true)Resizes a scalar_matrix to hold size1 -rows of size2 elements. Therefore the existing -elements of the scalar_matrix are always -preseved.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        scalar_matrix &operator = (const scalar_matrix -&m)The assignment operator.
        scalar_matrix &assign_temporary (scalar_matrix -&m)Assigns a temporary. May change the scalar matrix -m .
        void swap (scalar_matrix &m)Swaps the contents of the scalar matrices.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the scalar_matrix.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the scalar_matrix.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the scalar_matrix.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the scalar_matrix.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed scalar_matrix.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed scalar_matrix.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed scalar_matrix.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed scalar_matrix.
        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/matrix_expression.html b/libs/numeric/ublas/doc/matrix_expression.html deleted file mode 100644 index a9798142d..000000000 --- a/libs/numeric/ublas/doc/matrix_expression.html +++ /dev/null @@ -1,1428 +0,0 @@ - - - - - - - - - -Matrix Expressions - - -

        Matrix Expressions

        -
        -

        Matrix Expression

        -

        Description

        -

        The templated class matrix_expression<E> -is required to be a public base of all classes which model the Matrix Expression concept.

        -

        Definition

        -

        Defined in the header expression_types.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        EThe type of the matrix expression. 
        -

        Model of

        -

        None. Not a Matrix Expression! -

        -

        Type requirements

        -

        None.

        -

        Public base classes

        -

        None.

        -

        Members

        - - - - - - - - - - - - - - - -
        MemberDescription
        const expression_type &operator () () -constReturns a const reference of the expression.
        expression_type &operator () ()Returns a reference of the expression.
        -

        Notes

        -

        The operator[], row, column, range, slice and project functions have been removed. Use the free functions defined in matrix proxy instead.

        -

        Matrix Container

        -

        Description

        -

        The templated class matrix_container<C> -is required to be a public base of all classes which model the Matrix concept. -This includes the class matrix itself.

        -

        Definition

        -

        Defined in the header expression_types.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        EThe type of the matrix expression. 
        -

        Model of

        -

        None. Not a Matrix Expression OR Matrix! -

        -

        Type requirements

        -

        None.

        -

        Public base classes

        -

        matrix_expression<C>

        -

        Members

        - - - - - - - - - - - - - - - -
        MemberDescription
        const container_type &operator () () -constReturns a const reference of the container.
        container_type &operator () ()Returns a reference of the container.
        -

        Matrix References

        -

        Reference

        -

        Description

        -

        The templated class matrix_reference<E> -contains a reference to a matrix expression.

        -

        Definition

        -

        Defined in the header matrix_expression.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        EThe type of the matrix expression. 
        -

        Model of

        -

        Matrix Expression -.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix Expression .

        -

        Public base classes

        -

        matrix_expression<matrix_reference<E> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        matrix_reference (expression_type &e)Constructs a constant reference of the expression.
        void resize (size_type size1, size2)Resizes the expression to hold at most size1 rows -of size2 elements.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the expression.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the expression.
        iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the expression.
        iterator1 end1 ()Returns a iterator1 pointing to the end of the -expression.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the expression.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the expression.
        iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the expression.
        iterator2 end2 ()Returns a iterator2 pointing to the end of the -expression.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed expression.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed expression.
        reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed expression.
        reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed expression.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed expression.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed expression.
        reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed expression.
        reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed expression.
        -

        Matrix Operations

        -

        Unary Operation Description

        -

        Description

        -

        The templated classes matrix_unary1<E, F> and -matrix_unary2<E, F> describe unary matrix -operations.

        -

        Definition

        -

        Defined in the header matrix_expression.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        EThe type of the matrix expression. 
        FThe type of the operation. 
        -

        Model of

        -

        Matrix Expression -.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix Expression .

        -

        Public base classes

        -

        matrix_expression<matrix_unary1<E, F> > -and matrix_expression<matrix_unary2<E, F> -> resp.

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        matrix_unary1 (const expression_type &e)Constructs a description of the expression.
        matrix_unary2 (const expression_type &e)Constructs a description of the expression.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the expression.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the expression.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the expression.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the expression.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed expression.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed expression.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed expression.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed expression.
        -

        Unary Operations

        -

        Prototypes

        -
        -template<class E, class F>
        -    struct matrix_unary1_traits {
        -        typedef matrix_unary1<typename E::const_closure_type, F> expression_type;
        -        typedef expression_type result_type;
        -     };
        -
        -    // (- m) [i] [j] = - m [i] [j]
        -    template<class E>
        -     typename matrix_unary1_traits<E, scalar_negate<typename E::value_type> >::result_type
        -    operator - (const matrix_expression<E> &e);
        -
        -    // (conj m) [i] [j] = conj (m [i] [j])
        -    template<class E>
        -     typename matrix_unary1_traits<E, scalar_conj<typename E::value_type> >::result_type
        -    conj (const matrix_expression<E> &e);
        -
        -    // (real m) [i] [j] = real (m [i] [j])
        -    template<class E>
        -     typename matrix_unary1_traits<E, scalar_real<typename E::value_type> >::result_type
        -    real (const matrix_expression<E> &e);
        -
        -    // (imag m) [i] [j] = imag (m [i] [j])
        -    template<class E>
        -     typename matrix_unary1_traits<E, scalar_imag<typename E::value_type> >::result_type
        -    imag (const matrix_expression<E> &e);
        -
        -    template<class E, class F>
        -    struct matrix_unary2_traits {
        -        typedef matrix_unary2<typename E::const_closure_type, F> expression_type;
        -        typedef expression_type result_type;
        -     };
        -
        -    // (trans m) [i] [j] = m [j] [i]
        -    template<class E>
        -     typename matrix_unary2_traits<E, scalar_identity<typename E::value_type> >::result_type
        -    trans (const matrix_expression<E> &e);
        -
        -    // (herm m) [i] [j] = conj (m [j] [i])
        -    template<class E>
        -     typename matrix_unary2_traits<E, scalar_conj<typename E::value_type> >::result_type
        -    herm (const matrix_expression<E> &e);
        -
        -

        Description

        -

        operator - computes the additive inverse of a -matrix expression. conj computes the complex conjugate -of a matrix expression. real and imag -compute the real and imaginary parts of a matrix expression. -trans computes the transpose of a matrix expression. -herm computes the hermitian, i.e. the complex -conjugate of the transpose of a matrix expression.

        -

        Definition

        -

        Defined in the header matrix_expression.hpp.

        -

        Type requirements

        - -

        Preconditions

        -

        None.

        -

        Complexity

        -

        Quadratic depending from the size of the matrix expression.

        -

        Examples

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<std::complex<double> > m (3, 3);
        -    for (unsigned i = 0; i < m.size1 (); ++ i)
        -        for (unsigned j = 0; j < m.size2 (); ++ j)
        -            m (i, j) = std::complex<double> (3 * i + j, 3 * i + j);
        -
        -    std::cout << - m << std::endl;
        -    std::cout << conj (m) << std::endl;
        -    std::cout << real (m) << std::endl;
        -    std::cout << imag (m) << std::endl;
        -    std::cout << trans (m) << std::endl;
        -    std::cout << herm (m) << std::endl;
        -}
        -
        -

        Binary Operation Description

        -

        Description

        -

        The templated class matrix_binary<E1, E2, F> -describes a binary matrix operation.

        -

        Definition

        -

        Defined in the header matrix_expression.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        E1The type of the first matrix expression.
        E2The type of the second matrix expression.
        FThe type of the operation.
        -

        Model of

        -

        Matrix Expression -.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix Expression .

        -

        Public base classes

        -

        matrix_expression<matrix_binary<E1, E2, F> ->.

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        matrix_binary (const expression1_type &e1, const -expression2_type &e2)Constructs a description of the expression.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the expression.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the expression.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the expression.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the expression.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed expression.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed expression.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed expression.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed expression.
        -

        Binary Operations

        -

        Prototypes

        -
        -template<class E1, class E2, class F>
        -    struct matrix_binary_traits {
        -        typedef matrix_binary<typename E1::const_closure_type,
        -                               typename E2::const_closure_type, F> expression_type;
        -        typedef expression_type result_type;
        -     };
        -
        -    // (m1 + m2) [i] [j] = m1 [i] [j] + m2 [i] [j]
        -    template<class E1, class E2>
        -    typename matrix_binary_traits<E1, E2, scalar_plus<typename E1::value_type,
        -                                                       typename E2::value_type> >::result_type
        -    operator + (const matrix_expression<E1> &e1,
        -                 const matrix_expression<E2> &e2);
        -
        -    // (m1 - m2) [i] [j] = m1 [i] [j] - m2 [i] [j]
        -    template<class E1, class E2>
        -    typename matrix_binary_traits<E1, E2, scalar_minus<typename E1::value_type,
        -                                                        typename E2::value_type> >::result_type
        -    operator - (const matrix_expression<E1> &e1,
        -                 const matrix_expression<E2> &e2);
        -
        -

        Description

        -

        operator + computes the sum of two matrix -expressions. operator - computes the difference of two -matrix expressions.

        -

        Definition

        -

        Defined in the header matrix_expression.hpp.

        -

        Type requirements

        - -

        Preconditions

        -
          -
        • e1 ().size1 () == e2 ().size1 ()
        • -
        • e1 ().size2 () == e2 ().size2 ()
        • -
        -

        Complexity

        -

        Quadratic depending from the size of the matrix expressions.

        -

        Examples

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m1 (3, 3), m2 (3, 3);
        -    for (unsigned i = 0; i < std::min (m1.size1 (), m2.size1 ()); ++ i)
        -        for (unsigned j = 0; j < std::min (m1.size2 (), m2.size2 ()); ++ j)
        -            m1 (i, j) = m2 (i, j) = 3 * i + j;
        -
        -    std::cout << m1 + m2 << std::endl;
        -    std::cout << m1 - m2 << std::endl;
        -}
        -
        -

        Scalar Matrix Operation Description

        -

        Description

        -

        The templated classes matrix_binary_scalar1<E1, E2, -F> and matrix_binary_scalar2<E1, E2, -F> describe binary operations between a scalar and a -matrix.

        -

        Definition

        -

        Defined in the header matrix_expression.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        E1/E2The type of the scalar expression.
        E2/E1The type of the matrix expression.
        FThe type of the operation.
        -

        Model of

        -

        Matrix Expression -.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix Expression .

        -

        Public base classes

        -

        matrix_expression<matrix_binary_scalar1<E1, E2, -F> > and -matrix_expression<matrix_binary_scalar2<E1, E2, F> -> resp.

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        matrix_binary_scalar1 (const expression1_type &e1, -const expression2_type &e2)Constructs a description of the expression.
        matrix_binary_scalar1 (const expression1_type &e1, -const expression2_type &e2)Constructs a description of the expression.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the expression.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the expression.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the expression.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the expression.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed expression.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed expression.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed expression.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed expression.
        -

        Scalar Matrix Operations

        -

        Prototypes

        -
        -template<class T1, class E2, class F>
        -    struct matrix_binary_scalar1_traits {
        -        typedef matrix_binary_scalar1<scalar_const_reference<T1>,
        -                                      typename E2::const_closure_type, F> expression_type;
        -        typedef expression_type result_type;
        -     };
        -
        -    // (t * m) [i] [j] = t * m [i] [j]
        -    template<class T1, class E2>
        -    typename matrix_binary_scalar1_traits<T1, E2, scalar_multiplies<T1, typename E2::value_type> >::result_type
        -    operator * (const T1 &e1,
        -                 const matrix_expression<E2> &e2);
        -
        -    template<class E1, class T2, class F>
        -    struct matrix_binary_scalar2_traits {
        -        typedef matrix_binary_scalar2<typename E1::const_closure_type,
        -                                      scalar_const_reference<T2>, F> expression_type;
        -        typedef expression_type result_type;
        -     };
        -
        -    // (m * t) [i] [j] = m [i] [j] * t
        -    template<class E1, class T2>
        -    typename matrix_binary_scalar2_traits<E1, T2, scalar_multiplies<typename E1::value_type, T2> >::result_type
        -    operator * (const matrix_expression<E1> &e1,
        -                 const T2 &e2);
        -
        -    // (m / t) [i] [j] = m [i] [j] / t
        -    template<class E1, class T2>
        -    typename matrix_binary_scalar2_traits<E1, T2, scalar_divides<typename E1::value_type, T2> >::result_type
        -    operator / (const matrix_expression<E1> &e1,
        -                 const T2 &e2);
        -
        -

        Description

        -

        operator * computes the product of a scalar and a -matrix expression. operator / multiplies the matrix -with the reciprocal of the scalar.

        -

        Definition

        -

        Defined in the header matrix_expression.hpp.

        -

        Type requirements

        - -

        Preconditions

        -

        None.

        -

        Complexity

        -

        Quadratic depending from the size of the matrix expression.

        -

        Examples

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    for (unsigned i = 0; i < m.size1 (); ++ i)
        -        for (unsigned j = 0; j < m.size2 (); ++ j)
        -            m (i, j) = 3 * i + j;
        -
        -    std::cout << 2.0 * m << std::endl;
        -    std::cout << m * 2.0 << std::endl;
        -}
        -
        -

        Matrix Vector Operations

        -

        Binary Operation Description

        -

        Description

        -

        The templated classes matrix_vector_binary1<E1, E2, -F> and matrix_vector_binary2<E1, E2, -F> describe binary matrix vector operations.

        -

        Definition

        -

        Defined in the header matrix_expression.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        E1The type of the matrix or vector expression.
        E2The type of the vector or matrix expression.
        FThe type of the operation.
        -

        Model of

        -

        Vector Expression -.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector Expression .

        -

        Public base classes

        -

        vector_expression<matrix_vector_binary1<E1, E2, -F> > and -vector_expression<matrix_vector_binary2<E1, E2, F> -> resp.

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        matrix_vector_binary1 (const expression1_type &e1, -const expression2_type &e2)Constructs a description of the expression.
        matrix_vector_binary2 (const expression1_type &e1, -const expression2_type &e2)Constructs a description of the expression.
        size_type size () constReturns the size of the expression.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the expression.
        const_iterator end () constReturns a const_iterator pointing to the end of -the expression.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed expression.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed expression.
        -

        Binary Operations

        -

        Prototypes

        -
        -template<class T1, class E1, class T2, class E2>
        -    struct matrix_vector_binary1_traits {
        -        typedef row_major_tag dispatch_category;
        -        typedef typename promote_traits<T1, T2>::promote_type promote_type;
        -        typedef matrix_vector_binary1<typename E1::const_closure_type,
        -                                       typename E2::const_closure_type,
        -                                       matrix_vector_prod1<T1, T2, promote_type> > expression_type;
        -        typedef expression_type result_type;
        -     };
        -
        -    template<class E1, class E2>
        -    typename matrix_vector_binary1_traits<typename E1::value_type, E1,
        -                                           typename E2::value_type, E2>::result_type
        -    prod (const matrix_expression<E1> &e1,
        -           const vector_expression<E2> &e2,
        -          row_major_tag);
        -
        -    // Dispatcher
        -    template<class E1, class E2>
        -    typename matrix_vector_binary1_traits<typename E1::value_type, E1,
        -                                           typename E2::value_type, E2>::result_type
        -    prod (const matrix_expression<E1> &e1,
        -           const vector_expression<E2> &e2);
        -
        -    template<class E1, class E2>
        -    typename matrix_vector_binary1_traits<typename type_traits<typename E1::value_type>::precision_type, E1,
        -                                           typename type_traits<typename E2::value_type>::precision_type, E2>::result_type
        -    prec_prod (const matrix_expression<E1> &e1,
        -                const vector_expression<E2> &e2,
        -               row_major_tag);
        -
        -    // Dispatcher
        -    template<class E1, class E2>
        -    typename matrix_vector_binary1_traits<typename type_traits<typename E1::value_type>::precision_type, E1,
        -                                           typename type_traits<typename E2::value_type>::precision_type, E2>::result_type
        -    prec_prod (const matrix_expression<E1> &e1,
        -                const vector_expression<E2> &e2);
        -
        -    template<class V, class E1, class E2>
        -    V
        -    prod (const matrix_expression<E1> &e1,
        -          const vector_expression<E2> &e2);
        -
        -    template<class V, class E1, class E2>
        -    V
        -    prec_prod (const matrix_expression<E1> &e1,
        -               const vector_expression<E2> &e2);
        -
        -    template<class T1, class E1, class T2, class E2>
        -    struct matrix_vector_binary2_traits {
        -        typedef column_major_tag dispatch_category;
        -        typedef typename promote_traits<T1, T2>::promote_type promote_type;
        -        typedef matrix_vector_binary2<typename E1::const_closure_type,
        -                                       typename E2::const_closure_type,
        -                                       matrix_vector_prod2<T1, T2, promote_type> > expression_type;
        -        typedef expression_type result_type;
        -     };
        -
        -    template<class E1, class E2>
        -    typename matrix_vector_binary2_traits<typename E1::value_type, E1,
        -                                           typename E2::value_type, E2>::result_type
        -    prod (const vector_expression<E1> &e1,
        -           const matrix_expression<E2> &e2,
        -          column_major_tag);
        -
        -    // Dispatcher
        -    template<class E1, class E2>
        -    typename matrix_vector_binary2_traits<typename E1::value_type, E1,
        -                                           typename E2::value_type, E2>::result_type
        -    prod (const vector_expression<E1> &e1,
        -           const matrix_expression<E2> &e2);
        -
        -    template<class E1, class E2>
        -    typename matrix_vector_binary2_traits<typename type_traits<typename E1::value_type>::precision_type, E1,
        -                                           typename type_traits<typename E2::value_type>::precision_type, E2>::result_type
        -    prec_prod (const vector_expression<E1> &e1,
        -                const matrix_expression<E2> &e2,
        -               column_major_tag);
        -
        -    // Dispatcher
        -    template<class E1, class E2>
        -    typename matrix_vector_binary2_traits<typename type_traits<typename E1::value_type>::precision_type, E1,
        -                                           typename type_traits<typename E2::value_type>::precision_type, E2>::result_type
        -    prec_prod (const vector_expression<E1> &e1,
        -                const matrix_expression<E2> &e2);
        -
        -    template<class V, class E1, class E2>
        -    V
        -    prod (const vector_expression<E1> &e1,
        -          const matrix_expression<E2> &e2);
        -
        -    template<class V, class E1, class E2>
        -    V
        -    prec_prod (const vector_expression<E1> &e1,
        -               const matrix_expression<E2> &e2);
        -
        -

        Description

        -

        prod computes the product of the matrix and the -vector expression. prec_prod computes the double -precision product of the matrix and the vector expression.

        -

        Definition

        -

        Defined in the header matrix_expression.hpp.

        -

        Type requirements

        - -

        Preconditions

        -
          -
        • e1 ().size2 () == e2 ().size ()
        • -
        • e1 ().size () == e2 ().size1 ()
        • -
        -

        Complexity

        -

        Quadratic depending from the size of the matrix expression.

        -

        Examples

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    vector<double> v (3);
        -    for (unsigned i = 0; i < std::min (m.size1 (), v.size ()); ++ i) {
        -        for (unsigned j = 0; j < m.size2 (); ++ j)
        -            m (i, j) = 3 * i + j;
        -        v (i) = i;
        -    }
        -
        -    std::cout << prod (m, v) << std::endl;
        -    std::cout << prod (v, m) << std::endl;
        -}
        -
        -

        Triangular Solver

        -

        Prototypes

        -
        -template<class E1, class E2>
        -    struct matrix_vector_solve_traits {
        -        typedef typename promote_traits<typename E1::value_type, typename E2::value_type>::promote_type promote_type;
        -        typedef vector<promote_type> result_type;
        -    };
        -
        -    template<class E1, class E2>
        -    void inplace_solve (const matrix_expression<E1> &e1,
        -                         E2 &e2,
        -                        lower_tag,
        -                        vector_tag);
        -    template<class E1, class E2>
        -    void inplace_solve (const matrix_expression<E1> &e1,
        -                         E2 &e2,
        -                        upper_tag,
        -                        vector_tag);
        -    template<class E1, class E2>
        -    void inplace_solve (const matrix_expression<E1> &e1,
        -                         E2 &e2,
        -                        unit_lower_tag,
        -                        vector_tag);
        -    template<class E1, class E2>
        -    void inplace_solve (const matrix_expression<E1> &e1,
        -                         E2 &e2,
        -                        unit_upper_tag,
        -                        vector_tag);
        -
        -    template<class E1, class E2, class C>
        -    typename matrix_vector_solve_traits<E1, E2>::result_type
        -    solve (const matrix_expression<E1> &e1,
        -            const vector_expression<E2> &e2,
        -           C);
        -
        -    template<class E1, class E2>
        -    void inplace_solve (E1 &e1,
        -                        const matrix_expression<E2> &e2,
        -                         vector_tag,
        -                         lower_tag);
        -    template<class E1, class E2>
        -    void inplace_solve (E1 &e1,
        -                        const matrix_expression<E2> &e2,
        -                         vector_tag,
        -                         upper_tag);
        -    template<class E1, class E2>
        -    void inplace_solve (E1 &e1,
        -                        const matrix_expression<E2> &e2,
        -                         vector_tag,
        -                         unit_lower_tag);
        -    template<class E1, class E2>
        -    void inplace_solve (E1 &e1,
        -                        const matrix_expression<E2> &e2,
        -                         vector_tag,
        -                         unit_upper_tag);
        -
        -    template<class E1, class E2, class C>
        -    typename matrix_vector_solve_traits<E1, E2>::result_type
        -    solve (const vector_expression<E1> &e1,
        -            const matrix_expression<E2> &e2,
        -           C);
        -
        -

        Description

        -

        solve solves a linear equation for lower or upper -(unit) triangular matrices.

        -

        Definition

        -

        Defined in the header triangular.hpp.

        -

        Type requirements

        - -

        Preconditions

        -
          -
        • e1 ().size1 () == e1 ().size2 ()
        • -
        • e1 ().size2 () == e2 ().size ()
        • -
        • e1 ().size () == e2 ().size1 ()
        • -
        • e2 ().size1 () == e2 ().size2 ()
        • -
        -

        Complexity

        -

        Quadratic depending from the size of the matrix expression.

        -

        Examples

        -
        -#include <boost/numeric/ublas/triangular.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    vector<double> v (3);
        -    for (unsigned i = 0; i < std::min (m.size1 (), v.size ()); ++ i) {
        -        for (unsigned j = 0; j <= i; ++ j)
        -            m (i, j) = 3 * i + j + 1;
        -        v (i) = i;
        -    }
        -
        -    std::cout << solve (m, v, lower_tag ()) << std::endl;
        -    std::cout << solve (v, m, lower_tag ()) << std::endl;
        -}
        -
        -

        Matrix Matrix Operations

        -

        Binary Operation Description

        -

        Description

        -

        The templated class matrix_matrix_binary<E1, E2, -F> describes a binary matrix operation.

        -

        Definition

        -

        Defined in the header matrix_expression.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        E1The type of the first matrix expression.
        E2The type of the second matrix expression.
        FThe type of the operation.
        -

        Model of

        -

        Matrix Expression -.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix Expression .

        -

        Public base classes

        -

        matrix_expression<matrix_matrix_binary<E1, E2, F> -> .

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        matrix_matrix_binary (const expression1_type &e1, -const expression2_type &e2)Constructs a description of the expression.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the expression.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the expression.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the expression.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the expression.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed expression.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed expression.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed expression.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed expression.
        -

        Binary Operations

        -

        Prototypes

        -
        -template<class T1, class E1, class T2, class E2>
        -    struct matrix_matrix_binary_traits {
        -        typedef unknown_orientation_tag dispatch_category;
        -        typedef typename promote_traits<T1, T2>::promote_type promote_type;
        -        typedef matrix_matrix_binary<typename E1::const_closure_type,
        -                                     typename E2::const_closure_type,
        -                                     matrix_matrix_prod<T1, T2, promote_type> > expression_type;
        -        typedef expression_type result_type;
        -    };
        -
        -    template<class E1, class E2>
        -    typename matrix_matrix_binary_traits<typename E1::value_type, E1,
        -                                         typename E2::value_type, E2>::result_type
        -    prod (const matrix_expression<E1> &e1,
        -          const matrix_expression<E2> &e2,
        -          unknown_orientation_tag);
        -
        -    // Dispatcher
        -    template<class E1, class E2>
        -    typename matrix_matrix_binary_traits<typename E1::value_type, E1,
        -                                         typename E2::value_type, E2>::result_type
        -    prod (const matrix_expression<E1> &e1,
        -          const matrix_expression<E2> &e2);
        -
        -    template<class E1, class E2>
        -    typename matrix_matrix_binary_traits<typename type_traits<typename E1::value_type>::precision_type, E1,
        -                                         typename type_traits<typename E2::value_type>::precision_type, E2>::result_type
        -    prec_prod (const matrix_expression<E1> &e1,
        -               const matrix_expression<E2> &e2,
        -               unknown_orientation_tag);
        -
        -    // Dispatcher
        -    template<class E1, class E2>
        -    typename matrix_matrix_binary_traits<typename type_traits<typename E1::value_type>::precision_type, E1,
        -                                         typename type_traits<typename E2::value_type>::precision_type, E2>::result_type
        -    prec_prod (const matrix_expression<E1> &e1,
        -               const matrix_expression<E2> &e2);
        -
        -    template<class M, class E1, class E2>
        -    M
        -    prod (const matrix_expression<E1> &e1,
        -          const matrix_expression<E2> &e2);
        -
        -    template<class M, class E1, class E2>
        -    M
        -    prec_prod (const matrix_expression<E1> &e1,
        -               const matrix_expression<E2> &e2);
        -
        -

        Description

        -

        prod computes the product of the matrix -expressions. prec_prod computes the double precision -product of the matrix expressions.

        -

        Definition

        -

        Defined in the header matrix_expression.hpp.

        -

        Type requirements

        - -

        Preconditions

        -
          -
        • e1 ().size2 () == e2 ().size1 ()
        • -
        -

        Complexity

        -

        Cubic depending from the size of the matrix expression.

        -

        Examples

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m1 (3, 3), m2 (3, 3);
        -    for (unsigned i = 0; i < std::min (m1.size1 (), m2.size1 ()); ++ i)
        -        for (unsigned j = 0; j < std::min (m1.size2 (), m2.size2 ()); ++ j)
        -            m1 (i, j) = m2 (i, j) = 3 * i + j;
        -
        -    std::cout << prod (m1, m2) << std::endl;
        -}
        -
        -

        Triangular Solvers

        -

        Prototypes

        -
        -template<class E1, class E2>
        -    struct matrix_matrix_solve_traits {
        -        typedef typename promote_traits<typename E1::value_type, typename E2::value_type>::promote_type promote_type;
        -        typedef matrix<promote_type> result_type;
        -    };
        -
        -    template<class E1, class E2>
        -    void inplace_solve (const matrix_expression<E1> &e1,
        -                        E2 &e2,
        -                        lower_tag,
        -                        matrix_tag);
        -    template<class E1, class E2>
        -    void inplace_solve (const matrix_expression<E1> &e1,
        -                        E2 &e2,
        -                        upper_tag,
        -                        matrix_tag);
        -    template<class E1, class E2>
        -    void inplace_solve (const matrix_expression<E1> &e1,
        -                        E2 &e2,
        -                        unit_lower_tag,
        -                        matrix_tag);
        -    template<class E1, class E2>
        -    void inplace_solve (const matrix_expression<E1> &e1,
        -                        E2 &e2,
        -                        unit_upper_tag,
        -                        matrix_tag);
        -
        -    template<class E1, class E2, class C>
        -    typename matrix_matrix_solve_traits<E1, E2>::result_type
        -    solve (const matrix_expression<E1> &e1,
        -           const matrix_expression<E2> &e2,
        -           C);
        -
        -

        Description

        -

        solve solves a linear equation for lower or upper -(unit) triangular matrices.

        -

        Definition

        -

        Defined in the header triangular.hpp.

        -

        Type requirements

        - -

        Preconditions

        -
          -
        • e1 ().size1 () == e1 ().size2 ()
        • -
        • e1 ().size2 () == e2 ().size1 ()
        • -
        -

        Complexity

        -

        Cubic depending from the size of the matrix expressions.

        -

        Examples

        -
        -#include <boost/numeric/ublas/triangular.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m1 (3, 3), m2 (3, 3);
        -    for (unsigned i = 0; i < std::min (m1.size1 (), m2.size1 ()); ++ i)
        -        for (unsigned j = 0; j <= i; ++ j)
        -            m1 (i, j) = m2 (i, j) = 3 * i + j + 1;
        -
        -    std::cout << solve (m1, m2, lower_tag ()) << std::endl;
        -}
        -
        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/matrix_proxy.html b/libs/numeric/ublas/doc/matrix_proxy.html deleted file mode 100644 index d4b420257..000000000 --- a/libs/numeric/ublas/doc/matrix_proxy.html +++ /dev/null @@ -1,1428 +0,0 @@ - - - - - - - - - -Matrix Proxies - - -

        Matrix Proxies

        -
        -

        Matrix Row

        -

        Description

        -

        The templated class matrix_row<M> allows -addressing a row of a matrix.

        -

        Example

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/matrix_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    for (unsigned i = 0; i < m.size1 (); ++ i) {
        -        matrix_row<matrix<double> > mr (m, i);
        -        for (unsigned j = 0; j < mr.size (); ++ j)
        -            mr (j) = 3 * i + j;
        -        std::cout << mr << std::endl;
        -    }
        -}
        -
        -

        Definition

        -

        Defined in the header matrix_proxy.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        MThe type of matrix referenced.
        -

        Model of

        -

        Vector Expression -.

        -

        If the specified row falls outside that of the row index range -of the matrix, then the matrix_row is not a well -formed Vector Expression. That is, access to an element which is -outside of the matrix is undefined.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector Expression .

        -

        Public base classes

        -

        vector_expression<matrix_row<M> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        matrix_row (matrix_type &data, size_type -i)Constructs a sub vector.
        size_type size () constReturns the size of the sub vector.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        reference operator () (size_type i)Returns a reference of the i-th element.
        matrix_row &operator = (const matrix_row -&mr)The assignment operator.
        matrix_row &assign_temporary (matrix_row -&mr)Assigns a temporary. May change the matrix row mr -.
        template<class AE>
        -matrix_row &operator = (const vector_expression<AE> -&ae)
        The extended assignment operator.
        template<class AE>
        -matrix_row &assign (const vector_expression<AE> -&ae)
        Assigns a vector expression to the sub vector. Left and right -hand side of the assignment should be independent.
        template<class AE>
        -matrix_row &operator += (const vector_expression<AE> -&ae)
        A computed assignment operator. Adds the vector expression to -the sub vector.
        template<class AE>
        -matrix_row &plus_assign (const vector_expression<AE> -&ae)
        Adds a vector expression to the sub vector. Left and right hand -side of the assignment should be independent.
        template<class AE>
        -matrix_row &operator -= (const vector_expression<AE> -&ae)
        A computed assignment operator. Subtracts the vector expression -from the sub vector.
        template<class AE>
        -matrix_row &minus_assign (const vector_expression<AE> -&ae)
        Subtracts a vector expression from the sub vector. Left and -right hand side of the assignment should be independent.
        template<class AT>
        -matrix_row &operator *= (const AT &at)
        A computed assignment operator. Multiplies the sub vector with -a scalar.
        template<class AT>
        -matrix_row &operator /= (const AT &at)
        A computed assignment operator. Divides the sub vector through -a scalar.
        void swap (matrix_row &mr)Swaps the contents of the sub vectors.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the matrix_row.
        const_iterator end () constReturns a const_iterator pointing to the end of -the matrix_row.
        iterator begin ()Returns a iterator pointing to the beginning of -the matrix_row.
        iterator end ()Returns a iterator pointing to the end of the -matrix_row.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed matrix_row.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed matrix_row.
        reverse_iterator rbegin ()Returns a reverse_iterator pointing to the -beginning of the reversed matrix_row.
        reverse_iterator rend ()Returns a reverse_iterator pointing to the end of -the reversed matrix_row.
        -

        Projections

        -

        Description

        -

        The free row functions support the construction of -matrix rows.

        -

        Prototypes

        -
        
        -    template<class M>
        -    matrix_row<M> row (M &data, std::size_t i);
        -    template<class M>
        -    const matrix_row<const M> row (const M &data, std::size_t i);
        -
        -

        Definition

        -

        Defined in the header matrix_proxy.hpp.

        -

        Type requirements

        - -

        Complexity

        -

        Linear depending from the size of the row.

        -

        Examples

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/matrix_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    for (unsigned i = 0; i < m.size1 (); ++ i) {
        -        for (unsigned j = 0; j < m.size2 (); ++ j)
        -            row (m, i) (j) = 3 * i + j;
        -        std::cout << row (m, i) << std::endl;
        -    }
        -}
        -
        -

        Matrix Column

        -

        Description

        -

        The templated class matrix_column<M> allows -addressing a column of a matrix.

        -

        Example

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/matrix_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    for (unsigned j = 0; j < m.size2 (); ++ j) {
        -        matrix_column<matrix<double> > mc (m, j);
        -        for (unsigned i = 0; i < mc.size (); ++ i)
        -            mc (i) = 3 * i + j;
        -        std::cout << mc << std::endl;
        -    }
        -}
        -
        -

        Definition

        -

        Defined in the header matrix_proxy.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        MThe type of matrix referenced.
        -

        Model of

        -

        Vector Expression -.

        -

        If the specified column falls outside that of the column index -range of the matrix, then the matrix_column is not a -well formed Vector Expression. That is, access to an element which -is outside of the matrix is undefined.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector Expression .

        -

        Public base classes

        -

        vector_expression<matrix_column<M> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        matrix_column (matrix_type &data, size_type -j)Constructs a sub vector.
        size_type size () constReturns the size of the sub vector.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        reference operator () (size_type i)Returns a reference of the i-th element.
        matrix_column &operator = (const matrix_column -&mc)The assignment operator.
        matrix_column &assign_temporary (matrix_column -&mc)Assigns a temporary. May change the matrix column -mc .
        template<class AE>
        -matrix_column &operator = (const vector_expression<AE> -&ae)
        The extended assignment operator.
        template<class AE>
        -matrix_column &assign (const vector_expression<AE> -&ae)
        Assigns a vector expression to the sub vector. Left and right -hand side of the assignment should be independent.
        template<class AE>
        -matrix_column &operator += (const vector_expression<AE> -&ae)
        A computed assignment operator. Adds the vector expression to -the sub vector.
        template<class AE>
        -matrix_column &plus_assign (const vector_expression<AE> -&ae)
        Adds a vector expression to the sub vector. Left and right hand -side of the assignment should be independent.
        template<class AE>
        -matrix_column &operator -= (const vector_expression<AE> -&ae)
        A computed assignment operator. Subtracts the vector expression -from the sub vector.
        template<class AE>
        -matrix_column &minus_assign (const vector_expression<AE> -&ae)
        Subtracts a vector expression from the sub vector. Left and -right hand side of the assignment should be independent.
        template<class AT>
        -matrix_column &operator *= (const AT &at)
        A computed assignment operator. Multiplies the sub vector with -a scalar.
        template<class AT>
        -matrix_column &operator /= (const AT &at)
        A computed assignment operator. Divides the sub vector through -a scalar.
        void swap (matrix_column &mc)Swaps the contents of the sub vectors.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the matrix_column.
        const_iterator end () constReturns a const_iterator pointing to the end of -the matrix_column.
        iterator begin ()Returns a iterator pointing to the beginning of -the matrix_column.
        iterator end ()Returns a iterator pointing to the end of the -matrix_column.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed matrix_column.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed matrix_column.
        reverse_iterator rbegin ()Returns a reverse_iterator pointing to the -beginning of the reversed matrix_column.
        reverse_iterator rend ()Returns a reverse_iterator pointing to the end of -the reversed matrix_column.
        -

        Projections

        -

        Description

        -

        The free column functions support the construction -of matrix columns.

        -

        Prototypes

        -
        
        -    template<class M>
        -    matrix_column<M> column (M &data, std::size_t j);
        -    template<class M>
        -    const matrix_column<const M> column (const M &data, std::size_t j);
        -
        -

        Definition

        -

        Defined in the header matrix_proxy.hpp.

        -

        Type requirements

        - -

        Complexity

        -

        Linear depending from the size of the column.

        -

        Examples

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/matrix_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    for (unsigned j = 0; j < m.size2 (); ++ j) {
        -        for (unsigned i = 0; i < m.size1 (); ++ i)
        -            column (m, j) (i) = 3 * i + j;
        -        std::cout << column (m, j) << std::endl;
        -    }
        -}
        -
        -

        Vector Range

        -

        Description

        -

        The templated class matrix_vector_range<M> -allows addressing a sub vector of a matrix.

        -

        Example

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/matrix_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    for (unsigned i = 0; i < m.size1 (); ++ i)
        -        for (unsigned j = 0; j < m.size2 (); ++ j)
        -            m (i, j) = 3 * i + j;
        -
        -    matrix_vector_range<matrix<double> > mvr (m, range (0, 3), range (0, 3));
        -    std::cout << mvr << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header matrix_proxy.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        MThe type of matrix referenced.
        -

        Model of

        -

        Vector Expression -.

        -

        If the specified ranges fall outside that of the index range of -the matrix, then the matrix_vector_range is not a well -formed Vector Expression. That is, access to an element which is -outside of the matrix is undefined.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector Expression .

        -

        Public base classes

        -

        vector_expression<matrix_vector_range<M> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        matrix_vector_range (matrix_type &data,
        -const range &r1, const range &r2)
        Constructs a sub vector.
        size_type size () constReturns the size of the sub vector.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        reference operator () (size_type i)Returns a reference of the i-th element.
        matrix_vector_range &operator = (const -matrix_vector_range &mvr)The assignment operator.
        matrix_vector_range &assign_temporary -(matrix_vector_range &mvr)Assigns a temporary. May change the matrix vector range -mvr.
        template<class AE>
        -matrix_vector_range &operator = (const -vector_expression<AE> &ae)
        The extended assignment operator.
        template<class AE>
        -matrix_vector_range &assign (const vector_expression<AE> -&ae)
        Assigns a vector expression to the sub vector. Left and right -hand side of the assignment should be independent.
        template<class AE>
        -matrix_vector_range &operator += (const -vector_expression<AE> &ae)
        A computed assignment operator. Adds the vector expression to -the sub vector.
        template<class AE>
        -matrix_vector_range &plus_assign (const -vector_expression<AE> &ae)
        Adds a vector expression to the sub vector. Left and right hand -side of the assignment should be independent.
        template<class AE>
        -matrix_vector_range &operator -= (const -vector_expression<AE> &ae)
        A computed assignment operator. Subtracts the vector expression -from the sub vector.
        template<class AE>
        -matrix_vector_range &minus_assign (const -vector_expression<AE> &ae)
        Subtracts a vector expression from the sub vector. Left and -right hand side of the assignment should be independent.
        template<class AT>
        -matrix_vector_range &operator *= (const AT &at)
        A computed assignment operator. Multiplies the sub vector with -a scalar.
        template<class AT>
        -matrix_vector_range &operator /= (const AT &at)
        A computed assignment operator. Divides the sub vector through -a scalar.
        void swap (matrix_vector_range &mvr)Swaps the contents of the sub vectors.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the matrix_vector_range.
        const_iterator end () constReturns a const_iterator pointing to the end of -the matrix_vector_range.
        iterator begin ()Returns a iterator pointing to the beginning of -the matrix_vector_range.
        iterator end ()Returns a iterator pointing to the end of the -matrix_vector_range.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the matrix_vector_range.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed matrix_vector_range.
        reverse_iterator rbegin ()Returns a reverse_iterator pointing to the -beginning of the reversed matrix_vector_range.
        reverse_iterator rend ()Returns a reverse_iterator pointing to the end of -the reversed matrix_vector_range.
        -

        Vector Slice

        -

        Description

        -

        The templated class matrix_vector_slice<M> -allows addressing a sliced sub vector of a matrix.

        -

        Example

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/matrix_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    for (unsigned i = 0; i < m.size1 (); ++ i)
        -        for (unsigned j = 0; j < m.size2 (); ++ j)
        -            m (i, j) = 3 * i + j;
        -
        -    matrix_vector_slice<matrix<double> > mvs (m, slice (0, 1, 3), slice (0, 1, 3));
        -    std::cout << mvs << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header matrix_proxy.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        MThe type of matrix referenced.
        -

        Model of

        -

        Vector Expression -.

        -

        If the specified slices fall outside that of the index range of -the matrix, then the matrix_vector_slice is not a well -formed Vector Expression. That is, access to an element which is -outside of the matrix is undefined.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector Expression .

        -

        Public base classes

        -

        vector_expression<matrix_vector_slice<M> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        matrix_vector_slice (matrix_type &data,
        -const slice &s1, const slice &s2)
        Constructs a sub vector.
        size_type size () constReturns the size of the sub vector.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        reference operator () (size_type i)Returns a reference of the i-th element.
        matrix_vector_slice &operator = (const -matrix_vector_slice &mvs)The assignment operator.
        matrix_vector_slice &assign_temporary -(matrix_vector_slice &mvs)Assigns a temporary. May change the matrix vector slice -vs.
        template<class AE>
        -matrix_vector_slice &operator = (const -vector_expression<AE> &ae)
        The extended assignment operator.
        template<class AE>
        -matrix_vector_slice &assign (const vector_expression<AE> -&ae)
        Assigns a vector expression to the sub vector. Left and right -hand side of the assignment should be independent.
        template<class AE>
        -matrix_vector_slice &operator += (const -vector_expression<AE> &ae)
        A computed assignment operator. Adds the vector expression to -the sub vector.
        template<class AE>
        -matrix_vector_slice &plus_assign (const -vector_expression<AE> &ae)
        Adds a vector expression to the sub vector. Left and right hand -side of the assignment should be independent.
        template<class AE>
        -matrix_vector_slice &operator -= (const -vector_expression<AE> &ae)
        A computed assignment operator. Subtracts the vector expression -from the sub vector.
        template<class AE>
        -matrix_vector_slice &minus_assign (const -vector_expression<AE> &ae)
        Subtracts a vector expression from the sub vector. Left and -right hand side of the assignment should be independent.
        template<class AT>
        -matrix_vector_slice &operator *= (const AT &at)
        A computed assignment operator. Multiplies the sub vector with -a scalar.
        template<class AT>
        -matrix_vector_slice &operator /= (const AT &at)
        A computed assignment operator. Divides the sub vector through -a scalar.
        void swap (matrix_vector_slice &mvs)Swaps the contents of the sub vectors.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the matrix_vector_slice.
        const_iterator end () constReturns a const_iterator pointing to the end of -the matrix_vector_slice.
        iterator begin ()Returns a iterator pointing to the beginning of -the matrix_vector_slice.
        iterator end ()Returns a iterator pointing to the end of the -matrix_vector_slice.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed matrix_vector_slice.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed matrix_vector_slice.
        reverse_iterator rbegin ()Returns a reverse_iterator pointing to the -beginning of the reversed matrix_vector_slice.
        reverse_iterator rend ()Returns a reverse_iterator pointing to the end of -the reversed matrix_vector_slice.
        -

        Matrix Range

        -

        Description

        -

        The templated class matrix_range<M> allows -addressing a sub matrix of a matrix.

        -

        Example

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/matrix_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    matrix_range<matrix<double> > mr (m, range (0, 3), range (0, 3));
        -    for (unsigned i = 0; i < mr.size1 (); ++ i)
        -        for (unsigned j = 0; j < mr.size2 (); ++ j)
        -            mr (i, j) = 3 * i + j;
        -    std::cout << mr << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header matrix_proxy.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        MThe type of matrix referenced.
        -

        Model of

        -

        Matrix Expression -.

        -

        If the specified ranges fall outside that of the index range of -the matrix, then the matrix_range is not a well formed -Matrix Expression. That is, access to an element which is outside -of the matrix is undefined.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix Expression .

        -

        Public base classes

        -

        matrix_expression<matrix_range<M> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        matrix_range (matrix_type &data,
        -const range &r1, const range &r2)
        Constructs a sub matrix.
        size_type start1 () constReturns the index of the first row.
        size_type size1 () constReturns the number of rows.
        size_type start2 () constReturns the index of the first column.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
        matrix_range &operator = (const matrix_range -&mr)The assignment operator.
        matrix_range &assign_temporary (matrix_range -&mr)Assigns a temporary. May change the matrix range -mr .
        template<class AE>
        -matrix_range &operator = (const matrix_expression<AE> -&ae)
        The extended assignment operator.
        template<class AE>
        -matrix_range &assign (const matrix_expression<AE> -&ae)
        Assigns a matrix expression to the sub matrix. Left and right -hand side of the assignment should be independent.
        template<class AE>
        -matrix_range &operator += (const matrix_expression<AE> -&ae)
        A computed assignment operator. Adds the matrix expression to -the sub matrix.
        template<class AE>
        -matrix_range &plus_assign (const matrix_expression<AE> -&ae)
        Adds a matrix expression to the sub matrix. Left and right hand -side of the assignment should be independent.
        template<class AE>
        -matrix_range &operator -= (const matrix_expression<AE> -&ae)
        A computed assignment operator. Subtracts the matrix expression -from the sub matrix.
        template<class AE>
        -matrix_range &minus_assign (const matrix_expression<AE> -&ae)
        Subtracts a matrix expression from the sub matrix. Left and -right hand side of the assignment should be independent.
        template<class AT>
        -matrix_range &operator *= (const AT &at)
        A computed assignment operator. Multiplies the sub matrix with -a scalar.
        template<class AT>
        -matrix_range &operator /= (const AT &at)
        A computed assignment operator. Divides the sub matrix through -a scalar.
        void swap (matrix_range &mr)Swaps the contents of the sub matrices.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the matrix_range.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the matrix_range.
        iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the matrix_range.
        iterator1 end1 ()Returns a iterator1 pointing to the end of the -matrix_range.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the matrix_range.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the matrix_range.
        iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the matrix_range.
        iterator2 end2 ()Returns a iterator2 pointing to the end of the -matrix_range.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed matrix_range.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed matrix_range.
        reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed matrix_range.
        reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed matrix_range.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed matrix_range.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed matrix_range.
        reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed matrix_range.
        reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -reversed the matrix_range.
        -

        Simple Projections

        -

        Description

        -

        The free subrange functions support the construction -of matrix ranges.

        -

        Prototypes

        -
        
        -    template<class M>
        -    matrix_range<M> subrange (M &data,
        -       M::size_type start1, M::size_type stop1, M::size_type start2, M::size_type, stop2);
        -    template<class M>
        -    const matrix_range<const M> subrange (const M &data,
        -       M::size_type start1, M::size_type stop1, M::size_type start2, M::size_type, stop2);
        -
        -

        Generic Projections

        -

        Description

        -

        The free project functions support the construction -of matrix ranges. Existing matrix_range's can be composed with further ranges. The resulting ranges are computed using this existing ranges' compose function.

        -

        Prototypes

        -
        
        -    template<class M>
        -    matrix_range<M> project (M &data, const range &r1, const range &r2);
        -    template<class M>
        -    const matrix_range<const M> project (const M &data, const range &r1, const range &r2);
        -    template<class M>
        -    matrix_range<M> project (matrix_range<M> &data, const range &r1, const range &r2);
        -    template<class M>
        -    const matrix_range<M> project (const matrix_range<M> &data, const range &r1, const range &r2);
        -
        -

        Definition

        -

        Defined in the header matrix_proxy.hpp.

        -

        Type requirements

        - -

        Complexity

        -

        Quadratic depending from the size of the ranges.

        -

        Examples

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/matrix_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    for (unsigned i = 0; i < m.size1 (); ++ i)
        -        for (unsigned j = 0; j < m.size2 (); ++ j)
        -            project (m, range (0, 3), range (0, 3)) (i, j) = 3 * i + j;
        -    std::cout << project (m, range (0, 3), range (0, 3)) << std::endl;
        -}
        -
        -

        Matrix Slice

        -

        Description

        -

        The templated class matrix_slice<M> allows -addressing a sliced sub matrix of a matrix.

        -

        Example

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/matrix_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    matrix_slice<matrix<double> > ms (m, slice (0, 1, 3), slice (0, 1, 3));
        -    for (unsigned i = 0; i < ms.size1 (); ++ i)
        -        for (unsigned j = 0; j < ms.size2 (); ++ j)
        -            ms (i, j) = 3 * i + j;
        -    std::cout << ms << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header matrix_proxy.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        MThe type of matrix referenced.
        -

        Model of

        -

        Matrix Expression -.

        -

        If the specified slices fall outside that of the index range of -the matrix, then the matrix_slice is not a well formed -Matrix Expression. That is, access to an element which is outside -of the matrix is undefined.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix Expression .

        -

        Public base classes

        -

        matrix_expression<matrix_slice<M> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        matrix_slice (matrix_type &data,
        -const slice &s1, const slice &s2)
        Constructs a sub matrix.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
        matrix_slice &operator = (const matrix_slice -&ms)The assignment operator.
        matrix_slice &assign_temporary (matrix_slice -&ms)Assigns a temporary. May change the matrix slice -ms .
        template<class AE>
        -matrix_slice &operator = (const matrix_expression<AE> -&ae)
        The extended assignment operator.
        template<class AE>
        -matrix_slice &assign (const matrix_expression<AE> -&ae)
        Assigns a matrix expression to the sub matrix. Left and right -hand side of the assignment should be independent.
        template<class AE>
        -matrix_slice &operator += (const matrix_expression<AE> -&ae)
        A computed assignment operator. Adds the matrix expression to -the sub matrix.
        template<class AE>
        -matrix_slice &plus_assign (const matrix_expression<AE> -&ae)
        Adds a matrix expression to the sub matrix. Left and right hand -side of the assignment should be independent.
        template<class AE>
        -matrix_slice &operator -= (const matrix_expression<AE> -&ae)
        A computed assignment operator. Subtracts the matrix expression -from the sub matrix.
        template<class AE>
        -matrix_slice &minus_assign (const matrix_expression<AE> -&ae)
        Subtracts a matrix expression from the sub matrix. Left and -right hand side of the assignment should be independent.
        template<class AT>
        -matrix_slice &operator *= (const AT &at)
        A computed assignment operator. Multiplies the sub matrix with -a scalar.
        template<class AT>
        -matrix_slice &operator /= (const AT &at)
        A computed assignment operator. Multiplies the sub matrix -through a scalar.
        void swap (matrix_slice &ms)Swaps the contents of the sub matrices.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the matrix_slice.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the matrix_slice.
        iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the matrix_slice.
        iterator1 end1 ()Returns a iterator1 pointing to the end of the -matrix_slice.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the matrix_slice.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the matrix_slice.
        iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the matrix_slice.
        iterator2 end2 ()Returns a iterator2 pointing to the end of the -matrix_slice.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed matrix_slice.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed matrix_slice.
        reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed matrix_slice.
        reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed matrix_slice.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed matrix_slice.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed matrix_slice.
        reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed matrix_slice.
        reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed matrix_slice.
        -

        Simple Projections

        -

        Description

        -

        The free subslice functions support the construction -of matrix slices.

        -

        Prototypes

        -
        
        -    template<class M>
        -    matrix_slice<M> subslice (M &data,
        -       M::size_type start1, M::difference_type stride1, M::size_type size1,
        -       M::size_type start2, M::difference_type stride2, M::size_type size2);
        -    template<class M>
        -    const matrix_slice<const M> subslice (const M &data,
        -       M::size_type start1, M::difference_type stride1, M::size_type size1,
        -       M::size_type start2, M::difference_type stride2, M::size_type size2);
        -
        -

        Generic Projections

        -

        Description

        -

        The free project functions support the construction -of matrix slices. Existing matrix_slice's can be composed with further ranges or slices. The resulting slices are computed using this existing slices' compose function.

        -

        Prototypes

        -
        
        -    template<class M>
        -    matrix_slice<M> project (M &data, const slice &s1, const slice &s2);
        -    template<class M>
        -    const matrix_slice<const M> project (const M &data, const slice &s1, const slice &s2);
        -    template<class M>
        -    matrix_slice<M> project (matrix_slice<M> &data, const range &r1, const range &r2);
        -    template<class M>
        -    const matrix_slice<M> project (const matrix_slice<M> &data, const range &r1, const range &r2);
        -    template<class M>
        -    matrix_slice<M> project (matrix_slice<M> &data, const slice &s1, const slice &s2);
        -    template<class M>
        -    const matrix_slice<M> project (const matrix_slice<M> &data, const slice &s1, const slice &s2);
        -
        -

        Definition

        -

        Defined in the header matrix_proxy.hpp.

        -

        Type requirements

        - -

        Complexity

        -

        Quadratic depending from the size of the slices.

        -

        Examples

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/matrix_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    for (unsigned i = 0; i < m.size1 (); ++ i)
        -        for (unsigned j = 0; j < m.size2 (); ++ j)
        -            project (m, slice (0, 1, 3), slice (0, 1, 3)) (i, j) = 3 * i + j;
        -    std::cout << project (m, slice (0, 1, 3), slice (0, 1, 3)) << std::endl;
        -}
        -
        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/matrix_sparse.html b/libs/numeric/ublas/doc/matrix_sparse.html deleted file mode 100644 index fb77de468..000000000 --- a/libs/numeric/ublas/doc/matrix_sparse.html +++ /dev/null @@ -1,983 +0,0 @@ - - - - - - - - - -Sparse Matrix - - -

        Sparse Matricies

        -
        -

        Mapped Matrix

        -

        Description

        -

        The templated class mapped_matrix<T, F, A> is -the base container adaptor for sparse matricies using element maps. -For a (m xn)-dimensional sparse matrix and 0 <= i < m, -0 <= j < n the non-zero elements -mi, j are mapped via (i x n + -j) for row major orientation or via (i + j x m) for -column major orientation to consecutive elements of the associative -container, i.e. for elements k = -mi1 -,j1and k + 1 = -mi2 -,j2of the container holds -i1 < -i2 or (i1 -= i2 and -j1 < -j2) with row major orientation or -j1 < -j2 or (j1 -= j2 and -i1 < -i2) with column major -orientation.

        -

        Example

        -
        -#include <boost/numeric/ublas/matrix_sparse.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    mapped_matrix<double> m (3, 3, 3 * 3);
        -    for (unsigned i = 0; i < m.size1 (); ++ i)
        -        for (unsigned j = 0; j < m.size2 (); ++ j)
        -            m (i, j) = 3 * i + j;
        -    std::cout << m << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header matrix_sparse.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the mapped matrix.
        FFunctor describing the storage organization. [1]row_major
        AThe type of the adapted array. [2]map_std<std::size_t, T>
        -

        Model of

        -

        Matrix .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix .

        -

        Public base classes

        -

        matrix_container<mapped_matrix<T, F, A> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        mapped_matrix ()Allocates a mapped_matrix that holds at most zero -rows of zero elements.
        mapped_matrix (size_type size1, size_type2, size_type non_zeros = 0)Allocates a mapped_matrix that holds at most -size1 rows of size2 elements.
        mapped_matrix (const mapped_matrix &m)The copy constructor.
        template<class AE>
        -mapped_matrix (size_type non_zeros, const -matrix_expression<AE> &ae)
        The extended copy constructor.
        void resize (size_type size1, size_type size2, bool preserve = true)Reallocates a mapped_matrix to hold at most -size1 rows of size2 elements. The -existing elements of the mapped_matrix are preseved -when specified.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
        mapped_matrix &operator = (const mapped_matrix -&m)The assignment operator.
        mapped_matrix &assign_temporary (mapped_matrix -&m)Assigns a temporary. May change the mapped matrix -m .
        template<class AE>
        -mapped_matrix &operator = (const matrix_expression<AE> -&ae)
        The extended assignment operator.
        template<class AE>
        -mapped_matrix &assign (const matrix_expression<AE> -&ae)
        Assigns a matrix expression to the mapped matrix. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -mapped_matrix &operator += (const matrix_expression<AE> -&ae)
        A computed assignment operator. Adds the matrix expression to -the mapped matrix.
        template<class AE>
        -mapped_matrix &plus_assign (const matrix_expression<AE> -&ae)
        Adds a matrix expression to the mapped matrix. Left and right -hand side of the assignment should be independent.
        template<class AE>
        -mapped_matrix &operator -= (const matrix_expression<AE> -&ae)
        A computed assignment operator. Subtracts the matrix expression -from the mapped matrix.
        template<class AE>
        -mapped_matrix &minus_assign (const matrix_expression<AE> -&ae)
        Subtracts a matrix expression from the mapped matrix. Left and -right hand side of the assignment should be independent.
        template<class AT>
        -mapped_matrix &operator *= (const AT &at)
        A computed assignment operator. Multiplies the mapped matrix -with a scalar.
        template<class AT>
        -mapped_matrix &operator /= (const AT &at)
        A computed assignment operator. Divides the mapped matrix -through a scalar.
        void swap (mapped_matrix &m)Swaps the contents of the mapped matrices.
        true_refrence insert_element (size_type i, size_type j, const_reference -t)Inserts the value t at the j-th -element of the i-th row. Duplicates elements are not allowed.
        void erase_element (size_type i, size_type j)Erases the value at the j-th element of the -i-th row.
        void clear ()Clears the mapped matrix.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the mapped_matrix.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the mapped_matrix.
        iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the mapped_matrix.
        iterator1 end1 ()Returns a iterator1 pointing to the end of the -mapped_matrix.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the mapped_matrix.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the mapped_matrix.
        iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the mapped_matrix.
        iterator2 end2 ()Returns a iterator2 pointing to the end of the -mapped_matrix.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed mapped_matrix.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed mapped_matrix.
        reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed mapped_matrix.
        reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed mapped_matrix.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed mapped_matrix.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed mapped_matrix.
        reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed mapped_matrix.
        reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed mapped_matrix.
        -

        Notes

        -

        [1] Supported -parameters for the storage organization are row_major -and column_major.

        -

        [2] Supported -parameters for the adapted array are -map_array<std::size_t, T> and -map_std<std::size_t, T>. The latter is -equivalent to std::map<std::size_t, T>.

        -

        Compressed Matrix

        -

        Description

        -

        The templated class compressed_matrix<T, F, IB, IA, -TA> is the base container adaptor for compressed -matrices. For a (m x n )-dimensional compressed matrix and -0 <= i < m, 0 <= j < n the non-zero -elements mi, j are mapped via (i x -n + j) for row major orientation or via (i + j x m) -for column major orientation to consecutive elements of the index -and value containers, i.e. for elements k = -mi1 -,j1and k + 1 = -mi2 -,j2of the container holds -i1 < -i2 or (i1 -= i2 and -j1 < -j2) with row major orientation or -j1 < -j2 or (j1 -= j2 and -i1 < -i2) with column major -orientation.

        -

        Example

        -
        -#include <boost/numeric/ublas/matrix_sparse.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    compressed_matrix<double> m (3, 3, 3 * 3);
        -    for (unsigned i = 0; i < m.size1 (); ++ i)
        -        for (unsigned j = 0; j < m.size2 (); ++ j)
        -            m (i, j) = 3 * i + j;
        -    std::cout << m << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header matrix_sparse.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the compressed matrix.
        FFunctor describing the storage organization. [1]row_major
        IBThe index base of the compressed vector. [2]0
        IAThe type of the adapted array for indices. [3]unbounded_array<std::size_t>
        TAThe type of the adapted array for values. [3]unbounded_array<T>
        -

        Model of

        -

        Matrix .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix .

        -

        Public base classes

        -

        matrix_container<compressed_matrix<T, F, IB, IA, -TA> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        compressed_matrix ()Allocates a compressed_matrix that holds at most -zero rows of zero elements.
        compressed_matrix (size_type size1, size_type2, size_type non_zeros = 0)Allocates a compressed_matrix that holds at most -size1 rows of size2 elements.
        compressed_matrix (const compressed_matrix -&m)The copy constructor.
        template<class AE>
        -compressed_matrix (size_type non_zeros, const -matrix_expression<AE> &ae)
        The extended copy constructor.
        void resize (size_type size1, size_type size2, bool preserve = true)Reallocates a compressed_matrix to hold at most -size1 rows of size2 elements. The -existing elements of the compressed_matrix are -preseved when specified.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
        compressed_matrix &operator = (const -compressed_matrix &m)The assignment operator.
        compressed_matrix &assign_temporary -(compressed_matrix &m)Assigns a temporary. May change the compressed matrix -m.
        template<class AE>
        -compressed_matrix &operator = (const -matrix_expression<AE> &ae)
        The extended assignment operator.
        template<class AE>
        -compressed_matrix &assign (const matrix_expression<AE> -&ae)
        Assigns a matrix expression to the compressed matrix. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -compressed_matrix &operator += (const -matrix_expression<AE> &ae)
        A computed assignment operator. Adds the matrix expression to -the compressed matrix.
        template<class AE>
        -compressed_matrix &plus_assign (const -matrix_expression<AE> &ae)
        Adds a matrix expression to the compressed matrix. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -compressed_matrix &operator -= (const -matrix_expression<AE> &ae)
        A computed assignment operator. Subtracts the matrix expression -from the compressed matrix.
        template<class AE>
        -compressed_matrix &minus_assign (const -matrix_expression<AE> &ae)
        Subtracts a matrix expression from the compressed matrix. Left -and right hand side of the assignment should be independent.
        template<class AT>
        -compressed_matrix &operator *= (const AT &at)
        A computed assignment operator. Multiplies the compressed -matrix with a scalar.
        template<class AT>
        -compressed_matrix &operator /= (const AT &at)
        A computed assignment operator. Divides the compressed matrix -through a scalar.
        void swap (compressed_matrix &m)Swaps the contents of the compressed matrices.
        true_reference insert_element (size_type i, size_type j, const_reference -t)Inserts the value t at the j-th -element of the i-th row. Duplicates elements are not allowed.
        void erase_element (size_type i, size_type j)Erases the value at the j-th element of the -i-th row.
        void clear ()Clears the compressed matrix.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the compressed_matrix.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the compressed_matrix.
        iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the compressed_matrix.
        iterator1 end1 ()Returns a iterator1 pointing to the end of the -compressed_matrix.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the compressed_matrix.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the compressed_matrix.
        iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the compressed_matrix.
        iterator2 end2 ()Returns a iterator2 pointing to the end of the -compressed_matrix.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed compressed_matrix.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed compressed_matrix.
        reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed compressed_matrix.
        reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed compressed_matrix.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed compressed_matrix.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed compressed_matrix.
        reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed compressed_matrix.
        reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed compressed_matrix.
        -

        Notes

        -

        [1] -Supported parameters for the storage organization are -row_major and column_major.

        -

        [2] -Supported parameters for the index base are 0 and -1 at least.

        -

        [3] -Supported parameters for the adapted array are -unbounded_array<> , -bounded_array<> and -std::vector<> .

        -

        Coordinate Matrix

        -

        Description

        -

        The templated class coordinate_matrix<T, F, IB, IA, -TA> is the base container adaptor for compressed -matrices. For a (m x n )-dimensional sorted coordinate -matrix and 0 <= i < m, 0 <= j < n the -non-zero elements mi, j are mapped via -(i x n + j) for row major orientation or via (i + j x -m) for column major orientation to consecutive elements of the -index and value containers, i.e. for elements k = -mi1 -,j1and k + 1 = -mi2 -,j2of the container holds -i1 < -i2 or (i1 -= i2 and -j1 < -j2) with row major orientation or -j1 < -j2 or (j1 -= j2 and -i1 < -i2) with column major -orientation.

        -

        Example

        -
        -#include <boost/numeric/ublas/matrix_sparse.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    coordinate_matrix<double> m (3, 3, 3 * 3);
        -    for (unsigned i = 0; i < m.size1 (); ++ i)
        -        for (unsigned j = 0; j < m.size2 (); ++ j)
        -            m (i, j) = 3 * i + j;
        -    std::cout << m << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header matrix_sparse.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the coordinate matrix.
        FFunctor describing the storage organization. [1]row_major
        IBThe index base of the coordinate vector. [2]0
        IAThe type of the adapted array for indices. [3]unbounded_array<std::size_t>
        TAThe type of the adapted array for values. [3]unbounded_array<T>
        -

        Model of

        -

        Matrix .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix .

        -

        Public base classes

        -

        matrix_container<coordinate_matrix<T, F, IB, IA, -TA> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        coordinate_matrix ()Allocates a coordinate_matrix that holds at most -zero rows of zero elements.
        coordinate_matrix (size_type size1, size_type2, size_type non_zeros = 0)Allocates a coordinate_matrix that holds at most -size1 rows of size2 elements.
        coordinate_matrix (const coordinate_matrix -&m)The copy constructor.
        template<class AE>
        -coordinate_matrix (size_type non_zeros, const -matrix_expression<AE> &ae)
        The extended copy constructor.
        void resize (size_type size1, size_type size2, bool preserve = true)Reallocates a coordinate_matrix to hold at most -size1 rows of size2 elements. The -existing elements of the coordinate_matrix are -preseved when specified.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
        coordinate_matrix &operator = (const -coordinate_matrix &m)The assignment operator.
        coordinate_matrix &assign_temporary -(coordinate_matrix &m)Assigns a temporary. May change the coordinate matrix -m.
        template<class AE>
        -coordinate_matrix &operator = (const -matrix_expression<AE> &ae)
        The extended assignment operator.
        template<class AE>
        -coordinate_matrix &assign (const matrix_expression<AE> -&ae)
        Assigns a matrix expression to the coordinate matrix. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -coordinate_matrix &operator += (const -matrix_expression<AE> &ae)
        A computed assignment operator. Adds the matrix expression to -the coordinate matrix.
        template<class AE>
        -coordinate_matrix &plus_assign (const -matrix_expression<AE> &ae)
        Adds a matrix expression to the coordinate matrix. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -coordinate_matrix &operator -= (const -matrix_expression<AE> &ae)
        A computed assignment operator. Subtracts the matrix expression -from the coordinate matrix.
        template<class AE>
        -coordinate_matrix &minus_assign (const -matrix_expression<AE> &ae)
        Subtracts a matrix expression from the coordinate matrix. Left -and right hand side of the assignment should be independent.
        template<class AT>
        -coordinate_matrix &operator *= (const AT &at)
        A computed assignment operator. Multiplies the coordinate -matrix with a scalar.
        template<class AT>
        -coordinate_matrix &operator /= (const AT &at)
        A computed assignment operator. Divides the coordinate matrix -through a scalar.
        void swap (coordinate_matrix &m)Swaps the contents of the coordinate matrices.
        true_reference insert_element (size_type i, size_type j, const_reference -t)Inserts the value t at the j-th -element of the i-th row. Duplicates elements are not allowed.
        void append_element (size_type i, size_type j, const_reference t)Appends the value t at the j-th element of the i-th row. -Duplicate elements can be appended to a coordinate_matrix. They are merged into a single -arithmetically summed element by the sort function.
        void erase_element (size_type i, size_type j)Erases the value at the j-th element of the -i-th row.
        void clear ()Clears the coordinate matrix.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the coordinate_matrix.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the coordinate_matrix.
        iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the coordinate_matrix.
        iterator1 end1 ()Returns a iterator1 pointing to the end of the -coordinate_matrix.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the coordinate_matrix.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the coordinate_matrix.
        iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the coordinate_matrix.
        iterator2 end2 ()Returns a iterator2 pointing to the end of the -coordinate_matrix.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed coordinate_matrix.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed coordinate_matrix.
        reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed coordinate_matrix.
        reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed coordinate_matrix.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed coordinate_matrix.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed coordinate_matrix.
        reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed coordinate_matrix.
        reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed coordinate_matrix.
        -

        Notes

        -

        [1] -Supported parameters for the storage organization are -row_major and column_major.

        -

        [2] -Supported parameters for the index base are 0 and -1 at least.

        -

        [3] -Supported parameters for the adapted array are -unbounded_array<> , -bounded_array<> and -std::vector<> .

        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/operations_overview.html b/libs/numeric/ublas/doc/operations_overview.html deleted file mode 100644 index 42d994212..000000000 --- a/libs/numeric/ublas/doc/operations_overview.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - - - - -uBLAS operations overview - - -

        Overview of Matrix and Vector Operations

        -
        - -
        -
        Contents:
        -
        Basic Linear Algebra
        -
        Advanced Functions
        -
        Submatrices, Subvectors
        -
        Speed Improvements
        -
        - -

        Definitions

        - - - - - - - - - - - - - - -
        A, B, C are matrices
        u, v, ware vectors
        i, j, kare integer values
        t, t1, t2are scalar values
        r, r1, r2are ranges, e.g. range(0, 3)
        s, s1, s2are slices, e.g. slice(0, 1, 3)
        - -

        Basic Linear Algebra

        - -

        standard operations: addition, subtraction, multiplication by a -scalar

        - -
        
        -C = A + B; C = A - B; C = -A;
        -w = u + v; w = u - v; w = -u;
        -C = t * A; C = A * t; C = A / t;
        -w = t * u; w = u * t; w = u / t;
        -
        - -

        computed assignments

        - -
        
        -C += A; C -= A; 
        -w += u; w -= u; 
        -C *= t; C /= t; 
        -w *= t; w /= t;
        -
        - -

        inner, outer and other products

        - -
        
        -t = inner_prod(u, v);
        -C = outer_prod(u, v);
        -w = prod(A, u); w = prod(u, A); w = prec_prod(A, u); w = prec_prod(u, A);
        -C = prod(A, B); C = prec_prod(A, B);
        -w = element_prod(u, v); w = element_div(u, v);
        -C = element_prod(A, B); C = element_div(A, B);
        -
        - -

        transformations

        - -
        
        -w = conj(u); w = real(u); w = imag(u);
        -C = trans(A); C = conj(A); C = herm(A); C = real(A); C = imag(A);
        -
        - -

        Advanced functions

        - -

        norms

        - -
        
        -t = norm_inf(v); i = index_norm_inf(v);
        -t = norm_1(v);   t = norm_2(v); 
        -t = norm_inf(A); i = index_norm_inf(A);
        -t = norm_1(A);   t = norm_frobenius(A); 
        -
        - -

        products

        - -
        
        -axpy_prod(A, u, w, true);  // w = A * u
        -axpy_prod(A, u, w, false); // w += A * u
        -axpy_prod(u, A, w, true);  // w = trans(A) * u
        -axpy_prod(u, A, w, false); // w += trans(A) * u
        -axpy_prod(A, B, C, true);  // C = A * B
        -axpy_prod(A, B, C, false); // C += A * B
        -
        -

        Note: The last argument (bool init) of -axpy_prod is optional. Currently it defaults to -true, but this may change in the future. Setting the -init to true is equivalent to calling -w.clear() before axpy_prod. -There are some specialisation for products of compressed matrices that give a -large speed up compared to prod.

        -
        
        -w = block_prod<matrix_type, 64> (A, u); // w = A * u
        -w = block_prod<matrix_type, 64> (u, A); // w = trans(A) * u
        -C = block_prod<matrix_type, 64> (A, B); // C = A * B
        -
        -

        Note: The blocksize can be any integer. However, the -actual speed depends very significantly on the combination of blocksize, -CPU and compiler. The function block_prod is designed -for large dense matrices.

        -

        rank-k updates

        -
        
        -opb_prod(A, B, C, true);  // C = A * B
        -opb_prod(A, B, C, false); // C += A * B
        -
        -

        Note: The last argument (bool init) of -opb_prod is optional. Currently it defaults to -true, but this may change in the future. This function -may give a speedup if A has less columns than rows, -because the product is computed as a sum of outer products.

        - -

        Submatrices, Subvectors

        -

        Accessing submatrices and subvectors via proxies using project functions:

        -
        
        -w = project(u, r);         // the subvector of u specifed by the index range r
        -w = project(u, s);         // the subvector of u specifed by the index slice s
        -C = project(A, r1, r2);    // the submatrix of A specified by the two index ranges r1 and r2
        -C = project(A, s1, s2);    // the submatrix of A specified by the two index slices s1 and s2
        -w = row(A, i); w = column(A, j);    // a row or column of matrix as a vector
        -
        -

        Assigning to submatrices and subvectors via proxies using project functions:

        -
        
        -project(u, r) = w;         // assign the subvector of u specifed by the index range r
        -project(u, s) = w;         // assign the subvector of u specifed by the index slice s
        -project(A, r1, r2) = C;    // assign the submatrix of A specified by the two index ranges r1 and r2
        -project(A, s1, s2) = C;    // assign the submatrix of A specified by the two index slices s1 and s2
        -row(A, i) = w; column(A, j) = w;    // a row or column of matrix as a vector
        -
        -

        Note: A range r = range(start, stop) -contains all indices i with start <= i < -stop. A slice is something more general. The slice -s = slice(start, stride, size) contains the indices -start, start+stride, ..., start+(size-1)*stride. The -stride can be 0 or negative! If start >= stop for a range -or size == 0 for a slice then it contains no elements.

        -

        Sub-ranges and sub-slices of vectors and matrices can be created directly with the subrange and sublice functions:

        -
        
        -w = subrange(u, 0, 2);         // the 2 element subvector of u
        -w = subslice(u, 0, 1, 2);      // the 2 element subvector of u
        -C = subrange(A, 0,2, 0,3);     // the 2x3 element submatrix of A
        -C = subslice(A, 0,1,2, 0,1,3); // the 2x3 element submatrix of A
        -subrange(u, 0, 2) = w;         // assign the 2 element subvector of u
        -subslice(u, 0, 1, 2) = w;      // assign the 2 element subvector of u
        -subrange(A, 0,2, 0,3) = C;     // assign the 2x3 element submatrix of A
        -subrange(A, 0,1,2, 0,1,3) = C; // assigne the 2x3 element submatrix of A
        -
        -

        There are to more ways to access some matrix elements as a -vector:

        -
        matrix_vector_range<matrix_type> (A, r1, r2);
        -matrix_vector_slice<matrix_type> (A, s1, s2);
        -
        -

        Note: These matrix proxies take a sequence of elements -of a matrix and allow you to access these as a vector. In -particular matrix_vector_slice can do this in a very -general way. matrix_vector_range is less useful as the -elements must lie along a diagonal.

        -

        Example: To access the first two elements of a sub -column of a matrix we access the row with a slice with stride 1 and -the column with a slice with stride 0 thus:
        -matrix_vector_slice<matrix_type> (A, slice(0,1,2), -slice(0,0,2)); -

        - -

        Speed improvements

        -

        Matrix / Vector assignment

        -

        If you know for sure that the left hand expression and the right -hand expression have no common storage, then assignment has -no aliasing. A more efficient assignment can be specified -in this case:

        -
        noalias(C) = prod(A, B);
        -
        -

        This avoids the creation of a temporary matrix that is required in a normal assignment. -'noalias' assignment requires that the left and right hand side be size conformant.

        - -

        Sparse element access

        -

        The matrix element access function A(i1,i2) or the equivalent vector -element access functions (v(i) or v[i]) usually create 'sparse element proxies' -when applied to a sparse matrix or vector. These proxies allow access to elements -without having to worry about nasty C++ issues where references are invalidated.

        -

        These 'sparse element proxies' can be implemented more efficiently when applied to const -objects. -Sadly in C++ there is no way to distinguish between an element access on the left and right hand side of -an assignment. Most often elements on the right hand side will not be changed and therefore it would -be better to use the const proxies. We can do this by making the matrix or vector -const before accessing it's elements. For example:

        -
        value = const_cast<const VEC>(v)[i];   // VEC is the type of V
        -
        -

        If more then one element needs to be accessed const_iterator's should be used -in preference to iterator's for the same reason. For the more daring 'sparse element proxies' -can be completely turned off in uBLAS by defining the configuration macro BOOST_UBLAS_NO_ELEMENT_PROXIES. -

        - - -

        Controlling the complexity of nested products

        - -

        What is the complexity (the number of add and multiply operations) required to compute the following? -

        -
        - R = prod(A, prod(B,C)); 
        -
        -

        Firstly the complexity depends on matrix size. Also since prod is transitive (not commutative) -the bracket order affects the complexity. -

        -

        uBLAS evaluates expressions without matrix or vector temporaries and honours -the bracketing structure. However avoiding temporaries for nested product unnecessarly increases the complexity. -Conversly by explictly using temporary matrices the complexity of a nested product can be reduced. -

        -

        uBLAS provides 3 alternative syntaxes for this purpose: -

        -
        - temp_type T = prod(B,C); R = prod(A,T);   // Preferable if T is preallocated
        -
        -
        - prod(A, temp_type(prod(B,C));
        -
        -
        - prod(A, prod<temp_type>(B,C));
        -
        -

        The 'temp_type' is important. Given A,B,C are all of the same type. Say -matrix<float>, the choice is easy. However if the value_type is mixed (int with float or double) -or the matrix type is mixed (sparse with symmetric) the best solution is not so obvious. It is up to you! It -depends on numerical properties of A and the result of the prod(B,C). -

        - -
        -

        Copyright (©) 2000-2007 Joerg Walter, Mathias Koch, Gunter -Winkler, Michael Stevens
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/options.html b/libs/numeric/ublas/doc/options.html deleted file mode 100644 index 2b9e6f231..000000000 --- a/libs/numeric/ublas/doc/options.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - - - - - -Boost Basic Linear Algebra - Configuration Options - - -

        logoBoost Basic Linear Algebra - Configuration Options

        -
        - - - -

        NDEBUG

        - -

        Make sure you define NDEBUG The only way uBLAS -knows you want a release configuration is to check if you have defined -NDEBUG. If you don't it assumes you want a debug configuration and -adds a lot of very useful runtime check. However these are very slow! -

        - - -

        BOOST_UBLAS_MOVE_SEMANTICS

        - -

        The patch and description was provided by Nasos Iliopoulos.

        - -

        An immediate effect of this option is the elimination of the need -for noalias in types vector<T> and matrix<T>, -when assigned to the same type. This option doesn't have an effect on -bounded and c types. Although it is rare, not all compilers support copy -elision (that allows for move semantics), so a test must be performed to -make sure that there is a benefit when it is enabled. A small -demonstration and test can be found in -test_move_semantics.cpp

        - -

        -In the test -example two tests are defined, one for vectors and one for -matrices. The aim of this example is to print the pointers of the -storage of each of the containers, before and after the assignment to -a temporary object. When move semantics are enabled, the -vector<T> and matrix<T> storage is moved -from the temporary and no copy is performed. -

        - -

        -If move semantics are supported by your compiler you will get an output like the following: -

        -
        -matrix<double> --------------------------------------------------------------------
        -Temporary pointer r: 0x94790c0
        -Pointer (must be equal to temp. pointer if move semantics are enabled) : 0x94790c0
        -
        - -

        Notes:

        -
          -
        • It should be no surprise to see matrices and vectors been passed -by VALUE, the compiler takes care and either moves (if the underlying -code does not modify the object), or copies (if the underlying code -modifies the object). -
        • -
        • There might be some space for some improvements (like clearing the -data, before swaping) -
        • -
        • Move semantics don't eliminate temporaries. They rather move their -storage around so no copies are performed. -
        • -
        • MSVC does no implement Named Return Value Optimization in debug -mode. So if you build in debug with this compiler you might get different behaviour than a release build. -
        • -
        • Enabling move semantics is done via #define BOOST_UBLAS_MOVE_SEMANTICS. -
        • -
        • There is plenty of room for optimizations when c++0x standard is -out, taking advantage of rvalue references. (I have a sweet vector -implementation using that). -
        • -
        • If you enable move semantics and your compiler does not support -them, the operation will just be as passing by const reference. -
        • -
        - -

        Interesting links

        - - -

        BOOST_UBLAS_CHECK_ENABLE

        - -

        When BOOST_UBLAS_CHECK_ENABLE is defined then all index and -parameter checks are enabled. This is enabled in debug mode and -disabled in release mode. -

        - -

        BOOST_UBLAS_TYPE_CHECK

        - -

        When BOOST_UBLAS_TYPE_CHECK is enabled then all possibly expensive -structure checks are enabled. If this is not desireable then use -#define BOOST_UBLAS_TYPE_CHECK 0 before including any uBLAS -header. The define BOOST_UBLAS_TYPE_CHECK_EPSILON can be used to -control the acceptable tolerance, see -detail/matrix_assign.hpp for implementation details of this -check. -

        - -

        BOOST_UBLAS_USE_LONG_DOUBLE

        - -

        Enable uBLAS expressions that involve containers of 'long double'

        - -

        BOOST_UBLAS_USE_INTERVAL

        - -

        Enable uBLAS expressions that involve containers of 'boost::numeric::interval' types

        - -

        Configuring uBLAS with Macros

        - -

        Many macro's appear in ublas/config.hpp and elsewhere. Hopefully in the future some of these will disappear! -They fall into 4 groups: -

        -
          -
        • Automatically set by 'boost/numeric/ublas/config.hpp' based on -NDEBUG. Makes the distinction between debug (safe) and release (fast) -mode. Similar to STLport -
            -
          • Release mode (NDEBUG defined) -
              -
            • BOOST_UBLAS_INLINE Compiler dependant definition to control -function inlining.
            • BOOST_UBLAS_USE_FAST_SAME
            -
          • Debug mode -
              -
            • BOOST_UBLAS_CHECK_ENABLE Enable checking of indexs, iterators -and parameters. Prevents out of bound access etc.
            • -BOOST_UBLAS_TYPE_CHECK Enable additional checks for the results of -expressions using non dense types. Picks up runtime error such as the -assignment of a numerically non-symmetric matrix to -symmertic_matrix. Use #define BOOST_UBLAS_TYPE_CHECK 0 to -disable expensive numeric type checks. (Note: "structure check" -would be a much better name.)
            • -BOOST_UBLAS_TYPE_CHECK_EPSILON default: sqrt(epsilon), controls how -large the difference between the expected result and the computed -result may become. Increase this value if you are going to use near -singular or badly scaled matrices. Please, refer to -detail/matrix_assign.hpp for implementation of these type -checks.
          -
        • -
        • Automatically set by 'boost/numeric/ublas/config.hpp' based on -compiler and boost/config.hpp macro's. Augments the compiler -deficiency workarounds already supplied by boost/config.hpp -
            -
          • BOOST_UBLAS_NO_NESTED_CLASS_RELATION A particularly nasty -problem with VC7.1 Requires that uBLAS and the user use begin(it) -rather then it.begin()
          • BOOST_UBLAS_NO_SMART_PROXIES -Disable the automatic propagation of 'constantness' to -proxies. Smart proxies automatically determine if the underling -container they reference is constant or not. They adjust there -definition of iterators and container access to reflect this -constantness.
          -
        • -
        • For use by uBLAS authors to test implementation methods. Preset -in config.hpp -
            -
          • BOOST_UBLAS_USE_INVARIANT_HOISTING
          • -BOOST_UBLAS_USE_INDEXING
          • BOOST_UBLAS_USE_INDEXED_ITERATOR -
          • BOOST_UBLAS_NON_CONFORMANT_PROXIES Gappy containers may -be non-conformant, that is contain elements at different -indices. Assigning between proxies (vector ranges for example) of -these containers is difficult as the LHS may need insert new -elements. This is slow.
          • BOOST_UBLAS_USE_DUFF_DEVICE -Near useless on all platforms (see GCC's -funroll-loops) - -
          -
        • -
        • User options. Can be predefined by user before including any -uBLAS headers. They may also be automatically defined for some -compilers to work around compile bugs. -
            -
          • BOOST_UBLAS_USE_LONG_DOUBLE Enable uBLAS expressions that -involve containers of 'long double'
          • -BOOST_UBLAS_USE_INTERVAL Enable uBLAS expressions that involve -containers of 'boost::numeric::interval' types
          • -BOOST_UBLAS_SIMPLE_ET_DEBUG In order to simplify debugging is is -possible to simplify expression templateso they are restricted to a -single operation - -
          • BOOST_UBLAS_ENABLE_PROXY_SHORTCUTS enable automatic -conversion from proxy class to matrix expression
          • -BOOST_UBLAS_NO_ELEMENT_PROXIES Disables the use of element proxies -for gappy types.
          • The Gappy types (sparse, coordinate, -compressed) store non-zero elements in their own containers. When new -non-zero elements are assigned they must rearrange these -containers. This invalidates references, iterators or pointers to -these elements. This can happen at some surprising times such as the -expression "a [1] = a [0] = 1;". Element proxies guarantee all such -expressions will work as expected. However they bring their own -restrictions and efficiency problems. For example as of Boost 1.30.0 -they prevent the assignment of elements between different types. -
          • -
          • BOOST_UBLAS_REFERENCE_CONST_MEMBER Enable to allow refernces -to be returned to fixed (zero or one) elements of triangular or banded -matrices - -
          • BOOST_UBLAS_NO_EXCEPTIONS Disable the use exceptions of -uBLAS internal checks and error conditions. BOOST_NO_EXCEPTIONS has -same effect. -
          • -
          • BOOST_UBLAS_SINGULAR_CHECK Check the for singularity in triangular solve() functions
          • -
          -
        • -
        - -
        - -
        -

        - - -Last modified: Wed Sep 16 23:16:45 CEST 2009 - -

        -
        - - - diff --git a/libs/numeric/ublas/doc/overview.html b/libs/numeric/ublas/doc/overview.html deleted file mode 100644 index 1ce347dc3..000000000 --- a/libs/numeric/ublas/doc/overview.html +++ /dev/null @@ -1,965 +0,0 @@ - - - - - - - - - - -uBLAS Overview - - -

        logouBLAS Overview

        -
        -

        Rationale

        -

        It would be nice if every kind of numeric software could -be written in C++ without loss of efficiency, but unless something -can be found that achieves this without compromising the C++ type -system it may be preferable to rely on Fortran, assembler or -architecture-specific extensions (Bjarne Stroustrup).

        -

        This C++ library is directed towards scientific computing on the -level of basic linear algebra constructions with matrices and -vectors and their corresponding abstract operations. The primary -design goals were:

        -
          -
        • mathematical notation
        • -
        • efficiency
        • -
        • functionality
        • -
        • compatibility
        • -
        -

        Another intention was to evaluate, if the abstraction penalty -resulting from the use of such matrix and vector classes is -acceptable.

        -

        Resources

        -

        The development of this library was guided by a couple of -similar efforts:

        -
          -
        • BLAS by -Jack Dongarra et al.
        • -
        • Blitz++ by Todd -Veldhuizen
        • -
        • POOMA by Scott -Haney et al.
        • -
        • MTL by Jeremy -Siek et al.
        • -
        -

        BLAS seems to be the most widely used library for basic linear -algebra constructions, so it could be called a de-facto standard. -Its interface is procedural, the individual functions are somewhat -abstracted from simple linear algebra operations. Due to the fact -that is has been implemented using Fortran and its optimizations, -it also seems to be one of the fastest libraries available. As we -decided to design and implement our library in an object-oriented -way, the technical approaches are distinct. However anyone should -be able to express BLAS abstractions in terms of our library -operators and to compare the efficiency of the implementations.

        -

        Blitz++ is an impressive library implemented in C++. Its main -design seems to be oriented towards multidimensional arrays and -their associated operators including tensors. The author of Blitz++ -states, that the library achieves performance on par or better than -corresponding Fortran code due to his implementation technique -using expression templates and template metaprograms. However we -see some reasons, to develop an own design and implementation -approach. We do not know whether anybody tries to implement -traditional linear algebra and other numerical algorithms using -Blitz++. We also presume that even today Blitz++ needs the most -advanced C++ compiler technology due to its implementation idioms. -On the other hand, Blitz++ convinced us, that the use of expression -templates is mandatory to reduce the abstraction penalty to an -acceptable limit.

        -

        POOMA's design goals seem to parallel Blitz++'s in many parts . -It extends Blitz++'s concepts with classes from the domains of -partial differential equations and theoretical physics. The -implementation supports even parallel architectures.

        -

        MTL is another approach supporting basic linear algebra -operations in C++. Its design mainly seems to be influenced by BLAS -and the C++ Standard Template Library. We share the insight that a -linear algebra library has to provide functionality comparable to -BLAS. On the other hand we think, that the concepts of the C++ -standard library have not yet been proven to support numerical -computations as needed. As another difference MTL currently does -not seem to use expression templates. This may result in one of two -consequences: a possible loss of expressiveness or a possible loss -of performance.

        -

        Concepts

        -

        Mathematical Notation

        -

        The usage of mathematical notation may ease the development of -scientific algorithms. So a C++ library implementing basic linear -algebra concepts carefully should overload selected C++ operators -on matrix and vector classes.

        -

        We decided to use operator overloading for the following -primitives:

        - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        DescriptionOperator
        Indexing of vectors and matricesvector::operator(size_t i);
        -matrix::operator(size_t i, size_t j);
        Assignment of vectors and matricesvector::operator = (const vector_expression &);
        -vector::operator += (const vector_expression &);
        -vector::operator -= (const vector_expression &);
        -vector::operator *= (const scalar_expression &);
        -matrix::operator = (const matrix_expression &);
        -matrix::operator += (const matrix_expression &);
        -matrix::operator -= (const matrix_expression &);
        -matrix::operator *= (const scalar_expression &);
        Unary operations on vectors and matricesvector_expression operator - (const vector_expression -&);
        -matrix_expression operator - (const matrix_expression -&);
        Binary operations on vectors and matricesvector_expression operator + (const vector_expression -&, const vector_expression &);
        -vector_expression operator - (const vector_expression &, const -vector_expression &);
        -matrix_expression operator + (const matrix_expression &, const -matrix_expression &);
        -matrix_expression operator - (const matrix_expression &, const -matrix_expression &);
        Multiplication of vectors and matrices with a scalarvector_expression operator * (const scalar_expression -&, const vector_expression &);
        -vector_expression operator * (const vector_expression &, const -scalar_expression &);
        -matrix_expression operator * (const scalar_expression &, const -matrix_expression &);
        -matrix_expression operator * (const matrix_expression &, const -scalar_expression &);
        -

        We decided to use no operator overloading for the following -other primitives:

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        DescriptionFunction
        Left multiplication of vectors with a matrixvector_expression -prod<vector_type > (const -matrix_expression &, const vector_expression &);
        -vector_expression prod (const matrix_expression &, const -vector_expression &);
        Right multiplication of vectors with a matrixvector_expression -prod<vector_type > (const -vector_expression &, const matrix_expression &);
        -vector_expression prod (const vector_expression &, const -matrix_expression &);
        Multiplication of matricesmatrix_expression -prod<matrix_type > (const -matrix_expression &, const matrix_expression &);
        -matrix_expression prod (const matrix_expression &, const -matrix_expression &);
        Inner product of vectorsscalar_expression inner_prod (const vector_expression -&, const vector_expression &);
        Outer product of vectorsmatrix_expression outer_prod (const vector_expression -&, const vector_expression &);
        Transpose of a matrixmatrix_expression trans (const matrix_expression -&);
        -

        Efficiency

        -

        To achieve the goal of efficiency for numerical computing, one -has to overcome two difficulties in formulating abstractions with -C++, namely temporaries and virtual function calls. Expression -templates solve these problems, but tend to slow down compilation -times.

        -

        Eliminating Temporaries

        -

        Abstract formulas on vectors and matrices normally compose a -couple of unary and binary operations. The conventional way of -evaluating such a formula is first to evaluate every leaf operation -of a composition into a temporary and next to evaluate the -composite resulting in another temporary. This method is expensive -in terms of time especially for small and space especially for -large vectors and matrices. The approach to solve this problem is -to use lazy evaluation as known from modern functional programming -languages. The principle of this approach is to evaluate a complex -expression element wise and to assign it directly to the -target.

        -

        Two interesting and dangerous facts result:

        -

        Aliases

        -

        One may get serious side effects using element wise -evaluation on vectors or matrices. Consider the matrix vector -product x = A x. Evaluation of -A1x and assignment to -x1 changes the right hand side, so -that the evaluation of A2x -returns a wrong result. In this case there are aliases of the elements -xn on both the left and right hand side of the assignment.

        -

        Our solution for this problem is to -evaluate the right hand side of an assignment into a temporary and -then to assign this temporary to the left hand side. To allow -further optimizations, we provide a corresponding member function -for every assignment operator and also a - noalias syntax. -By using this syntax a programmer can confirm, that the left and right hand sides of an -assignment are independent, so that element wise evaluation and -direct assignment to the target is safe.

        -

        Complexity

        -

        The computational complexity may be unexpectedly large under certain -cirumstances. Consider the chained matrix vector product A (B -x). Conventional evaluation of A (B x) is quadratic. -Deferred evaluation of B xi is linear. -As every element B xi is needed -linearly depending of the size, a completely deferred evaluation of -the chained matrix vector product A (B x) is cubic. In -such cases one needs to reintroduce temporaries in the -expression.

        -

        Eliminating Virtual Function Calls

        -

        Lazy expression evaluation normally leads to the definition of a -class hierarchy of terms. This results in the usage of dynamic -polymorphism to access single elements of vectors and matrices, -which is also known to be expensive in terms of time. A solution -was found a couple of years ago independently by David Vandervoorde -and Todd Veldhuizen and is commonly called expression templates. -Expression templates contain lazy evaluation and replace dynamic -polymorphism with static, i.e. compile time polymorphism. -Expression templates heavily depend on the famous Barton-Nackman -trick, also coined 'curiously defined recursive templates' by Jim -Coplien.

        -

        Expression templates form the base of our implementation.

        -

        Compilation times

        -

        It is also a well known fact, that expression templates -challenge currently available compilers. We were able to -significantly reduce the amount of needed expression templates -using the Barton-Nackman trick consequently.

        -

        We also decided to support a dual conventional implementation -(i.e. not using expression templates) with extensive bounds and -type checking of vector and matrix operations to support the -development cycle. Switching from debug mode to release mode is -controlled by the NDEBUG preprocessor symbol of -<cassert>.

        - -

        Functionality

        - -

        Every C++ library supporting linear algebra will be measured -against the long-standing Fortran package BLAS. We now describe how -BLAS calls may be mapped onto our classes.

        - -

        The page Overview of Matrix and Vector Operations -gives a short summary of the most used operations on vectors and -matrices.

        - -

        Blas Level 1

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        BLAS CallMapped Library ExpressionMathematical DescriptionComment
        sasum OR dasumnorm_1 (x)sum |xi|Computes the l1 (sum) norm of a real vector.
        scasum OR dzasumreal (sum (v)) + imag (sum (v))sum re(xi) + sum im(xi)Computes the sum of elements of a complex vector.
        _nrm2norm_2 (x)sqrt (sum -|xi|2 )Computes the l2 (euclidean) norm of a vector.
        i_amaxnorm_inf (x)
        -index_norm_inf (x)
        max |xi|Computes the linf (maximum) norm of a vector.
        -BLAS computes the index of the first element having this -value.
        _dot
        -_dotu
        -_dotc
        inner_prod (x, y)or
        -inner_prod (conj (x), y)
        xT y or
        -xH y
        Computes the inner product of two vectors.
        -BLAS implements certain loop unrollment.
        dsdot
        -sdsdot
        a + prec_inner_prod (x, y)a + xT yComputes the inner product in double precision.
        _copyx = y
        -y.assign (x)
        x <- yCopies one vector to another.
        -BLAS implements certain loop unrollment.
        _swapswap (x, y)x <-> ySwaps two vectors.
        -BLAS implements certain loop unrollment.
        _scal
        -csscal
        -zdscal
        x *= ax <- a xScales a vector.
        -BLAS implements certain loop unrollment.
        _axpyy += a * xy <- a x + yAdds a scaled vector.
        -BLAS implements certain loop unrollment.
        _rot
        -_rotm
        -csrot
        -zdrot
        t.assign (a * x + b * y),
        -y.assign (- b * x + a * y),
        -x.assign (t)
        (x, y) <- (a x + b y, -b x + a y)Applies a plane rotation.
        _rotg
        -_rotmg
         (a, b) <-
        -  (? a / sqrt (a
        2 + -b2),
        -    ? b / sqrt (a
        2 + -b2)) or
        -(1, 0) <- (0, 0)
        Constructs a plane rotation.
        -

        Blas Level 2

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        BLAS CallMapped Library ExpressionMathematical DescriptionComment
        _t_mvx = prod (A, x) or
        -x = prod (trans (A), x)
        or
        -x = prod (herm (A), x)
        x <- A x or
        -x <- A
        T x or
        -x <- A
        H x
        Computes the product of a matrix with a vector.
        _t_svy = solve (A, x, tag) or
        -inplace_solve (A, x, tag) or
        -y = solve (trans (A), x, tag) or
        -inplace_solve (trans (A), x, tag) or
        -y = solve (herm (A), x, tag)or
        -inplace_solve (herm (A), x, tag)
        y <- A-1 x -or
        -x <- A
        -1 x or
        -y <- -A
        T-1 -x or
        -x <- -A
        T-1 -x or
        -y <- -A
        H-1 -x or
        -x <- -A
        H-1 -x
        Solves a system of linear equations with triangular form, i.e. -A is triangular.
        _g_mv
        -_s_mv
        -_h_mv
        y = a * prod (A, x) + b * y or
        -y = a * prod (trans (A), x) + b * y
        or
        -y = a * prod (herm (A), x) + b * y
        y <- a A x + b y or
        -y <- a A
        T x + b y
        -y <- a A
        H x + b y
        Adds the scaled product of a matrix with a vector.
        _g_r
        -_g_ru
        -_g_rc
        A += a * outer_prod (x, y) or
        -A += a * outer_prod (x, conj (y))
        A <- a x yT + A -or
        -A <- a x y
        H + A
        Performs a rank 1 update.
        _s_r
        -_h_r
        A += a * outer_prod (x, x) or
        -A += a * outer_prod (x, conj (x))
        A <- a x xT + A -or
        -A <- a x x
        H + A
        Performs a symmetric or hermitian rank 1 update.
        _s_r2
        -_h_r2
        A += a * outer_prod (x, y) +
        - a * outer_prod (y, x))
        or
        -A += a * outer_prod (x, conj (y)) +
        - conj (a) * outer_prod (y, conj (x)))
        A <- a x yT + a y -xT + A or
        -A <- a x y
        H + -a- y xH + -A
        Performs a symmetric or hermitian rank 2 update.
        -

        Blas Level 3

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        BLAS CallMapped Library ExpressionMathematical DescriptionComment
        _t_mmB = a * prod (A, B) or
        -B = a * prod (trans (A), B) or
        -B = a * prod (A, trans (B)) or
        -B = a * prod (trans (A), trans (B)) or
        -B = a * prod (herm (A), B) or
        -B = a * prod (A, herm (B)) or
        -B = a * prod (herm (A), trans (B)) or
        -B = a * prod (trans (A), herm (B)) or
        -B = a * prod (herm (A), herm (B))
        B <- a op (A) op (B) with
        op (X) = X or
        op (X) = XT or
        op (X) = XH
        Computes the scaled product of two matrices.
        _t_smC = solve (A, B, tag) or
        -inplace_solve (A, B, tag) or
        -C = solve (trans (A), B, tag) or
        -inplace_solve (trans (A), B, tag)
        or
        -C = solve (herm (A), B, tag)
        or
        -inplace_solve (herm (A), B, tag)
        C <- A-1 B -or
        -B <- A
        -1 B or
        -C <- -A
        T-1 -B or
        -B <- A
        -1 B or
        -C <- -A
        H-1 -B or
        -B <- -A
        H-1 -B
        Solves a system of linear equations with triangular form, i.e. -A is triangular.
        _g_mm
        -_s_mm
        -_h_mm
        C = a * prod (A, B) + b * C or
        -C = a * prod (trans (A), B) + b * C or
        -C = a * prod (A, trans (B)) + b * C or
        -C = a * prod (trans (A), trans (B)) + b * C or
        -C = a * prod (herm (A), B) + b * C or
        -C = a * prod (A, herm (B)) + b * C or
        -C = a * prod (herm (A), trans (B)) + b * C or
        -C = a * prod (trans (A), herm (B)) + b * C or
        -C = a * prod (herm (A), herm (B)) + b * C
        C <- a op (A) op (B) + b C with
        op (X) = X or
        op (X) = XT or
        op (X) = XH
        Adds the scaled product of two matrices.
        _s_rk
        -_h_rk
        B = a * prod (A, trans (A)) + b * B or
        -B = a * prod (trans (A), A) + b * B or
        -B = a * prod (A, herm (A)) + b * B or
        -B = a * prod (herm (A), A) + b * B
        B <- a A AT + b B -or
        -B <- a A
        T A + b B or
        -B <- a A AH + b B -or
        -B <- a A
        H A + b B
        Performs a symmetric or hermitian rank k update.
        _s_r2k
        -_h_r2k
        C = a * prod (A, trans (B)) +
        - a * prod (B, trans (A)) + b * C
        or
        -C = a * prod (trans (A), B) +
        - a * prod (trans (B), A) + b * C
        or
        -C = a * prod (A, herm (B)) +
        - conj (a) * prod (B, herm (A)) + b * C
        or
        -C = a * prod (herm (A), B) +
        - conj (a) * prod (herm (B), A) + b * C
        C <- a A BT + a B -AT + b C or
        -C <- a A
        T B + a -BT A + b C or
        -C <- a A B
        H + -a- B AH + -b C or
        -C <- a A
        H B + -a- BH A + -b C
        Performs a symmetric or hermitian rank 2 k -update.
        - -

        Storage Layout

        - -

        uBLAS supports many different storage layouts. The full details can be -found at the Overview of Types. Most types like -vector<double> and matrix<double> are -by default compatible to C arrays, but can also be configured to contain -FORTAN compatible data. -

        - -

        Compatibility

        -

        For compatibility reasons we provide array like indexing for vectors and matrices. For some types (hermitian, sparse etc) this can be expensive for matrices due to the needed temporary proxy objects.

        -

        uBLAS uses STL compatible allocators for the allocation of the storage required for it's containers.

        -

        Benchmark Results

        -

        The following tables contain results of one of our benchmarks. -This benchmark compares a native C implementation ('C array') and -some library based implementations. The safe variants based on the -library assume aliasing, the fast variants do not use temporaries -and are functionally equivalent to the native C implementation. -Besides the generic vector and matrix classes the benchmark -utilizes special classes c_vector and -c_matrix, which are intended to avoid every overhead -through genericity.

        -

        The benchmark program bench1 was compiled with GCC 4.0 and run on an Athlon 64 3000+. Times are scales for reasonable precision by running bench1 100.

        -

        First we comment the results for double vectors and matrices of dimension 3 and 3 x 3, respectively.

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        Comment
        inner_prodC array0.61782Some abstraction penalty
        c_vector0.86554
        vector<unbounded_array>1.02467
        vector + vectorC array0.511122Abstraction penalty: factor 2
        c_vector fast1.17489
        vector<unbounded_array> fast1.32433
        c_vector safe2.02283
        vector<unbounded_array> safe6.9582
        outer_prodC array0.59872Some abstraction penalty
        c_matrix, c_vector fast0.88585
        matrix<unbounded_array>, vector<unbounded_array> fast0.90572
        c_matrix, c_vector safe1.66310
        matrix<unbounded_array>, vector<unbounded_array> safe2.95175
        prod (matrix, vector)C array0.64671No significant abstraction penalty
        c_matrix, c_vector fast0.70613
        matrix<unbounded_array>, vector<unbounded_array> fast0.79543
        c_matrix, c_vector safe0.95452
        matrix<unbounded_array>, vector<unbounded_array> safe2.61164
        matrix + matrixC array0.75686No significant abstraction penalty
        c_matrix fast0.99520
        matrix<unbounded_array> fast1.29399
        c_matrix safe1.7303
        matrix<unbounded_array> safe3.14164
        prod (matrix, matrix)C array0.94457No significant abstraction penalty
        c_matrix fast1.17367
        matrix<unbounded_array> fast1.34320
        c_matrix safe1.56275
        matrix<unbounded_array> safe2.06208
        -

        We notice a two fold performance loss for small vectors and matrices: first the general abstraction penalty for using classes, and then a small loss when using the generic vector and matrix classes. The difference w.r.t. alias assumptions is also significant.

        -

        Next we comment the results for double vectors and matrices of -dimension 100 and 100 x 100, respectively.

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        OperationImplementationElapsed [s]MFLOP/sComment
        inner_prodC array0.64889No significant abstraction penalty
        c_vector0.66862
        vector<unbounded_array>0.66862
        vector + vectorC array0.64894No significant abstraction penalty
        c_vector fast0.66867
        vector<unbounded_array> fast0.66867
        c_vector safe1.14501
        vector<unbounded_array> safe1.23465
        outer_prodC array0.501144No significant abstraction penalty
        c_matrix, c_vector fast0.71806
        matrix<unbounded_array>, vector<unbounded_array> fast0.571004
        c_matrix, c_vector safe1.91300
        matrix<unbounded_array>, vector<unbounded_array> safe0.89643
        prod (matrix, vector)C array0.65876No significant abstraction penalty
        c_matrix, c_vector fast0.65876
        matrix<unbounded_array>, vector<unbounded_array> -fast0.66863
        c_matrix, c_vector safe0.66863
        matrix<unbounded_array>, vector<unbounded_array> -safe0.66863
        matrix + matrixC array0.96596No significant abstraction penalty
        c_matrix fast1.21473
        matrix<unbounded_array> fast1.00572
        c_matrix safe2.44235
        matrix<unbounded_array> safe1.30440
        prod (matrix, matrix)C array0.70813No significant abstraction penalty
        c_matrix fast0.73780
        matrix<unbounded_array> fast0.76749
        c_matrix safe0.75759
        matrix<unbounded_array> safe0.76749
        -

        For larger vectors and matrices the general abstraction penalty -for using classes seems to decrease, the small loss when using -generic vector and matrix classes seems to remain. The difference -w.r.t. alias assumptions remains visible, too.

        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/products.html b/libs/numeric/ublas/doc/products.html deleted file mode 100644 index 563a4b8ce..000000000 --- a/libs/numeric/ublas/doc/products.html +++ /dev/null @@ -1,318 +0,0 @@ -?xml version="1.0" encoding="UTF-8"?> - - - - Special Products - - - - - - - - - - -

        Special Products

        -
        - -

        Functions

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        template<class V, class E1, class E2> BOOST_UBLAS_INLINE V & axpy_prod (const matrix_expression< E1 > &e1, const vector_expression< E2 > &e2, V &v, bool init=true)
         computes v += A x or v = A x in an optimized fashion.

        template<class V, class E1, class E2> BOOST_UBLAS_INLINE V & axpy_prod (const vector_expression< E1 > &e1, const matrix_expression< E2 > &e2, V &v, bool init=true)
         computes v += AT x or v = AT x in an optimized fashion.

        template<class M, class E1, class E2> BOOST_UBLAS_INLINE M & axpy_prod (const matrix_expression< E1 > &e1, const matrix_expression< E2 > &e2, M &m, bool init=true)
         computes M += A X or M = A X in an optimized fashion.

        template<class M, class E1, class E2> BOOST_UBLAS_INLINE M & opb_prod (const matrix_expression< E1 > &e1, const matrix_expression< E2 > &e2, M &m, bool init=true)
         computes M += A X or M = A X in an optimized fashion.

        - -
        - - - - - - -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        BOOST_UBLAS_INLINE V& axpy_prod const matrix_expression< E1 > &  e1,
        const vector_expression< E2 > &  e2,
        V &  v,
        bool  init = true
        -
        - - - - - -
        -   - - -

        -computes v += A x or v = A x in an optimized fashion. -

        -
        Parameters:
        - - - - - -
        e1 the matrix expression A
        e2 the vector expression x
        v the result vector v
        init a boolean parameter
        -
        -axpy_prod(A, x, v, init) implements the well known axpy-product. Setting init to true is equivalent to call v.clear() before axpy_prod. Currently init defaults to true, but this may change in the future.

        -Up to now there are some specialisation for compressed matrices that give a large speed up compared to prod.

        - - - - - - - -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        BOOST_UBLAS_INLINE V& axpy_prod const vector_expression< E1 > &  e1,
        const matrix_expression< E2 > &  e2,
        V &  v,
        bool  init = true
        -
        - - - - - -
        -   - - -

        -computes v += AT x or v = AT x in an optimized fashion. -

        -
        Parameters:
        - - - - - -
        e1 the vector expression x
        e2 the matrix expression A
        v the result vector v
        init a boolean parameter
        -
        -axpy_prod(x, A, v, init) implements the well known axpy-product. Setting init to true is equivalent to call v.clear() before axpy_prod. Currently init defaults to true, but this may change in the future.

        -Up to now there are some specialisation for compressed matrices that give a large speed up compared to prod.

        - - - - - - -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        BOOST_UBLAS_INLINE M& axpy_prod const matrix_expression< E1 > &  e1,
        const matrix_expression< E2 > &  e2,
        M &  m,
        bool  init = true
        -
        - - - - - -
        -   - - -

        -computes M += A X or M = A X in an optimized fashion. -

        -
        Parameters:
        - - - - - -
        e1 the matrix expression A
        e2 the matrix expression X
        m the result matrix M
        init a boolean parameter
        -
        -axpy_prod(A, X, M, init) implements the well known axpy-product. Setting init to true is equivalent to call M.clear() before axpy_prod. Currently init defaults to true, but this may change in the future.

        -Up to now there are no specialisations.

        - - - - - - - -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        BOOST_UBLAS_INLINE M& opb_prod const matrix_expression< E1 > &  e1,
        const matrix_expression< E2 > &  e2,
        M &  m,
        bool  init = true
        -
        - - - - - -
        -   - - -

        -computes M += A X or M = A X in an optimized fashion. -

        -
        Parameters:
        - - - - - -
        e1 the matrix expression A
        e2 the matrix expression X
        m the result matrix M
        init a boolean parameter
        -
        -opb_prod(A, X, M, init) implements the well known axpy-product. Setting init to true is equivalent to call M.clear() before opb_prod. Currently init defaults to true, but this may change in the future.

        -This function may give a speedup if A has less columns than rows, because the product is computed as a sum of outer products.

        - - - -
        -

        Copyright (©) 2000-2004 Michael Stevens, Mathias Koch, -Joerg Walter, Gunter Winkler
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/range.html b/libs/numeric/ublas/doc/range.html deleted file mode 100644 index 37213bee9..000000000 --- a/libs/numeric/ublas/doc/range.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - - -Range and slice - - -

        Range and Slice Storage

        -
        -

        Range<SizeType,DistanceType>

        -

        Description

        -

        The class range specifies a range of indicies. The range is a sequence of indices -from a start value to stop value. The indices increase by one and exlude the stop value. -range can therefore be used to specify ranges of elements from vectors and matrices.

        -

        Example

        -
        -#include <boost/numeric/ublas/storage.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    range r (0, 3);
        -    for (unsigned i = 0; i < r.size (); ++ i) {
        -        std::cout << r (i) << std::endl;
        -    }
        -}
        -
        -

        Definition

        -

        Defined in the header storage.hpp.

        -

        Model of

        -

        Reversible Container.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Reversible -Container.

        -

        Public base classes

        -

        None.

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        range (size_type start, size_type stop)Constructs a range of indicies from start to stop (excluded) -.
        size_type start () constReturns the beginning of the range.
        size_type size () constReturns the size of the range.
        const_reference operator [] (size_type i) -constReturns the value start + i of the i --th element.
        range compose (const range &r) constReturns the composite range from start + r.start -() to start + r.start () + r.size ().
        bool operator == (const range &r) constTests two ranges for equality.
        bool operator != (const range &r) constTests two ranges for inequality.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the range.
        const_iterator end () constReturns a const_iterator pointing to the end of -the range.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed range.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed range.
        -

        Preconditions

        -
          -
        • start () <= stop ()
        • -
        - -

        Slice<SizeType,DistanceType>

        -

        Description

        -

        The class slice specifies a 'slice' of indicies. Slices are more general -then ranges, the stride allows the sequence of indicies to increase and decrease by the specified amount between element. -slice can therefore be used to specify slices of element from vectors and matrices.

        -

        Example

        -
        -#include <boost/numeric/ublas/storage.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    slice s (0, 1, 3);
        -    for (unsigned i = 0; i < s.size (); ++ i) {
        -        std::cout << s (i) << std::endl;
        -    }
        -}
        -
        -

        Definition

        -

        Defined in the header storage.hpp.

        -

        Model of

        -

        Reversible Container.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Reversible -Container.

        -

        Public base classes

        -

        None.

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        slice (size_type start, size_type stride, size_type -size)Constructs a slice start,start+stride,start+2*stride... with -size elements.
        size_type start () constReturns the beginning of the slice.
        size_type stride () constReturns the stride of the slice.
        size_type size () constReturns the size of the slice.
        const_reference operator [] (size_type i) -constReturns the value start + i * stride of the -i-th element.
        slice compose (const range &r) constReturns the composite slice from start + stride * r.start -() to start + stride * (r.start () + r.size ()) -with stride stride.
        slice compose (const slice &s) constReturns the composite slice from start + stride * s.start -() to start + stride * s.stride () * (s.start () + -s.size ()) with stride stride * s.stride () -.
        bool operator == (const slice &s) constTests two slices for equality.
        bool operator != (const slice &s) constTests two slices for inequality.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the slice.
        const_iterator end () constReturns a const_iterator pointing to the end of -the slice.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed slice.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed slice.
        -

        Preconditions

        -
          -
        • None all strides are vaild. However when an index is returned or an iterator is dereferenced its -value must be representable as the size_type.
        • -
        -
        -

        - Copyright (©) 2000-2004 Michael Stevens, Mathias Koch, - Joerg Walter, Gunter Winkler
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/release_notes.html b/libs/numeric/ublas/doc/release_notes.html deleted file mode 100644 index 2a10e07e7..000000000 --- a/libs/numeric/ublas/doc/release_notes.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - -Boost Basic Linear Algebra - Release Notes - - -

        logoBoost Basic Linear Algebra - Release Notes

        - - -
        - -

        Release 1.52.0

        - -

        improvements

        - -
          -
        • [4024] improve performance of inplace_solve
        • -
        • [6511] Division by scalar should use enable_if<>
        • -
        • [7297] Make the free functions 'num_columns' and 'num_rows' support the uBLAS traits system and better work with expression types
        • -
        - -

        bug fixes

        - -
          -
        • [7296] fixes and improvements to test utility functions
        • -
        • [7363] fixed coordinate_matrix::sort() for gcc 4.7 and others
        • -
        - -

        Release 1.43.0

        - -

        bug fixes

        - -
          -
        • [3968] fixed coordinate_matrix sort problem on MSVC10 -
        • -
        • [3539] - changed computation of norm_inf for complex types to match - mathematical definition.
          - Note: This might cause a performance drop - because now std::abs(z) is called for each vector element. - The old implementation used std::max(std::abs(real(z)),std::abs(imag(z)). - Further norm_inf and norm_1 will now return - the same values for complex vector. -
        • -
        • [3501] Moved free functions in concepts.hpp into anonymous namespace. -
        • -
        - -

        Release 1.41.1

        - -

        new features

        - -
          -
        • Move semantics of vector/matrix container assignments have been -implemented. They can be enabled by setting -BOOST_UBLAS_MOVE_SEMANTICS. More details are on the preprocessor options page. -
        • -
        • Introduce new free functions. See [3449], -the new tests in libs/numeric/ublas/test and the inline documentation of the files in boost/numeric/ublas/operation/. -
        • -
        - -

        bug fixes

        - -
          -
        • [3293] Fix resizing problem in identity_matrix -
        • -
        • [3499] Add DefaultConstructible to concept checks -
        • -
        - -

        Release 1.40.0 and before

        -
          -
        • Release notes were not available in this form.
        • -
        - -
        -

        Copyright (©) 2000-2009 Joerg Walter, Mathias Koch, Gunter Winkler
        - 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 - ). -

        - - - - diff --git a/libs/numeric/ublas/doc/samples/Jamfile.v2 b/libs/numeric/ublas/doc/samples/Jamfile.v2 deleted file mode 100644 index 55a8e6a62..000000000 --- a/libs/numeric/ublas/doc/samples/Jamfile.v2 +++ /dev/null @@ -1,228 +0,0 @@ -# Copyright Michael Stevens 2004 - -# 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) -# bring in rules for testing - -# Boost uBLAS library documentation samples - -# Project requirements -project samples - : requirements - borland:"-w-8026 -w-8027 -w-8057 -w-8084 -w-8092" - kylix:"-w-8026 -w-8027 -w-8057 -w-8084 -w-8092" - ; - -exe unbounded_array - : unbounded_array.cpp - ; - -exe bounded_array - : bounded_array.cpp - ; - -exe range - : range.cpp - ; - -exe slice - : slice.cpp - ; - -exe map_array - : map_array.cpp - ; - -exe vector - : vector.cpp - ; - -exe unit_vector - : unit_vector.cpp - ; - -exe zero_vector - : zero_vector.cpp - ; - -exe mapped_vector - : mapped_vector.cpp - ; - -exe compressed_vector - : compressed_vector.cpp - ; - -exe coordinate_vector - : coordinate_vector.cpp - ; - -exe vector_range - : vector_range.cpp - ; - -exe vector_range_project - : vector_range_project.cpp - ; - -exe vector_slice - : vector_slice.cpp - ; - -exe vector_slice_project - : vector_slice_project.cpp - ; - -exe vector_unary - : vector_unary.cpp - ; - -exe vector_binary - : vector_binary.cpp - ; - -exe vector_binary_outer - : vector_binary_outer.cpp - ; - -exe vector_binary_scalar - : vector_binary_scalar.cpp - ; - -exe vector_unary_redux - : vector_unary_redux.cpp - ; - -exe vector_binary_redux - : vector_binary_redux.cpp - ; - -exe matrix - : matrix.cpp - ; - -exe identity_matrix - : identity_matrix.cpp - ; - -exe zero_matrix - : zero_matrix.cpp - ; - -exe mapped_matrix - : mapped_matrix.cpp - ; - -exe compressed_matrix - : compressed_matrix.cpp - ; - -exe coordinate_matrix - : coordinate_matrix.cpp - ; - -exe matrix_row - : matrix_row.cpp - ; - -exe matrix_row_project - : matrix_row_project.cpp - ; - -exe matrix_column - : matrix_column.cpp - ; - -exe matrix_column_project - : matrix_column_project.cpp - ; - -exe matrix_vector_range - : matrix_vector_range.cpp - ; - -exe matrix_vector_slice - : matrix_vector_slice.cpp - ; - -exe matrix_range - : matrix_range.cpp - ; - -exe matrix_range_project - : matrix_range_project.cpp - ; - -exe matrix_slice - : matrix_slice.cpp - ; - -exe matrix_slice_project - : matrix_slice_project.cpp - ; - -exe matrix_unary - : matrix_unary.cpp - ; - -exe matrix_binary - : matrix_binary.cpp - : $(BOOST_ROOT) - ; - -exe matrix_binary_scalar - : matrix_binary_scalar.cpp - ; - -exe matrix_vector_binary - : matrix_vector_binary.cpp - ; - -exe matrix_vector_solve - : matrix_vector_solve.cpp - ; - -exe matrix_matrix_binary - : matrix_matrix_binary.cpp - ; - -exe matrix_matrix_solve - : matrix_matrix_solve.cpp - ; - -exe banded_matrix - : banded_matrix.cpp - ; - -exe banded_adaptor - : banded_adaptor.cpp - ; - -exe hermitian_matrix - : hermitian_matrix.cpp - ; - -exe hermitian_adaptor - : hermitian_adaptor.cpp - ; - -exe symmetric_matrix - : symmetric_matrix.cpp - ; - -exe symmetric_adaptor - : symmetric_adaptor.cpp - ; - -exe triangular_matrix - : triangular_matrix.cpp - ; - -exe triangular_adaptor - : triangular_adaptor.cpp - ; - -exe ex_triangular - : ex_triangular.cpp - ; diff --git a/libs/numeric/ublas/doc/samples/assignment_examples.cpp b/libs/numeric/ublas/doc/samples/assignment_examples.cpp deleted file mode 100644 index bfad1f54e..000000000 --- a/libs/numeric/ublas/doc/samples/assignment_examples.cpp +++ /dev/null @@ -1,319 +0,0 @@ -// -// Copyright (c) 2010 Athanasios Iliopoulos -// -// Distributed under the 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 -#include -#include -#include -#include -#include -#include -#include - -using namespace boost::numeric::ublas; - -int main() { - // Simple vector fill - vector a(3); - a <<= 0, 1, 2; - std::cout << a << std::endl; - // [ 0 1 2] - - // Vector from vector - vector b(7); - b <<= a, 10, a; - std::cout << b << std::endl; - // [ 0 1 2 10 0 1 2] - - // Simple matrix fill - matrix A(3,3); - A <<= 0, 1, 2, - 3, 4, 5, - 6, 7, 8; - std::cout << A << std::endl; - // [ 0 1 2 ] - // [ 3 4 5 ] - // [ 6 7 8 ] - - // Matrix from vector - A <<= 0, 1, 2, - 3, 4, 5, - a; - std::cout << A << std::endl; - // [ 0 1 2 ] - // [ 3 4 5 ] - // [ 0 1 2 ] - - // Matrix from vector - column assignment - A <<= move(0,2), traverse_policy::by_column(), - a; - std::cout << A << std::endl; - // [ 0 1 0 ] - // [ 3 4 1 ] - // [ 0 1 2 ] - - // Another matrix from vector example (watch the wraping); - vector c(9); c <<= 1, 2, 3, 4, 5, 6, 7, 8, 9; - A <<= c; - std::cout << A << std::endl; - // [ 1 2 3 ] - // [ 4 5 6 ] - // [ 7 8 9 ] - - // If for performance(Benchmarks are not definite about that) or consistency reasons you need to disable wraping: - static next_row_manip endr; //This can be defined globally - A <<= traverse_policy::by_row_no_wrap(), - 1, 2, 3, endr, - 4, 5, 6, endr, - 7, 8, 9, endr; - // [ 1 2 3 ] - // [ 4 5 6 ] - // [ 7 8 9 ] - // If by default you need to disable wraping define - // BOOST_UBLAS_DEFAULT_NO_WRAP_POLICY, in the compilation options, - // so that you avoid typing the "traverse_policy::by_row_no_wrap()". - - // Plus and minus assign: - A <<= fill_policy::index_plus_assign(), - 3,2,1; - std::cout << A << std::endl; - // [ 4 4 4 ] - // [ 4 5 6 ] - // [ 7 8 9 ] - - // Matrix from proxy - A <<= 0, 1, 2, - project(b, range(3,6)), - a; - std::cout << A << std::endl; - // [ 0 1 2 ] - // [10 0 1 ] - // [ 6 7 8 ] - - // Matrix from matrix - matrix B(6,6); - B <<= A, A, - A, A; - std::cout << B << std::endl; - // [ A A ] - // [ A A ] - - // Matrix range (vector is similar) - B = zero_matrix(6,6); - matrix_range > mrB (B, range (1, 4), range (1, 4)); - mrB <<= 1,2,3,4,5,6,7,8,9; - std::cout << B << std::endl; - // [ 0 0 0 0 0 0] - // [ 0 1 2 3 0 0] - // [ 0 4 5 6 0 0] - // [ 0 0 0 0 0 0] - // [ 0 0 0 0 0 0] - // [ 0 0 0 0 0 0] - - // Horizontal concatenation can be achieved using this trick: - matrix BH(3,9); - BH <<= A, A, A; - std::cout << BH << std::endl; - // [ A A A] - - // Vertical concatenation can be achieved using this trick: - matrix BV(9,3); - BV <<= A, - A, - A; - std::cout << BV << std::endl; - // [ A ] - // [ A ] - // [ A ] - - // Watch the difference when assigning matrices for different traverse policies: - matrix BR(9,9, 0); - BR <<= traverse_policy::by_row(), // This is the default, so this might as well be omitted. - A, A, A; - std::cout << BR << std::endl; - // [ A A A] - // [ 0 0 0] - // [ 0 0 0] - - matrix BC(9,9, 0); - BC <<= traverse_policy::by_column(), - A, A, A; - std::cout << BC << std::endl; - // [ A 0 0] - // [ A 0 0] - // [ A 0 0] - - // The following will throw a run-time exception in debug mode (matrix mid-assignment wrap is not allowed) : - // matrix C(7,7); - // C <<= A, A, A; - - // Matrix from matrix with index manipulators - matrix C(6,6,0); - C <<= A, move(3,0), A; - // [ A 0 ] - // [ 0 A ] - - // A faster way for to construct this dense matrix. - matrix D(6,6); - D <<= A, zero_matrix(3,3), - zero_matrix(3,3), A; - // [ A 0 ] - // [ 0 A ] - - // The next_row and next_column index manipulators: - // note: next_row and next_column functions return - // a next_row_manip and and next_column_manip object. - // This is the manipulator we used earlier when we disabled - // wrapping. - matrix E(2,4,0); - E <<= 1, 2, next_row(), - 3, 4, next_column(),5; - std::cout << E << std::endl; - // [ 1 2 0 5 ] - // [ 3 4 0 0 ] - - // The begin1 (moves to the begining of the column) index manipulator, begin2 does the same for the row: - matrix F(2,4,0); - F <<= 1, 2, next_row(), - 3, 4, begin1(),5; - std::cout << F << std::endl; - // [ 1 2 5 0 ] - // [ 3 4 0 0 ] - - // The move (relative) and move_to(absolute) index manipulators (probably the most useful manipulators): - matrix G(2,4,0); - G <<= 1, 2, move(0,1), 3, - move_to(1,3), 4; - std::cout << G << std::endl; - // [ 1 2 0 3 ] - // [ 0 0 0 4 ] - - // Static equivallents (faster) when sizes are known at compile time: - matrix Gs(2,4,0); - Gs <<= 1, 2, move<0,1>(), 3, - move_to<1,3>(), 4; - std::cout << Gs << std::endl; - // [ 1 2 0 3 ] - // [ 0 0 0 4 ] - - // Choice of traverse policy (default is "row by row" traverse): - - matrix H(2,4,0); - H <<= 1, 2, 3, 4, - 5, 6, 7, 8; - std::cout << H << std::endl; - // [ 1 2 3 4 ] - // [ 5 6 7 8 ] - - H <<= traverse_policy::by_column(), - 1, 2, 3, 4, - 5, 6, 7, 8; - std::cout << H << std::endl; - // [ 1 3 5 7 ] - // [ 2 4 6 8 ] - - // traverse policy can be changed mid assignment if desired. - matrix H1(4,4,0); - H1 <<= 1, 2, 3, traverse_policy::by_column(), 1, 2, 3; - - std::cout << H << std::endl; - // [1 2 3 1] - // [0 0 0 2] - // [0 0 0 3] - // [0 0 0 0] - - // note: fill_policy and traverse_policy are namespaces, so you can use them - // by a using statement. - - // For compressed and coordinate matrix types a push_back or insert fill policy can be chosen for faster assginment: - compressed_matrix I(2, 2); - I <<= fill_policy::sparse_push_back(), - 0, 1, 2, 3; - std::cout << I << std::endl; - // [ 0 1 ] - // [ 2 3 ] - - coordinate_matrix J(2,2); - J<<=fill_policy::sparse_insert(), - 1, 2, 3, 4; - std::cout << J << std::endl; - // [ 1 2 ] - // [ 3 4 ] - - // A sparse matrix from another matrix works as with other types. - coordinate_matrix K(3,3); - K<<=fill_policy::sparse_insert(), - J; - std::cout << K << std::endl; - // [ 1 2 0 ] - // [ 3 4 0 ] - // [ 0 0 0 ] - - // Be careful this will not work: - //compressed_matrix J2(4,4); - //J2<<=fill_policy::sparse_push_back(), - // J,J; - // That's because the second J2's elements - // are attempted to be assigned at positions - // that come before the elements already pushed. - // Unfortunatelly that's the only thing you can do in this case - // (or of course make a custom agorithm): - compressed_matrix J2(4,4); - J2<<=fill_policy::sparse_push_back(), - J, fill_policy::sparse_insert(), - J; - - std::cout << J2 << std::endl; - // [ J J ] - // [ 0 0 0 0 ] - // [ 0 0 0 0 ] - - // A different traverse policy doesn't change the result, only they order it is been assigned. - coordinate_matrix L(3,3); - L<<=fill_policy::sparse_insert(), traverse_policy::by_column(), - J; - std::cout << L << std::endl; - // (same as previous) - // [ 1 2 0 ] - // [ 3 4 0 ] - // [ 0 0 0 ] - - typedef coordinate_matrix::size_type cmst; - const cmst size = 30; - //typedef fill_policy::sparse_push_back spb; - // Although the above could have been used the following is may be faster if - // you use the policy often and for relatively small containers. - static fill_policy::sparse_push_back spb; - - // A block diagonal sparse using a loop: - compressed_matrix M(size, size, 4*15); - for (cmst i=0; i!=size; i+=J.size1()) - M <<= spb, move_to(i,i), J; - - - // If typedef was used above the last expression should start - // with M <<= spb()... - - // Displaying so that blocks can be easily seen: - for (unsigned int i=0; i!=M.size1(); i++) { - std::cout << M(i,0); - for (unsigned int j=1; j!=M.size2(); j++) std::cout << ", " << M(i,j); - std::cout << "\n"; - } - // [ J 0 0 0 ... 0] - // [ 0 J 0 0 ... 0] - // [ 0 . . . ... 0] - // [ 0 0 ... 0 0 J] - - - // A "repeat" trasverser may by provided so that this becomes faster and an on-liner like: - // M <<= spb, repeat(0, size, J.size1(), 0, size, J.size1()), J; - // An alternate would be to create a :repeater" matrix and vector expression that can be used in other places as well. The latter is probably better, - return 0; -} - diff --git a/libs/numeric/ublas/doc/samples/banded_adaptor.cpp b/libs/numeric/ublas/doc/samples/banded_adaptor.cpp deleted file mode 100644 index 8aa5a2172..000000000 --- a/libs/numeric/ublas/doc/samples/banded_adaptor.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - banded_adaptor > ba (m, 1, 1); - for (signed i = 0; i < signed (ba.size1 ()); ++ i) - for (signed j = (std::max) (i - 1, 0); j < (std::min) (i + 2, signed (ba.size2 ())); ++ j) - ba (i, j) = 3 * i + j; - std::cout << ba << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/banded_matrix.cpp b/libs/numeric/ublas/doc/samples/banded_matrix.cpp deleted file mode 100644 index 73746b7a2..000000000 --- a/libs/numeric/ublas/doc/samples/banded_matrix.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - banded_matrix m (3, 3, 1, 1); - for (signed i = 0; i < signed (m.size1 ()); ++ i) - for (signed j = (std::max) (i - 1, 0); j < (std::min) (i + 2, signed (m.size2 ())); ++ j) - m (i, j) = 3 * i + j; - std::cout << m << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/bounded_array.cpp b/libs/numeric/ublas/doc/samples/bounded_array.cpp deleted file mode 100644 index bc827a317..000000000 --- a/libs/numeric/ublas/doc/samples/bounded_array.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include - -int main () { - using namespace boost::numeric::ublas; - bounded_array a (3); - for (unsigned i = 0; i < a.size (); ++ i) { - a [i] = i; - std::cout << a [i] << std::endl; - } -} - diff --git a/libs/numeric/ublas/doc/samples/compressed_matrix.cpp b/libs/numeric/ublas/doc/samples/compressed_matrix.cpp deleted file mode 100644 index 997106ead..000000000 --- a/libs/numeric/ublas/doc/samples/compressed_matrix.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - compressed_matrix m (3, 3, 3 * 3); - for (unsigned i = 0; i < m.size1 (); ++ i) - for (unsigned j = 0; j < m.size2 (); ++ j) - m (i, j) = 3 * i + j; - std::cout << m << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/compressed_vector.cpp b/libs/numeric/ublas/doc/samples/compressed_vector.cpp deleted file mode 100644 index 33353e498..000000000 --- a/libs/numeric/ublas/doc/samples/compressed_vector.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - compressed_vector v (3, 3); - for (unsigned i = 0; i < v.size (); ++ i) - v (i) = i; - std::cout << v << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/coordinate_matrix.cpp b/libs/numeric/ublas/doc/samples/coordinate_matrix.cpp deleted file mode 100644 index ee09515dc..000000000 --- a/libs/numeric/ublas/doc/samples/coordinate_matrix.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - coordinate_matrix m (3, 3, 3 * 3); - for (unsigned i = 0; i < m.size1 (); ++ i) - for (unsigned j = 0; j < m.size2 (); ++ j) - m (i, j) = 3 * i + j; - std::cout << m << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/coordinate_vector.cpp b/libs/numeric/ublas/doc/samples/coordinate_vector.cpp deleted file mode 100644 index 44893fcad..000000000 --- a/libs/numeric/ublas/doc/samples/coordinate_vector.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - coordinate_vector v (3, 3); - for (unsigned i = 0; i < v.size (); ++ i) - v (i) = i; - std::cout << v << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/ex_triangular.cpp b/libs/numeric/ublas/doc/samples/ex_triangular.cpp deleted file mode 100644 index a2a34d965..000000000 --- a/libs/numeric/ublas/doc/samples/ex_triangular.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright Gunter Winkler 2004 - 2009. -// Distributed under the 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 - -#include -#include - -#include - -using std::cout; -using std::endl; - - - -namespace ublas = boost::numeric::ublas; - - -int main(int argc, char * argv[] ) { - - ublas::matrix M (3, 3); - for (std::size_t i=0; i < M.data().size(); ++i) { M.data()[i] = 1+i ; } - - std::cout << "full M = " << M << "\n" ; - - ublas::triangular_matrix L; - ublas::triangular_matrix UL; - ublas::triangular_matrix SL; - - L = ublas::triangular_adaptor, ublas::lower> (M); - SL = ublas::triangular_adaptor, ublas::strict_lower> (M); - UL = ublas::triangular_adaptor, ublas::unit_lower> (M); - - std::cout << "lower L = " << L << "\n" - << "strict lower SL = " << SL << "\n" - << "unit lower UL = " << UL << "\n" ; - - ublas::triangular_matrix U; - ublas::triangular_matrix UU; - ublas::triangular_matrix SU; - - U = ublas::triangular_adaptor, ublas::upper> (M); - SU = ublas::triangular_adaptor, ublas::strict_upper> (M); - UU = ublas::triangular_adaptor, ublas::unit_upper> (M); - - std::cout << "upper U = " << U << "\n" - << "strict upper SU = " << SU << "\n" - << "unit upper UU = " << UU << "\n" ; - - std::cout << "M = L + SU ? " << ((norm_inf( M - (L + SU) ) == 0.0)?"ok":"failed") << "\n"; - std::cout << "M = U + SL ? " << ((norm_inf( M - (U + SL) ) == 0.0)?"ok":"failed") << "\n"; - -} - - diff --git a/libs/numeric/ublas/doc/samples/hermitian_adaptor.cpp b/libs/numeric/ublas/doc/samples/hermitian_adaptor.cpp deleted file mode 100644 index 889ae4e1a..000000000 --- a/libs/numeric/ublas/doc/samples/hermitian_adaptor.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix > m (3, 3); - hermitian_adaptor >, lower> hal (m); - for (unsigned i = 0; i < hal.size1 (); ++ i) { - for (unsigned j = 0; j < i; ++ j) - hal (i, j) = std::complex (3 * i + j, 3 * i + j); - hal (i, i) = std::complex (4 * i, 0); - } - std::cout << hal << std::endl; - hermitian_adaptor >, upper> hau (m); - for (unsigned i = 0; i < hau.size1 (); ++ i) { - hau (i, i) = std::complex (4 * i, 0); - for (unsigned j = i + 1; j < hau.size2 (); ++ j) - hau (i, j) = std::complex (3 * i + j, 3 * i + j); - } - std::cout << hau << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/hermitian_matrix.cpp b/libs/numeric/ublas/doc/samples/hermitian_matrix.cpp deleted file mode 100644 index 1a71ad5cd..000000000 --- a/libs/numeric/ublas/doc/samples/hermitian_matrix.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - hermitian_matrix, lower> ml (3, 3); - for (unsigned i = 0; i < ml.size1 (); ++ i) { - for (unsigned j = 0; j < i; ++ j) - ml (i, j) = std::complex (3 * i + j, 3 * i + j); - ml (i, i) = std::complex (4 * i, 0); - } - std::cout << ml << std::endl; - hermitian_matrix, upper> mu (3, 3); - for (unsigned i = 0; i < mu.size1 (); ++ i) { - mu (i, i) = std::complex (4 * i, 0); - for (unsigned j = i + 1; j < mu.size2 (); ++ j) - mu (i, j) = std::complex (3 * i + j, 3 * i + j); - } - std::cout << mu << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/identity_matrix.cpp b/libs/numeric/ublas/doc/samples/identity_matrix.cpp deleted file mode 100644 index 0e98683ee..000000000 --- a/libs/numeric/ublas/doc/samples/identity_matrix.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - identity_matrix m (3); - std::cout << m << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/map_array.cpp b/libs/numeric/ublas/doc/samples/map_array.cpp deleted file mode 100644 index 12dc519ab..000000000 --- a/libs/numeric/ublas/doc/samples/map_array.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include - -int main () { - using namespace boost::numeric::ublas; - map_array a; - a.reserve (3); - for (unsigned i = 0; i < 3; ++ i) { - a [i] = i; - std::cout << a [i] << std::endl; - } -} - diff --git a/libs/numeric/ublas/doc/samples/mapped_matrix.cpp b/libs/numeric/ublas/doc/samples/mapped_matrix.cpp deleted file mode 100644 index 92b5ca7b0..000000000 --- a/libs/numeric/ublas/doc/samples/mapped_matrix.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - mapped_matrix m (3, 3, 3 * 3); - for (unsigned i = 0; i < m.size1 (); ++ i) - for (unsigned j = 0; j < m.size2 (); ++ j) - m (i, j) = 3 * i + j; - std::cout << m << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/mapped_vector.cpp b/libs/numeric/ublas/doc/samples/mapped_vector.cpp deleted file mode 100644 index 73e6d8f2f..000000000 --- a/libs/numeric/ublas/doc/samples/mapped_vector.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - mapped_vector v (3, 3); - for (unsigned i = 0; i < v.size (); ++ i) - v (i) = i; - std::cout << v << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix.cpp b/libs/numeric/ublas/doc/samples/matrix.cpp deleted file mode 100644 index 63d3c7d53..000000000 --- a/libs/numeric/ublas/doc/samples/matrix.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - for (unsigned i = 0; i < m.size1 (); ++ i) - for (unsigned j = 0; j < m.size2 (); ++ j) - m (i, j) = 3 * i + j; - std::cout << m << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_binary.cpp b/libs/numeric/ublas/doc/samples/matrix_binary.cpp deleted file mode 100644 index 66edf62da..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_binary.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m1 (3, 3), m2 (3, 3); - for (unsigned i = 0; i < (std::min) (m1.size1 (), m2.size1 ()); ++ i) - for (unsigned j = 0; j < (std::min) (m1.size2 (), m2.size2 ()); ++ j) - m1 (i, j) = m2 (i, j) = 3 * i + j; - - std::cout << m1 + m2 << std::endl; - std::cout << m1 - m2 << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_binary_scalar.cpp b/libs/numeric/ublas/doc/samples/matrix_binary_scalar.cpp deleted file mode 100644 index fb3282f78..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_binary_scalar.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - for (unsigned i = 0; i < m.size1 (); ++ i) - for (unsigned j = 0; j < m.size2 (); ++ j) - m (i, j) = 3 * i + j; - - std::cout << 2.0 * m << std::endl; - std::cout << m * 2.0 << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_column.cpp b/libs/numeric/ublas/doc/samples/matrix_column.cpp deleted file mode 100644 index 9eb0ca4e7..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_column.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - for (unsigned j = 0; j < m.size2 (); ++ j) { - matrix_column > mc (m, j); - for (unsigned i = 0; i < mc.size (); ++ i) - mc (i) = 3 * i + j; - std::cout << mc << std::endl; - } -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_column_project.cpp b/libs/numeric/ublas/doc/samples/matrix_column_project.cpp deleted file mode 100644 index d2585c6fd..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_column_project.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - for (unsigned j = 0; j < m.size2 (); ++ j) { - for (unsigned i = 0; i < m.size1 (); ++ i) - column (m, j) (i) = 3 * i + j; - std::cout << column (m, j) << std::endl; - } -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_matrix_binary.cpp b/libs/numeric/ublas/doc/samples/matrix_matrix_binary.cpp deleted file mode 100644 index 17e33a641..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_matrix_binary.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m1 (3, 3), m2 (3, 3); - for (unsigned i = 0; i < (std::min) (m1.size1 (), m2.size1 ()); ++ i) - for (unsigned j = 0; j < (std::min) (m1.size2 (), m2.size2 ()); ++ j) - m1 (i, j) = m2 (i, j) = 3 * i + j; - - std::cout << prod (m1, m2) << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_matrix_solve.cpp b/libs/numeric/ublas/doc/samples/matrix_matrix_solve.cpp deleted file mode 100644 index 07d05a34b..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_matrix_solve.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m1 (3, 3), m2 (3, 3); - for (unsigned i = 0; i < (std::min) (m1.size1 (), m2.size1 ()); ++ i) - for (unsigned j = 0; j <= i; ++ j) - m1 (i, j) = m2 (i, j) = 3 * i + j + 1; - - std::cout << solve (m1, m2, lower_tag ()) << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_range.cpp b/libs/numeric/ublas/doc/samples/matrix_range.cpp deleted file mode 100644 index 048ab9fcd..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_range.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - matrix_range > mr (m, range (0, 3), range (0, 3)); - for (unsigned i = 0; i < mr.size1 (); ++ i) - for (unsigned j = 0; j < mr.size2 (); ++ j) - mr (i, j) = 3 * i + j; - std::cout << mr << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_range_project.cpp b/libs/numeric/ublas/doc/samples/matrix_range_project.cpp deleted file mode 100644 index 3ee095c25..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_range_project.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - for (unsigned i = 0; i < m.size1 (); ++ i) - for (unsigned j = 0; j < m.size2 (); ++ j) - project (m, range (0, 3), range (0, 3)) (i, j) = 3 * i + j; - std::cout << project (m, range (0, 3), range (0, 3)) << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_row.cpp b/libs/numeric/ublas/doc/samples/matrix_row.cpp deleted file mode 100644 index 156c1f5e6..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_row.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - for (unsigned i = 0; i < m.size1 (); ++ i) { - matrix_row > mr (m, i); - for (unsigned j = 0; j < mr.size (); ++ j) - mr (j) = 3 * i + j; - std::cout << mr << std::endl; - } -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_row_project.cpp b/libs/numeric/ublas/doc/samples/matrix_row_project.cpp deleted file mode 100644 index 6cc35698a..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_row_project.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - for (unsigned i = 0; i < m.size1 (); ++ i) { - for (unsigned j = 0; j < m.size2 (); ++ j) - row (m, i) (j) = 3 * i + j; - std::cout << row (m, i) << std::endl; - } -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_slice.cpp b/libs/numeric/ublas/doc/samples/matrix_slice.cpp deleted file mode 100644 index d3911f691..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_slice.cpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - matrix_slice > ms (m, slice (0, 1, 3), slice (0, 1, 3)); - for (unsigned i = 0; i < ms.size1 (); ++ i) - for (unsigned j = 0; j < ms.size2 (); ++ j) - ms (i, j) = 3 * i + j; - std::cout << ms << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_slice_project.cpp b/libs/numeric/ublas/doc/samples/matrix_slice_project.cpp deleted file mode 100644 index 0b6150a97..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_slice_project.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - for (unsigned i = 0; i < m.size1 (); ++ i) - for (unsigned j = 0; j < m.size2 (); ++ j) - project (m, slice (0, 1, 3), slice (0, 1, 3)) (i, j) = 3 * i + j; - std::cout << project (m, slice (0, 1, 3), slice (0, 1, 3)) << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_unary.cpp b/libs/numeric/ublas/doc/samples/matrix_unary.cpp deleted file mode 100644 index 044b29452..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_unary.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix > m (3, 3); - for (unsigned i = 0; i < m.size1 (); ++ i) - for (unsigned j = 0; j < m.size2 (); ++ j) - m (i, j) = std::complex (3 * i + j, 3 * i + j); - - std::cout << - m << std::endl; - std::cout << conj (m) << std::endl; - std::cout << real (m) << std::endl; - std::cout << imag (m) << std::endl; - std::cout << trans (m) << std::endl; - std::cout << herm (m) << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_vector_binary.cpp b/libs/numeric/ublas/doc/samples/matrix_vector_binary.cpp deleted file mode 100644 index a53665bfd..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_vector_binary.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - vector v (3); - for (unsigned i = 0; i < (std::min) (m.size1 (), v.size ()); ++ i) { - for (unsigned j = 0; j < m.size2 (); ++ j) - m (i, j) = 3 * i + j; - v (i) = i; - } - - std::cout << prod (m, v) << std::endl; - std::cout << prod (v, m) << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_vector_range.cpp b/libs/numeric/ublas/doc/samples/matrix_vector_range.cpp deleted file mode 100644 index 3a4c7e70f..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_vector_range.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - for (unsigned i = 0; i < m.size1 (); ++ i) - for (unsigned j = 0; j < m.size2 (); ++ j) - m (i, j) = 3 * i + j; - - matrix_vector_range > mvr (m, range (0, 3), range (0, 3)); - std::cout << mvr << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_vector_slice.cpp b/libs/numeric/ublas/doc/samples/matrix_vector_slice.cpp deleted file mode 100644 index 335c06cb3..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_vector_slice.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - for (unsigned i = 0; i < m.size1 (); ++ i) - for (unsigned j = 0; j < m.size2 (); ++ j) - m (i, j) = 3 * i + j; - - matrix_vector_slice > mvs (m, slice (0, 1, 3), slice (0, 1, 3)); - std::cout << mvs << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/matrix_vector_solve.cpp b/libs/numeric/ublas/doc/samples/matrix_vector_solve.cpp deleted file mode 100644 index 819856fe4..000000000 --- a/libs/numeric/ublas/doc/samples/matrix_vector_solve.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - vector v (3); - for (unsigned i = 0; i < (std::min) (m.size1 (), v.size ()); ++ i) { - for (unsigned j = 0; j <= i; ++ j) - m (i, j) = 3 * i + j + 1; - v (i) = i; - } - - std::cout << solve (m, v, lower_tag ()) << std::endl; - std::cout << solve (v, m, lower_tag ()) << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/range.cpp b/libs/numeric/ublas/doc/samples/range.cpp deleted file mode 100644 index 35526ff8f..000000000 --- a/libs/numeric/ublas/doc/samples/range.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include - -int main () { - using namespace boost::numeric::ublas; - range r (0, 3); - for (unsigned i = 0; i < r.size (); ++ i) { - std::cout << r (i) << std::endl; - } -} - diff --git a/libs/numeric/ublas/doc/samples/slice.cpp b/libs/numeric/ublas/doc/samples/slice.cpp deleted file mode 100644 index 394251e30..000000000 --- a/libs/numeric/ublas/doc/samples/slice.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include - -int main () { - using namespace boost::numeric::ublas; - slice s (0, 1, 3); - for (unsigned i = 0; i < s.size (); ++ i) { - std::cout << s (i) << std::endl; - } -} - diff --git a/libs/numeric/ublas/doc/samples/symmetric_adaptor.cpp b/libs/numeric/ublas/doc/samples/symmetric_adaptor.cpp deleted file mode 100644 index 4a3f67c49..000000000 --- a/libs/numeric/ublas/doc/samples/symmetric_adaptor.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - symmetric_adaptor, lower> sal (m); - for (unsigned i = 0; i < sal.size1 (); ++ i) - for (unsigned j = 0; j <= i; ++ j) - sal (i, j) = 3 * i + j; - std::cout << sal << std::endl; - symmetric_adaptor, upper> sau (m); - for (unsigned i = 0; i < sau.size1 (); ++ i) - for (unsigned j = i; j < sau.size2 (); ++ j) - sau (i, j) = 3 * i + j; - std::cout << sau << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/symmetric_matrix.cpp b/libs/numeric/ublas/doc/samples/symmetric_matrix.cpp deleted file mode 100644 index c9bed51f0..000000000 --- a/libs/numeric/ublas/doc/samples/symmetric_matrix.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - symmetric_matrix ml (3, 3); - for (unsigned i = 0; i < ml.size1 (); ++ i) - for (unsigned j = 0; j <= i; ++ j) - ml (i, j) = 3 * i + j; - std::cout << ml << std::endl; - symmetric_matrix mu (3, 3); - for (unsigned i = 0; i < mu.size1 (); ++ i) - for (unsigned j = i; j < mu.size2 (); ++ j) - mu (i, j) = 3 * i + j; - std::cout << mu << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/triangular_adaptor.cpp b/libs/numeric/ublas/doc/samples/triangular_adaptor.cpp deleted file mode 100644 index 7f7647ee7..000000000 --- a/libs/numeric/ublas/doc/samples/triangular_adaptor.cpp +++ /dev/null @@ -1,30 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - matrix m (3, 3); - triangular_adaptor, lower> tal (m); - for (unsigned i = 0; i < tal.size1 (); ++ i) - for (unsigned j = 0; j <= i; ++ j) - tal (i, j) = 3 * i + j; - std::cout << tal << std::endl; - triangular_adaptor, upper> tau (m); - for (unsigned i = 0; i < tau.size1 (); ++ i) - for (unsigned j = i; j < tau.size2 (); ++ j) - tau (i, j) = 3 * i + j; - std::cout << tau << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/triangular_matrix.cpp b/libs/numeric/ublas/doc/samples/triangular_matrix.cpp deleted file mode 100644 index 91772335a..000000000 --- a/libs/numeric/ublas/doc/samples/triangular_matrix.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - triangular_matrix ml (3, 3); - for (unsigned i = 0; i < ml.size1 (); ++ i) - for (unsigned j = 0; j <= i; ++ j) - ml (i, j) = 3 * i + j; - std::cout << ml << std::endl; - triangular_matrix mu (3, 3); - for (unsigned i = 0; i < mu.size1 (); ++ i) - for (unsigned j = i; j < mu.size2 (); ++ j) - mu (i, j) = 3 * i + j; - std::cout << mu << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/unbounded_array.cpp b/libs/numeric/ublas/doc/samples/unbounded_array.cpp deleted file mode 100644 index 2331f5763..000000000 --- a/libs/numeric/ublas/doc/samples/unbounded_array.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include - -int main () { - using namespace boost::numeric::ublas; - unbounded_array a (3); - for (unsigned i = 0; i < a.size (); ++ i) { - a [i] = i; - std::cout << a [i] << std::endl; - } -} - diff --git a/libs/numeric/ublas/doc/samples/unit_vector.cpp b/libs/numeric/ublas/doc/samples/unit_vector.cpp deleted file mode 100644 index 63fc825df..000000000 --- a/libs/numeric/ublas/doc/samples/unit_vector.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - for (int i = 0; i < 3; ++ i) { - unit_vector v (3, i); - std::cout << v << std::endl; - } -} - diff --git a/libs/numeric/ublas/doc/samples/vector.cpp b/libs/numeric/ublas/doc/samples/vector.cpp deleted file mode 100644 index 1f8310c7e..000000000 --- a/libs/numeric/ublas/doc/samples/vector.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - vector v (3); - for (unsigned i = 0; i < v.size (); ++ i) - v (i) = i; - std::cout << v << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/vector_binary.cpp b/libs/numeric/ublas/doc/samples/vector_binary.cpp deleted file mode 100644 index 8b42d0659..000000000 --- a/libs/numeric/ublas/doc/samples/vector_binary.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - vector v1 (3), v2 (3); - for (unsigned i = 0; i < (std::min) (v1.size (), v2.size ()); ++ i) - v1 (i) = v2 (i) = i; - - std::cout << v1 + v2 << std::endl; - std::cout << v1 - v2 << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/vector_binary_outer.cpp b/libs/numeric/ublas/doc/samples/vector_binary_outer.cpp deleted file mode 100644 index 094a0a9d2..000000000 --- a/libs/numeric/ublas/doc/samples/vector_binary_outer.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - vector v1 (3), v2 (3); - for (unsigned i = 0; i < (std::min) (v1.size (), v2.size ()); ++ i) - v1 (i) = v2 (i) = i; - - std::cout << outer_prod (v1, v2) << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/vector_binary_redux.cpp b/libs/numeric/ublas/doc/samples/vector_binary_redux.cpp deleted file mode 100644 index abc36412e..000000000 --- a/libs/numeric/ublas/doc/samples/vector_binary_redux.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include - -int main () { - using namespace boost::numeric::ublas; - vector v1 (3), v2 (3); - for (unsigned i = 0; i < (std::min) (v1.size (), v2.size ()); ++ i) - v1 (i) = v2 (i) = i; - - std::cout << inner_prod (v1, v2) << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/vector_binary_scalar.cpp b/libs/numeric/ublas/doc/samples/vector_binary_scalar.cpp deleted file mode 100644 index 8f853e54d..000000000 --- a/libs/numeric/ublas/doc/samples/vector_binary_scalar.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - vector v (3); - for (unsigned i = 0; i < v.size (); ++ i) - v (i) = i; - - std::cout << 2.0 * v << std::endl; - std::cout << v * 2.0 << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/vector_range.cpp b/libs/numeric/ublas/doc/samples/vector_range.cpp deleted file mode 100644 index bf48c231b..000000000 --- a/libs/numeric/ublas/doc/samples/vector_range.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - vector v (3); - vector_range > vr (v, range (0, 3)); - for (unsigned i = 0; i < vr.size (); ++ i) - vr (i) = i; - std::cout << vr << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/vector_range_project.cpp b/libs/numeric/ublas/doc/samples/vector_range_project.cpp deleted file mode 100644 index ebe348160..000000000 --- a/libs/numeric/ublas/doc/samples/vector_range_project.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - vector v (3); - for (int i = 0; i < 3; ++ i) - project (v, range (0, 3)) (i) = i; - std::cout << project (v, range (0, 3)) << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/vector_slice.cpp b/libs/numeric/ublas/doc/samples/vector_slice.cpp deleted file mode 100644 index 478631b7a..000000000 --- a/libs/numeric/ublas/doc/samples/vector_slice.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - vector v (3); - vector_slice > vs (v, slice (0, 1, 3)); - for (unsigned i = 0; i < vs.size (); ++ i) - vs (i) = i; - std::cout << vs << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/vector_slice_project.cpp b/libs/numeric/ublas/doc/samples/vector_slice_project.cpp deleted file mode 100644 index a8f179457..000000000 --- a/libs/numeric/ublas/doc/samples/vector_slice_project.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include - -int main () { - using namespace boost::numeric::ublas; - vector v (3); - for (int i = 0; i < 3; ++ i) - project (v, slice (0, 1, 3)) (i) = i; - std::cout << project (v, slice (0, 1, 3)) << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/vector_unary.cpp b/libs/numeric/ublas/doc/samples/vector_unary.cpp deleted file mode 100644 index 4d9a8b587..000000000 --- a/libs/numeric/ublas/doc/samples/vector_unary.cpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - vector > v (3); - for (unsigned i = 0; i < v.size (); ++ i) - v (i) = std::complex (i, i); - - std::cout << - v << std::endl; - std::cout << conj (v) << std::endl; - std::cout << real (v) << std::endl; - std::cout << imag (v) << std::endl; - std::cout << trans (v) << std::endl; - std::cout << herm (v) << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/vector_unary_redux.cpp b/libs/numeric/ublas/doc/samples/vector_unary_redux.cpp deleted file mode 100644 index 7de1918b7..000000000 --- a/libs/numeric/ublas/doc/samples/vector_unary_redux.cpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include - -int main () { - using namespace boost::numeric::ublas; - vector v (3); - for (unsigned i = 0; i < v.size (); ++ i) - v (i) = i; - - std::cout << sum (v) << std::endl; - std::cout << norm_1 (v) << std::endl; - std::cout << norm_2 (v) << std::endl; - std::cout << norm_inf (v) << std::endl; - std::cout << index_norm_inf (v) << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/zero_matrix.cpp b/libs/numeric/ublas/doc/samples/zero_matrix.cpp deleted file mode 100644 index fbdd8d677..000000000 --- a/libs/numeric/ublas/doc/samples/zero_matrix.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - zero_matrix m (3, 3); - std::cout << m << std::endl; -} - diff --git a/libs/numeric/ublas/doc/samples/zero_vector.cpp b/libs/numeric/ublas/doc/samples/zero_vector.cpp deleted file mode 100644 index 7a4d77df9..000000000 --- a/libs/numeric/ublas/doc/samples/zero_vector.cpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include - -int main () { - using namespace boost::numeric::ublas; - zero_vector v (3); - std::cout << v << std::endl; -} - diff --git a/libs/numeric/ublas/doc/storage_concept.html b/libs/numeric/ublas/doc/storage_concept.html deleted file mode 100644 index 2f30529e8..000000000 --- a/libs/numeric/ublas/doc/storage_concept.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - - -Storage concept - - -

        Storage concept

        -
        -

        Storage concept

        -

        Description

        -

        Storage is a variable-size container whose elements are arranged in a strict linear order. -

        Storage extends the STL Container concept with some STL Sequence-like functionality. The main difference with -the Sequence concept however is that the Storage concept does not require default-initialisation of its -elements. -

        Refinement of

        -Random Access Container -and -Default Constructible -

        Associated types

        -No additional types beyond those defined by -Random Access Container -

        Notation

        - - - - - -
        XA type that is model of Storage
        TThe value_type of X
        tAn object of type T
        nobject of type convertible to X::size_type
        -

        Definitions

        -

        Valid expressions

        -In addition to the expressions defined in -Random Access Container, -and -Default Constructible -the following expressions must be valid: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        NameExpressionType requirementsReturn type
        Size constructorX(n)T is DefaultConstructibleX
        Fill constructorX(n,t)X
        Range constructorX(i, j)i and j are Input Iterators whose value type is convertible to T X
        Resizea.resize(n, t)a is mutablevoid
        Resizea.resize(n)a is mutablevoid
        -

        Expression semantics

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        NameExpressionPreconditionSemanticsPostcondition -
        Default-constructorX() -Creates 0 elements. -size()==0
        Size-constructorX(n) -n>=0Creates n elements. Elements are constructed without an initializer. That is -if T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is default -initialized. Otherwise, the object created has indeterminate value. See the sentance -"If new initializer is omitted" in section 5.3.4 paragraph 15 of the ISO C++ standard. -size()==n
        Fill-constructorX(n,t) -n>=0Creates n initialised element with copies of tsize()==n
        Range constructorX(i, j)[i,j) is a valid range.copies the range [i,j) to the storagesize() is equal to the distance from i to j. Each element is a copy of the corresponding element in the range [i,j).
        Resizea.resize(n, t)n <= a.max_size()Modified the container so that it has exactly n elements.
        -The container may be reallocated if its size changes. -Existing element values are preserved, additional elements are copies of t.
        a.size() == n
        Resizea.resize(n)n <= a.max_size()Modified the container so that it has exactly n elements.
        -The container may be reallocated if its size changes. Element values are uninitialised. That is, -each element value may be a previously assigned value or default construced value for T.
        a.size() == n
        -

        Complexity guarantees

        -

        Invariants

        -

        Models

        - -

        Notes

        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - - diff --git a/libs/numeric/ublas/doc/storage_sparse.html b/libs/numeric/ublas/doc/storage_sparse.html deleted file mode 100644 index b4899d9b2..000000000 --- a/libs/numeric/ublas/doc/storage_sparse.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - - - - -Sparse Storage - - -

        Sparse Storage

        -
        -

        Default Standard Map

        -

        Description

        -

        The templated class map_std<I, T, ALLOC> provides a -wrapper for the standard library associative container -std::map. The wrapper has one simple purpose. It -allows the definition of a default template parameter (for the -adapted array) when declaring the sparse container types.

        -

        Example

        -
        -#include <boost/numeric/ublas/storage_sparse.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    map_std<int, double> a (3);
        -    for (unsigned i = 0; i < a.size (); ++ i) {
        -        a [i] = i;
        -        std::cout << a [i] << std::endl;
        -    }
        -}
        -
        -

        Definition

        -

        Defined in the header storage_sparse.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        IThe type of index stored in the array.
        TThe type of object stored in the array.
        ALLOCAn STL Allocatorstd::allocator
        -

        Model of

        -

        Reversible Container.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Reversible -Container.

        -

        Public base classes

        -

        std::map

        -

        Map Array

        -

        Description

        -

        The templated class map_array<I, T, ALLOC> implements a std::map like associative container as a sorted array. It therefore some of the Associative Container interface without having the same semantics as an std::map. -

        At any time the map_array has a capacity up to which new element can be inserted. -If insert would cause the size of the map_array to exceeds its capactity then it is reallocated. Iterators and reference are invalidated. -The capacity can be directly control using the reserve member function. -

        -

        Example

        -
        -#include <boost/numeric/ublas/storage_sparse.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    map_array<int, double> a (3);
        -    for (unsigned i = 0; i < a.size (); ++ i) {
        -        a [i] = i;
        -        std::cout << a [i] << std::endl;
        -    }
        -}
        -
        -

        Definition

        -

        Defined in the header storage_sparse.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        IThe type of index stored in the array.
        TThe type of object stored in the array.
        ALLOCAn STL Allocatorstd::allocator
        -

        Model of

        -

        Reversible Container.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Reversible -Container.

        -

        Public base classes

        -

        None.

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        map_array (ALLOC &a = ALLOC())Allocates a map_array that holds at most zero -elements.
        map_array (const map_array &c)The copy constructor.
        ~map_array ()Deallocates the map_array itself.
        void reserve (size_type capacity) -Changes themap_array capacity. It can hold at mostcapacity elements without reallocation. The capacity can be reduced such that capacity >= size(). The content of themap_array is preserved.
        size_type size () constReturns the size of the map_array.
        size_type size () constReturns the capacity of the map_array.
        data_reference operator [] (index_type i)Returns a reference of the element that is associated with a -particular index. If the map_array does not already -contain such an element, operator[] inserts the -default T ().
        map_array &operator = (const map_array -&a)The assignment operator.
        map_array &assign_temporary (map_array -&a)Assigns a temporary. May change the array a.
        void swap (map_array &a)Swaps the contents of the arrays.
        std::pair insert (const value_type -&p)Inserts p into the array. The second part of the return value is true -if p was inserted and false if was not inserted because it was aleady -present.
        iterator insert (iterator it, const value_type -&p)Inserts p into the array, using it as -a hint to where it will be inserted.
        void erase (iterator it)Erases the value at it.
        void clear ()Clears the array.
        const_iterator find (index_type i) constFinds an element whose index is i.
        iterator find (index_type i)Finds an element whose index is i.
        const_iterator lower_bound (index_type i) -constFinds the first element whose index is not less than -i .
        iterator lower_bound (index_type i)Finds the first element whose index is not less than -i .
        const_iterator upper_bound (index_type i) -constFinds the first element whose index is greater than -i .
        iterator upper_bound (index_type i)Finds the first element whose index is greater than -i .
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the map_array.
        const_iterator end () constReturns a const_iterator pointing to the end of -the map_array.
        iterator begin ()Returns a iterator pointing to the beginning of -the map_array.
        iterator end ()Returns a iterator pointing to the end of the -map_array.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed map_array.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed map_array.
        reverse_iterator rbegin ()Returns a reverse_iterator pointing to the -beginning of the reversed map_array.
        reverse_iterator rend ()Returns a reverse_iterator pointing to the end of -the reversed map_array.
        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/symmetric.html b/libs/numeric/ublas/doc/symmetric.html deleted file mode 100644 index c3693bde4..000000000 --- a/libs/numeric/ublas/doc/symmetric.html +++ /dev/null @@ -1,588 +0,0 @@ - - - - - - - - - -Symmetric Matrix - - -

        Symmetric Matrix

        -
        -

        Symmetric Matrix

        -

        Description

        -

        The templated class symmetric_matrix<T, F1, F2, -A> is the base container adaptor for symmetric matrices. -For a (n x n )-dimensional symmetric matrix and 0 -<= i < n, 0 <= j < n holds -si, j = sj, -i. The storage of symmetric matrices is packed.

        -

        Example

        -
        -#include <boost/numeric/ublas/symmetric.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    symmetric_matrix<double, lower> ml (3, 3);
        -    for (unsigned i = 0; i < ml.size1 (); ++ i)
        -        for (unsigned j = 0; j <= i; ++ j)
        -            ml (i, j) = 3 * i + j;
        -    std::cout << ml << std::endl;
        -    symmetric_matrix<double, upper> mu (3, 3);
        -    for (unsigned i = 0; i < mu.size1 (); ++ i)
        -        for (unsigned j = i; j < mu.size2 (); ++ j)
        -            mu (i, j) = 3 * i + j;
        -    std::cout << mu << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header symmetric.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the matrix.
        F1Functor describing the type of the symmetric matrix. [1]lower
        F2Functor describing the storage organization. [2]row_major
        AThe type of the adapted array. [3]unbounded_array<T>
        -

        Model of

        -

        Matrix .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix .

        -

        Public base classes

        -

        matrix_container<symmetric_matrix<T, F1, F2, A> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        symmetric_matrix (size_type size)Allocates an uninitialized symmetric_matrix that -holds size rows of size elements.
        symmetric_matrix (const symmetric_matrix -&m)The copy constructor.
        template<class AE>
        -symmetric_matrix (const matrix_expression<AE> -&ae)
        The extended copy constructor.
        void resize (size_type size, bool preserve = -true)Reallocates a symmetric_matrix to hold -size rows of size elements. The existing -elements of the symmetric_matrix are preseved when -specified.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns a const reference of the j --th element in the i-th row.
        reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
        symmetric_matrix &operator = (const symmetric_matrix -&m)The assignment operator.
        symmetric_matrix &assign_temporary (symmetric_matrix -&m)Assigns a temporary. May change the symmetric matrix -m .
        template<class AE>
        -symmetric_matrix &operator = (const matrix_expression<AE> -&ae)
        The extended assignment operator.
        template<class AE>
        -symmetric_matrix &assign (const matrix_expression<AE> -&ae)
        Assigns a matrix expression to the symmetric matrix. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -symmetric_matrix &operator += (const -matrix_expression<AE> &ae)
        A computed assignment operator. Adds the matrix expression to -the symmetric matrix.
        template<class AE>
        -symmetric_matrix &plus_assign (const -matrix_expression<AE> &ae)
        Adds a matrix expression to the symmetric matrix. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -symmetric_matrix &operator -= (const -matrix_expression<AE> &ae)
        A computed assignment operator. Subtracts the matrix expression -from the symmetric matrix.
        template<class AE>
        -symmetric_matrix &minus_assign (const -matrix_expression<AE> &ae)
        Subtracts a matrix expression from the symmetric matrix. Left -and right hand side of the assignment should be independent.
        template<class AT>
        -symmetric_matrix &operator *= (const AT &at)
        A computed assignment operator. Multiplies the symmetric matrix -with a scalar.
        template<class AT>
        -symmetric_matrix &operator /= (const AT &at)
        A computed assignment operator. Divides the symmetric matrix -through a scalar.
        void swap (symmetric_matrix &m)Swaps the contents of the symmetric matrices.
        void insert (size_type i, size_type j, const_reference -t)Inserts the value t at the j-th -element of the i-th row.
        void erase (size_type i, size_type j)Erases the value at the j-th elemenst of the -i-th row.
        void clear ()Clears the matrix.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the symmetric_matrix.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the symmetric_matrix.
        iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the symmetric_matrix.
        iterator1 end1 ()Returns a iterator1 pointing to the end of the -symmetric_matrix.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the symmetric_matrix.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the symmetric_matrix.
        iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the symmetric_matrix.
        iterator2 end2 ()Returns a iterator2 pointing to the end of the -symmetric_matrix.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed symmetric_matrix.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed symmetric_matrix.
        reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed symmetric_matrix.
        reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed symmetric_matrix.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed symmetric_matrix.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed symmetric_matrix.
        reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed symmetric_matrix.
        reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed symmetric_matrix.
        -

        Notes

        -

        [1] -Supported parameters for the type of the symmetric matrix are -lower and upper.

        -

        [2] -Supported parameters for the storage organization are -row_major and column_major.

        -

        [3] -Supported parameters for the adapted array are -unbounded_array<T> , -bounded_array<T> and -std::vector<T> .

        -

        Symmetric Adaptor

        -

        Description

        -

        The templated class symmetric_adaptor<M, F> -is a symmetric matrix adaptor for other matrices.

        -

        Example

        -
        -#include <boost/numeric/ublas/symmetric.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    symmetric_adaptor<matrix<double>, lower> sal (m);
        -    for (unsigned i = 0; i < sal.size1 (); ++ i)
        -        for (unsigned j = 0; j <= i; ++ j)
        -            sal (i, j) = 3 * i + j;
        -    std::cout << sal << std::endl;
        -    symmetric_adaptor<matrix<double>, upper> sau (m);
        -    for (unsigned i = 0; i < sau.size1 (); ++ i)
        -        for (unsigned j = i; j < sau.size2 (); ++ j)
        -            sau (i, j) = 3 * i + j;
        -    std::cout << sau << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header symmetric.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        MThe type of the adapted matrix.
        FFunctor describing the type of the symmetric adaptor. [1]lower
        -

        Model of

        -

        Matrix Expression -.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix Expression .

        -

        Public base classes

        -

        matrix_expression<symmetric_adaptor<M, F> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        symmetric_adaptor ()Constructs a symmetric_adaptor that holds zero -rows of zero elements.
        symmetric_adaptor (matrix_type &data)Constructs a symmetric_adaptor of a matrix.
        symmetric_adaptor (const symmetric_adaptor -&m)The copy constructor.
        template<class AE>
        -symmetric_adaptor (const matrix_expression<AE> -&ae)
        The extended copy constructor.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns a const reference of the j --th element in the i-th row.
        reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
        symmetric_adaptor &operator = (const -symmetric_adaptor &m)The assignment operator.
        symmetric_adaptor &assign_temporary -(symmetric_adaptor &m)Assigns a temporary. May change the symmetric adaptor -m.
        template<class AE>
        -symmetric_adaptor &operator = (const -matrix_expression<AE> &ae)
        The extended assignment operator.
        template<class AE>
        -symmetric_adaptor &assign (const matrix_expression<AE> -&ae)
        Assigns a matrix expression to the symmetric adaptor. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -symmetric_adaptor &operator += (const -matrix_expression<AE> &ae)
        A computed assignment operator. Adds the matrix expression to -the symmetric adaptor.
        template<class AE>
        -symmetric_adaptor &plus_assign (const -matrix_expression<AE> &ae)
        Adds a matrix expression to the symmetric adaptor. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -symmetric_adaptor &operator -= (const -matrix_expression<AE> &ae)
        A computed assignment operator. Subtracts the matrix expression -from the symmetric adaptor.
        template<class AE>
        -symmetric_adaptor &minus_assign (const -matrix_expression<AE> &ae)
        Subtracts a matrix expression from the symmetric adaptor. Left -and right hand side of the assignment should be independent.
        template<class AT>
        -symmetric_adaptor &operator *= (const AT &at)
        A computed assignment operator. Multiplies the symmetric -adaptor with a scalar.
        template<class AT>
        -symmetric_adaptor &operator /= (const AT &at)
        A computed assignment operator. Divides the symmetric adaptor -through a scalar.
        void swap (symmetric_adaptor &m)Swaps the contents of the symmetric adaptors.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the symmetric_adaptor.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the symmetric_adaptor.
        iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the symmetric_adaptor.
        iterator1 end1 ()Returns a iterator1 pointing to the end of the -symmetric_adaptor.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the symmetric_adaptor.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the symmetric_adaptor.
        iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the symmetric_adaptor.
        iterator2 end2 ()Returns a iterator2 pointing to the end of the -symmetric_adaptor.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed symmetric_adaptor.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed symmetric_adaptor.
        reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed symmetric_adaptor.
        reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed symmetric_adaptor.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed symmetric_adaptor.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed symmetric_adaptor.
        reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed symmetric_adaptor.
        reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed symmetric_adaptor.
        -

        Notes

        -

        [1] -Supported parameters for the type of the symmetric adaptor are -lower and upper.

        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/triangular.html b/libs/numeric/ublas/doc/triangular.html deleted file mode 100644 index 865e1912b..000000000 --- a/libs/numeric/ublas/doc/triangular.html +++ /dev/null @@ -1,602 +0,0 @@ - - - - - - - - - -Triangular Matrix - - -

        Triangular Matrix

        -
        -

        Triangular Matrix

        -

        Description

        -

        The templated class triangular_matrix<T, F1, F2, -A> is the base container adaptor for triangular matrices. -For a (n x n )-dimensional lower triangular matrix and -0 <= i < n,0 <= j < n holds -ti, j = 0 , if i > -j. If furthermore holds ti, i= 1 -the matrix is called unit lower triangular. For a (n x n -)-dimensional lower triangular matrix and 0 <= i < -n,0 <= j < n holds ti, -j = 0 , if i < j. If furthermore -holds ti, i= 1 the matrix is called -unit lower triangular. The storage of triangular matrices is -packed.

        -

        Example

        -
        -#include <boost/numeric/ublas/triangular.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    triangular_matrix<double, lower> ml (3, 3);
        -    for (unsigned i = 0; i < ml.size1 (); ++ i)
        -        for (unsigned j = 0; j <= i; ++ j)
        -            ml (i, j) = 3 * i + j;
        -    std::cout << ml << std::endl;
        -    triangular_matrix<double, upper> mu (3, 3);
        -    for (unsigned i = 0; i < mu.size1 (); ++ i)
        -        for (unsigned j = i; j < mu.size2 (); ++ j)
        -            mu (i, j) = 3 * i + j;
        -    std::cout << mu << std::endl;
        -}
        -
        -

        Please read the full triangular example for more details.

        - -

        Definition

        -

        Defined in the header triangular.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the matrix.
        F1Functor describing the type of the triangular matrix. [1]lower
        F2Functor describing the storage organization. [2]row_major
        AThe type of the adapted array. [3]unbounded_array<T>
        -

        Model of

        -

        Matrix .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix .

        -

        Public base classes

        -

        matrix_container<triangular_matrix<T, F1, F2, A> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        triangular_matrix ()Allocates an uninitialized triangular_matrix that -holds zero rows of zero elements.
        triangular_matrix (size_type size1, size_type -size2)Allocates an uninitialized triangular_matrix that -holds size1 rows of size2 elements.
        triangular_matrix (const triangular_matrix -&m)The copy constructor.
        template<class AE>
        -triangular_matrix (const matrix_expression<AE> -&ae)
        The extended copy constructor.
        void resize (size_type size1, size_type size2, bool -preserve = true)Reallocates a triangular_matrix to hold -size1 rows of size2 elements. The -existing elements of the triangular_matrix are -preseved when specified.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns a const reference of the j --th element in the i-th row.
        reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
        triangular_matrix &operator = (const -triangular_matrix &m)The assignment operator.
        triangular_matrix &assign_temporary -(triangular_matrix &m)Assigns a temporary. May change the triangular matrix -m.
        template<class AE>
        -triangular_matrix &operator = (const -matrix_expression<AE> &ae)
        The extended assignment operator.
        template<class AE>
        -triangular_matrix &assign (const matrix_expression<AE> -&ae)
        Assigns a matrix expression to the triangular matrix. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -triangular_matrix &operator += (const -matrix_expression<AE> &ae)
        A computed assignment operator. Adds the matrix expression to -the triangular matrix.
        template<class AE>
        -triangular_matrix &plus_assign (const -matrix_expression<AE> &ae)
        Adds a matrix expression to the triangular matrix. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -triangular_matrix &operator -= (const -matrix_expression<AE> &ae)
        A computed assignment operator. Subtracts the matrix expression -from the triangular matrix.
        template<class AE>
        -triangular_matrix &minus_assign (const -matrix_expression<AE> &ae)
        Subtracts a matrix expression from the triangular matrix. Left -and right hand side of the assignment should be independent.
        template<class AT>
        -triangular_matrix &operator *= (const AT &at)
        A computed assignment operator. Multiplies the triangular -matrix with a scalar.
        template<class AT>
        -triangular_matrix &operator /= (const AT &at)
        A computed assignment operator. Divides the triangular matrix -through a scalar.
        void swap (triangular_matrix &m)Swaps the contents of the triangular matrices.
        void insert (size_type i, size_type j, const_reference -t)Inserts the value t at the j-th -element of the i-th row.
        void erase (size_type i, size_type j)Erases the value at the j-th elemenst of the -i-th row.
        void clear ()Clears the matrix.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the triangular_matrix.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the triangular_matrix.
        iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the triangular_matrix.
        iterator1 end1 ()Returns a iterator1 pointing to the end of the -triangular_matrix.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the triangular_matrix.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the triangular_matrix.
        iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the triangular_matrix.
        iterator2 end2 ()Returns a iterator2 pointing to the end of the -triangular_matrix.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed triangular_matrix.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed triangular_matrix.
        reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed triangular_matrix.
        reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed triangular_matrix.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed triangular_matrix.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed triangular_matrix.
        reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed triangular_matrix.
        reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed triangular_matrix.
        -

        Notes

        -

        [1] -Supported parameters for the type of the triangular matrix are -lower , unit_lower, upper -and unit_upper .

        -

        [2] -Supported parameters for the storage organization are -row_major and column_major.

        -

        [3] -Supported parameters for the adapted array are -unbounded_array<T> , -bounded_array<T> and -std::vector<T> .

        -

        Triangular Adaptor

        -

        Description

        -

        The templated class triangular_adaptor<M, F> -is a triangular matrix adaptor for other matrices.

        -

        Example

        -
        -#include <boost/numeric/ublas/triangular.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    matrix<double> m (3, 3);
        -    triangular_adaptor<matrix<double>, lower> tal (m);
        -    for (unsigned i = 0; i < tal.size1 (); ++ i)
        -        for (unsigned j = 0; j <= i; ++ j)
        -            tal (i, j) = 3 * i + j;
        -    std::cout << tal << std::endl;
        -    triangular_adaptor<matrix<double>, upper> tau (m);
        -    for (unsigned i = 0; i < tau.size1 (); ++ i)
        -        for (unsigned j = i; j < tau.size2 (); ++ j)
        -            tau (i, j) = 3 * i + j;
        -    std::cout << tau << std::endl;
        -}
        -
        -

        Please read the full triangular example for more details.

        - -

        Definition

        -

        Defined in the header triangular.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        MThe type of the adapted matrix.
        FFunctor describing the type of the triangular adaptor. [1]lower
        -

        Model of

        -

        Matrix Expression -.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix Expression .

        -

        Public base classes

        -

        matrix_expression<triangular_adaptor<M, F> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        triangular_adaptor (matrix_type &data)Constructs a triangular_adaptor of a matrix.
        triangular_adaptor (const triangular_adaptor -&m)The copy constructor.
        template<class AE>
        -triangular_adaptor (const matrix_expression<AE> -&ae)
        The extended copy constructor.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns a const reference of the j --th element in the i-th row.
        reference operator () (size_type i, size_type -j)Returns a reference of the j-th element in the -i-th row.
        triangular_adaptor &operator = (const -triangular_adaptor &m)The assignment operator.
        triangular_adaptor &assign_temporary -(triangular_adaptor &m)Assigns a temporary. May change the triangular adaptor -m.
        template<class AE>
        -triangular_adaptor &operator = (const -matrix_expression<AE> &ae)
        The extended assignment operator.
        template<class AE>
        -triangular_adaptor &assign (const matrix_expression<AE> -&ae)
        Assigns a matrix expression to the triangular adaptor. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -triangular_adaptor &operator += (const -matrix_expression<AE> &ae)
        A computed assignment operator. Adds the matrix expression to -the triangular adaptor.
        template<class AE>
        -triangular_adaptor &plus_assign (const -matrix_expression<AE> &ae)
        Adds a matrix expression to the triangular adaptor. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -triangular_adaptor &operator -= (const -matrix_expression<AE> &ae)
        A computed assignment operator. Subtracts the matrix expression -from the triangular adaptor.
        template<class AE>
        -triangular_adaptor &minus_assign (const -matrix_expression<AE> &ae)
        Subtracts a matrix expression from the triangular adaptor. Left -and right hand side of the assignment should be independent.
        template<class AT>
        -triangular_adaptor &operator *= (const AT &at)
        A computed assignment operator. Multiplies the triangular -adaptor with a scalar.
        template<class AT>
        -triangular_adaptor &operator /= (const AT &at)
        A computed assignment operator. Divides the triangular adaptor -through a scalar.
        void swap (triangular_adaptor &m)Swaps the contents of the triangular adaptors.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the triangular_adaptor.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the triangular_adaptor.
        iterator1 begin1 ()Returns a iterator1 pointing to the beginning of -the triangular_adaptor.
        iterator1 end1 ()Returns a iterator1 pointing to the end of the -triangular_adaptor.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the triangular_adaptor.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the triangular_adaptor.
        iterator2 begin2 ()Returns a iterator2 pointing to the beginning of -the triangular_adaptor.
        iterator2 end2 ()Returns a iterator2 pointing to the end of the -triangular_adaptor.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed triangular_adaptor.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed triangular_adaptor.
        reverse_iterator1 rbegin1 ()Returns a reverse_iterator1 pointing to the -beginning of the reversed triangular_adaptor.
        reverse_iterator1 rend1 ()Returns a reverse_iterator1 pointing to the end of -the reversed triangular_adaptor.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed triangular_adaptor.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed triangular_adaptor.
        reverse_iterator2 rbegin2 ()Returns a reverse_iterator2 pointing to the -beginning of the reversed triangular_adaptor.
        reverse_iterator2 rend2 ()Returns a reverse_iterator2 pointing to the end of -the reversed triangular_adaptor.
        -

        Notes

        -

        [1] -Supported parameters for the type of the triangular adaptor are -lower , unit_lower, upper -and unit_upper .

        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/types_overview.html b/libs/numeric/ublas/doc/types_overview.html deleted file mode 100644 index b68a7ce05..000000000 --- a/libs/numeric/ublas/doc/types_overview.html +++ /dev/null @@ -1,580 +0,0 @@ - - - - - - - - - -Types Overview - - -

        Overview of Matrix- and Vector-Types

        -
        - -
        -
        Contents:
        -
        Vectors
        -
        Vector Proxies
        -
        Matrices
        -
        Matrix Proxies
        -
        Special Storage Layouts
        -
        - - -

        Notation

        - - - - - - - - - - - - - - - - - - - -
        Tis the data type. For general linear algebra operations this will be a real type e.g. double, ...
        Fis the orientation type (functor), either -row_major or column_major
        A, IA, TA is an array storage type, e.g. std::vector, -bounded_array, unbounded_array, ...
        TRIis a triangular functor: lower, -unit_lower, strict_lower, upper, unit_upper, -strict_upper
        M, Nare unsigned integer sizes -(std::size_t)
        IBis an index base -(std::size_t)
        VECis any vector type
        MAT is any matrix type
        [...]denote optional arguments - for more details -look at the section "storage layout".
        - -

        Vectors

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        DefinitionDescription
        vector<T [, A]>
           v(size);
        a dense vector of values of type T of variable -size. A storage type A can be specified -which defaults to unbounded_array. -Elements are constructed by A, which need not initialise their value.
        bounded_vector<T, N>
           v;
        a dense vector of values of type T of variable size but with maximum -N. The default constructor creates v -with size N. -Elements are constructed by the storage type bounded_array, which need not initialise their value.
        c_vector<T, M>
           v(size);
        a dense vector of values of type T with the given size. -The data is stored as an ordinary C++ array T -data_[M]
        zero_vector<T>
           v(size);
        the zero vector of type T with the given -size.
        unit_vector<T>
           v(size, index);
        the unit vector of type T with the given size. The -vector is zero other then a single specified element. -
        index should be less than size.
        mapped_vector<T [, S]>
           v(size);
        a sparse vector of values of type T of variable -size. The sparse storage type S can be std::map<size_t, -T> or map_array<size_t, T>.
        compressed_vector<T [,IB, IA, TA]>
           v(size);
        a sparse vector of values of type T of variable -size. The non zero values are stored as two seperate arrays - an -index array and a value array. The index array is always sorted and -there is at most one entry for each index.
        coordinate_vector<T [,IB, IA, TA]>
           v(size);
        a sparse vector of values of type T of variable -size. The non zero values are stored as two seperate arrays - an -index array and a value array. The arrays may be out of order with -multiple entries for each vector element. If there are multiple -values for the same index the sum of these values is the real -value.
        -

        Note: the default types are defined in -boost/numeric/ublas/fwd.hpp.

        - -

        Vector Proxies

        - - - - - - - - - - - - - - - - - - - - - - - - - - -
        DefinitionDescription
        vector_range<VEC>
           vr(v, range);
        a vector referencing a continuous subvector of elements of -vector v containing all elements specified by -range.
        vector_slice<VEC>
           vs(v, slice);
        a vector referencing a non continuous subvector of elements of -vector v containing all elements specified by -slice.
        matrix_row<MAT>
           vr(m, index);
        a vector referencing the index-th row of matrix -m
        matrix_column<MAT>
           vc(m, index);
        a vector referencing the index-th column of matrix -m
        - -

        Matrices

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        DefinitionDescription
        matrix<T [, F, A]>
           m(size1, size2);
        a dense matrix of values of type T of variable -size. A storage type A can be specified -which defaults to unbounded_array. -The orientation functor F defaults to -row_major. -Elements are constructed by A, which need not initialise their value.
        bounded_matrix<T, M, N [, F]>
           m;
        a dense matrix of type T with variable size with maximum M-by-N. The orientation functor F -defaults to row_major. The default constructor creates -m with size M-by-N. -Elements are constructed by the storage type bounded_array, which need not initialise their value.
        c_matrix<T, M, N>
           m(size1, size2);
        a dense matrix of values of type T with the given size. -The data is stored as an ordinary C++ array T -data_[N][M]
        vector_of_vector<T [, F, A]>
           m(size1, -size2);
        a dense matrix of values of type T with the given size. -The data is stored as a vector of vectors. The orientation -F defaults to row_major. The storage -type S defaults to -unbounded_array<unbounded_array<T> >
        zero_matrix<T>
           m(size1, size2);
        a zero matrix of type T with the given size.
        identity_matrix<T>
           m(size1, size2);
        an identity matrix of type T with the given size. -The values are v(i,j) = (i==j)?T(1):T().
        scalar_matrix<T>
           m(size1, size2, -value);
        a matrix of type T with the given size that has the -value value everywhere.
        triangular_matrix<T [, TRI, F, A]>
           -m(size);
        a triangular matrix of values of type T of -variable size. Only the nonzero elements are stored in the given -order F. ("triangular packed storage") The triangular -type F defaults to lower, the orientation -type F defaults to row_major.
        banded_matrix<T [, F, A]>
           m(size1, size2, n_lower, -n_upper);
        a banded matrix of values of type T of variable -size with n_lower sub diagonals and -n_upper super diagonals. Only the nonzero elements are -stored in the given order F. ("packed storage")
        symmetric_matrix<T [, TRI, F, A]>
           -m(size);
        a symmetric matrix of values of type T of -variable size. Only the given triangular matrix is stored in the -given order F.
        hermitian_matrix<T [, TRI, F, A]>
           -m(size);
        a hermitian matrix of values of type T of -variable size. Only the given triangular matrix is stored using -the order F.
        mapped_matrix<T, [F, S]>
           m(size1, size2 [, -non_zeros]);
        a sparse matrix of values of type T of variable -size. The sparse storage type S can be either std::map<size_t, -std::map<size_t, T> > or -map_array<size_t, map_array<size_t, -T> >.
        sparse_vector_of_sparse_vector<T, [F, C]>
           m(size1, -size2 [, non_zeros]);
        a sparse matrix of values of type T of variable -size.
        compressed_matrix<T, [F, IB, IA, TA]>
           m(size1, -size2 [, non_zeros]);
        a sparse matrix of values of type T of variable -size. The values are stored in compressed row/column storage.
        coordinate_matrix<T, [F, IB, IA, TA]>
           m(size1, -size2 [, non_zeros]);
        a sparse matrix of values of type T of variable -size. The values are stored in 3 parallel array as triples (i, j, -value). More than one value for each pair of indices is possible, -the real value is the sum of all.
        generalized_vector_of_vector<T, F, A>
           m(size1, -size2 [, non_zeros]);
        a sparse matrix of values of type T of variable -size. The values are stored as a vector of sparse vectors, e.g. -generalized_vector_of_vector<double, row_major, -unbounded_array<coordinate_vector<double> > >
        -

        Note: the default types are defined in -boost/numeric/ublas/fwd.hpp.

        - -

        Matrix Proxies

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        DefinitionDescription
        triangular_adaptor<MAT, TRI>
           ta(m);
        a triangular matrix referencing a selection of elements of the -matrix m.
        symmetric_adaptor<MAT, TRI>
           sa(m);
        a symmetric matrix referencing a selection of elements of the -matrix m.
        hermitian_adaptor<MAT, TRI>
           ha(m);
        a hermitian matrix referencing a selection of elements of the -matrix m.
        banded_adaptor<MAT>
           ba(m, n_lower, -n_upper);
        a banded matrix referencing a selection of elements of the -matrix m.
        matrix_range<MAT, TRI>
           mr(m, range1, -range2);
        a matrix referencing a submatrix of elements in the matrix -m.
        matrix_slice<MAT, TRI>
           ms(m, slice1, -slice2);
        a matrix referencing a non continues submatrix of elements in -the matrix m.
        - - - -

        Special Storage Layouts

        - - -

        The library supports conventional dense, packed and basic sparse -vector and matrix storage layouts. The description of the most -common constructions of vectors and matrices comes next.

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        ConstructionComment
        vector<T,
        - std::vector<T> >
        -  v (size)
        a dense vector, storage is provided by a standard -vector.
        -The storage layout usually is BLAS compliant.
        vector<T,
        - unbounded_array<T> >
        -  v (size)
        a dense vector, storage is provided by a heap-based -array.
        -The storage layout usually is BLAS compliant.
        vector<T,
        - bounded_array<T, N> >
        -  v (size)
        a dense vector, storage is provided by a stack-based -array.
        -The storage layout usually is BLAS compliant.
        mapped_vector<T,
        - std::map<std::size_t, T> >
        -  v (size, non_zeros)
        a sparse vector, storage is provided by a standard -map.
        mapped_vector<T,
        - map_array<std::size_t, T> >
        -  v (size, non_zeros)
        a sparse vector, storage is provided by a map -array.
        matrix<T,
        - row_major,
        - std::vector<T> >
        -  m (size1, size2)
        a dense matrix, orientation is row major, storage is -provided by a standard vector.
        matrix<T,
        - column_major,
        - std::vector<T> >
        -  m (size1, size2)
        a dense matrix, orientation is column major, storage -is provided by a standard vector.
        -The storage layout usually is BLAS compliant.
        matrix<T,
        - row_major,
        - unbounded_array<T> >
        -  m (size1, size2)
        a dense matrix, orientation is row major, storage is -provided by a heap-based array.
        matrix<T,
        - column_major,
        - unbounded_array<T> >
        -  m (size1, size2)
        a dense matrix, orientation is column major, storage -is provided by a heap-based array.
        -The storage layout usually is BLAS compliant.
        matrix<T,
        - row_major,
        - bounded_array<T, N1 * N2> >
        -  m (size1, size2)
        a dense matrix, orientation is row major, storage is -provided by a stack-based array.
        matrix<T,
        - column_major,
        - bounded_array<T, N1 * N2> >
        -  m (size1, size2)
        a dense matrix, orientation is column major, storage -is provided by a stack-based array.
        -The storage layout usually is BLAS compliant.
        triangular_matrix<T,
        - row_major, F, A>
        -  m (size)
        a packed triangular matrix, orientation is row -major.
        triangular_matrix<T,
        - column_major, F, A>
        -  m (size)
        a packed triangular matrix, orientation is column -major.
        -The storage layout usually is BLAS compliant.
        banded_matrix<T,
        - row_major, A>
        -  m (size1, size2, lower, upper)
        a packed banded matrix, orientation is row -major.
        banded_matrix<T,
        - column_major, A>
        -  m (size1, size2, lower, upper)
        a packed banded matrix, orientation is column -major.
        -The storage layout usually is BLAS compliant.
        symmetric_matrix<T,
        - row_major, F, A>
        -  m (size)
        a packed symmetric matrix, orientation is row -major.
        symmetric_matrix<T,
        - column_major, F, A>
        -  m (size)
        a packed symmetric matrix, orientation is column -major.
        -The storage layout usually is BLAS compliant.
        hermitian_matrix<T,
        - row_major, F, A>
        -  m (size)
        a packed hermitian matrix, orientation is row -major.
        hermitian_matrix<T,
        - column_major, F, A>
        -  m (size)
        a packed hermitian matrix, orientation is column -major.
        -The storage layout usually is BLAS compliant.
        mapped_matrix<T,
        - row_major,
        - std::map<std::size_t, T> >
        -  m (size1, size2, non_zeros)
        a sparse matrix, orientation is row major, storage -is provided by a standard map.
        mapped_matrix<T,
        - column_major,
        - std::map<std::size_t, T> >
        -  m (size1, size2, non_zeros)
        a sparse matrix, orientation is column major, -storage is provided by a standard map.
        mapped_matrix<T,
        - row_major,
        - map_array<std::size_t, T> >
        -  m (size1, size2, non_zeros)
        a sparse matrix, orientation is row major, storage -is provided by a map array.
        mapped_matrix<T,
        - column_major,
        - map_array<std::size_t, T> >
        -  m (size1, size2, non_zeros)
        a sparse matrix, orientation is column major, -storage is provided by a map array.
        compressed_matrix<T,
        - row_major>
        -  m (size1, size2, non_zeros)
        a compressed matrix, orientation is row major.
        -The storage layout usually is BLAS compliant.
        compressed_matrix<T,
        - column_major>
        -  m (size1, size2, non_zeros)
        a compressed matrix, orientation is column -major.
        -The storage layout usually is BLAS compliant.
        coordinate_matrix<T,
        - row_major>
        -  m (size1, size2, non_zeros)
        a coordinate matrix, orientation is row major.
        -The storage layout usually is BLAS compliant.
        coordinate_matrix<T,
        - column_major>
        -  m (size1, size2, non_zeros)
        a coordinate matrix, orientation is column -major.
        -The storage layout usually is BLAS compliant.
        - -
        -

        Copyright (©) 2000-2004 Joerg Walter, Mathias Koch, Gunter -Winkler, Michael Stevens
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/ublas.css b/libs/numeric/ublas/doc/ublas.css deleted file mode 100644 index 1531be7f5..000000000 --- a/libs/numeric/ublas/doc/ublas.css +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2000-2009 Michael Stevens, Mathias Koch, - * Joerg Walter, Gunter Winkler. - * - * 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). - */ -table { - border-width: medium; - background-color: #F8F8F8; - margin: 1em; -} - -td { - padding-left: 0.5em; - padding-right: 0.5em; -} - -th { - text-align: left; -} - -pre.screen { - border: 1px solid #DCDCDC; - display: block; - font-size: 9pt; - margin: 1pc 4% 0; - padding: 0.5pc; -} - -p.credit { - font-style: italic; -} - -@media print { - div.toc { display: none; } -} - -div.toc { - margin: 10px; - padding: 3px; -} - -div#toc ul { - list-style: none; - margin: 1px; - padding-left: 1em; - margin-bottom: 0.25em; -} - -div#toc ul li ul { - margin-bottom: 0.25em; -} - -div#toc ul li ul li ul { - margin-bottom: 0.25em; -} \ No newline at end of file diff --git a/libs/numeric/ublas/doc/unbounded_array.html b/libs/numeric/ublas/doc/unbounded_array.html deleted file mode 100644 index 3be073054..000000000 --- a/libs/numeric/ublas/doc/unbounded_array.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - - -Unbounded array - - -

        Unbounded Array Storage

        -
        -

        Unbounded Array

        -

        Description

        -

        The templated class unbounded_array<T, ALLOC> implements a unbounded storage array using an allocator. -The unbounded array is similar to a std::vector in that in can grow in size beyond any fixed bound. -However unbounded_array is aimed at optimal performance. Therefore unbounded_array does not model a -Sequence like std::vector does. -

        When resized unbounded_array will reallocate it's storage even if the new size requirement is smaller. It is therefore inefficient to resize a unbounded_array

        -

        Example

        -
        -#include <boost/numeric/ublas/storage.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    unbounded_array<double> a (3);
        -    for (unsigned i = 0; i < a.size (); ++ i) {
        -        a [i] = i;
        -        std::cout << a [i] << std::endl;
        -    }
        -}
        -
        -

        Definition

        -

        Defined in the header storage.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the array.
        ALLOCAn STL Allocatorstd::allocator
        -

        Model of

        -

        Storage

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Storage.

        -

        Public base classes

        -

        None.

        -

        Members

        -
          -
        • The description does not describe what the member actually does, this can be looked up -in the corresponding concept documentation, but instead contains a remark on the implementation of the -member inside this model of the concept.
        • -
        • Typography: -
            -
          • Members that are not part of the implemented concepts are in blue.
          • -
          -
        • -
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberWhere definedDescription
        value_typeContainer
        pointerContainerDefined as value_type*
        const_pointerContainerDefined as const value_type*
        referenceContainerDefined as value_type&
        const_referenceContainerDefined as const value_type&
        size_typeContainerDefined as Alloc::size_type
        difference_typeContainerDefined as Alloc::difference_type
        iteratorContainerDefined as pointer
        const_iteratorContainerDefined as const_pointer
        revere_iteratorContainerDefined as std::reverse_iterator<iterator>
        const_revere_iteratorContainerDefined as std::reverse_iterator<const_iterator>
        allocator_typeDefined as ALLOC
        explicit unbounded_array (ALLOC &a = ALLOC())StorageCreates an unbounded_array that holds zero elements, using a specified allocator.
        explicit unbounded_array (size_type size, ALLOC &a = ALLOC())StorageCreates a uninitialized unbounded_array that holds size elements, using a specified allocator. All the elements are default constructed.
        unbounded_array (size_type size, const T& init, ALLOC& a = ALLOC())StorageCreates an initialized unbounded_array that holds size elements, using a specified allocator. All the elements are constructed from the init value.
        unbounded_array (const unbounded_array &a)ContainerThe copy constructor.
        ~unbounded_array ()ContainerDeallocates the unbounded_array itself.
        void resize (size_type n)StorageReallocates an unbounded_array to hold n elements. Values are uninitialised.
        void resize(size_type n, const T& t)StorageReallocates an unbounded_array to hold n elements. Values are copies of t -
        size_type size () constContainerReturns the size of the unbounded_array.
        const_reference operator [] (size_type i) constContainerReturns a const reference of the i -th element.
        reference operator [] (size_type i)ContainerReturns a reference of the i-th element.
        unbounded_array &operator = (const unbounded_array &a)ContainerThe assignment operator.
        unbounded_array &assign_temporary (unbounded_array &a)Assigns a temporary. May change the array a.
        void swap (unbounded_array &a)ContainerSwaps the contents of the arrays.
        const_iterator begin () constContainerReturns a const_iterator pointing to the beginning -of the unbounded_array.
        const_iterator end () constContainerReturns a const_iterator pointing to the end of -the unbounded_array.
        iterator begin ()ContainerReturns a iterator pointing to the beginning of -the unbounded_array.
        iterator end ()ContainerReturns a iterator pointing to the end of the -unbounded_array.
        const_reverse_iterator rbegin () constReversible ContainerReturns a const_reverse_iterator pointing to the beginning of the reversed unbounded_array.
        const_reverse_iterator rend () constReversible ContainerReturns a const_reverse_iterator pointing to the end of the reversed unbounded_array.
        reverse_iterator rbegin ()Reversible ContainerReturns a reverse_iterator pointing to the beginning of the reversed unbounded_array.
        reverse_iterator rend ()Reversible ContainerReturns a reverse_iterator pointing to the end of the reversed unbounded_array.
        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/vector.html b/libs/numeric/ublas/doc/vector.html deleted file mode 100644 index 2f9569d35..000000000 --- a/libs/numeric/ublas/doc/vector.html +++ /dev/null @@ -1,755 +0,0 @@ - - - - - - - - - -Vector - - -

        Vector

        -
        -

        Vector

        -

        Description

        -

        The templated class vector<T, A> is the base -container adaptor for dense vectors. For a n-dimensional -vector and 0 <= i < n every element -vi is mapped to the i-th -element of the container.

        -

        Example

        -
        -#include <boost/numeric/ublas/vector.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    vector<double> v (3);
        -    for (unsigned i = 0; i < v.size (); ++ i)
        -        v (i) = i;
        -    std::cout << v << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header vector.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the vector.
        AThe type of the Storage array. [1]unbounded_array<T>
        -

        Model of

        -

        Vector, -RandomAccessContainer -

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector -and RandomAccessContainer.

        -

        Public base classes

        -

        vector_container<vector<T, A> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberWhere definedDescription
        value_type -VectorExpression
        reference -VectorExpression
        const_reference -VectorExpression
        size_type -VectorExpression
        difference_type -VectorExpression
        const_iterator -VectorExpression
        iterator -VectorExpression
        const_reverse_iterator -VectorExpression
        reverse_iterator -VectorExpression
        array_type -Vector
        vector ()VectorExpressionAllocates an uninitialized vector that holds zero -elements.
        vector (size_type size)VectorAllocates an uninitialized vector that holds -size elements.
        vector (const vector &v)The copy constructor.
        template<class AE>
        -vector (const vector_expression<AE> &ae)
        The extended copy constructor.
        void resize (size_type size, bool preserve = -true)VectorReallocates a vector to hold size -elements. The existing elements of the vector are -preseved when specified.
        size_type size () constVectorExpressionReturns the size of the vector.
        size_type max_size () constRandomAccessContainerReturns the upper bound on the size of the vector.
        bool empty () constRandomAccessContainerEquivilent to size () == 0.
        const array_type& data () constVector
        array_type& data ()Vector
        const_reference operator () (size_type i) -constVectorExpressionReturns a const reference of the i --th element.
        reference operator () (size_type i)VectorExpressionReturns a reference of the i-th element.
        const_reference operator [] (size_type i) constVectorReturns a const reference of the i --th element.
        reference operator [] (size_type i)VectorReturns a reference of the i-th element.
        vector &operator = (const vector &v)VectorExpressionThe assignment operator.
        vector &assign_temporary (vector &v)VectorExpressionAssigns a temporary. May change the vector v.
        template<class AE>
        -vector &operator = (const vector_expression<AE> -&ae)
        VectorExpressionThe extended assignment operator.
        template<class AE>
        -vector &assign (const vector_expression<AE> -&ae)
        VectorExpressionAssigns a vector expression to the vector. Left and right hand -side of the assignment should be independent.
        template<class AE>
        -vector &operator += (const vector_expression<AE> -&ae)
        VectorExpressionA computed assignment operator. Adds the vector expression to -the vector.
        template<class AE>
        -vector &plus_assign (const vector_expression<AE> -&ae)
        VectorExpressionAdds a vector expression to the vector. Left and right hand -side of the assignment should be independent.
        template<class AE>
        -vector &operator -= (const vector_expression<AE> -&ae)
        VectorExpressionA computed assignment operator. Subtracts the vector expression -from the vector.
        template<class AE>
        -vector &minus_assign (const vector_expression<AE> -&ae)
        VectorExpressionSubtracts a vector expression from the vector. Left and right -hand side of the assignment should be independent.
        template<class AT>
        -vector &operator *= (const AT &at)
        VectorExpressionA computed assignment operator. Multiplies the vector with a -scalar.
        template<class AT>
        -vector &operator /= (const AT &at)
        VectorExpressionA computed assignment operator. Divides the vector through a -scalar.
        void swap (vector &v)VectorExpressionSwaps the contents of the vectors.
        void insert_element (size_type i, const_reference t)VectorInserts the value t at the i-th -element.
        void erase_element (size_type i)VectorErases the value at the i-th element.
        void clear ()VectorClears the vector.
        const_iterator begin () constVectorExpressionReturns a const_iterator pointing to the beginning -of the vector.
        const_iterator end () constVectorExpressionReturns a const_iterator pointing to the end of -the vector.
        iterator begin ()VectorExpressionReturns a iterator pointing to the beginning of -the vector.
        iterator end ()VectorExpressionReturns a iterator pointing to the end of the -vector.
        const_reverse_iterator rbegin () constVectorExpressionReturns a const_reverse_iterator pointing to the -beginning of the reversed vector.
        const_reverse_iterator rend () constVectorExpressionReturns a const_reverse_iterator pointing to the -end of the reversed vector.
        reverse_iterator rbegin ()VectorExpressionReturns a reverse_iterator pointing to the -beginning of the reversed vector.
        reverse_iterator rend ()VectorExpressionReturns a reverse_iterator pointing to the end of -the reversed vector.
        -

        Notes

        -

        [1] Common parameters -for the Storage array are unbounded_array<T> , -bounded_array<T> and -std::vector<T> .

        -

        Unit Vector

        -

        Description

        -

        The templated class unit_vector<T, ALLOC> represents -canonical unit vectors. For the k-th -n-dimensional canonical unit vector and 0 <= i < -n holds uki -= 0, if i <> k, and -uki = -1.

        -

        Example

        -
        -#include <boost/numeric/ublas/vector.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    for (int i = 0; i < 3; ++ i) {
        -        unit_vector<double> v (3, i);
        -        std::cout << v << std::endl;
        -    }
        -}
        -
        -

        Definition

        -

        Defined in the header vector.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the vector.int
        ALLOCAn STL Allocator for size_type and difference_type.std::allocator
        -

        Model of

        -

        Vector .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of -Vector .

        -

        Public base classes

        -

        vector_container<unit_vector<T> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        unit_vector ()Constructs an unit_vector that holds zero -elements.
        unit_vector (size_type size, size_type index)Constructs the index-th unit_vector -that holds size elements.
        unit_vector (const unit_vector &v)The copy constructor.
        void resize (size_type size, bool preserve = -true)Resizes a unit_vector to hold size -elements. Therefore the existing elements of the -unit_vector are always preseved.
        size_type size () constReturns the size of the unit_vector.
        size_type index () constReturns the index of the unit_vector.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        const_reference operator [] (size_type i) -constReturns the value of the i-th element.
        unit_vector &operator = (const unit_vector -&v)The assignment operator.
        unit_vector &assign_temporary (unit_vector -&v)Assigns a temporary. May change the unit vector v -.
        void swap (unit_vector &v)Swaps the contents of the unit vectors.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the unit_vector.
        const_iterator end () constReturns a const_iterator pointing to the end of -the unit_vector.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed unit_vector.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed unit_vector.
        -

        Zero Vector

        -

        Description

        -

        The templated class zero_vector<T, ALLOC> represents -zero vectors. For a n-dimensional zero vector and 0 -<= i < n holds zi = -0.

        -

        Example

        -
        -#include <boost/numeric/ublas/vector.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    zero_vector<double> v (3);
        -    std::cout << v << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header vector.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the vector.int
        ALLOCAn STL Allocator for size_type and difference_type.std::allocator
        -

        Model of

        -

        Vector .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of -Vector .

        -

        Public base classes

        -

        vector_container<zero_vector<T> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        zero_vector ()Constructs a zero_vector that holds zero -elements.
        zero_vector (size_type size)Constructs a zero_vector that holds -size elements.
        zero_vector (const zero_vector &v)The copy constructor.
        void resize (size_type size, bool preserve = -true)Resizes a zero_vector to hold size -elements. Therefore the existing elements of the -zero_vector are always preseved.
        size_type size () constReturns the size of the zero_vector.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        const_reference operator [] (size_type i) -constReturns the value of the i-th element.
        zero_vector &operator = (const zero_vector -&v)The assignment operator.
        zero_vector &assign_temporary (zero_vector -&v)Assigns a temporary. May change the zero vector v -.
        void swap (zero_vector &v)Swaps the contents of the zero vectors.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the zero_vector.
        const_iterator end () constReturns a const_iterator pointing to the end of -the zero_vector.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed zero_vector.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed zero_vector.
        -

        Scalar Vector

        -

        Description

        -

        The templated class scalar_vector<T, ALLOC> -represents scalar vectors. For a n-dimensional scalar -vector and 0 <= i < n holds -zi = s.

        -

        Example

        -
        -#include <boost/numeric/ublas/vector.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    scalar_vector<double> v (3);
        -    std::cout << v << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header vector.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the vector.int
        ALLOCAn STL Allocator for size_type and difference_type.std::allocator
        -

        Model of

        -

        Vector .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of -Vector .

        -

        Public base classes

        -

        vector_container<scalar_vector<T> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        scalar_vector ()Constructs a scalar_vector that holds zero -elements.
        scalar_vector (size_type size, const value_type -&value)Constructs a scalar_vector that holds -size elements each of the specified value.
        scalar_vector (const scalar_vector &v)The copy constructor.
        void resize (size_type size, bool preserve = -true)Resizes a scalar_vector to hold size -elements. Therefore the existing elements of the -scalar_vector are always preseved.
        size_type size () constReturns the size of the scalar_vector.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        const_reference operator [] (size_type i) -constReturns the value of the i-th element.
        scalar_vector &operator = (const scalar_vector -&v)The assignment operator.
        scalar_vector &assign_temporary (scalar_vector -&v)Assigns a temporary. May change the scalar vector -v .
        void swap (scalar_vector &v)Swaps the contents of the scalar vectors.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the scalar_vector.
        const_iterator end () constReturns a const_iterator pointing to the end of -the scalar_vector.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed scalar_vector.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed scalar_vector.
        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/vector_expression.html b/libs/numeric/ublas/doc/vector_expression.html deleted file mode 100644 index 7838007ff..000000000 --- a/libs/numeric/ublas/doc/vector_expression.html +++ /dev/null @@ -1,969 +0,0 @@ - - - - - - - - - -Vector Expressions - - -

        Vector Expressions

        -
        -

        Vector Expression

        -

        Description

        -

        The templated class vector_expression<E> -is required to be a public base of all classes which model the Vector Expression concept.

        -

        Definition

        -

        Defined in the header expression_types.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        EThe type of the vector expression. 
        -

        Model of

        -

        None. Not a Vector Expression! -

        -

        Type requirements

        -

        None.

        -

        Public base classes

        -

        None.

        -

        Members

        - - - - - - - - - - - - - - - -
        MemberDescription
        const expression_type &operator () () -constReturns a const reference of the expression.
        expression_type &operator () ()Returns a reference of the expression.
        -

        Notes

        -

        The range, slice and project functions have been removed. Use the free functions defined in vector proxy instead.

        - -

        Vector Container

        -

        Description

        -

        The templated class vector_container<C> -is required to be a public base of all classes which model the Vector concept. -This includes the class vector itself.

        -

        Definition

        -

        Defined in the header expression_types.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        CThe type of the vector container. 
        -

        Model of

        -

        None. Not a Vector Expression OR Vector! -

        -

        Type requirements

        -

        None.

        -

        Public base classes

        -

        vector_expression<C>

        -

        Members

        - - - - - - - - - - - - - - - -
        MemberDescription
        const container_type &operator () () -constReturns a const reference of the container.
        container_type &operator () ()Returns a reference of the container.
        - -

        Vector References

        -

        Reference

        -

        Description

        -

        The templated class vector_reference<E> -contains a reference to a vector expression.

        -

        Definition

        -

        Defined in the header vector_expression.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        EThe type of the vector expression. 
        -

        Model of

        -

        Vector Expression -.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector Expression .

        -

        Public base classes

        -

        vector_expression<vector_reference<E> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        vector_reference (expression_type &e)Constructs a reference of the expression.
        void resize (size_type size)Resizes the expression to hold at most size -elements.
        size_type size () constReturns the size of the expression.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        reference operator () (size_type i)Returns a reference of the i-th element.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the expression.
        const_iterator end () constReturns a const_iterator pointing to the end of -the expression.
        iterator begin ()Returns a iterator pointing to the beginning of -the expression.
        iterator end ()Returns a iterator pointing to the end of the -expression.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed expression.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed expression.
        reverse_iterator rbegin ()Returns a reverse_iterator pointing to the -beginning of the reversed expression.
        reverse_iterator rend ()Returns a reverse_iterator pointing to the end of -the reversed expression.
        -

        Vector Operations

        -

        Unary Operation Description

        -

        Description

        -

        The templated class vector_unary<E, F> -describes a unary vector operation.

        -

        Definition

        -

        Defined in the header vector_expression.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        EThe type of the vector expression. 
        FThe type of the operation. 
        -

        Model of

        -

        Vector Expression -.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector Expression .

        -

        Public base classes

        -

        vector_expression<vector_unary<E, F> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        vector_unary (const expression_type &e)Constructs a description of the expression.
        size_type size () constReturns the size of the expression.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the expression.
        const_iterator end () constReturns a const_iterator pointing to the end of -the expression.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed expression.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed expression.
        -

        Unary Operations

        -

        Prototypes

        -
        -template<class E, class F>
        -    struct vector_unary_traits {
        -        typedef vector_unary<typename E::const_closure_type, F> expression_type;
        -        typedef expression_type result_type;
        -     };
        -
        -    // (- v) [i] = - v [i]
        -    template<class E>
        -     typename vector_unary_traits<E, scalar_negate<typename E::value_type> >::result_type
        -    operator - (const vector_expression<E> &e);
        -
        -    // (conj v) [i] = conj (v [i])
        -    template<class E>
        -     typename vector_unary_traits<E, scalar_conj<typename E::value_type> >::result_type
        -    conj (const vector_expression<E> &e);
        -
        -    // (real v) [i] = real (v [i])
        -    template<class E>
        -     typename vector_unary_traits<E, scalar_real<typename E::value_type> >::result_type
        -    real (const vector_expression<E> &e);
        -
        -    // (imag v) [i] = imag (v [i])
        -    template<class E>
        -     typename vector_unary_traits<E, scalar_imag<typename E::value_type> >::result_type
        -    imag (const vector_expression<E> &e);
        -
        -    // (trans v) [i] = v [i]
        -    template<class E>
        -     typename vector_unary_traits<E, scalar_identity<typename E::value_type> >::result_type
        -    trans (const vector_expression<E> &e);
        -
        -    // (herm v) [i] = conj (v [i])
        -    template<class E>
        -     typename vector_unary_traits<E, scalar_conj<typename E::value_type> >::result_type
        -    herm (const vector_expression<E> &e);
        -
        -

        Description

        -

        operator - computes the additive inverse of a -vector expression. conj computes the complex conjugate -of a vector expression. real and imag -compute the real and imaginary parts of a vector expression. -trans computes the transpose of a vector expression. -herm computes the hermitian, i.e. the complex -conjugate of the transpose of a vector expression.

        -

        Definition

        -

        Defined in the header vector_expression.hpp.

        -

        Type requirements

        - -

        Preconditions

        -

        None.

        -

        Complexity

        -

        Linear depending from the size of the vector expression.

        -

        Examples

        -
        -#include <boost/numeric/ublas/vector.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    vector<std::complex<double> > v (3);
        -    for (unsigned i = 0; i < v.size (); ++ i)
        -        v (i) = std::complex<double> (i, i);
        -
        -    std::cout << - v << std::endl;
        -    std::cout << conj (v) << std::endl;
        -    std::cout << real (v) << std::endl;
        -    std::cout << imag (v) << std::endl;
        -    std::cout << trans (v) << std::endl;
        -    std::cout << herm (v) << std::endl;
        -}
        -
        -

        Binary Operation Description

        -

        Description

        -

        The templated class vector_binary<E1, E2, F> -describes a binary vector operation.

        -

        Definition

        -

        Defined in the header vector_expression.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        E1The type of the first vector expression.
        E2The type of the second vector expression.
        FThe type of the operation.
        -

        Model of

        -

        Vector Expression -.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector Expression .

        -

        Public base classes

        -

        vector_expression<vector_binary<E1, E2, F> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        vector_binary (const expression1_type &e1, const -expression2_type &e2)Constructs a description of the expression.
        size_type size () constReturns the size of the expression.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the expression.
        const_iterator end () constReturns a const_iterator pointing to the end of -the expression.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed expression.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed expression.
        -

        Binary Operations

        -

        Prototypes

        -
        -template<class E1, class E2, class F>
        -    struct vector_binary_traits {
        -        typedef vector_binary<typename E1::const_closure_type,
        -                               typename E2::const_closure_type, F> expression_type;
        -        typedef expression_type result_type;
        -     };
        -
        -    // (v1 + v2) [i] = v1 [i] + v2 [i]
        -    template<class E1, class E2>
        -    typename vector_binary_traits<E1, E2, scalar_plus<typename E1::value_type,
        -                                                       typename E2::value_type> >::result_type
        -    operator + (const vector_expression<E1> &e1,
        -                 const vector_expression<E2> &e2);
        -
        -    // (v1 - v2) [i] = v1 [i] - v2 [i]
        -    template<class E1, class E2>
        -    typename vector_binary_traits<E1, E2, scalar_minus<typename E1::value_type,
        -                                                        typename E2::value_type> >::result_type
        -    operator - (const vector_expression<E1> &e1,
        -                 const vector_expression<E2> &e2);
        -
        -

        Description

        -

        operator + computes the sum of two vector -expressions. operator - computes the difference of two -vector expressions.

        -

        Definition

        -

        Defined in the header vector_expression.hpp.

        -

        Type requirements

        - -

        Preconditions

        -
          -
        • e1 ().size () == e2 ().size ()
        • -
        -

        Complexity

        -

        Linear depending from the size of the vector expressions.

        -

        Examples

        -
        -#include <boost/numeric/ublas/vector.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    vector<double> v1 (3), v2 (3);
        -    for (unsigned i = 0; i < std::min (v1.size (), v2.size ()); ++ i)
        -        v1 (i) = v2 (i) = i;
        -
        -    std::cout << v1 + v2 << std::endl;
        -    std::cout << v1 - v2 << std::endl;
        -}
        -
        -

        Binary Outer Operation Description

        -

        Description

        -

        The templated class vector_matrix_binary<E1, E2, -F> describes a binary outer vector operation.

        -

        Definition

        -

        Defined in the header matrix_expression.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        E1The type of the first vector expression.
        E2The type of the second vector expression.
        FThe type of the operation.
        -

        Model of

        -

        Matrix Expression -.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Matrix Expression .

        -

        Public base classes

        -

        matrix_expression<vector_matrix_binary<E1, E2, F> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        vector_matrix_binary (const expression1_type &e1, -const expression2_type &e2)Constructs a description of the expression.
        size_type size1 () constReturns the number of rows.
        size_type size2 () constReturns the number of columns.
        const_reference operator () (size_type i, size_type j) -constReturns the value of the j-th element in the -i-th row.
        const_iterator1 begin1 () constReturns a const_iterator1 pointing to the -beginning of the expression.
        const_iterator1 end1 () constReturns a const_iterator1 pointing to the end of -the expression.
        const_iterator2 begin2 () constReturns a const_iterator2 pointing to the -beginning of the expression.
        const_iterator2 end2 () constReturns a const_iterator2 pointing to the end of -the expression.
        const_reverse_iterator1 rbegin1 () constReturns a const_reverse_iterator1 pointing to the -beginning of the reversed expression.
        const_reverse_iterator1 rend1 () constReturns a const_reverse_iterator1 pointing to the -end of the reversed expression.
        const_reverse_iterator2 rbegin2 () constReturns a const_reverse_iterator2 pointing to the -beginning of the reversed expression.
        const_reverse_iterator2 rend2 () constReturns a const_reverse_iterator2 pointing to the -end of the reversed expression.
        -

        Binary Outer Operations

        -

        Prototypes

        -
        -template<class E1, class E2, class F>
        -    struct vector_matrix_binary_traits {
        -        typedef vector_matrix_binary<typename E1::const_closure_type,
        -                                      typename E2::const_closure_type, F> expression_type;
        -        typedef expression_type result_type;
        -     };
        -
        -    // (outer_prod (v1, v2)) [i] [j] = v1 [i] * v2 [j]
        -    template<class E1, class E2>
        -    typename vector_matrix_binary_traits<E1, E2, scalar_multiplies<typename E1::value_type, typename E2::value_type> >::result_type
        -    outer_prod (const vector_expression<E1> &e1,
        -                 const vector_expression<E2> &e2);
        -
        -

        Description

        -

        outer_prod computes the outer product of two vector -expressions.

        -

        Definition

        -

        Defined in the header matrix_expression.hpp.

        -

        Type requirements

        - -

        Preconditions

        -

        None.

        -

        Complexity

        -

        Quadratic depending from the size of the vector expressions.

        -

        Examples

        -
        -#include <boost/numeric/ublas/matrix.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    vector<double> v1 (3), v2 (3);
        -    for (unsigned i = 0; i < std::min (v1.size (), v2.size ()); ++ i)
        -        v1 (i) = v2 (i) = i;
        -
        -    std::cout << outer_prod (v1, v2) << std::endl;
        -}
        -
        -

        Scalar Vector Operation Description

        -

        Description

        -

        The templated classes vector_binary_scalar1<E1, E2, -F> and vector_binary_scalar2<E1, E2, -F> describe binary operations between a scalar and a -vector.

        -

        Definition

        -

        Defined in the header vector_expression.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        E1/E2The type of the scalar expression.
        E2/E1The type of the vector expression.
        FThe type of the operation.
        -

        Model of

        -

        Vector Expression -.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector Expression .

        -

        Public base classes

        -

        vector_expression<vector_binary_scalar1<E1, E2, -F> > and -vector_expression<vector_binary_scalar2<E1, E2, F> -> resp.

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        vector_binary_scalar1 (const expression1_type &e1, -const expression2_type &e2)Constructs a description of the expression.
        vector_binary_scalar2 (const expression1_type &e1, -const expression2_type &e2)Constructs a description of the expression.
        size_type size () constReturns the size of the expression.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the expression.
        const_iterator end () constReturns a const_iterator pointing to the end of -the expression.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed expression.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed expression.
        -

        Scalar Vector Operations

        -

        Prototypes

        -
        -template<class T1, class E2, class F>
        -    struct vector_binary_scalar1_traits {
        -        typedef vector_binary_scalar1<scalar_const_reference<T1>,
        -                                      typename E2::const_closure_type, F> expression_type;
        -        typedef expression_type result_type;
        -    };
        -
        -    // (t * v) [i] = t * v [i]
        -    template<class T1, class E2>
        -    typename vector_binary_scalar1_traits<T1, E2, scalar_multiplies<T1, typename E2::value_type> >::result_type
        -    operator * (const T1 &e1,
        -                const vector_expression<E2> &e2);
        -
        -    template<class E1, class T2, class F>
        -    struct vector_binary_scalar2_traits {
        -        typedef vector_binary_scalar2<typename E1::const_closure_type,
        -                                      scalar_const_reference<T2>, F> expression_type;
        -        typedef expression_type result_type;
        -    };
        -
        -    // (v * t) [i] = v [i] * t
        -    template<class E1, class T2>
        -    typename vector_binary_scalar2_traits<E1, T2, scalar_multiplies<typename E1::value_type, T2> >::result_type
        -    operator * (const vector_expression<E1> &e1,
        -                const T2 &e2);
        -
        -    // (v / t) [i] = v [i] / t
        -    template<class E1, class T2>
        -    typename vector_binary_scalar2_traits<E1, T2, scalar_divides<typename E1::value_type, T2> >::result_type
        -    operator / (const vector_expression<E1> &e1,
        -                const T2 &e2);
        -
        -

        Description

        -

        operator * computes the product of a scalar and a -vector expression. operator / multiplies the vector -with the reciprocal of the scalar.

        -

        Definition

        -

        Defined in the header vector_expression.hpp.

        -

        Type requirements

        - -

        Preconditions

        -

        None.

        -

        Complexity

        -

        Linear depending from the size of the vector expression.

        -

        Examples

        -
        -#include <boost/numeric/ublas/vector.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    vector<double> v (3);
        -    for (unsigned i = 0; i < v.size (); ++ i)
        -        v (i) = i;
        -
        -    std::cout << 2.0 * v << std::endl;
        -    std::cout << v * 2.0 << std::endl;
        -}
        -
        -

        Vector Reductions

        -

        Unary Reductions

        -

        Prototypes

        -
        -template<class E, class F>
        -    struct vector_scalar_unary_traits {
        -         typedef typename F::result_type result_type;
        -    };
        -
        -    // sum v = sum (v [i])
        -    template<class E>
        -    typename vector_scalar_unary_traits<E, vector_sum<typename E::value_type> >::result_type
        -    sum (const vector_expression<E> &e);
        -
        -    // norm_1 v = sum (abs (v [i]))
        -    template<class E>
        -    typename vector_scalar_unary_traits<E, vector_norm_1<typename E::value_type> >::result_type
        -    norm_1 (const vector_expression<E> &e);
        -
        -    // norm_2 v = sqrt (sum (v [i] * v [i]))
        -    template<class E>
        -    typename vector_scalar_unary_traits<E, vector_norm_2<typename E::value_type> >::result_type
        -    norm_2 (const vector_expression<E> &e);
        -
        -    // norm_inf v = max (abs (v [i]))
        -    template<class E>
        -    typename vector_scalar_unary_traits<E, vector_norm_inf<typename E::value_type> >::result_type
        -    norm_inf (const vector_expression<E> &e);
        -
        -    // index_norm_inf v = min (i: abs (v [i]) == max (abs (v [i])))
        -    template<class E>
        -    typename vector_scalar_unary_traits<E, vector_index_norm_inf<typename E::value_type> >::result_type
        -    index_norm_inf (const vector_expression<E> &e);
        -
        -

        Description

        -

        sum computes the sum of the vector expression's -elements. norm_1, norm_2 and -norm_inf compute the corresponding -||.||1, -||.||2 and -||.||inf vector norms. -index_norm_1 computes the index of the vector -expression's first element having maximal absolute value.

        -

        Definition

        -

        Defined in the header vector_expression.hpp.

        -

        Type requirements

        - -

        Preconditions

        -

        None.

        -

        Complexity

        -

        Linear depending from the size of the vector expression.

        -

        Examples

        -
        -#include <boost/numeric/ublas/vector.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    vector<double> v (3);
        -    for (unsigned i = 0; i < v.size (); ++ i)
        -        v (i) = i;
        -
        -    std::cout << sum (v) << std::endl;
        -    std::cout << norm_1 (v) << std::endl;
        -    std::cout << norm_2 (v) << std::endl;
        -    std::cout << norm_inf (v) << std::endl;
        -    std::cout << index_norm_inf (v) << std::endl;
        -}
        -
        -

        Binary Reductions

        -

        Prototypes

        -
        -template<class E1, class E2, class F>
        -    struct vector_scalar_binary_traits {
        -        typedef typename F::result_type result_type;
        -    };
        -
        -    // inner_prod (v1, v2) = sum (v1 [i] * v2 [i])
        -    template<class E1, class E2>
        -    typename vector_scalar_binary_traits<E1, E2, vector_inner_prod<typename E1::value_type,
        -                                                                   typename E2::value_type,
        -                                                                   typename promote_traits<typename E1::value_type,
        -                                                                                           typename E2::value_type>::promote_type> >::result_type
        -    inner_prod (const vector_expression<E1> &e1,
        -                const vector_expression<E2> &e2);
        -
        -    template<class E1, class E2>
        -    typename vector_scalar_binary_traits<E1, E2, vector_inner_prod<typename E1::value_type,
        -                                                                   typename E2::value_type,
        -                                                                   typename type_traits<typename promote_traits<typename E1::value_type,
        -                                                                                                                typename E2::value_type>::promote_type>::precision_type> >::result_type
        -    prec_inner_prod (const vector_expression<E1> &e1,
        -                     const vector_expression<E2> &e2);
        -
        -

        Description

        -

        inner_prod computes the inner product of the vector -expressions. prec_inner_prod computes the double -precision inner product of the vector expressions.

        -

        Definition

        -

        Defined in the header vector_expression.hpp.

        -

        Type requirements

        - -

        Preconditions

        -
          -
        • e1 ().size () == e2 ().size ()
        • -
        -

        Complexity

        -

        Linear depending from the size of the vector expressions.

        -

        Examples

        -
        -#include <boost/numeric/ublas/vector.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    vector<double> v1 (3), v2 (3);
        -    for (unsigned i = 0; i < std::min (v1.size (), v2.size ()); ++ i)
        -        v1 (i) = v2 (i) = i;
        -
        -    std::cout << inner_prod (v1, v2) << std::endl;
        -}
        -
        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/vector_proxy.html b/libs/numeric/ublas/doc/vector_proxy.html deleted file mode 100644 index a8a7376cd..000000000 --- a/libs/numeric/ublas/doc/vector_proxy.html +++ /dev/null @@ -1,527 +0,0 @@ - - - - - - - - - -Vector Proxies - - -

        Vector Proxies

        -
        -

        Vector Range

        -

        Description

        -

        The templated class vector_range<V> allows -addressing a sub-range of a vector's element.

        -

        Example

        -
        -#include <boost/numeric/ublas/vector.hpp>
        -#include <boost/numeric/ublas/vector_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    vector<double> v (3);
        -    vector_range<vector<double> > vr (v, range (0, 3));
        -    for (unsigned i = 0; i < vr.size (); ++ i)
        -        vr (i) = i;
        -    std::cout << vr << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header vector_proxy.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        VThe type of vector referenced.
        -

        Model of

        -

        Vector Expression -.

        -

        If the specified range falls outside that of the index range of -the vector, then the vector_range is not a well formed -Vector Expression. That is, access to an element which is outside -of index range of the vector is undefined.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector Expression .

        -

        Public base classes

        -

        vector_expression<vector_range<V> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        vector_range (vector_type &data, const range -&r)Constructs a sub vector.
        size_type start () constReturns the start of the sub vector.
        size_type size () constReturns the size of the sub vector.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        reference operator () (size_type i)Returns a reference of the i-th element.
        const_reference operator [] (size_type i) -constReturns the value of the i-th element.
        reference operator [] (size_type i)Returns a reference of the i-th element.
        vector_range &operator = (const vector_range -&vr)The assignment operator.
        vector_range &assign_temporary (vector_range -&vr)Assigns a temporary. May change the vector range -vr .
        template<class AE>
        -vector_range &operator = (const vector_expression<AE> -&ae)
        The extended assignment operator.
        template<class AE>
        -vector_range &assign (const vector_expression<AE> -&ae)
        Assigns a vector expression to the sub vector. Left and right -hand side of the assignment should be independent.
        template<class AE>
        -vector_range &operator += (const vector_expression<AE> -&ae)
        A computed assignment operator. Adds the vector expression to -the sub vector.
        template<class AE>
        -vector_range &plus_assign (const vector_expression<AE> -&ae)
        Adds a vector expression to the sub vector. Left and right hand -side of the assignment should be independent.
        template<class AE>
        -vector_range &operator -= (const vector_expression<AE> -&ae)
        A computed assignment operator. Subtracts the vector expression -from the sub vector.
        template<class AE>
        -vector_range &minus_assign (const vector_expression<AE> -&ae)
        Subtracts a vector expression from the sub vector. Left and -right hand side of the assignment should be independent.
        template<class AT>
        -vector_range &operator *= (const AT &at)
        A computed assignment operator. Multiplies the sub vector with -a scalar.
        template<class AT>
        -vector_range &operator /= (const AT &at)
        A computed assignment operator. Divides the sub vector through -a scalar.
        void swap (vector_range &vr)Swaps the contents of the sub vectors.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the vector_range.
        const_iterator end () constReturns a const_iterator pointing to the end of -the vector_range.
        iterator begin ()Returns a iterator pointing to the beginning of -the vector_range.
        iterator end ()Returns a iterator pointing to the end of the -vector_range.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed vector_range.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed vector_range.
        reverse_iterator rbegin ()Returns a reverse_iterator pointing to the -beginning of the reversed vector_range.
        reverse_iterator rend ()Returns a reverse_iterator pointing to the end of -the reversed vector_range.
        -

        Simple Projections

        -

        Description

        -

        The free subrange functions support the construction -of vector ranges.

        -

        Prototypes

        -
        
        -    template<class V>
        -    vector_range<V> subrange (V &data,
        -       V::size_type start, V::size_type stop);
        -    template<class V>
        -    const vector_range<const V> subrange (const V &data,
        -       V::size_type start, V::size_type stop);
        -
        -

        Generic Projections

        -

        Description

        -

        The free project functions support the construction -of vector ranges. Existing matrix_range's can be composed with a further range. The resulting range is computed using this existing range's compose function.

        -

        Prototypes

        -
        
        -    template<class V>
        -    vector_range<V> project (V &data, const range &r);
        -    template<class V>
        -    const vector_range<const V> project (const V &data, const range &r);
        -    template<class V>
        -    vector_range<V> project (vector_range<V> &data, const range &r);
        -    template<class V>
        -    const vector_range<V> project (const vector_range<V> &data, const range &r);
        -
        -

        Definition

        -

        Defined in the header vector_proxy.hpp.

        -

        Type requirements

        - -

        Complexity

        -

        Linear depending from the size of the range.

        -

        Examples

        -
        -#include <boost/numeric/ublas/vector.hpp>
        -#include <boost/numeric/ublas/vector_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    vector<double> v (3);
        -    for (int i = 0; i < 3; ++ i)
        -        project (v, range (0, 3)) (i) = i;
        -    std::cout << project (v, range (0, 3)) << std::endl;
        -}
        -
        -

        Vector Slice

        -

        Description

        -

        The templated class vector_slice<V> allows -addressing a slice of a vector.

        -

        Example

        -
        -#include <boost/numeric/ublas/vector.hpp>
        -#include <boost/numeric/ublas/vector_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    vector<double> v (3);
        -    vector_slice<vector<double> > vs (v, slice (0, 1, 3));
        -    for (unsigned i = 0; i < vs.size (); ++ i)
        -        vs (i) = i;
        -    std::cout << vs << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header vector_proxy.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        VThe type of vector referenced.
        -

        Model of

        -

        Vector Expression -.

        -

        If the specified slice falls outside that of the index range of -the vector, then the vector_slice is not a well formed -Vector Expression. That is, access to an element which is outside -of index range of the vector is undefined.

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector Expression .

        -

        Public base classes

        -

        vector_expression<vector_slice<V> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        vector_slice (vector_type &data, const slice -&s)Constructs a sub vector.
        size_type size () constReturns the size of the sub vector.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        reference operator () (size_type i)Returns a reference of the i-th element.
        const_reference operator [] (size_type i) -constReturns the value of the i-th element.
        reference operator [] (size_type i)Returns a reference of the i-th element.
        vector_slice &operator = (const vector_slice -&vs)The assignment operator.
        vector_slice &assign_temporary (vector_slice -&vs)Assigns a temporary. May change the vector slice -vs .
        template<class AE>
        -vector_slice &operator = (const vector_expression<AE> -&ae)
        The extended assignment operator.
        template<class AE>
        -vector_slice &assign (const vector_expression<AE> -&ae)
        Assigns a vector expression to the sub vector. Left and right -hand side of the assignment should be independent.
        template<class AE>
        -vector_slice &operator += (const vector_expression<AE> -&ae)
        A computed assignment operator. Adds the vector expression to -the sub vector.
        template<class AE>
        -vector_slice &plus_assign (const vector_expression<AE> -&ae)
        Adds a vector expression to the sub vector. Left and right hand -side of the assignment should be independent.
        template<class AE>
        -vector_slice &operator -= (const vector_expression<AE> -&ae)
        A computed assignment operator. Subtracts the vector expression -from the sub vector.
        template<class AE>
        -vector_slice &minus_assign (const vector_expression<AE> -&ae)
        Subtracts a vector expression from the sub vector. Left and -right hand side of the assignment should be independent.
        template<class AT>
        -vector_slice &operator *= (const AT &at)
        A computed assignment operator. Multiplies the sub vector with -a scalar.
        template<class AT>
        -vector_slice &operator /= (const AT &at)
        A computed assignment operator. Divides the sub vector through -a scalar.
        void swap (vector_slice &vs)Swaps the contents of the sub vectors.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the vector_slice.
        const_iterator end () constReturns a const_iterator pointing to the end of -the vector_slice.
        iterator begin ()Returns a iterator pointing to the beginning of -the vector_slice.
        iterator end ()Returns a iterator pointing to the end of the -vector_slice.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed vector_slice.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed vector_slice.
        reverse_iterator rbegin ()Returns a reverse_iterator pointing to the -beginning of the reversed vector_slice.
        reverse_iterator rend ()Returns a reverse_iterator pointing to the end of -the reversed vector_slice.
        -

        Simple Projections

        -

        Description

        -

        The free subslice functions support the construction -of vector slices.

        -

        Prototypes

        -
        
        -    template<class V>
        -    vector_slice<V> subslice (V &data,
        -       V::size_type start, V::difference_type stride, V::size_type size);
        -    template<class V>
        -    const vector_slice<const V> subslice (const V &data,
        -       V::size_type start, V::difference_type stride, V::size_type size);
        -
        -

        Generic Projections

        -

        Description

        -

        The free project functions support the construction -of vector slices. Existing vector_slice's can be composed with a further range or slices. The resulting slice is computed using this existing slices's compose function.

        -

        Prototypes

        -
        
        -    template<class V>
        -    vector_slice<V> project (V &data, const slice &s);
        -    template<class V>
        -    const vector_slice<const V> project (const V &data, const slice &s);
        -    template<class V>
        -    vector_slice<V> project (vector_slice<V> &data, const range &r);
        -    template<class V>
        -    const vector_slice<V> project (const vector_slice<V> &data, const range &r);
        -    template<class V>
        -    vector_slice<V> project (vector_slice<V> &data, const slice &s);
        -    template<class V>
        -    const vector_slice<V> project (const vector_slice<V> &data, const slice &s);
        -
        -

        Definition

        -

        Defined in the header vector_proxy.hpp.

        -

        Type requirements

        - -

        Complexity

        -

        Linear depending from the size of the slice.

        -

        Examples

        -
        -#include <boost/numeric/ublas/vector.hpp>
        -#include <boost/numeric/ublas/vector_proxy.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    vector<double> v (3);
        -    for (int i = 0; i < 3; ++ i)
        -        project (v, slice (0, 1, 3)) (i) = i;
        -    std::cout << project (v, slice (0, 1, 3)) << std::endl;
        -}
        -
        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/doc/vector_sparse.html b/libs/numeric/ublas/doc/vector_sparse.html deleted file mode 100644 index 32279b0e9..000000000 --- a/libs/numeric/ublas/doc/vector_sparse.html +++ /dev/null @@ -1,800 +0,0 @@ - - - - - - - - - - - - -

        Sparse Vector

        -
        -

        Mapped Vector

        -

        Description

        -

        The templated class mapped_vector<T, A> is -the base container adaptor for sparse vectors using element maps. For a -n-dimensional sparse vector and 0 <= i < n -the non-zero elements vi are mapped to -consecutive elements of the associative container, i.e. for -elements k = -vi1and -k + 1 = -vi2of the -container holds i1 < -i2.

        -

        Example

        -
        -#include <boost/numeric/ublas/vector_sparse.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    mapped_vector<double> v (3, 3);
        -    for (unsigned i = 0; i < v.size (); ++ i)
        -        v (i) = i;
        -    std::cout << v << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header vector_sparse.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the mapped vector.
        AThe type of the adapted array. [1]map_std<std::size_t, T>
        -

        Model of

        -

        Vector .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector .

        -

        Public base classes

        -

        vector_container<mapped_vector<T, A> ->

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        mapped_vector ()Allocates a mapped_vector that holds zero -elements.
        mapped_vector (size_type size, size_type -non_zeros = 0)Allocates a mapped_vector that holds at most -size elements.
        mapped_vector (const mapped_vector &v)The copy constructor.
        template<class AE>
        -mapped_vector (size_type non_zeros, const -vector_expression<AE> &ae)
        The extended copy constructor.
        void resize (size_type size, bool -preserve = true)Reallocates a mapped_vector to hold at most -size elements. The existing elements of the -mapped_vector are preseved when specified.
        size_type size () constReturns the size of the mapped_vector.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        reference operator () (size_type i)Returns a reference of the i-th element.
        const_reference operator [] (size_type i) -constReturns the value of the i-th element.
        reference operator [] (size_type i)Returns a reference of the i-th element.
        mapped_vector &operator = (const mapped_vector -&v)The assignment operator.
        mapped_vector &assign_temporary (mapped_vector -&v)Assigns a temporary. May change the mapped vector -v .
        template<class AE>
        -mapped_vector &operator = (const vector_expression<AE> -&ae)
        The extended assignment operator.
        template<class AE>
        -mapped_vector &assign (const vector_expression<AE> -&ae)
        Assigns a vector expression to the mapped vector. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -mapped_vector &operator += (const vector_expression<AE> -&ae)
        A computed assignment operator. Adds the vector expression to -the mapped vector.
        template<class AE>
        -mapped_vector &plus_assign (const vector_expression<AE> -&ae)
        Adds a vector expression to the mapped vector. Left and right -hand side of the assignment should be independent.
        template<class AE>
        -mapped_vector &operator -= (const vector_expression<AE> -&ae)
        A computed assignment operator. Subtracts the vector expression -from the mapped vector.
        template<class AE>
        -mapped_vector &minus_assign (const vector_expression<AE> -&ae)
        Subtracts a vector expression from the mapped vector. Left and -right hand side of the assignment should be independent.
        template<class AT>
        -mapped_vector &operator *= (const AT &at)
        A computed assignment operator. Multiplies the mapped vector -with a scalar.
        template<class AT>
        -mapped_vector &operator /= (const AT &at)
        A computed assignment operator. Divides the mapped vector -through a scalar.
        void swap (mapped_vector &v)Swaps the contents of the mapped vectors.
        true_reference insert_element (size_type i, const_reference t)Inserts the value t at the i-th -element. Duplicates elements are not allowed.
        void erase_element (size_type i)Erases the value at the i-th element.
        void clear ()Clears the mapped vector.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the mapped_vector.
        const_iterator end () constReturns a const_iterator pointing to the end of -the mapped_vector.
        iterator begin ()Returns a iterator pointing to the beginning of -the mapped_vector.
        iterator end ()Returns a iterator pointing to the end of the -mapped_vector.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed mapped_vector.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed mapped_vector.
        reverse_iterator rbegin ()Returns a reverse_iterator pointing to the -beginning of the reversed mapped_vector.
        reverse_iterator rend ()Returns a reverse_iterator pointing to the end of -the reversed mapped_vector.
        -

        Notes

        -

        [1] Supported -parameters for the adapted array are -map_array<std::size_t, T> and -map_std<std::size_t, T>. The latter is -equivalent to std::map<std::size_t, T>.

        -

        Compressed Vector

        -

        Description

        -

        The templated class compressed_vector<T, IB, IA, -TA> is the base container adaptor for compressed vectors. -For a n-dimensional compressed vector and 0 <= i -< n the non-zero elements vi -are mapped to consecutive elements of the index and value -container, i.e. for elements k = -vi1and -k + 1 = -vi2of these -containers holds i1 < -i2.

        -

        Example

        -
        -#include <boost/numeric/ublas/vector_sparse.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    compressed_vector<double> v (3, 3);
        -    for (unsigned i = 0; i < v.size (); ++ i)
        -        v (i) = i;
        -    std::cout << v << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header vector_sparse.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the compressed vector.
        IBThe index base of the compressed vector. [1]0
        IAThe type of the adapted array for indices. [2]unbounded_array<std::size_t>
        TAThe type of the adapted array for values. [2]unbounded_array<T>
        -

        Model of

        -

        Vector .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector .

        -

        Public base classes

        -

        vector_container<compressed_vector<T, IB, IA, -TA> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        compressed_vector ()Allocates a compressed_vector that holds zero -elements.
        compressed_vector (size_type size, size_type -non_zeros)Allocates a compressed_vector that holds at most -size elements.
        compressed_vector (const compressed_vector -&v)The copy constructor.
        template<class AE>
        -compressed_vector (size_type non_zeros, const -vector_expression<AE> &ae)
        The extended copy constructor.
        void resize (size_type size, bool -preserve = true)Reallocates a compressed_vector to hold at most -size elements. The existing elements of the -compress_vector are preseved when specified.
        size_type size () constReturns the size of the compressed_vector.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        reference operator () (size_type i)Returns a reference of the i-th element.
        const_reference operator [] (size_type i) -constReturns the value of the i-th element.
        reference operator [] (size_type i)Returns a reference of the i-th element.
        compressed_vector &operator = (const -compressed_vector &v)The assignment operator.
        compressed_vector &assign_temporary -(compressed_vector &v)Assigns a temporary. May change the compressed vector -v.
        template<class AE>
        -compressed_vector &operator = (const -vector_expression<AE> &ae)
        The extended assignment operator.
        template<class AE>
        -compressed_vector &assign (const vector_expression<AE> -&ae)
        Assigns a vector expression to the compressed vector. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -compressed_vector &operator += (const -vector_expression<AE> &ae)
        A computed assignment operator. Adds the vector expression to -the compressed vector.
        template<class AE>
        -compressed_vector &plus_assign (const -vector_expression<AE> &ae)
        Adds a vector expression to the compressed vector. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -compressed_vector &operator -= (const -vector_expression<AE> &ae)
        A computed assignment operator. Subtracts the vector expression -from the compressed vector.
        template<class AE>
        -compressed_vector &minus_assign (const -vector_expression<AE> &ae)
        Subtracts a vector expression from the compressed vector. Left -and right hand side of the assignment should be independent.
        template<class AT>
        -compressed_vector &operator *= (const AT &at)
        A computed assignment operator. Multiplies the compressed -vector with a scalar.
        template<class AT>
        -compressed_vector &operator /= (const AT &at)
        A computed assignment operator. Divides the compressed vector -through a scalar.
        void swap (compressed_vector &v)Swaps the contents of the compressed vectors.
        true_reference insert_element (size_type i, const_reference t)Inserts the value t at the i-th -element. Duplicates elements are not allowed.
        void erase_element (size_type i)Erases the value at the i-th element.
        void clear ()Clears the compressed vector.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the compressed_vector.
        const_iterator end () constReturns a const_iterator pointing to the end of -the compressed_vector.
        iterator begin ()Returns a iterator pointing to the beginning of -the compressed_vector.
        iterator end ()Returns a iterator pointing to the end of the -compressed_vector.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed compressed_vector.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed compressed_vector.
        reverse_iterator rbegin ()Returns a reverse_iterator pointing to the -beginning of the reversed compressed_vector.
        reverse_iterator rend ()Returns a reverse_iterator pointing to the end of -the reversed compressed_vector.
        -

        Notes

        -

        [1] -Supported parameters for the index base are 0 and -1 at least.

        -

        [2] -Supported parameters for the adapted array are -unbounded_array<> , -bounded_array<> and -std::vector<> .

        -

        Coordinate Vector

        -

        Description

        -

        The templated class coordinate_vector<T, IB, IA, -TA> is the base container adaptor for compressed vectors. -For a n-dimensional sorted coordinate vector and 0 -<= i < n the non-zero elements -vi are mapped to consecutive elements -of the index and value container, i.e. for elements k = -vi1and -k + 1 = -vi2of these -containers holds i1 < -i2.

        -

        Example

        -
        -#include <boost/numeric/ublas/vector_sparse.hpp>
        -#include <boost/numeric/ublas/io.hpp>
        -
        -int main () {
        -    using namespace boost::numeric::ublas;
        -    coordinate_vector<double> v (3, 3);
        -    for (unsigned i = 0; i < v.size (); ++ i)
        -        v (i) = i;
        -    std::cout << v << std::endl;
        -}
        -
        -

        Definition

        -

        Defined in the header vector_sparse.hpp.

        -

        Template parameters

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        ParameterDescriptionDefault
        TThe type of object stored in the coordinate vector.
        IBThe index base of the coordinate vector. [1]0
        IAThe type of the adapted array for indices. [2]unbounded_array<std::size_t>
        TAThe type of the adapted array for values. [2]unbounded_array<T>
        -

        Model of

        -

        Vector .

        -

        Type requirements

        -

        None, except for those imposed by the requirements of Vector .

        -

        Public base classes

        -

        vector_container<coordinate_vector<T, IB, IA, -TA> >

        -

        Members

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        MemberDescription
        coordinate_vector ()Allocates a coordinate_vector that holds zero -elements.
        coordinate_vector (size_type size, size_type -non_zeros)Allocates a coordinate_vector that holds at most -size elements.
        coordinate_vector (const coordinate_vector -&v)The copy constructor.
        template<class AE>
        -coordinate_vector (size_type non_zeros, const -vector_expression<AE> &ae)
        The extended copy constructor.
        void resize (size_type size, bool -preserve = true)Reallocates a coordinate_vector to hold at most -size elements. The existing elements of the -coordinate_vector are preseved when specified.
        size_type size () constReturns the size of the coordinate_vector.
        const_reference operator () (size_type i) -constReturns the value of the i-th element.
        reference operator () (size_type i)Returns a reference of the i-th element.
        const_reference operator [] (size_type i) -constReturns the value of the i-th element.
        reference operator [] (size_type i)Returns a reference of the i-th element.
        coordinate_vector &operator = (const -coordinate_vector &v)The assignment operator.
        coordinate_vector &assign_temporary -(coordinate_vector &v)Assigns a temporary. May change the coordinate vector -v.
        template<class AE>
        -coordinate_vector &operator = (const -vector_expression<AE> &ae)
        The extended assignment operator.
        template<class AE>
        -coordinate_vector &assign (const vector_expression<AE> -&ae)
        Assigns a vector expression to the coordinate vector. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -coordinate_vector &operator += (const -vector_expression<AE> &ae)
        A computed assignment operator. Adds the vector expression to -the coordinate vector.
        template<class AE>
        -coordinate_vector &plus_assign (const -vector_expression<AE> &ae)
        Adds a vector expression to the coordinate vector. Left and -right hand side of the assignment should be independent.
        template<class AE>
        -coordinate_vector &operator -= (const -vector_expression<AE> &ae)
        A computed assignment operator. Subtracts the vector expression -from the coordinate vector.
        template<class AE>
        -coordinate_vector &minus_assign (const -vector_expression<AE> &ae)
        Subtracts a vector expression from the coordinate vector. Left -and right hand side of the assignment should be independent.
        template<class AT>
        -coordinate_vector &operator *= (const AT &at)
        A computed assignment operator. Multiplies the coordinate -vector with a scalar.
        template<class AT>
        -coordinate_vector &operator /= (const AT &at)
        A computed assignment operator. Divides the coordinate vector -through a scalar.
        void swap (coordinate_vector &v)Swaps the contents of the coordinate vectors.
        true_reference insert_element (size_type i, const_reference t)Inserts the value t at the i-th -element. Duplicates elements are not allowed.
        void append_element (size_type i, size_type j, const_reference t)Appends the value t at the i-th element. -Duplicate elements can be appended to a coordinate_vector. They are merged into a single -arithmetically summed element by the sort function.
        void erase_element (size_type i)Erases the value at the i-th element.
        void clear ()Clears the coordinate vector.
        const_iterator begin () constReturns a const_iterator pointing to the beginning -of the coordinate_vector.
        const_iterator end () constReturns a const_iterator pointing to the end of -the coordinate_vector.
        iterator begin ()Returns a iterator pointing to the beginning of -the coordinate_vector.
        iterator end ()Returns a iterator pointing to the end of the -coordinate_vector.
        const_reverse_iterator rbegin () constReturns a const_reverse_iterator pointing to the -beginning of the reversed coordinate_vector.
        const_reverse_iterator rend () constReturns a const_reverse_iterator pointing to the -end of the reversed coordinate_vector.
        reverse_iterator rbegin ()Returns a reverse_iterator pointing to the -beginning of the reversed coordinate_vector.
        reverse_iterator rend ()Returns a reverse_iterator pointing to the end of -the reversed coordinate_vector.
        -

        Notes

        -

        [1] -Supported parameters for the index base are 0 and -1 at least.

        -

        [2] -Supported parameters for the adapted array are -unbounded_array<> , -bounded_array<> and -std::vector<> .

        -
        -

        Copyright (©) 2000-2002 Joerg Walter, Mathias Koch
        - 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 - ). -

        - - - diff --git a/libs/numeric/ublas/index.html b/libs/numeric/ublas/index.html deleted file mode 100644 index 16cd00158..000000000 --- a/libs/numeric/ublas/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - -Automatic redirection failed, please go to -doc/index.html  
        -

        Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at www.boost.org/LICENSE_1_0.txt)

        - - diff --git a/libs/numeric/ublas/meta/libraries.json b/libs/numeric/ublas/meta/libraries.json deleted file mode 100644 index 68be73760..000000000 --- a/libs/numeric/ublas/meta/libraries.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "key": "numeric/ublas", - "name": "uBLAS", - "authors": [ - "Joerg Walter", - "Mathias Koch" - ], - "description": "uBLAS provides matrix and vector classes as well as basic linear algebra routines. Several dense, packed and sparse storage schemes are supported.", - "category": [ - "Math" - ], - "maintainers": [ - "David Bellot " - ] -} diff --git a/libs/numeric/ublas/test/Jamfile.v2 b/libs/numeric/ublas/test/Jamfile.v2 deleted file mode 100644 index bd4092e1c..000000000 --- a/libs/numeric/ublas/test/Jamfile.v2 +++ /dev/null @@ -1,222 +0,0 @@ -# Copyright (c) 2004-2011 Michael Stevens, David Bellot -# 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) - -# Bring in rules for testing -import testing ; - -# Define features to test: -# Value types: USE_FLOAT USE_DOUBLE USE_STD_COMPLEX -# Proxies: USE_RANGE USE_SLICE -# Storage types: USE_BOUNDED_ARRAY USE_UNBOUNDED_ARRAY -# Vector types: USE_STD_VECTOR USE_BOUNDED_VECTOR -# Matrix types: USE_MATRIX USE_BOUNDED_MATRIX USE_VECTOR_OF_VECTOR -# Adaptors: USE_ADAPTOR - -UBLAS_TESTSET = [ modules.peek : UBLAS_TESTSET ] ; -UBLAS_TESTSET ?= - USE_DOUBLE USE_STD_COMPLEX - USE_RANGE USE_SLICE - USE_UNBOUNDED_ARRAY USE_STD_VECTOR USE_BOUNDED_VECTOR USE_MATRIX - ; - -# Sparse storage: USE_MAP_ARRAY USE_STD_MAP -# Sparse vectors: USE_MAPPED_VECTOR USE_COMPRESSED_VECTOR USE_COORDINATE_VECTOR -# Sparse matrices: USE_MAPPED_MATRIX USE_COMPRESSED_MATRIX USE_COORDINATE_MATRIX USE_MAPPED_VECTOR_OF_MAPPED_VECTOR USE_GENERALIZED_VECTOR_OF_VECTOR - -UBLAS_TESTSET_SPARSE = [ modules.peek : UBLAS_TESTSET_SPARSE ] ; -UBLAS_TESTSET_SPARSE ?= - USE_DOUBLE USE_STD_COMPLEX - # USE_RANGE USE_SLICE # Too complex for regression testing - USE_UNBOUNDED_ARRAY - USE_MAP_ARRAY USE_STD_MAP - USE_MAPPED_VECTOR USE_COMPRESSED_VECTOR - USE_MAPPED_MATRIX USE_COMPRESSED_MATRIX - ; -# Generalize VofV still failing -# USE_GENERALIZED_VECTOR_OF_VECTOR - -UBLAS_TESTSET_SPARSE_COO = [ modules.peek : UBLAS_TESTSET_SPARSE_COO ] ; -UBLAS_TESTSET_SPARSE_COO ?= - USE_DOUBLE USE_STD_COMPLEX - USE_UNBOUNDED_ARRAY - USE_COORDINATE_VECTOR - USE_COORDINATE_MATRIX - ; - - -# Project settings -project - : requirements - BOOST_UBLAS_NO_EXCEPTIONS - vacpp:"BOOST_UBLAS_NO_ELEMENT_PROXIES" - ; - - -test-suite numeric/uBLAS - : [ run test1.cpp - test11.cpp - test12.cpp - test13.cpp - : # args - : # input files - : # requirements - $(UBLAS_TESTSET) - ] - [ run test2.cpp - test21.cpp - test22.cpp - test23.cpp - : : : - $(UBLAS_TESTSET) - ] - [ run test3.cpp - test31.cpp - test32.cpp - test33.cpp - : : : - $(UBLAS_TESTSET_SPARSE) - ] - [ run test3.cpp - test31.cpp - test32.cpp - test33.cpp - : : : - $(UBLAS_TESTSET_SPARSE_COO) - : test3_coo - : - ] - [ run test3.cpp - test31.cpp - test32.cpp - test33.cpp - : : : - USE_FLOAT - USE_DOUBLE - USE_STD_COMPLEX - USE_STD_MAP - USE_MAPPED_VECTOR_OF_MAPPED_VECTOR - : test3_mvov - : - ] - [ run test4.cpp - test42.cpp - test43.cpp - : : : - $(UBLAS_TESTSET) - ] - [ run test5.cpp - test52.cpp - test53.cpp - : : : - $(UBLAS_TESTSET) - ] - [ run test6.cpp - test62.cpp - test63.cpp - : : : - $(UBLAS_TESTSET) - ] -# Test commented out because boost::interval does not behave like a scalar type -# [ run test7.cpp -# test71.cpp -# test72.cpp -# test73.cpp -# : : : -# BOOST_UBLAS_USE_INTERVAL -# $(UBLAS_TESTSET) -# ] - - [ run placement_new.cpp - ] - [ compile concepts.cpp - : # requirements - EXTERNAL -# INTERAL -# SKIP_BAD - intel-linux:"-Xc" - darwin:"-fabi-version=0" - ] - [ run test_lu.cpp - ] - [ run triangular_access.cpp - : : : - NOMESSAGES - ] - [ run triangular_layout.cpp - ] - [ run comp_mat_erase.cpp - ] - [ run sparse_view_test.cpp - ] - [ run begin_end.cpp - ] - [ run num_columns.cpp - ] - [ run num_rows.cpp - ] - [ run size.cpp - ] - [ run test_coordinate_matrix_sort.cpp - ] - [ run test_coordinate_matrix_sort.cpp - : - : - : BOOST_UBLAS_COO_ALWAYS_DO_FULL_SORT - : test_coordinate_matrix_always_do_full_sort - : - ] - [ run test_complex_norms.cpp - ] - [ run test_assignment.cpp - : : : BOOST_UBLAS_COO_ALWAYS_DO_FULL_SORT - : : - ] - [ run test_triangular.cpp - : - : - : /boost/timer//boost_timer - ] - [ run test_ticket7296.cpp - ] - [ run test_inplace_solve.cpp - : - : - : $(UBLAS_TESTSET) - : test_inplace_solve_basic - : - ] - [ run test_inplace_solve.cpp - : - : - : $(UBLAS_TESTSET_SPARSE) $(UBLAS_TESTSET_SPARSE_COO) - : test_inplace_solve_sparse - : - ] - [ run test_inplace_solve.cpp - : - : - : USE_MAPPED_VECTOR_OF_MAPPED_VECTOR - : test_inplace_solve_mvov - : - ] - [ run test_coordinate_vector_inplace_merge.cpp - ] - [ run test_coordinate_matrix_inplace_merge.cpp - ] - [ run test_banded_storage_layout.cpp - : - : - : - : - : - ] - [ run test_fixed_containers.cpp - : - : - : - ] - [ run test_matrix_vector.cpp - ] - ; diff --git a/libs/numeric/ublas/test/README b/libs/numeric/ublas/test/README deleted file mode 100644 index 761123141..000000000 --- a/libs/numeric/ublas/test/README +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2000-2011 Joerg Walter, Mathias Koch, David Bellot - -Distributed under the Boost Software License, Version 1.0. (See -accompanying file LICENSE_1_0.txt or copy at -http://www.boost.org/LICENSE_1_0.txt) - -uBLAS test director - Use boost::test to test various uBLAS containers and expressions - -The tests can be used individually or automaticaly as part of the uBLAS regression tests. - -The tests are broken down in directorys as follows: - -test1 - dense vector and matrix tests -test2 - BLAS tests -test3 - sparse vector and matrix tests -test4 - banded/diagonal matrix tests -test5 - triangular matrix tests -test6 - symmetric matrix tests -test7 - dense vector and matrix tests with boost::numeric::internal values - -Each test directory contains: - testX.hpp Headers and types to be tested - testX.cpp Call the test functions for the defined types - testX1.cpp Implements vector tests - testX2.cpp Implements vector/matrix tests - testX3.cpp Implements matrix tests - -Missing in these tests - a) Runtime result validation. - b) Iterator interface tests. Only complete container expressions are tested diff --git a/libs/numeric/ublas/test/begin_end.cpp b/libs/numeric/ublas/test/begin_end.cpp deleted file mode 100644 index 769a51faf..000000000 --- a/libs/numeric/ublas/test/begin_end.cpp +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright (c) 2011 David Bellot -// -// Distributed under the 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "utils.hpp" - - -static const double TOL(1.0e-5); ///< Used for comparing two real numbers. - -#ifdef BOOST_UBLAS_NO_NESTED_CLASS_RELATION -#error "sorry this feature is not supported by your compiler" -#endif - -BOOST_UBLAS_TEST_DEF( test_vector_iteration ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Vector Iteration" ); - - typedef double value_type; - typedef boost::numeric::ublas::vector vector_type; - - vector_type v(5); - - v(0) = 0.555950; - v(1) = 0.108929; - v(2) = 0.948014; - v(3) = 0.023787; - v(4) = 1.023787; - - - vector_type::size_type ix = 0; - for ( - boost::numeric::ublas::iterator_type::type it = boost::numeric::ublas::begin(v); - it != boost::numeric::ublas::end(v); - ++it - ) { - BOOST_UBLAS_DEBUG_TRACE( "*it = " << *it << " ==> " << v(ix) ); - BOOST_UBLAS_TEST_CHECK( std::abs(*it - v(ix)) <= TOL ); - ++ix; - } -} - - -BOOST_UBLAS_TEST_DEF( test_vector_const_iteration ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Vector Const Iteration" ); - - typedef double value_type; - typedef boost::numeric::ublas::vector vector_type; - - vector_type v(5); - - v(0) = 0.555950; - v(1) = 0.108929; - v(2) = 0.948014; - v(3) = 0.023787; - v(4) = 1.023787; - - - vector_type::size_type ix = 0; - for ( - boost::numeric::ublas::const_iterator_type::type it = boost::numeric::ublas::begin(v); - it != boost::numeric::ublas::end(v); - ++it - ) { - BOOST_UBLAS_DEBUG_TRACE( "*it = " << *it << " ==> " << v(ix) ); - BOOST_UBLAS_TEST_CHECK( std::abs(*it - v(ix)) <= TOL ); - ++ix; - } -} - - -BOOST_UBLAS_TEST_DEF( test_row_major_matrix_iteration ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Row-major Matrix Iteration" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - typedef boost::numeric::ublas::iterator_type::type outer_iterator_type; - typedef boost::numeric::ublas::iterator_type::type inner_iterator_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - matrix_type::size_type row(0); - for ( - outer_iterator_type outer_it = boost::numeric::ublas::begin(A); - outer_it != boost::numeric::ublas::end(A); - ++outer_it - ) { - matrix_type::size_type col(0); - - for ( - inner_iterator_type inner_it = boost::numeric::ublas::begin(outer_it); - inner_it != boost::numeric::ublas::end(outer_it); - ++inner_it - ) { - BOOST_UBLAS_DEBUG_TRACE( "*it = " << *inner_it << " ==> " << A(row,col) ); - BOOST_UBLAS_TEST_CHECK( std::abs(*inner_it - A(row,col)) <= TOL ); - - ++col; - } - - ++row; - } -} - - -BOOST_UBLAS_TEST_DEF( test_col_major_matrix_iteration ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Column-major Matrix Iteration" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - typedef boost::numeric::ublas::iterator_type::type outer_iterator_type; - typedef boost::numeric::ublas::iterator_type::type inner_iterator_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - matrix_type::size_type col(0); - for ( - outer_iterator_type outer_it = boost::numeric::ublas::begin(A); - outer_it != boost::numeric::ublas::end(A); - ++outer_it - ) { - matrix_type::size_type row(0); - - for ( - inner_iterator_type inner_it = boost::numeric::ublas::begin(outer_it); - inner_it != boost::numeric::ublas::end(outer_it); - ++inner_it - ) { - BOOST_UBLAS_DEBUG_TRACE( "*it = " << *inner_it << " ==> " << A(row,col) ); - BOOST_UBLAS_TEST_CHECK( std::abs(*inner_it - A(row,col)) <= TOL ); - - ++row; - } - - ++col; - } -} - - -int main() -{ - BOOST_UBLAS_TEST_BEGIN(); - - BOOST_UBLAS_TEST_DO( test_vector_iteration ); - BOOST_UBLAS_TEST_DO( test_vector_const_iteration ); - BOOST_UBLAS_TEST_DO( test_row_major_matrix_iteration ); - BOOST_UBLAS_TEST_DO( test_col_major_matrix_iteration ); - - BOOST_UBLAS_TEST_END(); -} diff --git a/libs/numeric/ublas/test/common/init.hpp b/libs/numeric/ublas/test/common/init.hpp deleted file mode 100644 index a9691b4ed..000000000 --- a/libs/numeric/ublas/test/common/init.hpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2004 Michael Stevens - * 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) - */ - -/* - * Default construct test when possible - */ - -template -struct default_construct -{ - static void test() {} -}; -template -struct default_construct > -{ - static void test () - { - VC default_constuct; - initialize_vector (default_constuct); - std::cout << "default construct = " << default_constuct << std::endl; - } -}; -template -struct default_construct > -{ - static void test () - { - MC default_constuct; - initialize_vector (default_constuct); - std::cout << "default construct = " << default_constuct << std::endl; - } -}; - -/* - * Initialise test values in vector/matrix - */ - -template -void initialize_vector (V &v) { - typename V::size_type size = v.size (); - for (typename V::size_type i = 0; i < size; ++ i) - v [i] = typename V::value_type ( i + 1.f ); -} - -template -void initialize_matrix_impl (M &m, ublas::packed_proxy_tag) { - typename M::size_type size1 = m.size1 (); -#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION - for (typename M::iterator1 i = m.begin1(); i != m.end1(); ++ i) - for (typename M::iterator2 j = i.begin(); j != i.end(); ++ j) - *j = typename M::value_type ( i.index1() * size1 + j.index2() + 1.f ); -#else - for (typename M::iterator1 i = m.begin1(); i != m.end1(); ++ i) - for (typename M::iterator2 j = ublas::begin (i, ublas::iterator1_tag ()); j != ublas::end (i, ublas::iterator1_tag ()); ++ j) - *j = typename M::value_type ( i.index1() * size1 + j.index2() + 1.f ); -#endif -} - -template -void initialize_matrix_impl (M &m, ublas::sparse_proxy_tag) { - typename M::size_type size1 = m.size1 (); - typename M::size_type size2 = m.size2 (); - for (typename M::size_type i = 0; i < size1; ++ i) - for (typename M::size_type j = 0; j < size2; ++ j) - m (i, j) = typename M::value_type (i * size1 + j + 1.f); -} - -template -void initialize_matrix (M &m) { - initialize_matrix_impl (m, typename M::storage_category()); -} - -template -void initialize_matrix (M &m, ublas::lower_tag) { - typename M::size_type size1 = m.size1 (); - typename M::size_type size2 = m.size2 (); - for (typename M::size_type i = 0; i < size1; ++ i) { - typename M::size_type j = 0; - for (; j <= i; ++ j) - m (i, j) = i * size1 + j + 1.f; - for (; j < size2; ++ j) - m (i, j) = 0.f; - } -} -template -void initialize_matrix (M &m, ublas::upper_tag) { - typename M::size_type size1 = m.size1 (); - typename M::size_type size2 = m.size2 (); - for (typename M::size_type i = 0; i < size1; ++ i) { - typename M::size_type j = 0; - for (; j < i; ++ j) - m (i, j) = 0.f; - for (; j < size2; ++ j) - m (i, j) = i * size1 + j + 1.f; - } -} diff --git a/libs/numeric/ublas/test/common/testhelper.hpp b/libs/numeric/ublas/test/common/testhelper.hpp deleted file mode 100644 index b554511fa..000000000 --- a/libs/numeric/ublas/test/common/testhelper.hpp +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright 2008 Gunter Winkler -// Distributed under the 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 _HPP_TESTHELPER_ -#define _HPP_TESTHELPER_ - -#include -#include -#include -#include - -static unsigned _success_counter = 0; -static unsigned _fail_counter = 0; - -static inline -void assertTrue(const char* message, bool condition) { -#ifndef NOMESSAGES - std::cout << message; -#endif - if ( condition ) { - ++ _success_counter; - std::cout << "1\n"; // success - } else { - ++ _fail_counter; - std::cout << "0\n"; // failed - } -} - -template < class T > -void assertEquals(const char* message, T expected, T actual) { -#ifndef NOMESSAGES - std::cout << message; -#endif - if ( expected == actual ) { - ++ _success_counter; - std::cout << "1\n"; // success - } else { - #ifndef NOMESSAGES - std::cout << " expected " << expected << " actual " << actual << " "; - #endif - ++ _fail_counter; - std::cout << "0\n"; // failed - } -} - -inline static -std::pair getResults() { - return std::make_pair(_success_counter, _fail_counter); -} - -template < class M1, class M2 > -bool compare( const boost::numeric::ublas::matrix_expression & m1, - const boost::numeric::ublas::matrix_expression & m2 ) { - if ((m1().size1() != m2().size1()) || - (m1().size2() != m2().size2())) { - return false; - } - - size_t size1 = m1().size1(); - size_t size2 = m1().size2(); - for (size_t i=0; i < size1; ++i) { - for (size_t j=0; j < size2; ++j) { - if ( m1()(i,j) != m2()(i,j) ) return false; - } - } - return true; -} - -template < class M1, class M2 > -bool compare( const boost::numeric::ublas::vector_expression & m1, - const boost::numeric::ublas::vector_expression & m2 ) { - if (m1().size() != m2().size()) { - return false; - } - - size_t size = m1().size(); - for (size_t i=0; i < size; ++i) { - if ( m1()(i) != m2()(i) ) return false; - } - return true; -} - -// Compare if two matrices or vectors are equals based on distance. - -template -typename AE::value_type mean_square(const boost::numeric::ublas::matrix_expression &me) { - typename AE::value_type s(0); - typename AE::size_type i, j; - for (i=0; i!= me().size1(); i++) { - for (j=0; j!= me().size2(); j++) { - s += boost::numeric::ublas::scalar_traits::type_abs(me()(i,j)); - } - } - return s / (me().size1() * me().size2()); -} - -template -typename AE::value_type mean_square(const boost::numeric::ublas::vector_expression &ve) { - // We could have use norm2 here, but ublas' ABS does not support unsigned types. - typename AE::value_type s(0); - typename AE::size_type i; - for (i=0; i!= ve().size(); i++) { - s += boost::numeric::ublas::scalar_traits::type_abs(ve()(i)); - } - return s / ve().size(); -} - -template < class M1, class M2 > -bool compare_to( const boost::numeric::ublas::matrix_expression & m1, - const boost::numeric::ublas::matrix_expression & m2, - double tolerance = 0.0 ) { - if ((m1().size1() != m2().size1()) || - (m1().size2() != m2().size2())) { - return false; - } - - return mean_square(m2() - m1()) <= tolerance; -} - -template < class M1, class M2 > -bool compare_to( const boost::numeric::ublas::vector_expression & m1, - const boost::numeric::ublas::vector_expression & m2, - double tolerance = 0.0 ) { - if (m1().size() != m2().size()) { - return false; - } - - return mean_square(m2() - m1()) <= tolerance; -} - - -#endif diff --git a/libs/numeric/ublas/test/comp_mat_erase.cpp b/libs/numeric/ublas/test/comp_mat_erase.cpp deleted file mode 100644 index 70018908d..000000000 --- a/libs/numeric/ublas/test/comp_mat_erase.cpp +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (c) 2011 David Bellot -// -// Distributed under the 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 - -#define BOOST_TEST_MODULE SparseMatrixErasureTest -#include - - -BOOST_AUTO_TEST_CASE( compressed_matrix_erase_after_end ) -{ - boost::numeric::ublas::compressed_matrix A(2, 2); - - BOOST_CHECK_EQUAL( A.filled1(), (std::size_t) 1 ); - BOOST_CHECK_EQUAL( A.index1_data()[0], (std::size_t) 0 ); - - A(0,0) = 1; - - BOOST_CHECK_EQUAL( A.nnz(), (std::size_t) 1 ); - BOOST_CHECK_EQUAL( A.filled1(), (std::size_t) 2 ); - - // check new element - BOOST_CHECK_EQUAL( A.index1_data()[0], (std::size_t) 0 ); - BOOST_CHECK_EQUAL( A.index2_data()[0], (std::size_t) 0 ); - BOOST_CHECK_EQUAL( A.value_data()[0], 1 ); - // check end of list marker - BOOST_CHECK_EQUAL( A.index1_data()[1], (std::size_t) 1 ); - - A.erase_element(1,0); - - BOOST_CHECK_EQUAL( A.nnz(), (std::size_t) 1 ); - BOOST_CHECK_EQUAL( A.filled1(), (std::size_t) 2 ); - BOOST_CHECK_EQUAL( A.filled2(), (std::size_t) 1 ); - - // check new element - BOOST_CHECK_EQUAL( A.index1_data()[0], (std::size_t) 0 ); - BOOST_CHECK_EQUAL( A.index2_data()[0], (std::size_t) 0 ); - BOOST_CHECK_EQUAL( A.value_data()[0], 1 ); - // check end of list marker - BOOST_CHECK_EQUAL( A.index1_data()[1], (std::size_t) 1 ); - - A.erase_element(0,0); - - BOOST_CHECK_EQUAL( A.nnz(), (std::size_t) 0 ); - BOOST_CHECK_EQUAL( A.filled1(), (std::size_t) 2 ); - BOOST_CHECK_EQUAL( A.filled2(),(std::size_t) 0 ); - BOOST_CHECK_EQUAL( A.index1_data()[0], (std::size_t) 0 ); - -} - -BOOST_AUTO_TEST_CASE( compressed_matrix_erase_in_the_middle ) -{ - boost::numeric::ublas::compressed_matrix A(2, 2); - - BOOST_CHECK_EQUAL( A.filled1(), (std::size_t) 1 ); - BOOST_CHECK_EQUAL( A.filled2(), (std::size_t) 0 ); - BOOST_CHECK_EQUAL( A.index1_data()[0], (std::size_t) 0 ); - - A.insert_element(0,1,5); - - BOOST_CHECK_EQUAL( A.filled1(), (std::size_t) 2 ); - BOOST_CHECK_EQUAL( A.filled2(), (std::size_t) 1 ); - - // check new element - BOOST_CHECK_EQUAL( A.index1_data()[0], (std::size_t) 0 ); - BOOST_CHECK_EQUAL( A.index2_data()[0], (std::size_t) 1 ); - BOOST_CHECK_EQUAL( A.value_data()[0], 5 ); - // check end of list marker - BOOST_CHECK_EQUAL( A.index1_data()[1], (std::size_t) 1 ); - - A.insert_element(0,0,4); - - BOOST_CHECK_EQUAL( A.filled1(), (std::size_t) 2 ); - BOOST_CHECK_EQUAL( A.filled2(), (std::size_t) 2 ); - - // check new element - BOOST_CHECK_EQUAL( A.index2_data()[0], (std::size_t) 0 ); - BOOST_CHECK_EQUAL( A.value_data()[0], 4 ); - // check previous element - BOOST_CHECK_EQUAL( A.index2_data()[1], (std::size_t) 1 ); - BOOST_CHECK_EQUAL( A.value_data()[1], 5 ); - // check end of list marker - BOOST_CHECK_EQUAL( A.index1_data()[1], (std::size_t) 2 ); - - A.erase_element(0,0); - - BOOST_CHECK_EQUAL( A.filled1(), (std::size_t) 2 ); - BOOST_CHECK_EQUAL( A.filled2(), (std::size_t) 1 ); - - BOOST_CHECK_EQUAL( A.index2_data()[0], (std::size_t) 1 ); - BOOST_CHECK_EQUAL( A.value_data()[0], 5 ); - - BOOST_CHECK_EQUAL( A.index1_data()[0], (std::size_t) 0 ); - BOOST_CHECK_EQUAL( A.index1_data()[1], (std::size_t) 1 ); - - A.erase_element(0,1); - - BOOST_CHECK_EQUAL( A.filled1(), (std::size_t) 2 ); - BOOST_CHECK_EQUAL( A.filled2(), (std::size_t) 0 ); - BOOST_CHECK_EQUAL( A.index1_data()[0], (std::size_t) 0 ); - BOOST_CHECK_EQUAL( A.index1_data()[1], (std::size_t) 0 ); - -} diff --git a/libs/numeric/ublas/test/concepts.cpp b/libs/numeric/ublas/test/concepts.cpp deleted file mode 100644 index ba9812923..000000000 --- a/libs/numeric/ublas/test/concepts.cpp +++ /dev/null @@ -1,34 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -//#include - -namespace ublas = boost::numeric::ublas; - - -int main () { - void (* check) (void) = ublas::concept_checks; - boost::ignore_unused_variable_warning (check); -} diff --git a/libs/numeric/ublas/test/manual/Jamfile.v2 b/libs/numeric/ublas/test/manual/Jamfile.v2 deleted file mode 100644 index 5ef982db0..000000000 --- a/libs/numeric/ublas/test/manual/Jamfile.v2 +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2006 Michael Stevens -# 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) - -exe sp_resize : sp_resize.cpp ; - -exe test_move_semantics : test_move_semantics.cpp ; diff --git a/libs/numeric/ublas/test/manual/sp_resize.cpp b/libs/numeric/ublas/test/manual/sp_resize.cpp deleted file mode 100644 index 2d52dbbd9..000000000 --- a/libs/numeric/ublas/test/manual/sp_resize.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2006 Michael Stevens - * 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) - */ - -#include - -#include - -typedef double Real; - -template -void printV(const V& v) { - std::cout << "size: " << v.size() << " nnz_capacity: " << v.nnz_capacity() << " nnz: " << v.nnz() << std::endl; - for (typename V::const_iterator i = v.begin(); i != v.end(); i++) { - std::cout << i.index() << ":" << (*i) << " "; - } - std::cout << std::endl; -} - -template -void run_test() -{ - V v(10); - - v[0] = 1; - v[5] = 1; - v[8] = 1; - v[9] = 1; - - printV(v); - - v.resize(9); printV(v); - v.resize(12); printV(v); - v.resize(2); printV(v); - v.resize(0); printV(v); - - v.resize(5); v[0] = 1; printV(v); - v.resize(5,false); printV(v); -} - -int main(int, char **) { - - std::cout << "---- MAPPED ----\n"; - run_test< boost::numeric::ublas::mapped_vector >(); - std::cout << "---- COMPRESSED ----\n"; - run_test< boost::numeric::ublas::compressed_vector >(); - std::cout << "---- COORDINATE ----\n"; - run_test< boost::numeric::ublas::coordinate_vector >(); - - return 0; -} - diff --git a/libs/numeric/ublas/test/manual/test_move_semantics.cpp b/libs/numeric/ublas/test/manual/test_move_semantics.cpp deleted file mode 100644 index 188491e4f..000000000 --- a/libs/numeric/ublas/test/manual/test_move_semantics.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/** test move semantics - run with and without BOOST_UBLAS_MOVE_SEMANTICS defined */ - -// Copyright Nasos Iliopoulos, Gunter Winkler 2009. -// Distributed under the 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_UBLAS_MOVE_SEMANTICS -#include -#include -#include - -namespace ublas= boost::numeric::ublas; -std::vector a; - -ublas::vector doubleit(ublas::vector m) -{ - ublas::vector r; - r=2.0*m; - std::cout << "Temporary pointer: " << &r[0] << std::endl; - return r; -} -template -ublas::bounded_vector doubleit(ublas::bounded_vector m) -{ - ublas::bounded_vector r; - r=2.0*m; - std::cout << "Temporary pointer: " << &r[0] << std::endl; - return r; -} - -template -ublas::c_vector doubleit(ublas::c_vector m) -{ - ublas::c_vector r; - r=2.0*m; - std::cout << "Temporary pointer: " << &r[0] << std::endl; - return r; -} - -ublas::matrix doubleit(ublas::matrix m) -{ - ublas::matrix r; - r=2.0*m; - std::cout << "Temporary pointer r: " << &r(0,0) << std::endl; - return r; -} -template -ublas::bounded_matrix doubleit(ublas::bounded_matrix m) -{ - ublas::bounded_matrix r; - r=2.0*m; - std::cout << "Temporary pointer: " << &(r(0,0)) << std::endl; - return r; -} - -template -ublas::c_matrix doubleit(ublas::c_matrix m) -{ - ublas::c_matrix r; - r=2.0*m; - std::cout << "Temporary pointer: " << &(r(0,0)) << std::endl; - return r; -} - - -void test1() -{ - std::cout << "vector --------------------------------------------------------------------" << std::endl; - ublas::vector a(ublas::scalar_vector(2,2.0)); - a = doubleit(a); - std::cout << "Pointer (must be equal to temp. pointer if move semantics are enabled) : " << &a[0] << std::endl; - - std::cout << a << std::endl; - - std::cout << "bounded_vector --------------------------------------------------------------------" << std::endl; - ublas::bounded_vector b(ublas::scalar_vector(2,2.0)); - ublas::bounded_vector c; - noalias(c)=doubleit(b); - std::cout << "Pointer (bounded_vector swaps by copy this should be different than temp. pointer) : " << &c[0] << std::endl; - c(1)=0.0; - std::cout << b << std::endl; - std::cout << c << std::endl; - - std::cout << "c_vector --------------------------------------------------------------------" << std::endl; - ublas::c_vector e=ublas::scalar_vector(2,2.0); - ublas::c_vector f; - f=doubleit(e); - std::cout << "Pointer (c_vector swaps by copy this should be different than temp. pointer) : " << &f[0] << std::endl; - f(1)=0; - std::cout << e << std::endl; - std::cout << f << std::endl; - -} - -void test2() { - std::cout << "matrix --------------------------------------------------------------------" << std::endl; - ublas::matrix a(ublas::scalar_matrix(2, 3, 2.0)); - a = doubleit(a); - std::cout << "Pointer (must be equal to temp. pointer if move semantics are enabled) : " << &(a(0,0)) << std::endl; - std::cout << a << std::endl; - - std::cout << "bounded_matrix --------------------------------------------------------------------" << std::endl; - ublas::bounded_matrix b(ublas::scalar_matrix(2,3, 2.0)); - ublas::bounded_matrix c; - noalias(c)=doubleit(b); - std::cout << "Pointer (bounded_matrix swaps by copy this should be different than temp. pointer) : " << &(c(0,0)) << std::endl; - c(1,1)=0.0; - std::cout << b << std::endl; - std::cout << c << std::endl; - - std::cout << "c_matrix --------------------------------------------------------------------" << std::endl; - ublas::c_matrix e=ublas::scalar_matrix(2,3, 2.0); - ublas::c_matrix f; - f=doubleit(e); - std::cout << "Pointer (c_matrix swaps by copy this should be different than temp. pointer) : " << &(f(0,0)) << std::endl; - f(1,1)=0; - std::cout << e << std::endl; - std::cout << f << std::endl; -} - -int main(){ - test1(); - test2(); - return 0; -} - diff --git a/libs/numeric/ublas/test/num_columns.cpp b/libs/numeric/ublas/test/num_columns.cpp deleted file mode 100644 index 68c9770af..000000000 --- a/libs/numeric/ublas/test/num_columns.cpp +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) 2011 David Bellot -// -// Distributed under the 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 -#include -#include -#include -#include -#include "utils.hpp" - - -BOOST_UBLAS_TEST_DEF( test_row_major_matrix_container ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Row-major Matrix Container" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - BOOST_UBLAS_DEBUG_TRACE( "num_columns(A) = " << boost::numeric::ublas::num_columns(A) << " ==> " << A.size2() ); - BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::num_columns(A) == A.size2() ); -} - - -BOOST_UBLAS_TEST_DEF( test_col_major_matrix_container ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Column-major Matrix Container" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - BOOST_UBLAS_DEBUG_TRACE( "num_columns(A) = " << boost::numeric::ublas::num_columns(A) << " ==> " << A.size2() ); - BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::num_columns(A) == A.size2() ); -} - - -BOOST_UBLAS_TEST_DEF( test_matrix_expression ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Matrix Expression" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - BOOST_UBLAS_DEBUG_TRACE( "num_columns(A') = " << boost::numeric::ublas::num_columns(boost::numeric::ublas::trans(A)) << " ==> " << boost::numeric::ublas::trans(A).size2() ); - BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::num_columns(boost::numeric::ublas::trans(A)) == boost::numeric::ublas::trans(A).size2() ); -} - - -BOOST_UBLAS_TEST_DEF( test_matrix_reference ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Matrix Reference" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - typedef boost::numeric::ublas::matrix_reference matrix_reference_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - BOOST_UBLAS_DEBUG_TRACE( "num_columns(reference(A)) = " << boost::numeric::ublas::num_columns(matrix_reference_type(A)) << " ==> " << matrix_reference_type(A).size2() ); - BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::num_columns(matrix_reference_type(A)) == matrix_reference_type(A).size2() ); -} - - -int main() -{ - BOOST_UBLAS_TEST_BEGIN(); - - BOOST_UBLAS_TEST_DO( test_row_major_matrix_container ); - BOOST_UBLAS_TEST_DO( test_col_major_matrix_container ); - BOOST_UBLAS_TEST_DO( test_matrix_expression ); - BOOST_UBLAS_TEST_DO( test_matrix_reference ); - - BOOST_UBLAS_TEST_END(); -} diff --git a/libs/numeric/ublas/test/num_rows.cpp b/libs/numeric/ublas/test/num_rows.cpp deleted file mode 100644 index 1e3a1e70a..000000000 --- a/libs/numeric/ublas/test/num_rows.cpp +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) 2011 David Bellot -// -// Distributed under the 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 -#include -#include -#include -#include -#include "utils.hpp" - - -BOOST_UBLAS_TEST_DEF( test_row_major_matrix_container ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Row-major Matrix Container" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - BOOST_UBLAS_DEBUG_TRACE( "num_rows(A) = " << boost::numeric::ublas::num_rows(A) << " ==> " << A.size1() ); - BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::num_rows(A) == A.size1() ); -} - - -BOOST_UBLAS_TEST_DEF( test_col_major_matrix_container ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Column-major Matrix Container" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - BOOST_UBLAS_DEBUG_TRACE( "num_rows(A) = " << boost::numeric::ublas::num_rows(A) << " ==> " << A.size1() ); - BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::num_rows(A) == A.size1() ); -} - - -BOOST_UBLAS_TEST_DEF( test_matrix_expression ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Matrix Expression" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - BOOST_UBLAS_DEBUG_TRACE( "num_rows(A') = " << boost::numeric::ublas::num_rows(boost::numeric::ublas::trans(A)) << " ==> " << boost::numeric::ublas::trans(A).size1() ); - BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::num_rows(boost::numeric::ublas::trans(A)) == boost::numeric::ublas::trans(A).size1() ); -} - - -BOOST_UBLAS_TEST_DEF( test_matrix_reference ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Matrix Reference" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - typedef boost::numeric::ublas::matrix_reference matrix_reference_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - BOOST_UBLAS_DEBUG_TRACE( "num_rows(reference(A)) = " << boost::numeric::ublas::num_rows(matrix_reference_type(A)) << " ==> " << matrix_reference_type(A).size1() ); - BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::num_rows(matrix_reference_type(A)) == matrix_reference_type(A).size1() ); -} - - -int main() -{ - BOOST_UBLAS_TEST_BEGIN(); - - BOOST_UBLAS_TEST_DO( test_row_major_matrix_container ); - BOOST_UBLAS_TEST_DO( test_col_major_matrix_container ); - BOOST_UBLAS_TEST_DO( test_matrix_expression ); - BOOST_UBLAS_TEST_DO( test_matrix_reference ); - - BOOST_UBLAS_TEST_END(); -} diff --git a/libs/numeric/ublas/test/placement_new.cpp b/libs/numeric/ublas/test/placement_new.cpp deleted file mode 100644 index 940da7dab..000000000 --- a/libs/numeric/ublas/test/placement_new.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2004 Michael Stevens - * 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) - */ - -/* - * Test placement new and array placement new for uBLAS - * See if base pointer is effected by array count cookie - */ - -#include -#include -#include - -// User defined type to capture base pointer on construction - -class udt { -public: - udt () { - base_pointer = this; - } - ~udt () {} // required for GCC prior to 3.4 to generate cookie - - static udt* base_pointer; -}; - -udt* udt::base_pointer; - -int main () -{ - udt a; - udt* ap = &a; - - // Capture placement new offsets for a udt - new (ap) udt; - int new_offset = int (udt::base_pointer - ap); - new (ap) udt [1]; - int array_new_offset = int (udt::base_pointer - ap); - - // Print offsets - we expect 0,0 or 0,sizeof(std::size_t) - std::cout << new_offset <<','<< array_new_offset << std::endl; - - // Return status - if (new_offset != 0) - return -1; // Very bad if new has an offset - -#ifdef BOOST_UBLAS_USEFUL_ARRAY_PLACEMENT_NEW - bool expect_array_offset = false; -#else - bool expect_array_offset = true; -#endif - // Check match between config and array - if (!expect_array_offset && array_new_offset != 0) { - return -2; // Bad config should not enable array new - } - if (expect_array_offset && array_new_offset == 0) { - return -3; // Config could enable array new - } - - return 0; -} diff --git a/libs/numeric/ublas/test/size.cpp b/libs/numeric/ublas/test/size.cpp deleted file mode 100644 index 1fd2f9de6..000000000 --- a/libs/numeric/ublas/test/size.cpp +++ /dev/null @@ -1,275 +0,0 @@ -// Copyright (c) 2011 David Bellot -// -// Distributed under the 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 -#include -#include -#include -#include -#include -#include -#include -#include "utils.hpp" - - -BOOST_UBLAS_TEST_DEF( test_vector_container ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Vector Container" ); - - typedef double value_type; - typedef boost::numeric::ublas::vector vector_type; - - vector_type v(5); - - v(0) = 0.555950; - v(1) = 0.108929; - v(2) = 0.948014; - v(3) = 0.023787; - v(4) = 1.023787; - - - // size(v) - BOOST_UBLAS_DEBUG_TRACE( "size(v) = " << boost::numeric::ublas::size(v) << " ==> " << v.size() ); - BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::size(v) == v.size() ); - - // size<1>(v) - BOOST_UBLAS_DEBUG_TRACE( "size<1>(v) = " << (boost::numeric::ublas::size<1>(v)) << " ==> " << v.size() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(v) == v.size()) ); - - // [NOT_COMPILE]: this should *correctly* cause a compilation error - // size<2>(v) - //BOOST_UBLAS_DEBUG_TRACE( "size<2>(v) = " << (boost::numeric::ublas::size(v)) << " ==> " << v.size() ); - //BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<2>(v) == v.size()) ); - // [/NOT_COMPILE] -} - - -BOOST_UBLAS_TEST_DEF( test_vector_expression ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Vector Expression" ); - - typedef double value_type; - typedef boost::numeric::ublas::vector vector_type; - - vector_type v(5); - - v(0) = 0.555950; - v(1) = 0.108929; - v(2) = 0.948014; - v(3) = 0.023787; - v(4) = 1.023787; - - - // size(-v) - BOOST_UBLAS_DEBUG_TRACE( "size(-v) = " << boost::numeric::ublas::size(-v) << " ==> " << (-v).size() ); - BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::size(-v) == (-v).size() ); - - // size<1>(-v) - BOOST_UBLAS_DEBUG_TRACE( "size<1>(-v) = " << (boost::numeric::ublas::size<1>(-v)) << " ==> " << (-v).size() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(-v) == (-v).size()) ); -} - - -BOOST_UBLAS_TEST_DEF( test_vector_reference ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Vector Reference" ); - - typedef double value_type; - typedef boost::numeric::ublas::vector vector_type; - typedef boost::numeric::ublas::vector_reference vector_reference_type; - - vector_type v(5); - - v(0) = 0.555950; - v(1) = 0.108929; - v(2) = 0.948014; - v(3) = 0.023787; - v(4) = 1.023787; - - - // size(reference(v) - BOOST_UBLAS_DEBUG_TRACE( "size(reference(v)) = " << boost::numeric::ublas::size(vector_reference_type(v)) << " ==> " << vector_reference_type(v).size() ); - BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::size(vector_reference_type(v)) == vector_reference_type(v).size() ); - - // size<1>(reference(v)) - BOOST_UBLAS_DEBUG_TRACE( "size<1>(reference(v)) = " << (boost::numeric::ublas::size<1>(vector_reference_type(v))) << " ==> " << vector_reference_type(v).size() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(vector_reference_type(v)) == vector_reference_type(v).size()) ); -} - - -BOOST_UBLAS_TEST_DEF( test_row_major_matrix_container ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Row-major Matrix Container" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - // [NOT_COMPILE] - // size(A) - //BOOST_UBLAS_DEBUG_TRACE( "size(A) = " << boost::numeric::ublas::size(A) << " ==> " << A.size1() ); - //BOOST_UBLAS_TEST_CHECK( boost::numeric::ublas::size(A) == A.size1() ); - // [/NOT_COMPILE] - - // size<1>(A) - BOOST_UBLAS_DEBUG_TRACE( "size<1>(A) = " << (boost::numeric::ublas::size<1>(A)) << " ==> " << A.size1() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(A) == A.size1()) ); - - // size<2>(A) - BOOST_UBLAS_DEBUG_TRACE( "size<2>(A) = " << (boost::numeric::ublas::size<2>(A)) << " ==> " << A.size2() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<2>(A) == A.size2()) ); - - // size(A) - BOOST_UBLAS_DEBUG_TRACE( "size(A) = " << (boost::numeric::ublas::size(A)) << " ==> " << A.size1() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size(A) == A.size1()) ); - - // size(A) - BOOST_UBLAS_DEBUG_TRACE( "size(A) = " << (boost::numeric::ublas::size(A)) << " ==> " << A.size2() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size(A) == A.size2()) ); - - // size(A) - BOOST_UBLAS_DEBUG_TRACE( "size(A) = " << (boost::numeric::ublas::size(A)) << " ==> " << A.size2() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size(A) == A.size2()) ); -} - - -BOOST_UBLAS_TEST_DEF( test_col_major_matrix_container ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Column-major Matrix Container" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - // size<1>(A) - BOOST_UBLAS_DEBUG_TRACE( "size<1>(A) = " << (boost::numeric::ublas::size<1>(A)) << " ==> " << A.size1() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(A) == A.size1()) ); - - // size<2>(A) - BOOST_UBLAS_DEBUG_TRACE( "size<2>(A) = " << (boost::numeric::ublas::size<2>(A)) << " ==> " << A.size2() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<2>(A) == A.size2()) ); - - // size(A) - BOOST_UBLAS_DEBUG_TRACE( "size(A) = " << (boost::numeric::ublas::size(A)) << " ==> " << A.size2() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size(A) == A.size2()) ); - - // size(A) - BOOST_UBLAS_DEBUG_TRACE( "size(A) = " << (boost::numeric::ublas::size(A)) << " ==> " << A.size1() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size(A) == A.size1()) ); - - // size(A) - BOOST_UBLAS_DEBUG_TRACE( "size(A) = " << (boost::numeric::ublas::size(A)) << " ==> " << A.size1() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size(A) == A.size1()) ); -} - - -BOOST_UBLAS_TEST_DEF( test_matrix_expression ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Matrix Expression" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - // size<1>(A') - BOOST_UBLAS_DEBUG_TRACE( "size<1>(A') = " << (boost::numeric::ublas::size<1>(boost::numeric::ublas::trans(A))) << " ==> " << A.size2() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(boost::numeric::ublas::trans(A)) == A.size2()) ); - - // size<2>(A') - BOOST_UBLAS_DEBUG_TRACE( "size<2>(A') = " << (boost::numeric::ublas::size<2>(boost::numeric::ublas::trans(A))) << " ==> " << A.size1() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<2>(boost::numeric::ublas::trans(A)) == A.size1()) ); - - // size(A') [A is row-major => A' column-major, and viceversa] - BOOST_UBLAS_DEBUG_TRACE( "size(A') = " << (boost::numeric::ublas::size(boost::numeric::ublas::trans(A))) << " ==> " << A.size1() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size(boost::numeric::ublas::trans(A)) == A.size1()) ); - - // size(A') [A is row-major => A' column-major, and viceversa] - BOOST_UBLAS_DEBUG_TRACE( "size(A') = " << (boost::numeric::ublas::size(boost::numeric::ublas::trans(A))) << " ==> " << A.size2() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size(boost::numeric::ublas::trans(A)) == A.size2()) ); - - // size(A') [A row-major => A' column-major, and viceversa] - BOOST_UBLAS_DEBUG_TRACE( "size(A') = " << (boost::numeric::ublas::size(boost::numeric::ublas::trans(A))) << " ==> " << A.size2() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size(boost::numeric::ublas::trans(A)) == A.size2()) ); -} - - -BOOST_UBLAS_TEST_DEF( test_matrix_reference ) -{ - BOOST_UBLAS_DEBUG_TRACE( "TEST Matrix Reference" ); - - typedef double value_type; - typedef boost::numeric::ublas::matrix matrix_type; - typedef boost::numeric::ublas::matrix_reference matrix_reference_type; - - matrix_type A(5,4); - - A(0,0) = 0.555950; A(0,1) = 0.274690; A(0,2) = 0.540605; A(0,3) = 0.798938; - A(1,0) = 0.108929; A(1,1) = 0.830123; A(1,2) = 0.891726; A(1,3) = 0.895283; - A(2,0) = 0.948014; A(2,1) = 0.973234; A(2,2) = 0.216504; A(2,3) = 0.883152; - A(3,0) = 0.023787; A(3,1) = 0.675382; A(3,2) = 0.231751; A(3,3) = 0.450332; - A(4,0) = 1.023787; A(4,1) = 1.675382; A(4,2) = 1.231751; A(4,3) = 1.450332; - - - // size<1>(reference(A)) - BOOST_UBLAS_DEBUG_TRACE( "size<1>(reference(A)) = " << (boost::numeric::ublas::size<1>(matrix_reference_type(A))) << " ==> " << matrix_reference_type(A).size1() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<1>(matrix_reference_type(A)) == matrix_reference_type(A).size1()) ); - - // size<2>(reference(A)) - BOOST_UBLAS_DEBUG_TRACE( "size<2>(reference(A)) = " << (boost::numeric::ublas::size<2>(matrix_reference_type(A))) << " ==> " << matrix_reference_type(A).size2() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size<2>(matrix_reference_type(A)) == matrix_reference_type(A).size2()) ); - - // size(reference(A)) - BOOST_UBLAS_DEBUG_TRACE( "size(reference(A) = " << (boost::numeric::ublas::size(matrix_reference_type(A))) << " ==> " << matrix_reference_type(A).size1() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size(matrix_reference_type(A)) == matrix_reference_type(A).size1()) ); - - // size(reference(A)) - BOOST_UBLAS_DEBUG_TRACE( "size(reference(A)) = " << (boost::numeric::ublas::size(matrix_reference_type(A))) << " ==> " << matrix_reference_type(A).size2() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size(matrix_reference_type(A)) == matrix_reference_type(A).size2()) ); - - // size(reference(A)) - BOOST_UBLAS_DEBUG_TRACE( "size(reference(A)) = " << (boost::numeric::ublas::size(matrix_reference_type(A))) << " ==> " << matrix_reference_type(A).size2() ); - BOOST_UBLAS_TEST_CHECK( (boost::numeric::ublas::size(matrix_reference_type(A)) == matrix_reference_type(A).size2()) ); -} - - -int main() -{ - BOOST_UBLAS_TEST_BEGIN(); - - BOOST_UBLAS_TEST_DO( test_vector_container ); - BOOST_UBLAS_TEST_DO( test_vector_expression ); - BOOST_UBLAS_TEST_DO( test_vector_reference ); - BOOST_UBLAS_TEST_DO( test_row_major_matrix_container ); - BOOST_UBLAS_TEST_DO( test_col_major_matrix_container ); - BOOST_UBLAS_TEST_DO( test_matrix_expression ); - BOOST_UBLAS_TEST_DO( test_matrix_reference ); - - BOOST_UBLAS_TEST_END(); -} diff --git a/libs/numeric/ublas/test/sparse_view_test.cpp b/libs/numeric/ublas/test/sparse_view_test.cpp deleted file mode 100644 index 178e44427..000000000 --- a/libs/numeric/ublas/test/sparse_view_test.cpp +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (c) 2009-2011 Gunter Winkler, David Bellot -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// ublas headers - -#include - -#include -#include -#include - -#include - -// other boost headers - -// headers for testcase - -#define BOOST_TEST_MODULE SparseMatrixErasureTest -#include - -// standard and system headers - -#include -#include - -namespace ublas = boost::numeric::ublas; - - /* - sparse input matrix: - - 1 2 0 0 - 0 3 9 0 - 0 1 4 0 - */ - - static const std::string inputMatrix = "[3,4]((1,2,0,0),(0,3,9,0),(0,1,4,0))\n"; - - const unsigned int NNZ = 6; - const unsigned int IB = 1; - const double VA[] = { 1.0, 2.0, 3.0, 9.0, 1.0, 4.0 }; - const unsigned int IA[] = { 1, 3, 5, 7 }; - const unsigned int JA[] = { 1, 2, 2, 3, 2, 3 }; - -BOOST_AUTO_TEST_CASE( test_construction_and_basic_operations ) -{ - - typedef ublas::matrix DENSE_MATRIX; - - // prepare data - - DENSE_MATRIX A; - - std::istringstream iss(inputMatrix); - iss >> A; - - std::cout << A << std::endl; - - std::cout << ( ublas::make_compressed_matrix_view(3,4,NNZ,IA,JA,VA) ) << std::endl; - - typedef ublas::compressed_matrix_view COMPMATVIEW; - - COMPMATVIEW viewA(3,4,NNZ,IA,JA,VA); - - std::cout << viewA << std::endl; - -} - - - -BOOST_AUTO_TEST_CASE( test_construction_from_pointers ) -{ - - std::cout << ( ublas::make_compressed_matrix_view(4,3,NNZ - , ublas::c_array_view(4,&(IA[0])) - , ublas::c_array_view(6,&(JA[0])) - , ublas::c_array_view(6,&(VA[0]))) ) << std::endl; - - unsigned int * ia = new unsigned int[4](); - unsigned int * ja = new unsigned int[6](); - double * va = new double[6](); - - std::copy(&(IA[0]),&(IA[4]),ia); - std::copy(&(JA[0]),&(JA[6]),ja); - std::copy(&(VA[0]),&(VA[6]),va); - - typedef ublas::compressed_matrix_view - , ublas::c_array_view - , ublas::c_array_view > COMPMATVIEW; - - COMPMATVIEW viewA(4,3,NNZ - , ublas::c_array_view(4,ia) - , ublas::c_array_view(6,ja) - , ublas::c_array_view(6,va)); - - std::cout << viewA << std::endl; - - delete[] va; - delete[] ja; - delete[] ia; - -} diff --git a/libs/numeric/ublas/test/test1.cpp b/libs/numeric/ublas/test/test1.cpp deleted file mode 100644 index 53de79019..000000000 --- a/libs/numeric/ublas/test/test1.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test1.hpp" - -int main () { - test_vector (); - test_matrix_vector (); - test_matrix (); - return 0; -} diff --git a/libs/numeric/ublas/test/test1.hpp b/libs/numeric/ublas/test/test1.hpp deleted file mode 100644 index fcf3d67a5..000000000 --- a/libs/numeric/ublas/test/test1.hpp +++ /dev/null @@ -1,33 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#ifndef TEST1_H -#define TEST1_H - -#include - -#include -#include -#include -#include -#include - -namespace ublas = boost::numeric::ublas; - -#include "common/init.hpp" - -void test_vector (); -void test_matrix_vector (); -void test_matrix (); - - -#endif diff --git a/libs/numeric/ublas/test/test11.cpp b/libs/numeric/ublas/test/test11.cpp deleted file mode 100644 index 2d3d27527..000000000 --- a/libs/numeric/ublas/test/test11.cpp +++ /dev/null @@ -1,265 +0,0 @@ -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. - -#include "test1.hpp" - -// Test vector expression templates -template -struct test_my_vector { - typedef typename V::value_type value_type; - typedef typename V::size_type size_type; - typedef typename ublas::type_traits::real_type real_type; - - template - void test_container_with (VP &v1) const { - // Container type tests in addition to expression types - // Insert and erase - v1.insert_element (0, 55); - v1.erase_element (1); - v1.clear (); - } - - template - void test_expression_with (VP &v1, VP &v2, VP &v3) const { - // Expression type tests - value_type t; - size_type i; - real_type n; - - // Default Construct - default_construct::test (); - - // Copy and swap - initialize_vector (v1); - initialize_vector (v2); - v1 = v2; - std::cout << "v1 = v2 = " << v1 << std::endl; - v1.assign_temporary (v2); - std::cout << "v1.assign_temporary (v2) = " << v1 << std::endl; - v1.swap (v2); - std::cout << "v1.swap (v2) = " << v1 << " " << v2 << std::endl; - - // Zero assignment - v1 = ublas::zero_vector<> (v1.size ()); - std::cout << "v1.zero_vector = " << v1 << std::endl; - v1 = v2; - -#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING - // Project range and slice - initialize_vector (v1); - initialize_vector (v2); - project (v1, ublas::range(0,1)) = project (v2, ublas::range(0,1)); - project (v1, ublas::range(0,1)) = project (v2, ublas::slice(0,1,1)); - project (v1, ublas::slice(2,-1,2)) = project (v2, ublas::slice(0,1,2)); - project (v1, ublas::slice(2,-1,2)) = project (v2, ublas::range(0,2)); - std::cout << "v1 = range/slice " << v1 << std::endl; -#endif - - // Unary vector operations resulting in a vector - initialize_vector (v1); - v2 = - v1; - std::cout << "- v1 = " << v2 << std::endl; - v2 = ublas::conj (v1); - std::cout << "conj (v1) = " << v2 << std::endl; - - // Binary vector operations resulting in a vector - initialize_vector (v1); - initialize_vector (v2); - v3 = v1 + v2; - std::cout << "v1 + v2 = " << v3 << std::endl; - v3 = v1 - v2; - std::cout << "v1 - v2 = " << v3 << std::endl; - v3 = ublas::element_prod (v1, v2); - std::cout << "element_prod (v1, v2) = " << v3 << std::endl; - - // Scaling a vector - t = N; - initialize_vector (v1); - v2 = value_type (1.) * v1; - std::cout << "1. * v1 = " << v2 << std::endl; - v2 = t * v1; - std::cout << "N * v1 = " << v2 << std::endl; - initialize_vector (v1); - v2 = v1 * value_type (1.); - std::cout << "v1 * 1. = " << v2 << std::endl; - v2 = v1 * t; - std::cout << "v1 * value_type(N) = " << v2 << std::endl; - // test interop with integer - v2 = v1 * N; - - std::cout << "v1 * N = " << v2 << std::endl; - - // Some assignments - initialize_vector (v1); - initialize_vector (v2); - v2 += v1; - std::cout << "v2 += v1 = " << v2 << std::endl; - v2 -= v1; - std::cout << "v2 -= v1 = " << v2 << std::endl; - v2 = v2 + v1; - std::cout << "v2 = v2 + v1 = " << v2 << std::endl; - v2 = v2 - v1; - std::cout << "v2 = v2 - v1 = " << v2 << std::endl; - v1 *= value_type (1.); - std::cout << "v1 *= 1. = " << v1 << std::endl; - v1 *= t; - std::cout << "v1 *= value_type(N) = " << v1 << std::endl; - // test interop with integer - v1 *= N; - std::cout << "v1 *= N = " << v1 << std::endl; - - // Unary vector operations resulting in a scalar - initialize_vector (v1); - t = ublas::sum (v1); - std::cout << "sum (v1) = " << t << std::endl; - n = ublas::norm_1 (v1); - std::cout << "norm_1 (v1) = " << n << std::endl; - n = ublas::norm_2 (v1); - std::cout << "norm_2 (v1) = " << n << std::endl; - n = ublas::norm_inf (v1); - std::cout << "norm_inf (v1) = " << n << std::endl; - - i = ublas::index_norm_inf (v1); - std::cout << "index_norm_inf (v1) = " << i << std::endl; - - // Binary vector operations resulting in a scalar - initialize_vector (v1); - initialize_vector (v2); - t = ublas::inner_prod (v1, v2); - std::cout << "inner_prod (v1, v2) = " << t << std::endl; - - // Scalar and Binary vector expression resulting in a vector - initialize_vector (v1); - initialize_vector (v2); - v1 = v1 * ublas::inner_prod (v1, v2); - std::cout << "v1 * inner_prod (v1, v2) = " << v1 << std::endl; - } - - void operator () () const { - V v1 (N), v2 (N), v3 (N); - test_expression_with (v1, v2, v3); - test_container_with (v1); - -#ifdef USE_RANGE - ublas::vector_range vr1 (v1, ublas::range (0, N)), - vr2 (v2, ublas::range (0, N)), - vr3 (v3, ublas::range (0, N)); - test_expression_with (vr1, vr2, vr3); -#endif - -#ifdef USE_SLICE - ublas::vector_slice vs1 (v1, ublas::slice (0, 1, N)), - vs2 (v2, ublas::slice (0, 1, N)), - vs3 (v3, ublas::slice (0, 1, N)); - test_expression_with (vs1, vs2, vs3); -#endif - } -}; - -// Test vector -void test_vector () { - std::cout << "test_vector" << std::endl; - -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, bounded_array" << std::endl; - test_my_vector >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded_array" << std::endl; - test_my_vector >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded_array" << std::endl; - test_my_vector, ublas::bounded_array, 3> >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded_array" << std::endl; - test_my_vector, ublas::bounded_array, 3> >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, unbounded_array" << std::endl; - test_my_vector >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, unbounded_array" << std::endl; - test_my_vector >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_vector, ublas::unbounded_array > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_vector, ublas::unbounded_array > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "float, std::vector" << std::endl; - test_my_vector >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::vector" << std::endl; - test_my_vector >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::vector" << std::endl; - test_my_vector, std::vector > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, std::vector" << std::endl; - test_my_vector, std::vector > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_BOUNDED_VECTOR -#ifdef USE_FLOAT - std::cout << "float, bounded" << std::endl; - test_my_vector, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded" << std::endl; - test_my_vector, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded" << std::endl; - test_my_vector, 3>, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded" << std::endl; - test_my_vector, 3>, 3> () (); -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test12.cpp b/libs/numeric/ublas/test/test12.cpp deleted file mode 100644 index 8c9e61da0..000000000 --- a/libs/numeric/ublas/test/test12.cpp +++ /dev/null @@ -1,277 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test1.hpp" - -// Test matrix & vector expression templates -template -struct test_my_matrix_vector { - typedef typename V::value_type value_type; - - template - void test_with (VP &v1, VP &v2, MP &m1) const { - { - // Rows and columns - initialize_matrix (m1); - for (int i = 0; i < N; ++ i) { - v1 = ublas::row (m1, i); - std::cout << "row (m, " << i << ") = " << v1 << std::endl; - v1 = ublas::column (m1, i); - std::cout << "column (m, " << i << ") = " << v1 << std::endl; - } - - // Outer product - initialize_vector (v1); - initialize_vector (v2); - m1 = ublas::outer_prod (v1, v2); - std::cout << "outer_prod (v1, v2) = " << m1 << std::endl; - - // Matrix vector product - initialize_matrix (m1); - initialize_vector (v1); - v2 = ublas::prod (m1, v1); - std::cout << "prod (m1, v1) = " << v2 << std::endl; - v2 = ublas::prod (v1, m1); - std::cout << "prod (v1, m1) = " << v2 << std::endl; - } - } - void operator () () const { - { - V v1 (N), v2 (N); - M m1 (N, N); - test_with (v1, v2, m1); - - ublas::matrix_row mr1 (m1, 0), mr2 (m1, 1); - test_with (mr1, mr2, m1); - - ublas::matrix_column mc1 (m1, 0), mc2 (m1, 1); - test_with (mc1, mc2, m1); - -#ifdef USE_RANGE - ublas::matrix_vector_range mvr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mvr2 (m1, ublas::range (0, N), ublas::range (0, N)); - test_with (mvr1, mvr2, m1); -#endif - -#ifdef USE_SLICE - ublas::matrix_vector_slice mvs1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - mvs2 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (mvs1, mvs2, m1); -#endif - } - } -}; - -// Test matrix & vector -void test_matrix_vector () { - std::cout << "test_matrix_vector" << std::endl; - -#ifdef USE_MATRIX -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, bounded_array" << std::endl; - test_my_matrix_vector >, - ublas::matrix >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded_array" << std::endl; - test_my_matrix_vector >, - ublas::matrix >, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); -#endif -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, unbounded_array" << std::endl; - test_my_matrix_vector >, - ublas::matrix >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, unbounded_array" << std::endl; - test_my_matrix_vector >, - ublas::matrix >, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (); -#endif -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "float, std::vector" << std::endl; - test_my_matrix_vector >, - ublas::matrix >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::vector" << std::endl; - test_my_matrix_vector >, - ublas::matrix >, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::matrix, ublas::row_major, std::vector > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::matrix, ublas::row_major, std::vector > >, 3> () (); -#endif -#endif -#endif -#endif - -#ifdef USE_BOUNDED_MATRIX -#ifdef USE_FLOAT - std::cout << "float, bounded" << std::endl; - test_my_matrix_vector, - ublas::bounded_matrix, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded" << std::endl; - test_my_matrix_vector, - ublas::bounded_matrix, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded" << std::endl; - test_my_matrix_vector, 3>, - ublas::bounded_matrix, 3, 3>, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded" << std::endl; - test_my_matrix_vector, 3>, - ublas::bounded_matrix, 3, 3>, 3> () (); -#endif -#endif -#endif - -#ifdef USE_VECTOR_OF_VECTOR -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, bounded_array" << std::endl; - test_my_matrix_vector >, - ublas::vector_of_vector, 3 + 1> >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded_array" << std::endl; - test_my_matrix_vector >, - ublas::vector_of_vector, 3 + 1> >, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::vector_of_vector, ublas::row_major, ublas::bounded_array, 3>, 3 + 1> >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::vector_of_vector, ublas::row_major, ublas::bounded_array, 3>, 3 + 1> >, 3> () (); -#endif -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, unbounded_array" << std::endl; - test_my_matrix_vector >, - ublas::vector_of_vector > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, unbounded_array" << std::endl; - test_my_matrix_vector >, - ublas::vector_of_vector > >, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::vector_of_vector, ublas::row_major, ublas::unbounded_array > > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::vector_of_vector, ublas::row_major, ublas::unbounded_array > > >, 3> () (); -#endif -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "float, std::vector" << std::endl; - test_my_matrix_vector >, - ublas::vector_of_vector > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::vector" << std::endl; - test_my_matrix_vector >, - ublas::vector_of_vector > >, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::vector_of_vector, ublas::row_major, std::vector > > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::vector_of_vector, ublas::row_major, std::vector > > >, 3> () (); -#endif -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test13.cpp b/libs/numeric/ublas/test/test13.cpp deleted file mode 100644 index d84f321fe..000000000 --- a/libs/numeric/ublas/test/test13.cpp +++ /dev/null @@ -1,325 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test1.hpp" - -// Test matrix expression templates -template -struct test_my_matrix { - typedef typename M::value_type value_type; - - template - void test_container_with (VP &v1) const { - // Container type tests in addition to expression types - // Insert and erase - v1.insert_element (0,0, 55); - v1.erase_element (1,1); - v1.clear (); - } - - template - void test_expression_with (MP &m1, MP &m2, MP &m3) const { - value_type t; - - // Default Construct - default_construct::test (); - - // Copy and swap - initialize_matrix (m1); - initialize_matrix (m2); - m1 = m2; - std::cout << "m1 = m2 = " << m1 << std::endl; - m1.assign_temporary (m2); - std::cout << "m1.assign_temporary (m2) = " << m1 << std::endl; - m1.swap (m2); - std::cout << "m1.swap (m2) = " << m1 << " " << m2 << std::endl; - - // Zero assignment - m1 = ublas::zero_matrix<> (m1.size1 (), m1.size2 ()); - std::cout << "m1.zero_matrix = " << m1 << std::endl; - m1 = m2; - -#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING - // Project range and slice - initialize_matrix (m1); - initialize_matrix (m2); - project (m1, ublas::range(0,1),ublas::range(0,1)) = project (m2, ublas::range(0,1),ublas::range(0,1)); - project (m1, ublas::range(0,1),ublas::range(0,1)) = project (m2, ublas::slice(0,1,1),ublas::slice(0,1,1)); - project (m1, ublas::slice(2,-1,2),ublas::slice(2,-1,2)) = project (m2, ublas::slice(0,1,2),ublas::slice(0,1,2)); - project (m1, ublas::slice(2,-1,2),ublas::slice(2,-1,2)) = project (m2, ublas::range(0,2),ublas::range(0,2)); - std::cout << "m1 = range/slice " << m1 << std::endl; -#endif - - // Unary matrix operations resulting in a matrix - initialize_matrix (m1); - m2 = - m1; - std::cout << "- m1 = " << m2 << std::endl; - m2 = ublas::conj (m1); - std::cout << "conj (m1) = " << m2 << std::endl; - - // Binary matrix operations resulting in a matrix - initialize_matrix (m1); - initialize_matrix (m2); - m3 = m1 + m2; - std::cout << "m1 + m2 = " << m3 << std::endl; - m3 = m1 - m2; - std::cout << "m1 - m2 = " << m3 << std::endl; - m3 = ublas::element_prod (m1, m2); - std::cout << "element_prod (m1, m2) = " << m3 << std::endl; - - // Scaling a matrix - t = N; - initialize_matrix (m1); - m2 = value_type (1.) * m1; - std::cout << "1. * m1 = " << m2 << std::endl; - m2 = t * m1; - std::cout << "N * m1 = " << m2 << std::endl; - initialize_matrix (m1); - m2 = m1 * value_type (1.); - std::cout << "m1 * 1. = " << m2 << std::endl; - m2 = m1 * t; - std::cout << "m1 * N = " << m2 << std::endl; - m2 = m1 / value_type (2.); - std::cout << "m1 / 2. = " << m2 << std::endl; - m2 = m1 / t; - std::cout << "m1 / N = " << m2 << std::endl; - - // Some assignments - initialize_matrix (m1); - initialize_matrix (m2); - m2 += m1; - std::cout << "m2 += m1 = " << m2 << std::endl; - m2 -= m1; - std::cout << "m2 -= m1 = " << m2 << std::endl; - m2 = m2 + m1; - std::cout << "m2 = m2 + m1 = " << m2 << std::endl; - m2 = m2 - m1; - std::cout << "m2 = m2 - m1 = " << m2 << std::endl; - m1 *= value_type (1.); - std::cout << "m1 *= 1. = " << m1 << std::endl; - m1 *= t; - std::cout << "m1 *= N = " << m1 << std::endl; - - // Transpose - initialize_matrix (m1); - m2 = ublas::trans (m1); - std::cout << "trans (m1) = " << m2 << std::endl; - - // Hermitean - initialize_matrix (m1); - m2 = ublas::herm (m1); - std::cout << "herm (m1) = " << m2 << std::endl; - - // Matrix multiplication - initialize_matrix (m1); - initialize_matrix (m2); - m3 = ublas::prod (m1, m2); - std::cout << "prod (m1, m2) = " << m3 << std::endl; - } - - void operator () () const { - M m1 (N, N), m2 (N, N), m3 (N, N); - test_expression_with (m1, m2, m3); - test_container_with (m1); - -#ifdef USE_RANGE - ublas::matrix_range mr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mr2 (m2, ublas::range (0, N), ublas::range (0, N)), - mr3 (m3, ublas::range (0, N), ublas::range (0, N)); - test_expression_with (mr1, mr2, mr3); -#endif - -#ifdef USE_SLICE - ublas::matrix_slice ms1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms2 (m2, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms3 (m3, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_expression_with (ms1, ms2, ms3); -#endif - } -}; - -// Test matrix -void test_matrix () { - std::cout << "test_matrix" << std::endl; - -#ifdef USE_MATRIX -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, bounded_array" << std::endl; - test_my_matrix >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded_array" << std::endl; - test_my_matrix >, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); -#endif -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, unbounded_array" << std::endl; - test_my_matrix >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, unbounded_array" << std::endl; - test_my_matrix >, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (); -#endif -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "float, std::vector" << std::endl; - test_my_matrix >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::vector" << std::endl; - test_my_matrix >, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix, ublas::row_major, std::vector > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix, ublas::row_major, std::vector > >, 3> () (); -#endif -#endif -#endif -#endif - -#ifdef USE_BOUNDED_MATRIX -#ifdef USE_FLOAT - std::cout << "float, bounded" << std::endl; - test_my_matrix, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded" << std::endl; - test_my_matrix, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded" << std::endl; - test_my_matrix, 3, 3>, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded" << std::endl; - test_my_matrix, 3, 3>, 3> () (); -#endif -#endif -#endif - -#ifdef USE_VECTOR_OF_VECTOR -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, bounded_array" << std::endl; - test_my_matrix, 3 + 1> >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded_array" << std::endl; - test_my_matrix, 3 + 1> >, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::bounded_array, 3>, 3 + 1> >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::bounded_array, 3>, 3 + 1> >, 3> () (); -#endif -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, unbounded_array" << std::endl; - test_my_matrix > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, unbounded_array" << std::endl; - test_my_matrix > >, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::unbounded_array > > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::unbounded_array > > >, 3> () (); -#endif -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "float, std::vector" << std::endl; - test_my_matrix > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::vector" << std::endl; - test_my_matrix > >, 3> () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix, ublas::row_major, std::vector > > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix, ublas::row_major, std::vector > > >, 3> () (); -#endif -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test2.cpp b/libs/numeric/ublas/test/test2.cpp deleted file mode 100644 index 07a4c7558..000000000 --- a/libs/numeric/ublas/test/test2.cpp +++ /dev/null @@ -1,87 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test2.hpp" - -int main () { -#ifdef USE_FLOAT - std::cout << "float" << std::endl; - test_blas_1, 3> ().test (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double" << std::endl; - test_blas_1, 3> ().test (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex" << std::endl; - test_blas_1 >, 3> ().test (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex" << std::endl; - test_blas_1 >, 3> ().test (); -#endif -#endif - - std::cout << "test_blas_2" << std::endl; - -#ifdef USE_FLOAT - std::cout << "float" << std::endl; - test_blas_2, ublas::matrix, 3> ().test (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double" << std::endl; - test_blas_2, ublas::matrix, 3> ().test (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex" << std::endl; - test_blas_2 >, ublas::matrix >, 3> ().test (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex" << std::endl; - test_blas_2 >, ublas::matrix >, 3> ().test (); -#endif -#endif - - std::cout << "test_blas_3" << std::endl; - -#ifdef USE_FLOAT - std::cout << "float" << std::endl; - test_blas_3, 3> ().test (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double" << std::endl; - test_blas_3, 3> ().test (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex" << std::endl; - test_blas_3 >, 3> ().test (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex" << std::endl; - test_blas_3 >, 3> ().test (); -#endif -#endif - - return 0; -} diff --git a/libs/numeric/ublas/test/test2.hpp b/libs/numeric/ublas/test/test2.hpp deleted file mode 100644 index d4d4baa57..000000000 --- a/libs/numeric/ublas/test/test2.hpp +++ /dev/null @@ -1,51 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#ifndef TEST2_H -#define TEST2_H - -#include - -#include -#include -#include -#include -#include - -namespace ublas = boost::numeric::ublas; - -#include "common/init.hpp" - -template -struct test_blas_1 { - typedef typename V::value_type value_type; - typedef typename ublas::type_traits::real_type real_type; - - void test (); -}; - -template -struct test_blas_2 { - typedef typename V::value_type value_type; - - void test (); -}; - -template -struct test_blas_3 { - typedef typename M::value_type value_type; - - void test (); -}; - - -#endif diff --git a/libs/numeric/ublas/test/test21.cpp b/libs/numeric/ublas/test/test21.cpp deleted file mode 100644 index 408b17dc0..000000000 --- a/libs/numeric/ublas/test/test21.cpp +++ /dev/null @@ -1,95 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test2.hpp" - -template -void test_blas_1::test () { - { - value_type t; - real_type n; - V v1 (N), v2 (N); - - // _asum - initialize_vector (v1); - n = ublas::blas_1::asum (v1); - std::cout << "asum (v1) = " << n << std::endl; - - // _amax - initialize_vector (v1); - n = ublas::blas_1::amax (v1); - std::cout << "amax (v1) = " << n << std::endl; - - // _nrm2 - initialize_vector (v1); - n = ublas::blas_1::nrm2 (v1); - std::cout << "nrm2 (v1) = " << n << std::endl; - - // _dot - // _dotu - // _dotc - initialize_vector (v1); - initialize_vector (v2); - t = ublas::blas_1::dot (v1, v2); - std::cout << "dot (v1, v2) = " << t << std::endl; - t = ublas::blas_1::dot (ublas::conj (v1), v2); - std::cout << "dot (conj (v1), v2) = " << t << std::endl; - - // _copy - initialize_vector (v2); - ublas::blas_1::copy (v1, v2); - std::cout << "copy (v1, v2) = " << v1 << std::endl; - - // _swap - initialize_vector (v1); - initialize_vector (v2); - ublas::blas_1::swap (v1, v2); - std::cout << "swap (v1, v2) = " << v1 << " " << v2 << std::endl; - - // _scal - // csscal - // zdscal - initialize_vector (v1); - ublas::blas_1::scal (v1, value_type (1)); - std::cout << "scal (v1, 1) = " << v1 << std::endl; - - // _axpy - initialize_vector (v1); - initialize_vector (v2); - ublas::blas_1::axpy (v1, value_type (1), v2); - std::cout << "axpy (v1, 1, v2) = " << v1 << std::endl; - - // _rot - initialize_vector (v1); - initialize_vector (v2); - ublas::blas_1::rot (value_type (1), v1, value_type (1), v2); - std::cout << "rot (1, v1, 1, v2) = " << v1 << " " << v2 << std::endl; - } -} - -#ifdef USE_FLOAT -template struct test_blas_1, 3>; -#endif - -#ifdef USE_DOUBLE -template struct test_blas_1, 3>; -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT -template struct test_blas_1 >, 3>; -#endif - -#ifdef USE_DOUBLE -template struct test_blas_1 >, 3>; -#endif -#endif diff --git a/libs/numeric/ublas/test/test22.cpp b/libs/numeric/ublas/test/test22.cpp deleted file mode 100644 index 13b313ea4..000000000 --- a/libs/numeric/ublas/test/test22.cpp +++ /dev/null @@ -1,147 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test2.hpp" - -template -void test_blas_2::test () { - { - V v1 (N), v2 (N); - M m (N, N); - - // _t_mv - initialize_vector (v1); - initialize_matrix (m); - ublas::blas_2::tmv (v1, m); - std::cout << "tmv (v1, m) = " << v1 << std::endl; - initialize_vector (v1); - initialize_matrix (m); - ublas::blas_2::tmv (v1, ublas::trans (m)); - std::cout << "tmv (v1, trans (m)) = " << v1 << std::endl; -#ifdef USE_STD_COMPLEX - initialize_vector (v1); - initialize_matrix (m); - ublas::blas_2::tmv (v1, ublas::herm (m)); - std::cout << "tmv (v1, herm (m)) = " << v1 << std::endl; -#endif - - // _t_sv - initialize_vector (v1); - initialize_vector (v2); - initialize_matrix (m, ublas::lower_tag ()); - ublas::blas_2::tsv (v1, m, ublas::lower_tag ()); - std::cout << "tsv (v1, m) = " << v1 << " " << ublas::prod (m, v1) - v2 << std::endl; - initialize_vector (v1); - initialize_vector (v2); - initialize_matrix (m, ublas::upper_tag ()); - ublas::blas_2::tsv (v1, ublas::trans (m), ublas::lower_tag ()); - std::cout << "tsv (v1, trans (m)) = " << v1 << " " << ublas::prod (ublas::trans (m), v1) - v2 << std::endl; -#ifdef USE_STD_COMPLEX - initialize_vector (v1); - initialize_vector (v2); - initialize_matrix (m, ublas::upper_tag ()); - ublas::blas_2::tsv (v1, ublas::herm (m), ublas::lower_tag ()); - std::cout << "tsv (v1, herm (m)) = " << v1 << " " << ublas::prod (ublas::herm (m), v1) - v2 << std::endl; -#endif - initialize_vector (v1); - initialize_vector (v2); - initialize_matrix (m, ublas::upper_tag ()); - ublas::blas_2::tsv (v1, m, ublas::upper_tag ()); - std::cout << "tsv (v1, m) = " << v1 << " " << ublas::prod (m, v1) - v2 << std::endl; - initialize_vector (v1); - initialize_vector (v2); - initialize_matrix (m, ublas::lower_tag ()); - ublas::blas_2::tsv (v1, ublas::trans (m), ublas::upper_tag ()); - std::cout << "tsv (v1, trans (m)) = " << v1 << " " << ublas::prod (ublas::trans (m), v1) - v2 << std::endl; -#ifdef USE_STD_COMPLEX - initialize_vector (v1); - initialize_vector (v2); - initialize_matrix (m, ublas::lower_tag ()); - ublas::blas_2::tsv (v1, ublas::herm (m), ublas::upper_tag ()); - std::cout << "tsv (v1, herm (m)) = " << v1 << " " << ublas::prod (ublas::herm (m), v1) - v2 << std::endl; -#endif - - // _g_mv - // _s_mv - // _h_mv - initialize_vector (v1); - initialize_vector (v2); - initialize_matrix (m); - ublas::blas_2::gmv (v1, value_type (1), value_type (1), m, v2); - std::cout << "gmv (v1, 1, 1, m, v2) = " << v1 << std::endl; - ublas::blas_2::gmv (v1, value_type (1), value_type (1), ublas::trans (m), v2); - std::cout << "gmv (v1, 1, 1, trans (m), v2) = " << v1 << std::endl; -#ifdef USE_STD_COMPLEX - ublas::blas_2::gmv (v1, value_type (1), value_type (1), ublas::herm (m), v2); - std::cout << "gmv (v1, 1, 1, herm (m), v2) = " << v1 << std::endl; -#endif - - // _g_r - // _g_ru - // _g_rc - initialize_vector (v1); - initialize_vector (v2); - initialize_matrix (m); - ublas::blas_2::gr (m, value_type (1), v1, v2); - std::cout << "gr (m, 1, v1, v2) = " << m << std::endl; - ublas::blas_2::gr (m, value_type (1), v1, ublas::conj (v2)); - std::cout << "gr (m, 1, v1, conj (v2)) = " << m << std::endl; - - // _s_r - initialize_vector (v1); - initialize_matrix (m); - ublas::blas_2::sr (m, value_type (1), v1); - std::cout << "sr (m, 1, v1) = " << m << std::endl; - -#ifdef USE_STD_COMPLEX - // _h_r - initialize_vector (v1); - initialize_matrix (m); - ublas::blas_2::hr (m, value_type (1), v1); - std::cout << "hr (m, 1, v1) = " << m << std::endl; -#endif - - // _s_r2 - initialize_vector (v1); - initialize_vector (v2); - initialize_matrix (m); - ublas::blas_2::sr2 (m, value_type (1), v1, v2); - std::cout << "sr2 (m, 1, v1, v2) = " << m << std::endl; - -#ifdef USE_STD_COMPLEX - // _h_r2 - initialize_vector (v1); - initialize_vector (v2); - initialize_matrix (m); - ublas::blas_2::hr2 (m, value_type (1), v1, v2); - std::cout << "hr2 (m, 1, v1, v2) = " << m << std::endl; -#endif - } -} - -#ifdef USE_FLOAT -template struct test_blas_2, ublas::matrix, 3>; -#endif - -#ifdef USE_DOUBLE -template struct test_blas_2, ublas::matrix, 3>; -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT -template struct test_blas_2 >, ublas::matrix >, 3>; -#endif - -#ifdef USE_DOUBLE -template struct test_blas_2 >, ublas::matrix >, 3>; -#endif -#endif diff --git a/libs/numeric/ublas/test/test23.cpp b/libs/numeric/ublas/test/test23.cpp deleted file mode 100644 index 2817710cf..000000000 --- a/libs/numeric/ublas/test/test23.cpp +++ /dev/null @@ -1,208 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test2.hpp" - -template -void test_blas_3::test () { - { - M m1 (N, N), m2 (N, N), m3 (N, N); - - // _t_mm - initialize_matrix (m1); - initialize_matrix (m2); - ublas::blas_3::tmm (m1, value_type (1), m2, m1); - std::cout << "tmm (m1, 1, m2, m1) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - ublas::blas_3::tmm (m1, value_type (1), m2, ublas::trans (m1)); - std::cout << "tmm (m1, 1, m2, trans (m1)) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - ublas::blas_3::tmm (m1, value_type (1), ublas::trans (m2), m1); - std::cout << "tmm (m1, 1, trans (m2), m1) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - ublas::blas_3::tmm (m1, value_type (1), ublas::trans (m2), ublas::trans (m1)); - std::cout << "tmm (m1, 1, trans (m2), trans (m1)) = " << m1 << std::endl; -#ifdef USE_STD_COMPLEX - initialize_matrix (m1); - initialize_matrix (m2); - ublas::blas_3::tmm (m1, value_type (1), m2, ublas::herm (m1)); - std::cout << "tmm (m1, 1, m2, herm (m1)) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - ublas::blas_3::tmm (m1, value_type (1), ublas::herm (m2), m1); - std::cout << "tmm (m1, 1, herm (m2), m1) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - ublas::blas_3::tmm (m1, value_type (1), ublas::trans (m2), ublas::herm (m1)); - std::cout << "tmm (m1, 1, trans (m2), herm (m1)) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - ublas::blas_3::tmm (m1, value_type (1), ublas::herm (m2), ublas::trans (m1)); - std::cout << "tmm (m1, 1, herm (m2), trans (m1)) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - ublas::blas_3::tmm (m1, value_type (1), ublas::herm (m2), ublas::herm (m1)); - std::cout << "tmm (m1, 1, herm (m2), herm (m1)) = " << m1 << std::endl; -#endif - - // _t_sm - initialize_matrix (m1); - initialize_matrix (m2, ublas::lower_tag ()); - initialize_matrix (m3); - ublas::blas_3::tsm (m1, value_type (1), m2, ublas::lower_tag ()); - std::cout << "tsm (m1, 1, m2) = " << m1 << " " << ublas::prod (m2, m1) - value_type (1) * m3 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2, ublas::upper_tag ()); - ublas::blas_3::tsm (m1, value_type (1), ublas::trans (m2), ublas::lower_tag ()); - std::cout << "tsm (m1, 1, trans (m2)) = " << m1 << " " << ublas::prod (ublas::trans (m2), m1) - value_type (1) * m3 << std::endl; -#ifdef USE_STD_COMPLEX - initialize_matrix (m1); - initialize_matrix (m2, ublas::upper_tag ()); - ublas::blas_3::tsm (m1, value_type (1), ublas::herm (m2), ublas::lower_tag ()); - std::cout << "tsm (m1, 1, herm (m2)) = " << m1 << " " << ublas::prod (ublas::herm (m2), m1) - value_type (1) * m3 << std::endl; -#endif - initialize_matrix (m1); - initialize_matrix (m2, ublas::upper_tag ()); - ublas::blas_3::tsm (m1, value_type (1), m2, ublas::upper_tag ()); - std::cout << "tsm (m1, 1, m2) = " << m1 << " " << ublas::prod (m2, m1) - value_type (1) * m3 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2, ublas::lower_tag ()); - ublas::blas_3::tsm (m1, value_type (1), ublas::trans (m2), ublas::upper_tag ()); - std::cout << "tsm (m1, 1, trans (m2)) = " << m1 << " " << ublas::prod (ublas::trans (m2), m1) - value_type (1) * m3 << std::endl; -#ifdef USE_STD_COMPLEX - initialize_matrix (m1); - initialize_matrix (m2, ublas::lower_tag ()); - ublas::blas_3::tsm (m1, value_type (1), ublas::herm (m2), ublas::upper_tag ()); - std::cout << "tsm (m1, 1, herm (m2)) = " << m1 << " " << ublas::prod (ublas::herm (m2), m1) - value_type (1) * m3 << std::endl; -#endif - - // _g_mm - // _s_mm - // _h_mm - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - ublas::blas_3::gmm (m1, value_type (1), value_type (1), m2, m3); - std::cout << "gmm (m1, 1, 1, m2, m3) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - ublas::blas_3::gmm (m1, value_type (1), value_type (1), ublas::trans (m2), m3); - std::cout << "gmm (m1, 1, 1, trans (m2), m3) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - ublas::blas_3::gmm (m1, value_type (1), value_type (1), m2, ublas::trans (m3)); - std::cout << "gmm (m1, 1, 1, m2, trans (m3)) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - ublas::blas_3::gmm (m1, value_type (1), value_type (1), ublas::trans (m2), ublas::trans (m3)); - std::cout << "gmm (m1, 1, 1, trans (m2), trans (m3)) = " << m1 << std::endl; -#ifdef USE_STD_COMPLEX - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - ublas::blas_3::gmm (m1, value_type (1), value_type (1), ublas::herm (m2), m3); - std::cout << "gmm (m1, 1, 1, herm (m2), m3) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - ublas::blas_3::gmm (m1, value_type (1), value_type (1), m2, ublas::herm (m3)); - std::cout << "gmm (m1, 1, 1, m2, herm (m3)) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - ublas::blas_3::gmm (m1, value_type (1), value_type (1), ublas::herm (m2), ublas::trans (m3)); - std::cout << "gmm (m1, 1, 1, herm (m2), trans (m3)) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - ublas::blas_3::gmm (m1, value_type (1), value_type (1), ublas::trans (m2), ublas::herm (m3)); - std::cout << "gmm (m1, 1, 1, trans (m2), herm (m3)) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - ublas::blas_3::gmm (m1, value_type (1), value_type (1), ublas::herm (m2), ublas::herm (m3)); - std::cout << "gmm (m1, 1, 1, herm (m2), herm (m3)) = " << m1 << std::endl; -#endif - - // s_rk - initialize_matrix (m1); - initialize_matrix (m2); - ublas::blas_3::srk (m1, value_type (1), value_type (1), m2); - std::cout << "srk (m1, 1, 1, m2) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - ublas::blas_3::srk (m1, value_type (1), value_type (1), ublas::trans (m2)); - std::cout << "srk (m1, 1, 1, trans (m2)) = " << m1 << std::endl; - -#ifdef USE_STD_COMPLEX - // h_rk - initialize_matrix (m1); - initialize_matrix (m2); - ublas::blas_3::hrk (m1, value_type (1), value_type (1), m2); - std::cout << "hrk (m1, 1, 1, m2) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - ublas::blas_3::hrk (m1, value_type (1), value_type (1), ublas::herm (m2)); - std::cout << "hrk (m1, 1, 1, herm (m2)) = " << m1 << std::endl; -#endif - - // s_r2k - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - ublas::blas_3::sr2k (m1, value_type (1), value_type (1), m2, m3); - std::cout << "sr2k (m1, 1, 1, m2, m3) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - ublas::blas_3::sr2k (m1, value_type (1), value_type (1), ublas::trans (m2), ublas::trans (m3)); - std::cout << "sr2k (m1, 1, 1, trans (m2), trans (m3)) = " << m1 << std::endl; - -#ifdef USE_STD_COMPLEX - // h_r2k - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - ublas::blas_3::hr2k (m1, value_type (1), value_type (1), m2, m3); - std::cout << "hr2k (m1, 1, 1, m2, m3) = " << m1 << std::endl; - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - ublas::blas_3::hr2k (m1, value_type (1), value_type (1), ublas::herm (m2), ublas::herm (m3)); - std::cout << "hr2k (m1, 1, 1, herm (m2), herm (m3)) = " << m1 << std::endl; -#endif - } -} - -#ifdef USE_FLOAT -template struct test_blas_3, 3>; -#endif - -#ifdef USE_DOUBLE -template struct test_blas_3, 3>; -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT -template struct test_blas_3 >, 3>; -#endif - -#ifdef USE_DOUBLE -template struct test_blas_3 >, 3>; -#endif -#endif diff --git a/libs/numeric/ublas/test/test3.cpp b/libs/numeric/ublas/test/test3.cpp deleted file mode 100644 index fb2b94dad..000000000 --- a/libs/numeric/ublas/test/test3.cpp +++ /dev/null @@ -1,20 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test3.hpp" - -int main () { - test_vector (); - test_matrix_vector (); - test_matrix (); - return 0; -} diff --git a/libs/numeric/ublas/test/test3.hpp b/libs/numeric/ublas/test/test3.hpp deleted file mode 100644 index a9d4fc957..000000000 --- a/libs/numeric/ublas/test/test3.hpp +++ /dev/null @@ -1,38 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#ifndef TEST3_H -#define TEST3_H - -#include - -#include -#include -#include -#include -#include -#include -#include -#ifdef USE_GENERALIZED_VECTOR_OF_VECTOR -#include -#endif -#include - -namespace ublas = boost::numeric::ublas; - -#include "common/init.hpp" - -void test_vector (); -void test_matrix_vector (); -void test_matrix (); - -#endif diff --git a/libs/numeric/ublas/test/test31.cpp b/libs/numeric/ublas/test/test31.cpp deleted file mode 100644 index 776228720..000000000 --- a/libs/numeric/ublas/test/test31.cpp +++ /dev/null @@ -1,248 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test3.hpp" - -// Test vector expression templates -template -struct test_my_vector { - typedef typename V::value_type value_type; - typedef typename V::size_type size_type; - typedef typename ublas::type_traits::real_type real_type; - - template - void test_with (VP &v1, VP &v2, VP &v3) const { - { - value_type t; - size_type i; - real_type n; - - // Default Construct - default_construct::test (); - - // Copy and swap - initialize_vector (v1); - initialize_vector (v2); - v1 = v2; - std::cout << "v1 = v2 = " << v1 << std::endl; - v1.assign_temporary (v2); - std::cout << "v1.assign_temporary (v2) = " << v1 << std::endl; - v1.swap (v2); - std::cout << "v1.swap (v2) = " << v1 << " " << v2 << std::endl; - - // Zero assignment - v1 = ublas::zero_vector<> (v1.size ()); - std::cout << "v1.zero_vector = " << v1 << std::endl; - v1 = v2; - -#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING - // Project range and slice - initialize_vector (v1); - initialize_vector (v2); - project (v1, ublas::range(0,1)) = project (v2, ublas::range(0,1)); - project (v1, ublas::range(0,1)) = project (v2, ublas::slice(0,1,1)); - project (v1, ublas::slice(2,-1,2)) = project (v2, ublas::slice(0,1,2)); - project (v1, ublas::slice(2,-1,2)) = project (v2, ublas::range(0,2)); - std::cout << "v1 = range/slice " << v1 << std::endl; -#endif - - // Unary vector operations resulting in a vector - initialize_vector (v1); - v2 = - v1; - std::cout << "- v1 = " << v2 << std::endl; - v2 = ublas::conj (v1); - std::cout << "conj (v1) = " << v2 << std::endl; - - // Binary vector operations resulting in a vector - initialize_vector (v1); - initialize_vector (v2); - initialize_vector (v3); - v3 = v1 + v2; - std::cout << "v1 + v2 = " << v3 << std::endl; - - v3 = v1 - v2; - std::cout << "v1 - v2 = " << v3 << std::endl; - - // Scaling a vector - t = N; - initialize_vector (v1); - v2 = value_type (1.) * v1; - std::cout << "1. * v1 = " << v2 << std::endl; - v2 = t * v1; - std::cout << "N * v1 = " << v2 << std::endl; - initialize_vector (v1); - v2 = v1 * value_type (1.); - std::cout << "v1 * 1. = " << v2 << std::endl; - v2 = v1 * t; - std::cout << "v1 * N = " << v2 << std::endl; - - // Some assignments - initialize_vector (v1); - initialize_vector (v2); - v2 += v1; - std::cout << "v2 += v1 = " << v2 << std::endl; - v2 -= v1; - std::cout << "v2 -= v1 = " << v2 << std::endl; - v2 = v2 + v1; - std::cout << "v2 = v2 + v1 = " << v2 << std::endl; - v2 = v2 - v1; - std::cout << "v2 = v2 - v1 = " << v2 << std::endl; - v1 *= value_type (1.); - std::cout << "v1 *= 1. = " << v1 << std::endl; - v1 *= t; - std::cout << "v1 *= N = " << v1 << std::endl; - - // Unary vector operations resulting in a scalar - initialize_vector (v1); - t = ublas::sum (v1); - std::cout << "sum (v1) = " << t << std::endl; - n = ublas::norm_1 (v1); - std::cout << "norm_1 (v1) = " << n << std::endl; - n = ublas::norm_2 (v1); - std::cout << "norm_2 (v1) = " << n << std::endl; - n = ublas::norm_inf (v1); - std::cout << "norm_inf (v1) = " << n << std::endl; - - i = ublas::index_norm_inf (v1); - std::cout << "index_norm_inf (v1) = " << i << std::endl; - - // Binary vector operations resulting in a scalar - initialize_vector (v1); - initialize_vector (v2); - t = ublas::inner_prod (v1, v2); - std::cout << "inner_prod (v1, v2) = " << t << std::endl; - } - } - void operator () () const { - { - V v1 (N, N), v2 (N, N), v3 (N, N); - test_with (v1, v2, v3); - -#ifdef USE_RANGE - ublas::vector_range vr1 (v1, ublas::range (0, N)), - vr2 (v2, ublas::range (0, N)), - vr3 (v3, ublas::range (0, N)); - test_with (vr1, vr2, vr3); -#endif - -#ifdef USE_SLICE - ublas::vector_slice vs1 (v1, ublas::slice (0, 1, N)), - vs2 (v2, ublas::slice (0, 1, N)), - vs3 (v3, ublas::slice (0, 1, N)); - test_with (vs1, vs2, vs3); -#endif - } - } -}; - -// Test vector -void test_vector () { - std::cout << "test_vector" << std::endl; - -#ifdef USE_SPARSE_VECTOR -#ifdef USE_MAP_ARRAY -#ifdef USE_FLOAT - std::cout << "float, map_array" << std::endl; - test_my_vector >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, map_array" << std::endl; - test_my_vector >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, map_array" << std::endl; - test_my_vector, ublas::map_array > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, map_array" << std::endl; - test_my_vector, ublas::map_array > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_STD_MAP -#ifdef USE_FLOAT - std::cout << "float, std::map" << std::endl; - test_my_vector >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::map" << std::endl; - test_my_vector >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::map" << std::endl; - test_my_vector, std::map > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, std::map" << std::endl; - test_my_vector, std::map > > , 3 > () (); -#endif -#endif -#endif -#endif - -#ifdef USE_COMPRESSED_VECTOR -#ifdef USE_FLOAT - std::cout << "float compressed" << std::endl; - test_my_vector, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double compressed" << std::endl; - test_my_vector, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex compressed" << std::endl; - test_my_vector >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex compressed" << std::endl; - test_my_vector >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_COORDINATE_VECTOR -#ifdef USE_FLOAT - std::cout << "float coordinate" << std::endl; - test_my_vector, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double coordinate" << std::endl; - test_my_vector, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex coordinate" << std::endl; - test_my_vector >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex coordinate" << std::endl; - test_my_vector >, 3 > () (); -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test32.cpp b/libs/numeric/ublas/test/test32.cpp deleted file mode 100644 index eaf492976..000000000 --- a/libs/numeric/ublas/test/test32.cpp +++ /dev/null @@ -1,354 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test3.hpp" - -// Test matrix & vector expression templates -template -struct test_my_matrix_vector { - typedef typename V::value_type value_type; - - template - void test_with (VP &v1, VP &v2, MP &m1) const { - { - // Rows and columns - initialize_matrix (m1); - for (int i = 0; i < N; ++ i) { - v1 = ublas::row (m1, i); - std::cout << "row (m, " << i << ") = " << v1 << std::endl; - v1 = ublas::column (m1, i); - std::cout << "column (m, " << i << ") = " << v1 << std::endl; - } - - // Outer product - initialize_vector (v1); - initialize_vector (v2); - m1 = ublas::outer_prod (v1, v2); - std::cout << "outer_prod (v1, v2) = " << m1 << std::endl; - - // Matrix vector product - initialize_matrix (m1); - initialize_vector (v1); - v2 = ublas::prod (m1, v1); - std::cout << "prod (m1, v1) = " << v2 << std::endl; - v2 = ublas::prod (v1, m1); - std::cout << "prod (v1, m1) = " << v2 << std::endl; - } - } - void operator () () const { - { - V v1 (N, N), v2 (N, N); - M m1 (N, N, N * N); - - test_with (v1, v2, m1); - - ublas::matrix_row mr1 (m1, 0), mr2 (m1, N - 1); - test_with (mr1, mr2, m1); - - ublas::matrix_column mc1 (m1, 0), mc2 (m1, N - 1); - test_with (mc1, mc2, m1); - -#ifdef USE_RANGE - ublas::matrix_vector_range mvr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mvr2 (m1, ublas::range (0, N), ublas::range (0, N)); - test_with (mvr1, mvr2, m1); -#endif - -#ifdef USE_SLICE - ublas::matrix_vector_slice mvs1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - mvs2 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (mvs1, mvs2, m1); -#endif - } - } -}; - -// Test matrix & vector -void test_matrix_vector () { - std::cout << "test_matrix_vector" << std::endl; - -#ifdef USE_SPARSE_MATRIX -#ifdef USE_MAP_ARRAY -#ifdef USE_FLOAT - std::cout << "float, map_array" << std::endl; - test_my_matrix_vector >, - ublas::mapped_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, map_array" << std::endl; - test_my_matrix_vector >, - ublas::mapped_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, map_array" << std::endl; - test_my_matrix_vector, ublas::map_array > >, - ublas::mapped_matrix, ublas::row_major, ublas::map_array > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, map_array" << std::endl; - test_my_matrix_vector, ublas::map_array > >, - ublas::mapped_matrix, ublas::row_major, ublas::map_array > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_STD_MAP -#ifdef USE_FLOAT - std::cout << "float, std::map" << std::endl; - test_my_matrix_vector >, - ublas::mapped_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::map" << std::endl; - test_my_matrix_vector >, - ublas::mapped_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::map" << std::endl; - test_my_matrix_vector, std::map > >, - ublas::mapped_matrix, ublas::row_major, std::map > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, std::map" << std::endl; - test_my_matrix_vector, std::map > >, - ublas::mapped_matrix, ublas::row_major, std::map > >, 3 > () (); -#endif -#endif -#endif -#endif - -#ifdef USE_SPARSE_VECTOR_OF_SPARSE_VECTOR -#ifdef USE_MAP_ARRAY -#ifdef USE_FLOAT - std::cout << "float, mapped_vector map_array" << std::endl; - test_my_matrix_vector >, - ublas::mapped_vector > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, mapped_vector map_array" << std::endl; - test_my_matrix_vector >, - ublas::mapped_vector > >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, mapped_vector map_array" << std::endl; - test_my_matrix_vector, ublas::map_array > >, - ublas::mapped_vector, ublas::row_major, ublas::map_array > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex,mapped_vector map_array" << std::endl; - test_my_matrix_vector, ublas::map_array > >, - ublas::mapped_vector, ublas::row_major, ublas::map_array > > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_STD_MAP -#ifdef USE_FLOAT - std::cout << "float, mapped_vector std::map" << std::endl; - test_my_matrix_vector >, - ublas::mapped_vector > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, mapped_vector std::map" << std::endl; - test_my_matrix_vector >, - ublas::mapped_vector > >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, mapped_vector std::map" << std::endl; - test_my_matrix_vector, std::map > >, - ublas::mapped_vector, ublas::row_major, std::map > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, mapped_vector std::map" << std::endl; - test_my_matrix_vector, std::map > >, - ublas::mapped_vector, ublas::row_major, std::map > > >, 3 > () (); -#endif -#endif -#endif -#endif - -#ifdef USE_GENERALIZED_VECTOR_OF_VECTOR -#ifdef USE_MAP_ARRAY -#ifdef USE_FLOAT - std::cout << "float, generalized_vector_of_vector map_array" << std::endl; - test_my_matrix_vector >, - ublas::generalized_vector_of_vector > > >, 3 > () (); - test_my_matrix_vector >, - ublas::generalized_vector_of_vector >, ublas::map_array > > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, generalized_vector_of_vector map_array" << std::endl; - test_my_matrix_vector >, - ublas::generalized_vector_of_vector > > >, 3 > () (); - test_my_matrix_vector >, - ublas::generalized_vector_of_vector >, ublas::map_array > > > >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, generalized_vector_of_vector map_array" << std::endl; - test_my_matrix_vector, ublas::map_array > >, - ublas::generalized_vector_of_vector, ublas::row_major, ublas::vector, ublas::map_array > > > >, 3 > () (); - test_my_matrix_vector, ublas::map_array > >, - ublas::generalized_vector_of_vector, ublas::row_major, ublas::mapped_vector, ublas::map_array > >, ublas::map_array, ublas::map_array > > > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, generalized_vector_of_vector map_array" << std::endl; - test_my_matrix_vector, ublas::map_array > >, - ublas::generalized_vector_of_vector, ublas::row_major, ublas::vector, ublas::map_array > > > >, 3 > () (); - test_my_matrix_vector, ublas::map_array > >, - ublas::generalized_vector_of_vector, ublas::row_major, ublas::mapped_vector, ublas::map_array > >, ublas::map_array, ublas::map_array > > > > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_STD_MAP -#ifdef USE_FLOAT - std::cout << "float, generalized_vector_of_vector std::map" << std::endl; - test_my_matrix_vector >, - ublas::generalized_vector_of_vector > > >, 3 > () (); - test_my_matrix_vector >, - ublas::generalized_vector_of_vector >, std::map > > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, generalized_vector_of_vector std::map" << std::endl; - test_my_matrix_vector >, - ublas::generalized_vector_of_vector > > >, 3 > () (); - test_my_matrix_vector >, - ublas::generalized_vector_of_vector >, std::map > > > >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, generalized_vector_of_vector std::map" << std::endl; - test_my_matrix_vector, std::map > >, - ublas::generalized_vector_of_vector, ublas::row_major, ublas::vector, std::map > > > >, 3 > () (); - test_my_matrix_vector, std::map > >, - ublas::generalized_vector_of_vector, ublas::row_major, ublas::mapped_vector, std::map > >, std::map, std::map > > > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, generalized_vector_of_vector std::map" << std::endl; - test_my_matrix_vector, std::map > >, - ublas::generalized_vector_of_vector, ublas::row_major, ublas::vector, std::map > > > >, 3 > () (); - test_my_matrix_vector, std::map > >, - ublas::generalized_vector_of_vector, ublas::row_major, ublas::mapped_vector, std::map > >, std::map, std::map > > > > >, 3 > () (); -#endif -#endif -#endif -#endif - -#ifdef USE_COMPRESSED_MATRIX -#ifdef USE_FLOAT - std::cout << "float compressed" << std::endl; - test_my_matrix_vector, - ublas::compressed_matrix, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double compressed" << std::endl; - test_my_matrix_vector, - ublas::compressed_matrix, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex compressed" << std::endl; - test_my_matrix_vector >, - ublas::compressed_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex compressed" << std::endl; - test_my_matrix_vector >, - ublas::compressed_matrix >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_COORDINATE_MATRIX -#ifdef USE_FLOAT - std::cout << "float coordinate" << std::endl; - test_my_matrix_vector, - ublas::coordinate_matrix, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double coordinate" << std::endl; - test_my_matrix_vector, - ublas::coordinate_matrix, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex coordinate" << std::endl; - test_my_matrix_vector >, - ublas::coordinate_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex coordinate" << std::endl; - test_my_matrix_vector >, - ublas::coordinate_matrix >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_MAPPED_VECTOR_OF_MAPPED_VECTOR -#ifdef USE_STD_MAP -#ifdef USE_FLOAT - std::cout << "float mapped_vector_of_mapped_vector" << std::endl; - test_my_matrix_vector >, - ublas::mapped_vector_of_mapped_vector, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double mapped_vector_of_mapped_vector" << std::endl; - test_my_matrix_vector >, - ublas::mapped_vector_of_mapped_vector, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex mapped_vector_of_mapped_vector" << std::endl; - test_my_matrix_vector, std::map > >, - ublas::mapped_vector_of_mapped_vector >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex mapped_vector_of_mapped_vector" << std::endl; - test_my_matrix_vector, std::map > >, - ublas::mapped_vector_of_mapped_vector >, 3 > () (); -#endif -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test33.cpp b/libs/numeric/ublas/test/test33.cpp deleted file mode 100644 index b7d658cfa..000000000 --- a/libs/numeric/ublas/test/test33.cpp +++ /dev/null @@ -1,371 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test3.hpp" - -// Test matrix expression templates -template -struct test_my_matrix { - typedef typename M::value_type value_type; - - template - void test_with (MP &m1, MP &m2, MP &m3) const { - { - value_type t; - - // Default Construct - default_construct::test (); - - // Copy and swap - initialize_matrix (m1); - initialize_matrix (m2); - m1 = m2; - std::cout << "m1 = m2 = " << m1 << std::endl; - m1.assign_temporary (m2); - std::cout << "m1.assign_temporary (m2) = " << m1 << std::endl; - m1.swap (m2); - std::cout << "m1.swap (m2) = " << m1 << " " << m2 << std::endl; - - // Zero assignment - m1 = ublas::zero_matrix<> (m1.size1 (), m1.size2 ()); - std::cout << "m1.zero_matrix = " << m1 << std::endl; - m1 = m2; - -#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING - // Project range and slice - initialize_matrix (m1); - initialize_matrix (m2); - project (m1, ublas::range(0,1),ublas::range(0,1)) = project (m2, ublas::range(0,1),ublas::range(0,1)); - project (m1, ublas::range(0,1),ublas::range(0,1)) = project (m2, ublas::slice(0,1,1),ublas::slice(0,1,1)); - project (m1, ublas::slice(2,-1,2),ublas::slice(2,-1,2)) = project (m2, ublas::slice(0,1,2),ublas::slice(0,1,2)); - project (m1, ublas::slice(2,-1,2),ublas::slice(2,-1,2)) = project (m2, ublas::range(0,2),ublas::range(0,2)); - std::cout << "m1 = range/slice " << m1 << std::endl; -#endif - - // Unary matrix operations resulting in a matrix - initialize_matrix (m1); - m2 = - m1; - std::cout << "- m1 = " << m2 << std::endl; - m2 = ublas::conj (m1); - std::cout << "conj (m1) = " << m2 << std::endl; - - // Binary matrix operations resulting in a matrix - initialize_matrix (m1); - initialize_matrix (m2); - initialize_matrix (m3); - m3 = m1 + m2; - std::cout << "m1 + m2 = " << m3 << std::endl; - m3 = m1 - m2; - std::cout << "m1 - m2 = " << m3 << std::endl; - - // Scaling a matrix - t = N; - initialize_matrix (m1); - m2 = value_type (1.) * m1; - std::cout << "1. * m1 = " << m2 << std::endl; - m2 = t * m1; - std::cout << "N * m1 = " << m2 << std::endl; - initialize_matrix (m1); - m2 = m1 * value_type (1.); - std::cout << "m1 * 1. = " << m2 << std::endl; - m2 = m1 * t; - std::cout << "m1 * N = " << m2 << std::endl; - - // Some assignments - initialize_matrix (m1); - initialize_matrix (m2); - m2 += m1; - std::cout << "m2 += m1 = " << m2 << std::endl; - m2 -= m1; - std::cout << "m2 -= m1 = " << m2 << std::endl; - m2 = m2 + m1; - std::cout << "m2 = m2 + m1 = " << m2 << std::endl; - m2 = m2 - m1; - std::cout << "m2 = m2 - m1 = " << m2 << std::endl; - m1 *= value_type (1.); - std::cout << "m1 *= 1. = " << m1 << std::endl; - m1 *= t; - std::cout << "m1 *= N = " << m1 << std::endl; - - // Transpose - initialize_matrix (m1); - m2 = ublas::trans (m1); - std::cout << "trans (m1) = " << m2 << std::endl; - - // Hermitean - initialize_matrix (m1); - m2 = ublas::herm (m1); - std::cout << "herm (m1) = " << m2 << std::endl; - - // Matrix multiplication - initialize_matrix (m1); - initialize_matrix (m2); - m3 = ublas::prod (m1, m2); - std::cout << "prod (m1, m2) = " << m3 << std::endl; - } - } - void operator () () const { - { - M m1 (N, N, N * N), m2 (N, N, N * N), m3 (N, N, N * N); - test_with (m1, m2, m3); - -#ifdef USE_RANGE - ublas::matrix_range mr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mr2 (m2, ublas::range (0, N), ublas::range (0, N)), - mr3 (m3, ublas::range (0, N), ublas::range (0, N)); - test_with (mr1, mr2, mr3); -#endif - -#ifdef USE_SLICE - ublas::matrix_slice ms1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms2 (m2, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms3 (m3, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (ms1, ms2, ms3); -#endif - } - } -}; - -// Test matrix -void test_matrix () { - std::cout << "test_matrix" << std::endl; - -#ifdef USE_SPARSE_MATRIX -#ifdef USE_MAP_ARRAY -#ifdef USE_FLOAT - std::cout << "float, mapped_matrix map_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, mapped_matrix map_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, mapped_matrix map_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::map_array > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, mapped_matrix map_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::map_array > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_STD_MAP -#ifdef USE_FLOAT - std::cout << "float, mapped_matrix std::map" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, mapped_matrix std::map" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, mapped_matrix std::map" << std::endl; - test_my_matrix, ublas::row_major, std::map > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, mapped_matrix std::map" << std::endl; - test_my_matrix, ublas::row_major, std::map > >, 3 > () (); -#endif -#endif -#endif -#endif - -#ifdef USE_SPARSE_VECTOR_OF_SPARSE_VECTOR -#ifdef USE_MAP_ARRAY -#ifdef USE_FLOAT - std::cout << "float, mapped_vector_of_mapped_vector map_array" << std::endl; - test_my_matrix > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, mapped_vector_of_mapped_vector map_array" << std::endl; - test_my_matrix > >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, mapped_vector_of_mapped_vector map_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::map_array > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, mapped_vector_of_mapped_vectormap_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::map_array > > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_STD_MAP -#ifdef USE_FLOAT - std::cout << "float, mapped_vector_of_mapped_vector std::map" << std::endl; - test_my_matrix > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, mapped_vector_of_mapped_vector std::map" << std::endl; - test_my_matrix > >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, mapped_vector_of_mapped_vector std::map" << std::endl; - test_my_matrix, ublas::row_major, std::map > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, mapped_vector_of_mapped_vector std::map" << std::endl; - test_my_matrix, ublas::row_major, std::map > > >, 3 > () (); -#endif -#endif -#endif -#endif - -#ifdef USE_GENERALIZED_VECTOR_OF_VECTOR -#ifdef USE_MAP_ARRAY -#ifdef USE_FLOAT - std::cout << "float,generalized_vector_of_vector map_array" << std::endl; - test_my_matrix > > >, 3 > () (); - test_my_matrix >, ublas::map_array > > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, generalized_vector_of_vector map_array" << std::endl; - test_my_matrix > > >, 3 > () (); - test_my_matrix >, ublas::map_array > > > >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, generalized_vector_of_vector map_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::vector, ublas::map_array > > > >, 3 > () (); - test_my_matrix, ublas::row_major, ublas::mapped_vector, ublas::map_array > >, ublas::map_array, ublas::map_array > > > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, generalized_vector_of_vector map_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::vector, ublas::map_array > > > >, 3 > () (); - test_my_matrix, ublas::row_major, ublas::mapped_vector, ublas::map_array > >, ublas::map_array, ublas::map_array > > > > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_STD_MAP -#ifdef USE_FLOAT - std::cout << "float, generalized_vector_of_vector std::map" << std::endl; - test_my_matrix > > >, 3 > () (); - test_my_matrix >, std::map > > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, generalized_vector_of_vector std::map" << std::endl; - test_my_matrix > > >, 3 > () (); - test_my_matrix >, std::map > > > >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, generalized_vector_of_vector std::map" << std::endl; - test_my_matrix, ublas::row_major, ublas::vector, std::map > > > >, 3 > () (); - test_my_matrix, ublas::row_major, ublas::mapped_vector, std::map > >, std::map, std::map > > > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, generalized_vector_of_vector std::map" << std::endl; - test_my_matrix, ublas::row_major, ublas::vector, std::map > > > >, 3 > () (); - test_my_matrix, ublas::row_major, ublas::mapped_vector, std::map > >, std::map, std::map > > > > >, 3 > () (); -#endif -#endif -#endif -#endif - -#ifdef USE_COMPRESSED_MATRIX -#ifdef USE_FLOAT - std::cout << "float compressed_matrix" << std::endl; - test_my_matrix, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double compressed_matrix" << std::endl; - test_my_matrix, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex compressed_matrix" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex compressed_matrix" << std::endl; - test_my_matrix >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_COORDINATE_MATRIX -#ifdef USE_FLOAT - std::cout << "float coordinate_matrix" << std::endl; - test_my_matrix, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double coordinate_matrix" << std::endl; - test_my_matrix, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex coordinate_matrix" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex coordinate_matrix" << std::endl; - test_my_matrix >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_MAPPED_VECTOR_OF_MAPPED_VECTOR -#ifdef USE_FLOAT - std::cout << "float mapped_vector_of_mapped_vector" << std::endl; - test_my_matrix, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double mapped_vector_of_mapped_vector" << std::endl; - test_my_matrix, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex mapped_vector_of_mapped_vector" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex mapped_vector_of_mapped_vector" << std::endl; - test_my_matrix >, 3 > () (); -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test4.cpp b/libs/numeric/ublas/test/test4.cpp deleted file mode 100644 index bf5816f5e..000000000 --- a/libs/numeric/ublas/test/test4.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test4.hpp" - -int main () { - test_matrix_vector (); - test_matrix (); - return 0; -} diff --git a/libs/numeric/ublas/test/test4.hpp b/libs/numeric/ublas/test/test4.hpp deleted file mode 100644 index fc5b48cbe..000000000 --- a/libs/numeric/ublas/test/test4.hpp +++ /dev/null @@ -1,39 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#ifndef TEST4_H -#define TEST4_H - -#include - -#include -#include -#include -#include -#include - -namespace ublas = boost::numeric::ublas; - -#include "common/init.hpp" - -//#define USE_BANDED -#define USE_DIAGONAL - - -void test_matrix_vector (); -void test_matrix (); - - -// FIXME slice are failing in assignment to zero elements -#undef USE_SLICE - -#endif diff --git a/libs/numeric/ublas/test/test42.cpp b/libs/numeric/ublas/test/test42.cpp deleted file mode 100644 index a1fd3f278..000000000 --- a/libs/numeric/ublas/test/test42.cpp +++ /dev/null @@ -1,361 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test4.hpp" - -// Test matrix & vector expression templates -template -struct test_my_matrix_vector { - typedef typename V::value_type value_type; - - template - void test_with (VP &v1, VP &v2, MP &m1) const { - { -#ifndef USE_DIAGONAL - // Rows and columns - initialize_matrix (m1); - for (int i = 0; i < N; ++ i) { - v2 = ublas::row (m1, i); - std::cout << "row (m, " << i << ") = " << v2 << std::endl; - v2 = ublas::column (m1, i); - std::cout << "column (m, " << i << ") = " << v2 << std::endl; - } - - // Outer product - initialize_vector (v1); - initialize_vector (v2); - v1 (0) = 0; - v1 (N - 1) = 0; - m1 = ublas::outer_prod (v1, v2); - std::cout << "outer_prod (v1, v2) = " << m1 << std::endl; - - // Matrix vector product - initialize_matrix (m1); - initialize_vector (v1); - v2 = ublas::prod (m1, v1); - std::cout << "prod (m1, v1) = " << v2 << std::endl; - v2 = ublas::prod (v1, m1); - std::cout << "prod (v1, m1) = " << v2 << std::endl; -#endif - } - } - void operator () () const { - { - V v1 (N), v2 (N); -#ifdef USE_BANDED - M m1 (N, N, 1, 1); -#endif -#ifdef USE_DIAGONAL - M m1 (N, N); -#endif - test_with (v1, v2, m1); - - ublas::matrix_row mr1 (m1, 1), mr2 (m1, 1); - test_with (mr1, mr2, m1); - - ublas::matrix_column mc1 (m1, 1), mc2 (m1, 1); - test_with (mc1, mc2, m1); - -#ifdef USE_RANGE - ublas::matrix_vector_range mvr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mvr2 (m1, ublas::range (0, N), ublas::range (0, N)); - test_with (mvr1, mvr2, m1); -#endif - -#ifdef USE_SLICE - ublas::matrix_vector_slice mvs1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - mvs2 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (mvs1, mvs2, m1); -#endif - } - } - - void operator () (int) const { -#ifdef USE_ADAPTOR - { -#ifdef USE_BANDED - V v1 (N), v2 (N); - M m1 (N, N, 1, 1); - ublas::banded_adaptor bam1 (m1, 1, 1); - test_with (v1, v2, bam1); - - ublas::matrix_row > mr1 (bam1, 1), mr2 (bam1, 1); - test_with (mr1, mr2, bam1); - - ublas::matrix_column > mc1 (bam1, 1), mc2 (bam1, 1); - test_with (mc1, mc2, bam1); - -#ifdef USE_RANGE - ublas::matrix_vector_range > mvr1 (bam1, ublas::range (0, N), ublas::range (0, N)), - mvr2 (bam1, ublas::range (0, N), ublas::range (0, N)); - test_with (mvr1, mvr2, bam1); -#endif - -#ifdef USE_SLICE - ublas::matrix_vector_slice > mvs1 (bam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - mvs2 (bam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (mvs1, mvs2, bam1); -#endif -#endif -#ifdef USE_DIAGONAL - V v1 (N), v2 (N); - M m1 (N, N); - ublas::diagonal_adaptor dam1 (m1); - test_with (v1, v2, dam1); - - ublas::matrix_row > mr1 (dam1, 1), mr2 (dam1, 1); - test_with (mr1, mr2, dam1); - - ublas::matrix_column > mc1 (dam1, 1), mc2 (dam1, 1); - test_with (mc1, mc2, dam1); - -#ifdef USE_RANGE - ublas::matrix_vector_range > mvr1 (dam1, ublas::range (0, N), ublas::range (0, N)), - mvr2 (dam1, ublas::range (0, N), ublas::range (0, N)); - test_with (mvr1, mvr2, dam1); -#endif - -#ifdef USE_SLICE - ublas::matrix_vector_slice > mvs1 (dam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - mvs2 (dam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (mvs1, mvs2, dam1); -#endif -#endif - } -#endif - } -}; - -// Test matrix & vector -void test_matrix_vector () { - std::cout << "test_matrix_vector" << std::endl; - -#ifdef USE_BANDED -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, bounded_array" << std::endl; - test_my_matrix_vector >, - ublas::banded_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::banded_matrix >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded_array" << std::endl; - test_my_matrix_vector >, - ublas::banded_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::banded_matrix >, 3> () (0); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::banded_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::banded_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::banded_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::banded_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (0); -#endif -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, unbounded_array" << std::endl; - test_my_matrix_vector >, - ublas::banded_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::banded_matrix >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, unbounded_array" << std::endl; - test_my_matrix_vector >, - ublas::banded_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::banded_matrix >, 3> () (0); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::banded_matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (); - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::banded_matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::banded_matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (); - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::banded_matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (0); -#endif -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "float, std::vector" << std::endl; - test_my_matrix_vector >, - ublas::banded_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::banded_matrix >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::vector" << std::endl; - test_my_matrix_vector >, - ublas::banded_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::banded_matrix >, 3> () (0); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::banded_matrix, ublas::row_major, std::vector > >, 3> () (); - test_my_matrix_vector, std::vector > >, - ublas::banded_matrix, ublas::row_major, std::vector > >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::banded_matrix, ublas::row_major, std::vector > >, 3> () (); - test_my_matrix_vector, std::vector > >, - ublas::banded_matrix, ublas::row_major, std::vector > >, 3> () (0); -#endif -#endif -#endif -#endif - -#ifdef USE_DIAGONAL -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, bounded_array" << std::endl; - test_my_matrix_vector >, - ublas::diagonal_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::diagonal_matrix >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded_array" << std::endl; - test_my_matrix_vector >, - ublas::diagonal_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::diagonal_matrix >, 3> () (0); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::diagonal_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::diagonal_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::diagonal_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::diagonal_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (0); -#endif -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, unbounded_array" << std::endl; - test_my_matrix_vector >, - ublas::diagonal_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::diagonal_matrix >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, unbounded_array" << std::endl; - test_my_matrix_vector >, - ublas::diagonal_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::diagonal_matrix >, 3> () (0); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::diagonal_matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (); - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::diagonal_matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::diagonal_matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (); - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::diagonal_matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (0); -#endif -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "float, std::vector" << std::endl; - test_my_matrix_vector >, - ublas::diagonal_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::diagonal_matrix >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::vector" << std::endl; - test_my_matrix_vector >, - ublas::diagonal_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::diagonal_matrix >, 3> () (0); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::diagonal_matrix, ublas::row_major, std::vector > >, 3> () (); - test_my_matrix_vector, std::vector > >, - ublas::diagonal_matrix, ublas::row_major, std::vector > >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::diagonal_matrix, ublas::row_major, std::vector > >, 3> () (); - test_my_matrix_vector, std::vector > >, - ublas::diagonal_matrix, ublas::row_major, std::vector > >, 3> () (0); -#endif -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test43.cpp b/libs/numeric/ublas/test/test43.cpp deleted file mode 100644 index 9db3c9b2c..000000000 --- a/libs/numeric/ublas/test/test43.cpp +++ /dev/null @@ -1,326 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test4.hpp" - -// Test matrix expression templates -template -struct test_my_matrix { - typedef typename M::value_type value_type; - - template - void test_with (MP &m1, MP &m2, MP &m3) const { - { - value_type t; - - // Default Construct - default_construct::test (); - - // Copy and swap - initialize_matrix (m1); - initialize_matrix (m2); - m1 = m2; - std::cout << "m1 = m2 = " << m1 << std::endl; - m1.assign_temporary (m2); - std::cout << "m1.assign_temporary (m2) = " << m1 << std::endl; - m1.swap (m2); - std::cout << "m1.swap (m2) = " << m1 << " " << m2 << std::endl; - - // Zero assignment - m1 = ublas::zero_matrix<> (m1.size1 (), m1.size2 ()); - std::cout << "m1.zero_matrix = " << m1 << std::endl; - m1 = m2; - - // Unary matrix operations resulting in a matrix - initialize_matrix (m1); - m2 = - m1; - std::cout << "- m1 = " << m2 << std::endl; - m2 = ublas::conj (m1); - std::cout << "conj (m1) = " << m2 << std::endl; - - // Binary matrix operations resulting in a matrix - initialize_matrix (m1); - initialize_matrix (m2); - m3 = m1 + m2; - std::cout << "m1 + m2 = " << m3 << std::endl; - m3 = m1 - m2; - std::cout << "m1 - m2 = " << m3 << std::endl; - - // Scaling a matrix - t = N; - initialize_matrix (m1); - m2 = value_type (1.) * m1; - std::cout << "1. * m1 = " << m2 << std::endl; - m2 = t * m1; - std::cout << "N * m1 = " << m2 << std::endl; - initialize_matrix (m1); - m2 = m1 * value_type (1.); - std::cout << "m1 * 1. = " << m2 << std::endl; - m2 = m1 * t; - std::cout << "m1 * N = " << m2 << std::endl; - - // Some assignments - initialize_matrix (m1); - initialize_matrix (m2); - m2 += m1; - std::cout << "m2 += m1 = " << m2 << std::endl; - m2 -= m1; - std::cout << "m2 -= m1 = " << m2 << std::endl; - m2 = m2 + m1; - std::cout << "m2 = m2 + m1 = " << m2 << std::endl; - m2 = m2 - m1; - std::cout << "m2 = m2 - m1 = " << m2 << std::endl; - m1 *= value_type (1.); - std::cout << "m1 *= 1. = " << m1 << std::endl; - m1 *= t; - std::cout << "m1 *= N = " << m1 << std::endl; - - // Transpose - initialize_matrix (m1); - m2 = ublas::trans (m1); - std::cout << "trans (m1) = " << m2 << std::endl; - - // Hermitean - initialize_matrix (m1); - m2 = ublas::herm (m1); - std::cout << "herm (m1) = " << m2 << std::endl; - - // Matrix multiplication - initialize_matrix (m1); - initialize_matrix (m2); - // Banded times banded isn't banded - std::cout << "prod (m1, m2) = " << ublas::prod (m1, m2) << std::endl; - } - } - void operator () () const { - { -#ifdef USE_BANDED - M m1 (N, N, 1, 1), m2 (N, N, 1, 1), m3 (N, N, 1, 1); -#endif -#ifdef USE_DIAGONAL - M m1 (N, N), m2 (N, N), m3 (N, N); -#endif - test_with (m1, m2, m3); - -#ifdef USE_RANGE - ublas::matrix_range mr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mr2 (m2, ublas::range (0, N), ublas::range (0, N)), - mr3 (m3, ublas::range (0, N), ublas::range (0, N)); - test_with (mr1, mr2, mr3); -#endif - -#ifdef USE_SLICE - ublas::matrix_slice ms1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms2 (m2, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms3 (m3, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (ms1, ms2, ms3); -#endif - } - -#ifdef USE_ADAPTOR - { -#ifdef USE_BANDED - M m1 (N, N, 1, 1), m2 (N, N, 1, 1), m3 (N, N, 1, 1); - ublas::banded_adaptor bam1 (m1, 1, 1), bam2 (m2, 1, 1), bam3 (m3, 1, 1); - test_with (bam1, bam2, bam3); - -#ifdef USE_RANGE - ublas::matrix_range > mr1 (bam1, ublas::range (0, N), ublas::range (0, N)), - mr2 (bam2, ublas::range (0, N), ublas::range (0, N)), - mr3 (bam3, ublas::range (0, N), ublas::range (0, N)); - test_with (mr1, mr2, mr3); -#endif - -#ifdef USE_SLICE - ublas::matrix_slice > ms1 (bam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms2 (bam2, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms3 (bam3, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (ms1, ms2, ms3); -#endif -#endif -#ifdef USE_DIAGONAL - M m1 (N, N), m2 (N, N), m3 (N, N); - ublas::diagonal_adaptor dam1 (m1), dam2 (m2), dam3 (m3); - test_with (dam1, dam2, dam3); - -#ifdef USE_RANGE - ublas::matrix_range > mr1 (dam1, ublas::range (0, N), ublas::range (0, N)), - mr2 (dam2, ublas::range (0, N), ublas::range (0, N)), - mr3 (dam3, ublas::range (0, N), ublas::range (0, N)); - test_with (mr1, mr2, mr3); -#endif - -#ifdef USE_SLICE - ublas::matrix_slice > ms1 (dam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms2 (dam2, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms3 (dam3, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (ms1, ms2, ms3); -#endif -#endif - } -#endif - - } -}; - -// Test matrix -void test_matrix () { - std::cout << "test_matrix" << std::endl; - -#ifdef USE_BANDED -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, bounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, unbounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, unbounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::unbounded_array > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::unbounded_array > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "float, std::vector" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::vector" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix, ublas::row_major, std::vector > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix, ublas::row_major, std::vector > >, 3 > () (); -#endif -#endif -#endif -#endif - -#ifdef USE_DIAGONAL -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, bounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, unbounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, unbounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::unbounded_array > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::unbounded_array > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "float, std::vector" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::vector" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix, ublas::row_major, std::vector > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix, ublas::row_major, std::vector > >, 3 > () (); -#endif -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test5.cpp b/libs/numeric/ublas/test/test5.cpp deleted file mode 100644 index 548cd6033..000000000 --- a/libs/numeric/ublas/test/test5.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test5.hpp" - -int main () { - test_matrix_vector (); - test_matrix (); - return 0; -} diff --git a/libs/numeric/ublas/test/test5.hpp b/libs/numeric/ublas/test/test5.hpp deleted file mode 100644 index a13dfa2ef..000000000 --- a/libs/numeric/ublas/test/test5.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#ifndef TEST5_H -#define TEST5_H - -#include - -#include -#include -#include -#include -#include - -namespace ublas = boost::numeric::ublas; - -#include "common/init.hpp" - -void test_matrix_vector (); -void test_matrix (); - - -// FIXME slice are failing in assignment to zero elements -#undef USE_SLICE - -#endif diff --git a/libs/numeric/ublas/test/test52.cpp b/libs/numeric/ublas/test/test52.cpp deleted file mode 100644 index 4803ce260..000000000 --- a/libs/numeric/ublas/test/test52.cpp +++ /dev/null @@ -1,214 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test5.hpp" - -// Test matrix & vector expression templates -template -struct test_my_matrix_vector { - typedef typename V::value_type value_type; - - template - void test_with (VP &v1, VP &v2, MP &m1) const { - { - // Rows and columns - initialize_matrix (m1); - for (int i = 0; i < N; ++ i) { - v2 = ublas::row (m1, i); - std::cout << "row (m, " << i << ") = " << v2 << std::endl; - v2 = ublas::column (m1, i); - std::cout << "column (m, " << i << ") = " << v2 << std::endl; - } - - // Outer product - initialize_vector (v1); - initialize_vector (v2); - v1 (0) = 0; - v2 (N - 1) = 0; - m1 = ublas::outer_prod (v1, v2); - std::cout << "outer_prod (v1, v2) = " << m1 << std::endl; - - // Matrix vector product - initialize_matrix (m1); - initialize_vector (v1); - v2 = ublas::prod (m1, v1); - std::cout << "prod (m1, v1) = " << v2 << std::endl; - v2 = ublas::prod (v1, m1); - std::cout << "prod (v1, m1) = " << v2 << std::endl; - } - } - void operator () () const { - { - V v1 (N), v2 (N); - M m1 (N, N); - test_with (v1, v2, m1); - - ublas::matrix_row mr1 (m1, N - 1), mr2 (m1, N - 1); - test_with (mr1, mr2, m1); - - ublas::matrix_column mc1 (m1, 0), mc2 (m1, 0); - test_with (mc1, mc2, m1); - -#ifdef USE_RANGE - ublas::matrix_vector_range mvr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mvr2 (m1, ublas::range (0, N), ublas::range (0, N)); - test_with (mvr1, mvr2, m1); -#endif - -#ifdef USE_SLICE - ublas::matrix_vector_slice mvs1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - mvs2 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (mvs1, mvs2, m1); -#endif - } - } - - void operator () (int) const { -#ifdef USE_ADAPTOR - { - V v1 (N), v2 (N); - M m1 (N, N); - ublas::triangular_adaptor tam1 (m1); - test_with (v1, v2, tam1); - - ublas::matrix_row > mr1 (tam1, N - 1), mr2 (tam1, N - 1); - test_with (mr1, mr2, tam1); - - ublas::matrix_column > mc1 (tam1, 0), mc2 (tam1, 0); - test_with (mc1, mc2, tam1); - -#ifdef USE_RANGE - ublas::matrix_vector_range > mvr1 (tam1, ublas::range (0, N), ublas::range (0, N)), - mvr2 (tam1, ublas::range (0, N), ublas::range (0, N)); - test_with (mvr1, mvr2, tam1); -#endif - -#ifdef USE_SLICE - ublas::matrix_vector_slice > mvs1 (tam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - mvs2 (tam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (mvs1, mvs2, tam1); -#endif - } -#endif - } -}; - -// Test matrix & vector -void test_matrix_vector () { - std::cout << "test_matrix_vector" << std::endl; - -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, bounded_array" << std::endl; - test_my_matrix_vector >, - ublas::triangular_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::triangular_matrix >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded_array" << std::endl; - test_my_matrix_vector >, - ublas::triangular_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::triangular_matrix >, 3> () (0); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::triangular_matrix, ublas::lower, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::triangular_matrix, ublas::lower, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::triangular_matrix, ublas::lower, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::triangular_matrix, ublas::lower, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (0); -#endif -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, unbounded_array" << std::endl; - test_my_matrix_vector >, - ublas::triangular_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::triangular_matrix >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, unbounded_array" << std::endl; - test_my_matrix_vector >, - ublas::triangular_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::triangular_matrix >, 3> () (0); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::triangular_matrix, ublas::lower, ublas::row_major, ublas::unbounded_array > >, 3> () (); - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::triangular_matrix, ublas::lower, ublas::row_major, ublas::unbounded_array > >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::triangular_matrix, ublas::lower, ublas::row_major, ublas::unbounded_array > >, 3> () (); - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::triangular_matrix, ublas::lower, ublas::row_major, ublas::unbounded_array > >, 3> () (0); -#endif -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "float, std::vector" << std::endl; - test_my_matrix_vector >, - ublas::triangular_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::triangular_matrix >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::vector" << std::endl; - test_my_matrix_vector >, - ublas::triangular_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::triangular_matrix >, 3> () (0); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::triangular_matrix, ublas::lower, ublas::row_major, std::vector > >, 3> () (); - test_my_matrix_vector, std::vector > >, - ublas::triangular_matrix, ublas::lower, ublas::row_major, std::vector > >, 3> () (0); - - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::triangular_matrix, ublas::lower, ublas::row_major, std::vector > >, 3> () (); - test_my_matrix_vector, std::vector > >, - ublas::triangular_matrix, ublas::lower, ublas::row_major, std::vector > >, 3> () (0); -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test53.cpp b/libs/numeric/ublas/test/test53.cpp deleted file mode 100644 index 250d462d4..000000000 --- a/libs/numeric/ublas/test/test53.cpp +++ /dev/null @@ -1,223 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test5.hpp" - -// Test matrix expression templates -template -struct test_my_matrix { - typedef typename M::value_type value_type; - - template - void test_with (MP &m1, MP &m2, MP &m3) const { - { - value_type t; - - // Default Construct - default_construct::test (); - - // Copy and swap - initialize_matrix (m1); - initialize_matrix (m2); - m1 = m2; - std::cout << "m1 = m2 = " << m1 << std::endl; - m1.assign_temporary (m2); - std::cout << "m1.assign_temporary (m2) = " << m1 << std::endl; - m1.swap (m2); - std::cout << "m1.swap (m2) = " << m1 << " " << m2 << std::endl; - - // Zero assignment - m1 = ublas::zero_matrix<> (m1.size1 (), m1.size2 ()); - std::cout << "m1.zero_matrix = " << m1 << std::endl; - m1 = m2; - - // Unary matrix operations resulting in a matrix - initialize_matrix (m1); - m2 = - m1; - std::cout << "- m1 = " << m2 << std::endl; - m2 = ublas::conj (m1); - std::cout << "conj (m1) = " << m2 << std::endl; - - // Binary matrix operations resulting in a matrix - initialize_matrix (m1); - initialize_matrix (m2); - m3 = m1 + m2; - std::cout << "m1 + m2 = " << m3 << std::endl; - m3 = m1 - m2; - std::cout << "m1 - m2 = " << m3 << std::endl; - - // Scaling a matrix - t = N; - initialize_matrix (m1); - m2 = value_type (1.) * m1; - std::cout << "1. * m1 = " << m2 << std::endl; - m2 = t * m1; - std::cout << "N * m1 = " << m2 << std::endl; - initialize_matrix (m1); - m2 = m1 * value_type (1.); - std::cout << "m1 * 1. = " << m2 << std::endl; - m2 = m1 * t; - std::cout << "m1 * N = " << m2 << std::endl; - - // Some assignments - initialize_matrix (m1); - initialize_matrix (m2); - m2 += m1; - std::cout << "m2 += m1 = " << m2 << std::endl; - m2 -= m1; - std::cout << "m2 -= m1 = " << m2 << std::endl; - m2 = m2 + m1; - std::cout << "m2 = m2 + m1 = " << m2 << std::endl; - m2 = m2 - m1; - std::cout << "m2 = m2 - m1 = " << m2 << std::endl; - m1 *= value_type (1.); - std::cout << "m1 *= 1. = " << m1 << std::endl; - m1 *= t; - std::cout << "m1 *= N = " << m1 << std::endl; - - // Transpose - initialize_matrix (m1); - // Transpose of a triangular isn't triangular of the same kind - std::cout << "trans (m1) = " << ublas::trans (m1) << std::endl; - - // Hermitian - initialize_matrix (m1); - // Hermitian of a triangular isn't hermitian of the same kind - std::cout << "herm (m1) = " << ublas::herm (m1) << std::endl; - - // Matrix multiplication - initialize_matrix (m1); - initialize_matrix (m2); - m3 = ublas::prod (m1, m2); - std::cout << "prod (m1, m2) = " << m3 << std::endl; - } - } - void operator () () const { - { - M m1 (N, N), m2 (N, N), m3 (N, N); - test_with (m1, m2, m3); - -#ifdef USE_RANGE - ublas::matrix_range mr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mr2 (m2, ublas::range (0, N), ublas::range (0, N)), - mr3 (m3, ublas::range (0, N), ublas::range (0, N)); - test_with (mr1, mr2, mr3); -#endif - -#ifdef USE_SLICE - ublas::matrix_slice ms1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms2 (m2, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms3 (m3, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (ms1, ms2, ms3); -#endif - } - -#ifdef USE_ADAPTOR - { - M m1 (N, N), m2 (N, N), m3 (N, N); - ublas::triangular_adaptor tam1 (m1), tam2 (m2), tam3 (m3); - test_with (tam1, tam2, tam3); - -#ifdef USE_RANGE - ublas::matrix_range > mr1 (tam1, ublas::range (0, N), ublas::range (0, N)), - mr2 (tam2, ublas::range (0, N), ublas::range (0, N)), - mr3 (tam3, ublas::range (0, N), ublas::range (0, N)); - test_with (mr1, mr2, mr3); -#endif - -#ifdef USE_SLICE - ublas::matrix_slice > ms1 (tam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms2 (tam2, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms3 (tam3, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (ms1, ms2, ms3); -#endif - } -#endif - } -}; - -// Test matrix -void test_matrix () { - std::cout << "test_matrix" << std::endl; - -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, bounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix, ublas::lower, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix, ublas::lower, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, unbounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, unbounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix, ublas::lower, ublas::row_major, ublas::unbounded_array > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix, ublas::lower, ublas::row_major, ublas::unbounded_array > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "float, std::vector" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::vector" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix, ublas::lower, ublas::row_major, std::vector > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE -std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix, ublas::lower, ublas::row_major, std::vector > >, 3 > () (); -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test6.cpp b/libs/numeric/ublas/test/test6.cpp deleted file mode 100644 index 61a5c3105..000000000 --- a/libs/numeric/ublas/test/test6.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test6.hpp" - -int main () { - test_matrix_vector (); - test_matrix (); - return 0; -} diff --git a/libs/numeric/ublas/test/test6.hpp b/libs/numeric/ublas/test/test6.hpp deleted file mode 100644 index 766d6b929..000000000 --- a/libs/numeric/ublas/test/test6.hpp +++ /dev/null @@ -1,32 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#ifndef TEST6_H -#define TEST6_H - -#include - -#include -#include -#include -#include -#include - -namespace ublas = boost::numeric::ublas; - -#include "common/init.hpp" - -void test_matrix_vector (); -void test_matrix (); - - -#endif diff --git a/libs/numeric/ublas/test/test62.cpp b/libs/numeric/ublas/test/test62.cpp deleted file mode 100644 index 5d7feb9a3..000000000 --- a/libs/numeric/ublas/test/test62.cpp +++ /dev/null @@ -1,218 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test6.hpp" - -// Test matrix & vector expression templates -template -struct test_my_matrix_vector { - typedef typename V::value_type value_type; - - template - void test_with (VP &v1, VP &v2, MP &m1) const { - { - // Rows and columns - initialize_matrix (m1); - for (int i = 0; i < N; ++ i) { - v2 = ublas::row (m1, i); - std::cout << "row (m, " << i << ") = " << v2 << std::endl; - v2 = ublas::column (m1, i); - std::cout << "column (m, " << i << ") = " << v2 << std::endl; - } - - // Outer product - initialize_vector (v1); - initialize_vector (v2); - v1 (0) = 0; - v1 (N - 1) = 0; - v2 (0) = 0; - v2 (N - 1) = 0; - m1 = ublas::outer_prod (v1, v2); - std::cout << "outer_prod (v1, v2) = " << m1 << std::endl; - - // Matrix vector product - initialize_matrix (m1); - initialize_vector (v1); - v2 = ublas::prod (m1, v1); - std::cout << "prod (m1, v1) = " << v2 << std::endl; - v2 = ublas::prod (v1, m1); - std::cout << "prod (v1, m1) = " << v2 << std::endl; - } - } - void operator () () const { - { - V v1 (N), v2 (N); - M m1 (N, N); - test_with (v1, v2, m1); - - ublas::matrix_row mr1 (m1, N - 1), mr2 (m1, N - 1); - test_with (mr1, mr2, m1); - - ublas::matrix_column mc1 (m1, 0), mc2 (m1, 0); - test_with (mc1, mc2, m1); - -#ifdef USE_RANGE - ublas::matrix_vector_range mvr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mvr2 (m1, ublas::range (0, N), ublas::range (0, N)); - test_with (mvr1, mvr2, m1); -#endif - -#ifdef USE_SLICE - ublas::matrix_vector_slice mvs1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - mvs2 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (mvs1, mvs2, m1); -#endif - } - } - - void operator () (int) const { -#ifdef USE_ADAPTOR - { - V v1 (N), v2 (N); - M m1 (N, N); - ublas::symmetric_adaptor tam1 (m1); - test_with (v1, v2, tam1); - - ublas::matrix_row > mr1 (tam1, N - 1), mr2 (tam1, N - 1); - test_with (mr1, mr2, tam1); - - ublas::matrix_column > mc1 (tam1, 0), mc2 (tam1, 0); - test_with (mc1, mc2, tam1); - -#ifdef USE_RANGE - ublas::matrix_vector_range > mvr1 (tam1, ublas::range (0, N), ublas::range (0, N)), - mvr2 (tam1, ublas::range (0, N), ublas::range (0, N)); - test_with (mvr1, mvr2, tam1); -#endif - -#ifdef USE_SLICE - ublas::matrix_vector_slice > mvs1 (tam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - mvs2 (tam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (mvs1, mvs2, tam1); -#endif - } -#endif - } -}; - -// Test matrix & vector -void test_matrix_vector () { - std::cout << "test_matrix_vector" << std::endl; - -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, bounded_array" << std::endl; - test_my_matrix_vector >, - ublas::symmetric_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::symmetric_matrix >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded_array" << std::endl; - test_my_matrix_vector >, - ublas::symmetric_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::symmetric_matrix >, 3> () (0); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::symmetric_matrix, ublas::lower, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::symmetric_matrix, ublas::lower, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::symmetric_matrix, ublas::lower, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::symmetric_matrix, ublas::lower, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (0); -#endif -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, unbounded_array" << std::endl; - test_my_matrix_vector >, - ublas::symmetric_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::symmetric_matrix >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, unbounded_array" << std::endl; - test_my_matrix_vector >, - ublas::symmetric_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::symmetric_matrix >, 3> () (0); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::symmetric_matrix, ublas::lower, ublas::row_major, ublas::unbounded_array > >, 3> () (); - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::symmetric_matrix, ublas::lower, ublas::row_major, ublas::unbounded_array > >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::symmetric_matrix, ublas::lower, ublas::row_major, ublas::unbounded_array > >, 3> () (); - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::symmetric_matrix, ublas::lower, ublas::row_major, ublas::unbounded_array > >, 3> () (0); -#endif -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "float, std::vector" << std::endl; - test_my_matrix_vector >, - ublas::symmetric_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::symmetric_matrix >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::vector" << std::endl; - test_my_matrix_vector >, - ublas::symmetric_matrix >, 3> () (); - test_my_matrix_vector >, - ublas::symmetric_matrix >, 3> () (0); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::symmetric_matrix, ublas::lower, ublas::row_major, std::vector > >, 3> () (); - test_my_matrix_vector, std::vector > >, - ublas::symmetric_matrix, ublas::lower, ublas::row_major, std::vector > >, 3> () (0); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::symmetric_matrix, ublas::lower, ublas::row_major, std::vector > >, 3> () (); - test_my_matrix_vector, std::vector > >, - ublas::symmetric_matrix, ublas::lower, ublas::row_major, std::vector > >, 3> () (0); -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test63.cpp b/libs/numeric/ublas/test/test63.cpp deleted file mode 100644 index 4a0013d2c..000000000 --- a/libs/numeric/ublas/test/test63.cpp +++ /dev/null @@ -1,223 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test6.hpp" - -// Test matrix expression templates -template -struct test_my_matrix { - typedef typename M::value_type value_type; - - template - void test_with (MP &m1, MP &m2, MP &m3) const { - { - value_type t; - - // Default Construct - default_construct::test (); - - // Copy and swap - initialize_matrix (m1); - initialize_matrix (m2); - m1 = m2; - std::cout << "m1 = m2 = " << m1 << std::endl; - m1.assign_temporary (m2); - std::cout << "m1.assign_temporary (m2) = " << m1 << std::endl; - m1.swap (m2); - std::cout << "m1.swap (m2) = " << m1 << " " << m2 << std::endl; - - // Zero assignment - m1 = ublas::zero_matrix<> (m1.size1 (), m1.size2 ()); - std::cout << "m1.zero_matrix = " << m1 << std::endl; - m1 = m2; - - // Unary matrix operations resulting in a matrix - initialize_matrix (m1); - m2 = - m1; - std::cout << "- m1 = " << m2 << std::endl; - m2 = ublas::conj (m1); - std::cout << "conj (m1) = " << m2 << std::endl; - - // Binary matrix operations resulting in a matrix - initialize_matrix (m1); - initialize_matrix (m2); - m3 = m1 + m2; - std::cout << "m1 + m2 = " << m3 << std::endl; - m3 = m1 - m2; - std::cout << "m1 - m2 = " << m3 << std::endl; - - // Scaling a matrix - t = N; - initialize_matrix (m1); - m2 = value_type (1.) * m1; - std::cout << "1. * m1 = " << m2 << std::endl; - m2 = t * m1; - std::cout << "N * m1 = " << m2 << std::endl; - initialize_matrix (m1); - m2 = m1 * value_type (1.); - std::cout << "m1 * 1. = " << m2 << std::endl; - m2 = m1 * t; - std::cout << "m1 * N = " << m2 << std::endl; - - // Some assignments - initialize_matrix (m1); - initialize_matrix (m2); - m2 += m1; - std::cout << "m2 += m1 = " << m2 << std::endl; - m2 -= m1; - std::cout << "m2 -= m1 = " << m2 << std::endl; - m2 = m2 + m1; - std::cout << "m2 = m2 + m1 = " << m2 << std::endl; - m2 = m2 - m1; - std::cout << "m2 = m1 - m1 = " << m2 << std::endl; - m1 *= value_type (1.); - std::cout << "m1 *= 1. = " << m1 << std::endl; - m1 *= t; - std::cout << "m1 *= N = " << m1 << std::endl; - - // Transpose - initialize_matrix (m1); - m2 = ublas::trans (m1); - std::cout << "trans (m1) = " << m2 << std::endl; - - // Hermitean - initialize_matrix (m1); - m2 = ublas::herm (m1); - std::cout << "herm (m1) = " << m2 << std::endl; - - // Matrix multiplication - initialize_matrix (m1); - initialize_matrix (m2); - m3 = ublas::prod (m1, m2); - std::cout << "prod (m1, m2) = " << m3 << std::endl; - } - } - void operator () () const { - { - M m1 (N, N), m2 (N, N), m3 (N, N); - test_with (m1, m2, m3); - -#ifdef USE_RANGE - ublas::matrix_range mr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mr2 (m2, ublas::range (0, N), ublas::range (0, N)), - mr3 (m3, ublas::range (0, N), ublas::range (0, N)); - test_with (mr1, mr2, mr3); -#endif - -#ifdef USE_SLICE - ublas::matrix_slice ms1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms2 (m2, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms3 (m3, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (ms1, ms2, ms3); -#endif - } - -#ifdef USE_ADAPTOR - { - M m1 (N, N), m2 (N, N), m3 (N, N); - ublas::symmetric_adaptor sam1 (m1), sam2 (m2), sam3 (m3); - test_with (sam1, sam2, sam3); - -#ifdef USE_RANGE - ublas::matrix_range > mr1 (sam1, ublas::range (0, N), ublas::range (0, N)), - mr2 (sam2, ublas::range (0, N), ublas::range (0, N)), - mr3 (sam3, ublas::range (0, N), ublas::range (0, N)); - test_with (mr1, mr2, mr3); -#endif - -#ifdef USE_SLICE - ublas::matrix_slice > ms1 (sam1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms2 (sam2, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms3 (sam3, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (ms1, ms2, ms3); -#endif - } -#endif - } -}; - -// Test matrix -void test_matrix () { - std::cout << "test_matrix" << std::endl; - -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, bounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, bounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix, ublas::lower, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, bounded_array" << std::endl; - test_my_matrix, ublas::lower, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "float, unbounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, unbounded_array" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix, ublas::lower, ublas::row_major, ublas::unbounded_array > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, unbounded_array" << std::endl; - test_my_matrix, ublas::lower, ublas::row_major, ublas::unbounded_array > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "float, std::vector" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "double, std::vector" << std::endl; - test_my_matrix >, 3 > () (); -#endif - -#ifdef USE_STD_COMPLEX -#ifdef USE_FLOAT - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix, ublas::lower, ublas::row_major, std::vector > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "std::complex, std::vector" << std::endl; - test_my_matrix, ublas::lower, ublas::row_major, std::vector > >, 3 > () (); -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test7.cpp b/libs/numeric/ublas/test/test7.cpp deleted file mode 100644 index f564031ce..000000000 --- a/libs/numeric/ublas/test/test7.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include - -#include -#include - -#include -#include -#include - -#include "test7.hpp" - -// this testcase requires fix of task #2473 - -int main () { - test_vector (); - test_matrix_vector (); - test_matrix (); - return 0; -} diff --git a/libs/numeric/ublas/test/test7.hpp b/libs/numeric/ublas/test/test7.hpp deleted file mode 100644 index 5dbae1fca..000000000 --- a/libs/numeric/ublas/test/test7.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#ifndef TEST7_H -#define TEST7_H - -#include - -#include -#include - -#include -#include -#include -#include -#include - -namespace ublas = boost::numeric::ublas; - -#include "common/init.hpp" - -void test_vector (); -void test_matrix_vector (); -void test_matrix (); - - -#endif diff --git a/libs/numeric/ublas/test/test71.cpp b/libs/numeric/ublas/test/test71.cpp deleted file mode 100644 index 89e9ccf78..000000000 --- a/libs/numeric/ublas/test/test71.cpp +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test7.hpp" - -// Test vector expression templates -template -struct test_my_vector { - typedef typename V::value_type value_type; - typedef typename V::size_type size_type; - typedef typename ublas::type_traits::real_type real_type; - - template - void test_with (VP &v1, VP &v2, VP &v3) const { - { - value_type t; - size_type i; - real_type n; - - // Copy and swap - initialize_vector (v1); - initialize_vector (v2); - v1 = v2; - std::cout << "v1 = v2 = " << v1 << std::endl; - v1.assign_temporary (v2); - std::cout << "v1.assign_temporary (v2) = " << v1 << std::endl; - v1.swap (v2); - std::cout << "v1.swap (v2) = " << v1 << " " << v2 << std::endl; - - // Zero assignment - v1 = ublas::zero_vector (v1.size ()); - std::cout << "v1.zero_vector = " << v1 << std::endl; - v1 = v2; - - // Unary vector operations resulting in a vector - initialize_vector (v1); - v2 = - v1; - std::cout << "- v1 = " << v2 << std::endl; - v2 = ublas::conj (v1); - std::cout << "conj (v1) = " << v2 << std::endl; - - // Binary vector operations resulting in a vector - initialize_vector (v1); - initialize_vector (v2); - v3 = v1 + v2; - std::cout << "v1 + v2 = " << v3 << std::endl; - - v3 = v1 - v2; - std::cout << "v1 - v2 = " << v3 << std::endl; - - // Scaling a vector - t = value_type (N); - initialize_vector (v1); - v2 = value_type (1.) * v1; - std::cout << "1. * v1 = " << v2 << std::endl; -// v2 = t * v1; - std::cout << "N * v1 = " << v2 << std::endl; - initialize_vector (v1); -// v2 = v1 * value_type (1.); - std::cout << "v1 * 1. = " << v2 << std::endl; -// v2 = v1 * t; - std::cout << "v1 * N = " << v2 << std::endl; - - // Some assignments - initialize_vector (v1); - initialize_vector (v2); - v2 += v1; - std::cout << "v2 += v1 = " << v2 << std::endl; - v2 -= v1; - std::cout << "v2 -= v1 = " << v2 << std::endl; - v2 = v2 + v1; - std::cout << "v2 = v2 + v1 = " << v2 << std::endl; - v2 = v2 - v1; - std::cout << "v2 = v2 - v1 = " << v2 << std::endl; - v1 *= value_type (1.); - std::cout << "v1 *= 1. = " << v1 << std::endl; - v1 *= t; - std::cout << "v1 *= N = " << v1 << std::endl; - - // Unary vector operations resulting in a scalar - initialize_vector (v1); - t = ublas::sum (v1); - std::cout << "sum (v1) = " << t << std::endl; - n = ublas::norm_1 (v1); - std::cout << "norm_1 (v1) = " << n << std::endl; - n = ublas::norm_2 (v1); - std::cout << "norm_2 (v1) = " << n << std::endl; - n = ublas::norm_inf (v1); - std::cout << "norm_inf (v1) = " << n << std::endl; - - i = ublas::index_norm_inf (v1); - std::cout << "index_norm_inf (v1) = " << i << std::endl; - - // Binary vector operations resulting in a scalar - initialize_vector (v1); - initialize_vector (v2); - t = ublas::inner_prod (v1, v2); - std::cout << "inner_prod (v1, v2) = " << t << std::endl; - } - } - void operator () () const { - { - V v1 (N), v2 (N), v3 (N); - test_with (v1, v2, v3); - -#ifdef USE_RANGE - ublas::vector_range vr1 (v1, ublas::range (0, N)), - vr2 (v2, ublas::range (0, N)), - vr3 (v3, ublas::range (0, N)); - test_with (vr1, vr2, vr3); -#endif - -#ifdef USE_SLICE - ublas::vector_slice vs1 (v1, ublas::slice (0, 1, N)), - vs2 (v2, ublas::slice (0, 1, N)), - vs3 (v3, ublas::slice (0, 1, N)); - test_with (vs1, vs2, vs3); -#endif - } - } -}; - -// Test vector -void test_vector () { - std::cout << "test_vector" << std::endl; - -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, bounded_array" << std::endl; - test_my_vector, ublas::bounded_array, 3> >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, bounded_array" << std::endl; - test_my_vector, ublas::bounded_array, 3> >, 3 > () (); -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, unbounded_array" << std::endl; - test_my_vector, ublas::unbounded_array > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, unbounded_array" << std::endl; - test_my_vector, ublas::unbounded_array > >, 3 > () (); -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, std::vector" << std::endl; - test_my_vector, std::vector > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, std::vector" << std::endl; - test_my_vector, std::vector > >, 3 > () (); -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test72.cpp b/libs/numeric/ublas/test/test72.cpp deleted file mode 100644 index bdc3f3e8b..000000000 --- a/libs/numeric/ublas/test/test72.cpp +++ /dev/null @@ -1,165 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test7.hpp" - -// Test matrix & vector expression templates -template -struct test_my_matrix_vector { - typedef typename V::value_type value_type; - - template - void test_with (VP &v1, VP &v2, MP &m1) const { - { - // Rows and columns - initialize_matrix (m1); - for (int i = 0; i < N; ++ i) { - v1 = ublas::row (m1, i); - std::cout << "row (m, " << i << ") = " << v1 << std::endl; - v1 = ublas::column (m1, i); - std::cout << "column (m, " << i << ") = " << v1 << std::endl; - } - - // Outer product - initialize_vector (v1); - initialize_vector (v2); - m1 = ublas::outer_prod (v1, v2); - std::cout << "outer_prod (v1, v2) = " << m1 << std::endl; - - // Matrix vector product - initialize_matrix (m1); - initialize_vector (v1); - v2 = ublas::prod (m1, v1); - std::cout << "prod (m1, v1) = " << v2 << std::endl; - v2 = ublas::prod (v1, m1); - std::cout << "prod (v1, m1) = " << v2 << std::endl; - } - } - void operator () () const { - { - V v1 (N), v2 (N); - M m1 (N, N); - test_with (v1, v2, m1); - - ublas::matrix_row mr1 (m1, 0), mr2 (m1, 1); - test_with (mr1, mr2, m1); - - ublas::matrix_column mc1 (m1, 0), mc2 (m1, 1); - test_with (mc1, mc2, m1); - -#ifdef USE_RANGE - ublas::matrix_vector_range mvr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mvr2 (m1, ublas::range (0, N), ublas::range (0, N)); - test_with (mvr1, mvr2, m1); -#endif - -#ifdef USE_SLICE - ublas::matrix_vector_slice mvs1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - mvs2 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (mvs1, mvs2, m1); -#endif - } - } -}; - -// Test matrix & vector -void test_matrix_vector () { - std::cout << "test_matrix_vector" << std::endl; - -#ifdef USE_MATRIX -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3> () (); -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::matrix, ublas::row_major, ublas::unbounded_array > >, 3> () (); -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::matrix, ublas::row_major, std::vector > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::matrix, ublas::row_major, std::vector > >, 3> () (); -#endif -#endif -#endif - -#ifdef USE_VECTOR_OF_VECTOR -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::vector_of_vector, ublas::row_major, ublas::bounded_array, 3>, 3 + 1> >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, bounded_array" << std::endl; - test_my_matrix_vector, ublas::bounded_array, 3> >, - ublas::vector_of_vector, ublas::row_major, ublas::bounded_array, 3>, 3 + 1> >, 3> () (); -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::vector_of_vector, ublas::row_major, ublas::unbounded_array > > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, unbounded_array" << std::endl; - test_my_matrix_vector, ublas::unbounded_array > >, - ublas::vector_of_vector, ublas::row_major, ublas::unbounded_array > > >, 3> () (); -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::vector_of_vector, ublas::row_major, std::vector > > >, 3> () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, std::vector" << std::endl; - test_my_matrix_vector, std::vector > >, - ublas::vector_of_vector, ublas::row_major, std::vector > > >, 3> () (); -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test73.cpp b/libs/numeric/ublas/test/test73.cpp deleted file mode 100644 index e2d68ceed..000000000 --- a/libs/numeric/ublas/test/test73.cpp +++ /dev/null @@ -1,202 +0,0 @@ -// -// Copyright (c) 2000-2002 -// Joerg Walter, Mathias Koch -// -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) -// -// The authors gratefully acknowledge the support of -// GeNeSys mbH & Co. KG in producing this work. -// - -#include "test7.hpp" - -// Test matrix expression templates -template -struct test_my_matrix { - typedef typename M::value_type value_type; - - template - void test_with (MP &m1, MP &m2, MP &m3) const { - { - value_type t; - - // Copy and swap - initialize_matrix (m1); - initialize_matrix (m2); - m1 = m2; - std::cout << "m1 = m2 = " << m1 << std::endl; - m1.assign_temporary (m2); - std::cout << "m1.assign_temporary (m2) = " << m1 << std::endl; - m1.swap (m2); - std::cout << "m1.swap (m2) = " << m1 << " " << m2 << std::endl; - - // Zero assignment - m1 = ublas::zero_matrix (m1.size1 (), m1.size2 ()); - std::cout << "m1.zero_matrix = " << m1 << std::endl; - m1 = m2; - - // Unary matrix operations resulting in a matrix - initialize_matrix (m1); - m2 = - m1; - std::cout << "- m1 = " << m2 << std::endl; - m2 = ublas::conj (m1); - std::cout << "conj (m1) = " << m2 << std::endl; - - // Binary matrix operations resulting in a matrix - initialize_matrix (m1); - initialize_matrix (m2); - m3 = m1 + m2; - std::cout << "m1 + m2 = " << m3 << std::endl; - m3 = m1 - m2; - std::cout << "m1 - m2 = " << m3 << std::endl; - - // Scaling a matrix - t = N; - initialize_matrix (m1); - m2 = value_type (1.) * m1; - std::cout << "1. * m1 = " << m2 << std::endl; - m2 = t * m1; - std::cout << "N * m1 = " << m2 << std::endl; - initialize_matrix (m1); - m2 = m1 * value_type (1.); - std::cout << "m1 * 1. = " << m2 << std::endl; - m2 = m1 * t; - std::cout << "m1 * N = " << m2 << std::endl; - - // Some assignments - initialize_matrix (m1); - initialize_matrix (m2); - m2 += m1; - std::cout << "m2 += m1 = " << m2 << std::endl; - m2 -= m1; - std::cout << "m2 -= m1 = " << m2 << std::endl; - m2 = m2 + m1; - std::cout << "m2 = m2 + m1 = " << m2 << std::endl; - m2 = m2 - m1; - std::cout << "m2 = m1 - m1 = " << m2 << std::endl; - m1 *= value_type (1.); - std::cout << "m1 *= 1. = " << m1 << std::endl; - m1 *= t; - std::cout << "m1 *= N = " << m1 << std::endl; - - // Transpose - initialize_matrix (m1); - m2 = ublas::trans (m1); - std::cout << "trans (m1) = " << m2 << std::endl; - - // Hermitean - initialize_matrix (m1); - m2 = ublas::herm (m1); - std::cout << "herm (m1) = " << m2 << std::endl; - - // Matrix multiplication - initialize_matrix (m1); - initialize_matrix (m2); - m3 = ublas::prod (m1, m2); - std::cout << "prod (m1, m2) = " << m3 << std::endl; - } - } - void operator () () const { - { - M m1 (N, N), m2 (N, N), m3 (N, N); - test_with (m1, m2, m3); - -#ifdef USE_RANGE - ublas::matrix_range mr1 (m1, ublas::range (0, N), ublas::range (0, N)), - mr2 (m2, ublas::range (0, N), ublas::range (0, N)), - mr3 (m3, ublas::range (0, N), ublas::range (0, N)); - test_with (mr1, mr2, mr3); -#endif - -#ifdef USE_SLICE - ublas::matrix_slice ms1 (m1, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms2 (m2, ublas::slice (0, 1, N), ublas::slice (0, 1, N)), - ms3 (m3, ublas::slice (0, 1, N), ublas::slice (0, 1, N)); - test_with (ms1, ms2, ms3); -#endif - } - } -}; - -// Test matrix -void test_matrix () { - std::cout << "test_matrix" << std::endl; - -#ifdef USE_MATRIX -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, bounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, bounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::bounded_array, 3 * 3> >, 3 > () (); -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, unbounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::unbounded_array > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, unbounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::unbounded_array > >, 3 > () (); -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, std::vector" << std::endl; - test_my_matrix, ublas::row_major, std::vector > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, std::vector" << std::endl; - test_my_matrix, ublas::row_major, std::vector > >, 3 > () (); -#endif -#endif -#endif - -#ifdef USE_VECTOR_OF_VECTOR -#ifdef USE_BOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, bounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::bounded_array, 3>, 3 + 1> >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, bounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::bounded_array, 3>, 3 + 1> >, 3 > () (); -#endif -#endif - -#ifdef USE_UNBOUNDED_ARRAY -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, unbounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::unbounded_array > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, unbounded_array" << std::endl; - test_my_matrix, ublas::row_major, ublas::unbounded_array > > >, 3 > () (); -#endif -#endif - -#ifdef USE_STD_VECTOR -#ifdef USE_FLOAT - std::cout << "boost::numeric::interval, std::vector" << std::endl; - test_my_matrix, ublas::row_major, std::vector > > >, 3 > () (); -#endif - -#ifdef USE_DOUBLE - std::cout << "boost::numeric::interval, std::vector" << std::endl; - test_my_matrix, ublas::row_major, std::vector > > >, 3 > () (); -#endif -#endif -#endif -} diff --git a/libs/numeric/ublas/test/test_assignment.cpp b/libs/numeric/ublas/test/test_assignment.cpp deleted file mode 100644 index c402ac2f8..000000000 --- a/libs/numeric/ublas/test/test_assignment.cpp +++ /dev/null @@ -1,780 +0,0 @@ -// -// Copyright (c) 2010 Athanasios Iliopoulos -// -// Distributed under the 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include "common/testhelper.hpp" -#include "utils.hpp" - -using namespace boost::numeric::ublas; - -template -bool test_vector() { - bool pass = true; - - V a(3), ra(3); - a <<= 1, 2, 3; - ra(0) = 1; ra(1) = 2; ra(2) = 3; - pass &= compare_to(a, ra); - - V b(7), rb(7); - b<<= a, 10, a; - rb(0) = 1; rb(1) = 2; rb(2) = 3; rb(3)=10, rb(4)= 1; rb(5)=2; rb(6)=3; - pass &= compare_to(b, rb); - - { - V c(6), rc(6); - c <<= 1, move(2), 3 ,4, 5, move(-5), 10, 10; - rc(0) = 1; rc(1) = 10; rc(2) = 10; rc(3) = 3; rc(4) = 4; rc(5) = 5; - pass &= compare_to(c, rc); - - V d(6), rd(6); - d <<= 1, move_to(3), 3 ,4, 5, move_to(1), 10, 10; - rd(0) = 1; rd(1) = 10; rd(2) = 10; rd(3) = 3; rd(4) = 4; rd(5) = 5; - pass &= compare_to(d, rd); - } - - { - V c(6), rc(6); - c <<= 1, move<2>(), 3 ,4, 5, move<-5>(), 10, 10; - rc(0) = 1; rc(1) = 10; rc(2) = 10; rc(3) = 3; rc(4) = 4; rc(5) = 5; - pass &= compare_to(c, rc); - - V d(6), rd(6); - d <<= 1, move_to<3>(), 3 ,4, 5, move_to<1>(), 10, 10; - rd(0) = 1; rd(1) = 10; rd(2) = 10; rd(3) = 3; rd(4) = 4; rd(5) = 5; - pass &= compare_to(d, rd); - } - - - { - V f(6), rf(6); - f <<= 5, 5, 5, 5, 5, 5; - V fa(3); fa<<= 1, 2, 3; - f <<= fill_policy::index_plus_assign(), fa; - rf <<= 6,7,8, 5, 5, 5; - pass &= compare_to(f, rf); - } - - { - V f(6), rf(6); - f <<= 5, 5, 5, 5, 5, 5; - V fa(3); fa<<= 1, 2, 3; - f <<= fill_policy::index_minus_assign(), fa; - rf <<= 4,3,2, 5, 5, 5; - pass &= compare_to(f, rf); - } - - return pass; -} - -template -bool test_vector_sparse_push_back() { - bool pass = true; - - V a(3), ra(3); - a <<= fill_policy::sparse_push_back(), 1, 2, 3; - ra(0) = 1; ra(1) = 2; ra(2) = 3; - pass &= compare_to(a, ra); - - V b(7), rb(7); - b<<= fill_policy::sparse_push_back(), a, 10, a; - rb(0) = 1; rb(1) = 2; rb(2) = 3; rb(3)=10, rb(4)= 1; rb(5)=2; rb(6)=3; - pass &= compare_to(b, rb); - - V c(6), rc(6); - c <<= fill_policy::sparse_push_back(), 1, move(2), 3 ,4, 5; // Move back (i.e. negative is dangerous for push_back) - rc(0) = 1; rc(1) = 0; rc(2) = 0; rc(3) = 3; rc(4) = 4; rc(5) = 5; - pass &= compare_to(c, rc); - - V d(6), rd(6); - d <<= fill_policy::sparse_push_back(), 1, move_to(3), 3 ,4, 5; // Move back (i.e. before current index is dangerous for push_back) - rd(0) = 1; rd(1) = 0; rd(2) = 0; rd(3) = 3; rd(4) = 4; rd(5) = 5; - pass &= compare_to(d, rd); - - V e(6), re(6); - e <<= fill_policy::sparse_push_back(), 1, move_to(3), 3 ,4, 5, fill_policy::sparse_insert(), move_to(1), 10, 10; // If you want to move back, use this - re(0) = 1; re(1) = 10; re(2) = 10; re(3) = 3; re(4) = 4; re(5) = 5; - pass &= compare_to(e, re); - - return pass; -} - - -template -bool test_vector_sparse_insert() { - bool pass = true; - - V a(3), ra(3); - a <<= fill_policy::sparse_insert(), 1, 2, 3; - ra(0) = 1; ra(1) = 2; ra(2) = 3; - pass &= compare_to(a, ra); - - V b(7), rb(7); - b<<= fill_policy::sparse_insert(), a, 10, a; - rb(0) = 1; rb(1) = 2; rb(2) = 3; rb(3)=10, rb(4)= 1; rb(5)=2; rb(6)=3; - pass &= compare_to(b, rb); - - V c(6), rc(6); - c <<= fill_policy::sparse_insert(), 1, move(2), 3 ,4, 5, move(-5), 10, 10; // Move back (i.e. negative is dangerous for sparse) - rc(0) = 1; rc(1) = 10; rc(2) = 10; rc(3) = 3; rc(4) = 4; rc(5) = 5; - pass &= compare_to(c, rc); - - - V d(6), rd(6); - d <<= fill_policy::sparse_insert(), 1, move_to(3), 3 ,4, 5, move_to(1), 10, 10; // Move back (i.e.before is dangerous for sparse) - rd(0) = 1; rd(1) = 10; rd(2) = 10; rd(3) = 3; rd(4) = 4; rd(5) = 5; - pass &= compare_to(d, rd); - - - return pass; -} - - -template -bool test_matrix() { - bool pass = true; - - V A(3,3), RA(3,3); - A <<= 1, 2, 3, 4, 5, 6, 7, 8, 9; - RA(0,0)= 1; RA(0,1)=2; RA(0,2)=3; - RA(1,0)= 4; RA(1,1)=5; RA(1,2)=6; - RA(2,0)= 7; RA(2,1)=8; RA(2,2)=9; - pass &= compare_to(A, RA); - - { - V B(3,3), RB(3,3); - vector b(3); - b<<= 4,5,6; - B<<= 1, 2, 3, b, 7, project(b, range(1,3)); - RB<<=1, 2, 3, 4, 5, 6, 7, 5, 6; // If the first worked we can now probably use it. - pass &= compare_to(B, RB); - } - - { - V B(3,3), RB(3,3); - vector b(3); - b<<= 4,5,6; - B<<= move(1,0), b, move_to(0,0), 1, 2, 3, move(1,0), 7, project(b, range(1,3)); - RB<<=1, 2, 3, 4, 5, 6, 7, 5, 6; - pass &= compare_to(B, RB); - } - - { - V B(3,3), RB(3,3); - vector b(9); - b<<= 1, 2, 3, 4, 5, 6, 7, 8, 9; - B<<=b; - RB<<=1, 2, 3, 4, 5, 6, 7, 8, 9; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - V C(2,2); - C <<= 2, 3, - 4, 5; - B<<= C,C, - C,C; - RB <<= 2,3,2,3, - 4,5,4,5, - 2,3,2,3, - 4,5,4,5; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - V C(2,2); - C <<= 2, 3, 4, 5; - B<<= C, zero_matrix(2,2), - zero_matrix(2,2), C; - RB<<= 2,3,0,0, - 4,5,0,0, - 0,0,2,3, - 0,0,4,5; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - V C(2,2); - C <<= 2, 3, 4, 5; - B<<= C, zero_matrix(2,2), - zero_matrix(2,2), C; - RB<<= 2,3,0,0, - 4,5,0,0, - 0,0,2,3, - 0,0,4,5; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); // We need that because of the non-zero instatiation of dense types. - V C(2,2); - C <<= 2, 3, 4, 5; - B<<= move(1,1), C; - RB<<= 0,0,0,0, - 0,2,3,0, - 0,4,5,0, - 0,0,0,0; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<= move_to(0,1), 2, 3, next_row(), 1, 2, next_row(), 4, 5; - RB<<= 0,2,3,0, - 1,2,0,0, - 4,5,0,0, - 0,0,0,0; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=traverse_policy::by_column(), move_to(0,1), 2, 3, 6, next_column(), 4, 5; - RB<<= 0,2,4,0, - 0,3,5,0, - 0,6,0,0, - 0,0,0,0; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=traverse_policy::by_column(), move_to(0,1), 2, 3, next_row(), traverse_policy::by_row(), 4, 5; - RB<<= 0,2,0,0, - 0,3,0,0, - 0,0,0,0, - 4,5,0,0; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=traverse_policy::by_column(), move_to(0,1), 2, 3, begin2(), traverse_policy::by_row(), 4, 5, 6, 7, 8; - RB<<= 0,2,0,0, - 0,3,0,0, - 4,5,6,7, - 8,0,0,0; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=traverse_policy::by_column(), move_to(0,1), 2, 3, begin2(), traverse_policy::by_row(), 4, 5, 6, 7, 8,9, begin1(), 1, 2; - RB<<= 0,2,1,2, - 0,3,0,0, - 4,5,6,7, - 8,9,0,0; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = scalar_matrix(4,4,1); - V C(2,2); - C <<= 1, 2, 3, 4; - B<<= fill_policy::index_plus_assign(), move(1,1), C; - RB<<= 1,1,1,1, - 1,2,3,1, - 1,4,5,1, - 1,1,1,1; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = scalar_matrix(4,4,5); - V C(2,2); - C <<= 1, 2, 3, 4; - B<<= fill_policy::index_minus_assign(), move(1,1), C; - RB<<= 5,5,5,5, - 5,4,3,5, - 5,2,1,5, - 5,5,5,5; - pass &= compare_to(B, RB); - } - - - return pass; -} - -template -bool test_matrix_sparse_push_back() { - bool pass = true; - - V A(3,3), RA(3,3); - A <<= fill_policy::sparse_push_back(), 1, 2, 3, 4, 5, 6, 7, 8, 9; - RA(0,0)= 1; RA(0,1)=2; RA(0,2)=3; - RA(1,0)= 4; RA(1,1)=5; RA(1,2)=6; - RA(2,0)= 7; RA(2,1)=8; RA(2,2)=9; - pass &= compare_to(A, RA); - - { - V B(3,3), RB(3,3); - vector b(3); - b<<= 4,5,6; - B<<=fill_policy::sparse_push_back(), 1, 2, 3, b, 7, project(b, range(1,3)); - RB<<= 1, 2, 3, 4, 5, 6, 7, 5, 6; // If the first worked we can now probably use it. - pass &= compare_to(B, RB); - } - - { - V B(3,3), RB(3,3); - vector b(3); - b<<= 4,5,6; - B<<=fill_policy::sparse_push_back(), move(1,0), b, fill_policy::sparse_insert(), move_to(0,0), 1, 2, 3, move(1,0), 7, project(b, range(1,3)); - RB<<=1, 2, 3, 4, 5, 6, 7, 5, 6; - pass &= compare_to(B, RB); - } - - { - V B(3,3), RB(3,3); - vector b(9); - b<<= 1, 2, 3, 4, 5, 6, 7, 8, 9; - B<<=b; - RB<<=1, 2, 3, 4, 5, 6, 7, 8, 9; - pass &= compare_to(B, RB); - } - - - { - V B(4,4), RB(4,4); - V C(2,2); - C <<= 2, 3, - 4, 5; - // It might get complicated for sparse push_back, this must go into the tutorial. (This way is not convient nor fast) - B<<=fill_policy::sparse_push_back(), C, move_to(2,2), C, fill_policy::sparse_insert(), move_to(0,2), C, C; - RB <<= 2,3,2,3, - 4,5,4,5, - 2,3,2,3, - 4,5,4,5; - pass &= compare_to(B, RB); - } - - - { - V B(4,4), RB(4,4); - V C(2,2); - C <<= 2, 3, 4, 5; - B<<=fill_policy::sparse_push_back(), C, move_to(2,2), C; - RB<<= 2,3,0,0, - 4,5,0,0, - 0,0,2,3, - 0,0,4,5; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - V C(2,2); - C <<= 2, 3, 4, 5; - B<<=fill_policy::sparse_push_back(), move(1,1), C; - RB<<= 0,0,0,0, - 0,2,3,0, - 0,4,5,0, - 0,0,0,0; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=fill_policy::sparse_push_back(), move_to(0,1), 2, 3, next_row(), 1, 2, next_row(), 4, 5; - RB<<= 0,2,3,0, - 1,2,0,0, - 4,5,0,0, - 0,0,0,0; - pass &= compare_to(B, RB); - } - // The next will not work with sparse push_back because elements that are prior to the ones already in are attempted to be added -/* - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=fill_policy::sparse_push_back(),traverse_policy::by_column(), move_to(0,1), 2, 3, 6, next_column(), 4, 5; - RB<<= 0,2,4,0, - 0,3,5,0, - 0,6,0,0, - 0,0,0,0; - pass &= compare_to(B, RB); - } -*/ - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=fill_policy::sparse_push_back(),traverse_policy::by_column(), move_to(0,1), 2, 3, next_row(), traverse_policy::by_row(), 4, 5; - RB<<= 0,2,0,0, - 0,3,0,0, - 0,0,0,0, - 4,5,0,0; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=fill_policy::sparse_push_back(),traverse_policy::by_column(), move_to(0,1), 2, 3, begin2(), traverse_policy::by_row(), 4, 5, 6, 7, 8; - RB<<= 0,2,0,0, - 0,3,0,0, - 4,5,6,7, - 8,0,0,0; - pass &= compare_to(B, RB); - } - - // The next will not work with sparse push_back because elements that are prior to the ones already in are attempted to be added -/* - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=fill_policy::sparse_push_back(),traverse_policy::by_column(), move_to(0,1), 2, 3, begin2(), traverse_policy::by_row(), 4, 5, 6, 7, 8,9, begin1(), 1, 2; - RB<<= 0,2,1,2, - 0,3,0,0, - 4,5,6,7, - 8,9,0,0; - pass &= compare_to(B, RB); - } -*/ - return pass; -} - -template -bool test_matrix_sparse_insert() { - bool pass = true; - - V A(3,3), RA(3,3); - A <<= fill_policy::sparse_insert(), 1, 2, 3, 4, 5, 6, 7, 8, 9; - RA(0,0)= 1; RA(0,1)=2; RA(0,2)=3; - RA(1,0)= 4; RA(1,1)=5; RA(1,2)=6; - RA(2,0)= 7; RA(2,1)=8; RA(2,2)=9; - pass &= compare_to(A, RA); - - { - V B(3,3), RB(3,3); - vector b(3); - b<<= 4,5,6; - B<<=fill_policy::sparse_insert(), 1, 2, 3, b, 7, project(b, range(1,3)); - RB<<=1, 2, 3, 4, 5, 6, 7, 5, 6; // If the first worked we can now probably use it. - pass &= compare_to(B, RB); - } - - { - V B(3,3), RB(3,3); - vector b(3); - b<<= 4,5,6; - B<<=fill_policy::sparse_insert(), move(1,0), b, fill_policy::sparse_insert(), move_to(0,0), 1, 2, 3, move(1,0), 7, project(b, range(1,3)); - RB<<=1, 2, 3, 4, 5, 6, 7, 5, 6; - pass &= compare_to(B, RB); - } - - { - V B(3,3), RB(3,3); - vector b(9); - b<<= 1, 2, 3, 4, 5, 6, 7, 8, 9; - B<<=b; - RB<<=1, 2, 3, 4, 5, 6, 7, 8, 9; - pass &= compare_to(B, RB); - } - - - { - V B(4,4), RB(4,4); - V C(2,2); - C <<= 2, 3, - 4, 5; - B<<=fill_policy::sparse_insert(), C, C, C, C; - RB <<= 2,3,2,3, - 4,5,4,5, - 2,3,2,3, - 4,5,4,5; - pass &= compare_to(B, RB); - } - - - { - V B(4,4), RB(4,4); - V C(2,2); - C <<= 2, 3, 4, 5; - B<<=fill_policy::sparse_insert(), C, move_to(2,2), C; - RB<<= 2,3,0,0, - 4,5,0,0, - 0,0,2,3, - 0,0,4,5; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - V C(2,2); - C <<= 2, 3, 4, 5; - B<<=fill_policy::sparse_insert(), move(1,1), C; - RB<<= 0,0,0,0, - 0,2,3,0, - 0,4,5,0, - 0,0,0,0; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=fill_policy::sparse_insert(), move_to(0,1), 2, 3, next_row(), 1, 2, next_row(), 4, 5; - RB<<= 0,2,3,0, - 1,2,0,0, - 4,5,0,0, - 0,0,0,0; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=fill_policy::sparse_insert(),traverse_policy::by_column(), move_to(0,1), 2, 3, 6, next_column(), 4, 5; - RB<<= 0,2,4,0, - 0,3,5,0, - 0,6,0,0, - 0,0,0,0; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=fill_policy::sparse_insert(),traverse_policy::by_column(), move_to(0,1), 2, 3, next_row(), traverse_policy::by_row(), 4, 5; - RB<<= 0,2,0,0, - 0,3,0,0, - 0,0,0,0, - 4,5,0,0; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=fill_policy::sparse_insert(),traverse_policy::by_column(), move_to(0,1), 2, 3, begin2(), traverse_policy::by_row(), 4, 5, 6, 7, 8; - RB<<= 0,2,0,0, - 0,3,0,0, - 4,5,6,7, - 8,0,0,0; - pass &= compare_to(B, RB); - } - - { - V B(4,4), RB(4,4); - B = zero_matrix(4,4); - B<<=fill_policy::sparse_insert(),traverse_policy::by_column(), move_to(0,1), 2, 3, begin2(), traverse_policy::by_row(), 4, 5, 6, 7, 8,9, begin1(), 1, 2; - RB<<= 0,2,1,2, - 0,3,0,0, - 4,5,6,7, - 8,9,0,0; - pass &= compare_to(B, RB); - } - - return pass; -} - - -BOOST_UBLAS_TEST_DEF (test_vector) { - - BOOST_UBLAS_DEBUG_TRACE( "Starting operator \"<<= \" vector assignment tests" ); - - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - - BOOST_UBLAS_TEST_CHECK((test_vector >())); - BOOST_UBLAS_TEST_CHECK((test_vector >())); - BOOST_UBLAS_TEST_CHECK((test_vector >())); - BOOST_UBLAS_TEST_CHECK((test_vector >())); - BOOST_UBLAS_TEST_CHECK((test_vector >())); - BOOST_UBLAS_TEST_CHECK((test_vector >())); - BOOST_UBLAS_TEST_CHECK((test_vector >())); - BOOST_UBLAS_TEST_CHECK((test_vector >())); - - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()) - BOOST_UBLAS_TEST_CHECK(test_vector >()) - BOOST_UBLAS_TEST_CHECK(test_vector >()); - - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()) - BOOST_UBLAS_TEST_CHECK(test_vector >()) - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - BOOST_UBLAS_TEST_CHECK(test_vector >()); - - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_push_back >()); - - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_vector_sparse_insert >()); -} - -BOOST_UBLAS_TEST_DEF (test_matrix) { - - BOOST_UBLAS_DEBUG_TRACE( "Starting operator \"<<= \" matrix assignment tests" ); - - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - - BOOST_UBLAS_TEST_CHECK((test_matrix >())); - BOOST_UBLAS_TEST_CHECK((test_matrix >())); - BOOST_UBLAS_TEST_CHECK((test_matrix >())); - BOOST_UBLAS_TEST_CHECK((test_matrix >())); - BOOST_UBLAS_TEST_CHECK((test_matrix >())); - BOOST_UBLAS_TEST_CHECK((test_matrix >())); - BOOST_UBLAS_TEST_CHECK((test_matrix >())); - BOOST_UBLAS_TEST_CHECK((test_matrix >())); - - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()) - BOOST_UBLAS_TEST_CHECK(test_matrix >()) - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()) - BOOST_UBLAS_TEST_CHECK(test_matrix >()) - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - BOOST_UBLAS_TEST_CHECK(test_matrix >()); - - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_push_back >()); - - - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_sparse_insert >()); -} - - -int main () { - BOOST_UBLAS_TEST_BEGIN(); - - BOOST_UBLAS_TEST_DO( test_vector ); - BOOST_UBLAS_TEST_DO( test_matrix ); - - BOOST_UBLAS_TEST_END(); - - return EXIT_SUCCESS; -} diff --git a/libs/numeric/ublas/test/test_banded_storage_layout.cpp b/libs/numeric/ublas/test/test_banded_storage_layout.cpp deleted file mode 100644 index 6b4e68a7a..000000000 --- a/libs/numeric/ublas/test/test_banded_storage_layout.cpp +++ /dev/null @@ -1,291 +0,0 @@ - -#include -#include -#include -#include -#include - -#include "utils.hpp" - -using namespace boost::numeric::ublas; - -int expected_index( int index, column_major ) { - // this is the data shown on http://www.netlib.org/lapack/lug/node124.html - // read column-by-column, aka column_major - int mapping[] = { 0, 11, 21, 31, 12, 22, 32, 42, 23, 33, 43, 53, 34, 44, 54, 0, 45, 55, 0, 0 }; - return mapping[ index ]; -} - - -int expected_index( int index, row_major ) { - // this is the data shown on http://www.netlib.org/lapack/lug/node124.html - // read row-by-row, aka row_major - int mapping[] = { 0, 0, 11, 12, 0, 21, 22, 23, 31, 32, 33, 34, 42, 43, 44, 45, 53, 54, 55, 0 }; - return mapping[ index ]; -} - -int expected_index_6_by_5( int index, column_major ) { - // read column-by-column, aka column_major - int mapping[] = { 0, 11, 21, 31, 12, 22, 32, 42, 23, 33, 43, 53, 34, 44, 54, 64, 45, 55, 65, 0 }; - return mapping[ index ]; -} - -int expected_index_6_by_5( int index, row_major ) { - // read row-by-row, aka row_major - int mapping[] = { 0, 0, 11, 12, 0, 21, 22, 23, 31, 32, 33, 34, 42, 43, 44, 45, 53, 54, 55, 0, 64, 65, 0, 0 }; - return mapping[ index ]; -} - -int expected_index_5_by_6( int index, column_major ) { - // read column-by-column, aka column_major - int mapping[] = { 0, 11, 21, 31, 12, 22, 32, 42, 23, 33, 43, 53, 34, 44, 54, 0, 45, 55, 0, 0, 56, 0, 0, 0 }; - return mapping[ index ]; -} - -int expected_index_5_by_6( int index, row_major ) { - // read row-by-row, aka row_major - int mapping[] = { 0, 0, 11, 12, 0, 21, 22, 23, 31, 32, 33, 34, 42, 43, 44, 45, 53, 54, 55, 56}; - return mapping[ index ]; -} - -template< typename Orientation > -bool test_band_storage() { - - int m = 5; - int n = 5; - int kl = 2; - int ku = 1; - - banded_matrix< int, Orientation > test_matrix( m, n, kl, ku ); - test_matrix.clear(); - int band_storage_size = test_matrix.data().size(); - - test_matrix( 0, 0 ) = 11; - test_matrix( 0, 1 ) = 12; - test_matrix( 1, 0 ) = 21; - test_matrix( 1, 1 ) = 22; - test_matrix( 1, 2 ) = 23; - test_matrix( 2, 0 ) = 31; - test_matrix( 2, 1 ) = 32; - test_matrix( 2, 2 ) = 33; - test_matrix( 2, 3 ) = 34; - test_matrix( 3, 1 ) = 42; - test_matrix( 3, 2 ) = 43; - test_matrix( 3, 3 ) = 44; - test_matrix( 3, 4 ) = 45; - test_matrix( 4, 2 ) = 53; - test_matrix( 4, 3 ) = 54; - test_matrix( 4, 4 ) = 55; - - BOOST_UBLAS_TEST_TRACE( "Full matrix" ); - BOOST_UBLAS_TEST_TRACE( std::setw( 3 ) << test_matrix ); - - BOOST_UBLAS_TEST_TRACE( "data() of matrix" ); - for ( int i = 0; i < band_storage_size; ++i ) { - std::cerr << test_matrix.data()[ i ] << " "; - } - std::cerr << std::endl; - - BOOST_UBLAS_TEST_TRACE( "Expected data() of matrix" ); - for ( int i = 0; i < band_storage_size; ++i ) { - std::cerr << expected_index( i, Orientation() ) << " "; - } - std::cerr << std::endl; - - size_t mismatch = 0; - - for ( int i = 0; i < band_storage_size; ++i ) { - if ( test_matrix.data()[ i ] != expected_index( i, Orientation() ) ) { - ++mismatch; - } - } - - return 0 == mismatch; -} - -template< typename Orientation > -bool test_band_storage_6_by_5() { - - int m = 6; - int n = 5; - int kl = 2; - int ku = 1; - - - banded_matrix< int, Orientation > test_matrix( m, n, kl, ku ); - test_matrix.clear(); - int band_storage_size = test_matrix.data().size(); - - test_matrix( 0, 0 ) = 11; - test_matrix( 0, 1 ) = 12; - test_matrix( 1, 0 ) = 21; - test_matrix( 1, 1 ) = 22; - test_matrix( 1, 2 ) = 23; - test_matrix( 2, 0 ) = 31; - test_matrix( 2, 1 ) = 32; - test_matrix( 2, 2 ) = 33; - test_matrix( 2, 3 ) = 34; - test_matrix( 3, 1 ) = 42; - test_matrix( 3, 2 ) = 43; - test_matrix( 3, 3 ) = 44; - test_matrix( 3, 4 ) = 45; - test_matrix( 4, 2 ) = 53; - test_matrix( 4, 3 ) = 54; - test_matrix( 4, 4 ) = 55; - test_matrix( 5, 3 ) = 64; - test_matrix( 5, 4 ) = 65; - - BOOST_UBLAS_TEST_TRACE( "Full matrix" ); - BOOST_UBLAS_TEST_TRACE( std::setw( 3 ) << test_matrix ); - - BOOST_UBLAS_TEST_TRACE( "data() of matrix" ); - for ( int i = 0; i < band_storage_size; ++i ) { - std::cerr << test_matrix.data()[ i ] << " "; - } - std::cerr << std::endl; - - BOOST_UBLAS_TEST_TRACE( "Expected data() of matrix" ); - for ( int i = 0; i < band_storage_size; ++i ) { - std::cerr << expected_index_6_by_5( i, Orientation() ) << " "; - } - std::cerr << std::endl; - - size_t mismatch = 0; - - for ( int i = 0; i < band_storage_size; ++i ) { - if ( test_matrix.data()[ i ] != expected_index_6_by_5( i, Orientation() ) ) { - ++mismatch; - } - } - - return 0 == mismatch; -} - -template< typename Orientation > -bool test_band_storage_5_by_6() { - - int m = 5; - int n = 6; - int kl = 2; - int ku = 1; - - banded_matrix< int, Orientation > test_matrix( m, n, kl, ku ); - test_matrix.clear(); - int band_storage_size = test_matrix.data().size(); - - test_matrix( 0, 0 ) = 11; - test_matrix( 0, 1 ) = 12; - test_matrix( 1, 0 ) = 21; - test_matrix( 1, 1 ) = 22; - test_matrix( 1, 2 ) = 23; - test_matrix( 2, 0 ) = 31; - test_matrix( 2, 1 ) = 32; - test_matrix( 2, 2 ) = 33; - test_matrix( 2, 3 ) = 34; - test_matrix( 3, 1 ) = 42; - test_matrix( 3, 2 ) = 43; - test_matrix( 3, 3 ) = 44; - test_matrix( 3, 4 ) = 45; - test_matrix( 4, 2 ) = 53; - test_matrix( 4, 3 ) = 54; - test_matrix( 4, 4 ) = 55; - test_matrix( 4, 5 ) = 56; - - BOOST_UBLAS_TEST_TRACE( "Full matrix" ); - BOOST_UBLAS_TEST_TRACE( std::setw( 3 ) << test_matrix ); - - BOOST_UBLAS_TEST_TRACE( "data() of matrix" ); - for ( int i = 0; i < band_storage_size; ++i ) { - std::cerr << test_matrix.data()[ i ] << " "; - } - std::cerr << std::endl; - - BOOST_UBLAS_TEST_TRACE( "Expected data() of matrix" ); - for ( int i = 0; i < band_storage_size; ++i ) { - std::cerr << expected_index_5_by_6( i, Orientation() ) << " "; - } - std::cerr << std::endl; - - size_t mismatch = 0; - - for ( int i = 0; i < band_storage_size; ++i ) { - if ( test_matrix.data()[ i ] != expected_index_5_by_6( i, Orientation() ) ) { - ++mismatch; - } - } - - return 0 == mismatch; -} - - - - -BOOST_UBLAS_TEST_DEF( banded_matrix_column_major ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: storage layout banded_matrix < column_major >" ); - - BOOST_UBLAS_TEST_CHECK( test_band_storage< column_major >() ); -} - -BOOST_UBLAS_TEST_DEF( banded_matrix_row_major ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: storage layout banded_matrix < row_major >" ); - - BOOST_UBLAS_TEST_CHECK( test_band_storage< row_major >() ); -} - -BOOST_UBLAS_TEST_DEF( banded_matrix_column_major_6_by_5 ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: storage layout banded_matrix < column_major > 6x5" ); - - BOOST_UBLAS_TEST_CHECK( test_band_storage_6_by_5< column_major >() ); -} - -BOOST_UBLAS_TEST_DEF( banded_matrix_row_major_6_by_5 ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: storage layout banded_matrix < row_major > 6x5" ); - - BOOST_UBLAS_TEST_CHECK( test_band_storage_6_by_5< row_major >() ); -} - -BOOST_UBLAS_TEST_DEF( banded_matrix_column_major_5_by_6 ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: storage layout banded_matrix < column_major > 5x6" ); - - BOOST_UBLAS_TEST_CHECK( test_band_storage_5_by_6< column_major >() ); -} - -BOOST_UBLAS_TEST_DEF( banded_matrix_row_major_5_by_6 ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: storage layout banded_matrix < row_major > 5x6" ); - - BOOST_UBLAS_TEST_CHECK( test_band_storage_5_by_6< row_major >() ); -} - -int main() -{ - - BOOST_UBLAS_TEST_SUITE( "Test storage layout of banded matrix type" ); - - BOOST_UBLAS_TEST_TRACE( "Example data taken from http://www.netlib.org/lapack/lug/node124.html" ); - - BOOST_UBLAS_TEST_BEGIN(); - - BOOST_UBLAS_TEST_DO( banded_matrix_column_major ); - - BOOST_UBLAS_TEST_DO( banded_matrix_row_major ); - - BOOST_UBLAS_TEST_DO( banded_matrix_column_major_6_by_5 ); - - BOOST_UBLAS_TEST_DO( banded_matrix_row_major_6_by_5 ); - - BOOST_UBLAS_TEST_DO( banded_matrix_column_major_5_by_6 ); - - BOOST_UBLAS_TEST_DO( banded_matrix_row_major_5_by_6 ); - - BOOST_UBLAS_TEST_END(); - - return EXIT_SUCCESS; -} - - diff --git a/libs/numeric/ublas/test/test_complex_norms.cpp b/libs/numeric/ublas/test/test_complex_norms.cpp deleted file mode 100644 index e923d7087..000000000 --- a/libs/numeric/ublas/test/test_complex_norms.cpp +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2010 Gunter Winkler -// Distributed under the 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 -#include -#include -#include - -#include "utils.hpp" - -using namespace boost::numeric::ublas; - -static const double TOL(1.0e-5); ///< Used for comparing two real numbers. - -BOOST_UBLAS_TEST_DEF ( test_double_complex_norm_inf ) { - typedef std::complex dComplex; - vector v(4); - for (unsigned int i = 0; i < v.size(); ++i) - v[i] = dComplex(i, i + 1); - - const double expected = abs(v[3]); - - BOOST_UBLAS_DEBUG_TRACE( "norm is " << norm_inf(v) ); - BOOST_UBLAS_TEST_CHECK(std::abs(norm_inf(v) - expected) < TOL); - v *= 3.; - BOOST_UBLAS_TEST_CHECK(std::abs(norm_inf(v) - (3.0*expected)) < TOL); -} - -BOOST_UBLAS_TEST_DEF ( test_double_complex_norm_2 ) { - typedef std::complex dComplex; - vector v(4); - for (unsigned int i = 0; i < v.size(); ++i) - v[i] = dComplex(i, i + 1); - - const double expected = sqrt(44.0); - - BOOST_UBLAS_DEBUG_TRACE( "norm is " << norm_2(v) ); - BOOST_UBLAS_TEST_CHECK(std::abs(norm_2(v) - expected) < TOL); - v *= 3.; - BOOST_UBLAS_TEST_CHECK(std::abs(norm_2(v) - (3.0*expected)) < TOL); -} - -BOOST_UBLAS_TEST_DEF ( test_float_complex_norm_inf ) { - typedef std::complex dComplex; - vector v(4); - for (unsigned int i = 0; i < v.size(); ++i) - v[i] = dComplex(i, i + 1); - - const float expected = abs(v[3]); - - BOOST_UBLAS_DEBUG_TRACE( "norm is " << norm_inf(v) ); - BOOST_UBLAS_TEST_CHECK(std::abs(norm_inf(v) - expected) < TOL); - v *= 3.; - BOOST_UBLAS_TEST_CHECK(std::abs(norm_inf(v) - (3.0*expected)) < TOL); -} - -BOOST_UBLAS_TEST_DEF ( test_float_complex_norm_2 ) { - typedef std::complex dComplex; - vector v(4); - for (unsigned int i = 0; i < v.size(); ++i) - v[i] = dComplex(i, i + 1); - - const double expected = sqrt(44.0); - - BOOST_UBLAS_DEBUG_TRACE( "norm is " << norm_2(v) ); - BOOST_UBLAS_TEST_CHECK(std::abs(norm_2(v) - expected) < TOL); - v *= 3.; - BOOST_UBLAS_TEST_CHECK(std::abs(norm_2(v) - (3.0*expected)) < TOL); -} - -int main() { - BOOST_UBLAS_TEST_BEGIN(); - - BOOST_UBLAS_TEST_DO( test_double_complex_norm_inf ); - BOOST_UBLAS_TEST_DO( test_float_complex_norm_inf ); - BOOST_UBLAS_TEST_DO( test_double_complex_norm_2 ); - BOOST_UBLAS_TEST_DO( test_float_complex_norm_2 ); - - BOOST_UBLAS_TEST_END(); -} diff --git a/libs/numeric/ublas/test/test_coordinate_matrix_inplace_merge.cpp b/libs/numeric/ublas/test/test_coordinate_matrix_inplace_merge.cpp deleted file mode 100644 index 75d1f708a..000000000 --- a/libs/numeric/ublas/test/test_coordinate_matrix_inplace_merge.cpp +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) 2011 David Bellot -// -// Distributed under the 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_UBLAS_NO_ELEMENT_PROXIES -# define BOOST_UBLAS_NO_ELEMENT_PROXIES -#endif - -#include -#include -#include -#include -#include -#include "common/testhelper.hpp" -#include "utils.hpp" - -using std::cout; -using std::endl; - -const double TOL = 1e-15; - -template -bool check_sortedness(const boost::numeric::ublas::coordinate_matrix& matrix) { - bool result = true; - typedef boost::numeric::ublas::coordinate_matrix matrix_type; - typename matrix_type::index_array_type i1 = matrix.index1_data(); - typename matrix_type::index_array_type i2 = matrix.index2_data(); - typename matrix_type::array_size_type size = matrix.filled(); - - for (typename matrix_type::array_size_type i = 0; i + 1 < size && result; ++ i) { - result &= ( (i1[i] < i1[i + 1]) || - ((i1[i] == i1[i]) && - (i2[i] < i2[i + 1])) ); - - } - return result; -} - -void print_entries(size_t size_x, size_t size_y, - const std::vector >& entries) -{ - std::cerr << "Error - Size:" << size_x << " x " << size_y << ". Entries: "; - for (size_t i = 0; i < entries.size(); ++ i) { - std::cerr << entries[i].first << ", " << entries[i].second << "; "; - } - std::cerr << "\n"; -} - - -BOOST_UBLAS_TEST_DEF( test_coordinate_matrix_inplace_merge_random ) -{ - const size_t max_repeats = 100; - const size_t max_size = 100; - const size_t dim_var = 10; - const size_t nr_entries = 10; - - for (size_t repeats = 1; repeats < max_repeats; ++repeats ) { - for (size_t size = 1; size < max_size; size += 5) { - size_t size_x = size + rand() % dim_var; - size_t size_y = size + rand() % dim_var; - - boost::numeric::ublas::coordinate_matrix matrix_coord(size_x, size_y); - boost::numeric::ublas::matrix matrix_dense(size_x, size_y, 0); - - matrix_coord.sort(); - - std::vector > entries; - for (size_t entry = 0; entry < nr_entries; ++ entry) { - int x = rand() % size_x; - int y = rand() % size_y; - entries.push_back(std::make_pair(x, y)); - matrix_coord.append_element(x, y, 1); - matrix_dense(x, y) += 1; - } - matrix_coord.sort(); - - { - bool sorted = check_sortedness(matrix_coord); - bool identical = compare_to(matrix_coord, matrix_dense, TOL); - if (!(sorted && identical)) { - print_entries(size_x, size_y, entries); - } - BOOST_UBLAS_TEST_CHECK( check_sortedness(matrix_coord) ); - BOOST_UBLAS_TEST_CHECK( compare_to(matrix_coord, matrix_dense, TOL) ); - } - - for (size_t entry = 0; entry < nr_entries; ++ entry) { - int x = rand() % size_x; - int y = rand() % size_y; - entries.push_back(std::make_pair(x, y)); - matrix_coord(x, y) += 1; - matrix_dense(x, y) += 1; - matrix_coord.sort(); - } - - { - bool sorted = check_sortedness(matrix_coord); - bool identical = compare_to(matrix_coord, matrix_dense, TOL); - if (!(sorted && identical)) { - print_entries(size_x, size_y, entries); - } - BOOST_UBLAS_TEST_CHECK( sorted ); - BOOST_UBLAS_TEST_CHECK( identical ); - } - } - } -} - -int main() -{ - BOOST_UBLAS_TEST_BEGIN(); - - BOOST_UBLAS_TEST_DO( test_coordinate_matrix_inplace_merge_random ); - - BOOST_UBLAS_TEST_END(); - - return EXIT_SUCCESS;; -} diff --git a/libs/numeric/ublas/test/test_coordinate_matrix_sort.cpp b/libs/numeric/ublas/test/test_coordinate_matrix_sort.cpp deleted file mode 100644 index d07abb3b1..000000000 --- a/libs/numeric/ublas/test/test_coordinate_matrix_sort.cpp +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) 2011 David Bellot -// -// Distributed under the 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_UBLAS_NO_ELEMENT_PROXIES -# define BOOST_UBLAS_NO_ELEMENT_PROXIES -#endif - -#include -#include - -#include "utils.hpp" - -using std::cout; -using std::endl; - -BOOST_UBLAS_TEST_DEF( test_coordinate_matrix_sort ) -{ - - boost::numeric::ublas::coordinate_matrix matrix_mask(3, 3, 2); - cout << "Setting matrix(1,1) = 2.1" << endl; - matrix_mask(1,1) = 2.1; - - cout << "Displaying matrix(1,1)" << endl; - std::cout << matrix_mask(1,1) << std::endl; - - BOOST_UBLAS_DEBUG_TRACE( "Displaying matrix(1,1)" << matrix_mask(1,1) ); - BOOST_UBLAS_TEST_CHECK( matrix_mask(1,1) == 2.1 ); - - BOOST_UBLAS_TEST_CHECK( matrix_mask.index1_data()[0] == 1 ); - BOOST_UBLAS_TEST_CHECK( matrix_mask.index2_data()[0] == 1 ); - BOOST_UBLAS_TEST_CHECK( matrix_mask.value_data()[0] == 2.1 ); - - BOOST_UBLAS_DEBUG_TRACE( "Setting matrix(0,1) = 1.1" ); - matrix_mask(0, 1) = 1.1; - - BOOST_UBLAS_TEST_CHECK( matrix_mask.index1_data()[0] == 1 ); - BOOST_UBLAS_TEST_CHECK( matrix_mask.index2_data()[0] == 1 ); - BOOST_UBLAS_TEST_CHECK( matrix_mask.value_data()[0] == 2.1 ); - - BOOST_UBLAS_TEST_CHECK( matrix_mask.index1_data()[1] == 0 ); - BOOST_UBLAS_TEST_CHECK( matrix_mask.index2_data()[1] == 1 ); - BOOST_UBLAS_TEST_CHECK( matrix_mask.value_data()[1] == 1.1 ); - - BOOST_UBLAS_DEBUG_TRACE( "Sort the matrix - this would be triggered by any element lookup." ); - matrix_mask.sort(); - - BOOST_UBLAS_TEST_CHECK( matrix_mask.index1_data()[1] == 1 ); - BOOST_UBLAS_TEST_CHECK( matrix_mask.index2_data()[1] == 1 ); - BOOST_UBLAS_TEST_CHECK( matrix_mask.value_data()[1] == 2.1 ); - - BOOST_UBLAS_TEST_CHECK( matrix_mask.index1_data()[0] == 0 ); - BOOST_UBLAS_TEST_CHECK( matrix_mask.index2_data()[0] == 1 ); - BOOST_UBLAS_TEST_CHECK( matrix_mask.value_data()[0] == 1.1 ); - - BOOST_UBLAS_DEBUG_TRACE( "Displaying matrix(1,1)" << matrix_mask(1,1) ); - BOOST_UBLAS_TEST_CHECK( matrix_mask(1,1) == 2.1 ); - - BOOST_UBLAS_DEBUG_TRACE( "Displaying matrix(0,1)" << matrix_mask(0,1) ); - BOOST_UBLAS_TEST_CHECK( matrix_mask(0,1) == 1.1 ); - -} - -int main() -{ - BOOST_UBLAS_TEST_BEGIN(); - - BOOST_UBLAS_TEST_DO( test_coordinate_matrix_sort ); - - BOOST_UBLAS_TEST_END(); -} diff --git a/libs/numeric/ublas/test/test_coordinate_vector_inplace_merge.cpp b/libs/numeric/ublas/test/test_coordinate_vector_inplace_merge.cpp deleted file mode 100644 index 9994e86ef..000000000 --- a/libs/numeric/ublas/test/test_coordinate_vector_inplace_merge.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) 2011 David Bellot -// -// Distributed under the 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_UBLAS_NO_ELEMENT_PROXIES -# define BOOST_UBLAS_NO_ELEMENT_PROXIES -#endif - -#include -#include -#include -#include -#include -#include "common/testhelper.hpp" -#include "utils.hpp" - -const double TOL = 1e-15; - -template -bool check_sortedness(const boost::numeric::ublas::coordinate_vector& vector) { - bool result = true; - typedef boost::numeric::ublas::coordinate_vector vector_type; - typename vector_type::index_array_type idx = vector.index_data(); - typename vector_type::size_type size = vector.filled(); - - for (typename vector_type::size_type i = 0; i + 1 < size && result; ++ i) { - result &= (idx[i] < idx[i + 1]); - } - return result; -} - -void print_entries(size_t size, - const std::vector& entries) -{ - std::cerr << "Error entries - Size:" << size << ". Entries: "; - for (size_t i = 0; i < entries.size(); ++ i) { - std::cerr << entries[i] << "; "; - } - std::cerr << "\n"; -} - -BOOST_UBLAS_TEST_DEF( test_coordinate_vector_inplace_merge_random ) -{ - const size_t max_repeats = 100; - const size_t max_size = 100; - const size_t dim_var = 10; - const size_t nr_entries = 10; - - for (size_t repeats = 1; repeats < max_repeats; ++repeats ) { - for (size_t size = 1; size < max_size; size += 5) { - size_t size_vec = size + rand() % dim_var; - - boost::numeric::ublas::coordinate_vector vector_coord(size_vec); - boost::numeric::ublas::vector vector_dense(size_vec, 0); - - vector_coord.sort(); - - std::vector entries; - for (size_t entry = 0; entry < nr_entries; ++ entry) { - int x = rand() % size_vec; - entries.push_back(x); - vector_coord.append_element(x, 1); - vector_dense(x) += 1; - } - vector_coord.sort(); - - { - bool sorted = check_sortedness(vector_coord); - bool identical = compare_to(vector_coord, vector_dense, TOL); - if (!(sorted && identical)) { - print_entries(size_vec, entries); - } - BOOST_UBLAS_TEST_CHECK( check_sortedness(vector_coord) ); - BOOST_UBLAS_TEST_CHECK( compare_to(vector_coord, vector_dense, TOL) ); - } - - for (size_t entry = 0; entry < nr_entries; ++ entry) { - int x = rand() % size_vec; - entries.push_back(x); - vector_coord(x) += 1; - vector_dense(x) += 1; - vector_coord.sort(); - } - - { - bool sorted = check_sortedness(vector_coord); - bool identical = compare_to(vector_coord, vector_dense, TOL); - if (!(sorted && identical)) { - print_entries(size_vec, entries); - } - BOOST_UBLAS_TEST_CHECK( sorted ); - BOOST_UBLAS_TEST_CHECK( identical ); - } - } - } -} - -int main() -{ - BOOST_UBLAS_TEST_BEGIN(); - - BOOST_UBLAS_TEST_DO( test_coordinate_vector_inplace_merge_random ); - - BOOST_UBLAS_TEST_END(); - - return EXIT_SUCCESS;; -} diff --git a/libs/numeric/ublas/test/test_fixed_containers.cpp b/libs/numeric/ublas/test/test_fixed_containers.cpp deleted file mode 100644 index 23a63827e..000000000 --- a/libs/numeric/ublas/test/test_fixed_containers.cpp +++ /dev/null @@ -1,309 +0,0 @@ -#undef BOOST_UBLAS_NO_EXCEPTIONS -#include "common/testhelper.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include "utils.hpp" - -#ifdef BOOST_UBLAS_CPP_GE_2011 - -using namespace boost::numeric::ublas; - -using std::cout; -using std::endl; - -template < class T > -bool test_vector( std::string type_name) -{ - std::stringstream stream; - stream << "Testing for: " << type_name; - BOOST_UBLAS_DEBUG_TRACE( stream.str() ); - - bool pass = true; - - { - typedef fixed_vector vec1; - - vec1 v1( 122.0 ); - - pass &= ( v1(0) == (T)122 ); - - } - - { - typedef fixed_vector vec3; - - vec3 v1((T)0.0, (T)0.0, (T)0.0); - - pass &=(sizeof( vec3 ) == v1.size()*sizeof( T ) ) ; - - vector v( 3, 0 ) ; - - pass &= compare( v1, v ); - - v1 <<= 10.0, 10, 33; - v <<= 10.0, 10, 33; - - //cout << std::setprecision(20) << v1 << '\n' << v; - - pass &= compare( v1, v ); - - - vec3 v2; - - v2( 0 ) = 10.0; v2( 1 ) = 10; v2( 2 ) = 33; - pass &= compare( v, v2 ); - - v2 += v; - - pass &= compare( v2, 2*v ); - - - v1 = 2*v1 + v - 6*v2; - pass &= compare( v1, (3-2*6)*v ); - - - vec3 v3{ (T)-90.0, (T)-90.0, (T)-297.0 }; - pass &= compare( v3, v1 ); - - vec3 v4 = { (T)-90.0, (T)-90.0, (T)-297.0 }; - pass &= compare( v4, v1 ); - - vec3 v5( (T)-90.0, (T)-90.0, (T)-297.0 ); - pass &= compare( v5, v1 ); - - vec3 v6((T) 5.0, (T)8.0, (T)9.0); - - matrix M = outer_prod( v6, v6), L( 3, 3); - - L <<= 25, 40, 45, 40, 64, 72, 45, 72, 81; - - pass &= compare( M, L ); - - L <<= 1, 2, 3, 4, 5, 6, 7, 8, 9; - v6 <<= 4, 5, 6; - vec3 v7 ( (T)32.0, (T)77.0, (T)122.0 ); - - pass &= compare( v7, prod(L, v6) ); - - vec3 v8; - noalias( v8 ) = prod(L, v6); - - pass &= compare( v7, v8 ); - - } - - - { - const std::size_t N = 33; - typedef fixed_vector vec33; - - vec33 v1; - vector v( N ); - - for ( std::size_t i = 0; i!= v1.size(); i++) - { - v1( i ) = 3.14159*i; - v ( i ) = 3.14159*i; - } - - pass &= compare( v1, v ); - - - auto ip = inner_prod( v, v); - auto ip1 = inner_prod( v1, v1); - - pass &= ( ip == ip1 ) ; - - T c = 0; - for (auto i = v1.begin(); i != v1.end(); i++) - { - *i = c; - c = c + 1; - } - - c = 0; - for (auto i = v.begin(); i != v.end(); i++) - { - *i = c; - c = c + 1; - } - - pass &= compare( v1, v ); - - // Check if bad index indeed works - try { - T a; - a=v1( 100 ); - BOOST_UBLAS_NOT_USED( a ); - - } catch ( bad_index &e) { - std::cout << " Caught (GOOD): " << e.what() << endl; - pass &= true; - } - - - } - return pass; -} - -template < class T > -bool test_matrix( std::string type_name) -{ - std::stringstream stream; - stream << "Testing for: " << type_name; - BOOST_UBLAS_DEBUG_TRACE( stream.str() ); - - bool pass = true; - - typedef fixed_matrix mat34; - typedef fixed_matrix mat43; - typedef fixed_matrix mat33; - - - { - typedef fixed_matrix mat1; - - mat1 m1( 122.0 ); - - pass &= ( m1(0, 0) == (T)122 ); - } - - - { - mat34 m1( 3.0 ); - - pass &=(sizeof( mat34 ) == m1.size1()*m1.size2()*sizeof( T ) ) ; - - matrix m( 3.0, 4.0, 3.0 ) ; - - pass &= compare( m1, m ); - - cout << m1 << endl; - cout << m << endl; - - - m1 <<= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12; - m <<= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12; - - pass &= compare( m1, m ); - - cout << m1 << endl; - cout << m << endl; - - mat34 m2( 0.0 ); - - T count = 1 ; - for ( std::size_t i = 0; i != m2.size1(); i++) - { - for (std::size_t j = 0; j!= m2.size2(); j++) - { - m2( i, j ) = count; - count = count + 1; - } - - } - pass &= compare( m2, m ); - cout << m2 << endl; - - } - { - mat34 m1 = { (T)1, (T)2, (T)3, (T)3, (T)3, (T)2, (T)5, (T)4, (T)2, (T)6, (T)5, (T)2 }; - mat43 m2 = { (T)4, (T)5, (T)6, (T)3, (T)2, (T)2, (T)1, (T)4, (T)2, (T)6, (T)5, (T)2 }; - - mat33 m3 = prod(m1, m2); - - matrix m(3, 3); - m <<= 31,36,22,47,59,40,43,52,38; - - pass &= compare(m ,m3); - - mat33 m4; - m4 <<= (T)1, (T)2, (T)1, (T)2, (T)1, (T)3, (T)1, (T)2, (T) 5; - m3 = prod(m4, trans(m4)); - - m<<=6,7,10,7,14,19,10,19,30; - - cout << m3 << endl; - pass &= compare(m ,m3); - - m3 = 2 * m4 - 1 * m3; - - cout << m3; - - m <<= -4,-3,-8,-3,-12,-13,-8,-15,-20; - - pass &= compare(m, m3); - - m = m3; - - m3 = trans(m); - - pass &= compare(m3, trans(m)); - - // Check if bad index indeed works - try { - T a; - a=m1( 100, 100 ); - BOOST_UBLAS_NOT_USED( a ); - - } catch ( bad_index &e) { - std::cout << " Caught (GOOD): " << e.what() << endl; - pass &= true; - } - - } - - return pass; - -} - -BOOST_UBLAS_TEST_DEF (test_fixed) { - - BOOST_UBLAS_DEBUG_TRACE( "Starting fixed container tests" ); - - BOOST_UBLAS_TEST_CHECK( test_vector< double >( "double") ); - BOOST_UBLAS_TEST_CHECK( test_vector< float >( "float") ); - BOOST_UBLAS_TEST_CHECK( test_vector< int >( "int") ); - - BOOST_UBLAS_TEST_CHECK( test_vector< std::complex >( "std::complex") ); - BOOST_UBLAS_TEST_CHECK( test_vector< std::complex >( "std::complex") ); - BOOST_UBLAS_TEST_CHECK( test_vector< std::complex >( "std::complex") ); - - BOOST_UBLAS_TEST_CHECK( test_matrix< double >( "double") ); - BOOST_UBLAS_TEST_CHECK( test_matrix< float >( "float") ); - BOOST_UBLAS_TEST_CHECK( test_matrix< int >( "int") ); - - BOOST_UBLAS_TEST_CHECK( test_matrix< std::complex >( "std::complex") ); - BOOST_UBLAS_TEST_CHECK( test_matrix< std::complex >( "std::complex") ); - BOOST_UBLAS_TEST_CHECK( test_matrix< std::complex >( "std::complex") ); -} - - -int main () { - - BOOST_UBLAS_TEST_BEGIN(); - - BOOST_UBLAS_TEST_DO( test_fixed ); - - BOOST_UBLAS_TEST_END(); - return EXIT_SUCCESS; - -} - -#else - -int main () { - - BOOST_UBLAS_TEST_BEGIN(); - BOOST_UBLAS_TEST_END(); - - return EXIT_SUCCESS; - -} -#endif // BOOST_UBLAS_CPP_GE_2011 diff --git a/libs/numeric/ublas/test/test_inplace_solve.cpp b/libs/numeric/ublas/test/test_inplace_solve.cpp deleted file mode 100644 index b2bf58d45..000000000 --- a/libs/numeric/ublas/test/test_inplace_solve.cpp +++ /dev/null @@ -1,123 +0,0 @@ -#include - -#include -#include -#include -#include -#include - -#include "utils.hpp" - -namespace ublas = boost::numeric::ublas; - -static const double TOL(1.0e-5); ///< Used for comparing two real numbers. -static const int n(10); ///< defines the test matrix size - -template -double diff(const mat& A, const vec& x, const vec& b) { - return ublas::norm_2(prod(A, x) - b); -} - -// efficiently fill matrix depending on majority -template -void fill_matrix(mat& A, ublas::column_major_tag) { - for (int i=0; i=0) { - A(i-1, i) = -1; - } - A(i, i) = 1; - if (i+1 -void fill_matrix(mat& A, ublas::row_major_tag) { - for (int i=0; i=0) { - A(i, i-1) = -1; - } - A(i, i) = 1; - if (i+1 -BOOST_UBLAS_TEST_DEF ( test_inplace_solve ) -{ - mat A(n, n); - A.clear(); - fill_matrix(A, typename mat::orientation_category()); - - ublas::vector b(n, 1.0); - - // The test matrix is not triangular, but is interpreted that way by - // inplace_solve using the lower_tag/upper_tags. For checking, the - // triangular_adaptor makes A triangular for comparison. - { - ublas::vector x(b); - ublas::inplace_solve(A, x, ublas::lower_tag()); - BOOST_UBLAS_TEST_CHECK(diff(ublas::triangular_adaptor(A), x, b) < TOL); - } - { - ublas::vector x(b); - ublas::inplace_solve(A, x, ublas::upper_tag()); - BOOST_UBLAS_TEST_CHECK(diff (ublas::triangular_adaptor(A), x, b) < TOL); - } - { - ublas::vector x(b); - ublas::inplace_solve(x, A, ublas::lower_tag()); - BOOST_UBLAS_TEST_CHECK(diff (trans(ublas::triangular_adaptor(A)), x, b) < TOL); - } - { - ublas::vector x(b); - ublas::inplace_solve(x, A, ublas::upper_tag()); - BOOST_UBLAS_TEST_CHECK(diff (trans(ublas::triangular_adaptor(A)), x , b) < TOL); - } -} - -int main() { - - // typedefs are needed as macros do not work with "," in template arguments - - BOOST_UBLAS_TEST_BEGIN(); - -#ifdef USE_MATRIX - typedef ublas::matrix mat_doub_rowmaj; - typedef ublas::matrix mat_doub_colmaj; - BOOST_UBLAS_TEST_DO( test_inplace_solve ); - BOOST_UBLAS_TEST_DO( test_inplace_solve ); -#endif - -#ifdef USE_COMPRESSED_MATRIX - typedef ublas::compressed_matrix commat_doub_rowmaj; - typedef ublas::compressed_matrix commat_doub_colmaj; - BOOST_UBLAS_TEST_DO( test_inplace_solve ); - BOOST_UBLAS_TEST_DO( test_inplace_solve ); -#endif - -#ifdef USE_MAPPED_MATRIX - typedef ublas::mapped_matrix mapmat_doub_rowmaj; - typedef ublas::mapped_matrix mapmat_doub_colmaj; - BOOST_UBLAS_TEST_DO( test_inplace_solve ); - BOOST_UBLAS_TEST_DO( test_inplace_solve ); -#endif - -#ifdef USE_COORDINATE_MATRIX - typedef ublas::coordinate_matrix cormat_doub_rowmaj; - typedef ublas::coordinate_matrix cormat_doub_colmaj; - BOOST_UBLAS_TEST_DO( test_inplace_solve ); - BOOST_UBLAS_TEST_DO( test_inplace_solve ); -#endif - -#ifdef USE_MAPPED_VECTOR_OF_MAPPED_VECTOR - typedef ublas::mapped_vector_of_mapped_vector mvmv_doub_rowmaj; - typedef ublas::mapped_vector_of_mapped_vector mvmv_doub_colmaj; - BOOST_UBLAS_TEST_DO( test_inplace_solve ); - BOOST_UBLAS_TEST_DO( test_inplace_solve ); -#endif - - BOOST_UBLAS_TEST_END(); -} diff --git a/libs/numeric/ublas/test/test_lu.cpp b/libs/numeric/ublas/test/test_lu.cpp deleted file mode 100644 index e2b203f8e..000000000 --- a/libs/numeric/ublas/test/test_lu.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2008 Gunter Winkler -// Distributed under the Boost Software License, Version 1.0. (See -// accompanying file LICENSE_1_0.txt or copy at -// http://www.boost.org/LICENSE_1_0.txt) - -// switch automatic singular check off -#define BOOST_UBLAS_TYPE_CHECK 0 - -#include -#include -#include - -#include "common/testhelper.hpp" - -#include -#include - -using namespace boost::numeric::ublas; -using std::string; - -static const string matrix_IN = "[3,3]((1,2,2),(2,3,3),(3,4,6))\0"; -static const string matrix_LU = "[3,3]((3,4,6),(3.33333343e-01,6.66666627e-01,0),(6.66666687e-01,4.99999911e-01,-1))\0"; -static const string matrix_INV= "[3,3]((-3,2,-7.94728621e-08),(1.50000012,0,-5.00000060e-01),(4.99999911e-01,-1,5.00000060e-01))\0"; -static const string matrix_PM = "[3](2,2,2)"; - -int main () { - - typedef float TYPE; - - typedef matrix MATRIX; - - MATRIX A; - MATRIX LU; - MATRIX INV; - - { - std::istringstream is(matrix_IN); - is >> A; - } - { - std::istringstream is(matrix_LU); - is >> LU; - } - { - std::istringstream is(matrix_INV); - is >> INV; - } - permutation_matrix<>::vector_type temp; - { - std::istringstream is(matrix_PM); - is >> temp; - } - permutation_matrix<> PM(temp); - - permutation_matrix<> pm(3); - - int result = lu_factorize >(A, pm); - - assertTrue("factorization completed: ", 0 == result); - assertTrue("LU factors are correct: ", compare(A, LU)); - assertTrue("permutation is correct: ", compare(pm, PM)); - - MATRIX B = identity_matrix(A.size2()); - - lu_substitute(A, pm, B); - - assertTrue("inverse is correct: ", compare(B, INV)); - - return (getResults().second > 0) ? boost::exit_failure : boost::exit_success; -} diff --git a/libs/numeric/ublas/test/test_matrix_vector.cpp b/libs/numeric/ublas/test/test_matrix_vector.cpp deleted file mode 100644 index a7e8796cd..000000000 --- a/libs/numeric/ublas/test/test_matrix_vector.cpp +++ /dev/null @@ -1,458 +0,0 @@ -// -// Copyright (c) 2013 Joaquim Duran -// -// Distributed under the 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 -#include -#include -#include -#include "common/testhelper.hpp" -#include "utils.hpp" - -using namespace boost::numeric::ublas; - - -template -void guardSparsePreserveResize( Vector &vec, typename Vector::size_type new_size, StorageCategory) // Because sparse matrices don't have preserve data implemented -{ - vec.resize( new_size ); -} - - -template -void guardSparsePreserveResize( Vector &vec, typename Vector::size_type new_size, sparse_tag) // Because sparse matrices don't have preserve data implemented -{ - vec.resize( new_size, false ); -} - -template -bool test_matrix_row_facade() { - bool pass = true; - - typedef matrix_row_vector RowVector; - - { // Testing resize - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: resize" ); - - typename Matrix::size_type num_rows = 3; - typename Matrix::size_type num_cols = 5; - - Matrix matrix(num_rows, num_cols); - RowVector rows(matrix); - pass &= (matrix.size1() == num_rows); - pass &= (rows.size() == num_rows); - pass &= (matrix.size2() == num_cols); - - typename Matrix::size_type new_num_rows = 6; - guardSparsePreserveResize( rows, new_num_rows, typename Matrix::storage_category()); - //rows.resize(new_num_rows); - - pass &= (matrix.size1() == new_num_rows); - pass &= (rows.size() == new_num_rows); - pass &= (matrix.size2() == num_cols); - } - - { // Testing operator() - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: operator()" ); - - Matrix A(3,3), RA(3,3); - RowVector rows(A); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - for(typename Matrix::size_type i = 0; i < A.size1(); i++) { - rows(i) = matrix_row(RA, i); - } - - pass &= compare_to(A, RA); - } - - { // Testing operator[] - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: operator[]" ); - - Matrix A(3,3), RA(3,3); - RowVector rows(A); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - for(typename Matrix::size_type i = 0; i < A.size1(); i++) { - rows[i] = matrix_row(RA, i); - } - - pass &= compare_to(A, RA); - } - - { // Testing operator[] const - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: operator[] const" ); - - Matrix RA(3,3); - RowVector rows(RA); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - for(typename Matrix::size_type i = 0; i < RA.size1(); i++) { - pass &= compare_to(rows[i], matrix_row(RA, i)); - } - } - - { // Testing const iterator - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: const iterator" ); - - Matrix RA(3,3); - RowVector rows(RA); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - typename RowVector::size_type i = 0; - for(typename RowVector::const_iterator iter = rows.begin(); - iter != rows.end(); - iter++) { - pass &= compare_to(*iter, matrix_row(RA, i++)); - } - } - - { // Testing iterator - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: iterator" ); - - Matrix A(3,3), RA(3,3); - RowVector rows(A); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - typename RowVector::size_type i = 0; - for(typename RowVector::iterator iter = rows.begin(); - iter != rows.end(); - iter++) { - *iter = matrix_row(RA, i++); - } - - pass &= compare_to(A, RA); - } - - { // Testing reserse iterator - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: reverse iterator" ); - - Matrix A(3,3), RA(3,3); - RowVector rows(A); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - typename RowVector::size_type i = rows.size(); - for(typename RowVector::reverse_iterator iter = rows.rbegin(); - iter != rows.rend(); - iter++) { - *iter = matrix_row(RA, --i); - } - - pass &= compare_to(A, RA); - } - - { // Testing const reverse iterator - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_row_facade: const reverse iterator" ); - - Matrix RA(3,3); - RowVector rows(RA); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - typename RowVector::size_type i = rows.size(); - for(typename RowVector::const_reverse_iterator iter = rows.rbegin(); - iter != rows.rend(); - iter++) { - pass &= compare_to(*iter, matrix_row(RA, --i)); - } - } - - return pass; -} - - -template -bool test_matrix_column_facade() { - bool pass = true; - - typedef matrix_column_vector ColumnVector; - - { // Testing resize - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: resize" ); - typename Matrix::size_type num_rows = 5; - typename Matrix::size_type num_cols = 3; - - Matrix matrix(num_rows, num_cols); - ColumnVector columns(matrix); - pass &= (matrix.size2() == num_cols); - pass &= (columns.size() == num_cols); - pass &= (matrix.size1() == num_rows); - - typename Matrix::size_type new_num_cols = 6; - guardSparsePreserveResize( columns, new_num_cols, typename Matrix::storage_category()); - //columns.resize(new_num_cols); - pass &= (matrix.size2() == new_num_cols); - pass &= (columns.size() == new_num_cols); - pass &= (matrix.size1() == num_rows); - } - - { // Testing operator () - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: operator()" ); - - Matrix A(3,3), RA(3,3); - ColumnVector columns(A); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - for(typename Matrix::size_type i = 0; i < A.size2(); i++) { - columns(i) = matrix_column(RA, i); - } - - pass &= compare_to(A, RA); - } - - { // Testing operator[] - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: operator[]" ); - - Matrix A(3,3), RA(3,3); - ColumnVector columns(A); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - for(typename Matrix::size_type i = 0; i < A.size2(); i++) { - columns[i] = matrix_column(RA, i); - } - - pass &= compare_to(A, RA); - } - - { // Testing operator[] const - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: operator[] const" ); - - Matrix RA(3,3); - ColumnVector columns(RA); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - for(typename Matrix::size_type i = 0; i < RA.size2(); i++) { - pass &= compare_to(columns[i], matrix_column(RA, i)); - } - } - - { // Testing iterator - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: iterator" ); - - Matrix A(3,3), RA(3,3); - ColumnVector columns(A); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - typename ColumnVector::size_type i = 0; - for(typename ColumnVector::iterator iter = columns.begin(); - iter != columns.end(); - iter++) { - *iter = matrix_column(RA, i++); - } - - pass &= compare_to(A, RA); - } - - { // Testing const iterator - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: const iterator" ); - - Matrix RA(3,3); - ColumnVector columns(RA); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - typename ColumnVector::size_type i = 0; - for(typename ColumnVector::const_iterator iter = columns.begin(); - iter != columns.end(); - iter++) { - pass &= compare_to(*iter, matrix_column(RA, i++)); - } - } - - { // Testing reserse iterator - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: reverese iterator" ); - - Matrix A(3,3), RA(3,3); - ColumnVector columns(A); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - typename ColumnVector::size_type i = columns.size(); - for(typename ColumnVector::reverse_iterator iter = columns.rbegin(); - iter != columns.rend(); - iter++) { - *iter = matrix_column(RA, --i); - } - - pass &= compare_to(A, RA); - } - - { // Testing const reverse iterator - BOOST_UBLAS_DEBUG_TRACE( "test_matrix_column_facade: const reverese iterator" ); - - Matrix RA(3,3); - ColumnVector columns(RA); - - RA <<= 1, 2, 3, - 4, 5, 6, - 7, 8, 9; - - typename ColumnVector::size_type i = columns.size(); - for(typename ColumnVector::const_reverse_iterator iter = columns.rbegin(); - iter != columns.rend(); - iter++) { - pass &= compare_to(*iter, matrix_column(RA, --i)); - } - } - - return pass; -} - - -BOOST_UBLAS_TEST_DEF (test_matrix_row_facade) { - - BOOST_UBLAS_DEBUG_TRACE( "Starting matrix row vector facade" ); - - BOOST_UBLAS_DEBUG_TRACE( "Testing matrix..." ); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - - BOOST_UBLAS_DEBUG_TRACE( "Testing bounded_matrix..." ); - BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_row_facade >())); - - BOOST_UBLAS_DEBUG_TRACE( "Testing mapped_matrix..." ); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()) - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()) - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - - BOOST_UBLAS_DEBUG_TRACE( "Testing compressed_matrix..." ); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - - BOOST_UBLAS_DEBUG_TRACE( "Testing coordinate_matrix..." ); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()) - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()) - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_row_facade >()); -} - - -BOOST_UBLAS_TEST_DEF (test_matrix_column_facade) { - - BOOST_UBLAS_DEBUG_TRACE( "Starting matrix row column facade" ); - - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - - BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade >())); - BOOST_UBLAS_TEST_CHECK((test_matrix_column_facade >())); - - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()) - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()) - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()) - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()) - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); - BOOST_UBLAS_TEST_CHECK(test_matrix_column_facade >()); -} - - -int main () { - BOOST_UBLAS_TEST_BEGIN(); - - BOOST_UBLAS_TEST_DO( test_matrix_row_facade ); - BOOST_UBLAS_TEST_DO( test_matrix_column_facade ); - - BOOST_UBLAS_TEST_END(); - - return EXIT_SUCCESS;; -} diff --git a/libs/numeric/ublas/test/test_ticket7296.cpp b/libs/numeric/ublas/test/test_ticket7296.cpp deleted file mode 100644 index 65fdb4ba6..000000000 --- a/libs/numeric/ublas/test/test_ticket7296.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/** - * \file libs/numeric/ublas/test/test_utils.hpp - * - * \brief Test suite for utils.hpp. - * - * Copyright (c) 2012, Marco Guazzone - * - * Distributed under the Boost Software License, Version 1.0. (See - * accompanying file LICENSE_1_0.txt or copy at - * http://www.boost.org/LICENSE_1_0.txt) - * - * \author Marco Guazzone (marco.guazzone@gmail.com) - */ - -#include -#include -#include -#include -#include -#include "utils.hpp" - - -namespace ublas = boost::numeric::ublas; - - -static const double tol(1e-6); -static const double mul(tol*10); - - -BOOST_UBLAS_TEST_DEF( check ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: 'check'" ); - - BOOST_UBLAS_TEST_CHECK( true ); -} - -BOOST_UBLAS_TEST_DEF( check_eq ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: 'check_eq'" ); - - BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." ); - BOOST_UBLAS_TEST_CHECK_EQ( short(1), short(1) ); - BOOST_UBLAS_TEST_CHECK_EQ( int(1), int(1) ); - BOOST_UBLAS_TEST_CHECK_EQ( long(1), long(1) ); - BOOST_UBLAS_TEST_CHECK_EQ( unsigned(1), unsigned(1) ); - - BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." ); - BOOST_UBLAS_TEST_CHECK_EQ( short(1), int(1) ); - BOOST_UBLAS_TEST_CHECK_EQ( short(1), int(1) ); - BOOST_UBLAS_TEST_CHECK_EQ( int(1), long(1) ); - BOOST_UBLAS_TEST_CHECK_EQ( long(1), int(1) ); - - BOOST_UBLAS_DEBUG_TRACE( "-- Test aliases." ); - BOOST_UBLAS_TEST_CHECK_EQUAL( int(1), int(1) ); -} - -BOOST_UBLAS_TEST_DEF( check_close ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: 'check_close'" ); - - const double c1(1*mul); - const double c2(2*mul); - - // Check T vs. T - BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." ); - BOOST_UBLAS_TEST_CHECK_CLOSE( float(c1), float(c1), tol ); - BOOST_UBLAS_TEST_CHECK_CLOSE( double(c1), double(c1), tol ); - BOOST_UBLAS_TEST_CHECK_CLOSE( ::std::complex(c1,c2), ::std::complex(c1,c2), tol ); - BOOST_UBLAS_TEST_CHECK_CLOSE( ::std::complex(c1,c2), ::std::complex(c1,c2), tol ); - - // Check T1 vs. T2 - BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." ); - BOOST_UBLAS_TEST_CHECK_CLOSE( float(c1), double(c1), tol ); - BOOST_UBLAS_TEST_CHECK_CLOSE( double(c1), float(c1), tol ); - BOOST_UBLAS_TEST_CHECK_CLOSE( ::std::complex(c1,c2), ::std::complex(c1,c2), tol ); - BOOST_UBLAS_TEST_CHECK_CLOSE( ::std::complex(c1,c2), ::std::complex(c1,c2), tol ); - - // Check alias - BOOST_UBLAS_DEBUG_TRACE( "-- Test aliases." ); - BOOST_UBLAS_TEST_CHECK_PRECISION( float(c1), float(c1), tol ); -} - -BOOST_UBLAS_TEST_DEF( check_rel_close ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: 'check_rel_close'" ); - - const double c1(1*mul); - const double c2(2*mul); - - // Check T vs. T - BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." ); - BOOST_UBLAS_TEST_CHECK_REL_CLOSE( float(c1), float(c1), tol ); - BOOST_UBLAS_TEST_CHECK_REL_CLOSE( double(c1), double(c1), tol ); - BOOST_UBLAS_TEST_CHECK_REL_CLOSE( ::std::complex(c1,c2), ::std::complex(c1,c2), tol ); - BOOST_UBLAS_TEST_CHECK_REL_CLOSE( ::std::complex(c1,c2), ::std::complex(c1,c2), tol ); - - // Check T1 vs. T2 - BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." ); - BOOST_UBLAS_TEST_CHECK_REL_CLOSE( float(c1), double(c1), tol ); - BOOST_UBLAS_TEST_CHECK_REL_CLOSE( double(c1), float(c1), tol ); - BOOST_UBLAS_TEST_CHECK_REL_CLOSE( ::std::complex(c1,c2), ::std::complex(c1,c2), tol ); - BOOST_UBLAS_TEST_CHECK_REL_CLOSE( ::std::complex(c1,c2), ::std::complex(c1,c2), tol ); - - // Check alias - BOOST_UBLAS_DEBUG_TRACE( "-- Test aliases." ); - BOOST_UBLAS_TEST_CHECK_REL_PRECISION( float(c1), float(c1), tol ); -} - -BOOST_UBLAS_TEST_DEF( check_vector_eq ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: 'check_vector_eq'" ); - - const ::std::size_t n(5); - - ublas::vector sv = ublas::scalar_vector(n, 1); - ublas::vector iv = ublas::scalar_vector(n, 1); - ublas::vector lv = ublas::scalar_vector(n, 1L); - ublas::vector uv = ublas::scalar_vector(n, 1u); - - // Check T vs. T - BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." ); - BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( sv, sv, n ); - BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( iv, iv, n ); - BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( lv, lv, n ); - BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( uv, uv, n ); - - // Check T1 vs. T2 - BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." ); - BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( sv, iv, n ); - BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( iv, sv, n ); - BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( iv, lv, n ); - BOOST_UBLAS_TEST_CHECK_VECTOR_EQ( lv, iv, n ); -} - -BOOST_UBLAS_TEST_DEF( check_vector_close ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: 'check_vector_close'" ); - - const ::std::size_t n(5); - - ublas::vector fv = ublas::scalar_vector(n, 1); - ublas::vector dv = ublas::scalar_vector(n, 1); - ublas::vector< ::std::complex > cfv = ublas::scalar_vector< ::std::complex >(n, ::std::complex(1,2)); - ublas::vector< ::std::complex > cdv = ublas::scalar_vector< ::std::complex >(n, ::std::complex(1,2)); - - // Check T vs. T - BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." ); - BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( fv, fv, n, tol ); - BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( dv, dv, n, tol ); - BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( cfv, cfv, n, tol ); - BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( cdv, cdv, n, tol ); - - // Check T1 vs. T2 - BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." ); - BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( fv, dv, n, tol ); - BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( dv, fv, n, tol ); - BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( cfv, cdv, n, tol ); - BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE( cdv, cfv, n, tol ); -} - -BOOST_UBLAS_TEST_DEF( check_vector_rel_close ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: 'check_vector_rel_close'" ); - - const ::std::size_t n(5); - const double c1(1*mul); - const double c2(2*mul); - - ublas::vector fv = ublas::scalar_vector(n, c1); - ublas::vector dv = ublas::scalar_vector(n, c1); - ublas::vector< ::std::complex > cfv = ublas::scalar_vector< ::std::complex >(n, ::std::complex(c1,c2)); - ublas::vector< ::std::complex > cdv = ublas::scalar_vector< ::std::complex >(n, ::std::complex(c1,c2)); - - // Check T vs. T - BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." ); - BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( fv, fv, n, tol ); - BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( dv, dv, n, tol ); - BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( cfv, cfv, n, tol ); - BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( cdv, cdv, n, tol ); - - // Check T1 vs. T2 - BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." ); - BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( fv, dv, n, tol ); - BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( dv, fv, n, tol ); - BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( cfv, cdv, n, tol ); - BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE( cdv, cfv, n, tol ); -} - -BOOST_UBLAS_TEST_DEF( check_matrix_eq ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: 'check_matrix_eq'" ); - - const ::std::size_t nr(3); - const ::std::size_t nc(4); - - ublas::matrix sv = ublas::scalar_matrix(nr, nc, 1); - ublas::matrix iv = ublas::scalar_matrix(nr, nc, 1); - ublas::matrix lv = ublas::scalar_matrix(nr, nc, 1L); - ublas::matrix uv = ublas::scalar_matrix(nr, nc, 1u); - - // Check T vs. T - BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." ); - BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( sv, sv, nr, nc ); - BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( iv, iv, nr, nc ); - BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( lv, lv, nr, nc ); - BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( uv, uv, nr, nc ); - - // Check T1 vs. T2 - BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." ); - BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( sv, iv, nr, nc ); - BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( iv, sv, nr, nc ); - BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( iv, lv, nr, nc ); - BOOST_UBLAS_TEST_CHECK_MATRIX_EQ( lv, iv, nr, nc ); -} - -BOOST_UBLAS_TEST_DEF( check_matrix_close ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: 'check_matrix_close'" ); - - const ::std::size_t nr(3); - const ::std::size_t nc(4); - const double c1(1*mul); - const double c2(2*mul); - - ublas::matrix fA = ublas::scalar_matrix(nr, nc, c1); - ublas::matrix dA = ublas::scalar_matrix(nr, nc, c1); - ublas::matrix< ::std::complex > cfA = ublas::scalar_matrix< ::std::complex >(nr, nc, ::std::complex(c1,c2)); - ublas::matrix< ::std::complex > cdA = ublas::scalar_matrix< ::std::complex >(nr, nc, ::std::complex(c1,c2)); - - // Check T vs. T - BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." ); - BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( fA, fA, nr, nc, tol ); - BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( dA, dA, nr, nc, tol ); - BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( cfA, cfA, nr, nc, tol ); - BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( cdA, cdA, nr, nc, tol ); - - // Check T1 vs. T2 - BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." ); - BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( fA, dA, nr, nc, tol ); - BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( dA, fA, nr, nc, tol ); - BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( cfA, cdA, nr, nc, tol ); - BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE( cdA, cfA, nr, nc, tol ); -} - - -BOOST_UBLAS_TEST_DEF( check_matrix_rel_close ) -{ - BOOST_UBLAS_TEST_TRACE( "Test case: 'check_matrix_rel_close'" ); - - const ::std::size_t nr(3); - const ::std::size_t nc(4); - const double c1(1*mul); - const double c2(2*mul); - - ublas::matrix fA = ublas::scalar_matrix(nr, nc, c1); - ublas::matrix dA = ublas::scalar_matrix(nr, nc, c1); - ublas::matrix< ::std::complex > cfA = ublas::scalar_matrix< ::std::complex >(nr, nc, ::std::complex(c1,c2)); - ublas::matrix< ::std::complex > cdA = ublas::scalar_matrix< ::std::complex >(nr, nc, ::std::complex(c1,c2)); - - // Check T vs. T - BOOST_UBLAS_DEBUG_TRACE( "-- Test against same types." ); - BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( fA, fA, nr, nc, tol ); - BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( dA, dA, nr, nc, tol ); - BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( cfA, cfA, nr, nc, tol ); - BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( cdA, cdA, nr, nc, tol ); - - // Check T1 vs. T2 - BOOST_UBLAS_DEBUG_TRACE( "-- Test against different types." ); - BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( fA, dA, nr, nc, tol ); - BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( dA, fA, nr, nc, tol ); - BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( cfA, cdA, nr, nc, tol ); - BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE( cdA, cfA, nr, nc, tol ); -} - - -int main() -{ - BOOST_UBLAS_TEST_SUITE( "Test 'utils.hpp' functionalities" ); - - BOOST_UBLAS_TEST_BEGIN(); - BOOST_UBLAS_TEST_DO( check ); - BOOST_UBLAS_TEST_DO( check_eq ); - BOOST_UBLAS_TEST_DO( check_close ); - BOOST_UBLAS_TEST_DO( check_rel_close ); - BOOST_UBLAS_TEST_DO( check_vector_eq ); - BOOST_UBLAS_TEST_DO( check_vector_close ); - BOOST_UBLAS_TEST_DO( check_vector_rel_close ); - BOOST_UBLAS_TEST_DO( check_matrix_eq ); - BOOST_UBLAS_TEST_DO( check_matrix_close ); - BOOST_UBLAS_TEST_DO( check_matrix_rel_close ); - BOOST_UBLAS_TEST_END(); -} diff --git a/libs/numeric/ublas/test/test_triangular.cpp b/libs/numeric/ublas/test/test_triangular.cpp deleted file mode 100644 index c6cba9134..000000000 --- a/libs/numeric/ublas/test/test_triangular.cpp +++ /dev/null @@ -1,129 +0,0 @@ -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -namespace ublas = boost::numeric::ublas; - -template -double diff(const mat& A, const vec& x, const vec& b) { - vec temp(prod(A, x) - b); - double result = 0; - for (typename vec::size_type i=0; i -double diff(const vec& x, const mat& A, const vec& b) { - return diff(trans(A), x, b); -} - -namespace ublas = boost::numeric::ublas; - - -int main() { - const int n=7000; -#if 1 - ublas::compressed_matrix mat_row_upp(n, n); - ublas::compressed_matrix mat_col_upp(n, n); - ublas::compressed_matrix mat_row_low(n, n); - ublas::compressed_matrix mat_col_low(n, n); -#else - ublas::matrix mat_row_upp(n, n, 0); - ublas::matrix mat_col_upp(n, n, 0); - ublas::matrix mat_row_low(n, n, 0); - ublas::matrix mat_col_low(n, n, 0); -#endif - ublas::vector b(n, 1); - - std::cerr << "Constructing..." << std::endl; - for (int i=0; i=0) { - mat_row_low(i, i-1) = side; - } - mat_row_low(i, i) = main; - - mat_col_low(i, i) = main; - if (i+1=0) { - mat_col_upp(i-1, i) = side; - } - mat_col_upp(i, i) = main; - } - - std::cerr << "Starting..." << std::endl; - { - boost::timer::auto_cpu_timer t(std::cerr, "col_low x: %t sec CPU, %w sec real\n"); - ublas::vector x(b); - ublas::inplace_solve(mat_col_low, x, ublas::lower_tag()); - std::cerr << "delta: " << diff(mat_col_low, x, b) << "\n"; - } - { - boost::timer::auto_cpu_timer t(std::cerr, "row_low x: %t sec CPU, %w sec real\n"); - ublas::vector x(b); - ublas::inplace_solve(mat_row_low, x, ublas::lower_tag()); - std::cerr << "delta: " << diff(mat_row_low, x, b) << "\n"; - } - - { - boost::timer::auto_cpu_timer t(std::cerr, "col_upp x: %t sec CPU, %w sec real\n"); - ublas::vector x(b); - ublas::inplace_solve(mat_col_upp, x, ublas::upper_tag()); - std::cerr << "delta: " << diff(mat_col_upp, x, b) << "\n"; - } - { - boost::timer::auto_cpu_timer t(std::cerr, "row_upp x: %t sec CPU, %w sec real\n"); - ublas::vector x(b); - ublas::inplace_solve(mat_row_upp, x, ublas::upper_tag()); - std::cerr << "delta: " << diff(mat_row_upp, x, b) << "\n"; - } - - { - boost::timer::auto_cpu_timer t(std::cerr, "x col_low: %t sec CPU, %w sec real\n"); - ublas::vector x(b); - ublas::inplace_solve(x, mat_col_low, ublas::lower_tag()); - std::cerr << "delta: " << diff(x, mat_col_low, b) << "\n"; - } - { - boost::timer::auto_cpu_timer t(std::cerr, "x row_low: %t sec CPU, %w sec real\n"); - ublas::vector x(b); - ublas::inplace_solve(x, mat_row_low, ublas::lower_tag()); - std::cerr << "delta: " << diff(x, mat_row_low, b) << "\n"; - } - - { - boost::timer::auto_cpu_timer t(std::cerr, "x col_upp: %t sec CPU, %w sec real\n"); - ublas::vector x(b); - ublas::inplace_solve(x, mat_col_upp, ublas::upper_tag()); - std::cerr << "delta: " << diff(x, mat_col_upp, b) << "\n"; - } - { - boost::timer::auto_cpu_timer t(std::cerr, "x row_upp: %t sec CPU, %w sec real\n"); - ublas::vector x(b); - ublas::inplace_solve(x, mat_row_upp, ublas::upper_tag()); - std::cerr << "delta: " << diff(x, mat_row_upp, b) << "\n"; - } - - -} diff --git a/libs/numeric/ublas/test/triangular_access.cpp b/libs/numeric/ublas/test/triangular_access.cpp deleted file mode 100644 index c2c9b7733..000000000 --- a/libs/numeric/ublas/test/triangular_access.cpp +++ /dev/null @@ -1,220 +0,0 @@ -/* Test program to test find functions of triagular matrices - * - * author: Gunter Winkler ( guwi17 at gmx dot de ) - */ -// Copyright 2008 Gunter Winkler -// Distributed under the 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 -#include -#include - -#include "common/testhelper.hpp" - -#ifdef BOOST_UBLAS_NO_NESTED_CLASS_RELATION -using boost::numeric::ublas::iterator1_tag; -using boost::numeric::ublas::iterator2_tag; -#endif - -template < class MAT > -void test_iterator( MAT & A ) { - -#ifndef NOMESSAGES - std::cout << "=>"; -#endif - // check mutable iterators - typename MAT::iterator1 it1 = A.begin1(); - typename MAT::iterator1 it1_end = A.end1(); - - for ( ; it1 != it1_end; ++it1 ) { -#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION - typename MAT::iterator2 it2 = it1.begin(); - typename MAT::iterator2 it2_end = it1.end(); -#else - typename MAT::iterator2 it2 = begin(it1, iterator1_tag()); - typename MAT::iterator2 it2_end = end(it1, iterator1_tag()); -#endif - for ( ; it2 != it2_end ; ++ it2 ) { -#ifndef NOMESSAGES - std::cout << "( " << it2.index1() << ", " << it2.index2() << ") " << std::flush; -#endif - * it2 = ( 10 * it2.index1() + it2.index2() ); - } -#ifndef NOMESSAGES - std::cout << std::endl; -#endif - } - -} - -template < class MAT > -void test_iterator2( MAT & A ) { - -#ifndef NOMESSAGES - std::cout << "=>"; -#endif - // check mutable iterators - typename MAT::iterator2 it2 = A.begin2(); - typename MAT::iterator2 it2_end = A.end2(); - - for ( ; it2 != it2_end; ++it2 ) { -#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION - typename MAT::iterator1 it1 = it2.begin(); - typename MAT::iterator1 it1_end = it2.end(); -#else - typename MAT::iterator1 it1 = begin(it2, iterator2_tag()); - typename MAT::iterator1 it1_end = end(it2, iterator2_tag()); -#endif - for ( ; it1 != it1_end ; ++ it1 ) { -#ifndef NOMESSAGES - std::cout << "( " << it1.index1() << ", " << it1.index2() << ") " << std::flush; -#endif - * it1 = ( 10 * it1.index1() + it1.index2() ); - } -#ifndef NOMESSAGES - std::cout << std::endl; -#endif - } - -} - -template < class MAT > -typename MAT::value_type -test_iterator3( const MAT & A ) { - -#ifndef NOMESSAGES - std::cout << "=>"; -#endif - typename MAT::value_type result = 0; - - // check mutable iterators - typename MAT::const_iterator1 it1 = A.begin1(); - typename MAT::const_iterator1 it1_end = A.end1(); - - for ( ; it1 != it1_end; ++it1 ) { -#ifndef BOOST_UBLAS_NO_NESTED_CLASS_RELATION - typename MAT::const_iterator2 it2 = it1.begin(); - typename MAT::const_iterator2 it2_end = it1.end(); -#else - typename MAT::const_iterator2 it2 = begin(it1, iterator1_tag()); - typename MAT::const_iterator2 it2_end = end(it1, iterator1_tag()); -#endif - for ( ; it2 != it2_end ; ++ it2 ) { -#ifndef NOMESSAGES - std::cout << "( " << it2.index1() << ", " << it2.index2() << ") " << std::flush; -#endif - result += * it2; - } -#ifndef NOMESSAGES - std::cout << std::endl; -#endif - } - return result; - -} - - -int main () { - using namespace boost::numeric::ublas; - - typedef double VALUE_TYPE; - typedef triangular_matrix LT; - typedef triangular_matrix ULT; - typedef triangular_matrix SLT; - typedef triangular_matrix UT; - typedef triangular_matrix UUT; - typedef triangular_matrix SUT; - - LT A(5,5); - - test_iterator(A); - test_iterator2(A); - - ULT B(5,5); - - test_iterator(B); - test_iterator2(B); - - SLT C(5,5); - - test_iterator(C); - test_iterator2(C); - - UT D(5,5); - - test_iterator(D); - test_iterator2(D); - - UUT E(5,5); - - test_iterator(E); - test_iterator2(E); - - SUT F(5,5); - - test_iterator(F); - test_iterator2(F); - - assertTrue("Write access using iterators: ", true); - - assertEquals(" LT: ",420.0,test_iterator3(A)); - assertEquals("ULT: ",315.0,test_iterator3(B)); - assertEquals("SLT: ",310.0,test_iterator3(C)); - assertEquals(" UT: ",240.0,test_iterator3(D)); - assertEquals("UUT: ",135.0,test_iterator3(E)); - assertEquals("SUT: ",130.0,test_iterator3(F)); - - assertTrue("Read access using iterators: ", true); - -#ifndef NOMESSAGES - std::cout << A << B << C << D << E << F << std::endl; -#endif - - typedef matrix MATRIX; - MATRIX mat(5,5); - triangular_adaptor lta((mat)); - triangular_adaptor ulta((mat)); - triangular_adaptor slta((mat)); - triangular_adaptor uta((mat)); - triangular_adaptor uuta((mat)); - triangular_adaptor suta((mat)); - - test_iterator ( lta ); - test_iterator2( lta ); - - test_iterator ( ulta ); - test_iterator2( ulta ); - - test_iterator ( slta ); - test_iterator2( slta ); - - test_iterator ( uta ); - test_iterator2( uta ); - - test_iterator ( uuta ); - test_iterator2( uuta ); - - test_iterator ( suta ); - test_iterator2( suta ); - - assertTrue("Write access using adaptors: ", true); - - assertEquals(" LTA: ",420.0,test_iterator3( lta )); - assertEquals("ULTA: ",315.0,test_iterator3( ulta )); - assertEquals("SLTA: ",310.0,test_iterator3( slta )); - - assertEquals(" UTA: ",240.0,test_iterator3( uta )); - assertEquals("UUTA: ",135.0,test_iterator3( uuta )); - assertEquals("SUTA: ",130.0,test_iterator3( suta )); - - assertTrue("Read access using adaptors: ", true); - -#ifndef NOMESSAGES - std::cout << mat << std::endl; -#endif - - return (getResults().second > 0) ? boost::exit_failure : boost::exit_success; -} diff --git a/libs/numeric/ublas/test/triangular_layout.cpp b/libs/numeric/ublas/test/triangular_layout.cpp deleted file mode 100644 index 815643d37..000000000 --- a/libs/numeric/ublas/test/triangular_layout.cpp +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2008 Gunter Winkler -// Thanks to Tiago Requeijo for providing this test -// Distributed under the 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 -#include -#include -#include - -using namespace std; -namespace ublas = boost::numeric::ublas; - -int main() -{ - int sz = 4; - ublas::symmetric_matrix UpCol (sz, sz); - ublas::symmetric_matrix UpRow (sz, sz); - ublas::symmetric_matrix LoCol (sz, sz); - ublas::symmetric_matrix LoRow (sz, sz); - - ublas::triangular_matrix TrUpCol (sz, sz); - ublas::triangular_matrix TrUpRow (sz, sz); - ublas::triangular_matrix TrLoCol (sz, sz); - ublas::triangular_matrix TrLoRow (sz, sz); - - for(int i=0; i - * BOOST_UBLAS_TEST_DEF( test_case_1 ) - * { - * // do your test stuff - * } - * - * BOOST_UBLAS_TEST_DEF( test_case_2 ) - * { - * // do your test stuff - * } - * - * // ... - * - * BOOST_UBLAS_TEST_DEF( test_case_n ) - * { - * // do your test stuff - * } - * - * int main() - * { - * BOOST_UBLAS_TEST_SUITE( "My Test Suite" ); // optional - * - * BOOST_UBLAS_TEST_BEGIN(); - * BOOST_UBLAS_TEST_DO( test_case_1 ); - * BOOST_UBLAS_TEST_DO( test_case_2 ); - * // ... - * BOOST_UBLAS_TEST_DO( test_case_n ); - * BOOST_UBLAS_TEST_END(); - * } - * - * Inside each test_case_k you can use the various - * \c BOOST_UBLAS_TEST_CHECK* macros. - * - *
        - * - * Copyright (c) 2009-2012, Marco Guazzone - * - * Distributed under the Boost Software License, Version 1.0. (See - * accompanying file LICENSE_1_0.txt or copy at - * http://www.boost.org/LICENSE_1_0.txt) - * - * \author Marco Guazzone, marco.guazzone@gmail.com - */ - -#ifndef BOOST_NUMERIC_UBLAS_TEST_UTILS_HPP -#define BOOST_NUMERIC_UBLAS_TEST_UTILS_HPP - - -#include -#include - -#include // isnan, isinf - -#include -#include -#include -#include -#include -#include - -#define BOOST_UBLAS_NOT_USED(x) (void)(x) - -namespace boost { namespace numeric { namespace ublas { namespace test { namespace detail { namespace /**/ { - - using ::std::abs; - using ::std::max; - -/// Check if the given complex number is a NaN. -// read the comments in fpclassify as well -template -BOOST_UBLAS_INLINE -bool (isnan)(::std::complex const& z) -{ - // According to IEEE, NaN is different even by itself - return (z != z) || (boost::math::isnan)(z.real()) || (boost::math::isnan)(z.imag()); -} - -/// Check if two (real) numbers are close each other (wrt a given tolerance). -template -BOOST_UBLAS_INLINE -bool close_to(T1 x, T2 y, T3 tol) -{ - typedef typename promote_traits::promote_type, - T3>::promote_type real_type; - - if ((boost::math::isnan)(x) || (boost::math::isnan)(y)) - { - // According to IEEE, NaN is different even by itself - return false; - } - return abs(x-y) <= (max(static_cast(abs(x)), static_cast(abs(y)))*tol); -} - -/// Check if two complex numbers are close each other (wrt a given tolerance). -template -BOOST_UBLAS_INLINE -bool close_to(::std::complex const& x, ::std::complex const& y, T3 tol) -{ - typedef typename promote_traits::promote_type, - T3>::promote_type real_type; - - if ((isnan)(x) || (isnan)(y)) - { - // According to IEEE, NaN is different even by itself - return false; - } - ::std::complex xx(x); - ::std::complex yy(y); - - return abs(xx-yy) <= (max(abs(xx), abs(yy))*tol); -} - -/// Check if two (real) numbers are close each other (wrt a given tolerance). -template -BOOST_UBLAS_INLINE -bool rel_close_to(T1 x, T2 y, T3 tol) -{ - //typedef typename promote_traits::promote_type, - // T3>::promote_type real_type; - - if ((boost::math::isnan)(x) || (boost::math::isnan)(y)) - { - // According to IEEE, NaN is different even by itself - return false; - } - return abs(x-y)/abs(y) <= tol; -} - -/// Check if two complex numbers are close each other (wrt a given tolerance). -template -BOOST_UBLAS_INLINE -bool rel_close_to(::std::complex const& x, ::std::complex const& y, T3 tol) -{ - typedef typename promote_traits::promote_type, - T3>::promote_type real_type; - - if ((isnan)(x) || (isnan)(y)) - { - // According to IEEE, NaN is different even by itself - return false; - } - ::std::complex xx(x); - ::std::complex yy(y); - - return abs(xx-yy)/abs(yy) <= tol; -} - -}}}}}} // Namespace boost::numeric::ublas::test::detail:: - - -/// Expand its argument \a x. -#define BOOST_UBLAS_TEST_EXPAND_(x) x - - -/// Expand its argument \a x inside parenthesis. -#define BOOST_UBLAS_TEST_EXPANDP_(x) (x) - - -/// Transform its argument \a x into a string. -#define BOOST_UBLAS_TEST_STRINGIFY_(x) #x - - -/// Concatenate its two \e string arguments \a x and \a y. -#define BOOST_UBLAS_TEST_JOIN_(x,y) x ## y - - -/// Output the message \a x if in debug-mode; otherwise output nothing. -/// Note: we don't use macro expansion inside parenthesis to let \a m be an -/// expression of the form a << b. -#ifndef NDEBUG -# define BOOST_UBLAS_DEBUG_TRACE(x) ::std::cerr << "[Debug>> " << BOOST_UBLAS_TEST_EXPAND_(x) << ::std::endl -#else -# define BOOST_UBLAS_DEBUG_TRACE(x) /**/ -#endif // NDEBUG - - -/// Define the name \a m of the entire test suite. -#define BOOST_UBLAS_TEST_SUITE(m) ::std::cerr << "--- Test Suite: " << BOOST_UBLAS_TEST_EXPAND_(m) << " ---" << ::std::endl; - - -/// Define the beginning of a test suite. -#define BOOST_UBLAS_TEST_BEGIN() /* [BOOST_UBLAS_TEST_BEGIN] */ \ - { \ - /* Begin of Test Suite */ \ - ::std::size_t test_fails__(0) \ - /* [/BOOST_UBLAS_TEST_BEGIN] */ - - -/// Define a test case \a x inside the current test suite. -#define BOOST_UBLAS_TEST_DEF(x) static void BOOST_UBLAS_TEST_EXPAND_(x)(::std::size_t& test_fails__) - - -/// Call the test case \a x. -#define BOOST_UBLAS_TEST_DO(x) /* [BOOST_UBLAS_TEST_DO] */ \ - try \ - { \ - BOOST_UBLAS_TEST_EXPAND_(x)(test_fails__); \ - } \ - catch (::std::exception& e) \ - { \ - ++test_fails__; \ - BOOST_UBLAS_TEST_ERROR( e.what() ); \ - } \ - catch (...) \ - { \ - ++test_fails__; \ - } \ - /* [/BOOST_UBLAS_TEST_DO] */ - - -/// Define the end of a test suite and return non-zero value if any test failed. -#define BOOST_UBLAS_TEST_END() /* [BOOST_UBLAS_TEST_END] */ \ - if (test_fails__ > 0) \ - { \ - ::std::cerr << "Number of failed tests: " << test_fails__ << ::std::endl; \ - return 1; \ - } \ - else \ - { \ - ::std::cerr << "No failed test" << ::std::endl; \ - return 0; \ - } \ - } /* End of test suite */ \ - /* [/BOOST_UBLAS_TEST_END] */ - - -/// Output the message \a m. -/// Note: we don't use macro expansion inside parenthesis to let \a m be an -/// expression of the form a << b. -#define BOOST_UBLAS_TEST_TRACE(m) ::std::cerr << "[Info>> " << BOOST_UBLAS_TEST_EXPAND_(m) << ::std::endl - - -/// Check the truth of assertion \a x. -#define BOOST_UBLAS_TEST_CHECK(x) /* [BOOST_UBLAS_TEST_CHECK] */ \ - if (!BOOST_UBLAS_TEST_EXPANDP_(x)) \ - { \ - BOOST_UBLAS_TEST_ERROR( "Failed assertion: " << BOOST_UBLAS_TEST_STRINGIFY_(x) ); \ - ++test_fails__; \ - } \ - /* [/BOOST_UBLAS_TEST_CHECK] */ - - -/// Check for the equality of \a x against \a y. -#define BOOST_UBLAS_TEST_CHECK_EQ(x,y) /* [BOOST_UBLAS_TEST_CHECK_EQUAL] */ \ - if (!(BOOST_UBLAS_TEST_EXPANDP_(x) == BOOST_UBLAS_TEST_EXPANDP_(y))) \ - { \ - BOOST_UBLAS_TEST_ERROR( "Failed assertion: (" << BOOST_UBLAS_TEST_STRINGIFY_(x) << " == " << BOOST_UBLAS_TEST_STRINGIFY_(y) << ")" ); \ - ++test_fails__; \ - } \ - /* [/BOOST_UBLAS_TEST_CHECK_EQUAL] */ - - -/// Alias for macro \c BOOST_UBLAS_TEST_CHECK_EQ (for backward compatibility). -#define BOOST_UBLAS_TEST_CHECK_EQUAL(x,y) BOOST_UBLAS_TEST_CHECK_EQ(x,y) - - -/// Check that \a x and \a y are close with respect to a given precision \a e. -#define BOOST_UBLAS_TEST_CHECK_CLOSE(x,y,e) /* [BOOST_UBLAS_TEST_CHECK_CLOSE] */ \ - if (!::boost::numeric::ublas::test::detail::close_to(BOOST_UBLAS_TEST_EXPAND_(x), BOOST_UBLAS_TEST_EXPAND_(y), BOOST_UBLAS_TEST_EXPAND_(e))) \ - { \ - BOOST_UBLAS_TEST_ERROR( "Failed assertion: abs(" << BOOST_UBLAS_TEST_STRINGIFY_(x) << "-" << BOOST_UBLAS_TEST_STRINGIFY_(y) << ") <= " << BOOST_UBLAS_TEST_STRINGIFY_(e) << " [with " << BOOST_UBLAS_TEST_STRINGIFY_(x) << " == " << BOOST_UBLAS_TEST_EXPANDP_(x) << ", " << BOOST_UBLAS_TEST_STRINGIFY_(y) << " == " << BOOST_UBLAS_TEST_EXPANDP_(y) << " and " << BOOST_UBLAS_TEST_STRINGIFY_(e) << " == " << BOOST_UBLAS_TEST_EXPANDP_(e) << "]" ); \ - ++test_fails__; \ - } \ - /* [/BOOST_UBLAS_TEST_CHECK_CLOSE] */ - - -/// Alias for macro \c BOOST_UBLAS_TEST_CHECK_CLOSE (for backward compatibility), -#define BOOST_UBLAS_TEST_CHECK_PRECISION(x,y,e) BOOST_UBLAS_TEST_CHECK_CLOSE(x,y,e) - - -/// Check that \a x is close to \a y with respect to a given relative precision \a e. -#define BOOST_UBLAS_TEST_CHECK_REL_CLOSE(x,y,e) /* [BOOST_UBLAS_TEST_CHECK_REL_CLOSE] */ \ - if (!::boost::numeric::ublas::test::detail::rel_close_to(BOOST_UBLAS_TEST_EXPAND_(x), BOOST_UBLAS_TEST_EXPAND_(y), BOOST_UBLAS_TEST_EXPAND_(e))) \ - { \ - BOOST_UBLAS_TEST_ERROR( "Failed assertion: abs((" << BOOST_UBLAS_TEST_STRINGIFY_(x) << "-" << BOOST_UBLAS_TEST_STRINGIFY_(y) << ")/" << BOOST_UBLAS_TEST_STRINGIFY_(y) << ") <= " << BOOST_UBLAS_TEST_STRINGIFY_(e) << " [with " << BOOST_UBLAS_TEST_STRINGIFY_(x) << " == " << BOOST_UBLAS_TEST_EXPANDP_(x) << ", " << BOOST_UBLAS_TEST_STRINGIFY_(y) << " == " << BOOST_UBLAS_TEST_EXPANDP_(y) << " and " << BOOST_UBLAS_TEST_STRINGIFY_(e) << " == " << BOOST_UBLAS_TEST_EXPANDP_(e) << "]" ); \ - ++test_fails__; \ - } \ - /* [/BOOST_UBLAS_TEST_CHECK_REL_CLOSE] */ - - -/// Alias for macro \c BOOST_UBLAS_TEST_CHECK_REL_CLOSE (for backward compatibility), -#define BOOST_UBLAS_TEST_CHECK_REL_PRECISION(x,y,e) BOOST_UBLAS_TEST_CHECK_REL_CLOSE(x,y,e) - - -/// Check that elements of \a x and \a y are equal. -#define BOOST_UBLAS_TEST_CHECK_VECTOR_EQ(x,y,n) /* [BOOST_UBLAS_TEST_CHECK_VECTOR_EQ] */ \ - if (BOOST_UBLAS_TEST_EXPANDP_(n) > 0) \ - { \ - ::std::size_t n__ = BOOST_UBLAS_TEST_EXPAND_(n); \ - for (::std::size_t i__ = n__; i__ > 0; --i__) \ - { \ - if (!(BOOST_UBLAS_TEST_EXPANDP_(x)[n__-i__]==BOOST_UBLAS_TEST_EXPANDP_(y)[n__-i__])) \ - { \ - BOOST_UBLAS_TEST_ERROR( "Failed assertion: (" << BOOST_UBLAS_TEST_STRINGIFY_(x[i__]) << "==" << BOOST_UBLAS_TEST_STRINGIFY_(y[i__]) << ")" << " [with " << BOOST_UBLAS_TEST_STRINGIFY_(x[i__]) << " == " << BOOST_UBLAS_TEST_EXPANDP_(x)[n__-i__] << ", " << BOOST_UBLAS_TEST_STRINGIFY_(y[i__]) << " == " << BOOST_UBLAS_TEST_EXPANDP_(y)[n__-i__] << ", " << BOOST_UBLAS_TEST_STRINGIFY_(i__) << " == " << i__ << " and " << BOOST_UBLAS_TEST_STRINGIFY_(n) << " == " << n__ << "]" ); \ - ++test_fails__; \ - } \ - } \ - } \ - /* [/BOOST_UBLAS_TEST_CHECK_VECTOR_EQ] */ - - -/// Check that elements of \a x and \a y are close with respect to a given precision \a e. -#define BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE(x,y,n,e) /* [BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE] */ \ - if (BOOST_UBLAS_TEST_EXPANDP_(n) > 0) \ - { \ - ::std::size_t n__ = BOOST_UBLAS_TEST_EXPAND_(n); \ - for (::std::size_t i__ = n__; i__ > 0; --i__) \ - { \ - if (!::boost::numeric::ublas::test::detail::close_to(BOOST_UBLAS_TEST_EXPANDP_(x)[n__-i__], BOOST_UBLAS_TEST_EXPANDP_(y)[n__-i__], BOOST_UBLAS_TEST_EXPANDP_(e))) \ - { \ - BOOST_UBLAS_TEST_ERROR( "Failed assertion: abs((" << BOOST_UBLAS_TEST_STRINGIFY_(x[i__]) << "-" << BOOST_UBLAS_TEST_STRINGIFY_(y[i__]) << ") <= " << BOOST_UBLAS_TEST_STRINGIFY_(e) << " [with " << BOOST_UBLAS_TEST_STRINGIFY_(x[i__]) << " == " << BOOST_UBLAS_TEST_EXPANDP_(x)[n__-i__] << ", " << BOOST_UBLAS_TEST_STRINGIFY_(y[i__]) << " == " << BOOST_UBLAS_TEST_EXPANDP_(y)[n__-i__] << ", " << BOOST_UBLAS_TEST_STRINGIFY_(i__) << " == " << i__ << " and " << BOOST_UBLAS_TEST_STRINGIFY_(n) << " == " << n__ << "]" ); \ - ++test_fails__; \ - } \ - } \ - } \ - /* [/BOOST_UBLAS_TEST_CHECK_VECTOR_CLOSE] */ - - -/// Check that elements of \a x and \a y are close with respect to a given relative precision \a e. -#define BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE(x,y,n,e) /* [BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE] */ \ - if (BOOST_UBLAS_TEST_EXPANDP_(n) > 0) \ - { \ - ::std::size_t n__ = BOOST_UBLAS_TEST_EXPAND_(n); \ - for (::std::size_t i__ = n__; i__ > 0; --i__) \ - { \ - if (!::boost::numeric::ublas::test::detail::rel_close_to(BOOST_UBLAS_TEST_EXPANDP_(x)[n__-i__], BOOST_UBLAS_TEST_EXPANDP_(y)[n__-i__], BOOST_UBLAS_TEST_EXPANDP_(e))) \ - { \ - BOOST_UBLAS_TEST_ERROR( "Failed assertion: abs((" << BOOST_UBLAS_TEST_STRINGIFY_(x[i__]) << "-" << BOOST_UBLAS_TEST_STRINGIFY_(y[i__]) << ") <= " << BOOST_UBLAS_TEST_STRINGIFY_(e) << " [with " << BOOST_UBLAS_TEST_STRINGIFY_(x[i__]) << " == " << BOOST_UBLAS_TEST_EXPANDP_(x)[n__-i__] << ", " << BOOST_UBLAS_TEST_STRINGIFY_(y[i__]) << " == " << BOOST_UBLAS_TEST_EXPANDP_(y)[n__-i__] << ", " << BOOST_UBLAS_TEST_STRINGIFY_(i__) << " == " << i__ << " and " << BOOST_UBLAS_TEST_STRINGIFY_(n) << " == " << n__ << "]" ); \ - ++test_fails__; \ - } \ - } \ - } \ - /* [/BOOST_UBLAS_TEST_CHECK_VECTOR_REL_CLOSE] */ - - -/// Check that elements of matrices \a x and \a y are equal. -#define BOOST_UBLAS_TEST_CHECK_MATRIX_EQ(x,y,nr,nc) /* [BOOST_UBLAS_TEST_CHECK_MATRIX_EQ] */ \ - for (::std::size_t i__ = 0; i__ < BOOST_UBLAS_TEST_EXPANDP_(nr); ++i__) \ - { \ - for (::std::size_t j__ = 0; j__ < BOOST_UBLAS_TEST_EXPANDP_(nc); ++j__) \ - { \ - if (!(BOOST_UBLAS_TEST_EXPANDP_(x)(i__,j__)==BOOST_UBLAS_TEST_EXPANDP_(y)(i__,j__))) \ - { \ - BOOST_UBLAS_TEST_ERROR( "Failed assertion: (" << BOOST_UBLAS_TEST_STRINGIFY_(x(i__,j__)) << " == " << BOOST_UBLAS_TEST_STRINGIFY_(y(i__,j__)) << ") [with " << BOOST_UBLAS_TEST_STRINGIFY_(x(i__,j__)) << " == " << BOOST_UBLAS_TEST_EXPANDP_(x)(i__,j__) << ", " << BOOST_UBLAS_TEST_STRINGIFY_(y(i__,j__)) << " == " << BOOST_UBLAS_TEST_EXPANDP_(y)(i__,j__) << ", " << BOOST_UBLAS_TEST_STRINGIFY_(i__) << " == " << i__ << ", " << BOOST_UBLAS_TEST_STRINGIFY_(j__) << " == " << BOOST_UBLAS_TEST_EXPANDP_(j__) << ", " << BOOST_UBLAS_TEST_STRINGIFY_(nr) << " == " << BOOST_UBLAS_TEST_EXPANDP_(nr) << " and " << BOOST_UBLAS_TEST_STRINGIFY_(nc) << " == " << BOOST_UBLAS_TEST_EXPANDP_(nc) << "]" ); \ - ++test_fails__; \ - } \ - } \ - } \ - /* [/BOOST_UBLAS_TEST_CHECK_MATRIX_EQ] */ - - -/// Check that elements of matrices \a x and \a y are close with respect to a given precision \a e. -#define BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE(x,y,nr,nc,e) /* [BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE] */ \ - for (::std::size_t i__ = 0; i__ < BOOST_UBLAS_TEST_EXPANDP_(nr); ++i__) \ - { \ - for (::std::size_t j__ = 0; j__ < BOOST_UBLAS_TEST_EXPANDP_(nc); ++j__) \ - { \ - if (!::boost::numeric::ublas::test::detail::close_to(BOOST_UBLAS_TEST_EXPANDP_(x)(i__,j__), BOOST_UBLAS_TEST_EXPANDP_(y)(i__,j__), BOOST_UBLAS_TEST_EXPANDP_(e))) \ - { \ - BOOST_UBLAS_TEST_ERROR( "Failed assertion: abs((" << BOOST_UBLAS_TEST_STRINGIFY_(x(i__,j__)) << "-" << BOOST_UBLAS_TEST_STRINGIFY_(y(i__,j__)) << ") <= " << BOOST_UBLAS_TEST_STRINGIFY_(e) << " [with " << BOOST_UBLAS_TEST_STRINGIFY_(x(i__,j__)) << " == " << BOOST_UBLAS_TEST_EXPANDP_(x)(i__,j__) << ", " << BOOST_UBLAS_TEST_STRINGIFY_(y(i__,j__)) << " == " << BOOST_UBLAS_TEST_EXPANDP_(y)(i__,j__) << ", " << BOOST_UBLAS_TEST_STRINGIFY_(i__) << " == " << i__ << ", " << BOOST_UBLAS_TEST_STRINGIFY_(j__) << " == " << BOOST_UBLAS_TEST_EXPANDP_(j__) << ", " << BOOST_UBLAS_TEST_STRINGIFY_(nr) << " == " << BOOST_UBLAS_TEST_EXPANDP_(nr) << " and " << BOOST_UBLAS_TEST_STRINGIFY_(nc) << " == " << BOOST_UBLAS_TEST_EXPANDP_(nc) << "]" ); \ - ++test_fails__; \ - } \ - } \ - } \ - /* [/BOOST_UBLAS_TEST_CHECK_MATRIX_CLOSE] */ - - -/// Check that elements of matrices \a x and \a y are close with respect to a given relative precision \a e. -#define BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE(x,y,nr,nc,e) /* [BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE] */ \ - for (::std::size_t i__ = 0; i__ < BOOST_UBLAS_TEST_EXPANDP_(nr); ++i__) \ - { \ - for (::std::size_t j__ = 0; j__ < BOOST_UBLAS_TEST_EXPANDP_(nc); ++j__) \ - { \ - if (!::boost::numeric::ublas::test::detail::rel_close_to(BOOST_UBLAS_TEST_EXPANDP_(x)(i__,j__), BOOST_UBLAS_TEST_EXPANDP_(y)(i__,j__), BOOST_UBLAS_TEST_EXPANDP_(e))) \ - { \ - BOOST_UBLAS_TEST_ERROR( "Failed assertion: abs((" << BOOST_UBLAS_TEST_STRINGIFY_(x(i__,j__)) << "-" << BOOST_UBLAS_TEST_STRINGIFY_(y(i__,j__)) << ") <= " << BOOST_UBLAS_TEST_STRINGIFY_(e) << " [with " << BOOST_UBLAS_TEST_STRINGIFY_(x(i__,j__)) << " == " << BOOST_UBLAS_TEST_EXPANDP_(x)(i__,j__) << ", " << BOOST_UBLAS_TEST_STRINGIFY_(y(i__,j__)) << " == " << BOOST_UBLAS_TEST_EXPANDP_(y)(i__,j__) << ", " << BOOST_UBLAS_TEST_STRINGIFY_(i__) << " == " << i__ << ", " << BOOST_UBLAS_TEST_STRINGIFY_(j__) << " == " << BOOST_UBLAS_TEST_EXPANDP_(j__) << ", " << BOOST_UBLAS_TEST_STRINGIFY_(nr) << " == " << BOOST_UBLAS_TEST_EXPANDP_(nr) << " and " << BOOST_UBLAS_TEST_STRINGIFY_(nc) << " == " << BOOST_UBLAS_TEST_EXPANDP_(nc) << "]" ); \ - ++test_fails__; \ - } \ - } \ - } \ - /* [/BOOST_UBLAS_TEST_CHECK_MATRIX_REL_CLOSE] */ - -///< Output the error message \a x. -#ifdef _MSC_VER -# define BOOST_UBLAS_TEST_ERROR(x) ::std::cerr << "[Error (" << __FILE__ << ":" << __FUNCTION__ << ":" << __LINE__ << ")>> " << BOOST_UBLAS_TEST_EXPAND_(x) << ::std::endl -#else -# define BOOST_UBLAS_TEST_ERROR(x) ::std::cerr << "[Error (" << __FILE__ << ":" << __func__ << ":" << __LINE__ << ")>> " << BOOST_UBLAS_TEST_EXPAND_(x) << ::std::endl -#endif - -#endif // BOOST_NUMERIC_UBLAS_TEST_UTILS_HPP diff --git a/libs/range/doc/Jamfile.v2 b/libs/range/doc/Jamfile.v2 deleted file mode 100644 index c50718089..000000000 --- a/libs/range/doc/Jamfile.v2 +++ /dev/null @@ -1,35 +0,0 @@ -#// Boost.Range library -#// -#// Copyright Thorsten Ottosen 2003-2008. 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) -#// -#// For more information, see http://www.boost.org/libs/range/ -#// - -project boost/libs/range/doc ; -using boostbook ; -using quickbook ; - -path-constant images_location : html ; - -boostbook quickbook - : - boost_range.qbk - : - boost.root=../../../.. - chunk.section.depth=4 - chunk.first.sections=1 - toc.section.depth=3 - toc.max.depth=3 - generate.section.toc.level=4 - pdf:boost.url.prefix=http://www.boost.org/doc/libs/release/doc/html - pdf:img.src.path=$(images_location)/ - ; - -############################################################################### -alias boostdoc ; -explicit boostdoc ; -alias boostrelease : quickbook ; -explicit boostrelease ; diff --git a/libs/range/doc/boost_range.qbk b/libs/range/doc/boost_range.qbk deleted file mode 100644 index d509fb99c..000000000 --- a/libs/range/doc/boost_range.qbk +++ /dev/null @@ -1,199 +0,0 @@ -[/============================================================================== - Copyright (C) 2003-2010 Thorsten Ottosen, Neil Groves - - 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 -==============================================================================/] -[library Range - [quickbook 1.5] - [version 2.0] - [authors [Ottosen, Thorsten], [Groves, Neil]] - [copyright 2003-2010 Thorsten Ottosen, Neil Groves] - [purpose Half-open range library] - [license - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at - [@http://www.boost.org/LICENSE_1_0.txt]) - ] -] - -[/ Converted to Quickbook format by Darren Garvey, 2007] - -[def __note__ [$images/note.png]] -[def __alert__ [$images/alert.png]] -[def __tip__ [$images/tip.png]] -[def __caution__ [$images/caution.png]] - -[def __boost_range_home__ [link range Boost.Range]] -[def __ranges__ [link range.concepts Ranges]] -[def __range_concepts__ [link range.concepts Range concepts]] -[def __forward_range__ [link range.concepts.forward_range Forward Range]] -[def __single_pass_range__ [link range.concepts.single_pass_range Single Pass Range]] -[def __bidirectional_range__ [link range.concepts.bidirectional_range Bidirectional Range]] -[def __random_access_range__ [link range.concepts.random_access_range Random Access Range]] - -[def __iterator_range__ [link range.reference.utilities.iterator_range `iterator_range`]] -[def __sub_range__ [link range.reference.utilities.sub_range `sub_range`]] -[def __minimal_interface__ [link range.reference.extending minimal interface]] -[def __range_result_iterator__ [link range.reference.concept_implementation.semantics.metafunctions `range_result_iterator`]] -[def __extending_for_udts__ [link range.reference.extending Extending the library for UDTs]] -[def __implementation_of_metafunctions__ [link range.reference.concept_implementation.semantics.metafunctions Implementation of metafunctions]] -[def __implementation_of_functions__ [link range.reference.concept_implementation.semantics.functions Implementation of functions]] - -[def __range_value__ [link range.reference.concept_implementation.semantics.metafunctions `range_value`]] -[def __range_iterator__ [link range.reference.concept_implementation.semantics.metafunctions `range_iterator`]] -[def __range_difference__ [link range.reference.concept_implementation.semantics.metafunctions `range_difference`]] -[def __range_pointer__ [link range.reference.concept_implementation.semantics.metafunctions `range_pointer`]] -[def __range_category__ [link range.reference.concept_implementation.semantics.metafunctions `range_category`]] -[def __range_reverse_iterator__ [link range.reference.concept_implementation.semantics.metafunctions `range_reverse_iterator`]] -[def __begin__ [link range.reference.concept_implementation.semantics.functions `begin`]] -[def __const_begin__ [link range.reference.concept_implementation.semantics.functions `const_begin`]] -[def __end__ [link range.reference.concept_implementation.semantics.functions `end`]] -[def __const_end__ [link range.reference.concept_implementation.semantics.functions `const_end`]] -[def __empty__ [link range.reference.concept_implementation.semantics.functions `empty`]] -[def __distance__ [link range.reference.concept_implementation.semantics.functions `distance`]] -[def __size__ [link range.reference.concept_implementation.semantics.functions `size`]] -[def __rbegin__ [link range.reference.concept_implementation.semantics.functions `rbegin`]] -[def __const_rbegin__ [link range.reference.concept_implementation.semantics.functions `const_rbegin`]] -[def __rend__ [link range.reference.concept_implementation.semantics.functions `rend`]] -[def __const_rend__ [link range.reference.concept_implementation.semantics.functions `const_rend`]] -[def __as_array__ [link range.reference.concept_implementation.semantics.functions `as_array`]] -[def __as_literal__ [link range.reference.concept_implementation.semantics.functions `as_literal`]] -[def __counting_range__ [link range.reference.ranges.counting_range `counting_range`]] -[def __irange__ [link range.reference.ranges.irange `irange`]] -[def __istream_range__ [link range.reference.ranges.istream_range `istream_range`]] -[def __combine__ [link range.reference.utilities.combine `combine`]] -[def __join__ [link range.reference.utilities.join `join`]] - -[def __range_adaptors__ [link range.reference.adaptors Range adaptors]] -[def __range_adaptors_adjacent_filtered__ [link range.reference.adaptors.reference.adjacent_filtered adjacent_filtered]] -[def __range_adaptors_copied__ [link range.reference.adaptors.reference.copied copied]] -[def __range_adaptors_filtered__ [link range.reference.adaptors.reference.filtered filtered]] -[def __range_adaptors_formatted__ [link.range.reference.adaptors.reference.formatted formatted]] -[def __range_adaptors_indexed__ [link range.reference.adaptors.reference.indexed indexed]] -[def __range_adaptors_indirected__ [link range.reference.adaptors.reference.indirected indirected]] -[def __range_adaptors_map_keys__ [link range.reference.adaptors.reference.map_keys map_keys]] -[def __range_adaptors_map_values__ [link range.reference.adaptors.reference.map_values map_values]] -[def __range_adaptors_replaced__ [link range.reference.adaptors.reference.replaced replaced]] -[def __range_adaptors_replaced_if__ [link range.reference.adaptors.reference.replaced_if replaced_if]] -[def __range_adaptors_reversed__ [link range.reference.adaptors.reference.reversed reversed]] -[def __range_adaptors_sliced__ [link range.reference.adaptors.reference.sliced sliced]] -[def __range_adaptors_strided__ [link range.reference.adaptors.reference.strided strided]] -[def __range_adaptors_type_erased__ [link range.reference.adaptors.reference.type_erased type_erased]] -[def __range_adaptors_tokenized__ [link range.reference.adaptors.reference.tokenized tokenized]] -[def __range_adaptors_transformed__ [link range.reference.adaptors.reference.transformed transformed]] -[def __range_adaptors_uniqued__ [link range.reference.adaptors.reference.uniqued uniqued]] - - -[def __range_algorithms__ [link range.reference.algorithms Range algorithms]] -[def __range_algorithms_adjacent_find__ [link range.reference.algorithms.non_mutating.adjacent_find adjacent_find]] -[def __range_algorithms_binary_search__ [link range.reference.algorithms.non_mutating.binary_search binary_search]] -[def __range_algorithms_count__ [link range.reference.algorithms.non_mutating.count count]] -[def __range_algorithms_count_if__ [link range.reference.algorithms.non_mutating.count_if count_if]] -[def __range_algorithms_equal__ [link range.reference.algorithms.non_mutating.equal equal]] -[def __range_algorithms_equal_range__ [link range.reference.algorithms.non_mutating.equal_range equal_range]] -[def __range_algorithms_for_each__ [link range.reference.algorithms.non_mutating.for_each for_each]] -[def __range_algorithms_find__ [link range.reference.algorithms.non_mutating.find find]] -[def __range_algorithms_find_end__ [link range.reference.algorithms.non_mutating.find_end find_end]] -[def __range_algorithms_find_first_of__ [link range.reference.algorithms.non_mutating.find_first_of find_first_of]] -[def __range_algorithms_find_if__ [link range.reference.algorithms.non_mutating.find_if find_if]] -[def __range_algorithms_lexicographical_compare__ [link range.reference.algorithms.non_mutating.lexicographical_compare lexicographical_compare]] -[def __range_algorithms_lower_bound__ [link range.reference.algorithms.non_mutating.lower_bound lower_bound]] -[def __range_algorithms_max_element__ [link range.reference.algorithms.non_mutating.max_element max_element]] -[def __range_algorithms_min_element__ [link range.reference.algorithms.non_mutating.min_element min_element]] -[def __range_algorithms_mismatch__ [link range.reference.algorithms.non_mutating.mismatch mismatch]] -[def __range_algorithms_search__ [link range.reference.algorithms.non_mutating.search search]] -[def __range_algorithms_search_n__ [link range.reference.algorithms.non_mutating.search_n search_n]] -[def __range_algorithms_upper_bound__ [link range.reference.algorithms.non_mutating.upper_bound upper_bound]] - -[def __range_algorithms_copy__ [link range.reference.algorithms.mutating.copy copy]] -[def __range_algorithms_copy_backward__ [link range.reference.algorithms.mutating.copy_backward copy_backward]] -[def __range_algorithms_fill__ [link range.reference.algorithms.mutating.fill fill]] -[def __range_algorithms_fill_n__ [link range.reference.algorithms.mutating.fill_n fill_n]] -[def __range_algorithms_generate__ [link range.reference.algorithms.mutating.generate generate]] -[def __range_algorithms_inplace_merge__ [link range.reference.algorithms.mutating.inplace_merge inplace_merge]] -[def __range_algorithms_merge__ [link range.reference.algorithms.mutating.merge merge]] -[def __range_algorithms_nth_element__ [link range.reference.algorithms.mutating.nth_element nth_element]] -[def __range_algorithms_partial_sort__ [link range.reference.algorithms.mutating.partial_sort partial_sort]] -[def __range_algorithms_partition__ [link range.reference.algorithms.mutating.partition partition]] -[def __range_algorithms_random_shuffle__ [link range.reference.algorithms.mutating.random_shuffle random_shuffle]] -[def __range_algorithms_remove__ [link range.reference.algorithms.mutating.remove remove]] -[def __range_algorithms_remove_copy__ [link range.reference.algorithms.mutating.remove_copy remove_copy]] -[def __range_algorithms_remove_copy_if__ [link range.reference.algorithms.mutating.remove_copy_if remove_copy_if]] -[def __range_algorithms_remove_if__ [link range.reference.algorithms.mutating.remove_if remove_if]] -[def __range_algorithms_replace__ [link range.reference.algorithms.mutating.replace replace]] -[def __range_algorithms_replace_copy__ [link range.reference.algorithms.mutating.replace_copy replace_copy]] -[def __range_algorithms_replace_copy_if__ [link range.reference.algorithms.mutating.replace_copy_if replace_copy_if]] -[def __range_algorithms_replace_if__ [link range.reference.algorithms.mutating.replace_if replace_if]] -[def __range_algorithms_reverse__ [link range.reference.algorithms.mutating.reverse reverse]] -[def __range_algorithms_reverse_copy__ [link range.reference.algorithms.mutating.reverse_copy reverse_copy]] -[def __range_algorithms_rotate__ [link range.reference.algorithms.mutating.rotate rotate]] -[def __range_algorithms_rotate_copy__ [link range.reference.algorithms.mutating.rotate_copy rotate_copy]] -[def __range_algorithms_sort__ [link range.reference.algorithms.mutating.sort sort]] -[def __range_algorithms_stable_partition__ [link range.reference.algorithms.mutating.stable_partition stable_partition]] -[def __range_algorithms_stable_sort__ [link range.reference.algorithms.mutating.stable_sort stable_sort]] -[def __range_algorithms_swap_ranges__ [link range.reference.algorithms.mutating.swap_ranges swap_ranges]] -[def __range_algorithms_transform__ [link range.reference.algorithms.mutating.transform transform]] -[def __range_algorithms_unique__ [link range.reference.algorithms.mutating.unique unique]] -[def __range_algorithms_unique_copy__ [link range.reference.algorithms.mutating.unique_copy unique_copy]] - -[def __range_algorithms_includes__ [link range.reference.algorithms.set.includes includes]] -[def __range_algorithms_set_union__ [link range.reference.algorithms.set.set_union set_union]] -[def __range_algorithms_set_intersection__ [link range.reference.algorithms.set.set_intersection set_intersection]] -[def __range_algorithms_set_difference__ [link range.reference.algorithms.set.set_difference set_difference]] -[def __range_algorithms_set_symmetric_difference__ [link range.reference.algorithms.set.set_symmetric_difference set_symmetric_difference]] - -[def __range_algorithms_push_heap__ [link range.reference.algorithms.heap.push_heap push_heap]] -[def __range_algorithms_pop_heap__ [link range.reference.algorithms.heap.pop_heap pop_heap]] -[def __range_algorithms_make_heap__ [link range.reference.algorithms.heap.make_heap make_heap]] -[def __range_algorithms_sort_heap__ [link range.reference.algorithms.heap.sort_heap sort_heap]] - -[def __range_algorithms_next_permutation__ [link range.reference.algorithms.permutation.next_permutation next_permutation]] -[def __range_algorithms_prev_permutation__ [link range.reference.algorithms.permutation.prev_permutation prev_permutation]] - -[def __range_algorithm_ext_copy_n__ [link range.reference.algorithms.new.copy_n copy_n]] -[def __range_algorithm_ext_erase__ [link range.reference.algorithms.new.erase erase]] -[def __range_algorithm_ext_for_each__ [link range.reference.algorithms.new.for_each for_each]] -[def __range_algorithm_ext_insert__ [link range.reference.algorithms.new.insert insert]] -[def __range_algorithm_ext_iota__ [link range.reference.algorithms.new.iota iota]] -[def __range_algorithm_ext_is_sorted__ [link range.reference.algorithms.new.is_sorted is_sorted]] -[def __range_algorithm_ext_overwrite__ [link range.reference.algorithms.new.overwrite overwrite]] -[def __range_algorithm_ext_push_back__ [link range.reference.algorithms.new.push_back push_back]] -[def __range_algorithm_ext_push_front__ [link range.reference.algorithms.new.push_front push_front]] - -[def __single_pass_iterator__ [@boost:/libs/iterator/doc/new-iter-concepts.html#singls-pass-iterators-lib-single-pass-iterators Single Pass Iterator]] -[def __forward_traversal_iterator__ [@boost:/libs/iterator/doc/new-iter-concepts.html#forward-traversal-iterators-lib-forward-traversal-iterators Forward Traversal Iterator]] -[def __bidirectional_traversal_iterator__ [@boost:/libs/iterator/doc/new-iter-concepts.html#bidirectional-traversal-iterators-lib-bidirectional-traversal-iterators Bidirectional Traversal Iterator]] -[def __random_access_traversal_iterator__ [@boost:/libs/iterator/doc/new-iter-concepts.html#random-access-traversal-iterators-lib-random-access-traversal-iterators Random Access Traversal Iterator]] -[def __new_style_iterators__ [@boost:/libs/iterator/doc/new-iter-concepts.html new style iterators]] -[def __iterator_concepts__ [@boost:/libs/iterator/doc/iterator_concepts.html Iterator concepts]] - -[def __container__ [@http://www.sgi.com/Technology/STL/Container.html Container]] -[def __metafunctions__ [@boost:/libs/mpl/doc/refmanual/metafunction.html metafunctions]] -[def __concept_check__ [@boost:/libs/concept_check/index.html Boost Concept Check library]] -[def __boost_array__ [@boost:/libs/array/index.html boost::array]] -[def __the_forwarding_problem__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1385.htm The Forwarding Problem]] - -[def __sgi_inner_product__ [@http://www.sgi.com/tech/stl/inner_product.html inner_product]] -[def __sgi_partial_sum__ [@http://www.sgi.com/tech/stl/partial_sum.html partial_sum]] -[def __type_erasure_article__ [@http://www.artima.com/cppsource/type_erasure.html type erasure article]] - -Boost.Range is a collection of concepts and utilities, range-based algorithms, -as well as range adaptors that allow for efficient and expressive code. - -Using Boost.Range inplace of the standard library alternatives results in more -readable code and in many cases greater efficiency. - -[include introduction.qbk] -[include concepts.qbk] -[include reference.qbk] -[include style.qbk] -[include headers.qbk] -[include examples.qbk] -[include mfc_atl.qbk] -[include upgrade.qbk] -[include portability.qbk] -[include faq.qbk] -[include history_ack.qbk] - diff --git a/libs/range/doc/concepts.qbk b/libs/range/doc/concepts.qbk deleted file mode 100644 index f379e18fb..000000000 --- a/libs/range/doc/concepts.qbk +++ /dev/null @@ -1,255 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:concepts Range Concepts] - -[section Overview] - -A Range is a [*/concept/] similar to the STL [@http://www.sgi.com/Technology/STL/Container.html Container] concept. A Range provides iterators for accessing a half-open range `[first,one_past_last)` of elements and provides information about the number of elements in the Range. However, a Range has fewer requirements than a Container. - -The motivation for the Range concept is that there are many useful Container-like types that do not meet the full requirements of Container, and many algorithms that can be written with this reduced set of requirements. In particular, a Range does not necessarily - -* own the elements that can be accessed through it, -* have copy semantics, - -Because of the second requirement, a Range object must be passed by (const or non-const) reference in generic code. - -The operations that can be performed on a Range is dependent on the [@boost:/libs/iterator/doc/new-iter-concepts.html#iterator-traversal-concepts-lib-iterator-traversal traversal category] of the underlying iterator type. Therefore the range concepts are named to reflect which traversal category its iterators support. See also terminology and style guidelines. for more information about naming of ranges. - -The concepts described below specifies associated types as [@boost:/libs/mpl/doc/refmanual/metafunction.html metafunctions] and all functions as free-standing functions to allow for a layer of indirection. - -[endsect] - - -[section Single Pass Range] - -[heading Notation] - -[table - [] - [[`X`] [A type that is a model of __single_pass_range__.]] - [[`a`] [Object of type X.]] -] - -[heading Description] - -A range `X` where `boost::range_iterator::type` is a model of __single_pass_iterator__. - -[heading Associated types] - -[table - [] - [[Iterator type ] [`boost::range_iterator::type` ] [The type of iterator used to iterate through a Range's elements. The iterator's value type is expected to be the Range's value type. A conversion from the iterator type to the `const` iterator type must exist.]] - [[Const iterator type] [`boost::range_iterator::type`] [A type of iterator that may be used to examine, but not to modify, a Range's elements.]] -] - -[heading Valid expressions] - -The following expressions must be valid. - -[table - [[Name ] [Expression ] [Return type ]] - [[Beginning of range] [`boost::begin(a)`] [`boost::range_iterator::type` if `a` is mutable, `boost::range_iterator::type` otherwise]] - [[End of range ] [`boost::end(a)` ] [`boost::range_iterator::type` if `a` is mutable, `boost::range_iterator::type` otherwise]] -] - -[heading Expression semantics] - -[table - [[Expression ] [Semantics ] [Postcondition]] - [[`boost::begin(a)`] [Returns an iterator pointing to the first element in the Range. ] [`boost::begin(a)` is either dereferenceable or past-the-end. It is past-the-end if and only if `boost::distance(a) == 0`.]] - [[`boost::end(a)` ] [Returns an iterator pointing one past the last element in the Range. ] [`boost::end(a)` is past-the-end.]] -] - -[heading Complexity guarantees] - -`boost::end(a)` is at most amortized linear time, `boost::begin(a)` is amortized constant time. For most practical purposes, one can expect both to be amortized constant time. - -[heading Invariants] - -[table - [] - [[Valid range ] [For any Range `a`, `[boost::begin(a),boost::end(a))` is a valid range, that is, `boost::end(a)` is reachable from `boost::begin(a)` in a finite number of increments.]] - - [[Completeness] [An algorithm that iterates through the range `[boost::begin(a),boost::end(a))` will pass through every element of `a`.]] -] - -[heading See also] - -__extending_for_udts__ - -__implementation_of_metafunctions__ - -__implementation_of_functions__ - -__container__ - -[endsect] - - -[section Forward Range] - -[heading Notation] - -[table - [] - [[`X`] [A type that is a model of __forward_range__.]] - [[`a`] [Object of type X.]] -] - -[heading Description] - -A range `X` where `boost::range_iterator::type` is a model of __forward_traversal_iterator__. - -[heading Refinement of] - -__single_pass_range__ - -[heading Associated types] - -[table - [] - [[Distance type] [`boost::range_difference::type`] [A signed integral type used to represent the distance between two of the Range's iterators. This type must be the same as the iterator's distance type.]] - [[Size type ] [`boost::range_size::type` ] [An unsigned integral type that can represent any nonnegative value of the Range's distance type.]] -] - -[heading See also] - -__implementation_of_metafunctions__ - -__implementation_of_functions__ - -[endsect] - - -[section Bidirectional Range] - -[heading Notation] - -[table - [] - [[`X`] [A type that is a model of __bidirectional_range__.]] - [[`a`] [Object of type X.]] -] - -[heading Description] - -This concept provides access to iterators that traverse in both directions (forward and reverse). The `boost::range_iterator::type` iterator must meet all of the requirements of __bidirectional_traversal_iterator__. - -[heading Refinement of] - -__forward_range__ - -[heading Associated types] - -[table - [] - [[Reverse Iterator type ] [`boost::range_reverse_iterator::type` ] [The type of iterator used to iterate through a Range's elements in reverse order. The iterator's value type is expected to be the Range's value type. A conversion from the reverse iterator type to the const reverse iterator type must exist.]] - - [[Const reverse iterator type] [`boost::range_reverse_iterator::type`] [A type of reverse iterator that may be used to examine, but not to modify, a Range's elements.]] -] - -[heading Valid expressions] - -[table - [[Name ] [Expression ] [Return type] [Semantics]] - [[Beginning of range] [`boost::rbegin(a)`] [`boost::range_reverse_iterator::type` if `a` is mutable `boost::range_reverse_iterator::type` otherwise.] [Equivalent to `boost::range_reverse_iterator::type(boost::end(a))`.]] - - [[End of range ] [`boost::rend(a)` ] [`boost::range_reverse_iterator::type` if `a` is mutable, `boost::range_reverse_iterator::type` otherwise.] [Equivalent to `boost::range_reverse_iterator::type(boost::begin(a))`.]] -] - -[heading Complexity guarantees] - -`boost::rbegin(a)` has the same complexity as `boost::end(a)` and `boost::rend(a)` has the same complexity as `boost::begin(a)` from __forward_range__. - -[heading Invariants] - -[table - [] - [[Valid reverse range] [For any Bidirectional Range a, `[boost::rbegin(a),boost::rend(a))` is a valid range, that is, `boost::rend(a)` is reachable from `boost::rbegin(a)` in a finite number of increments.]] - - [[Completeness ] [An algorithm that iterates through the range `[boost::rbegin(a),boost::rend(a))` will pass through every element of `a`.]] -] - -[heading See also] - -__implementation_of_metafunctions__ - -__implementation_of_functions__ - -[endsect] - - -[section Random Access Range] - -[heading Description] - -A range `X` where `boost::range_iterator::type` is a model of __random_access_traversal_iterator__. - -[heading Refinement of] - -__bidirectional_range__ - -[heading Valid expressions] - -[table - [[Name ] [Expression ] [Return type ]] - [[Size of range] [`boost::size(a)`] [`boost::range_size::type`]] -] - -[heading Expression semantics] - -[table - [[Expression ] [Semantics] [Postcondition]] - [[`boost::size(a)`] [Returns the size of the Range, that is, its number of elements. Note `boost::size(a) == 0u` is equivalent to `boost::empty(a)`.] [`boost::size(a) >= 0`]] -] - -[heading Complexity guarantees] - -`boost::size(a)` completes in amortized constant time. - -[heading Invariants] - -[table - [] - [[Range size] [`boost::size(a)` is equal to the `boost::end(a)` - `boost::begin(a)`.]] -] - -[endsect] - - -[section Concept Checking] - -Each of the range concepts has a corresponding concept checking class in the file [@boost:/boost/range/concepts.hpp ``]. These classes may be used in conjunction with the __concept_check__ to ensure that the type of a template parameter is compatible with a range concept. If not, a meaningful compile time error is generated. Checks are provided for the range concepts related to iterator traversal categories. For example, the following line checks that the type `T` models the __forward_range__ concept. - -`` -BOOST_CONCEPT_ASSERT(( ForwardRangeConcept )); -`` - -An additional concept check is required for the value access property of the range based on the range's iterator type. For example to check for a ForwardReadableRange, the following code is required. - -`` -BOOST_CONCEPT_ASSERT(( ForwardRangeConcept )); -BOOST_CONCEPT_ASSERT(( ReadableIteratorConcept::type> )); -`` - -The following range concept checking classes are provided. - -* Class SinglePassRangeConcept checks for __single_pass_range__ -* Class ForwardRangeConcept checks for __forward_range__ -* Class BidirectionalRangeConcept checks for __bidirectional_range__ -* Class RandomAccessRangeConcept checks for __random_access_range__ - -[heading See also] - -[link range.style_guide Range Terminology and style guidelines] - -__iterator_concepts__ - -__concept_check__ - -[endsect] -[endsect] - diff --git a/libs/range/doc/example.cpp b/libs/range/doc/example.cpp deleted file mode 100644 index d3dec7cb0..000000000 --- a/libs/range/doc/example.cpp +++ /dev/null @@ -1,151 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2008. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include // for std::iterator_traits, std::distance() - -namespace Foo -{ - // - // Our sample UDT. A 'Pair' - // will work as a range when the stored - // elements are iterators. - // - template< class T > - struct Pair - { - T first, last; - }; - -} // namespace 'Foo' - -namespace boost -{ - // - // Specialize metafunctions. We must include the range.hpp header. - // We must open the 'boost' namespace. - // - /* - template< class T > - struct range_value< Foo::Pair > - { - typedef typename std::iterator_traits::value_type type; - }; - */ - - template< class T > - struct range_iterator< Foo::Pair > - { - typedef T type; - }; - - template< class T > - struct range_const_iterator< Foo::Pair > - { - // - // Remark: this is defined similar to 'range_iterator' - // because the 'Pair' type does not distinguish - // between an iterator and a const_iterator. - // - typedef T type; - }; - - /* - template< class T > - struct range_difference< Foo::Pair > - { - typedef typename std::iterator_traits::difference_type type; - }; - */ - - template< class T > - struct range_size< Foo::Pair > - { - int static_assertion[ sizeof( std::size_t ) >= - sizeof( typename range_difference< Foo::Pair >::type ) ]; - typedef std::size_t type; - }; - -} // namespace 'boost' - -namespace Foo -{ - // - // The required functions. These should be defined in - // the same namespace as 'Pair', in this case - // in namespace 'Foo'. - // - - template< class T > - inline T boost_range_begin( Pair& x ) - { - return x.first; - } - - template< class T > - inline T boost_range_begin( const Pair& x ) - { - return x.first; - } - - template< class T > - inline T boost_range_end( Pair& x ) - { - return x.last; - } - - template< class T > - inline T boost_range_end( const Pair& x ) - { - return x.last; - } - - template< class T > - inline typename boost::range_size< Pair >::type - boost_range_size( const Pair& x ) - { - return std::distance(x.first,x.last); - } - -} // namespace 'Foo' - -#include - -int main() -{ - typedef std::vector::iterator iter; - std::vector vec; - vec.push_back( 42 ); - Foo::Pair pair = { vec.begin(), vec.end() }; - const Foo::Pair& cpair = pair; - // - // Notice that we call 'begin' etc with qualification. - // - iter i = boost::begin( pair ); - iter e = boost::end( pair ); - i = boost::begin( cpair ); - e = boost::end( cpair ); - boost::range_size< Foo::Pair >::type s = boost::size( pair ); - s = boost::size( cpair ); - boost::range_const_reverse_iterator< Foo::Pair >::type - ri = boost::rbegin( cpair ), - re = boost::rend( cpair ); - - // - // Test metafunctions - // - - boost::range_value< Foo::Pair >::type - v = *boost::begin(pair); - - boost::range_difference< Foo::Pair >::type - d = boost::end(pair) - boost::begin(pair); -} - diff --git a/libs/range/doc/examples.qbk b/libs/range/doc/examples.qbk deleted file mode 100644 index 1dfb92421..000000000 --- a/libs/range/doc/examples.qbk +++ /dev/null @@ -1,28 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:examples Examples] - -Some examples are given in the accompanying test files: - -* [@http://www.boost.org/libs/range/test/string.cpp string.cpp] shows how to implement a container version of `std::find()` that works with `char[]`,`wchar_t[]`,`char*`,`wchar_t*`. - -* [@http://www.boost.org/libs/range/test/algorithm_example.cpp algorithm_example.cpp] shows the replace example from the introduction. - -* [@http://www.boost.org/libs/range/test/iterator_range.cpp iterator_range.cpp] - -* [@http://www.boost.org/libs/range/test/sub_range.cpp sub_range.cpp] - -* [@http://www.boost.org/libs/range/test/iterator_pair.cpp iterator_pair.cpp] - -* [@http://www.boost.org/libs/range/test/reversible_range.cpp reversible_range.cpp] - -* [@http://www.boost.org/libs/range/test/std_container.cpp std_container.cpp] - -* [@http://www.boost.org/libs/range/test/array.cpp array.cpp] - -[endsect] - - diff --git a/libs/range/doc/faq.qbk b/libs/range/doc/faq.qbk deleted file mode 100644 index ada636159..000000000 --- a/libs/range/doc/faq.qbk +++ /dev/null @@ -1,30 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:faq FAQ] - -1. ['[*Why is there no difference between `range_iterator::type` and `range_const_iterator::type` for `std::pair`?]] - -[:In general it is not possible nor desirable to find a corresponding `const_iterator`. When it is possible to come up with one, the client might choose to construct a `std::pair` object.] - -[:Note that an __iterator_range__ is somewhat more convenient than a `pair` and that a __sub_range__ does propagate const-ness.] - -2. ['[*Why is there not supplied more types or more functions?]] - -[:The library has been kept small because its current interface will serve most purposes. If and when a genuine need arises for more functionality, it can be implemented.] - -3. ['[*How should I implement generic algorithms for ranges?]] - -[:One should always start with a generic algorithm that takes two iterators (or more) as input. Then use Boost.Range to build handier versions on top of the iterator based algorithm. Please notice that once the range version of the algorithm is done, it makes sense not to expose the iterator version in the public interface.] - -4. ['[*Why is there no Incrementable Range concept?]] - -[:Even though we speak of incrementable iterators, it would not make much sense for ranges; for example, we cannot determine the size and emptiness of a range since we cannot even compare its iterators.] - -[:Note also that incrementable iterators are derived from output iterators and so there exist no output range.] - -[endsect] - - diff --git a/libs/range/doc/headers.qbk b/libs/range/doc/headers.qbk deleted file mode 100644 index 310701854..000000000 --- a/libs/range/doc/headers.qbk +++ /dev/null @@ -1,143 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:headers Library Headers] - -[section:general General] -[table - [[Header ] [Includes ] [Related Concept ]] - [[`` ] [everything from Boost.Range version 1 (Boost versions 1.42 and below). Includes the core range functions and metafunctions, but excludes Range Adaptors and Range Algorithms. ] [- ]] - [[`` ] [every metafunction ] [- ]] - [[`` ] [every function ] [- ]] - [[`` ] [__range_value__ ] [__single_pass_range__ ]] - [[`` ] [__range_iterator__ ] [__single_pass_range__ ]] - [[`` ] [__range_difference__ ] [__forward_range__ ]] - [[`` ] [__range_pointer__ ] [-]] - [[`` ] [__range_category__ ] [-]] - [[``] [__range_reverse_iterator__ ] [__bidirectional_range__ ]] - [[`` ] [__begin__ and __const_begin__ ] [__single_pass_range__ ]] - [[`` ] [__end__ and __const_end__ ] [__single_pass_range__ ]] - [[`` ] [__empty__ ] [__single_pass_range__ ]] - [[`` ] [__distance__ ] [__forward_range__ ]] - [[`` ] [__size__ ] [__random_access_range__ ]] - [[`` ] [__rbegin__ and __const_rbegin__] [__bidirectional_range__ ]] - [[`` ] [__rend__ and __const_rend__ ] [__bidirectional_range__ ]] - [[`` ] [__as_array__ ] [- ]] - [[`` ] [__as_literal__ ] [- ]] - [[`` ] [__iterator_range__ ] [- ]] - [[`` ] [__sub_range__ ] [- ]] - [[`` ] [__range_concepts__ ] [- ]] - [[`` ] [every range adaptor ] [- ]] - [[`` ] [every range equivalent of an STL algorithm ] [- ]] - [[`` ] [every range algorithm that is an extension of the STL algorithms ] [- ]] - [[`` ] [ __counting_range__ ] [-]] - [[`` ] [ __istream_range__ ] [-]] - [[`` ] [ __irange__ ] [-]] - [[`` ] [ __join__ ] [-]] -] -[endsect] - -[section:adaptors Adaptors] -[table - [[Header ][Includes ]] - [[``] [__range_adaptors_adjacent_filtered__ ]] - [[``] [__range_adaptors_copied__]] - [[``] [__range_adaptors_filtered__]] - [[``] [__range_adaptors_indexed__]] - [[``] [__range_adaptors_map_keys__ __range_adaptors_map_values__]] - [[``] [__range_adaptors_replaced__]] - [[``] [__range_adaptors_replaced_if__]] - [[``] [__range_adaptors_reversed__]] - [[``] [__range_adaptors_sliced__]] - [[``] [__range_adaptors_strided__]] - [[``] [__range_adaptors_tokenized__]] - [[``] [__range_adaptors_transformed__]] - [[``] [__range_adaptors_uniqued__]] -] -[endsect] - -[section:algorithm Algorithm] -[table - [[Header ][Includes ]] - [[``] [__range_algorithms_adjacent_find__]] - [[``] [__range_algorithms_binary_search__]] - [[``] [__range_algorithms_copy__]] - [[``] [__range_algorithms_copy_backward__]] - [[``] [__range_algorithms_count__]] - [[``] [__range_algorithms_count_if__]] - [[``] [__range_algorithms_equal__]] - [[``] [__range_algorithms_equal_range__]] - [[``] [__range_algorithms_fill__]] - [[``] [__range_algorithms_fill_n__]] - [[``] [__range_algorithms_find__]] - [[``] [__range_algorithms_find_end__]] - [[``] [__range_algorithms_find_first_of__]] - [[``] [__range_algorithms_find_if__]] - [[``] [__range_algorithms_for_each__]] - [[``] [__range_algorithms_generate__]] - [[``] [__range_algorithms_push_heap__ - __range_algorithms_pop_heap__ - __range_algorithms_make_heap__ - __range_algorithms_sort_heap__]] - [[``] [__range_algorithms_inplace_merge__]] - [[``] [__range_algorithms_lexicographical_compare__]] - [[``] [__range_algorithms_lower_bound__]] - [[``] [__range_algorithms_max_element__]] - [[``] [__range_algorithms_merge__]] - [[``] [__range_algorithms_min_element__]] - [[``] [__range_algorithms_mismatch__]] - [[``] [__range_algorithms_nth_element__]] - [[``] [__range_algorithms_partial_sort__]] - [[``] [__range_algorithms_partition__]] - [[``] [__range_algorithms_next_permutation__ - __range_algorithms_prev_permutation__]] - [[``] [__range_algorithms_random_shuffle__]] - [[``] [__range_algorithms_remove__]] - [[``] [__range_algorithms_remove_copy__]] - [[``] [__range_algorithms_remove_copy_if__]] - [[``] [__range_algorithms_remove_if__]] - [[``] [__range_algorithms_replace__]] - [[``] [__range_algorithms_replace_copy__]] - [[``] [__range_algorithms_replace_copy_if__]] - [[``] [__range_algorithms_replace_if__]] - [[``] [__range_algorithms_reverse__]] - [[``] [__range_algorithms_reverse_copy__]] - [[``] [__range_algorithms_rotate__]] - [[``] [__range_algorithms_rotate_copy__]] - [[``] [__range_algorithms_search__]] - [[``] [__range_algorithms_search_n__]] - [[``] [__range_algorithms_includes__ - __range_algorithms_set_union__ - __range_algorithms_set_intersection__ - __range_algorithms_set_difference__ - __range_algorithms_set_symmetric_difference__]] - [[``] [__range_algorithms_sort__]] - [[``] [__range_algorithms_stable_partition__]] - [[``] [__range_algorithms_swap_ranges__]] - [[``] [__range_algorithms_transform__]] - [[``] [__range_algorithms_unique__]] - [[``] [__range_algorithms_unique_copy__]] - [[``] [__range_algorithms_upper_bound__]] -] -[endsect] - -[section:algorithm_ext Algorithm Extensions] -[table - [[Header ][Includes ]] - [[``] [__range_algorithm_ext_copy_n__]] - [[``] [__range_algorithm_ext_erase__]] - [[``] [__range_algorithm_ext_for_each__]] - [[``] [__range_algorithm_ext_insert__]] - [[``] [__range_algorithm_ext_iota__]] - [[``] [__range_algorithm_ext_is_sorted__]] - [[``] [__range_algorithm_ext_overwrite__]] - [[``] [__range_algorithm_ext_push_back__]] - [[``] [__range_algorithm_ext_push_front__]] -] -[endsect] - -[endsect] - diff --git a/libs/range/doc/history_ack.qbk b/libs/range/doc/history_ack.qbk deleted file mode 100644 index 27f9e2a72..000000000 --- a/libs/range/doc/history_ack.qbk +++ /dev/null @@ -1,58 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:history_ack History and Acknowledgement] - -[heading Version 1 - before Boost 1.43] -The library have been under way for a long time. Dietmar Kühl originally intended to submit an `array_traits` class template which had most of the functionality present now, but only for arrays and standard containers. - -Meanwhile work on algorithms for containers in various contexts showed the need for handling pairs of iterators, and string libraries needed special treatment of character arrays. In the end it made sense to formalize the minimal requirements of these similar concepts. And the results are the Range concepts found in this library. - -The term Range was adopted because of paragraph 24.1/7 from the C++ standard: - -Most of the library's algorithmic templates that operate on data structures have interfaces that use ranges. A range is a pair of iterators that designate the beginning and end of the computation. A range [i, i) is an empty range; in general, a range [i, j) refers to the elements in the data structure starting with the one pointed to by i and up to but not including the one pointed to by j. Range [i, j) is valid if and only if j is reachable from i. The result of the application of functions in the library to invalid ranges is undefined. - -Special thanks goes to - -* Pavol Droba for help with documentation and implementation -* Pavel Vozenilek for help with porting the library -* Jonathan Turkanis and John Torjo for help with documentation -* Hartmut Kaiser for being review manager -* Jonathan Turkanis for porting the lib (as far as possible) to vc6 and vc7. - -The concept checks and their documentation was provided by Daniel Walker. - -[heading Version 2 - Boost 1.43 and beyond] -This version introduced Range Adaptors and Range Algorithms. This version 2 is -the result of a merge of all of the RangeEx features into Boost.Range. - -There were an enormous number of very significant contributors through all -stages of this library. - -Prior to Boost.RangeEx there had been a number of Range library implementations, -these include library implementations by Eric Niebler, Adobe, -Shunsuke Sogame etc. Eric Niebler contributed the Range Adaptor idea which is -arguably the single biggest innovation in this library. Inevitably a great deal -of commonality evolved in each of these libraries, but a considerable amount -of effort was expended to learn from all of the divergent techniques. - -The people in the following list all made contributions in the form of reviews, -user feedback, design suggestions, or defect detection: - -* Thorsten Ottosen: review management, design advice, documentation feedback -* Eric Niebler: early implementation, and review feedback -* Joel de Guzman: review -* Mathias Gaunard: review -* David Abrahams: implementation advice -* Robert Jones: defect reports, usage feedback -* Sean Parent: contributed experience from the Adobe range library -* Arno Schoedl: implementations, and review -* Rogier van Dalen: review -* Vincente Botet: review, documentation feedback - -Regardless of how I write this section it will never truly fairly capture the -gratitude that I feel to all who have contributed. Thank you everyone. - -[endsect] diff --git a/libs/range/doc/html/index.html b/libs/range/doc/html/index.html deleted file mode 100644 index 86ff57c73..000000000 --- a/libs/range/doc/html/index.html +++ /dev/null @@ -1,159 +0,0 @@ - - - -Chapter 1. Range 2.0 - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        Next
        -
        -
        -

        -Chapter 1. Range 2.0

        -

        -Thorsten Ottosen -

        -

        -Neil Groves -

        -
        -
        -

        - Distributed under the Boost Software License, Version 1.0. (See accompanying - file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -

        -
        -
        - -

        - Boost.Range is a collection of concepts and utilities, range-based algorithms, - as well as range adaptors that allow for efficient and expressive code. -

        -

        - Using Boost.Range inplace of the standard library alternatives results in more - readable code and in many cases greater efficiency. -

        -
        - - - -

        Last revised: December 22, 2016 at 12:50:23 GMT

        -
        -
        Next
        - - diff --git a/libs/range/doc/html/quickbook_HTML.manifest b/libs/range/doc/html/quickbook_HTML.manifest deleted file mode 100644 index a6b101f4e..000000000 --- a/libs/range/doc/html/quickbook_HTML.manifest +++ /dev/null @@ -1,158 +0,0 @@ -index.html -range/introduction.html -range/concepts.html -range/concepts/overview.html -range/concepts/single_pass_range.html -range/concepts/forward_range.html -range/concepts/bidirectional_range.html -range/concepts/random_access_range.html -range/concepts/concept_checking.html -range/reference.html -range/reference/overview.html -range/reference/concept_implementation.html -range/reference/concept_implementation/synopsis.html -range/reference/concept_implementation/semantics.html -range/reference/concept_implementation/semantics/metafunctions.html -range/reference/concept_implementation/semantics/functions.html -range/reference/adaptors.html -range/reference/adaptors/introduction.html -range/reference/adaptors/general_requirements.html -range/reference/adaptors/reference.html -range/reference/adaptors/reference/adjacent_filtered.html -range/reference/adaptors/reference/copied.html -range/reference/adaptors/reference/filtered.html -range/reference/adaptors/reference/indexed.html -range/reference/adaptors/reference/indirected.html -range/reference/adaptors/reference/map_keys.html -range/reference/adaptors/reference/map_values.html -range/reference/adaptors/reference/replaced.html -range/reference/adaptors/reference/replaced_if.html -range/reference/adaptors/reference/reversed.html -range/reference/adaptors/reference/sliced.html -range/reference/adaptors/reference/strided.html -range/reference/adaptors/reference/type_erased.html -range/reference/adaptors/reference/tokenized.html -range/reference/adaptors/reference/transformed.html -range/reference/adaptors/reference/uniqued.html -range/reference/algorithms.html -range/reference/algorithms/introduction.html -range/reference/algorithms/mutating.html -range/reference/algorithms/mutating/copy.html -range/reference/algorithms/mutating/copy_backward.html -range/reference/algorithms/mutating/fill.html -range/reference/algorithms/mutating/fill_n.html -range/reference/algorithms/mutating/generate.html -range/reference/algorithms/mutating/inplace_merge.html -range/reference/algorithms/mutating/merge.html -range/reference/algorithms/mutating/nth_element.html -range/reference/algorithms/mutating/partial_sort.html -range/reference/algorithms/mutating/partition.html -range/reference/algorithms/mutating/random_shuffle.html -range/reference/algorithms/mutating/remove.html -range/reference/algorithms/mutating/remove_copy.html -range/reference/algorithms/mutating/remove_copy_if.html -range/reference/algorithms/mutating/remove_if.html -range/reference/algorithms/mutating/replace.html -range/reference/algorithms/mutating/replace_copy.html -range/reference/algorithms/mutating/replace_copy_if.html -range/reference/algorithms/mutating/replace_if.html -range/reference/algorithms/mutating/reverse.html -range/reference/algorithms/mutating/reverse_copy.html -range/reference/algorithms/mutating/rotate.html -range/reference/algorithms/mutating/rotate_copy.html -range/reference/algorithms/mutating/sort.html -range/reference/algorithms/mutating/stable_partition.html -range/reference/algorithms/mutating/stable_sort.html -range/reference/algorithms/mutating/swap_ranges.html -range/reference/algorithms/mutating/transform.html -range/reference/algorithms/mutating/unique.html -range/reference/algorithms/mutating/unique_copy.html -range/reference/algorithms/non_mutating.html -range/reference/algorithms/non_mutating/adjacent_find.html -range/reference/algorithms/non_mutating/binary_search.html -range/reference/algorithms/non_mutating/count.html -range/reference/algorithms/non_mutating/count_if.html -range/reference/algorithms/non_mutating/equal.html -range/reference/algorithms/non_mutating/equal_range.html -range/reference/algorithms/non_mutating/for_each.html -range/reference/algorithms/non_mutating/find.html -range/reference/algorithms/non_mutating/find_end.html -range/reference/algorithms/non_mutating/find_first_of.html -range/reference/algorithms/non_mutating/find_if.html -range/reference/algorithms/non_mutating/lexicographical_compare.html -range/reference/algorithms/non_mutating/lower_bound.html -range/reference/algorithms/non_mutating/max_element.html -range/reference/algorithms/non_mutating/min_element.html -range/reference/algorithms/non_mutating/mismatch.html -range/reference/algorithms/non_mutating/search.html -range/reference/algorithms/non_mutating/search_n.html -range/reference/algorithms/non_mutating/upper_bound.html -range/reference/algorithms/set.html -range/reference/algorithms/set/includes.html -range/reference/algorithms/set/set_union.html -range/reference/algorithms/set/set_intersection.html -range/reference/algorithms/set/set_difference.html -range/reference/algorithms/set/set_symmetric_difference.html -range/reference/algorithms/heap.html -range/reference/algorithms/heap/push_heap.html -range/reference/algorithms/heap/pop_heap.html -range/reference/algorithms/heap/make_heap.html -range/reference/algorithms/heap/sort_heap.html -range/reference/algorithms/permutation.html -range/reference/algorithms/permutation/next_permutation.html -range/reference/algorithms/permutation/prev_permutation.html -range/reference/algorithms/new.html -range/reference/algorithms/new/copy_n.html -range/reference/algorithms/new/erase.html -range/reference/algorithms/new/for_each.html -range/reference/algorithms/new/insert.html -range/reference/algorithms/new/iota.html -range/reference/algorithms/new/is_sorted.html -range/reference/algorithms/new/overwrite.html -range/reference/algorithms/new/push_back.html -range/reference/algorithms/new/push_front.html -range/reference/algorithms/new/remove_erase.html -range/reference/algorithms/new/remove_erase_if.html -range/reference/algorithms/numeric.html -range/reference/algorithms/numeric/accumulate.html -range/reference/algorithms/numeric/adjacent_difference.html -range/reference/algorithms/numeric/inner_product.html -range/reference/algorithms/numeric/partial_sum.html -range/reference/ranges.html -range/reference/ranges/any_range.html -range/reference/ranges/counting_range.html -range/reference/ranges/istream_range.html -range/reference/ranges/irange.html -range/reference/utilities.html -range/reference/utilities/iterator_range.html -range/reference/utilities/sub_range.html -range/reference/utilities/combine.html -range/reference/utilities/join.html -range/reference/extending.html -range/reference/extending/method_1.html -range/reference/extending/method_2.html -range/reference/extending/method_3.html -range/reference/extending/method_3/method_3_1.html -range/reference/extending/method_3/method_3_2.html -range/style_guide.html -range/headers.html -range/headers/general.html -range/headers/adaptors.html -range/headers/algorithm.html -range/headers/algorithm_ext.html -range/examples.html -range/mfc_atl.html -range/mfc_atl/requirements.html -range/mfc_atl/mfc_ranges.html -range/mfc_atl/atl_ranges.html -range/mfc_atl/const_ranges.html -range/mfc_atl/references.html -range/upgrade.html -range/upgrade/upgrade_from_1_55.html -range/upgrade/upgrade_from_1_49.html -range/upgrade/upgrade_from_1_45.html -range/upgrade/upgrade_from_1_42.html -range/upgrade/upgrade_from_1_34.html -range/portability.html -range/faq.html -range/history_ack.html diff --git a/libs/range/doc/html/range/concepts.html b/libs/range/doc/html/range/concepts.html deleted file mode 100644 index 83e98f2de..000000000 --- a/libs/range/doc/html/range/concepts.html +++ /dev/null @@ -1,52 +0,0 @@ - - - -Range Concepts - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/concepts/bidirectional_range.html b/libs/range/doc/html/range/concepts/bidirectional_range.html deleted file mode 100644 index 75bbf61a5..000000000 --- a/libs/range/doc/html/range/concepts/bidirectional_range.html +++ /dev/null @@ -1,301 +0,0 @@ - - - -Bidirectional Range - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Notation -
        -
        ---- - - - - - - - - - - - -
        -

        - X -

        -
        -

        - A type that is a model of Bidirectional - Range. -

        -
        -

        - a -

        -
        -

        - Object of type X. -

        -
        -
        - - Description -
        -

        - This concept provides access to iterators that traverse in both directions - (forward and reverse). The boost::range_iterator<X>::type iterator must meet all of the requirements - of Bidirectional - Traversal Iterator. -

        -
        - - Refinement - of -
        -

        - Forward Range -

        -
        - - Associated - types -
        -
        ----- - - - - - - - - - - - - - -
        -

        - Reverse Iterator type -

        -
        -

        - boost::range_reverse_iterator<X>::type -

        -
        -

        - The type of iterator used to iterate through a Range's elements - in reverse order. The iterator's value type is expected to be the - Range's value type. A conversion from the reverse iterator type - to the const reverse iterator type must exist. -

        -
        -

        - Const reverse iterator type -

        -
        -

        - boost::range_reverse_iterator<const X>::type -

        -
        -

        - A type of reverse iterator that may be used to examine, but not - to modify, a Range's elements. -

        -
        -
        - - Valid expressions -
        -
        ------ - - - - - - - - - - - - - - - - - - - - -
        -

        - Name -

        -
        -

        - Expression -

        -
        -

        - Return type -

        -
        -

        - Semantics -

        -
        -

        - Beginning of range -

        -
        -

        - boost::rbegin(a) -

        -
        -

        - boost::range_reverse_iterator<X>::type if a - is mutable boost::range_reverse_iterator<const - X>::type otherwise. -

        -
        -

        - Equivalent to boost::range_reverse_iterator<X>::type(boost::end(a)). -

        -
        -

        - End of range -

        -
        -

        - boost::rend(a) -

        -
        -

        - boost::range_reverse_iterator<X>::type if a - is mutable, boost::range_reverse_iterator<const - X>::type otherwise. -

        -
        -

        - Equivalent to boost::range_reverse_iterator<X>::type(boost::begin(a)). -

        -
        -
        - - Complexity - guarantees -
        -

        - boost::rbegin(a) has - the same complexity as boost::end(a) and - boost::rend(a) has the same complexity as boost::begin(a) from - Forward Range. -

        -
        - - Invariants -
        -
        ---- - - - - - - - - - - - -
        -

        - Valid reverse range -

        -
        -

        - For any Bidirectional Range a, [boost::rbegin(a),boost::rend(a)) - is a valid range, that is, boost::rend(a) is reachable from boost::rbegin(a) - in a finite number of increments. -

        -
        -

        - Completeness -

        -
        -

        - An algorithm that iterates through the range [boost::rbegin(a),boost::rend(a)) - will pass through every element of a. -

        -
        -
        - - See - also -
        -

        - Implementation - of metafunctions -

        -

        - Implementation - of functions -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/concepts/concept_checking.html b/libs/range/doc/html/range/concepts/concept_checking.html deleted file mode 100644 index 1319fbaec..000000000 --- a/libs/range/doc/html/range/concepts/concept_checking.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -Concept Checking - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - Each of the range concepts has a corresponding concept checking class in - the file <boost/range/concepts.hpp>. - These classes may be used in conjunction with the Boost - Concept Check library to ensure that the type of a template parameter - is compatible with a range concept. If not, a meaningful compile time error - is generated. Checks are provided for the range concepts related to iterator - traversal categories. For example, the following line checks that the type - T models the Forward - Range concept. -

        -

        -

        -
        BOOST_CONCEPT_ASSERT(( ForwardRangeConcept<T> ));
        -
        -

        -

        -

        - An additional concept check is required for the value access property of - the range based on the range's iterator type. For example to check for a - ForwardReadableRange, the following code is required. -

        -

        -

        -
        BOOST_CONCEPT_ASSERT(( ForwardRangeConcept<T> ));
        -BOOST_CONCEPT_ASSERT(( ReadableIteratorConcept<typename range_iterator<T>::type> ));
        -
        -

        -

        -

        - The following range concept checking classes are provided. -

        -
        -
        - - See - also -
        -

        - Range Terminology and style guidelines -

        -

        - Iterator concepts -

        -

        - Boost Concept Check library -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/concepts/forward_range.html b/libs/range/doc/html/range/concepts/forward_range.html deleted file mode 100644 index db086f1f1..000000000 --- a/libs/range/doc/html/range/concepts/forward_range.html +++ /dev/null @@ -1,163 +0,0 @@ - - - -Forward Range - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Notation -
        -
        ---- - - - - - - - - - - - -
        -

        - X -

        -
        -

        - A type that is a model of Forward - Range. -

        -
        -

        - a -

        -
        -

        - Object of type X. -

        -
        -
        - - Description -
        -

        - A range X where boost::range_iterator<X>::type is a model of Forward - Traversal Iterator. -

        -
        - - Refinement - of -
        -

        - Single Pass Range -

        -
        - - Associated - types -
        -
        ----- - - - - - - - - - - - - - -
        -

        - Distance type -

        -
        -

        - boost::range_difference<X>::type -

        -
        -

        - A signed integral type used to represent the distance between two - of the Range's iterators. This type must be the same as the iterator's - distance type. -

        -
        -

        - Size type -

        -
        -

        - boost::range_size<X>::type -

        -
        -

        - An unsigned integral type that can represent any nonnegative value - of the Range's distance type. -

        -
        -
        - - See - also -
        -

        - Implementation - of metafunctions -

        -

        - Implementation - of functions -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/concepts/overview.html b/libs/range/doc/html/range/concepts/overview.html deleted file mode 100644 index 0a6df4e04..000000000 --- a/libs/range/doc/html/range/concepts/overview.html +++ /dev/null @@ -1,80 +0,0 @@ - - - -Overview - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - A Range is a concept - similar to the STL Container - concept. A Range provides iterators for accessing a half-open range [first,one_past_last) of elements and provides information about - the number of elements in the Range. However, a Range has fewer requirements - than a Container. -

        -

        - The motivation for the Range concept is that there are many useful Container-like - types that do not meet the full requirements of Container, and many algorithms - that can be written with this reduced set of requirements. In particular, - a Range does not necessarily -

        -
          -
        • - own the elements that can be accessed through it, -
        • -
        • - have copy semantics, -
        • -
        -

        - Because of the second requirement, a Range object must be passed by (const - or non-const) reference in generic code. -

        -

        - The operations that can be performed on a Range is dependent on the traversal - category of the underlying iterator type. Therefore the range concepts - are named to reflect which traversal category its iterators support. See - also terminology and style guidelines. for more information about naming - of ranges. -

        -

        - The concepts described below specifies associated types as metafunctions - and all functions as free-standing functions to allow for a layer of indirection. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/concepts/random_access_range.html b/libs/range/doc/html/range/concepts/random_access_range.html deleted file mode 100644 index d675b6e50..000000000 --- a/libs/range/doc/html/range/concepts/random_access_range.html +++ /dev/null @@ -1,187 +0,0 @@ - - - -Random Access Range - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Description -
        -

        - A range X where boost::range_iterator<X>::type is a model of Random - Access Traversal Iterator. -

        -
        - - Refinement - of -
        -

        - Bidirectional Range -

        -
        - - Valid expressions -
        -
        ----- - - - - - - - - - - -
        -

        - Name -

        -
        -

        - Expression -

        -
        -

        - Return type -

        -
        -

        - Size of range -

        -
        -

        - boost::size(a) -

        -
        -

        - boost::range_size<X>::type -

        -
        -
        - - Expression - semantics -
        -
        ----- - - - - - - - - - - -
        -

        - Expression -

        -
        -

        - Semantics -

        -
        -

        - Postcondition -

        -
        -

        - boost::size(a) -

        -
        -

        - Returns the size of the Range, that is, its number of elements. - Note boost::size(a) - == 0u - is equivalent to boost::empty(a). -

        -
        -

        - boost::size(a) - >= 0 -

        -
        -
        - - Complexity - guarantees -
        -

        - boost::size(a) completes in amortized constant time. -

        -
        - - Invariants -
        -
        ---- - - - - - -
        -

        - Range size -

        -
        -

        - boost::size(a) - is equal to the boost::end(a) - boost::begin(a). -

        -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/concepts/single_pass_range.html b/libs/range/doc/html/range/concepts/single_pass_range.html deleted file mode 100644 index 493923cbf..000000000 --- a/libs/range/doc/html/range/concepts/single_pass_range.html +++ /dev/null @@ -1,352 +0,0 @@ - - - -Single Pass Range - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Notation -
        -
        ---- - - - - - - - - - - - -
        -

        - X -

        -
        -

        - A type that is a model of Single - Pass Range. -

        -
        -

        - a -

        -
        -

        - Object of type X. -

        -
        -
        - - Description -
        -

        - A range X where boost::range_iterator<X>::type is a model of Single - Pass Iterator. -

        -
        - - Associated - types -
        -
        ----- - - - - - - - - - - - - - -
        -

        - Iterator type -

        -
        -

        - boost::range_iterator<X>::type -

        -
        -

        - The type of iterator used to iterate through a Range's elements. - The iterator's value type is expected to be the Range's value type. - A conversion from the iterator type to the const - iterator type must exist. -

        -
        -

        - Const iterator type -

        -
        -

        - boost::range_iterator<const X>::type -

        -
        -

        - A type of iterator that may be used to examine, but not to modify, - a Range's elements. -

        -
        -
        - - Valid - expressions -
        -

        - The following expressions must be valid. -

        -
        ----- - - - - - - - - - - - - - - - - - -
        -

        - Name -

        -
        -

        - Expression -

        -
        -

        - Return type -

        -
        -

        - Beginning of range -

        -
        -

        - boost::begin(a) -

        -
        -

        - boost::range_iterator<X>::type if a - is mutable, boost::range_iterator<const - X>::type otherwise -

        -
        -

        - End of range -

        -
        -

        - boost::end(a) -

        -
        -

        - boost::range_iterator<X>::type if a - is mutable, boost::range_iterator<const - X>::type otherwise -

        -
        -
        - - Expression - semantics -
        -
        ----- - - - - - - - - - - - - - - - - - -
        -

        - Expression -

        -
        -

        - Semantics -

        -
        -

        - Postcondition -

        -
        -

        - boost::begin(a) -

        -
        -

        - Returns an iterator pointing to the first element in the Range. -

        -
        -

        - boost::begin(a) - is either dereferenceable or past-the-end. It is past-the-end if - and only if boost::distance(a) == 0. -

        -
        -

        - boost::end(a) -

        -
        -

        - Returns an iterator pointing one past the last element in the Range. -

        -
        -

        - boost::end(a) - is past-the-end. -

        -
        -
        - - Complexity - guarantees -
        -

        - boost::end(a) is at most amortized linear time, boost::begin(a) is amortized - constant time. For most practical purposes, one can expect both to be amortized - constant time. -

        -
        - - Invariants -
        -
        ---- - - - - - - - - - - - -
        -

        - Valid range -

        -
        -

        - For any Range a, - [boost::begin(a),boost::end(a)) is a valid range, that is, boost::end(a) - is reachable from boost::begin(a) in a finite number of increments. -

        -
        -

        - Completeness -

        -
        -

        - An algorithm that iterates through the range [boost::begin(a),boost::end(a)) - will pass through every element of a. -

        -
        -
        - - See - also -
        -

        - Extending the library for UDTs -

        -

        - Implementation - of metafunctions -

        -

        - Implementation - of functions -

        -

        - Container -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/examples.html b/libs/range/doc/html/range/examples.html deleted file mode 100644 index 54ecdfa12..000000000 --- a/libs/range/doc/html/range/examples.html +++ /dev/null @@ -1,75 +0,0 @@ - - - -Examples - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - Some examples are given in the accompanying test files: -

        -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/faq.html b/libs/range/doc/html/range/faq.html deleted file mode 100644 index c2c994f4e..000000000 --- a/libs/range/doc/html/range/faq.html +++ /dev/null @@ -1,90 +0,0 @@ - - - -FAQ - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -

        -FAQ -

        -

        - 1. Why is there no difference between range_iterator<C>::type - and range_const_iterator<C>::type - for std::pair<iterator, iterator>? -

        -

        - In general it is not possible nor desirable to find a corresponding const_iterator. When it is possible to - come up with one, the client might choose to construct a std::pair<const_iterator,const_iterator> object. -

        -

        - Note that an iterator_range is somewhat more - convenient than a pair and - that a sub_range does propagate const-ness. -

        -

        - 2. Why is there not supplied more types or - more functions? -

        -

        - The library has been kept small because its current interface will serve - most purposes. If and when a genuine need arises for more functionality, - it can be implemented. -

        -

        - 3. How should I implement generic algorithms - for ranges? -

        -

        - One should always start with a generic algorithm that takes two iterators - (or more) as input. Then use Boost.Range to build handier versions on top - of the iterator based algorithm. Please notice that once the range version - of the algorithm is done, it makes sense not to expose the iterator version - in the public interface. -

        -

        - 4. Why is there no Incrementable Range concept? -

        -

        - Even though we speak of incrementable iterators, it would not make much sense - for ranges; for example, we cannot determine the size and emptiness of a - range since we cannot even compare its iterators. -

        -

        - Note also that incrementable iterators are derived from output iterators - and so there exist no output range. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/headers.html b/libs/range/doc/html/range/headers.html deleted file mode 100644 index effe460ed..000000000 --- a/libs/range/doc/html/range/headers.html +++ /dev/null @@ -1,50 +0,0 @@ - - - -Library Headers - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/headers/adaptors.html b/libs/range/doc/html/range/headers/adaptors.html deleted file mode 100644 index d75c32f22..000000000 --- a/libs/range/doc/html/range/headers/adaptors.html +++ /dev/null @@ -1,233 +0,0 @@ - - - -Adaptors - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -

        - Header -

        -
        -

        - Includes -

        -
        -

        - <boost/range/adaptor/adjacent_filtered.hpp> -

        -
        -

        - adjacent_filtered -

        -
        -

        - <boost/range/adaptor/copied.hpp> -

        -
        -

        - copied -

        -
        -

        - <boost/range/adaptor/filtered.hpp> -

        -
        -

        - filtered -

        -
        -

        - <boost/range/adaptor/indexed.hpp> -

        -
        -

        - indexed -

        -
        -

        - <boost/range/adaptor/indirected.hpp. -

        -
        -

        - indirected -

        -
        -

        - <boost/range/adaptor/map.hpp> -

        -
        -

        - map_keys - map_values -

        -
        -

        - <boost/range/adaptor/replaced.hpp> -

        -
        -

        - replaced -

        -
        -

        - <boost/range/adaptor/replaced_if.hpp> -

        -
        -

        - replaced_if -

        -
        -

        - <boost/range/adaptor/reversed.hpp> -

        -
        -

        - reversed -

        -
        -

        - <boost/range/adaptor/sliced.hpp> -

        -
        -

        - sliced -

        -
        -

        - <boost/range/adaptor/strided.hpp> -

        -
        -

        - strided -

        -
        -

        - <boost/range/adaptor/tokenized.hpp> -

        -
        -

        - tokenized -

        -
        -

        - <boost/range/adaptor/transformed.hpp> -

        -
        -

        - transformed -

        -
        -

        - <boost/range/adaptor/uniqued.hpp> -

        -
        -

        - uniqued -

        -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/headers/algorithm.html b/libs/range/doc/html/range/headers/algorithm.html deleted file mode 100644 index 0cce17fc1..000000000 --- a/libs/range/doc/html/range/headers/algorithm.html +++ /dev/null @@ -1,684 +0,0 @@ - - - -Algorithm - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -

        - Header -

        -
        -

        - Includes -

        -
        -

        - <boost/range/algorithm/adjacent_find.hpp> -

        -
        -

        - adjacent_find -

        -
        -

        - <boost/range/algorithm/binary_search.hpp> -

        -
        -

        - binary_search -

        -
        -

        - <boost/range/algorithm/copy.hpp> -

        -
        -

        - copy -

        -
        -

        - <boost/range/algorithm/copy_backward.hpp> -

        -
        -

        - copy_backward -

        -
        -

        - <boost/range/algorithm/count.hpp> -

        -
        -

        - count -

        -
        -

        - <boost/range/algorithm/count_if.hpp> -

        -
        -

        - count_if -

        -
        -

        - <boost/range/algorithm/equal.hpp> -

        -
        -

        - equal -

        -
        -

        - <boost/range/algorithm/equal_range.hpp> -

        -
        -

        - equal_range -

        -
        -

        - <boost/range/algorithm/fill.hpp> -

        -
        -

        - fill -

        -
        -

        - <boost/range/algorithm/fill_n.hpp> -

        -
        -

        - fill_n -

        -
        -

        - <boost/range/algorithm/find.hpp> -

        -
        -

        - find -

        -
        -

        - <boost/range/algorithm/find_end.hpp> -

        -
        -

        - find_end -

        -
        -

        - <boost/range/algorithm/find_first_of.hpp> -

        -
        -

        - find_first_of -

        -
        -

        - <boost/range/algorithm/find_if.hpp> -

        -
        -

        - find_if -

        -
        -

        - <boost/range/algorithm/for_each.hpp> -

        -
        -

        - for_each -

        -
        -

        - <boost/range/algorithm/generate.hpp> -

        -
        -

        - generate -

        -
        -

        - <boost/range/algorithm/heap_algorithm.hpp> -

        -
        -

        - push_heap - pop_heap - make_heap - sort_heap -

        -
        -

        - <boost/range/algorithm/inplace_merge.hpp> -

        -
        -

        - inplace_merge -

        -
        -

        - <boost/range/algorithm/lexicographical_compare.hpp> -

        -
        -

        - lexicographical_compare -

        -
        -

        - <boost/range/algorithm/lower_bound.hpp> -

        -
        -

        - lower_bound -

        -
        -

        - <boost/range/algorithm/max_element.hpp> -

        -
        -

        - max_element -

        -
        -

        - <boost/range/algorithm/merge.hpp> -

        -
        -

        - merge -

        -
        -

        - <boost/range/algorithm/min_element.hpp> -

        -
        -

        - min_element -

        -
        -

        - <boost/range/algorithm/mismatch.hpp> -

        -
        -

        - mismatch -

        -
        -

        - <boost/range/algorithm/nth_element.hpp> -

        -
        -

        - nth_element -

        -
        -

        - <boost/range/algorithm/partial_sort.hpp> -

        -
        -

        - partial_sort -

        -
        -

        - <boost/range/algorithm/partition.hpp> -

        -
        -

        - partition -

        -
        -

        - <boost/range/algorithm/permutation.hpp> -

        -
        -

        - next_permutation - prev_permutation -

        -
        -

        - <boost/range/algorithm/random_shuffle.hpp> -

        -
        -

        - random_shuffle -

        -
        -

        - <boost/range/algorithm/remove.hpp> -

        -
        -

        - remove -

        -
        -

        - <boost/range/algorithm/remove_copy.hpp> -

        -
        -

        - remove_copy -

        -
        -

        - <boost/range/algorithm/remove_copy_if.hpp> -

        -
        -

        - remove_copy_if -

        -
        -

        - <boost/range/algorithm/remove_if.hpp> -

        -
        -

        - remove_if -

        -
        -

        - <boost/range/algorithm/replace.hpp> -

        -
        -

        - replace -

        -
        -

        - <boost/range/algorithm/replace_copy.hpp> -

        -
        -

        - replace_copy -

        -
        -

        - <boost/range/algorithm/replace_copy_if.hpp> -

        -
        -

        - replace_copy_if -

        -
        -

        - <boost/range/algorithm/replace_if.hpp> -

        -
        -

        - replace_if -

        -
        -

        - <boost/range/algorithm/reverse.hpp> -

        -
        -

        - reverse -

        -
        -

        - <boost/range/algorithm/reverse_copy.hpp> -

        -
        -

        - reverse_copy -

        -
        -

        - <boost/range/algorithm/rotate.hpp> -

        -
        -

        - rotate -

        -
        -

        - <boost/range/algorithm/rotate_copy.hpp> -

        -
        -

        - rotate_copy -

        -
        -

        - <boost/range/algorithm/search.hpp> -

        -
        -

        - search -

        -
        -

        - <boost/range/algorithm/search_n.hpp> -

        -
        -

        - search_n -

        -
        -

        - <boost/range/algorithm/set_algorithm.hpp> -

        -
        -

        - includes - set_union - set_intersection - set_difference - set_symmetric_difference -

        -
        -

        - <boost/range/algorithm/sort.hpp> -

        -
        -

        - sort -

        -
        -

        - <boost/range/algorithm/stable_partition.hpp> -

        -
        -

        - stable_partition -

        -
        -

        - <boost/range/algorithm/swap_ranges.hpp> -

        -
        -

        - swap_ranges -

        -
        -

        - <boost/range/algorithm/transform.hpp> -

        -
        -

        - transform -

        -
        -

        - <boost/range/algorithm/unique.hpp> -

        -
        -

        - unique -

        -
        -

        - <boost/range/algorithm/unique_copy.hpp> -

        -
        -

        - unique_copy -

        -
        -

        - <boost/range/algorithm/upper_bound.hpp> -

        -
        -

        - upper_bound -

        -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/headers/algorithm_ext.html b/libs/range/doc/html/range/headers/algorithm_ext.html deleted file mode 100644 index 707b9a061..000000000 --- a/libs/range/doc/html/range/headers/algorithm_ext.html +++ /dev/null @@ -1,172 +0,0 @@ - - - -Algorithm Extensions - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -

        - Header -

        -
        -

        - Includes -

        -
        -

        - <boost/range/algorithm_ext/copy_n.hpp> -

        -
        -

        - copy_n -

        -
        -

        - <boost/range/algorithm_ext/erase.hpp> -

        -
        -

        - erase -

        -
        -

        - <boost/range/algorithm_ext/for_each.hpp> -

        -
        -

        - for_each -

        -
        -

        - <boost/range/algorithm_ext/insert.hpp> -

        -
        -

        - insert -

        -
        -

        - <boost/range/algorithm_ext/iota.hpp> -

        -
        -

        - iota -

        -
        -

        - <boost/range/algorithm_ext/is_sorted.hpp> -

        -
        -

        - is_sorted -

        -
        -

        - <boost/range/algorithm_ext/overwrite.hpp> -

        -
        -

        - overwrite -

        -
        -

        - <boost/range/algorithm_ext/push_back.hpp> -

        -
        -

        - push_back -

        -
        -

        - <boost/range/algorithm_ext/push_front.hpp> -

        -
        -

        - push_front -

        -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/headers/general.html b/libs/range/doc/html/range/headers/general.html deleted file mode 100644 index 40ddcfa95..000000000 --- a/libs/range/doc/html/range/headers/general.html +++ /dev/null @@ -1,552 +0,0 @@ - - - -General - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -

        - Header -

        -
        -

        - Includes -

        -
        -

        - Related Concept -

        -
        -

        - <boost/range.hpp> -

        -
        -

        - everything from Boost.Range version 1 (Boost versions 1.42 and - below). Includes the core range functions and metafunctions, but - excludes Range Adaptors and Range Algorithms. -

        -
        -

        - - -

        -
        -

        - <boost/range/metafunctions.hpp> -

        -
        -

        - every metafunction -

        -
        -

        - - -

        -
        -

        - <boost/range/functions.hpp> -

        -
        -

        - every function -

        -
        -

        - - -

        -
        -

        - <boost/range/value_type.hpp> -

        -
        -

        - range_value -

        -
        -

        - Single Pass Range -

        -
        -

        - <boost/range/iterator.hpp> -

        -
        -

        - range_iterator -

        -
        -

        - Single Pass Range -

        -
        -

        - <boost/range/difference_type.hpp> -

        -
        -

        - range_difference -

        -
        -

        - Forward Range -

        -
        -

        - <boost/range/pointer.hpp> -

        -
        -

        - range_pointer -

        -
        -

        - - -

        -
        -

        - <boost/range/category.hpp> -

        -
        -

        - range_category -

        -
        -

        - - -

        -
        -

        - <boost/range/reverse_iterator.hpp> -

        -
        -

        - range_reverse_iterator -

        -
        -

        - Bidirectional - Range -

        -
        -

        - <boost/range/begin.hpp> -

        -
        -

        - begin and const_begin -

        -
        -

        - Single Pass Range -

        -
        -

        - <boost/range/end.hpp> -

        -
        -

        - end and const_end -

        -
        -

        - Single Pass Range -

        -
        -

        - <boost/range/empty.hpp> -

        -
        -

        - empty -

        -
        -

        - Single Pass Range -

        -
        -

        - <boost/range/distance.hpp> -

        -
        -

        - distance -

        -
        -

        - Forward Range -

        -
        -

        - <boost/range/size.hpp> -

        -
        -

        - size -

        -
        -

        - Random Access - Range -

        -
        -

        - <boost/range/rbegin.hpp> -

        -
        -

        - rbegin and const_rbegin -

        -
        -

        - Bidirectional - Range -

        -
        -

        - <boost/range/rend.hpp> -

        -
        -

        - rend and const_rend -

        -
        -

        - Bidirectional - Range -

        -
        -

        - <boost/range/as_array.hpp> -

        -
        -

        - as_array -

        -
        -

        - - -

        -
        -

        - <boost/range/as_literal.hpp> -

        -
        -

        - as_literal -

        -
        -

        - - -

        -
        -

        - <boost/range/iterator_range.hpp> -

        -
        -

        - iterator_range -

        -
        -

        - - -

        -
        -

        - <boost/range/sub_range.hpp> -

        -
        -

        - sub_range -

        -
        -

        - - -

        -
        -

        - <boost/range/concepts.hpp> -

        -
        -

        - Range concepts -

        -
        -

        - - -

        -
        -

        - <boost/range/adaptors.hpp> -

        -
        -

        - every range adaptor -

        -
        -

        - - -

        -
        -

        - <boost/range/algorithm.hpp> -

        -
        -

        - every range equivalent of an STL algorithm -

        -
        -

        - - -

        -
        -

        - <boost/range/algorithm_ext.hpp> -

        -
        -

        - every range algorithm that is an extension of the STL algorithms -

        -
        -

        - - -

        -
        -

        - <boost/range/counting_range.hpp> -

        -
        -

        - counting_range -

        -
        -

        - - -

        -
        -

        - <boost/range/istream_range.hpp> -

        -
        -

        - istream_range -

        -
        -

        - - -

        -
        -

        - <boost/range/irange.hpp> -

        -
        -

        - irange -

        -
        -

        - - -

        -
        -

        - <boost/range/join.hpp> -

        -
        -

        - join -

        -
        -

        - - -

        -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/history_ack.html b/libs/range/doc/html/range/history_ack.html deleted file mode 100644 index 9b277fb1a..000000000 --- a/libs/range/doc/html/range/history_ack.html +++ /dev/null @@ -1,157 +0,0 @@ - - - -History and Acknowledgement - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHome -
        -
        - -

        - - Version - 1 - before Boost 1.43 -

        -

        - The library have been under way for a long time. Dietmar Kühl originally intended - to submit an array_traits class - template which had most of the functionality present now, but only for arrays - and standard containers. -

        -

        - Meanwhile work on algorithms for containers in various contexts showed the - need for handling pairs of iterators, and string libraries needed special treatment - of character arrays. In the end it made sense to formalize the minimal requirements - of these similar concepts. And the results are the Range concepts found in - this library. -

        -

        - The term Range was adopted because of paragraph 24.1/7 from the C++ standard: -

        -

        - Most of the library's algorithmic templates that operate on data structures - have interfaces that use ranges. A range is a pair of iterators that designate - the beginning and end of the computation. A range [i, i) is an empty range; - in general, a range [i, j) refers to the elements in the data structure starting - with the one pointed to by i and up to but not including the one pointed to - by j. Range [i, j) is valid if and only if j is reachable from i. The result - of the application of functions in the library to invalid ranges is undefined. -

        -

        - Special thanks goes to -

        -
          -
        • - Pavol Droba for help with documentation and implementation -
        • -
        • - Pavel Vozenilek for help with porting the library -
        • -
        • - Jonathan Turkanis and John Torjo for help with documentation -
        • -
        • - Hartmut Kaiser for being review manager -
        • -
        • - Jonathan Turkanis for porting the lib (as far as possible) to vc6 and vc7. -
        • -
        -

        - The concept checks and their documentation was provided by Daniel Walker. -

        -

        - - Version - 2 - Boost 1.43 and beyond -

        -

        - This version introduced Range Adaptors and Range Algorithms. This version 2 - is the result of a merge of all of the RangeEx features into Boost.Range. -

        -

        - There were an enormous number of very significant contributors through all - stages of this library. -

        -

        - Prior to Boost.RangeEx there had been a number of Range library implementations, - these include library implementations by Eric Niebler, Adobe, Shunsuke Sogame - etc. Eric Niebler contributed the Range Adaptor idea which is arguably the - single biggest innovation in this library. Inevitably a great deal of commonality - evolved in each of these libraries, but a considerable amount of effort was - expended to learn from all of the divergent techniques. -

        -

        - The people in the following list all made contributions in the form of reviews, - user feedback, design suggestions, or defect detection: -

        -
          -
        • - Thorsten Ottosen: review management, design advice, documentation feedback -
        • -
        • - Eric Niebler: early implementation, and review feedback -
        • -
        • - Joel de Guzman: review -
        • -
        • - Mathias Gaunard: review -
        • -
        • - David Abrahams: implementation advice -
        • -
        • - Robert Jones: defect reports, usage feedback -
        • -
        • - Sean Parent: contributed experience from the Adobe range library -
        • -
        • - Arno Schoedl: implementations, and review -
        • -
        • - Rogier van Dalen: review -
        • -
        • - Vincente Botet: review, documentation feedback -
        • -
        -

        - Regardless of how I write this section it will never truly fairly capture the - gratitude that I feel to all who have contributed. Thank you everyone. -

        -
        - - - -
        -
        -
        -PrevUpHome -
        - - diff --git a/libs/range/doc/html/range/introduction.html b/libs/range/doc/html/range/introduction.html deleted file mode 100644 index f369be3b8..000000000 --- a/libs/range/doc/html/range/introduction.html +++ /dev/null @@ -1,127 +0,0 @@ - - - -Introduction - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - Generic algorithms have so far been specified in terms of two or more iterators. - Two iterators would together form a range of values that the algorithm could - work on. This leads to a very general interface, but also to a somewhat clumsy - use of the algorithms with redundant specification of container names. Therefore - we would like to raise the abstraction level for algorithms so they specify - their interface in terms of Ranges as - much as possible. -

        -

        - The most common form of ranges used throughout the C++ community are standard - library containers. When writing algorithms however, one often finds it desirable - for the algorithm to accept other types that offer enough functionality to - satisfy the needs of the generic code if a - suitable layer of indirection is applied . For example, - raw arrays are often suitable for use with generic code that works with containers, - provided a suitable adapter is used. Likewise, null terminated strings can - be treated as containers of characters, if suitably adapted. -

        -

        - This library therefore provides the means to adapt standard-like containers, - null terminated strings, std::pairs of - iterators, and raw arrays (and more), such that the same generic code can work - with them all. The basic idea is to add another layer of indirection using - metafunctions - and free-standing functions so syntactic and/or semantic differences can be - removed. -

        -

        - The main advantages are -

        -
          -
        • - simpler implementation and specification of generic range algorithms -
        • -
        • - more flexible, compact and maintainable client code -
        • -
        • - safe use of built-in arrays (for legacy code; why else would you use built-in - arrays?) -
        • -
        -

        - - Example - - Iterate over the values in a map -

        -

        -

        -
        using namespace boost;
        -using namespace boost::adaptors;
        -for_each( my_map | map_values, fn );
        -
        -

        -

        -

        - - Example - - Iterate over the keys in a map -

        -

        -

        -
        using namespace boost;
        -using namespace boost::adaptors;
        -for_each( my_map | map_keys, fn );
        -
        -

        -

        -

        - - Example - - Push the even values from a map in reverse order into the container target -

        -

        -

        -
        using namespace boost;
        -using namespace boost::adaptors;
        -// Assume that is_even is a predicate that has been implemented elsewhere...
        -push_back(target, my_map | map_values | filtered(is_even()) | reversed);
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/mfc_atl.html b/libs/range/doc/html/range/mfc_atl.html deleted file mode 100644 index 808d29ad7..000000000 --- a/libs/range/doc/html/range/mfc_atl.html +++ /dev/null @@ -1,141 +0,0 @@ - - - -MFC/ATL (courtesy of Shunsuke Sogame) - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        - - Introduction -
        -

        - This implementation was kindly donated by Shunsuke Sogame. This header adapts - MFC and ATL containers to the appropriate Range concepts. -

        -
        ---- - - - - - - - - - - - - - - - - - - - -
        -

        - Author: -

        -
        -

        - Shunsuke Sogame -

        -
        -

        - Contact: -

        -
        -

        - mb2act@yahoo.co.jp -

        -
        -

        - Date: -

        -
        -

        - 26th of May 2006 -

        -
        -

        - Copyright: -

        -
        -

        - Shunsuke Sogame 2005-2006. Use, modification and distribution is - subject to the Boost Software License, Version 1.0 -

        -
        -
        - - Overview -
        -

        - Boost.Range MFC/ATL Extension provides Boost.Range support for MFC/ATL collection - and string types. -

        -

        -

        -
        CTypedPtrArray<CPtrArray, CList<CString> *> myArray;
        -...
        -BOOST_FOREACH (CList<CString> *theList, myArray)
        -{
        -    BOOST_FOREACH (CString& str, *theList)
        -    {
        -        boost::to_upper(str);
        -        std::sort(boost::begin(str), boost::end(str));
        -        ...
        -    }
        -}
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/mfc_atl/atl_ranges.html b/libs/range/doc/html/range/mfc_atl/atl_ranges.html deleted file mode 100644 index 1e482a5ee..000000000 --- a/libs/range/doc/html/range/mfc_atl/atl_ranges.html +++ /dev/null @@ -1,375 +0,0 @@ - - - -ATL Ranges - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - If the <boost/range/atl.hpp> - is included before or after Boost.Range headers, the ATL collections and - strings become models of Range. The table below lists the Traversal Category - and range_reference of ATL - ranges. -

        -
        ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -

        - Range -

        -
        -

        - Traversal Category -

        -
        -

        - range_reference<Range>::type -

        -
        -

        - CAtlArray<E,ET> -

        -
        -

        - Random Access - Range -

        -
        -

        - E& -

        -
        -

        - CAutoPtrArray<E> -

        -
        -

        - Random Access - Range -

        -
        -

        - E& -

        -
        -

        - CInterfaceArray<I,pi> -

        -
        -

        - Random Access - Range -

        -
        -

        - CComQIPtr<I,pi>& -

        -
        -

        - CAtlList<E,ET> -

        -
        -

        - Bidirectional - Range -

        -
        -

        - E& -

        -
        -

        - CAutoPtrList<E> -

        -
        -

        - Bidirectional - Range -

        -
        -

        - E& -

        -
        -

        - CHeapPtrList<E,A> -

        -
        -

        - Bidirectional - Range -

        -
        -

        - E& -

        -
        -

        - CInterfaceList<I,pi> -

        -
        -

        - Bidirectional - Range -

        -
        -

        - CComQIPtr<I,pi>& -

        -
        -

        - CAtlMap<K,V,KT,VT> -

        -
        -

        - Forward Range -

        -
        -

        - Range::CPair& -

        -
        -

        - CRBTree<K,V,KT,VT> -

        -
        -

        - Bidirectional - Range -

        -
        -

        - Range::CPair& -

        -
        -

        - CRBMap<K,V,KT,VT> -

        -
        -

        - Bidirectional - Range -

        -
        -

        - Range::CPair& -

        -
        -

        - CRBMultiMap<K,V,KT,VT> -

        -
        -

        - Bidirectional - Range -

        -
        -

        - Range::CPair& -

        -
        -

        - CSimpleStringT<B,b> -

        -
        -

        - Random Access - Range -

        -
        -

        - B& -

        -
        -

        - CStringT<B,ST> -

        -
        -

        - Random Access - Range -

        -
        -

        - B& -

        -
        -

        - CFixedStringT<S,n> -

        -
        -

        - Random Access - Range -

        -
        -

        - range_reference<S>::type -

        -
        -

        - CComBSTR -

        -
        -

        - Random Access - Range -

        -
        -

        - OLECHAR& -

        -
        -

        - CSimpleArray<T,TE> -

        -
        -

        - Random Access - Range -

        -
        -

        - T& -

        -
        -

        - Other Boost.Range metafunctions are defined - by the following. Let Range - be any type listed above and Ref - be the same as range_reference<Range>::type. - range_value<Range>::type is the same as remove_reference<Ref>::type, - range_difference<Range>::type is the same as std::ptrdiff_t, - and range_pointer<Range>::type is the same as add_pointer<remove_reference<Ref>::type>::type. - As for const Range, - see below. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/mfc_atl/const_ranges.html b/libs/range/doc/html/range/mfc_atl/const_ranges.html deleted file mode 100644 index 2af82f306..000000000 --- a/libs/range/doc/html/range/mfc_atl/const_ranges.html +++ /dev/null @@ -1,125 +0,0 @@ - - - -const Ranges - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - range_reference<const Range>::type - is defined by the following algorithm. Let Range - be any type listed above and Ref - be the same as range_reference<Range>::type. -

        -

        -

        -
        if (Range is CObArray || Range is CObList)
        -    return CObject const * &
        -else if (Range is CPtrArray || Range is CPtrList)
        -    return void const * &
        -else if (there is a type X such that X& is the same as Ref)
        -    return X const &
        -else if (there is a type X such that X* const is the same as Ref)
        -    return X const * const
        -else
        -    return Ref
        -
        -

        -

        -

        - Other Boost.Range metafunctions are defined by the following. -

        -
        ---- - - - - - - - - - - - - - - - - - - -
        -

        - Range metafunction -

        -
        -

        - Result -

        -
        -

        - range_value<const Range>::type -

        -
        -

        - range_value<Range>::type -

        -
        -

        - range_difference<const - Range>::type -

        -
        -

        - std::ptrdiff_t -

        -
        -

        - range_pointer<const Range>::type -

        -
        -

        - add_pointer<remove_reference<range_reference<const Range>::type>::type>::type -

        -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/mfc_atl/mfc_ranges.html b/libs/range/doc/html/range/mfc_atl/mfc_ranges.html deleted file mode 100644 index 99f60ce39..000000000 --- a/libs/range/doc/html/range/mfc_atl/mfc_ranges.html +++ /dev/null @@ -1,485 +0,0 @@ - - - -MFC Ranges - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - If the <boost/range/mfc.hpp> - is included before or after Boost.Range headers, the MFC collections and - strings become models of Range. The table below lists the Traversal Category - and range_reference of MFC - ranges. -

        -
        ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -

        - Range -

        -
        -

        - Traversal Category -

        -
        -

        - range_reference<Range>::type -

        -
        -

        - CArray<T,A> -

        -
        -

        - Random Access - Range -

        -
        -

        - T& -

        -
        -

        - CList<T,A> -

        -
        -

        - Bidirectional - Range -

        -
        -

        - T& -

        -
        -

        - CMap<K,AK,M,AM> -

        -
        -

        - Forward Range -

        -
        -

        - Range::CPair& -

        -
        -

        - CTypedPtrArray<B,T*> -

        -
        -

        - Random Access - Range -

        -
        -

        - T* - const -

        -
        -

        - CTypedPtrList<B,T*> -

        -
        -

        - Bidirectional - Range -

        -
        -

        - T* - const -

        -
        -

        - CTypedPtrMap<B,T*,V*> -

        -
        -

        - Forward Range -

        -
        -

        - std::pair<T*,V*> - const -

        -
        -

        - CByteArray -

        -
        -

        - Random Access - Range -

        -
        -

        - BYTE& -

        -
        -

        - CDWordArray -

        -
        -

        - Random Access - Range -

        -
        -

        - DWORD& -

        -
        -

        - CObArray -

        -
        -

        - Random Access - Range -

        -
        -

        - CObject*& -

        -
        -

        - CPtrArray -

        -
        -

        - Random Access - Range -

        -
        -

        - void*& -

        -
        -

        - CStringArray -

        -
        -

        - Random Access - Range -

        -
        -

        - CString& -

        -
        -

        - CUIntArray -

        -
        -

        - Random Access - Range -

        -
        -

        - UINT& -

        -
        -

        - CWordArray -

        -
        -

        - Random Access - Range -

        -
        -

        - WORD& -

        -
        -

        - CObList -

        -
        -

        - Bidirectional - Range -

        -
        -

        - CObject*& -

        -
        -

        - CPtrList -

        -
        -

        - Bidirectional - Range -

        -
        -

        - void*& -

        -
        -

        - CStringList -

        -
        -

        - Bidirectional - Range -

        -
        -

        - CString& -

        -
        -

        - CMapPtrToWord -

        -
        -

        - Forward Range -

        -
        -

        - std::pair<void*,WORD> - const -

        -
        -

        - CMapPtrToPtr -

        -
        -

        - Forward Range -

        -
        -

        - std::pair<void*,void*> - const -

        -
        -

        - CMapStringToOb -

        -
        -

        - Forward Range -

        -
        -

        - std::pair<String,CObject*> - const -

        -
        -

        - CMapStringToString -

        -
        -

        - Forward Range -

        -
        -

        - Range::CPair& -

        -
        -

        - CMapWordToOb -

        -
        -

        - Forward Range -

        -
        -

        - std::pair<WORD,CObject*> - const -

        -
        -

        - CMapWordToPtr -

        -
        -

        - Forward Range -

        -
        -

        - std::pair<WORD,void*> - const -

        -
        -

        - Other Boost.Range metafunctions are defined by the following. Let Range be any type listed above and Ref be the same as range_reference<Range>::type. - range_value<Range>::type is the same as remove_reference<remove_const<Ref>::type>::type, - range_difference<Range>::type is the same as std::ptrdiff_t, - and range_pointer<Range>::type is the same as add_pointer<remove_reference<Ref>::type>::type. - As for const Range, - see below. -

        -

        - Adam Walling has provided the header <boost/range/mfc_map.hpp> - to add support for the map adaptor with MFC map types. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/mfc_atl/references.html b/libs/range/doc/html/range/mfc_atl/references.html deleted file mode 100644 index 36dab9729..000000000 --- a/libs/range/doc/html/range/mfc_atl/references.html +++ /dev/null @@ -1,57 +0,0 @@ - - - -References - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/mfc_atl/requirements.html b/libs/range/doc/html/range/mfc_atl/requirements.html deleted file mode 100644 index c2e09a683..000000000 --- a/libs/range/doc/html/range/mfc_atl/requirements.html +++ /dev/null @@ -1,52 +0,0 @@ - - - -Requirements - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
          -
        • - Boost C++ Libraries Version 1.34.0 or later (no compilation required) -
        • -
        • - Visual C++ 7.1 or later (for MFC and ATL) -
        • -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/portability.html b/libs/range/doc/html/range/portability.html deleted file mode 100644 index 59850504a..000000000 --- a/libs/range/doc/html/range/portability.html +++ /dev/null @@ -1,92 +0,0 @@ - - - -Portability - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - A huge effort has been made to port the library to as many compilers as possible. -

        -

        - Full support for built-in arrays require that the compiler supports class template - partial specialization. For non-conforming compilers there might be a chance - that it works anyway thanks to workarounds in the type traits library. Visual - C++ 6/7.0 has a limited support for arrays: as long as the arrays are of built-in - type it should work. -

        -

        - Notice also that some compilers cannot do function template ordering properly. - In that case one must rely of range_iterator and a single function - definition instead of overloaded versions for const and non-const arguments. - So if one cares about old compilers, one should not pass rvalues to the functions. -

        -

        - For maximum portability you should follow these guidelines: -

        -
          -
        1. - do not use built-in arrays, -
        2. -
        3. - do not pass rvalues to begin(), - end() - and iterator_range Range constructors - and assignment operators, -
        4. -
        5. - use const_begin() - and const_end() - whenever your code by intention is read-only; this will also solve most - rvalue problems, -
        6. -
        7. - do not rely on ADL: -
            -
          • - if you overload functions, include that header before the headers - in this library, -
          • -
          • - put all overloads in namespace boost. -
          • -
          -
        8. -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference.html b/libs/range/doc/html/range/reference.html deleted file mode 100644 index 065250e12..000000000 --- a/libs/range/doc/html/range/reference.html +++ /dev/null @@ -1,98 +0,0 @@ - - - -Reference - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors.html b/libs/range/doc/html/range/reference/adaptors.html deleted file mode 100644 index 8d86c4058..000000000 --- a/libs/range/doc/html/range/reference/adaptors.html +++ /dev/null @@ -1,51 +0,0 @@ - - - -Range Adaptors - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/general_requirements.html b/libs/range/doc/html/range/reference/adaptors/general_requirements.html deleted file mode 100644 index 331b0eea3..000000000 --- a/libs/range/doc/html/range/reference/adaptors/general_requirements.html +++ /dev/null @@ -1,142 +0,0 @@ - - - -General Requirements - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - In the description of generator expressions, the following notation is - used: -

        -
          -
        • - fwdRng is an expression - of a type R that models - ForwardRange -
        • -
        • - biRng is an expression - of a type R that models - BidirectionalRange -
        • -
        • - rndRng is an expression - of a type R that models - RandomAccessRange -
        • -
        • - pred is an expression - of a type that models UnaryPredicate -
        • -
        • - bi_pred is an expression - of a type that models BinaryPredicate -
        • -
        • - fun is an expression - of a type that models UnaryFunction -
        • -
        • - value, new_value and old_value - are objects convertible to boost::range_value<R>::type -
        • -
        • - n,m are integer expressions convertible - to range_difference<R>::type -
        • -
        -

        - Also note that boost::range_value<R>::type must be implicitly convertible to - the type arguments to pred, - bi_pred and fun. -

        -

        - Range Category in the following adaptor descriptions refers to the minimum - range concept required by the range passed to the adaptor. The resultant - range is a model of the same range concept as the input range unless specified - otherwise. -

        -

        - Returned Range Category is the concept of the returned range. In some cases - the returned range is of a lesser category than the range passed to the - adaptor. For example, the filtered - adaptor returns only a ForwardRange - regardless of the input. -

        -

        - Furthermore, the following rules apply to any expression of the form -

        -
        rng | boost::adaptors::adaptor_generator
        -
        -

        -

        -

        - 1. Applying operator|() - to a range R (always left - argument) and a range adapter RA - (always right argument) yields a new range type which may not conform to - the same range concept as R. -

        -

        - 2. The return-type of operator|() is otherwise unspecified. -

        -

        - 3. operator|() - is found by Argument Dependent Lookup (ADL) because a range adaptor is - implemented in namespace boost::adaptors. -

        -

        - 4. operator|() - is used to add new behaviour lazily - and never modifies its left argument. -

        -

        - 5. All iterators extracted from the left argument are extracted using qualified - calls to boost::begin() - and boost::end(). -

        -

        - 6. In addition to the throw-clauses - below, operator|() - may throw exceptions as a result of copying iterators. If such copying - cannot throw an exception, then neither can the whole expression. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/introduction.html b/libs/range/doc/html/range/reference/adaptors/introduction.html deleted file mode 100644 index 3100d1cfb..000000000 --- a/libs/range/doc/html/range/reference/adaptors/introduction.html +++ /dev/null @@ -1,279 +0,0 @@ - - - -Introduction and motivation - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - A Range Adaptor is a class that wraps - an existing Range to provide a new Range with different behaviour. Since - the behaviour of Ranges is determined by their associated iterators, a - Range Adaptor simply wraps the underlying iterators with new special iterators. - In this example -

        -

        -

        -
        #include <boost/range/adaptors.hpp>
        -#include <boost/range/algorithm.hpp>
        -#include <iostream>
        -#include <vector>
        -
        -std::vector<int> vec;
        -boost::copy( vec | boost::adaptors::reversed,
        -             std::ostream_iterator<int>(std::cout) );
        -
        -

        -

        -

        - the iterators from vec - are wrapped reverse_iterators. - The type of the underlying Range Adapter is not documented because you - do not need to know it. All that is relevant is that the expression -

        -

        -

        -
        vec | boost::adaptors::reversed
        -
        -

        -

        -

        - returns a Range Adaptor where the iterator type is now the iterator type - of the range vec wrapped - in reverse_iterator. The - expression boost::adaptors::reversed is called an Adaptor - Generator. -

        -

        - There are two ways of constructing a range adaptor. The first is by using - operator|(). - This is my preferred technique, however while discussing range adaptors - with others it became clear that some users of the library strongly prefer - a more familiar function syntax, so equivalent functions of the present - tense form have been added as an alternative syntax. The equivalent to - rng | - reversed is adaptors::reverse(rng) for example. -

        -

        - Why do I prefer the operator| syntax? The answer is readability: -

        -

        -

        -
        std::vector<int> vec;
        -boost::copy( boost::adaptors::reverse(vec),
        -             std::ostream_iterator<int>(std::cout) );
        -
        -

        -

        -

        - This might not look so bad, but when we apply several adaptors, it becomes - much worse. Just compare -

        -

        -

        -
        std::vector<int> vec;
        -boost::copy( boost::adaptors::unique( boost::adaptors::reverse( vec ) ),
        -             std::ostream_iterator<int>(std::cout) );
        -
        -

        -

        -

        - to -

        -

        -

        -
        std::vector<int> vec;
        -boost::copy( vec | boost::adaptors::reversed
        -                 | boost::adaptors::uniqued,
        -             std::ostream_iterator<int>(std::cout) );
        -
        -

        -

        -

        - Furthermore, some of the adaptor generators take arguments themselves and - these arguments are expressed with function call notation too. In those - situations, you will really appreciate the succinctness of operator|(). -

        -
        - - Composition - of Adaptors -
        -

        - Range Adaptors are a powerful complement to Range algorithms. The reason - is that adaptors are orthogonal - to algorithms. For example, consider these Range algorithms: -

        -
          -
        • - boost::copy( rng, out ) -
        • -
        • - boost::count( - rng, - pred ) -
        • -
        -

        - What should we do if we only want to copy an element a - if it satisfies some predicate, say pred(a)? - And what if we only want to count the elements that satisfy the same predicate? - The naive answer would be to use these algorithms: -

        -
          -
        • - boost::copy_if( - rng, - pred, - out ) -
        • -
        • - boost::count_if( - rng, - pred ) -
        • -
        -

        - These algorithms are only defined to maintain a one to one relationship - with the standard library algorithms. This approach of adding algorithm - suffers a combinatorial explosion. Inevitably many algorithms are missing - _if variants and there - is redundant development overhead for each new algorithm. The Adaptor Generator - is the design solution to this problem. It is conceivable that some algorithms - are capable of optimization by tightly coupling the filter with the algorithm. - The adaptors provide a more general solution with superior separation of - orthogonal concerns. -

        -
        - - Range - Adaptor alternative to copy_if algorithm -
        -

        -

        -
        boost::copy_if( rng, pred, out );
        -
        -

        - can be expressed as -

        -
        boost::copy( rng | boost::adaptors::filtered(pred), out );
        -
        -

        -

        -
        - - Range - Adaptor alternative to count_if algorithm -
        -

        -

        -
        boost::count_if( rng, pred );
        -
        -

        - can be expressed as -

        -
        boost::size( rng | boost::adaptors::filtered(pred) );
        -
        -

        -

        -

        - What this means is that many algorithms no longer require nor benefit from - an optimized implementation with an _if - suffix. Furthermore, it turns out that algorithms with the _copy suffix are often not needed either. - Consider replace_copy_if() which may be used as -

        -

        -

        -
        std::vector<int> vec;
        -boost::replace_copy_if( rng, std::back_inserter(vec), pred, new_value );
        -
        -

        -

        -

        - With adaptors and algorithms we can express this as -

        -

        -

        -
        std::vector<int> vec;
        -boost::push_back(vec, rng | boost::adaptors::replaced_if(pred, new_value));
        -
        -

        -

        -

        - The latter code has several benefits: -

        -

        - 1. it is more efficient - because we avoid extra allocations as might happen with std::back_inserter -

        -

        - 2. it is flexible - as we can subsequently apply even more adaptors, for example: -

        -
        boost::push_back(vec, rng | boost::adaptors::replaced_if(pred, new_value)
        -                          | boost::adaptors::reversed);
        -
        -

        -

        -

        - 3. it is safer because - there is no use of an unbounded output iterator. -

        -

        - In this manner, the composition - of Range Adaptors has the following consequences: -

        -

        - 1. we no longer need many of the _if, - _copy, _copy_if - and _n variants of algorithms. -

        -

        - 2. we can generate a multitude of new algorithms on the fly, for example, - above we generated reverse_replace_copy_if() -

        -

        - In other words: -

        -

        - Range Adaptors are to algorithms what algorithms - are to containers -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference.html b/libs/range/doc/html/range/reference/adaptors/reference.html deleted file mode 100644 index 847e560b6..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference.html +++ /dev/null @@ -1,62 +0,0 @@ - - - -Reference - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/adjacent_filtered.html b/libs/range/doc/html/range/reference/adaptors/reference/adjacent_filtered.html deleted file mode 100644 index 6cdefd67d..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/adjacent_filtered.html +++ /dev/null @@ -1,160 +0,0 @@ - - - -adjacent_filtered - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::adjacent_filtered(bi_pred) -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::adjacent_filter(rng, - bi_pred) -

        -
        -
          -
        • - Precondition: The value_type of the range is convertible - to both argument types of bi_pred. -
        • -
        • - Postcondition: For all adjacent - elements [x,y] in the returned range, bi_pred(x,y) - is true. -
        • -
        • - Throws: Whatever the copy constructor - of bi_pred might - throw. -
        • -
        • - Range Category: Forward - Range -
        • -
        • - Return Type: boost::adjacent_filtered_range<decltype(rng), decltype(bi_pred)> -
        • -
        • - Returned Range Category: The minimum - of the range category of rng - and Forward Range -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/adjacent_filtered.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <functional>
        -#include <iostream>
        -#include <vector>
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::assign;
        -    using namespace boost::adaptors;
        -
        -    std::vector<int> input;
        -    input += 1,1,2,2,2,3,4,5,6;
        -
        -    boost::copy(
        -        input | adjacent_filtered(std::not_equal_to<int>()),
        -        std::ostream_iterator<int>(std::cout, ","));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        1,2,3,4,5,6,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/copied.html b/libs/range/doc/html/range/reference/adaptors/reference/copied.html deleted file mode 100644 index ec615b4c4..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/copied.html +++ /dev/null @@ -1,156 +0,0 @@ - - - -copied - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -copied -
        - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::copied(n, - m) -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::copy(rng, - n, - m) -

        -
        -
          -
        • - Precondition: 0 - <= n - && n - <= m - && m - < distance(rng) -
        • -
        • - Returns: A new iterator_range - that holds the sliced range [n,m) - of the original range. -
        • -
        • - Range Category: Random - Access Range -
        • -
        • - Returned Range Category: Random - Access Range -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/copied.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <vector>
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::assign;
        -    using namespace boost::adaptors;
        -
        -    std::vector<int> input;
        -    input += 1,2,3,4,5,6,7,8,9,10;
        -
        -    boost::copy(
        -        input | copied(1, 5),
        -        std::ostream_iterator<int>(std::cout, ","));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        2,3,4,5,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/filtered.html b/libs/range/doc/html/range/reference/adaptors/reference/filtered.html deleted file mode 100644 index 1884507a2..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/filtered.html +++ /dev/null @@ -1,163 +0,0 @@ - - - -filtered - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::filtered(pred) -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::filter(rng, - pred) -

        -
        -
          -
        • - Precondition: The value_type of the range is convertible - to the argument type of pred. -
        • -
        • - Postcondition: For all elements - [x] in the returned range, pred(x) - is true. -
        • -
        • - Throws: Whatever the copy constructor - of pred might throw. -
        • -
        • - Range Category: __singlepass_range__ -
        • -
        • - Range Return Type: boost::filtered_range<decltype(rng)> -
        • -
        • - Returned Range Category: The minimum - of the range category of rng - and Bidirectional - Range -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/filtered.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <vector>
        -
        -struct is_even
        -{
        -    bool operator()( int x ) const { return x % 2 == 0; }
        -};
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::assign;
        -    using namespace boost::adaptors;
        -
        -    std::vector<int> input;
        -    input += 1,2,3,4,5,6,7,8,9;
        -
        -    boost::copy(
        -        input | filtered(is_even()),
        -        std::ostream_iterator<int>(std::cout, ","));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        2,4,6,8,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/indexed.html b/libs/range/doc/html/range/reference/adaptors/reference/indexed.html deleted file mode 100644 index e6a485ce0..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/indexed.html +++ /dev/null @@ -1,244 +0,0 @@ - - - -indexed - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::indexed() -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::indexed(start_index) -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::index(rng) -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::index(rng, - start_index) -

        -
        -
        - - Description -
        -

        - The index within each returned boost::range::index_value - is equal to start_index - + the offset of the element from the beginning of the range. In the versions - of the functions that omit start_index - the starting index is taken to be 0. -

        -
          -
        • - Purpose: Adapt rng - to return elements that have the corresponding value from rng and a numeric index. -
        • -
        • - Returns: A range adapted to return - both the element and the associated index. The returned range has - elements of type: -
        • -
        -

        -

        -
        boost::range::index_value<
        -    typename boost::range_reference<decltype(rng)>::type,
        -    typename boost::range_difference<decltype(rng)>::type
        ->
        -
        -

        -

        -

        - The synopsis of index_value is as follows: -

        -
        template<class T, class Indexable=std::ptrdiff_t>
        -class index_value : public boost::tuple<Indexable, T>
        -{
        -public:
        -
        -    typedef ...unspecified...       index_type;
        -    typedef ...unspecified...       const_index_type;
        -
        -    typedef ...unspecified...       value_type;
        -    typedef ...unspecified...       const_value_type;
        -
        -    // ...unspecified... constructors
        -
        -    index_type index();
        -    const_index_type index() const;
        -
        -    value_type value();
        -    const_value_type value() const;
        -};
        -
        -

        -

        -
        -
        - -

        -

        -
        #include <boost/range/adaptor/indexed.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <vector>
        -
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::assign;
        -    using namespace boost::adaptors;
        -
        -    std::vector<int> input;
        -    input += 10,20,30,40,50,60,70,80,90;
        -
        -    for (const auto& element : input | indexed(0))
        -    {
        -        std::cout << "Element = " << element.value()
        -                  << " Index = " << element.index()
        -                  << std::endl;
        -    }
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        Element = 10 Index = 0
        -Element = 20 Index = 1
        -Element = 30 Index = 2
        -Element = 40 Index = 3
        -Element = 50 Index = 4
        -Element = 60 Index = 5
        -Element = 70 Index = 6
        -Element = 80 Index = 7
        -Element = 90 Index = 8
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/indirected.html b/libs/range/doc/html/range/reference/adaptors/reference/indirected.html deleted file mode 100644 index 0c107bfe6..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/indirected.html +++ /dev/null @@ -1,156 +0,0 @@ - - - -indirected - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::indirected -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::indirect(rng) -

        -
        -
          -
        • - Precondition: The value_type of the range defines - unary operator*() -
        • -
        • - Postcondition: For all elements - x in the returned - range, x is the result - of *y - where y is the corresponding - element in the original range. -
        • -
        • - Range Category: Single - Pass Range -
        • -
        • - Range Return Type: boost::indirected_range<decltype(rng)> -
        • -
        • - Returned Range Category: The range - category of rng -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/indirected.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/shared_ptr.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <vector>
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::adaptors;
        -
        -    std::vector<boost::shared_ptr<int> > input;
        -
        -    for (int i = 0; i < 10; ++i)
        -        input.push_back(boost::shared_ptr<int>(new int(i)));
        -
        -    boost::copy(
        -        input | indirected,
        -        std::ostream_iterator<int>(std::cout, ","));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        0,1,2,3,4,5,6,7,8,9,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/map_keys.html b/libs/range/doc/html/range/reference/adaptors/reference/map_keys.html deleted file mode 100644 index 5a46cf2c7..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/map_keys.html +++ /dev/null @@ -1,156 +0,0 @@ - - - -map_keys - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::map_keys -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::keys(rng) -

        -
        -
          -
        • - Precondition: The value_type of the range is an instantiation - of std::pair. -
        • -
        • - Postcondition: For all elements - x in the returned - range, x is the result - of y.first where y - is the corresponding element in the original range. -
        • -
        • - Range Category: Single - Pass Range -
        • -
        • - Range Return Type: boost::select_first_range<decltype(rng)> -
        • -
        • - Returned Range Category: The range - category of rng. -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/map.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <map>
        -#include <vector>
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::assign;
        -    using namespace boost::adaptors;
        -
        -    std::map<int,int> input;
        -    for (int i = 0; i < 10; ++i)
        -        input.insert(std::make_pair(i, i * 10));
        -
        -    boost::copy(
        -        input | map_keys,
        -        std::ostream_iterator<int>(std::cout, ","));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        0,1,2,3,4,5,6,7,8,9,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/map_values.html b/libs/range/doc/html/range/reference/adaptors/reference/map_values.html deleted file mode 100644 index 8acb6738c..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/map_values.html +++ /dev/null @@ -1,158 +0,0 @@ - - - -map_values - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::map_values -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::values(rng) -

        -
        -
          -
        • - Precondition: The value_type of the range is an instantiation - of std::pair. -
        • -
        • - Postcondition: For all elements - x in the returned - range, x is the result - of y.second where y - is the corresponding element in the original range. -
        • -
        • - Range Category: Single - Pass Range -
        • -
        • - Range Return Type: for constant - ranges, boost::select_second_const<decltype(rng)> - otherwise boost:select_second_mutable<decltype(rng)> -
        • -
        • - Returned Range Category: The range - category of rng. -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/map.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <map>
        -#include <vector>
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::assign;
        -    using namespace boost::adaptors;
        -
        -    std::map<int,int> input;
        -    for (int i = 0; i < 10; ++i)
        -        input.insert(std::make_pair(i, i * 10));
        -
        -    boost::copy(
        -        input | map_values,
        -        std::ostream_iterator<int>(std::cout, ","));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        0,10,20,30,40,50,60,70,80,90,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/replaced.html b/libs/range/doc/html/range/reference/adaptors/reference/replaced.html deleted file mode 100644 index bb763a4b3..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/replaced.html +++ /dev/null @@ -1,172 +0,0 @@ - - - -replaced - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::replaced(new_value, - old_value) -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::replace(rng, - new_value, - old_value) -

        -
        -
          -
        • - Precondition: -
            -
          • - new_value is - convertible to the value_type - of the range. -
          • -
          • - old_value is - convertible to the value_type - of the range. -
          • -
          -
        • -
        • - Postcondition: For all elements - x in the returned - range, the value x - is equal to the value of (y == - old_value) - ? new_value - : y - where y is the corresponding - element in the original range. -
        • -
        • - Range Category: Single - Pass Range -
        • -
        • - Range Return Type: boost::replaced_range<decltype(rng)> -
        • -
        • - Returned Range Category: The range - category of rng. -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/replaced.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <vector>
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::adaptors;
        -    using namespace boost::assign;
        -
        -    std::vector<int> input;
        -    input += 1,2,3,2,5,2,7,2,9;
        -
        -    boost::copy(
        -        input | replaced(2, 10),
        -        std::ostream_iterator<int>(std::cout, ","));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        1,10,3,10,5,10,7,10,9,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/replaced_if.html b/libs/range/doc/html/range/reference/adaptors/reference/replaced_if.html deleted file mode 100644 index b700afa27..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/replaced_if.html +++ /dev/null @@ -1,173 +0,0 @@ - - - -replaced_if - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::replaced_if(pred, - new_value) -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::replace_if(rng, - pred, - new_value) -

        -
        -
          -
        • - Precondition: -
            -
          • - The range value_type - is convertible to the argument type of pred. -
          • -
          • - new_value is - convertible to the value_type - of the range. -
          • -
          -
        • -
        • - Postconditions: For all elements - x in the returned - range, the value x - is equal to the value of pred(y) ? new_value : - y where y - is the corresponding element in the original range. -
        • -
        • - Range Category: Single - Pass Range -
        • -
        • - Range Return Type: boost::replaced_if_range<decltype(rng)> -
        • -
        • - Returned Range Category: The range - category of rng. -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/replaced_if.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <vector>
        -
        -struct is_even
        -{
        -    bool operator()(int x) const { return x % 2 == 0; }
        -};
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::adaptors;
        -    using namespace boost::assign;
        -
        -    std::vector<int> input;
        -    input += 1,2,3,4,5,6,7,8,9;
        -
        -    boost::copy(
        -        input | replaced_if(is_even(), 10),
        -        std::ostream_iterator<int>(std::cout, ","));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        1,10,3,10,5,10,7,10,9,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/reversed.html b/libs/range/doc/html/range/reference/adaptors/reference/reversed.html deleted file mode 100644 index c27fb0ebc..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/reversed.html +++ /dev/null @@ -1,147 +0,0 @@ - - - -reversed - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::reversed -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::reverse(rng) -

        -
        -
          -
        • - Returns: A range whose iterators - behave as if they were the original iterators wrapped in reverse_iterator. -
        • -
        • - Range Category: Bidirectional - Range -
        • -
        • - Range Return Type: boost::reversed_range<decltype(rng)> -
        • -
        • - Returned Range Category: The range - category of rng. -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/reversed.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <vector>
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::adaptors;
        -    using namespace boost::assign;
        -
        -    std::vector<int> input;
        -    input += 1,2,3,4,5,6,7,8,9;
        -
        -    boost::copy(
        -        input | reversed,
        -        std::ostream_iterator<int>(std::cout, ","));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        9,8,7,6,5,4,3,2,1,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/sliced.html b/libs/range/doc/html/range/reference/adaptors/reference/sliced.html deleted file mode 100644 index 45a03c8c4..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/sliced.html +++ /dev/null @@ -1,157 +0,0 @@ - - - -sliced - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -sliced -
        - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::sliced(n, - m) -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::slice(rng, - n, - m) -

        -
        -
          -
        • - Precondition: 0 - <= n - && n - <= m - && m - < distance(rng) -
        • -
        • - Returns: make_range(rng, n, m) -
        • -
        • - Range Category: Random - Access Range -
        • -
        • - Range Return Type: boost::sliced_range<decltype(rng)> -
        • -
        • - Returned Range Category: Random - Access Range -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/sliced.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <vector>
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::adaptors;
        -    using namespace boost::assign;
        -
        -    std::vector<int> input;
        -    input += 1,2,3,4,5,6,7,8,9;
        -
        -    boost::copy(
        -        input | sliced(2, 5),
        -        std::ostream_iterator<int>(std::cout, ","));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        3,4,5,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/strided.html b/libs/range/doc/html/range/reference/adaptors/reference/strided.html deleted file mode 100644 index b4fddaaa1..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/strided.html +++ /dev/null @@ -1,149 +0,0 @@ - - - -strided - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::strided(n) -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::stride(rng, - n) -

        -
        -
          -
        • - Precondition: 0 - <= n. -
        • -
        • - Returns: A new range based on rng where traversal is performed - in steps of n. -
        • -
        • - Range Category: Single - Pass Range -
        • -
        • - Returned Range Category: The range - category of rng. -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/strided.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <vector>
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::adaptors;
        -    using namespace boost::assign;
        -
        -    std::vector<int> input;
        -    input += 1,2,3,4,5,6,7,8,9,10;
        -
        -    boost::copy(
        -        input | strided(2),
        -        std::ostream_iterator<int>(std::cout, ","));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        1,3,5,7,9,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/tokenized.html b/libs/range/doc/html/range/reference/adaptors/reference/tokenized.html deleted file mode 100644 index 8d1a69609..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/tokenized.html +++ /dev/null @@ -1,197 +0,0 @@ - - - -tokenized - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        -

        -
        rng | boost::adaptors::tokenized(regex)
        -rng | boost::adaptors::tokenized(regex, i)
        -rng | boost::adaptors::tokenized(regex, rndRng)
        -rng | boost::adaptors::tokenized(regex, i, flags)
        -rng | boost::adaptors::tokenized(regex, rndRng, flags)
        -
        -

        -

        -
        -

        - Function -

        -
        -

        -

        -
        boost::adaptors::tokenize(rng, regex)
        -boost::adaptors::tokenize(rng, regex, i)
        -boost::adaptors::tokenize(rng, regex, rndRng)
        -boost::adaptors::tokenize(rng, regex, i, flags)
        -boost::adaptors::tokenize(rng, regex, rndRng, flags)
        -
        -

        -

        -
        -
          -
        • - Precondition: -
            -
          • - Let T denote - typename range_value<decltype(rng)>::type, - then regex - has the type basic_regex<T> or is implicitly convertible - to one of these types. -
          • -
          • - i has the type - int. -
          • -
          • - the value_type - of rndRng is - int. -
          • -
          • - flags has the - type regex_constants::syntax_option_type. -
          • -
          -
        • -
        • - Returns: A range whose iterators - behave as if they were the original iterators wrapped in regex_token_iterator. The first - iterator in the range would be constructed by forwarding all the - arguments of tokenized() to the regex_token_iterator - constructor. -
        • -
        • - Throws: Whatever constructing and - copying equivalent regex_token_iterators - might throw. -
        • -
        • - Range Category: Random - Access Range -
        • -
        • - Range Return Type: boost::tokenized_range<decltype(rng)> -
        • -
        • - Returned Range Category: Random - Access Range -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/tokenized.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <vector>
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::adaptors;
        -
        -    typedef boost::sub_match< std::string::iterator > match_type;
        -
        -    std::string input = " a b c d e f g hijklmnopqrstuvwxyz";
        -    boost::copy(
        -        input | tokenized(boost::regex("\\w+")),
        -        std::ostream_iterator<match_type>(std::cout, "\n"));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        a
        -b
        -c
        -d
        -e
        -f
        -g
        -hijklmnopqrstuvwxyz
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/transformed.html b/libs/range/doc/html/range/reference/adaptors/reference/transformed.html deleted file mode 100644 index 145e03c12..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/transformed.html +++ /dev/null @@ -1,166 +0,0 @@ - - - -transformed - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::transformed(fun) -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::transform(rng, - fun) -

        -
        -
          -
        • - Precondition: The value_type of the range is convertible - to the argument type of fun. -
        • -
        • - Postcondition: For all elements - x in the returned - range, x is the result - of fun(y) - where y is the corresponding - element in the original range. -
        • -
        • - Throws: Whatever the copy-constructor - of fun might throw. -
        • -
        • - Range Category: Single - Pass Range -
        • -
        • - Range Return Type: boost::transformed_range<decltype(rng)> -
        • -
        • - Returned Range Category: The range - category of rng. -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/transformed.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <vector>
        -
        -struct double_int
        -{
        -    typedef int result_type;
        -    int operator()(int x) const { return x * 2; }
        -};
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::adaptors;
        -    using namespace boost::assign;
        -
        -    std::vector<int> input;
        -    input += 1,2,3,4,5,6,7,8,9,10;
        -
        -    boost::copy(
        -        input | transformed(double_int()),
        -        std::ostream_iterator<int>(std::cout, ","));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        2,4,6,8,10,12,14,16,18,20,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/type_erased.html b/libs/range/doc/html/range/reference/adaptors/reference/type_erased.html deleted file mode 100644 index beaa49545..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/type_erased.html +++ /dev/null @@ -1,304 +0,0 @@ - - - -type_erased - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::type_erased<Value, - Traversal, - Reference, - Difference, - Buffer>() -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::type_erase(rng, - boost::adaptors::type_erased<Value, - Traversal, - Reference, - Difference, - Buffer>) -

        -
        -

        - Please note that it is frequently unnecessary to use the type_erased adaptor. It is often better - to use the implicit conversion to any_range. -

        -

        - Let Rng be the type of - rng. -

        -
          -
        • - Template parameters: -
            -
          • - Value is the - value_type - for the any_range. - If this is set to boost::use_default, Value - will be calculated from the range type when the adaptor is - applied. -
          • -
          • - Traversal is - the tag used to identify the traversal of the resultant range. - Frequently it is desirable to set a traversal category lower - than the source container or range to maximize the number of - ranges that can convert to the any_range. - If this is left as boost::use_default then Traversal - will be typename boost::iterator_traversal<boost::range_iterator<Rng>::type>::type -
          • -
          • - Reference is - the reference - for the any_range. - boost::use_default will equate to - typename range_reference<Rng>::type. -
          • -
          • - Difference - is the difference_type - for the any_range. boost::use_default - will equate to typename - boost::range_difference<Rng>::type -
          • -
          • - Buffer is the - storage used to allocate the underlying iterator wrappers. - This can typically be ignored, but is available as a template - parameter for customization. Buffer must be a model of the - AnyIteratorBufferConcept. -
          • -
          -
        • -
        • - Precondition: Traversal - is one of { boost::use_default, boost::single_pass_traversal_tag, boost::forward_traversal_tag, boost::bidirectional_traversal_tag, boost::random_access_traversal_tag - } -
        • -
        • - Returns: The returned value is the - same as typename any_range_type_generator< Rng, Value, Traversal, Reference, Difference, Buffer - > that represents rng in a type-erased manner. -
        • -
        • - Range Category: Single - Pass Range -
        • -
        • - Returned Range Category: if Traversal was specified as boost::use_default then typename boost::iterator_traversal<boost::range_iterator<Rng>::type>::type, - otherwise Traversal. -
        • -
        -
        - - AnyIteratorBufferConcept -
        -

        -

        -
        class AnyIteratorBufferConcept
        -{
        -public:
        -    AnyIteratorBufferConcept();
        -    ~AnyIteratorBufferConcept();
        -
        -    // bytes is the requested size to allocate. This function
        -    // must return a pointer to an adequate area of memory.
        -    // throws: bad_alloc
        -    //
        -    // The buffer will only ever have zero or one
        -    // outstanding memory allocations.
        -    void* allocate(std::size_t bytes);
        -
        -    // deallocate this buffer
        -    void deallocate();
        -};
        -
        -

        -

        -
        - -

        -

        -
        #include <boost/range/adaptor/type_erased.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <boost/foreach.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <list>
        -#include <vector>
        -
        -// The client interface from an OO perspective merely requires a sequence
        -// of integers that can be forward traversed
        -typedef boost::any_range<
        -    int
        -  , boost::forward_traversal_tag
        -  , int
        -  , std::ptrdiff_t
        -> integer_range;
        -
        -namespace server
        -{
        -    void display_integers(const integer_range& rng)
        -    {
        -        boost::copy(rng,
        -                    std::ostream_iterator<int>(std::cout, ","));
        -
        -        std::cout << std::endl;
        -    }
        -}
        -
        -namespace client
        -{
        -    void run()
        -    {
        -        using namespace boost::assign;
        -        using namespace boost::adaptors;
        -
        -        // Under most conditions one would simply use an appropriate
        -        // any_range as a function parameter. The type_erased adaptor
        -        // is often superfluous. However because the type_erased
        -        // adaptor is applied to a range, we can use default template
        -        // arguments that are generated in conjunction with the
        -        // range type to which we are applying the adaptor.
        -
        -        std::vector<int> input;
        -        input += 1,2,3,4,5;
        -
        -        // Note that this call is to a non-template function
        -        server::display_integers(input);
        -
        -        std::list<int> input2;
        -        input2 += 6,7,8,9,10;
        -
        -        // Note that this call is to the same non-tempate function
        -        server::display_integers(input2);
        -
        -        input2.clear();
        -        input2 += 11,12,13,14,15;
        -
        -        // Calling using the adaptor looks like this:
        -        // Notice that here I have a type_erased that would be a
        -        // bidirectional_traversal_tag, but this is convertible
        -        // to the forward_traversal_tag equivalent hence this
        -        // works.
        -        server::display_integers(input2 | type_erased<>());
        -
        -        // However we may simply wish to define an adaptor that
        -        // takes a range and makes it into an appropriate
        -        // forward_traversal any_range...
        -        typedef boost::adaptors::type_erased<
        -            boost::use_default
        -          , boost::forward_traversal_tag
        -        > type_erased_forward;
        -
        -        // This adaptor can turn other containers with different
        -        // value_types and reference_types into the appropriate
        -        // any_range.
        -
        -        server::display_integers(input2 | type_erased_forward());
        -    }
        -}
        -
        -int main(int argc, const char* argv[])
        -{
        -    client::run();
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        1,2,3,4,5,
        -6,7,8,9,10,
        -11,12,13,14,15,
        -11,12,13,14,15,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/adaptors/reference/uniqued.html b/libs/range/doc/html/range/reference/adaptors/reference/uniqued.html deleted file mode 100644 index c07cc95fa..000000000 --- a/libs/range/doc/html/range/reference/adaptors/reference/uniqued.html +++ /dev/null @@ -1,152 +0,0 @@ - - - -uniqued - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        ---- - - - - - - - - - - - - - - -
        -

        - Syntax -

        -
        -

        - Code -

        -
        -

        - Pipe -

        -
        -

        - rng | - boost::adaptors::uniqued -

        -
        -

        - Function -

        -
        -

        - boost::adaptors::unique(rng) -

        -
        -
          -
        • - Precondition: The value_type of the range is comparable - with operator==(). -
        • -
        • - Postcondition: For all adjacent - elements [x,y] in the returned range, x==y is false. -
        • -
        • - Range Category: Forward - Range -
        • -
        • - Range Return Type: boost::uniqued_range<decltype(rng)> -
        • -
        • - Returned Range Category: The minimum - of the range concept of rng - and Forward Range. -
        • -
        -
        - -

        -

        -
        #include <boost/range/adaptor/uniqued.hpp>
        -#include <boost/range/algorithm/copy.hpp>
        -#include <boost/assign.hpp>
        -#include <iterator>
        -#include <iostream>
        -#include <vector>
        -
        -int main(int argc, const char* argv[])
        -{
        -    using namespace boost::assign;
        -    using namespace boost::adaptors;
        -
        -    std::vector<int> input;
        -    input += 1,1,2,2,2,3,4,5,6;
        -
        -    boost::copy(
        -        input | uniqued,
        -        std::ostream_iterator<int>(std::cout, ","));
        -
        -    return 0;
        -}
        -
        -

        -

        -
        -

        - This would produce the output: -

        -
        1,2,3,4,5,6,
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms.html b/libs/range/doc/html/range/reference/algorithms.html deleted file mode 100644 index 31e0f534a..000000000 --- a/libs/range/doc/html/range/reference/algorithms.html +++ /dev/null @@ -1,57 +0,0 @@ - - - -Range Algorithms - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/heap.html b/libs/range/doc/html/range/reference/algorithms/heap.html deleted file mode 100644 index 669d3c1f6..000000000 --- a/libs/range/doc/html/range/reference/algorithms/heap.html +++ /dev/null @@ -1,50 +0,0 @@ - - - -Heap algorithms - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/heap/make_heap.html b/libs/range/doc/html/range/reference/algorithms/heap/make_heap.html deleted file mode 100644 index ebfb69a36..000000000 --- a/libs/range/doc/html/range/reference/algorithms/heap/make_heap.html +++ /dev/null @@ -1,143 +0,0 @@ - - - -make_heap - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class RandomAccessRange>
        -RandomAccessRange& make_heap(RandomAccessRange& rng);
        -
        -template<class RandomAccessRange>
        -const RandomAccessRange& make_heap(const RandomAccessRange& rng);
        -
        -template<class RandomAccessRange, class Compare>
        -RandomAccessRange& make_heap(RandomAccessRange& rng, Compare pred);
        -
        -template<class RandomAccessRange, class Compare>
        -const RandomAccessRange& make_heap(const RandomAccessRange& rng, Compare pred);
        -
        -

        -

        -
        - - Description -
        -

        - make_heap turns rng into a heap. -

        -

        - The ordering relationship is determined by using operator< in the non-predicate versions, and - by evaluating pred in - the predicate versions. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/heap_algorithm.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - RandomAccessRange's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type RandomAccessRange's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - Compare is a model - of the StrictWeakOrderingConcept. -
        • -
        • - RandomAccessRange's - value type is convertible to both of Compare's - argument types. -
        • -
        -
        - - Complexity -
        -

        - Linear. At most 3 * - distance(rng) - comparisons. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/heap/pop_heap.html b/libs/range/doc/html/range/reference/algorithms/heap/pop_heap.html deleted file mode 100644 index 8ddffab03..000000000 --- a/libs/range/doc/html/range/reference/algorithms/heap/pop_heap.html +++ /dev/null @@ -1,157 +0,0 @@ - - - -pop_heap - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class RandomAccessRange>
        -RandomAccessRange& pop_heap(RandomAccessRange& rng);
        -
        -template<class RandomAccessRange>
        -const RandomAccessRange& pop_heap(const RandomAccessRange& rng);
        -
        -template<class RandomAccessRange, class Compare>
        -RandomAccessRange& pop_heap(RandomAccessRange& rng, Compare pred);
        -
        -template<class RandomAccessRange, class Compare>
        -const RandomAccessRange& pop_heap(const RandomAccessRange& rng, Compare pred);
        -
        -

        -

        -
        - - Description -
        -

        - pop_heap removes the - largest element from the heap. It is assumed that begin(rng), prior(end(rng)) is already a heap (and therefore the - largest element is *begin(rng)). -

        -

        - The ordering relationship is determined by using operator< in the non-predicate versions, and - by evaluating pred in - the predicate versions. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/heap_algorithm.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - RandomAccessRange's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type RandomAccessRange's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - Compare is a model - of the StrictWeakOrderingConcept. -
        • -
        • - RandomAccessRange's - value type is convertible to both of Compare's - argument types. -
        • -
        -
        - - Precondition: -
        -
          -
        • - !empty(rng) -
        • -
        • - rng is a heap. -
        • -
        -
        - - Complexity -
        -

        - Logarithmic. At most 2 * - log(distance(rng)) - comparisons. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/heap/push_heap.html b/libs/range/doc/html/range/reference/algorithms/heap/push_heap.html deleted file mode 100644 index 777b33cc5..000000000 --- a/libs/range/doc/html/range/reference/algorithms/heap/push_heap.html +++ /dev/null @@ -1,155 +0,0 @@ - - - -push_heap - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class RandomAccessRange>
        -RandomAccessRange& push_heap(RandomAccessRange& rng);
        -
        -template<class RandomAccessRange>
        -const RandomAccessRange& push_heap(const RandomAccessRange& rng);
        -
        -template<class RandomAccessRange, class Compare>
        -RandomAccessRange& push_heap(RandomAccessRange& rng, Compare pred);
        -
        -template<class RandomAccessRange, class Compare>
        -const RandomAccessRange& push_heap(const RandomAccessRange& rng, Compare pred);
        -
        -

        -

        -
        - - Description -
        -

        - push_heap adds an element - to a heap. It is assumed that begin(rng), prior(end(rng)) is already a heap and that the element - to be added is *prior(end(rng)). -

        -

        - The ordering relationship is determined by using operator< in the non-predicate versions, and - by evaluating pred in - the predicate versions. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/heap_algorithm.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - RandomAccessRange's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type RandomAccessRange's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - Compare is a model - of the StrictWeakOrderingConcept. -
        • -
        • - RandomAccessRange's - value type is convertible to both of Compare's - argument types. -
        • -
        -
        - - Precondition: -
        -
          -
        • - !empty(rng) -
        • -
        • - [begin(rng), prior(end(rng))) is a heap. -
        • -
        -
        - - Complexity -
        -

        - Logarithmic. At most log(distance(rng)) comparisons. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/heap/sort_heap.html b/libs/range/doc/html/range/reference/algorithms/heap/sort_heap.html deleted file mode 100644 index df03c2e5f..000000000 --- a/libs/range/doc/html/range/reference/algorithms/heap/sort_heap.html +++ /dev/null @@ -1,152 +0,0 @@ - - - -sort_heap - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class RandomAccessRange>
        -RandomAccessRange& sort_heap(RandomAccessRange& rng);
        -
        -template<class RandomAccessRange>
        -const RandomAccessRange& sort_heap(const RandomAccessRange& rng);
        -
        -template<class RandomAccessRange, class Compare>
        -RandomAccessRange& sort_heap(RandomAccessRange& rng, Compare pred);
        -
        -template<class RandomAccessRange, class Compare>
        -const RandomAccessRange& sort_heap(const RandomAccessRange& rng, Compare pred);
        -
        -

        -

        -
        - - Description -
        -

        - sort_heap turns a heap - into a sorted range. -

        -

        - The ordering relationship is determined by using operator< in the non-predicate versions, and - by evaluating pred in - the predicate versions. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/heap_algorithm.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - RandomAccessRange's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type RandomAccessRange's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - Compare is a model - of the StrictWeakOrderingConcept. -
        • -
        • - RandomAccessRange's - value type is convertible to both of Compare's - argument types. -
        • -
        -
        - - Precondition: -
        -

        - rng is a heap. -

        -
        - - Complexity -
        -

        - At most N * - log(N) - comparisons, where N - is distance(rng). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/introduction.html b/libs/range/doc/html/range/reference/algorithms/introduction.html deleted file mode 100644 index cc5aea9f8..000000000 --- a/libs/range/doc/html/range/reference/algorithms/introduction.html +++ /dev/null @@ -1,254 +0,0 @@ - - - -Introduction and motivation - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - In its most simple form a Range Algorithm - (or range-based algorithm) is simply an iterator-based algorithm where - the two iterator arguments have been replaced by - one range argument. For example, we may write -

        -

        -

        -
        #include <boost/range/algorithm.hpp>
        -#include <vector>
        -
        -std::vector<int> vec = ...;
        -boost::sort(vec);
        -
        -

        -

        -

        - instead of -

        -

        -

        -
        std::sort(vec.begin(), vec.end());
        -
        -

        -

        -

        - However, the return type of range algorithms is almost always different - from that of existing iterator-based algorithms. -

        -

        - One group of algorithms, like boost::sort(), will simply return the same range so - that we can continue to pass the range around and/or further modify it. - Because of this we may write -

        -
        boost:unique(boost::sort(vec));
        -
        -

        - to first sort the range and then run unique() on the sorted range. -

        -

        - Algorithms like boost::unique() - fall into another group of algorithms that return (potentially) narrowed - views of the original range. By default boost::unique(rng) returns the range [boost::begin(rng), found) - where found denotes the - iterator returned by std::unique(boost::begin(rng), boost::end(rng)) -

        -

        - Therefore exactly the unique values can be copied by writing -

        -
        boost::copy(boost::unique(boost::sort(vec)),
        -            std::ostream_iterator<int>(std::cout));
        -
        -

        -

        -

        - Algorithms like boost::unique usually return the range: [boost::begin(rng), found). However, this behaviour may be changed - by supplying a range_return_value - as a template parameter to the algorithm: -

        -
        ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -

        - Expression -

        -
        -

        - Return -

        -
        -

        - boost::unique<boost::return_found>(rng) -

        -
        -

        - returns a single iterator like std::unique -

        -
        -

        - boost::unique<boost::return_begin_found>(rng) -

        -
        -

        - returns the range [boost::begin(rng), - found) - (this is the default) -

        -
        -

        - boost::unique<boost::return_begin_next>(rng) -

        -
        -

        - returns the range [boost::begin(rng), - boost::next(found)) -

        -
        -

        - boost::unique<boost::return_found_end>(rng) -

        -
        -

        - returns the range [found, - boost::end(rng)) -

        -
        -

        - boost::unique<boost::return_next_end>(rng) -

        -
        -

        - returns the range [boost::next(found),boost::end(rng)) -

        -
        -

        - boost::unique<boost::return_begin_end>(rng) -

        -
        -

        - returns the entire original range. -

        -
        -

        - This functionality has the following advantages: -

        -
          -
        1. - it allows for seamless functional-style - programming where you do not need to use named - local variables to store intermediate results -
        2. -
        3. - it is very safe - because the algorithm can verify out-of-bounds conditions and handle - tricky conditions that lead to empty ranges -
        4. -
        -

        - For example, consider how easy we may erase the duplicates in a sorted - container: -

        -

        -

        -
        std::vector<int> vec = ...;
        -boost::erase(vec, boost::unique<boost::return_found_end>(boost::sort(vec)));
        -
        -

        -

        -

        - Notice the use of boost::return_found_end. - What if we wanted to erase all the duplicates except one of them? In old-fashioned - STL-programming we might write -

        -

        -

        -
        // assume 'vec' is already sorted
        -std::vector<int>::iterator i = std::unique(vec.begin(), vec.end());
        -
        -// remember this check or you get into problems
        -if (i != vec.end())
        -    ++i;
        -
        -vec.erase(i, vec.end());
        -
        -

        -

        -

        - The same task may be accomplished simply with -

        -
        boost::erase(vec, boost::unique<boost::return_next_end>(vec));
        -
        -

        - and there is no need to worry about generating an invalid range. Furthermore, - if the container is complex, calling vec.end() several times will be more expensive - than using a range algorithm. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating.html b/libs/range/doc/html/range/reference/algorithms/mutating.html deleted file mode 100644 index 7b094b79e..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating.html +++ /dev/null @@ -1,76 +0,0 @@ - - - -Mutating algorithms - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/copy.html b/libs/range/doc/html/range/reference/algorithms/mutating/copy.html deleted file mode 100644 index 3efcab13e..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/copy.html +++ /dev/null @@ -1,115 +0,0 @@ - - - -copy - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -copy -
        -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange, class OutputIterator>
        -OutputIterator copy(const SinglePassRange& source_rng, OutputIterator out_it);
        -
        -

        -

        -
        - - Description -
        -

        - copy copies all elements - from source_rng to the - range [out_it, out_it - + distance(source_rng)). The return value is out_it + - distance(source_rng) -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/copy.hpp -

        -
        - - Requirements -
        -
          -
        • - SinglePassRange is - a model of the Single - Pass Range Concept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        • - The value_type of - Single Pass Range - Concept is convertible to a type in OutputIterator's - set of value types. -
        • -
        -
        - - Precondition: -
        -
          -
        • - out_it is not an - iterator within the source_rng. -
        • -
        • - [out_it, out_it - + distance(source_rng)) is a valid range. -
        • -
        -
        - - Complexity -
        -

        - Linear. Exactly distance(source_rng) assignments are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/copy_backward.html b/libs/range/doc/html/range/reference/algorithms/mutating/copy_backward.html deleted file mode 100644 index 29e0bb092..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/copy_backward.html +++ /dev/null @@ -1,124 +0,0 @@ - - - -copy_backward - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class BidirectionalRange, class BidirectionalOutputIterator>
        -    BidirectionalOutputIterator
        -        copy_backward(const BidirectionalRange& source_rng,
        -                      BidirectionalOutputIterator out_it);
        -
        -

        -

        -
        - - Description -
        -

        - copy_backward copies - all elements from source_rng - to the range [out_it - - distance(source_rng), out_it). -

        -

        - The values are copied in reverse order. The return value is out_it - - distance(source_rng). -

        -

        - Note well that unlike all other standard algorithms out_it - denotes the end of the output sequence. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/copy_backward.hpp -

        -
        - - Requirements -
        -
          -
        • - BidirectionalRange - is a model of Bidirectional - Range Concept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        • - The value_type of - Bidirectional - Range Concept is convertible to a type in OutputIterator's - set of value types. -
        • -
        -
        - - Precondition: -
        -
          -
        • - out_it is not an - iterator within the source_rng. -
        • -
        • - [out_it, out_it - + distance(source_rng)) is a valid range. -
        • -
        -
        - - Complexity -
        -

        - Linear. Exactly distance(source_rng) assignments are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/fill.html b/libs/range/doc/html/range/reference/algorithms/mutating/fill.html deleted file mode 100644 index 8e5e951ed..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/fill.html +++ /dev/null @@ -1,101 +0,0 @@ - - - -fill - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -fill -
        -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange, class Value>
        -ForwardRange& fill( ForwardRange& rng, const Value& val );
        -
        -

        -

        -
        - - Description -
        -

        - fill assigns the value - val to every element - in the range rng. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/fill.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - Value is a model - of the AssignableConcept. -
        • -
        • - Value is convertible - to ForwardRange's - value type. -
        • -
        -
        - - Complexity -
        -

        - Linear. Exactly distance(rng) assignments are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/fill_n.html b/libs/range/doc/html/range/reference/algorithms/mutating/fill_n.html deleted file mode 100644 index 25fcc916a..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/fill_n.html +++ /dev/null @@ -1,101 +0,0 @@ - - - -fill_n - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -fill_n -
        -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange, class Size, class Value>
        -ForwardRange& fill( ForwardRange& rng, Size n, const Value& val );
        -
        -

        -

        -
        - - Description -
        -

        - fill_n assigns the value - val to n elements in the range rng beginning with boost::begin(rng). -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/fill_n.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - Value is a model - of the AssignableConcept. -
        • -
        • - Value is convertible - to ForwardRange's - value type. -
        • -
        -
        - - Complexity -
        -

        - Linear. Exactly n assignments - are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/generate.html b/libs/range/doc/html/range/reference/algorithms/mutating/generate.html deleted file mode 100644 index d703bf689..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/generate.html +++ /dev/null @@ -1,120 +0,0 @@ - - - -generate - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange, class Generator>
        -ForwardRange& generate( ForwardRange& rng, Generator gen );
        -
        -template<class ForwardRange, class Generator>
        -const ForwardRange& generate( const ForwardRange& rng, Generator gen );
        -
        -

        -

        -
        - - Description -
        -

        - generate assigns the - result of gen() - to each element in range rng. - Returns the resultant range. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/generate.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - Generator is a model - of the GeneratorConcept. -
        • -
        • - The value_type of - SinglePassRange is - convertible to a type in OutputIterator's - set of value types. -
        • -
        -
        - - Precondition: -
        -
          -
        • - out_it is not an - iterator within rng. -
        • -
        • - [out_it, out_it - + distance(rng)) is a valid range. -
        • -
        -
        - - Complexity -
        -

        - Linear. Exactly distance(rng) assignments are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/inplace_merge.html b/libs/range/doc/html/range/reference/algorithms/mutating/inplace_merge.html deleted file mode 100644 index 7d43e78b7..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/inplace_merge.html +++ /dev/null @@ -1,186 +0,0 @@ - - - -inplace_merge - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class BidirectionalRange>
        -BidirectionalRange&
        -inplace_merge( BidirectionalRange& rng,
        -               typename range_iterator<BidirectionalRange>::type middle );
        -
        -template<class BidirectionalRange>
        -const BidirectionalRange&
        -inplace_merge( const BidirectionalRange& rng,
        -               typename range_iterator<const BidirectionalRange>::type middle );
        -
        -template<class BidirectionalRange, class BinaryPredicate>
        -BidirectionalRange&
        -inplace_merge( BidirectionalRange& rng,
        -               typename range_iterator<BidirectionalRange>::type middle,
        -               BinaryPredicate pred );
        -
        -template<class BidirectionalRange, class BinaryPredicate>
        -const BidirectionalRange&
        -inplace_merge( const BidirectionalRange& rng,
        -               typename range_iterator<const BidirectionalRange>::type middle,
        -               BinaryPredicate pred );
        -
        -

        -

        -
        - - Description -
        -

        - inplace_merge combines - two consecutive sorted ranges [begin(rng), middle) - and [middle, end(rng)) into a single sorted range [begin(rng), end(rng)). That is, it starts with a range [begin(rng), end(rng)) that consists of two pieces each of - which is in ascending order, and rearranges it so that the entire range - is in ascending order. inplace_merge - is stable, meaning both that the relative order of elements within each - input range is preserved. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/inplace_merge.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate version: -

        -
          -
        • - BidirectionalRange - is a model of the Bidirectional - Range Concept. -
        • -
        • - BidirectionalRange - is mutable. -
        • -
        • - range_value<BidirectionalRange>::type is a model of LessThanComparableConcept -
        • -
        • - The ordering on objects of range_type<BidirectionalRange>::type - is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate version: * BidirectionalRange is a model of the - Bidirectional Range - Concept. * BidirectionalRange - is mutable. * BinaryPredicate - is a model of the StrictWeakOrderingConcept. - * BidirectionalRange's - value type is convertible to both BinaryPredicate's - argument types. -

        -
        - - Precondition: -
        -
        - - For - the non-predicate version: -
        -
          -
        • - middle is in the - range rng. -
        • -
        • - [begin(rng), middle) is in ascending order. That is for - each pair of adjacent elements [x,y], - y < - x is false. -
        • -
        • - [middle, end(rng)) is in ascending order. That is - for each pair of adjacent elements [x,y], - y < - x is false. -
        • -
        -
        - - For - the predicate version: -
        -
          -
        • - middle is in the - range rng. -
        • -
        • - [begin(rng), middle) is in ascending order. That is for - each pair of adjacent elements [x,y], - pred(y,x) == false. -
        • -
        • - [middle, end(rng)) is in ascending order. That is - for each pair of adjacent elements [x,y], - pred(y,x) == false. -
        • -
        -
        - - Complexity -
        -

        - Worst case: O(N log(N)) -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/merge.html b/libs/range/doc/html/range/reference/algorithms/mutating/merge.html deleted file mode 100644 index 2afe9491c..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/merge.html +++ /dev/null @@ -1,256 +0,0 @@ - - - -merge - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -merge -
        -
        - - Prototype -
        -

        -

        -
        template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class OutputIterator
        -    >
        -OutputIterator merge(const SinglePassRange1& rng1,
        -                     const SinglePassRange2& rng2,
        -                     OutputIterator          out);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class OutputIterator,
        -    class BinaryPredicate
        -    >
        -OutputIterator merge(const SinglePassRange1& rng1,
        -                     const SinglePassRange2& rng2,
        -                     OutputIterator          out,
        -                     BinaryPredicate         pred);
        -
        -

        -

        -
        - - Description -
        -

        - merge combines two sorted - ranges rng1 and rng2 into a single sorted range by - copying elements. merge - is stable. The return value is out - + distance(rng1) + distance(rng2). -

        -

        - The two versions of merge - differ by how they compare the elements. -

        -

        - The non-predicate version uses the operator<() for the range value type. The predicate - version uses the predicate instead of operator<(). -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/merge.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate version: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - range_value<SinglePassRange1>::type is the same as range_value<SinglePassRange2>::type. -
        • -
        • - range_value<SinglePassRange1>::type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering on objects of range_value<SinglePassRange1>::type - is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        • - range_value<SinglePassRange1>::type is convertible to a type in - OutputIterator's - set of value types. -
        • -
        -

        - For the predicate version: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - range_value<SinglePassRange1>::type is the same as range_value<SinglePassRange2>::type. -
        • -
        • - BinaryPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - SinglePassRange1's - value type is convertible to both BinaryPredicate's - argument types. -
        • -
        • - range_value<SinglePassRange1>::type is convertible to a type in - OutputIterator's - set of value types. -
        • -
        -
        - - Precondition: -
        -
        - - For - the non-predicate version: -
        -
          -
        • - The elements of rng1 - are in ascending order. That is, for each adjacent element pair - [x,y] of rng1, - y < - x == - false. -
        • -
        • - The elements of rng2 - are in ascending order. That is, for each adjacent element pair - [x,y] of rng2, - y < - x == - false. -
        • -
        • - The ranges rng1 and - [out, out - + distance(rng1) + distance(rng2)) - do not overlap. -
        • -
        • - The ranges rng2 and - [out, out - + distance(rng1) + distance(rng2)) - do not overlap. -
        • -
        • - [out, out - + distance(rng1) + distance(rng2)) - is a valid range. -
        • -
        -
        - - For - the predicate version: -
        -
          -
        • - The elements of rng1 - are in ascending order. That is, for each adjacent element pair - [x,y], of rng1, - pred(y, x) == false. -
        • -
        • - The elements of rng2 - are in ascending order. That is, for each adjacent element pair - [x,y], of rng2, - pred(y, x) == false. -
        • -
        • - The ranges rng1 and - [out, out - + distance(rng1) + distance(rng2)) - do not overlap. -
        • -
        • - The ranges rng2 and - [out, out - + distance(rng1) + distance(rng2)) - do not overlap. -
        • -
        • - [out, out - + distance(rng1) + distance(rng2)) - is a valid range. -
        • -
        -
        - - Complexity -
        -

        - Linear. There are no comparisons if both rng1 - and rng2 are empty, otherwise - at most distance(rng1) + distance(rng2) - 1 - comparisons. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/nth_element.html b/libs/range/doc/html/range/reference/algorithms/mutating/nth_element.html deleted file mode 100644 index 08d722b54..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/nth_element.html +++ /dev/null @@ -1,150 +0,0 @@ - - - -nth_element - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class RandomAccessRange>
        -RandomAccessRange& nth_element(
        -    RandomAccessRange& rng,
        -    typename range_iterator<RandomAccessRange>::type nth);
        -
        -template<class RandomAccessRange>
        -const RandomAccessRange& nth_element(
        -    const RandomAccessRange& rng,
        -    typename range_iterator<const RandomAccessRange>::type nth);
        -
        -template<class RandomAccessRange>
        -RandomAccessRange& nth_element(
        -    RandomAccessRange& rng,
        -    typename range_iterator<RandomAccessRange>::type nth,
        -    BinaryPredicate sort_pred);
        -
        -template<class RandomAccessRange>
        -const RandomAccessRange& nth_element(
        -    const RandomAccessRange& rng,
        -    typename range_iterator<const RandomAccessRange>::type nth,
        -    BinaryPredicate sort_pred);
        -
        -

        -

        -
        - - Description -
        -

        - nth_element partially - orders a range of elements. nth_element - arranges the range rng - such that the element corresponding with the iterator nth - is the same as the element that would be in that position if rng has been sorted. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/nth_element.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate version: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - RandomAccessRange's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering relation on RandomAccessRange's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate version: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - BinaryPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - RandomAccessRange's - value type is convertible to both of BinaryPredicate's - argument types. -
        • -
        -
        - - Complexity -
        -

        - On average, linear in distance(rng). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/partial_sort.html b/libs/range/doc/html/range/reference/algorithms/mutating/partial_sort.html deleted file mode 100644 index 4b2169dc5..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/partial_sort.html +++ /dev/null @@ -1,155 +0,0 @@ - - - -partial_sort - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class RandomAccessRange>
        -RandomAccessRange& partial_sort(
        -    RandomAccessRange& rng,
        -    typename range_iterator<RandomAccessRange>::type middle);
        -
        -template<class RandomAccessRange>
        -const RandomAccessRange& partial_sort(
        -    const RandomAccessRange& rng,
        -    typename range_iterator<const RandomAccessRange>::type middle);
        -
        -template<class RandomAccessRange>
        -RandomAccessRange& partial_sort(
        -    RandomAccessRange& rng,
        -    typename range_iterator<RandomAccessRange>::type middle,
        -    BinaryPredicate sort_pred);
        -
        -template<class RandomAccessRange>
        -const RandomAccessRange& partial_sort(
        -    const RandomAccessRange& rng,
        -    typename range_iterator<const RandomAccessRange>::type middle,
        -    BinaryPredicate sort_pred);
        -
        -

        -

        -
        - - Description -
        -

        - partial_sort rearranges - the elements in rng. - It places the smallest distance(begin(rng), middle) elements, sorted in ascending order, - into the range [begin(rng), middle). The remaining elements are placed in - an unspecified order into [middle, last). -

        -

        - The non-predicative versions of this function specify that one element - is less than another by using operator<(). The predicate versions use the - predicate instead. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/partial_sort.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate version: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - RandomAccessRange's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering relation on RandomAccessRange's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate version: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - BinaryPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - RandomAccessRange's - value type is convertible to both of BinaryPredicate's - argument types. -
        • -
        -
        - - Complexity -
        -

        - Approximately distance(rng) * log(distance(begin(rng), middle)) comparisons. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/partition.html b/libs/range/doc/html/range/reference/algorithms/mutating/partition.html deleted file mode 100644 index 445c31767..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/partition.html +++ /dev/null @@ -1,135 +0,0 @@ - - - -partition - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class ForwardRange,
        -    class UnaryPredicate
        -    >
        -typename range_iterator<ForwardRange>::type
        -partition(ForwardRange& rng, UnaryPredicate pred);
        -
        -template<
        -    class ForwardRange,
        -    class UnaryPredicate
        -    >
        -typename range_iterator<const ForwardRange>::type
        -partition(const ForwardRange& rng, UnaryPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class UnaryPredicate
        -    >
        -typename range_return<ForwardRange, re>::type
        -partition(ForwardRange& rng, UnaryPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class UnaryPredicate
        -    >
        -typename range_return<const ForwardRange, re>::type
        -partition(const ForwardRange& rng, UnaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - partition orders the - elements in rng based - on pred, such that the - elements that satisfy pred - precede the elements that do not. In the versions that return a single - iterator, the return value is the middle iterator. In the versions that - have a configurable range_return, found - corresponds to the middle iterator. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/partition.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. For C++ versions prior to C++11 the underlying - std::partition requires Bidirectional Iterators, hence the requirement - for older library versions is for a Bidirectional - Range. -
        • -
        • - UnaryPredicate is - a model of the PredicateConcept. -
        • -
        • - ForwardRange's value - type is convertible to UnaryPredicate's - argument type. -
        • -
        -
        - - Complexity -
        -

        - Linear. Exactly distance(rng) applications of pred, - and at most distance(rng) / 2 - swaps. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/random_shuffle.html b/libs/range/doc/html/range/reference/algorithms/mutating/random_shuffle.html deleted file mode 100644 index 07db825b5..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/random_shuffle.html +++ /dev/null @@ -1,131 +0,0 @@ - - - -random_shuffle - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class RandomAccessRange>
        -RandomAccessRange& random_shuffle(RandomAccessRange& rng);
        -
        -template<class RandomAccessRange>
        -const RandomAccessRange& random_shuffle(const RandomAccessRange& rng);
        -
        -template<class RandomAccessRange, class Generator>
        -RandomAccessRange& random_shuffle(RandomAccessRange& rng, Generator& gen);
        -
        -template<class RandomAccessRange, class Generator>
        -const RandomAccessRange& random_shuffle(const RandomAccessRange& rng, Generator& gen);
        -
        -

        -

        -
        - - Description -
        -

        - random_shuffle randomly - rearranges the elements in rng. - The versions of random_shuffle - that do not specify a Generator - use an internal random number generator. The versions of random_shuffle that do specify a Generator use this instead. Returns - the shuffles range. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/random_shuffle.hpp -

        -
        - - Requirements -
        -

        - For the version without a Generator: -

        -
        -

        - For the version with a Generator: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - Generator is a model - of the RandomNumberGeneratorConcept. -
        • -
        • - RandomAccessRange's - distance type is convertible to Generator's - argument type. -
        • -
        -
        - - Precondition: -
        -
        • - distance(rng) - is less than gen's - maximum value. -
        -
        - - Complexity -
        -

        - Linear. If !empty(rng), exactly distance(rng) - 1 - swaps are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/remove.html b/libs/range/doc/html/range/reference/algorithms/mutating/remove.html deleted file mode 100644 index 10426c314..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/remove.html +++ /dev/null @@ -1,138 +0,0 @@ - - - -remove - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -remove -
        -
        - - Prototype -
        -

        -

        -
        template<
        -    class ForwardRange,
        -    class Value
        -    >
        -typename range_iterator<ForwardRange>::type
        -remove(ForwardRange& rng, const Value& val);
        -
        -template<
        -    class ForwardRange,
        -    class Value
        -    >
        -typename range_iterator<const ForwardRange>::type
        -remove(const ForwardRange& rng, const Value& val);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class Value
        -    >
        -typename range_return<ForwardRange,re>::type
        -remove(ForwardRange& rng, const Value& val);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class Value
        -    >
        -typename range_return<const ForwardRange,re>::type
        -remove(const ForwardRange& rng, const Value& val);
        -
        -

        -

        -
        - - Description -
        -

        - remove removes from - rng all of the elements - x for which x == val is true. - The versions of remove - that return an iterator, return an iterator new_last - such that the range [begin(rng), new_last) contains no elements equal to val. The range_return - versions of remove defines - found as the new last - element. The iterators in the range [new_last, - end(rng)) - are dereferenceable, but the elements are unspecified. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/remove.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - Value is a model - of the EqualityComparableConcept. -
        • -
        • - Objects of type Value - can be compared for equality with objects of ForwardRange's - value type. -
        • -
        -
        - - Complexity -
        -

        - Linear. remove performs - exactly distance(rng) - comparisons for equality. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/remove_copy.html b/libs/range/doc/html/range/reference/algorithms/mutating/remove_copy.html deleted file mode 100644 index b2d3ef554..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/remove_copy.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -remove_copy - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange, class Outputiterator, class Value>
        -OutputIterator
        -remove_copy(ForwardRange& rng, OutputIterator out, const Value& val);
        -
        -template<class ForwardRange, class OutputIterator, class Value>
        -OutputIterator
        -remove_copy(const ForwardRange& rng, OutputIterator out, const Value& val);
        -
        -

        -

        -
        - - Description -
        -

        - remove_copy copied all - of the elements x from - rng for which x == val is false. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/remove_copy.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - Value is a model - of the EqualityComparableConcept. -
        • -
        • - Objects of type Value - can be compared for equality with objects of ForwardRange's - value type. -
        • -
        -
        - - Complexity -
        -

        - Linear. remove_copy performs - exactly distance(rng) - comparisons for equality. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/remove_copy_if.html b/libs/range/doc/html/range/reference/algorithms/mutating/remove_copy_if.html deleted file mode 100644 index e1eeef105..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/remove_copy_if.html +++ /dev/null @@ -1,103 +0,0 @@ - - - -remove_copy_if - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange, class Outputiterator, class UnaryPred>
        -OutputIterator
        -remove_copy_if(ForwardRange& rng, OutputIterator out, UnaryPred pred);
        -
        -template<class ForwardRange, class OutputIterator, class UnaryPred>
        -OutputIterator
        -remove_copy_if(const ForwardRange& rng, OutputIterator out, UnaryPred pred);
        -
        -

        -

        -
        - - Description -
        -

        - remove_copy_if copied - all of the elements x - from rng for which pred(x) - is false. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/remove_copy_if.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - UnaryPred is a model - of the UnaryPredicateConcept. -
        • -
        -
        - - Complexity -
        -

        - Linear. remove_copy_if - performs exactly distance(rng) comparisons with UnaryPred. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/remove_if.html b/libs/range/doc/html/range/reference/algorithms/mutating/remove_if.html deleted file mode 100644 index 2fc6ead9c..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/remove_if.html +++ /dev/null @@ -1,137 +0,0 @@ - - - -remove_if - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class ForwardRange,
        -    class UnaryPredicate
        -    >
        -typename range_iterator<ForwardRange>::type
        -remove(ForwardRange& rng, UnaryPredicate pred);
        -
        -template<
        -    class ForwardRange,
        -    class UnaryPredicate
        -    >
        -typename range_iterator<const ForwardRange>::type
        -remove(const ForwardRange& rng, UnaryPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class UnaryPredicate
        -    >
        -typename range_return<ForwardRange,re>::type
        -remove(ForwardRange& rng, UnaryPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class UnaryPredicate
        -    >
        -typename range_return<const ForwardRange,re>::type
        -remove(const ForwardRange& rng, UnaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - remove_if removes from - rng all of the elements - x for which pred(x) - is true. The versions of - remove_if that return - an iterator, return an iterator new_last - such that the range [begin(rng), new_last) contains no elements where pred(x) - is true. The iterators in - the range [new_last, end(rng)) are dereferenceable, but the elements - are unspecified. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/remove_if.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - UnaryPredicate is - a model of the PredicateConcept. -
        • -
        • - ForwardRange's value - type is convertible to UnaryPredicate's - argument type. -
        • -
        -
        - - Complexity -
        -

        - Linear. remove_if performs - exactly distance(rng) - applications of pred. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/replace.html b/libs/range/doc/html/range/reference/algorithms/mutating/replace.html deleted file mode 100644 index 4641498b4..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/replace.html +++ /dev/null @@ -1,118 +0,0 @@ - - - -replace - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class ForwardRange,
        -    class Value
        -    >
        -ForwardRange& replace(ForwardRange& rng, const Value& what, const Value& with_what);
        -
        -template<
        -    class ForwardRange,
        -    class UnaryPredicate
        -    >
        -const ForwardRange& replace(const ForwardRange& rng, const Value& what, const Value& with_what);
        -
        -

        -

        -
        - - Description -
        -

        - replace every element - in rng equal to what with with_what. - Return a reference to rng. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/replace.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - Value is convertible - to ForwardRange's - value type. -
        • -
        • - Value is a model - of the AssignableConcept. -
        • -
        • - Value is a model - of the EqualityComparableConcept, - and may be compared for equality with objects of ForwardRange's - value type. -
        • -
        -
        - - Complexity -
        -

        - Linear. replace performs - exactly distance(rng) - comparisons for equality and at most distance(rng) assignments. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/replace_copy.html b/libs/range/doc/html/range/reference/algorithms/mutating/replace_copy.html deleted file mode 100644 index 96f6df0b8..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/replace_copy.html +++ /dev/null @@ -1,111 +0,0 @@ - - - -replace_copy - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange, class OutputIterator, class Value>
        -OutputIterator replace_copy(const ForwardRange& rng, OutputIterator out,
        -                            const Value& what, const Value& with_what);
        -
        -

        -

        -
        - - Description -
        -

        - replace_copy copy every - element x in rng such that the corresponding element - in the output range y - is x == - what ? - with_what : - x. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/replace_copy.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - Value is convertible - to ForwardRange's - value type. -
        • -
        • - Value is a model - of the AssignableConcept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        -
        - - Complexity -
        -

        - Linear. replace_copy - performs exactly distance(rng). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/replace_copy_if.html b/libs/range/doc/html/range/reference/algorithms/mutating/replace_copy_if.html deleted file mode 100644 index 4cc19ac7b..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/replace_copy_if.html +++ /dev/null @@ -1,113 +0,0 @@ - - - -replace_copy_if - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange, class OutputIterator, class UnaryPredicate, class Value>
        -OutputIterator replace_copy_if(const ForwardRange& rng, OutputIterator out,
        -                               UnaryPredicate pred, const Value& with_what);
        -
        -

        -

        -
        - - Description -
        -

        - replace_copy_if copy - every element x in rng such that the corresponding element - in the output range y - is pred(x) ? with_what - : x. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/replace_copy_if.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - Value is convertible - to ForwardRange's - value type. -
        • -
        • - Value is a model - of the AssignableConcept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        • - UnaryPredicate is - a model of the UnaryPredicateConcept. -
        • -
        -
        - - Complexity -
        -

        - Linear. replace_copy_if - performs exactly distance(rng) evaluations of pred. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/replace_if.html b/libs/range/doc/html/range/reference/algorithms/mutating/replace_if.html deleted file mode 100644 index fd8fa77d9..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/replace_if.html +++ /dev/null @@ -1,116 +0,0 @@ - - - -replace_if - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange, class UnaryPredicate, class Value>
        -ForwardRange& replace_if(ForwardRange& rng, UnaryPredicate pred, const Value& with_what);
        -
        -template<class ForwardRange, class UnaryPredicate, class Value>
        -const ForwardRange& replace_if(const ForwardRange& rng, UnaryPredicate pred, const Value& with_what);
        -
        -

        -

        -
        - - Description -
        -

        - replace_if replaces every - element x in rng for which pred(x) == true with with_what. - Returns a reference to rng. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/replace_if.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - UnaryPredicate is - a model of the PredicateConcept -
        • -
        • - ForwardRange's value - type is convertible to UnaryPredicate's - argument type. -
        • -
        • - Value is convertible - to ForwardRange's - value type. -
        • -
        • - Value is a model - of the AssignableConcept. -
        • -
        -
        - - Complexity -
        -

        - Linear. replace_if performs - exactly distance(rng) - applications of pred, - and at most distance(rng) assignments. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/reverse.html b/libs/range/doc/html/range/reference/algorithms/mutating/reverse.html deleted file mode 100644 index df5dc24b4..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/reverse.html +++ /dev/null @@ -1,96 +0,0 @@ - - - -reverse - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class BidirectionalRange>
        -BidirectionalRange& reverse(BidirectionalRange& rng);
        -
        -template<class BidirectionalRange>
        -const BidirectionalRange& reverse(const BidirectionalRange& rng);
        -
        -

        -

        -
        - - Description -
        -

        - reverse reverses a range. - Returns a reference to the reversed range. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/reverse.hpp -

        -
        - - Requirements -
        -
          -
        • - BidirectionalRange - is a model of the Bidirectional - Range Concept. -
        • -
        • - BidirectionalRange - is mutable. -
        • -
        -
        - - Complexity -
        -

        - Linear. reverse makes - distance(rng)/2 calls to iter_swap. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/reverse_copy.html b/libs/range/doc/html/range/reference/algorithms/mutating/reverse_copy.html deleted file mode 100644 index 627869c4f..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/reverse_copy.html +++ /dev/null @@ -1,100 +0,0 @@ - - - -reverse_copy - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class BidirectionalRange, class OutputIterator>
        -OutputIterator reverse_copy(const BidirectionalRange& rng, OutputIterator out);
        -
        -

        -

        -
        - - Description -
        -

        - reverse_copy copies the - elements from rng in - reverse order to out. - Returns the output iterator one passed the last copied element. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/reverse_copy.hpp -

        -
        - - Requirements -
        -
          -
        • - BidirectionalRange - is a model of the Bidirectional - Range Concept. -
        • -
        • - BidirectionalRange - is mutable. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        -
        - - Complexity -
        -

        - Linear. reverse_copy - makes distance(rng) - copies. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/rotate.html b/libs/range/doc/html/range/reference/algorithms/mutating/rotate.html deleted file mode 100644 index 72a950936..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/rotate.html +++ /dev/null @@ -1,109 +0,0 @@ - - - -rotate - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -rotate -
        -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange>
        -ForwardRange& rotate(ForwardRange& rng,
        -                     typename range_iterator<ForwardRange>::type middle);
        -
        -template<class ForwardRange>
        -const ForwardRange& rotate(const ForwardRange& rng,
        -                           typename range_iterator<const ForwardRange>::type middle);
        -
        -

        -

        -
        - - Description -
        -

        - rotate rotates the elements - in a range. It exchanges the two ranges [begin(rng), middle) - and [middle, end(rng)). Returns a reference to rng. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/rotate.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        -
        - - Precondition: -
        -
          -
        • - [begin(rng), middle) is a valid range. -
        • -
        • - [middle, end(rng)) is a valid range. -
        • -
        -
        - - Complexity -
        -

        - Linear. At most distance(rng) swaps are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/rotate_copy.html b/libs/range/doc/html/range/reference/algorithms/mutating/rotate_copy.html deleted file mode 100644 index 94238bf3e..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/rotate_copy.html +++ /dev/null @@ -1,111 +0,0 @@ - - - -rotate_copy - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange, class OutputIterator>
        -OutputIterator rotate_copy(
        -    const ForwardRange& rng,
        -    typename range_iterator<ForwardRange>::type middle,
        -    OutputIterator out);
        -
        -

        -

        -
        - - Description -
        -

        - rotate_copy rotates the - elements in a range. It copies the two ranges [begin(rng), middle) - and [middle, end(rng)) to out. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/rotate_copy.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        -
        - - Precondition: -
        -
          -
        • - [begin(rng), middle) is a valid range. -
        • -
        • - [middle, end(rng)) is a valid range. -
        • -
        -
        - - Complexity -
        -

        - Linear. Exactly distance(rng) elements are copied. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/sort.html b/libs/range/doc/html/range/reference/algorithms/mutating/sort.html deleted file mode 100644 index 0712c4e41..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/sort.html +++ /dev/null @@ -1,153 +0,0 @@ - - - -sort - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -sort -
        -
        - - Prototype -
        -

        -

        -
        template<class RandomAccessRange>
        -RandomAccessRange& sort(RandomAccessRange& rng);
        -
        -template<class RandomAccessRange>
        -const RandomAccessRange& sort(const RandomAccessRange& rng);
        -
        -template<class RandomAccessRange, class BinaryPredicate>
        -RandomAccessRange& sort(RandomAccessRange& rng, BinaryPredicate pred);
        -
        -template<class RandomAccessRange, class BinaryPredicate>
        -const RandomAccessRange& sort(const RandomAccessRange& rng, BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - sort sorts the elements - in rng into ascending - order. sort is not guaranteed - to be stable. Returns the sorted range. -

        -

        - For versions of the sort - function without a predicate, ascending order is defined by operator<() - such that for all adjacent elements [x,y], - y < - x == - false. -

        -

        - For versions of the sort - function with a predicate, ascending order is defined by pred such that for all adjacent elements - [x,y], pred(y, x) == false. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/sort.hpp -

        -
        - - Requirements -
        -

        - For versions of sort without a predicate: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - RandomAccessRange's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering relation on RandomAccessRange's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For versions of sort with a predicate -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - BinaryPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - RandomAccessRange's - value type is convertible to both of BinaryPredicate's - argument types. -
        • -
        -
        - - Complexity -
        -

        - O(N log(N)) comparisons (both average and worst-case), - where N is distance(rng). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/stable_partition.html b/libs/range/doc/html/range/reference/algorithms/mutating/stable_partition.html deleted file mode 100644 index b8a722d24..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/stable_partition.html +++ /dev/null @@ -1,134 +0,0 @@ - - - -stable_partition - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange, class UnaryPredicate>
        -typename range_iterator<ForwardRange>::type
        -stable_partition(ForwardRange& rng, UnaryPredicate pred);
        -
        -template<class ForwardRange, class UnaryPredicate>
        -typename range_iterator<const ForwardRange>::type
        -stable_partition(const ForwardRange& rng, UnaryPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class UnaryPredicate
        ->
        -typename range_return<ForwardRange, re>::type
        -stable_partition(ForwardRange& rng, UnaryPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class UnaryPredicate
        ->
        -typename range_return<const ForwardRange, re>::type
        -stable_partition(const ForwardRange& rng, UnaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - stable_partition reorders - the elements in the range rng - base on the function object pred. - Once this function has completed all of the elements that satisfy pred appear before all of the elements - that fail to satisfy it. stable_partition - differs from partition - because it preserves relative order. It is stable. -

        -

        - For the versions that return an iterator, the return value is the iterator - to the first element that fails to satisfy pred. -

        -

        - For versions that return a range_return, - the found iterator is - the iterator to the first element that fails to satisfy pred. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/stable_partition.hpp -

        -
        - - Requirements -
        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - UnaryPredicate is - a model of the PredicateConcept. -
        • -
        -
        - - Complexity -
        -

        - Best case: O(N) - where N is distance(rng). - Worst case: N * - log(N) - swaps, where N is distance(rng). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/stable_sort.html b/libs/range/doc/html/range/reference/algorithms/mutating/stable_sort.html deleted file mode 100644 index 087dd107e..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/stable_sort.html +++ /dev/null @@ -1,156 +0,0 @@ - - - -stable_sort - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class RandomAccessRange>
        -RandomAccessRange& stable_sort(RandomAccessRange& rng);
        -
        -template<class RandomAccessRange>
        -const RandomAccessRange& stable_sort(const RandomAccessRange& rng);
        -
        -template<class RandomAccessRange, class BinaryPredicate>
        -RandomAccessRange& stable_sort(RandomAccessRange& rng, BinaryPredicate pred);
        -
        -template<class RandomAccessRange, class BinaryPredicate>
        -const RandomAccessRange& stable_sort(const RandomAccessRange& rng, BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - stable_sort sorts the - elements in rng into - ascending order. stable_sort - is guaranteed to be stable. The order is preserved for equivalent elements. -

        -

        - For versions of the stable_sort - function without a predicate ascending order is defined by operator<() - such that for all adjacent elements [x,y], - y < - x == - false. -

        -

        - For versions of the stable_sort - function with a predicate, ascending order is designed by pred such that for all adjacent elements - [x,y], pred(y,x) == false. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/stable_sort.hpp -

        -
        - - Requirements -
        -

        - For versions of stable_sort without a predicate -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - RandomAccessRange's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering relation on RandomAccessRange's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For versions of stable_sort with a predicate: -

        -
          -
        • - RandomAccessRange - is a model of the Random - Access Range Concept. -
        • -
        • - RandomAccessRange - is mutable. -
        • -
        • - BinaryPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - RandomAccessRange's - value type is convertible to both of BinaryPredicate's - argument types. -
        • -
        -
        - - Complexity -
        -

        - Best case: O(N) - where N is distance(rng). - Worst case: O(N log(N)^2) - comparisons, where N - is distance(rng). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/swap_ranges.html b/libs/range/doc/html/range/reference/algorithms/mutating/swap_ranges.html deleted file mode 100644 index b7910135a..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/swap_ranges.html +++ /dev/null @@ -1,103 +0,0 @@ - - - -swap_ranges - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange1, class SinglePassRange2>
        -SinglePassRange2& swap_ranges(SinglePassRange1& rng1, SinglePassRange& rng2);
        -
        -

        -

        -
        - - Description -
        -

        - swap_ranges swaps each - element x in rng1 with the corresponding element - y in rng2. - Returns a reference to rng2. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/swap_ranges.hpp -

        -
        - - Requirements -
        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange1 - is mutable. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is mutable. -
        • -
        -
        - - Complexity -
        -

        - Linear. Exactly distance(rng1) elements are swapped. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/transform.html b/libs/range/doc/html/range/reference/algorithms/mutating/transform.html deleted file mode 100644 index 3767f04a0..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/transform.html +++ /dev/null @@ -1,227 +0,0 @@ - - - -transform - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class SinglePassRange1,
        -    class OutputIterator,
        -    class UnaryOperation
        ->
        -OutputIterator transform(const SinglePassRange1& rng,
        -                         OutputIterator out,
        -                         UnaryOperation fun);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class OutputIterator,
        -    class BinaryOperation
        ->
        -OutputIterator transform(const SinglePassRange1& rng1,
        -                         const SinglePassRange2& rng2,
        -                         OutputIterator out,
        -                         BinaryOperation fun);
        -
        -

        -

        -
        - - Description -
        -

        - UnaryOperation version: -

        -

        - transform assigns the - value y to each element - [out, out + distance(rng)), y = fun(x) where x - is the corresponding value to y - in rng1. The return value - is out + - distance(rng). -

        -

        - BinaryOperation version: -

        -

        - transform assigns the - value z to each element - [out, out + min(distance(rng1), distance(rng2))), z = fun(x,y) where x - is the corresponding value in rng1 - and y is the corresponding - value in rng2. This version - of transform stops upon - reaching either the end of rng1, - or the end of rng2. Hence - there isn't a requirement for distance(rng1) == distance(rng2) - since there is a safe guaranteed behaviour, unlike with the iterator - counterpart in the standard library. -

        -

        - The return value is out + min(distance(rng1), distance(rng2)). -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/transform.hpp -

        -
        - - Requirements -
        -

        - For the unary versions of transform: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        • - UnaryOperation is - a model of the UnaryFunctionConcept. -
        • -
        • - SinglePassRange1's - value type must be convertible to UnaryFunction's - argument type. -
        • -
        • - UnaryFunction's result - type must be convertible to a type in OutputIterator's - set of value types. -
        • -
        -

        - For the binary versions of transform: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        • - BinaryOperation is - a model of the BinaryFunctionConcept. -
        • -
        • - SinglePassRange1's - value type must be convertible to BinaryFunction's - first argument type. -
        • -
        • - SinglePassRange2's - value type must be convertible to BinaryFunction's - second argument type. -
        • -
        • - BinaryOperation's - result type must be convertible to a type in OutputIterator's - set of value types. -
        • -
        -
        - - Precondition: -
        -

        - For the unary version of transform: -

        -
          -
        • - out is not an iterator - within the range [begin(rng1) + 1, end(rng1)). -
        • -
        • - [out, out - + distance(rng1)) is a valid range. -
        • -
        -

        - For the binary version of transform: -

        -
          -
        • - out is not an iterator - within the range [begin(rng1) + 1, end(rng1)). -
        • -
        • - out is not an iterator - within the range [begin(rng2) + 1, end(rng2)). -
        • -
        • - [out, out - + min(distance(rng1), distance(rng2))) is a valid range. -
        • -
        -
        - - Complexity -
        -

        - Linear. The operation is applied exactly distance(rng1) for the unary version and min(distance(rng1), distance(rng2)) - for the binary version. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/unique.html b/libs/range/doc/html/range/reference/algorithms/mutating/unique.html deleted file mode 100644 index 33d000212..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/unique.html +++ /dev/null @@ -1,163 +0,0 @@ - - - -unique - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -unique -
        -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange>
        -typename range_return<ForwardRange, return_begin_found>::type
        -unique(ForwardRange& rng);
        -
        -template<class ForwardRange>
        -typename range_return<const ForwardRange, return_begin_found>::type
        -unique(const ForwardRange& rng);
        -
        -template<class ForwardRange, class BinaryPredicate>
        -typename range_return<ForwardRange, return_begin_found>::type
        -unique(ForwardRange& rng, BinaryPredicate pred);
        -
        -template<class ForwardRange, class BinaryPredicate>
        -typename range_return<const ForwardRange, return_begin_found>::type
        -unique(const ForwardRange& rng, BinaryPredicate pred);
        -
        -template<range_return_value re, class ForwardRange>
        -typename range_return<ForwardRange, re>::type
        -unique(ForwardRange& rng);
        -
        -template<range_return_value re, class ForwardRange>
        -typename range_return<const ForwardRange, re>::type
        -unique(const ForwardRange& rng);
        -
        -template<range_return_value re, class ForwardRange, class BinaryPredicate>
        -typename range_return<ForwardRange, re>::type
        -unique(ForwardRange& rng, BinaryPredicate pred);
        -
        -template<range_return_value re, class ForwardRange, class BinaryPredicate>
        -typename range_return<const ForwardRange, re>::type
        -unique(const ForwardRange& rng, BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - unique removes all but - the first element of each sequence of duplicate encountered in rng. -

        -

        - Elements in the range [new_last, - end(rng)) - are dereferenceable but undefined. -

        -

        - Equality is determined by the predicate if one is supplied, or by operator==() - for ForwardRange's value - type. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/unique.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions of unique: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - ForwardRange's value - type is a model of the EqualityComparableConcept. -
        • -
        -

        - For the predicate versions of unique: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange is mutable. -
        • -
        • - BinaryPredicate is - a model of the BinaryPredicateConcept. -
        • -
        • - ForwardRange's value - type is convertible to BinaryPredicate's - first argument type and to BinaryPredicate's - second argument type. -
        • -
        -
        - - Complexity -
        -

        - Linear. O(N) - where N is distance(rng). - Exactly distance(rng) - comparisons are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/mutating/unique_copy.html b/libs/range/doc/html/range/reference/algorithms/mutating/unique_copy.html deleted file mode 100644 index 4dc618810..000000000 --- a/libs/range/doc/html/range/reference/algorithms/mutating/unique_copy.html +++ /dev/null @@ -1,142 +0,0 @@ - - - -unique_copy - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange, class OutputIterator>
        -OutputIterator unique_copy(const SinglePassRange& rng, OutputIterator out);
        -
        -template<class SinglePassRange, class OutputIterator, class BinaryPredicate>
        -OutputIterator unique_copy(const SinglePassRange& rng, OutputIterator out, BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - unique_copy copies the - first element of each sequence of duplicates encountered in rng to out. -

        -

        - Equality is determined by the predicate if one is supplied, or by operator==() - for SinglePassRange's - value type. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/unique_copy.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions of unique: -

        -
          -
        • - SinglePassRange is - a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange is - mutable. -
        • -
        • - SinglePassRange's - value type is a model of the EqualityComparableConcept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        -

        - For the predicate versions of unique: -

        -
          -
        • - SinglePassRange is - a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange is - mutable. -
        • -
        • - BinaryPredicate is - a model of the BinaryPredicateConcept. -
        • -
        • - SinglePassRange's - value type is convertible to BinaryPredicate's - first argument type and to BinaryPredicate's - second argument type. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        -
        - - Complexity -
        -

        - Linear. O(N) - where N is distance(rng). - Exactly distance(rng) - comparisons are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/new.html b/libs/range/doc/html/range/reference/algorithms/new.html deleted file mode 100644 index 0b00f1c12..000000000 --- a/libs/range/doc/html/range/reference/algorithms/new.html +++ /dev/null @@ -1,57 +0,0 @@ - - - -New algorithms - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/new/copy_n.html b/libs/range/doc/html/range/reference/algorithms/new/copy_n.html deleted file mode 100644 index 664a22de5..000000000 --- a/libs/range/doc/html/range/reference/algorithms/new/copy_n.html +++ /dev/null @@ -1,103 +0,0 @@ - - - -copy_n - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -copy_n -
        -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange, class Size, class OutputIterator>
        -OutputIterator copy_n(const SinglePassRange& rng, Size n, OutputIterator out);
        -
        -

        -

        -
        - - Description -
        -

        - copy_n is provided to - completely replicate the standard algorithm header, it is preferable - to use Range Adaptors and the extension functions to achieve the same - result with greater safety. -

        -

        - copy_n copies elements - from [boost::begin(rng), boost::begin(rng) + n) to the range [out, out + n) -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm_ext/copy_n.hpp -

        -
        - - Requirements -
        -
          -
        1. - SinglePassRange is - a model of the Single - Pass Range Concept. -
        2. -
        3. - Size is a model of - the Integer Concept. -
        4. -
        5. - OutputIterator is - a model of the OutputIteratorConcept. -
        6. -
        -
        - - Complexity -
        -

        - Linear. Exactly n elements - are copied. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/new/erase.html b/libs/range/doc/html/range/reference/algorithms/new/erase.html deleted file mode 100644 index 7eded7d74..000000000 --- a/libs/range/doc/html/range/reference/algorithms/new/erase.html +++ /dev/null @@ -1,96 +0,0 @@ - - - -erase - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -erase -
        -
        - - Prototype -
        -

        -

        -
        template<class Container>
        -Container& erase(
        -    Container& target,
        -    iterator_range<typename Container::iterator> to_erase);
        -
        -

        -

        -
        - - Description -
        -

        - erase the iterator range - to_erase from the container - target. -

        -

        - remove_erase performs - the frequently used combination equivalent to target.erase(std::remove(target.begin(), target.end(), value), target.end()); -

        -

        - remove_erase_if performs - the frequently used combination equivalent to target.erase(std::remove_if(target.begin(), target.end(), pred), target.end()); -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm_ext/erase.hpp -

        -
        - - Requirements -
        -
        1. - Container supports - erase of an iterator range. -
        -
        - - Complexity -
        -

        - Linear. Proprotional to distance(to_erase). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/new/for_each.html b/libs/range/doc/html/range/reference/algorithms/new/for_each.html deleted file mode 100644 index bb1f44e61..000000000 --- a/libs/range/doc/html/range/reference/algorithms/new/for_each.html +++ /dev/null @@ -1,149 +0,0 @@ - - - -for_each - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class BinaryFunction
        -    >
        -BinaryFunction for_each(const SinglePassRange1& rng1,
        -                        const SinglePassRange2& rng2,
        -                        BinaryFunction fn);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class BinaryFunction
        -    >
        -BinaryFunction for_each(const SinglePassRange1& rng1,
        -                        SinglePassRange2& rng2,
        -                        BinaryFunction fn);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class BinaryFunction
        -    >
        -BinaryFunction for_each(SinglePassRange1& rng1,
        -                        const SinglePassRange2& rng2,
        -                        BinaryFunction fn);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class BinaryFunction
        -    >
        -BinaryFunction for_each(SinglePassRange1& rng1,
        -                        SinglePassRange2& rng2,
        -                        BinaryFunction fn);
        -
        -

        -

        -
        - - Description -
        -

        - for_each traverses forward - through rng1 and rng2 simultaneously. For each iteration, - the element x is used - from rng1 and the corresponding - element y is used from - rng2 to invoke fn(x,y). -

        -

        - Iteration is stopped upon reaching the end of the shorter of rng1, or rng2. - It is safe to call this function with unequal length ranges. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm_ext/for_each.hpp -

        -
        - - Requirements -
        -
          -
        1. - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        2. -
        3. - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        4. -
        5. - BinaryFunction is - a model of the BinaryFunctionConcept. -
        6. -
        7. - SinglePassRange1's - value type is convertible to BinaryFunction's - first argument type. -
        8. -
        9. - SinglepassRange2's - value type is convertible to BinaryFunction's - second argument type. -
        10. -
        -
        - - Complexity -
        -

        - Linear. Exactly min(distance(rng1), distance(rng2)) - applications of BinaryFunction. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/new/insert.html b/libs/range/doc/html/range/reference/algorithms/new/insert.html deleted file mode 100644 index 622e44313..000000000 --- a/libs/range/doc/html/range/reference/algorithms/new/insert.html +++ /dev/null @@ -1,113 +0,0 @@ - - - -insert - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -insert -
        -
        - - Prototype -
        -

        -

        -
        template<
        -    class Container,
        -    class SinglePassRange
        ->
        -Container& insert(Container& target,
        -                  typename Container::iterator before,
        -                  const SinglePassRange& from);
        -
        -// This overload is for target containers that do not require an insertion
        -// position e.g. set/map
        -template<
        -    class Container,
        -    class SinglePassRange
        ->
        -Container& insert(Container& target, const SinglePassRange& from);
        -
        -

        -

        -
        - - Description -
        -

        - insert all of the elements - in the range from before - the before iterator into - target. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm_ext/insert.hpp -

        -
        - - Requirements -
        -
          -
        1. - SinglePassRange is - a model of the Single - Pass Range Concept. -
        2. -
        3. - Container supports - insert at a specified position. -
        4. -
        5. - SinglePassRange's - value type is convertible to Container's - value type. -
        6. -
        -
        - - Complexity -
        -

        - Linear. distance(from) - assignments are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/new/iota.html b/libs/range/doc/html/range/reference/algorithms/new/iota.html deleted file mode 100644 index 9422bd8f8..000000000 --- a/libs/range/doc/html/range/reference/algorithms/new/iota.html +++ /dev/null @@ -1,96 +0,0 @@ - - - -iota - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -iota -
        -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange, class Value>
        -ForwardRange& iota(ForwardRange& rng, Value x);
        -
        -

        -

        -
        - - Description -
        -

        - iota traverses forward - through rng, each element - y in rng - is assigned a value equivalent to x - + boost::distance(boost::begin(rng), it) -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm_ext/iota.hpp -

        -
        - - Requirements -
        -
          -
        1. - ForwardRange is a - model of the Forward - Range Concept. -
        2. -
        3. - Value is a model - of the Incrementable - Concept. -
        4. -
        -
        - - Complexity -
        -

        - Linear. Exactly distance(rng) assignments into rng. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/new/is_sorted.html b/libs/range/doc/html/range/reference/algorithms/new/is_sorted.html deleted file mode 100644 index ea06ac9b1..000000000 --- a/libs/range/doc/html/range/reference/algorithms/new/is_sorted.html +++ /dev/null @@ -1,108 +0,0 @@ - - - -is_sorted - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange>
        -bool is_sorted(const SinglePassRange& rng);
        -
        -template<class SinglePassRange, class BinaryPredicate>
        -bool is_sorted(const SinglePassRange& rng, BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - is_sorted determines - if a range is sorted. For the non-predicate version the return value - is true if and only if for - each adjacent elements [x,y] - the expression x < - y is true. - For the predicate version the return value is true - is and only if for each adjacent elements [x,y] - the expression pred(x,y) - is true. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm_ext/is_sorted.hpp -

        -
        - - Requirements -
        -
          -
        1. - SinglePassRange is - a model of the Single - Pass Range Concept. -
        2. -
        3. - BinaryPredicate is - a model of the BinaryPredicate - Concept. -
        4. -
        5. - The value type of SinglePassRange - is convertible to both argument types of BinaryPredicate. -
        6. -
        -
        - - Complexity -
        -

        - Linear. A maximum of distance(rng) comparisons are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/new/overwrite.html b/libs/range/doc/html/range/reference/algorithms/new/overwrite.html deleted file mode 100644 index 8020eb301..000000000 --- a/libs/range/doc/html/range/reference/algorithms/new/overwrite.html +++ /dev/null @@ -1,112 +0,0 @@ - - - -overwrite - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class SinglePassRange1,
        -    class SinglePassRange2
        -    >
        -void overwrite(const SinglePassRange1& from,
        -               SinglePassRange2& to);
        -
        -

        -

        -
        - - Description -
        -

        - overwrite assigns the - values from the range from - into the range to. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm_ext/overwrite.hpp -

        -
        - - Requirements -
        -
          -
        1. - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        2. -
        3. - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        4. -
        5. - SinglePassRange2 - is mutable. -
        6. -
        7. - distance(SinglePassRange1) - <= distance(SinglePassRange2) -
        8. -
        9. - SinglePassRange1's - value type is convertible to SinglePassRange2's - value type. -
        10. -
        -
        - - Complexity -
        -

        - Linear. distance(rng1) - assignments are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/new/push_back.html b/libs/range/doc/html/range/reference/algorithms/new/push_back.html deleted file mode 100644 index e3943b3f4..000000000 --- a/libs/range/doc/html/range/reference/algorithms/new/push_back.html +++ /dev/null @@ -1,103 +0,0 @@ - - - -push_back - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class Container,
        -    class SinglePassRange
        -    >
        -Container& push_back(Container& target,
        -                     const SinglePassRange& from);
        -
        -

        -

        -
        - - Description -
        -

        - push_back all of the - elements in the range from - to the back of the container target. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm_ext/push_back.hpp -

        -
        - - Requirements -
        -
          -
        1. - SinglePassRange is - a model of the Single - Pass Range Concept. -
        2. -
        3. - Container supports - insert at end(). -
        4. -
        5. - SinglePassRange's - value type is convertible to Container's - value type. -
        6. -
        -
        - - Complexity -
        -

        - Linear. distance(from) - assignments are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/new/push_front.html b/libs/range/doc/html/range/reference/algorithms/new/push_front.html deleted file mode 100644 index 68fe91f9e..000000000 --- a/libs/range/doc/html/range/reference/algorithms/new/push_front.html +++ /dev/null @@ -1,103 +0,0 @@ - - - -push_front - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class Container,
        -    class SinglePassRange
        -    >
        -Container& push_front(Container& target,
        -                      const SinglePassRange& from);
        -
        -

        -

        -
        - - Description -
        -

        - push_front all of the - elements in the range from - to the front of the container target. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm_ext/push_front.hpp -

        -
        - - Requirements -
        -
          -
        1. - SinglePassRange is - a model of the Single - Pass Range Concept. -
        2. -
        3. - Container supports - insert at begin(). -
        4. -
        5. - SinglePassRange's - value type is convertible to Container's - value type. -
        6. -
        -
        - - Complexity -
        -

        - Linear. distance(from) - assignments are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/new/remove_erase.html b/libs/range/doc/html/range/reference/algorithms/new/remove_erase.html deleted file mode 100644 index 5356369e8..000000000 --- a/libs/range/doc/html/range/reference/algorithms/new/remove_erase.html +++ /dev/null @@ -1,88 +0,0 @@ - - - -remove_erase - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class Container, class Value>
        -Container& remove_erase(Container& target,
        -                        const Value& value);
        -
        -

        -

        -
        - - Description -
        -

        - remove_erase actually - eliminates the elements equal to value - from the container. This is in contrast to the remove - algorithm which merely rearranges elements. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm_ext/erase.hpp -

        -
        - - Requirements -
        -
        1. - Container supports - erase of an iterator range. -
        -
        - - Complexity -
        -

        - Linear. Proportional to distance(target)s. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/new/remove_erase_if.html b/libs/range/doc/html/range/reference/algorithms/new/remove_erase_if.html deleted file mode 100644 index 1565b76a8..000000000 --- a/libs/range/doc/html/range/reference/algorithms/new/remove_erase_if.html +++ /dev/null @@ -1,95 +0,0 @@ - - - -remove_erase_if - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class Container, class Pred>
        -Container& remove_erase_if(Container& target,
        -                           Pred pred);
        -
        -

        -

        -
        - - Description -
        -

        - remove_erase_if removes - the elements x that satisfy - pred(x) - from the container. This is in contrast to the erase - algorithm which merely rearranges elements. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm_ext/erase.hpp -

        -
        - - Requirements -
        -
          -
        1. - Container supports - erase of an iterator range. -
        2. -
        3. - Pred is a model of - the Predicate Concept. -
        4. -
        -
        - - Complexity -
        -

        - Linear. Proportional to distance(target)s. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating.html b/libs/range/doc/html/range/reference/algorithms/non_mutating.html deleted file mode 100644 index f3419c675..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating.html +++ /dev/null @@ -1,66 +0,0 @@ - - - -Non-mutating algorithms - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/adjacent_find.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/adjacent_find.html deleted file mode 100644 index c5c954c75..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/adjacent_find.html +++ /dev/null @@ -1,167 +0,0 @@ - - - -adjacent_find - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange>
        -typename range_iterator<ForwardRange>::type
        -adjacent_find(ForwardRange& rng);
        -
        -template<class ForwardRange>
        -typename range_iterator<const ForwardRange>::type
        -adjacent_find(const ForwardRange& rng);
        -
        -template<class ForwardRange, class BinaryPredicate>
        -typename range_iterator<ForwardRange>::type
        -adjacent_find(ForwardRange& rng, BinaryPred pred);
        -
        -template<class ForwardRange, class BinaryPredicate>
        -typename range_iterator<const ForwardRange>::type
        -adjacent_find(const ForwardRange& rng, BinaryPred pred);
        -
        -template<range_return_value_re, class ForwardRange>
        -typename range_return<ForwardRange, re>::type
        -adjacent_find(ForwardRange& rng);
        -
        -template<range_return_value_re, class ForwardRange>
        -typename range_return<const ForwardRange, re>::type
        -adjacent_find(const ForwardRange& rng);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class BinaryPredicate
        -    >
        -typename range_return<ForwardRange, re>::type
        -adjacent_find(ForwardRange& rng, BinaryPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class BinaryPredicate
        -    >
        -typename range_return<const ForwardRange, re>::type
        -adjacent_find(const ForwardRange& rng, BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - Non-predicate versions: -

        -

        - adjacent_find finds the - first adjacent elements [x,y] - in rng where x == y -

        -

        - Predicate versions: -

        -

        - adjacent_find finds the - first adjacent elements [x,y] - in rng where pred(x,y) - is true. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/adjacent_find.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions of adjacent_find: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange's value - type is a model of the EqualityComparableConcept. -
        • -
        -

        - For the predicate versions of adjacent_find: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - BinaryPredicate is - a model of the BinaryPredicateConcept. -
        • -
        • - ForwardRange's value - type is convertible to BinaryPredicate's - first argument type and to BinaryPredicate's - second argument type. -
        • -
        -
        - - Complexity -
        -

        - Linear. If empty(rng) - then no comparisons are performed; otherwise, at most distance(rng) - 1 - comparisons. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/binary_search.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/binary_search.html deleted file mode 100644 index 6eac723a6..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/binary_search.html +++ /dev/null @@ -1,156 +0,0 @@ - - - -binary_search - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange, class Value>
        -bool binary_search(const ForwardRange& rng, const Value& val);
        -
        -template<class ForwardRange, class Value, class BinaryPredicate>
        -bool binary_search(const ForwardRange& rng, const Value& val, BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - binary_search returns - true if and only if the - value val exists in the - range rng. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/binary_search.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions of binary_search: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - Value is a model - of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type Value - is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        • - ForwardRange's value - type is the same type as Value. -
        • -
        -

        - For the predicate versions of binary_search: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - BinaryPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - ForwardRange's value - type is the same type as Value. -
        • -
        • - ForwardRange's value - type is convertible to BinaryPredicate's - argument type. -
        • -
        -
        - - Precondition: -
        -

        - For the non-predicate version: -

        -

        - rng is ordered in ascending - order according to operator<. -

        -

        - For the predicate version: -

        -

        - rng is ordered in ascending - order according to the function object pred. -

        -
        - - Complexity -
        -

        - For non-random-access ranges, the complexity is O(N) where N - is distance(rng). -

        -

        - For random-access ranges, the complexity is O(log N) - where N is distance(rng). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/count.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/count.html deleted file mode 100644 index 9e32a98a0..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/count.html +++ /dev/null @@ -1,107 +0,0 @@ - - - -count - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -count -
        -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange, class Value>
        -typename range_difference<SinglePassRange>::type
        -count(SinglePassRange& rng, const Value& val);
        -
        -template<class SinglePassRange, class Value>
        -typename range_difference<const SinglePassRange>::type
        -count(const SinglePassRange& rng, const Value& val);
        -
        -

        -

        -
        - - Description -
        -

        - count returns the number - of elements x in rng where x - == val - is true. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/count.hpp -

        -
        - - Requirements -
        -
          -
        • - SinglePassRange is - a model of the Single - Pass Range Concept. -
        • -
        • - Value is a model - of the EqualityComparableConcept. -
        • -
        • - SinglePassRange's - value type is a model of the EqualityComparableConcept. -
        • -
        • - An object of SinglePassRange's - value type can be compared for equality with an object of type Value. -
        • -
        -
        - - Complexity -
        -

        - Linear. Exactly distance(rng) comparisons. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/count_if.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/count_if.html deleted file mode 100644 index f1c08a3cd..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/count_if.html +++ /dev/null @@ -1,103 +0,0 @@ - - - -count_if - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange, class UnaryPredicate>
        -typename range_difference<const SinglePassRange>::type
        -count_if(const SinglePassRange& rng, UnaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - count_if returns the - number of elements x - in rng where pred(x) - is true. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/count_if.hpp -

        -
        - - Requirements -
        -
          -
        • - SinglePassRange is - a model of the Single - Pass Range Concept. -
        • -
        • - UnaryPredicate is - a model of the UnaryPredicateConcept. -
        • -
        • - SinglePassRange's - value type is a model of the EqualityComparableConcept. -
        • -
        • - The value type of SinglePassRange - is convertible to the argument type of UnaryPredicate. -
        • -
        -
        - - Complexity -
        -

        - Linear. Exactly distance(rng) invocations of pred. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/equal.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/equal.html deleted file mode 100644 index bd8cf8253..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/equal.html +++ /dev/null @@ -1,162 +0,0 @@ - - - -equal - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -equal -
        -
        - - Prototype -
        -

        -

        -
        template<
        -    class SinglePassRange1,
        -    class SinglePassRange2
        ->
        -bool equal(const SinglePassRange1& rng1,
        -           const SinglePassRange2& rng2);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class BinaryPredicate
        ->
        -bool equal(const SinglePassRange1& rng1,
        -           const SinglePassRange2& rng2,
        -           BinaryPredicate         pred);
        -
        -

        -

        -
        - - Description -
        -

        - equal returns true if distance(rng1) is equal to the distance(rng2) and for each element x - in rng1, the corresponding - element y in rng2 is equal. Otherwise false is returned. -

        -

        - In this range version of equal - it is perfectly acceptable to pass in two ranges of unequal lengths. -

        -

        - Elements are considered equal in the non-predicate version if operator== - returns true. Elements are - considered equal in the predicate version if pred(x,y) is true. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/equal.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange1's - value type is a model of the EqualityComparableConcept. -
        • -
        • - SinglePassRange2's - value type is a model of the EqualityComparableConcept. -
        • -
        • - SinglePassRange1's - value type can be compared for equality with SinglePassRange2's - value type. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - BinaryPredicate is - a model of the BinaryPredicateConcept. -
        • -
        • - SinglePassRange1's - value type is convertible to BinaryPredicate's - first argument type. -
        • -
        • - SinglePassRange2's - value type is convertible to BinaryPredicate's - second argument type. -
        • -
        -
        - - Complexity -
        -

        - Linear. At most min(distance(rng1), distance(rng2)) - comparisons. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/equal_range.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/equal_range.html deleted file mode 100644 index 75789f7de..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/equal_range.html +++ /dev/null @@ -1,178 +0,0 @@ - - - -equal_range - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class ForwardRange,
        -    class Value
        -    >
        -std::pair<typename range_iterator<ForwardRange>::type,
        -          typename range_iterator<ForwardRange>::type>
        -equal_range(ForwardRange& rng, const Value& val);
        -
        -template<
        -    class ForwardRange,
        -    class Value
        -    >
        -std::pair<typename range_iterator<const ForwardRange>::type,
        -          typename range_iterator<const ForwardRange>::type>
        -equal_range(const ForwardRange& rng, const Value& val);
        -
        -template<
        -    class ForwardRange,
        -    class Value,
        -    class SortPredicate
        -    >
        -std::pair<typename range_iterator<ForwardRange>::type,
        -          typename range_iterator<ForwardRange>::type>
        -equal_range(ForwardRange& rng, const Value& val, SortPredicate pred);
        -
        -template<
        -    class ForwardRange,
        -    class Value,
        -    class SortPredicate
        -    >
        -std::pair<typename range_iterator<const ForwardRange>::type,
        -          typename range_iterator<const ForwardRange>::type>
        -equal_range(const ForwardRange& rng, const Value& val, SortPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - equal_range returns a - range in the form of a pair of iterators where all of the elements are - equal to val. If no values - are found that are equal to val, - then an empty range is returned, hence result.first == result.second. - For the non-predicate versions of equal_range - the equality of elements is determined by operator<. For the predicate versions of equal_range the equality of elements - is determined by pred. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/equal_range.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - Value is a model - of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type Value - is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        • - ForwardRange's value - type is the same type as Value. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - SortPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - ForwardRange's value - type is the same as Value. -
        • -
        • - ForwardRange's value - type is convertible to both of SortPredicate's - argument types. -
        • -
        -
        - - Precondition: -
        -

        - For the non-predicate versions: rng - is ordered in ascending order according to operator<. -

        -

        - For the predicate versions: rng - is ordered in ascending order according to pred. -

        -
        - - Complexity -
        -

        - For random-access ranges, the complexity is O(log N), - otherwise the complexity is O(N). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/find.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/find.html deleted file mode 100644 index 5703a804b..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/find.html +++ /dev/null @@ -1,110 +0,0 @@ - - - -find - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -find -
        -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange, class Value>
        -typename range_iterator<SinglePassRange>::type
        -find(SinglePassRange& rng, Value val);
        -
        -template<
        -    range_return_value re,
        -    class SinglePassRange,
        -    class Value
        -    >
        -typename range_return<SinglePassRange, re>::type
        -find(SinglePassRange& rng, Value val);
        -
        -

        -

        -
        - - Description -
        -

        - The versions of find - that return an iterator, returns the first iterator in the range rng such that *i == value. end(rng) is returned if no such iterator exists. - The versions of find that return a range_return, - defines found in the - same manner as the returned iterator described above. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/find.hpp -

        -
        - - Requirements -
        -
          -
        • - SinglePassRange is - a model of the Single - Pass Range Concept. -
        • -
        • - Value is a model - of the EqualityComparableConcept. -
        • -
        • - The operator== - is defined for type Value - to be compared with the SinglePassRange's - value type. -
        • -
        -
        - - Complexity -
        -

        - Linear. At most distance(rng) comparisons for equality. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/find_end.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/find_end.html deleted file mode 100644 index d21f44162..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/find_end.html +++ /dev/null @@ -1,173 +0,0 @@ - - - -find_end - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange1, class ForwardRange2>
        -typename range_iterator<ForwardRange1>::type
        -find_end(ForwardRange1& rng1, const ForwardRange2& rng2);
        -
        -template<
        -    class ForwardRange1,
        -    class ForwardRange2,
        -    class BinaryPredicate
        -    >
        -typename range_iterator<ForwardRange1>::type
        -find_end(ForwardRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange1,
        -    class ForwardRange2
        -    >
        -typename range_return<ForwardRange1, re>::type
        -find_end(ForwardRange1& rng1, const ForwardRange2& rng2);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange1,
        -    class ForwardRange2,
        -    class BinaryPredicate
        -    >
        -typename range_return<ForwardRange1, re>::type
        -find_end(ForwardRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - The versions of find_end - that return an iterator, return an iterator to the beginning of the last - sub-sequence equal to rng2 - within rng1. Equality - is determined by operator== for non-predicate versions of find_end, and by satisfying pred in the predicate versions. The - versions of find_end - that return a range_return, - defines found in the - same manner as the returned iterator described above. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/find_end.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - ForwardRange1 is - a model of the Forward - Range Concept. -
        • -
        • - ForwardRange2 is - a model of the Forward - Range Concept. -
        • -
        • - ForwardRange1's value - type is a model of the EqualityComparableConcept. -
        • -
        • - ForwardRange2's value - type is a model of the EqualityComparableConcept. -
        • -
        • - Objects of ForwardRange1's - value type can be compared for equality with objects of ForwardRange2's value type. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - ForwardRange1 is - a model of the Forward - Range Concept. -
        • -
        • - ForwardRange2 is - a model of the Forward - Range Concept. -
        • -
        • - BinaryPredicate is - a model of the BinaryPredicateConcept. -
        • -
        • - ForwardRange1's value - type is convertible to BinaryPredicate's - first argument type. -
        • -
        • - ForwardRange2's value - type is convertible to BinaryPredicate's - second argument type. -
        • -
        -
        - - Complexity -
        -

        - The number of comparisons is proportional to distance(rng1) * distance(rng2). If both ForwardRange1 - and ForwardRange2 are - models of BidirectionalRangeConcept - then the average complexity is linear and the worst case is distance(rng1) * distance(rng2). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/find_first_of.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/find_first_of.html deleted file mode 100644 index 045a0da3c..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/find_first_of.html +++ /dev/null @@ -1,169 +0,0 @@ - - - -find_first_of - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange1, class ForwardRange2>
        -typename range_iterator<SinglePassRange1>::type
        -find_first_of(SinglePassRange1& rng1, const ForwardRange2& rng2);
        -
        -template<
        -    class SinglePassRange1,
        -    class ForwardRange2,
        -    class BinaryPredicate
        -    >
        -typename range_iterator<SinglePassRange1>::type
        -find_first_of(SinglePassRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class SinglePassRange1,
        -    class ForwardRange2
        -    >
        -typename range_return<SinglePassRange1, re>::type
        -find_first_of(SinglePassRange1& rng1, const ForwardRange2& rng2);
        -
        -template<
        -    range_return_value re,
        -    class SinglePassRange1,
        -    class ForwardRange2,
        -    class BinaryPredicate
        -    >
        -typename range_return<SinglePassRange1, re>::type
        -find_first_of(SinglePassRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - The versions of find_first_of - that return an iterator, return an iterator to the first occurrence in - rng1 of any of the elements - in rng2. Equality is - determined by operator== - for non-predicate versions of find_first_of, - and by satisfying pred - in the predicate versions. -

        -

        - The versions of find_first_of - that return a range_return, - defines found in the - same manner as the returned iterator described above. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/find_first_of.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - ForwardRange2 is - a model of the Forward - Range Concept. -
        • -
        • - SinglePassRange1's - value type is a model of the EqualityComparableConcept, - and can be compared for equality with ForwardRange2's - value type. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - ForwardRange2 is - a model of the Forward - Range Concept. -
        • -
        • - BinaryPredicate is - a model of the BinaryPredicateConcept. -
        • -
        • - SinglePassRange1's - value type is convertible to BinaryPredicate's - first argument type. -
        • -
        • - ForwardRange2's value - type is convertible to BinaryPredicate's - second argument type. -
        • -
        -
        - - Complexity -
        -

        - At most distance(rng1) * distance(rng2) comparisons. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/find_if.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/find_if.html deleted file mode 100644 index 783188dfc..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/find_if.html +++ /dev/null @@ -1,120 +0,0 @@ - - - -find_if - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange, class UnaryPredicate>
        -typename range_iterator<SinglePassRange>::type
        -find_if(SinglePassRange& rng, UnaryPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class SinglePassRange,
        -    class UnaryPredicate
        -    >
        -typename range_return<SinglePassRange, re>::type
        -find_if(SinglePassRange& rng, UnaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - The versions of find_if - that return an iterator, returns the first iterator in the range rng such that pred(*i) is true. - end(rng) - is returned if no such iterator exists. -

        -

        - The versions of find_if - that return a range_return, - defines found in the same manner as the returned iterator described above. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/find_if.hpp -

        -
        - - Requirements -
        -
          -
        • - SinglePassRange is - a model of the Single - Pass Range Concept. -
        • -
        • - UnaryPredicate is - a model of the PredicateConcept. -
        • -
        • - The value type of SinglePassRange - is convertible to the argument type of UnaryPredicate. -
        • -
        -
        - - Precondition: -
        -

        - For each iterator i in - rng, *i is in the domain of UnaryPredicate. -

        -
        - - Complexity -
        -

        - Linear. At most distance(rng) invocations of pred. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/for_each.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/for_each.html deleted file mode 100644 index 04d413c9d..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/for_each.html +++ /dev/null @@ -1,112 +0,0 @@ - - - -for_each - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class SinglePassRange,
        -    class UnaryFunction
        -    >
        -UnaryFunction for_each(SinglePassRange& rng, UnaryFunction fun);
        -
        -template<
        -    class SinglePassRange,
        -    class UnaryFunction
        -    >
        -UnaryFunction for_each(const SinglePassRange& rng, UnaryFunction fun);
        -
        -

        -

        -
        - - Description -
        -

        - for_each traverses forward - through rng and for each - element x it invokes - fun(x). -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/for_each.hpp -

        -
        - - Requirements -
        -
          -
        • - SinglePassRange is - a model of the Single - Pass Range Concept. -
        • -
        • - UnaryFunction is - a model of the UnaryFunctionConcept. -
        • -
        • - UnaryFunction does - not apply any non-constant operation through its argument. -
        • -
        • - SinglePassRange's - value type is convertible to UnaryFunction's - argument type. -
        • -
        -
        - - Complexity -
        -

        - Linear. Exactly distance(rng) applications of UnaryFunction. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/lexicographical_compare.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/lexicographical_compare.html deleted file mode 100644 index 3a245c71c..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/lexicographical_compare.html +++ /dev/null @@ -1,169 +0,0 @@ - - - -lexicographical_compare - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class SinglePassRange1,
        -    class SinglePassRange2
        -    >
        -bool lexicographical_compare(const SinglePassRange1& rng1,
        -                             const SinglePassRange2& rng2);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class BinaryPredicate
        -    >
        -bool lexicographical_compare(const SinglePassRange1& rng1,
        -                             const SinglePassRange2& rng2,
        -                             BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - lexicographical_compare - compares element by element rng1 - against rng2. If the - element from rng1 is - less than the element from rng2 - then true is returned. If - the end of rng1 without - reaching the end of rng2 - this also causes the return value to be true. - The return value is false - in all other circumstances. The elements are compared using operator< - in the non-predicate versions of lexicographical_compare - and using pred in the - predicate versions. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/lexicographical_compare.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions of lexicographical_compare: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange1's - value type is a model of the LessThanComparableConcept. -
        • -
        • - SinglePassRange2's - value type is a model of the LessThanComparableConcept. -
        • -
        • - Let x be an object - of SinglePassRange1's - value type. Let y - be an object of SinglePassRange2's - value type. x < - y must be valid. y < - x must be valid. -
        • -
        -

        - For the predicate versions of lexicographical_compare: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - BinaryPredicate is - a model of the BinaryPredicateConcept. -
        • -
        • - SinglePassRange1's - value type is convertible to BinaryPredicate's - first argument type. -
        • -
        • - SinglePassRange2's - value type is convertible to BinaryPredicate's - second argument type. -
        • -
        -
        - - Complexity -
        -

        - Linear. At most 2 * - min(distance(rng1), distance(rng2)) - comparisons. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/lower_bound.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/lower_bound.html deleted file mode 100644 index d7282a867..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/lower_bound.html +++ /dev/null @@ -1,195 +0,0 @@ - - - -lower_bound - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class ForwardRange,
        -    class Value
        -    >
        -typename range_iterator<ForwardRange>::type
        -lower_bound(ForwardRange& rng, Value val);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class Value
        -    >
        -typename range_return<ForwardRange, re>::type
        -lower_bound(ForwardRange& rng, Value val);
        -
        -template<
        -    class ForwardRange,
        -    class Value,
        -    class SortPredicate
        -    >
        -typename range_iterator<ForwardRange>::type
        -lower_bound(ForwardRange& rng, Value val, SortPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class Value,
        -    class SortPredicate
        -    >
        -typename range_return<ForwardRange,re>::type
        -lower_bound(ForwardRange& rng, Value val, SortPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - The versions of lower_bound - that return an iterator, returns the first iterator in the range rng such that: without predicate - - *i - < value - is false, with predicate - - pred(*i, value) - is false. -

        -

        - end(rng) - is returned if no such iterator exists. -

        -

        - The versions of lower_bound - that return a range_return, - defines found in the - same manner as the returned iterator described above. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/lower_bound.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - Value is a model - of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type Value - is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        • - ForwardRange's value - type is the same type as Value. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - BinaryPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - ForwardRange's value - type is the same type as Value. -
        • -
        • - ForwardRange's value - type is convertible to both of BinaryPredicate's - argument types. -
        • -
        -
        - - Precondition: -
        -

        - For the non-predicate versions: -

        -

        - rng is sorted in ascending - order according to operator<. -

        -

        - For the predicate versions: -

        -

        - rng is sorted in ascending - order according to pred. -

        -
        - - Complexity -
        -

        - For ranges that model the Random - Access Range concept the complexity is O(log N), - where N is distance(rng). -

        -

        - For all other range types the complexity is O(N). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/max_element.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/max_element.html deleted file mode 100644 index de810a597..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/max_element.html +++ /dev/null @@ -1,165 +0,0 @@ - - - -max_element - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange>
        -typename range_iterator<ForwardRange>::type
        -max_element(ForwardRange& rng);
        -
        -template<class ForwardRange>
        -typename range_iterator<const ForwardRange>::type
        -max_element(const ForwardRange& rng);
        -
        -template<class ForwardRange, class BinaryPredicate>
        -typename range_iterator<ForwardRange>::type
        -max_element(ForwardRange& rng, BinaryPredicate pred);
        -
        -template<class ForwardRange, class BinaryPredicate>
        -typename range_iterator<const ForwardRange>::type
        -max_element(const ForwardRange& rng, BinaryPredicate pred);
        -
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange
        -    >
        -typename range_return<ForwardRange, re>::type
        -max_element(ForwardRange& rng);
        -
        -template<
        -    range_return_value_re,
        -    class ForwardRange
        -    >
        -typename range_return<const ForwardRange, re>::type
        -max_element(const ForwardRange& rng);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class BinaryPredicate
        -    >
        -typename range_return<ForwardRange, re>::type
        -max_element(ForwardRange& rng, BinaryPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class BinaryPredicate
        -    >
        -typename range_return<const ForwardRange, re>::type
        -max_element(const ForwardRange& rng, BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - The versions of max_element - that return an iterator, return the iterator to the maximum value as - determined by using operator< if a predicate is not supplied. Otherwise - the predicate pred is - used to determine the maximum value. The versions of max_element - that return a range_return, - defines found in the - same manner as the returned iterator described above. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/max_element.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange's value - type is a model of the LessThanComparableConcept. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - BinaryPredicate is - a model of the BinaryPredicateConcept. -
        • -
        • - ForwardRange's value - type is convertible to both of BinaryPredicate's - argument types. -
        • -
        -
        - - Complexity -
        -

        - Linear. Zero comparisons if empty(rng), otherwise distance(rng) - 1 - comparisons. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/min_element.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/min_element.html deleted file mode 100644 index 72f35c29e..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/min_element.html +++ /dev/null @@ -1,165 +0,0 @@ - - - -min_element - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange>
        -typename range_iterator<ForwardRange>::type
        -min_element(ForwardRange& rng);
        -
        -template<class ForwardRange>
        -typename range_iterator<const ForwardRange>::type
        -min_element(const ForwardRange& rng);
        -
        -template<class ForwardRange, class BinaryPredicate>
        -typename range_iterator<ForwardRange>::type
        -min_element(ForwardRange& rng, BinaryPredicate pred);
        -
        -template<class ForwardRange, class BinaryPredicate>
        -typename range_iterator<const ForwardRange>::type
        -min_element(const ForwardRange& rng, BinaryPredicate pred);
        -
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange
        -    >
        -typename range_return<ForwardRange, re>::type
        -min_element(ForwardRange& rng);
        -
        -template<
        -    range_return_value_re,
        -    class ForwardRange
        -    >
        -typename range_return<const ForwardRange, re>::type
        -min_element(const ForwardRange& rng);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class BinaryPredicate
        -    >
        -typename range_return<ForwardRange, re>::type
        -min_element(ForwardRange& rng, BinaryPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class BinaryPredicate
        -    >
        -typename range_return<const ForwardRange, re>::type
        -min_element(const ForwardRange& rng, BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - The versions of min_element - that return an iterator, return the iterator to the minimum value as - determined by using operator< if a predicate is not supplied. Otherwise - the predicate pred is - used to determine the minimum value. The versions of min_element - that return a range_return, - defines found in the - same manner as the returned iterator described above. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/min_element.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange's value - type is a model of the LessThanComparableConcept. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - BinaryPredicate is - a model of the BinaryPredicateConcept. -
        • -
        • - ForwardRange's value - type is convertible to both of BinaryPredicate's - argument types. -
        • -
        -
        - - Complexity -
        -

        - Linear. Zero comparisons if empty(rng), otherwise distance(rng) - 1 - comparisons. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/mismatch.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/mismatch.html deleted file mode 100644 index ea37f0aca..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/mismatch.html +++ /dev/null @@ -1,215 +0,0 @@ - - - -mismatch - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange1, class SinglePassRange2>
        -std::pair<
        -    typename range_iterator<SinglePassRange1>::type,
        -    typename range_iterator<const SinglePassRange2>::type >
        -mismatch(SinglePassRange1& rng1, const SinglePassRange2& rng2);
        -
        -template<class SinglePassRange1, class SinglePassRange2>
        -std::pair<
        -    typename range_iterator<const SinglePassRange1>::type,
        -    typename range_iterator<const SinglePassRange2>::type >
        -mismatch(const SinglePassRange1& rng1, const SinglePassRange2& rng2);
        -
        -template<class SinglePassRange1, class SinglePassRange2>
        -std::pair<
        -    typename range_iterator<SinglePassRange1>::type,
        -    typename range_iterator<SinglePassRange2>::type >
        -mismatch(SinglePassRange1& rng1, SinglePassRange2& rng2);
        -
        -template<class SinglePassRange1, class SinglePassRange2>
        -std::pair<
        -    typename range_iterator<const SinglePassRange1>::type,
        -    typename range_iterator<SinglePassRange2>::type >
        -mismatch(const SinglePassRange1& rng1, SinglePassRange2& rng2);
        -
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class BinaryPredicate
        -    >
        -std::pair<
        -    typename range_iterator<SinglePassRange1>::type,
        -    typename range_iterator<const SinglePassRange2>::type >
        -mismatch(SinglePassRange1& rng1, const SinglePassRange2& rng2,
        -         BinaryPredicate pred);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class BinaryPredicate
        -    >
        -std::pair<
        -    typename range_iterator<const SinglePassRange1>::type,
        -    typename range_iterator<const SinglePassRange2>::type >
        -mismatch(const SinglePassRange1& rng1, const SinglePassRange2& rng2,
        -         BinaryPredicate pred);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class BinaryPredicate
        -    >
        -std::pair<
        -    typename range_iterator<SinglePassRange1>::type,
        -    typename range_iterator<SinglePassRange2>::type >
        -mismatch(SinglePassRange1& rng1, SinglePassRange2& rng2,
        -         BinaryPredicate pred);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class BinaryPredicate
        -    >
        -std::pair<
        -    typename range_iterator<const SinglePassRange1>::type,
        -    typename range_iterator<SinglePassRange2>::type >
        -mismatch(const SinglePassRange1& rng1, SinglePassRange2& rng2,
        -         BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - mismatch finds the first - position where the corresponding elements from the two ranges rng1 and rng2 - are not equal. -

        -

        - Equality is determined by operator== for non-predicate versions of mismatch, and by satisfying pred in the predicate versions. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/mismatch.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange1's - value type is a model of the EqualityComparableConcept. -
        • -
        • - SinglePassRange2's - value type is a model of the EqualityComparableConcept. -
        • -
        • - SinglePassRange1s - value type can be compared for equality with SinglePassRange2's - value type. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - BinaryPredicate is - a model of the BinaryPredicateConcept. -
        • -
        • - SinglePassRange1's - value type is convertible to BinaryPredicate's - first argument type. -
        • -
        • - SinglePassRange2's - value type is convertible to BinaryPredicate's - second argument type. -
        • -
        -
        - - Precondition: -
        -

        - distance(rng2) >= distance(rng1) -

        -
        - - Complexity -
        -

        - Linear. At most distance(rng1) comparisons. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/search.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/search.html deleted file mode 100644 index b60c6258f..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/search.html +++ /dev/null @@ -1,205 +0,0 @@ - - - -search - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -
        -search -
        -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange1, class ForwardRange2>
        -typename range_iterator<ForwardRange1>::type
        -search(ForwardRange1& rng1, const ForwardRange2& rng2);
        -
        -template<class ForwardRange1, class ForwardRange2>
        -typename range_iterator<const ForwardRange1>::type
        -search(const ForwardRange1& rng1, const ForwardRange2& rng2);
        -
        -template<
        -    class ForwardRange1,
        -    class ForwardRange2,
        -    class BinaryPredicate
        -    >
        -typename range_iterator<ForwardRange1>::type,
        -search(ForwardRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred);
        -
        -template<
        -    class ForwardRange1,
        -    class ForwardRange2,
        -    class BinaryPredicate
        -    >
        -typename range_iterator<const ForwardRange1>::type
        -search(const ForwardRange1& rng1, ForwardRange2& rng2, BinaryPredicate pred);
        -
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange1,
        -    class ForwardRange2
        -    >
        -typename range_return<ForwardRange1, re>::type
        -search(ForwardRange1& rng1, const ForwardRange2& rng2);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange1,
        -    class ForwardRange2
        -    >
        -typename range_return<const ForwardRange1, re>::type
        -search(const ForwardRange1& rng1, const ForwardRange2& rng2);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange1,
        -    class ForwardRange2,
        -    class BinaryPredicate
        -    >
        -typename range_return<ForwardRange1, re>::type,
        -search(ForwardRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange1,
        -    class ForwardRange2,
        -    class BinaryPredicate
        -    >
        -typename range_return<const ForwardRange1, re>::type
        -search(const ForwardRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - The versions of search - that return an iterator, return an iterator to the start of the first - subsequence in rng1 that - is equal to the subsequence rng2. - The end(rng1) - is returned if no such subsequence exists in rng1. - Equality is determined by operator== for non-predicate versions of search, and by satisfying pred in the predicate versions. -

        -

        - The versions of search - that return a range_return, - defines found in the - same manner as the returned iterator described above. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/search.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - ForwardRange1 is - a model of the Forward - Range Concept. -
        • -
        • - ForwardRange2 is - a model of the Forward - Range Concept. -
        • -
        • - ForwardRange1's value - type is a model of the EqualityComparableConcept. -
        • -
        • - ForwardRange2's value - type is a model of the EqualityComparableConcept. -
        • -
        • - ForwardRange1s value - type can be compared for equality with ForwardRange2's - value type. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - ForwardRange1 is - a model of the Forward - Range Concept. -
        • -
        • - ForwardRange2 is - a model of the Forward - Range Concept. -
        • -
        • - BinaryPredicate is - a model of the BinaryPredicateConcept. -
        • -
        • - ForwardRange1's value - type is convertible to BinaryPredicate's - first argument type. -
        • -
        • - ForwardRange2's value - type is convertible to BinaryPredicate's - second argument type. -
        • -
        -
        - - Complexity -
        -

        - Average complexity is Linear. Worst-case complexity is quadratic. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/search_n.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/search_n.html deleted file mode 100644 index 172948e65..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/search_n.html +++ /dev/null @@ -1,147 +0,0 @@ - - - -search_n - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class ForwardRange, class Integer, class Value>
        -typename range_iterator<ForwardRange>::type
        -search_n(ForwardRange& rng, Integer n, const Value& value);
        -
        -template<class ForwardRange, class Integer, class Value>
        -typename range_iterator<const ForwardRange>::type
        -search_n(const ForwardRange& rng, Integer n, const Value& value);
        -
        -template<class ForwardRange, class Integer, class Value, class BinaryPredicate>
        -typename range_iterator<ForwardRange>::type
        -search_n(ForwardRange& rng, Integer n, const Value& value,
        -         BinaryPredicate binary_pred);
        -
        -template<class ForwardRange, class Integer, class Value, class BinaryPredicate>
        -typename range_iterator<const ForwardRange>::type
        -search_n(const ForwardRange& rng, Integer n, const Value& value,
        -         BinaryPredicate binary_pred);
        -
        -

        -

        -
        - - Description -
        -

        - search_n searches rng for a sequence of length n equal to value - where equality is determined by operator== in the non-predicate case, - and by a predicate when one is supplied. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/search_n.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - ForwardRange's value - type is a model of the EqualityComparableConcept. -
        • -
        • - ForwardRanges value - type can be compared for equality with Value. -
        • -
        • - Integer is a model - of the IntegerConcept. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - BinaryPredicate is - a model of the BinaryPredicateConcept. -
        • -
        • - ForwardRange's value - type is convertible to BinaryPredicate's - first argument type. -
        • -
        • - Value is convertible - to BinaryPredicate's - second argument type. -
        • -
        • - Integer is a model - of the IntegerConcept. -
        • -
        -
        - - Complexity -
        -

        - Average complexity is Linear. Worst-case complexity is quadratic. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/non_mutating/upper_bound.html b/libs/range/doc/html/range/reference/algorithms/non_mutating/upper_bound.html deleted file mode 100644 index 9f07eb60a..000000000 --- a/libs/range/doc/html/range/reference/algorithms/non_mutating/upper_bound.html +++ /dev/null @@ -1,192 +0,0 @@ - - - -upper_bound - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class ForwardRange,
        -    class Value
        -    >
        -typename range_iterator<ForwardRange>::type
        -upper_bound(ForwardRange& rng, Value val);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class Value
        -    >
        -typename range_return<ForwardRange, re>::type
        -upper_bound(ForwardRange& rng, Value val);
        -
        -template<
        -    class ForwardRange,
        -    class Value,
        -    class SortPredicate
        -    >
        -typename range_iterator<ForwardRange>::type
        -upper_bound(ForwardRange& rng, Value val, SortPredicate pred);
        -
        -template<
        -    range_return_value re,
        -    class ForwardRange,
        -    class Value,
        -    class SortPredicate
        -    >
        -typename range_return<ForwardRange,re>::type
        -upper_bound(ForwardRange& rng, Value val, SortPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - The versions of upper_bound - that return an iterator, returns the first iterator in the range rng such that: without predicate - - val < - *i - is true, with predicate - - pred(val, *i) is true. -

        -

        - end(rng) - is returned if no such iterator exists. -

        -

        - The versions of upper_bound - that return a range_return, - defines found in the - same manner as the returned iterator described above. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/upper_bound.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - Value is a model - of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type Value - is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        • - ForwardRange's value - type is the same type as Value. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - ForwardRange is a - model of the Forward - Range Concept. -
        • -
        • - BinaryPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - ForwardRange's value - type is the same type as Value. -
        • -
        • - ForwardRange's value - type is convertible to both of BinaryPredicate's - argument types. -
        • -
        -
        - - Precondition: -
        -

        - For the non-predicate versions: -

        -

        - rng is sorted in ascending - order according to operator<. -

        -

        - For the predicate versions: -

        -

        - rng is sorted in ascending - order according to pred. -

        -
        - - Complexity -
        -

        - For ranges that model the Random - Access Range Concept the complexity is O(log N), - where N is distance(rng). - For all other range types the complexity is O(N). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/numeric.html b/libs/range/doc/html/range/reference/algorithms/numeric.html deleted file mode 100644 index 5ea17fe8a..000000000 --- a/libs/range/doc/html/range/reference/algorithms/numeric.html +++ /dev/null @@ -1,50 +0,0 @@ - - - -Numeric algorithms - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/numeric/accumulate.html b/libs/range/doc/html/range/reference/algorithms/numeric/accumulate.html deleted file mode 100644 index d95ebc21a..000000000 --- a/libs/range/doc/html/range/reference/algorithms/numeric/accumulate.html +++ /dev/null @@ -1,156 +0,0 @@ - - - -accumulate - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class SinglePassRange,
        -    class Value
        -    >
        -Value accumulate(const SinglePassRange& source_rng,
        -                 Value init);
        -
        -template<
        -    class SinglePassRange,
        -    class Value,
        -    class BinaryOperation
        -    >
        -Value accumulate(const SinglePassRange& source_rng,
        -                 Value init,
        -                 BinaryOperation op);
        -
        -

        -

        -
        - - Description -
        -

        - accumulate is a generalisation - of summation. It computes a binary operation (operator+ in the non-predicate version) of init and all of the elements in rng. -

        -

        - The return value is the resultant value of the above algorithm. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/numeric.hpp -

        -
        - - Requirements -
        -
        - - For - the first version -
        -
          -
        1. - SinglePassRange is - a model of the Single - Pass Range Concept. -
        2. -
        3. - Value is a model - of the AssignableConcept. -
        4. -
        5. - An operator+ - is defined for a left-hand operand of type Value - and a right-hand operand of the SinglePassRange - value type. -
        6. -
        7. - The return type of the above operator is convertible to Value. -
        8. -
        -
        - - For - the second version -
        -
          -
        1. - SinglePassRange is - a model of the Single - Pass Range Concept. -
        2. -
        3. - Value is a model - of the AssignableConcept. -
        4. -
        5. - BinaryOperation is - a model of the BinaryFunctionConcept. -
        6. -
        7. - Value is convertible - to BinaryOperation's - first argument type. -
        8. -
        9. - SinglePassRange's - value type is convertible to BinaryOperation's - second argument type. -
        10. -
        11. - The return type of BinaryOperation - is convertible to Value. -
        12. -
        -
        - - Complexity -
        -

        - Linear. Exactly distance(source_rng). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/numeric/adjacent_difference.html b/libs/range/doc/html/range/reference/algorithms/numeric/adjacent_difference.html deleted file mode 100644 index 35cc4fa0f..000000000 --- a/libs/range/doc/html/range/reference/algorithms/numeric/adjacent_difference.html +++ /dev/null @@ -1,178 +0,0 @@ - - - -adjacent_difference - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class SinglePassRange,
        -    class OutputIterator
        -    >
        -OutputIterator adjacent_difference(
        -    const SinglePassRange& source_rng,
        -    OutputIterator out_it);
        -
        -template<
        -    class SinglePassRange,
        -    class OutputIterator,
        -    class BinaryOperation
        -    >
        -OutputIterator adjacent_difference(
        -    const SinglePassRange& source_rng,
        -    OutputIterator out_it,
        -    BinaryOperation op);
        -
        -

        -

        -
        - - Description -
        -

        - adjacent_difference calculates - the differences of adjacent_elements in rng. -

        -

        - The first version of adjacent_difference - uses operator-() - to calculate the differences. The second version uses BinaryOperation - instead of operator-(). -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/numeric.hpp -

        -
        - - Requirements -
        -
        - - For - the first version -
        -
          -
        1. - SinglePassRange is - a model of the Single - Pass Range Concept. -
        2. -
        3. - OutputIterator is - a model of the OutputIteratorConcept. -
        4. -
        5. - If x and y are objects of SinglePassRange's value type, then - x - - y is defined. -
        6. -
        7. - The value type of SinglePassRange - is convertible to a type in OutputIterator's - set of value types. -
        8. -
        9. - The return type of x - y - is convertible to a type in OutputIterator's - set of value types. -
        10. -
        -
        - - For - the second version -
        -
          -
        1. - SinglePassRange is - a model of the Single - Pass Range Concept. -
        2. -
        3. - OutputIterator is - a model of the OutputIteratorConcept. -
        4. -
        5. - BinaryOperation is - a model of the BinaryFunctionConcept. -
        6. -
        7. - The value type of SinglePassRange - is convertible to BinaryOperation's - first and second argument types. -
        8. -
        9. - The value type of SinglePassRange - is convertible to a type in OutputIterator's - set of value types. -
        10. -
        11. - The result type of BinaryOperation - is convertible to a type in OutputIterator's - set of value types. -
        12. -
        -
        - - Precondition: -
        -

        - [result, result - + distance(rng)) is a valid range. -

        -
        - - Complexity -
        -

        - Linear. If empty(rng) - then zero applications, otherwise distance(rng) - 1 - applications are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/numeric/inner_product.html b/libs/range/doc/html/range/reference/algorithms/numeric/inner_product.html deleted file mode 100644 index f64d5cd7c..000000000 --- a/libs/range/doc/html/range/reference/algorithms/numeric/inner_product.html +++ /dev/null @@ -1,192 +0,0 @@ - - - -inner_product - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange1,
        -         class SinglePassRange2,
        -         class Value>
        -    Value inner_product( const SinglePassRange1& rng1,
        -                         const SinglePassRange2& rng2,
        -                         Value                   init );
        -
        -template<class SinglePassRange1,
        -         class SinglePassRange2,
        -         class Value,
        -         class BinaryOperation1,
        -         class BinaryOperation2>
        -    Value inner_product( const SinglePassRange1& rng1,
        -                         const SinglePassRange2& rng2,
        -                         Value                   init,
        -                         BinaryOperation1        op1,
        -                         BinaryOperation2        op2 );
        -
        -

        -

        -
        - - Description -
        -

        - inner_product calculates - a generalised inner product of the range rng1 - and rng2. -

        -

        - For further information on the inner_product - algorithm please see inner_product. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/numeric.hpp -

        -
        - - Requirements -
        -
        - - For - the first version -
        -
          -
        1. - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        2. -
        3. - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        4. -
        5. - Value is a model - of the AssignableConcept. -
        6. -
        7. - If x is an object - of type Value, y is an object of SinglePassRange1's value type, - and z is an object - of SinglePassRange2's - value type, then x + y * z - is defined. -
        8. -
        9. - The result type of the expression x - + y - * z - is convertible to Value. -
        10. -
        -
        - - For - the second version -
        -
          -
        1. - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        2. -
        3. - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        4. -
        5. - Value is a model - of the AssignableConcept. -
        6. -
        7. - BinaryOperation1 - is a model of the BinaryFunctionConcept. -
        8. -
        9. - BinaryOperation2 - is a model of the BinaryFunctionConcept. -
        10. -
        11. - The value type of SinglePassRange1 - is convertible to the first argument type of BinaryOperation2. -
        12. -
        13. - The value type of SinglePassRange2 - is convertible to the second argument type of BinaryOperation2. -
        14. -
        15. - Value is convertible - to the value type of BinaryOperation1. -
        16. -
        17. - The return type of BinaryOperation2 - is convertible to the second argument type of BinaryOperation1. -
        18. -
        19. - The return type of BinaryOperation1 - is convertible to Value. -
        20. -
        -
        - - Precondition: -
        -

        - distance(rng2) >= distance(rng1) is a valid range. -

        -
        - - Complexity -
        -

        - Linear. Exactly distance(rng). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/numeric/partial_sum.html b/libs/range/doc/html/range/reference/algorithms/numeric/partial_sum.html deleted file mode 100644 index fe6cec053..000000000 --- a/libs/range/doc/html/range/reference/algorithms/numeric/partial_sum.html +++ /dev/null @@ -1,160 +0,0 @@ - - - -partial_sum - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange,
        -         class OutputIterator>
        -OutputIterator partial_sum(const SinglePassRange& rng,
        -                           OutputIterator out_it);
        -
        -template<class SinglePassRange,
        -         class OutputIterator,
        -         class BinaryOperation>
        -OutputIterator partial_sum(const SinglePassRange& rng,
        -                           OutputIterator out_it,
        -                           BinaryOperation op);
        -
        -

        -

        -
        - - Description -
        -

        - partial_sum calculates - a generalised partial sum of rng - in the same manner as std::partial_sum(boost::begin(rng), boost::end(rng), out_it). See partial_sum. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/numeric.hpp -

        -
        - - Requirements -
        -
        - - For - the first version -
        -
          -
        1. - SinglePassRange is - a model of the Single - Pass Range Concept. -
        2. -
        3. - OutputIterator is - a model of the OutputIteratorConcept. -
        4. -
        5. - If x and y are objects of SinglePassRange's value type, then - x + - y is defined. -
        6. -
        7. - The return type of x + y - is convertible to the value type of SinglePassRange. -
        8. -
        9. - The value type of SinglePassRange - is convertible to a type in OutputIterator's - set of value types. -
        10. -
        -
        - - For - the second version -
        -
          -
        1. - SinglePassRange is - a model of the Single - Pass Range Concept. -
        2. -
        3. - OutputIterator is - a model of the OutputIteratorConcept. -
        4. -
        5. - BinaryOperation is - a model of the BinaryFunctionConcept. -
        6. -
        7. - The result type of BinaryOperation - is convertible to the value type of SinglePassRange. -
        8. -
        9. - The value type of SinglePassRange - is convertible to a type in OutputIterator's - set of value types. -
        10. -
        -
        - - Precondition: -
        -

        - [result, result - + distance(rng)) is a valid range. -

        -
        - - Complexity -
        -

        - Linear. If empty(rng) - then zero applications, otherwise distance(rng) - 1 - applications are performed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/permutation.html b/libs/range/doc/html/range/reference/algorithms/permutation.html deleted file mode 100644 index f2d97f89a..000000000 --- a/libs/range/doc/html/range/reference/algorithms/permutation.html +++ /dev/null @@ -1,49 +0,0 @@ - - - -Permutation algorithms - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/permutation/next_permutation.html b/libs/range/doc/html/range/reference/algorithms/permutation/next_permutation.html deleted file mode 100644 index 8f0915fcb..000000000 --- a/libs/range/doc/html/range/reference/algorithms/permutation/next_permutation.html +++ /dev/null @@ -1,148 +0,0 @@ - - - -next_permutation - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class BidirectionalRange>
        -bool next_permutation(BidirectionalRange& rng);
        -
        -template<class BidirectionalRange>
        -bool next_permutation(const BidirectionalRange& rng);
        -
        -template<class BidirectionalRange, class Compare>
        -bool next_permutation(BidirectionalRange& rng, Compare pred);
        -
        -template<class BidirectionalRange, class Compare>
        -bool next_permutation(const BidirectionalRange& rng, Compare pred);
        -
        -

        -

        -
        - - Description -
        -

        - next_permutation transforms - the range of elements rng - into the lexicographically next greater permutation of the elements if - such a permutation exists. If one does not exist then the range is transformed - into the lexicographically smallest permutation and false - is returned. true is returned - when the next greater permutation is successfully generated. -

        -

        - The ordering relationship is determined by using operator< in the non-predicate versions, and - by evaluating pred in - the predicate versions. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/permutation.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - BidirectionalRange - is a model of the Bidirectional - Range Concept. -
        • -
        • - BidirectionalRange - is mutable. -
        • -
        • - BidirectionalRange's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type BidirectionalRange's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - BidirectionalRange - is a model of the Bidirectional - Range Concept. -
        • -
        • - BidirectionalRange - is mutable. -
        • -
        • - Compare is a model - of the StrictWeakOrderingConcept. -
        • -
        • - BidirectionalRange's - value type is convertible to both of Compare's - argument types. -
        • -
        -
        - - Complexity -
        -

        - Linear. At most distance(rng) / 2 - swaps. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/permutation/prev_permutation.html b/libs/range/doc/html/range/reference/algorithms/permutation/prev_permutation.html deleted file mode 100644 index 4fbccff9f..000000000 --- a/libs/range/doc/html/range/reference/algorithms/permutation/prev_permutation.html +++ /dev/null @@ -1,148 +0,0 @@ - - - -prev_permutation - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class BidirectionalRange>
        -bool prev_permutation(BidirectionalRange& rng);
        -
        -template<class BidirectionalRange>
        -bool prev_permutation(const BidirectionalRange& rng);
        -
        -template<class BidirectionalRange, class Compare>
        -bool prev_permutation(BidirectionalRange& rng, Compare pred);
        -
        -template<class BidirectionalRange, class Compare>
        -bool prev_permutation(const BidirectionalRange& rng, Compare pred);
        -
        -

        -

        -
        - - Description -
        -

        - prev_permutation transforms - the range of elements rng - into the lexicographically next smaller permutation of the elements if - such a permutation exists. If one does not exist then the range is transformed - into the lexicographically largest permutation and false - is returned. true is returned - when the next smaller permutation is successfully generated. -

        -

        - The ordering relationship is determined by using operator< in the non-predicate versions, and - by evaluating pred in - the predicate versions. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/permutation.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - BidirectionalRange - is a model of the Bidirectional - Range Concept. -
        • -
        • - BidirectionalRange - is mutable. -
        • -
        • - BidirectionalRange's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type BidirectionalRange's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - BidirectionalRange - is a model of the Bidirectional - Range Concept. -
        • -
        • - BidirectionalRange - is mutable. -
        • -
        • - Compare is a model - of the StrictWeakOrderingConcept. -
        • -
        • - BidirectionalRange's - value type is convertible to both of Compare's - argument types. -
        • -
        -
        - - Complexity -
        -

        - Linear. At most distance(rng) / 2 - swaps. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/set.html b/libs/range/doc/html/range/reference/algorithms/set.html deleted file mode 100644 index d043a261a..000000000 --- a/libs/range/doc/html/range/reference/algorithms/set.html +++ /dev/null @@ -1,51 +0,0 @@ - - - -Set algorithms - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/set/includes.html b/libs/range/doc/html/range/reference/algorithms/set/includes.html deleted file mode 100644 index 7676b2b8e..000000000 --- a/libs/range/doc/html/range/reference/algorithms/set/includes.html +++ /dev/null @@ -1,186 +0,0 @@ - - - -includes - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<class SinglePassRange1, class SinglePassRange2>
        -bool includes(const SinglePassRange1& rng1, const SinglePassRange2& rng2);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class BinaryPredicate
        -    >
        -bool includes(const SinglePassRange1& rng1, const SinglePassRange2& rng2,
        -              BinaryPredicate pred);
        -
        -

        -

        -
        - - Description -
        -

        - includes returns true if and only if, for every element - in rng2, an equivalent - element is also present in rng1. - The ordering relationship is determined by using operator< in the non-predicate versions, and - by evaluating pred in - the predicate versions. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/set_algorithm.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange1 - and SinglePassRange2 - have the same value type. -
        • -
        • - SinglePassRange1's - value type is a model of the LessThanComparableConcept. -
        • -
        • - SinglePassRange2's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type SinglePassRange1's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        • - The ordering of objects of type SinglePassRange2's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange1 - and SinglePassRange2 - have the same value type. -
        • -
        • - BinaryPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - SinglePassRange1's - value type is convertible to BinaryPredicate's - first argument type. -
        • -
        • - SinglePassRange2's - value type is convertible to BinaryPredicate's - second argument types. -
        • -
        -
        - - Precondition: -
        -

        - For the non-predicate versions: -

        -

        - rng1 and rng2 are sorted in ascending order - according to operator<. -

        -

        - For the predicate versions: -

        -

        - rng1 and rng2 are sorted in ascending order - according to pred. -

        -
        - - Complexity -
        -

        - Linear. O(N), - where N is distance(rng1) + distance(rng2). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/set/set_difference.html b/libs/range/doc/html/range/reference/algorithms/set/set_difference.html deleted file mode 100644 index 46ebbf386..000000000 --- a/libs/range/doc/html/range/reference/algorithms/set/set_difference.html +++ /dev/null @@ -1,205 +0,0 @@ - - - -set_difference - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class OutputIterator
        -    >
        -OutputIterator set_difference(const SinglePassRange1& rng1,
        -                              const SinglePassRange2& rng2,
        -                              OutputIterator          out);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class OutputIterator,
        -    class BinaryPredicate
        -    >
        -OutputIterator set_difference(const SinglePassRange1& rng1,
        -                              const SinglePassRange2& rng2,
        -                              OutputIterator          out,
        -                              BinaryPredicate         pred);
        -
        -

        -

        -
        - - Description -
        -

        - set_difference constructs - a sorted range that is the set difference of the sorted ranges rng1 and rng2. - The return value is the end of the output range. -

        -

        - The ordering relationship is determined by using operator< in the non-predicate versions, and - by evaluating pred in - the predicate versions. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/set_algorithm.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        • - SinglePassRange1 - and SinglePassRange2 - have the same value type. -
        • -
        • - SinglePassRange1's - value type is a model of the LessThanComparableConcept. -
        • -
        • - SinglePassRange2's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type SinglePassRange1's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        • - The ordering of objects of type SinglePassRange2's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        • - SinglePassRange1 - and SinglePassRange2 - have the same value type. -
        • -
        • - BinaryPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - SinglePassRange1's - value type is convertible to BinaryPredicate's - first argument type. -
        • -
        • - SinglePassRange2's - value type is convertible to BinaryPredicate's - second argument types. -
        • -
        -
        - - Precondition: -
        -

        - For the non-predicate versions: -

        -

        - rng1 and rng2 are sorted in ascending order - according to operator<. -

        -

        - For the predicate versions: -

        -

        - rng1 and rng2 are sorted in ascending order - according to pred. -

        -
        - - Complexity -
        -

        - Linear. O(N), - where N is distance(rng1) + distance(rng2). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/set/set_intersection.html b/libs/range/doc/html/range/reference/algorithms/set/set_intersection.html deleted file mode 100644 index 56f09a532..000000000 --- a/libs/range/doc/html/range/reference/algorithms/set/set_intersection.html +++ /dev/null @@ -1,205 +0,0 @@ - - - -set_intersection - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class OutputIterator
        -    >
        -OutputIterator set_intersection(const SinglePassRange1& rng1,
        -                                const SinglePassRange2& rng2,
        -                                OutputIterator          out);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class OutputIterator,
        -    class BinaryPredicate
        -    >
        -OutputIterator set_intersection(const SinglePassRange1& rng1,
        -                                const SinglePassRange2& rng2,
        -                                OutputIterator          out,
        -                                BinaryPredicate         pred);
        -
        -

        -

        -
        - - Description -
        -

        - set_intersection constructs - a sorted range that is the intersection of the sorted ranges rng1 and rng2. - The return value is the end of the output range. -

        -

        - The ordering relationship is determined by using operator< in the non-predicate versions, and - by evaluating pred in - the predicate versions. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/set_algorithm.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        • - SinglePassRange1 - and SinglePassRange2 - have the same value type. -
        • -
        • - SinglePassRange1's - value type is a model of the LessThanComparableConcept. -
        • -
        • - SinglePassRange2's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type SinglePassRange1's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        • - The ordering of objects of type SinglePassRange2's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        • - SinglePassRange1 - and SinglePassRange2 - have the same value type. -
        • -
        • - BinaryPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - SinglePassRange1's - value type is convertible to BinaryPredicate's - first argument type. -
        • -
        • - SinglePassRange2's - value type is convertible to BinaryPredicate's - second argument types. -
        • -
        -
        - - Precondition: -
        -

        - For the non-predicate versions: -

        -

        - rng1 and rng2 are sorted in ascending order - according to operator<. -

        -

        - For the predicate versions: -

        -

        - rng1 and rng2 are sorted in ascending order - according to pred. -

        -
        - - Complexity -
        -

        - Linear. O(N), - where N is distance(rng1) + distance(rng2). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/set/set_symmetric_difference.html b/libs/range/doc/html/range/reference/algorithms/set/set_symmetric_difference.html deleted file mode 100644 index a2b46b675..000000000 --- a/libs/range/doc/html/range/reference/algorithms/set/set_symmetric_difference.html +++ /dev/null @@ -1,209 +0,0 @@ - - - -set_symmetric_difference - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class OutputIterator
        -    >
        -OutputIterator
        -set_symmetric_difference(const SinglePassRange1& rng1,
        -                         const SinglePassRange2& rng2,
        -                         OutputIterator          out);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class OutputIterator,
        -    class BinaryPredicate
        -    >
        -OutputIterator
        -set_symmetric_difference(const SinglePassRange1& rng1,
        -                         const SinglePassRange2& rng2,
        -                         OutputIterator          out,
        -                         BinaryPredicate         pred);
        -
        -

        -

        -
        - - Description -
        -

        - set_symmetric_difference - constructs a sorted range that is the set symmetric difference of the - sorted ranges rng1 and - rng2. The return value - is the end of the output range. -

        -

        - The ordering relationship is determined by using operator< in the non-predicate versions, and - by evaluating pred in - the predicate versions. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/set_algorithm.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        • - SinglePassRange1 - and SinglePassRange2 - have the same value type. -
        • -
        • - SinglePassRange1's - value type is a model of the LessThanComparableConcept. -
        • -
        • - SinglePassRange2's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type SinglePassRange1's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        • - The ordering of objects of type SinglePassRange2's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        • - SinglePassRange1 - and SinglePassRange2 - have the same value type. -
        • -
        • - BinaryPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - SinglePassRange1's - value type is convertible to BinaryPredicate's - first argument type. -
        • -
        • - SinglePassRange2's - value type is convertible to BinaryPredicate's - second argument types. -
        • -
        -
        - - Precondition: -
        -

        - For the non-predicate versions: -

        -

        - rng1 and rng2 are sorted in ascending order - according to operator<. -

        -

        - For the predicate versions: -

        -

        - rng1 and rng2 are sorted in ascending order - according to pred. -

        -
        - - Complexity -
        -

        - Linear. O(N), - where N is distance(rng1) + distance(rng2). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/algorithms/set/set_union.html b/libs/range/doc/html/range/reference/algorithms/set/set_union.html deleted file mode 100644 index 06631a210..000000000 --- a/libs/range/doc/html/range/reference/algorithms/set/set_union.html +++ /dev/null @@ -1,204 +0,0 @@ - - - -set_union - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class OutputIterator
        -    >
        -OutputIterator set_union(const SinglePassRange1& rng1,
        -                         const SinglePassRange2& rng2,
        -                         OutputIterator          out);
        -
        -template<
        -    class SinglePassRange1,
        -    class SinglePassRange2,
        -    class OutputIterator,
        -    class BinaryPredicate
        -    >
        -OutputIterator set_union(const SinglePassRange1& rng1,
        -                         const SinglePassRange2& rng2,
        -                         OutputIterator          out,
        -                         BinaryPredicate         pred);
        -
        -

        -

        -
        - - Description -
        -

        - set_union constructs - a sorted range that is the union of the sorted ranges rng1 - and rng2. The return - value is the end of the output range. The ordering relationship is determined - by using operator< - in the non-predicate versions, and by evaluating pred - in the predicate versions. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/algorithm/set_algorithm.hpp -

        -
        - - Requirements -
        -

        - For the non-predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        • - SinglePassRange1 - and SinglePassRange2 - have the same value type. -
        • -
        • - SinglePassRange1's - value type is a model of the LessThanComparableConcept. -
        • -
        • - SinglePassRange2's - value type is a model of the LessThanComparableConcept. -
        • -
        • - The ordering of objects of type SinglePassRange1's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        • - The ordering of objects of type SinglePassRange2's - value type is a strict weak ordering, - as defined in the LessThanComparableConcept - requirements. -
        • -
        -

        - For the predicate versions: -

        -
          -
        • - SinglePassRange1 - is a model of the Single - Pass Range Concept. -
        • -
        • - SinglePassRange2 - is a model of the Single - Pass Range Concept. -
        • -
        • - OutputIterator is - a model of the OutputIteratorConcept. -
        • -
        • - SinglePassRange1 - and SinglePassRange2 - have the same value type. -
        • -
        • - BinaryPredicate is - a model of the StrictWeakOrderingConcept. -
        • -
        • - SinglePassRange1's - value type is convertible to BinaryPredicate's - first argument type. -
        • -
        • - SinglePassRange2's - value type is convertible to BinaryPredicate's - second argument types. -
        • -
        -
        - - Precondition: -
        -

        - For the non-predicate versions: -

        -

        - rng1 and rng2 are sorted in ascending order - according to operator<. -

        -

        - For the predicate versions: -

        -

        - rng1 and rng2 are sorted in ascending order - according to pred. -

        -
        - - Complexity -
        -

        - Linear. O(N), - where N is distance(rng1) + distance(rng2). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/concept_implementation.html b/libs/range/doc/html/range/reference/concept_implementation.html deleted file mode 100644 index 3cf1f5aa4..000000000 --- a/libs/range/doc/html/range/reference/concept_implementation.html +++ /dev/null @@ -1,49 +0,0 @@ - - - -Range concept implementation - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/concept_implementation/semantics.html b/libs/range/doc/html/range/reference/concept_implementation/semantics.html deleted file mode 100644 index 45a151e2d..000000000 --- a/libs/range/doc/html/range/reference/concept_implementation/semantics.html +++ /dev/null @@ -1,164 +0,0 @@ - - - -Semantics - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -
        - - notation -
        -
        ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -

        - Type -

        -
        -

        - Object -

        -
        -

        - Describes -

        -
        -

        - X -

        -
        -

        - x -

        -
        -

        - any type -

        -
        -

        - T -

        -
        -

        - t -

        -
        -

        - denotes behavior of the primary templates -

        -
        -

        - P -

        -
        -

        - p -

        -
        -

        - denotes std::pair<iterator,iterator> -

        -
        -

        - A[sz] -

        -
        -

        - a -

        -
        -

        - denotes an array of type A - of size sz -

        -
        -

        - Char* -

        -
        -

        - s -

        -
        -

        - denotes either char* or wchar_t* -

        -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/concept_implementation/semantics/functions.html b/libs/range/doc/html/range/reference/concept_implementation/semantics/functions.html deleted file mode 100644 index 88b317e20..000000000 --- a/libs/range/doc/html/range/reference/concept_implementation/semantics/functions.html +++ /dev/null @@ -1,410 +0,0 @@ - - - -Functions - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -

        - Expression -

        -
        -

        - Return type -

        -
        -

        - Returns -

        -
        -

        - Complexity -

        -
        -

        - begin(x) -

        -
        -

        - range_iterator<X>::type -

        -
        -

        - p.first if p - is of type std::pair<T> a - if a is an - array range_begin(x) if that expression would invoke - a function found by ADL t.begin() otherwise -

        -
        -

        - constant time -

        -
        -

        - end(x) -

        -
        -

        - range_iterator<X>::type -

        -
        -

        - p.second if p - is of type std::pair<T> a - + sz - if a is an - array of size sz - range_end(x) - if that expression would invoke a function found by ADL t.end() - otherwise -

        -
        -

        - constant time -

        -
        -

        - empty(x) -

        -
        -

        - bool -

        -
        -

        - boost::begin(x) - == boost::end(x) -

        -
        -

        - constant time -

        -
        -

        - distance(x) -

        -
        -

        - range_difference<X>::type -

        -
        -

        - std::distance(boost::begin(x),boost::end(x)) -

        -
        -

        - - -

        -
        -

        - size(x) -

        -
        -

        - range_size<X>::type -

        -
        -

        - range_calculate_size(x) which by default is boost::end(x) - - boost::begin(x). Users may supply alternative - implementations by implementing range_calculate_size(x) so that it will be found via - ADL -

        -
        -

        - constant time -

        -
        -

        - rbegin(x) -

        -
        -

        - range_reverse_iterator<X>::type -

        -
        -

        - range_reverse_iterator<X>::type(boost::end(x)) -

        -
        -

        - constant time -

        -
        -

        - rend(x) -

        -
        -

        - range_reverse_iterator<X>::type -

        -
        -

        - range_reverse_iterator<X>::type(boost::begin(x)) -

        -
        -

        - constant time -

        -
        -

        - const_begin(x) -

        -
        -

        - range_iterator<const - X>::type -

        -
        -

        - range_iterator<const - X>::type(boost::begin(x)) -

        -
        -

        - constant time -

        -
        -

        - const_end(x) -

        -
        -

        - range_iterator<const - X>::type -

        -
        -

        - range_iterator<const - X>::type(boost::end(x)) -

        -
        -

        - constant time -

        -
        -

        - const_rbegin(x) -

        -
        -

        - range_reverse_iterator<const - X>::type -

        -
        -

        - range_reverse_iterator<const - X>::type(boost::rbegin(x)) -

        -
        -

        - constant time -

        -
        -

        - const_rend(x) -

        -
        -

        - range_reverse_iterator<const - X>::type -

        -
        -

        - range_reverse_iterator<const - X>::type(boost::rend(x)) -

        -
        -

        - constant time -

        -
        -

        - as_literal(x) -

        -
        -

        - iterator_range<U> where U - is Char* - if x is a pointer - to a string and U - is range_iterator<X>::type - otherwise -

        -
        -

        - [s,s - + std::char_traits<X>::length(s)) if s - is a Char* - or an array of Char - [boost::begin(x),boost::end(x)) otherwise -

        -
        -

        - linear time for pointers to a string or arrays of Char, constant time otherwise -

        -
        -

        - as_array(x) -

        -
        -

        - iterator_range<X> -

        -
        -

        - [boost::begin(x),boost::end(x)) -

        -
        -

        - The special const_-named - functions are useful when you want to document clearly that your code - is read-only. -

        -

        - as_literal() - can be used internally - in string algorithm libraries such that arrays of characters are handled - correctly. -

        -

        - as_array() - can be used with string algorithm libraries to make it clear that arrays - of characters are handled like an array and not like a string. -

        -

        - Notice that the above functions should always be called with qualification - (boost::) - to prevent unintended - Argument Dependent Lookup (ADL). -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/concept_implementation/semantics/metafunctions.html b/libs/range/doc/html/range/reference/concept_implementation/semantics/metafunctions.html deleted file mode 100644 index e98134b15..000000000 --- a/libs/range/doc/html/range/reference/concept_implementation/semantics/metafunctions.html +++ /dev/null @@ -1,273 +0,0 @@ - - - -Metafunctions - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        -

        - Expression -

        -
        -

        - Return type -

        -
        -

        - Complexity -

        -
        -

        - range_iterator<X>::type -

        -
        -

        -

        -
        T::iterator
        -P::first_type
        -A*
        -
        -

        -

        -
        -

        - compile time -

        -
        -

        - range_iterator<const - X>::type -

        -
        -

        -

        -
        T::const_iterator
        -P::first_type
        -const A*
        -
        -

        -

        -
        -

        - compile time -

        -
        -

        - range_value<X>::type -

        -
        -

        - boost::iterator_value<range_iterator<X>::type>::type -

        -
        -

        - compile time -

        -
        -

        - range_reference<X>::type -

        -
        -

        - boost::iterator_reference<range_iterator<X>::type>::type -

        -
        -

        - compile time -

        -
        -

        - range_pointer<X>::type -

        -
        -

        - boost::iterator_pointer<range_iterator<X>::type>::type -

        -
        -

        - compile time -

        -
        -

        - range_category<X>::type -

        -
        -

        - boost::iterator_category<range_iterator<X>::type>::type -

        -
        -

        - compile time -

        -
        -

        - range_difference<X>::type -

        -
        -

        - boost::iterator_difference<range_iterator<X>::type>::type -

        -
        -

        - compile time -

        -
        -

        - range_reverse_iterator<X>::type -

        -
        -

        - boost::reverse_iterator<range_iterator<X>::type> -

        -
        -

        - compile time -

        -
        -

        - range_reverse_iterator<const - X>::type -

        -
        -

        - boost::reverse_iterator<range_iterator<const X>::type -

        -
        -

        - compile time -

        -
        -

        - has_range_iterator<X>::type -

        -
        -

        - mpl::true_ if range_mutable_iterator<X>::type - is a valid expression, mpl::false_ - otherwise -

        -
        -

        - compile time -

        -
        -

        - has_range_const_iterator<X>::type -

        -
        -

        - mpl::true_ if range_const_iterator<X>::type - is a valid expression, mpl::false_ - otherwise -

        -
        -

        - compile time -

        -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/concept_implementation/synopsis.html b/libs/range/doc/html/range/reference/concept_implementation/synopsis.html deleted file mode 100644 index aea892b08..000000000 --- a/libs/range/doc/html/range/reference/concept_implementation/synopsis.html +++ /dev/null @@ -1,181 +0,0 @@ - - - -Synopsis - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        -

        -
        namespace boost
        -{
        -    //
        -    // Single Pass Range metafunctions
        -    //
        -
        -    template< class T, class Enabler=void >
        -    struct range_iterator;
        -
        -    template< class T >
        -    struct range_value;
        -
        -    template< class T >
        -    struct range_reference;
        -
        -    template< class T >
        -    struct range_pointer;
        -
        -    template< class T >
        -    struct range_category;
        -
        -    //
        -    // Forward Range metafunctions
        -    //
        -
        -    template< class T >
        -    struct range_difference;
        -
        -    //
        -    // Bidirectional Range metafunctions
        -    //
        -
        -    template< class T >
        -    struct range_reverse_iterator;
        -
        -    //
        -    // Single Pass Range functions
        -    //
        -
        -    template< class T >
        -    typename range_iterator<T>::type
        -    begin( T& r );
        -
        -    template< class T >
        -    typename range_iterator<const T>::type
        -    begin( const T& r );
        -
        -    template< class T >
        -    typename range_iterator<T>::type
        -    end( T& r );
        -
        -    template< class T >
        -    typename range_iterator<const T>::type
        -    end( const T& r );
        -
        -    template< class T >
        -    bool
        -    empty( const T& r );
        -
        -    //
        -    // Forward Range functions
        -    //
        -
        -    template< class T >
        -    typename range_difference<T>::type
        -    distance( const T& r );
        -
        -    template< class T >
        -    typename range_size<T>::type
        -    size( const T& r );
        -
        -    //
        -    // Bidirectional Range functions
        -    //
        -
        -    template< class T >
        -    typename range_reverse_iterator<T>::type
        -    rbegin( T& r );
        -
        -    template< class T >
        -    typename range_reverse_iterator<const T>::type
        -    rbegin( const T& r );
        -
        -    template< class T >
        -    typename range_reverse_iterator<T>::type
        -    rend( T& r );
        -
        -    template< class T >
        -    typename range_reverse_iterator<const T>::type
        -    rend( const T& r );
        -
        -    //
        -    // Special const Range functions
        -    //
        -
        -    template< class T >
        -    typename range_iterator<const T>::type
        -    const_begin( const T& r );
        -
        -    template< class T >
        -    typename range_iterator<const T>::type
        -    const_end( const T& r );
        -
        -    template< class T >
        -    typename range_reverse_iterator<const T>::type
        -    const_rbegin( const T& r );
        -
        -    template< class T >
        -    typename range_reverse_iterator<const T>::type
        -    const_rend( const T& r );
        -
        -    //
        -    // String utilities
        -    //
        -
        -    template< class T >
        -    iterator_range< ... see below ... >
        -    as_literal( T& r );
        -
        -    template< class T >
        -    iterator_range< ... see below ... >
        -    as_literal( const T& r );
        -
        -    template< class T >
        -    iterator_range< typename range_iterator<T>::type >
        -    as_array( T& r );
        -
        -    template< class T >
        -    iterator_range< typename range_iterator<const T>::type >
        -    as_array( const T& r );
        -
        -} // namespace 'boost'
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/extending.html b/libs/range/doc/html/range/reference/extending.html deleted file mode 100644 index 9f796876e..000000000 --- a/libs/range/doc/html/range/reference/extending.html +++ /dev/null @@ -1,52 +0,0 @@ - - - -Extending the library - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/extending/method_1.html b/libs/range/doc/html/range/reference/extending/method_1.html deleted file mode 100644 index 84d36c5f5..000000000 --- a/libs/range/doc/html/range/reference/extending/method_1.html +++ /dev/null @@ -1,162 +0,0 @@ - - - -Method 1: provide member functions and nested types - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - This procedure assumes that you have control over the types that should - be made conformant to a Range concept. If not, see method - 2. -

        -

        - The primary templates in this library are implemented such that standard - containers will work automatically and so will boost::array. - Below is given an overview of which member functions and member types a - class must specify to be useable as a certain Range concept. -

        -
        ---- - - - - - - - - - - - - - - -
        -

        - Member function -

        -
        -

        - Related concept -

        -
        -

        - begin() -

        -
        -

        - Single Pass - Range -

        -
        -

        - end() -

        -
        -

        - Single Pass - Range -

        -
        -

        - Notice that rbegin() - and rend() - member functions are not needed even though the container can support bidirectional - iteration. -

        -

        - The required member types are: -

        -
        ---- - - - - - - - - - - - - - - -
        -

        - Member type -

        -
        -

        - Related concept -

        -
        -

        - iterator -

        -
        -

        - Single Pass - Range -

        -
        -

        - const_iterator -

        -
        -

        - Single Pass - Range -

        -
        -

        - Again one should notice that member types reverse_iterator - and const_reverse_iterator - are not needed. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/extending/method_2.html b/libs/range/doc/html/range/reference/extending/method_2.html deleted file mode 100644 index 8d4a15b36..000000000 --- a/libs/range/doc/html/range/reference/extending/method_2.html +++ /dev/null @@ -1,287 +0,0 @@ - - - -Method 2: provide free-standing functions and specialize metafunctions - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - This procedure assumes that you cannot (or do not wish to) change the types - that should be made conformant to a Range concept. If this is not true, - see method 1. -

        -

        - The primary templates in this library are implemented such that certain - functions are found via argument-dependent-lookup (ADL). Below is given - an overview of which free-standing functions a class must specify to be - useable as a certain Range concept. Let x - be a variable (const or mutable) of the class in question. -

        -
        ---- - - - - - - - - - - - - - - - - - - -
        -

        - Function -

        -
        -

        - Related concept -

        -
        -

        - range_begin(x) -

        -
        -

        - Single Pass - Range -

        -
        -

        - range_end(x) -

        -
        -

        - Single Pass - Range -

        -
        -

        - range_calculate_size(x) -

        -
        -

        - Optional. This can be used to specify a mechanism for constant-time - computation of the size of a range. The default behaviour is - to return boost::end(x) - - boost::begin(x) - for random access ranges, and to return x.size() for ranges with lesser traversal - capability. This behaviour can be changed by implementing range_calculate_size in a manner - that will be found via ADL. The ability to calculate size in - O(1) is often possible even with ranges with traversal categories - less than random access. -

        -
        -

        - range_begin() - and range_end() - must be overloaded for both const - and mutable reference arguments. -

        -

        - You must also specialize two metafunctions for your type X: -

        -
        ---- - - - - - - - - - - - - - - -
        -

        - Metafunction -

        -
        -

        - Related concept -

        -
        -

        - boost::range_mutable_iterator -

        -
        -

        - Single Pass - Range -

        -
        -

        - boost::range_const_iterator -

        -
        -

        - Single Pass - Range -

        -
        -

        - A complete example is given here: -

        -

        -

        -
        #include <boost/range.hpp>
        -#include <iterator>         // for std::iterator_traits, std::distance()
        -
        -namespace Foo
        -{
        -    //
        -    // Our sample UDT. A 'Pair'
        -    // will work as a range when the stored
        -    // elements are iterators.
        -    //
        -    template< class T >
        -    struct Pair
        -    {
        -        T first, last;
        -    };
        -
        -} // namespace 'Foo'
        -
        -namespace boost
        -{
        -    //
        -    // Specialize metafunctions. We must include the range.hpp header.
        -    // We must open the 'boost' namespace.
        -    //
        -
        -	template< class T >
        -	struct range_mutable_iterator< Foo::Pair<T> >
        -	{
        -		typedef T type;
        -	};
        -
        -	template< class T >
        -	struct range_const_iterator< Foo::Pair<T> >
        -	{
        -		//
        -		// Remark: this is defined similar to 'range_iterator'
        -		//         because the 'Pair' type does not distinguish
        -		//         between an iterator and a const_iterator.
        -		//
        -		typedef T type;
        -	};
        -
        -} // namespace 'boost'
        -
        -namespace Foo
        -{
        -	//
        -	// The required functions. These should be defined in
        -	// the same namespace as 'Pair', in this case
        -	// in namespace 'Foo'.
        -	//
        -
        -	template< class T >
        -	inline T range_begin( Pair<T>& x )
        -	{
        -		return x.first;
        -	}
        -
        -	template< class T >
        -	inline T range_begin( const Pair<T>& x )
        -	{
        -		return x.first;
        -	}
        -
        -	template< class T >
        -	inline T range_end( Pair<T>& x )
        -	{
        -		return x.last;
        -	}
        -
        -	template< class T >
        -	inline T range_end( const Pair<T>& x )
        -	{
        -		return x.last;
        -	}
        -
        -} // namespace 'Foo'
        -
        -#include <vector>
        -
        -int main(int argc, const char* argv[])
        -{
        -	typedef std::vector<int>::iterator  iter;
        -	std::vector<int>                    vec;
        -	Foo::Pair<iter>                     pair = { vec.begin(), vec.end() };
        -	const Foo::Pair<iter>&              cpair = pair;
        -	//
        -	// Notice that we call 'begin' etc with qualification.
        -	//
        -	iter i = boost::begin( pair );
        -	iter e = boost::end( pair );
        -	i      = boost::begin( cpair );
        -	e      = boost::end( cpair );
        -	boost::range_difference< Foo::Pair<iter> >::type s = boost::size( pair );
        -	s      = boost::size( cpair );
        -	boost::range_reverse_iterator< const Foo::Pair<iter> >::type
        -	ri     = boost::rbegin( cpair ),
        -	re     = boost::rend( cpair );
        -
        -	return 0;
        -}
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/extending/method_3.html b/libs/range/doc/html/range/reference/extending/method_3.html deleted file mode 100644 index 4e5196938..000000000 --- a/libs/range/doc/html/range/reference/extending/method_3.html +++ /dev/null @@ -1,51 +0,0 @@ - - - -Method 3: provide range adaptor implementations - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/extending/method_3/method_3_1.html b/libs/range/doc/html/range/reference/extending/method_3/method_3_1.html deleted file mode 100644 index df3179227..000000000 --- a/libs/range/doc/html/range/reference/extending/method_3/method_3_1.html +++ /dev/null @@ -1,110 +0,0 @@ - - - -Method 3.1: Implement a Range Adaptor without arguments - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - To implement a Range Adaptor without arguments (e.g. reversed) you need - to: -

        -
          -
        1. - Provide a range for your return type, for example: -
          #include <boost/range/iterator_range.hpp>
          -#include <boost/iterator/reverse_iterator.hpp>
          -
          -template< typename R >
          -struct reverse_range :
          -    boost::iterator_range<
          -        boost::reverse_iterator<
          -            typename boost::range_iterator<R>::type> >
          -{
          -private:
          -    typedef boost::iterator_range<
          -        boost::reverse_iterator<
          -            typename boost::range_iterator<R>::type> > base;
          -
          -public:
          -    typedef boost::reverse_iterator<
          -        typename boost::range_iterator<R>::type > iterator;
          -
          -    reverse_range(R& r)
          -        : base(iterator(boost::end(r)), iterator(boost::begin(r)))
          -    { }
          -};
          -
          -
        2. -
        3. - Provide a tag to uniquely identify your adaptor in the operator| - function overload set -
          namespace detail {
          -    struct reverse_forwarder {};
          -}
          -
          -
        4. -
        5. - Implement operator| -
          template< class BidirectionalRng >
          -inline reverse_range<BidirectionalRng>
          -operator|( BidirectionalRng& r, detail::reverse_forwarder )
          -{
          -	return reverse_range<BidirectionalRng>( r );
          -}
          -
          -template< class BidirectionalRng >
          -inline reverse_range<const BidirectionalRng>
          -operator|( const BidirectionalRng& r, detail::reverse_forwarder )
          -{
          -	return reverse_range<const BidirectionalRng>( r );
          -}
          -
          -
        6. -
        7. - Declare the adaptor itself (it is a variable of the tag type). -
          namespace
          -{
          -    const detail::reverse_forwarder reversed = detail::reverse_forwarder();
          -}
          -
          -
        8. -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/extending/method_3/method_3_2.html b/libs/range/doc/html/range/reference/extending/method_3/method_3_2.html deleted file mode 100644 index 275b446a8..000000000 --- a/libs/range/doc/html/range/reference/extending/method_3/method_3_2.html +++ /dev/null @@ -1,138 +0,0 @@ - - - -Method 3.2: Implement a Range Adaptor with arguments - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
          -
        1. - Provide a range for your return type, for example: -
          #include <boost/range/adaptor/argument_fwd.hpp>
          -#include <boost/range/iterator_range.hpp>
          -#include <boost/iterator/transform_iterator.hpp>
          -
          -template<typename Value>
          -class replace_value
          -{
          -public:
          -    typedef const Value& result_type;
          -    typedef const Value& argument_type;
          -
          -    replace_value(const Value& from, const Value& to)
          -        : m_from(from), m_to(to)
          -    {
          -    }
          -
          -    const Value& operator()(const Value& x) const
          -    {
          -        return (x == m_from) ? m_to : x;
          -    }
          -private:
          -    Value m_from;
          -    Value m_to;
          -};
          -
          -template<typename Range>
          -class replace_range
          -: public boost::iterator_range<
          -    boost::transform_iterator<
          -        replace_value<typename boost::range_value<Range>::type>,
          -        typename boost::range_iterator<Range>::type> >
          -{
          -private:
          -    typedef typename boost::range_value<Range>::type value_type;
          -    typedef typename boost::range_iterator<Range>::type iterator_base;
          -    typedef replace_value<value_type> Fn;
          -    typedef boost::transform_iterator<Fn, iterator_base> replaced_iterator;
          -    typedef boost::iterator_range<replaced_iterator> base_t;
          -
          -public:
          -    replace_range(Range& rng, value_type from, value_type to)
          -        : base_t(replaced_iterator(boost::begin(rng), Fn(from,to)),
          -                 replaced_iterator(boost::end(rng), Fn(from,to)))
          -     {
          -     }
          - };
          -
          -
        2. -
        3. - Implement a holder class to hold the arguments required to construct - the RangeAdaptor. The holder combines multiple parameters into one - that can be passed as the right operand of operator|(). -
          template<typename T>
          -class replace_holder : public boost::range_detail::holder2<T>
          -{
          -public:
          -    replace_holder(const T& from, const T& to)
          -        : boost::range_detail::holder2<T>(from, to)
          -    { }
          -private:
          -    void operator=(const replace_holder&);
          -};
          -
          -
        4. -
        5. - Define an instance of the holder with the name of the adaptor -
          static boost::range_detail::forwarder2<replace_holder>
          -replaced = boost::range_detail::forwarder2<replace_holder>();
          -
          -
        6. -
        7. - Define operator| -
          template<typename SinglePassRange>
          -inline replace_range<SinglePassRange>
          -operator|(SinglePassRange& rng,
          -          const replace_holder<typename boost::range_value<SinglePassRange>::type>& f)
          -{
          -    return replace_range<SinglePassRange>(rng, f.val1, f.val2);
          -}
          -
          -template<typename SinglePassRange>
          -inline replace_range<const SinglePassRange>
          -operator|(const SinglePassRange& rng,
          -          const replace_holder<typename boost::range_value<SinglePassRange>::type>& f)
          -{
          -    return replace_range<const SinglePassRange>(rng, f.val1, f.val2);
          -}
          -
          -
        8. -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/overview.html b/libs/range/doc/html/range/reference/overview.html deleted file mode 100644 index a775c07ed..000000000 --- a/libs/range/doc/html/range/reference/overview.html +++ /dev/null @@ -1,71 +0,0 @@ - - - -Overview - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - Three types of objects are currently supported by the library: -

        -
          -
        • - standard-like containers -
        • -
        • - std::pair<iterator,iterator> -
        • -
        • - built-in arrays -
        • -
        -

        - Even though the behavior of the primary templates are exactly such that standard - containers will be supported by default, the requirements are much lower - than the standard container requirements. For example, the utility class - iterator_range - implements the minimal interface - required to make the class a Forward - Range. -

        -

        - Please also see Range concepts for - more details. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/ranges.html b/libs/range/doc/html/range/reference/ranges.html deleted file mode 100644 index 65ab8b816..000000000 --- a/libs/range/doc/html/range/reference/ranges.html +++ /dev/null @@ -1,50 +0,0 @@ - - - -Provided Ranges - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/ranges/any_range.html b/libs/range/doc/html/range/reference/ranges/any_range.html deleted file mode 100644 index b461b8268..000000000 --- a/libs/range/doc/html/range/reference/ranges/any_range.html +++ /dev/null @@ -1,177 +0,0 @@ - - - -any_range - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Description -
        -

        - any_range is a range that - has the type information erased hence a any_range<int, boost::forward_traversal_tag, int, - std::ptrdiff_t> - can be used to represent a std::vector<int>, a std::list<int> or many other types. -

        -

        - The type - erasure article covers the motivation and goals of type erasure - in this context. Clearly my implementation is building upon a lot of prior - art created by others. Thomas Becker's any_iterator - was a strong influence. Adobe also have an any_iterator - implementation, but this has very tight coupling to other parts of the - library that precluded it from use in Boost.Range. Early development versions - of this Range Adaptor directly used Thomas Becker's any_iterator implementation. - Subsequently I discovered that the heap allocations of this and many other - implementations cause poor speed performance particularly at the tails - of the distribution. To solve this required a new design that incorporated - the embedded buffer optimization. -

        -

        - Despite the underlying any_iterator - being the fastest available implementation, the performance overhead of - any_range is still appreciable - due to the cost of virtual function calls required to implement increment, decrement, - advance, equal etc. Frequently a better design - choice is to convert to a canonical form. -

        -

        - Please see the type_erased - for a Range Adaptor that returns any_range - instances. -

        -
        - - Synopsis -
        -

        -

        -
        template<
        -    class Value
        -  , class Traversal
        -  , class Reference
        -  , class Difference
        -  , class Buffer = any_iterator_default_buffer
        ->
        -class any_range
        -    : public iterator_range<
        -        range_detail::any_iterator<
        -            Value
        -          , Traversal
        -          , Reference
        -          , Difference
        -          , Buffer
        -        >
        -    >
        -{
        -    typedef range_detail::any_iterator<
        -        Value
        -      , Traversal
        -      , Reference
        -      , Difference
        -      , Buffer
        -    > any_iterator_type;
        -
        -    typedef iterator_range<any_iterator_type> base_type;
        -
        -    struct enabler {};
        -    struct disabler {};
        -public:
        -    typedef any_iterator_type iterator;
        -    typedef any_iterator_type const_iterator;
        -
        -    any_range()
        -    {
        -    }
        -
        -    any_range(const any_range& other)
        -        : base_type(other)
        -    {
        -    }
        -
        -    template<class WrappedRange>
        -    any_range(WrappedRange& wrapped_range)
        -    : base_type(boost::begin(wrapped_range),
        -                boost::end(wrapped_range))
        -    {
        -    }
        -
        -    template<class WrappedRange>
        -    any_range(const WrappedRange& wrapped_range)
        -    : base_type(boost::begin(wrapped_range),
        -                boost::end(wrapped_range))
        -    {
        -    }
        -
        -    template<
        -        class OtherValue
        -      , class OtherTraversal
        -      , class OtherReference
        -      , class OtherDifference
        -    >
        -    any_range(const any_range<
        -                        OtherValue
        -                      , OtherTraversal
        -                      , OtherReference
        -                      , OtherDifference
        -                      , Buffer
        -                    >& other)
        -    : base_type(boost::begin(other), boost::end(other))
        -    {
        -    }
        -
        -    template<class Iterator>
        -    any_range(Iterator first, Iterator last)
        -        : base_type(first, last)
        -    {
        -    }
        -};
        -
        -

        -

        -
        - - Definition -
        -

        - Defined in header file boost/range/any_range.hpp -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/ranges/counting_range.html b/libs/range/doc/html/range/reference/ranges/counting_range.html deleted file mode 100644 index 9878e4167..000000000 --- a/libs/range/doc/html/range/reference/ranges/counting_range.html +++ /dev/null @@ -1,90 +0,0 @@ - - - -counting_range - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template< class Incrementable > inline
        -iterator_range< counting_iterator<Incrementable> >
        -counting_range(Incrementable first, Incrementable last);
        -
        -template< class SinglePassRange > inline
        -iterator_range< counting_iterator<typename range_iterator<SinglePassRange>::type >
        -counting_range(const SinglePassRange& rng);
        -
        -template< class SinglePassRange > inline
        -iterator_range< counting_iterator<typename range_iterator<SinglePassRange>::type >
        -counting_range(SinglePassRange& rng);
        -
        -

        -

        -
        - - Description -
        -

        - counting_range is a function - to generator that generates an iterator_range - wrapping a counting_iterator - (from Boost.Iterator). -

        -
        - - Definition -
        -

        - Defined in header file boost/range/counting_range.hpp -

        -
        - - Requirements -
        -
        1. - Incrementable is a - model of the Incrementable - Concept. -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/ranges/irange.html b/libs/range/doc/html/range/reference/ranges/irange.html deleted file mode 100644 index 4e57526b0..000000000 --- a/libs/range/doc/html/range/reference/ranges/irange.html +++ /dev/null @@ -1,104 +0,0 @@ - - - -irange - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        -

        -irange -

        -
        - - Prototype -
        -

        -

        -
        template<class Integer>
        -iterator_range< range_detail::integer_iterator<Integer> >
        -irange(Integer first, Integer  last);
        -
        -template<class Integer, class StepSize>
        -iterator_range< range_detail::integer_iterator_with_step<Integer, StepSize> >
        -irange(Integer first, Integer last, StepSize step_size);
        -
        -

        -

        -
        - - Description -
        -

        - irange is a function to - generate an Integer Range. -

        -

        - irange allows treating - integers as a model of the Random - Access Range Concept. It should be noted that the first and last - parameters denoted a half-open range. -

        -
        - - Definition -
        -

        - Defined in the header file boost/range/irange.hpp -

        -
        - - Requirements -
        -
          -
        1. - Integer is a model - of the Integer Concept. -
        2. -
        3. - StepSize is a model - of the SignedInteger - Concept. -
        4. -
        -
        - - Complexity -
        -

        - Constant. Since this function generates a new range the most significant - performance cost is incurred through the iteration of the generated range. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/ranges/istream_range.html b/libs/range/doc/html/range/reference/ranges/istream_range.html deleted file mode 100644 index 1a08e6da2..000000000 --- a/libs/range/doc/html/range/reference/ranges/istream_range.html +++ /dev/null @@ -1,72 +0,0 @@ - - - -istream_range - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        - - Prototype -
        -

        -

        -
        template< class Type, class Elem, class Traits > inline
        -iterator_range< std::istream_iterator<Type, Elem, Traits> >
        -istream_range(std::basic_istream<Elem, Traits>& in);
        -
        -

        -

        -
        - - Description -
        -

        - istream_range is a function - to generator that generates an iterator_range - wrapping a std::istream_iterator. -

        -
        - - Definition -
        -

        - Defined in header file boost/range/istream_range.hpp -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/utilities.html b/libs/range/doc/html/range/reference/utilities.html deleted file mode 100644 index c88d5958d..000000000 --- a/libs/range/doc/html/range/reference/utilities.html +++ /dev/null @@ -1,88 +0,0 @@ - - - -Utilities - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - - -

        - Having an abstraction that encapsulates a pair of iterators is very useful. - The standard library uses std::pair - in some circumstances, but that class is cumbersome to use because we need - to specify two template arguments, and for all range algorithm purposes we - must enforce the two template arguments to be the same. Moreover, std::pair<iterator,iterator> is hardly self-documenting whereas more - domain specific class names are. Therefore these two classes are provided: -

        -
          -
        • - Class iterator_range -
        • -
        • - Class sub_range -
        • -
        • - Function combine -
        • -
        • - Function join -
        • -
        -

        - The iterator_range class - is templated on an Forward - Traversal Iterator and should be used whenever fairly general code - is needed. The sub_range - class is templated on an Forward - Range and it is less general, but a bit easier to use since its template - argument is easier to specify. The biggest difference is, however, that a - sub_range can propagate constness - because it knows what a corresponding const_iterator - is. -

        -

        - Both classes can be used as ranges since they implement the minimal - interface required for this to work automatically. -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/utilities/combine.html b/libs/range/doc/html/range/reference/utilities/combine.html deleted file mode 100644 index 543e1ebef..000000000 --- a/libs/range/doc/html/range/reference/utilities/combine.html +++ /dev/null @@ -1,142 +0,0 @@ - - - -Function combine - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - The combine function is - used to make one range from multiple ranges. The combine - function returns a combined_range - which is an iterator_range - of a zip_iterator from - the Boost.Iterator library. -

        -
        - - Synopsis -
        -

        -

        -
        namespace boost
        -{
        -    namespace range
        -    {
        -
        -template<typename IterTuple>
        -class combined_range
        -    : public iterator_range<zip_iterator<IterTuple> >
        -{
        -public:
        -    combined_range(IterTuple first, IterTuple last);
        -};
        -
        -template<typename... Ranges>
        -auto combine(Ranges&&... rngs) ->
        -    combined_range<decltype(boost::make_tuple(boost::begin(rngs)...))>
        -
        -    } // namespace range
        -} // namespace boost
        -
        -

        -

        -
          -
        • - Precondition: For each type r in Ranges, - r is a model of Single Pass Range - or better. -
        • -
        • - Return Type: combined_range<tuple<typename - range_iterator<Ranges>::type...> - > -
        • -
        • - Returned Range Category: The minimum - of the range category of every range r - in Ranges. -
        • -
        -
        - - Example -
        -

        -

        -
        #include <boost/range/combine.hpp>
        -#include <boost/foreach.hpp>
        -#include <iostream>
        -#include <vector>
        -#include <list>
        -
        -int main(int, const char*[])
        -{
        -    std::vector<int> v;
        -    std::list<char> l;
        -    for (int i = 0; i < 5; ++i)
        -    {
        -        v.push_back(i);
        -        l.push_back(static_cast<char>(i) + 'a');
        -    }
        -
        -    int ti;
        -    char tc;
        -    BOOST_FOREACH(boost::tie(ti, tc), boost::combine(v, l))
        -    {
        -        std::cout << '(' << ti << ',' << tv << ')' << '\n';
        -    }
        -
        -    return 0;
        -}
        -
        -

        -

        -

        - This produces the output: -

        -
        (0,a)
        -(1,b)
        -(2,c)
        -(3,d)
        -(4,e)
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/utilities/iterator_range.html b/libs/range/doc/html/range/reference/utilities/iterator_range.html deleted file mode 100644 index e04a8f407..000000000 --- a/libs/range/doc/html/range/reference/utilities/iterator_range.html +++ /dev/null @@ -1,305 +0,0 @@ - - - -Class iterator_range - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - The intention of the iterator_range - class is to encapsulate two iterators so they fulfill the Forward - Range concept. A few other functions are also provided for convenience. -

        -

        - If the template argument is not a model of Forward - Traversal Iterator, one can still use a subset of the interface. - In particular, size() - requires Random Access Traversal Iterators whereas empty() only requires Single Pass Iterators. -

        -

        - Recall that many default constructed iterators are singular - and hence can only be assigned, but not compared or incremented or anything. - However, if one creates a default constructed iterator_range, - then one can still call all its member functions. This design decision - avoids the iterator_range - imposing limitations upon ranges of iterators that are not singular. Any - singularity limitation is simply propagated from the underlying iterator - type. -

        -
        - - Synopsis -
        -

        - The core functionality is in the header file <boost/range/iterator_range_core.hpp> - this includes all of the functionality except the boost::hash_value - and std::iostream support. -

        -

        - The std::iostream support is in the header <boost/range/iterator_core.hpp> while the boost::hash_value - support is in <boost/range/iterator_range_hash.hpp> -

        -

        -

        -
        namespace boost
        -{
        -    template< class ForwardTraversalIterator >
        -    class iterator_range
        -    {
        -    public: // Forward Range types
        -        typedef ForwardTraversalIterator   iterator;
        -        typedef ForwardTraversalIterator   const_iterator;
        -        typedef iterator_difference<iterator>::type difference_type;
        -
        -    public: // construction, assignment
        -        template< class ForwardTraversalIterator2 >
        -        iterator_range( ForwardTraversalIterator2 Begin, ForwardTraversalIterator2 End );
        -
        -        template< class ForwardRange >
        -        iterator_range( ForwardRange& r );
        -
        -        template< class ForwardRange >
        -        iterator_range( const ForwardRange& r );
        -
        -        template< class ForwardRange >
        -        iterator_range& operator=( ForwardRange& r );
        -
        -        template< class ForwardRange >
        -        iterator_range& operator=( const ForwardRange& r );
        -
        -    public: // Forward Range functions
        -        iterator  begin() const;
        -        iterator  end() const;
        -
        -    public: // convenience
        -        operator    unspecified_bool_type() const;
        -        bool        equal( const iterator_range& ) const;
        -        value_type& front() const;
        -        void        drop_front();
        -        void        drop_front(difference_type n);
        -        bool      empty() const;
        -
        -        iterator_range& advance_begin(difference_type n);
        -        iterator_range& advance_end(difference_type n);
        -
        -        // for Bidirectional:
        -        value_type& back() const;
        -        void drop_back();
        -        void drop_back(difference_type n);
        -        // for Random Access only:
        -        reference operator[]( difference_type at ) const;
        -        value_type operator()( difference_type at ) const;
        -        size_type size() const;
        -    };
        -
        -    // stream output
        -    template< class ForwardTraversalIterator, class T, class Traits >
        -    std::basic_ostream<T,Traits>&
        -    operator<<( std::basic_ostream<T,Traits>& Os,
        -                const iterator_range<ForwardTraversalIterator>& r );
        -
        -    // comparison
        -    template< class ForwardTraversalIterator, class ForwardTraversalIterator2 >
        -    bool operator==( const iterator_range<ForwardTraversalIterator>& l,
        -                     const iterator_range<ForwardTraversalIterator2>& r );
        -
        -    template< class ForwardTraversalIterator, class ForwardRange >
        -    bool operator==( const iterator_range<ForwardTraversalIterator>& l,
        -                     const ForwardRange& r );
        -
        -    template< class ForwardTraversalIterator, class ForwardRange >
        -    bool operator==( const ForwardRange& l,
        -                     const iterator_range<ForwardTraversalIterator>& r );
        -
        -    template< class ForwardTraversalIterator, class ForwardTraversalIterator2 >
        -    bool operator!=( const iterator_range<ForwardTraversalIterator>& l,
        -                     const iterator_range<ForwardTraversalIterator2>& r );
        -
        -    template< class ForwardTraversalIterator, class ForwardRange >
        -    bool operator!=( const iterator_range<ForwardTraversalIterator>& l,
        -                     const ForwardRange& r );
        -
        -    template< class ForwardTraversalIterator, class ForwardRange >
        -    bool operator!=( const ForwardRange& l,
        -                     const iterator_range<ForwardTraversalIterator>& r );
        -
        -    template< class ForwardTraversalIterator, class ForwardTraversalIterator2 >
        -    bool operator<( const iterator_range<ForwardTraversalIterator>& l,
        -                    const iterator_range<ForwardTraversalIterator2>& r );
        -
        -    template< class ForwardTraversalIterator, class ForwardRange >
        -    bool operator<( const iterator_range<ForwardTraversalIterator>& l,
        -                    const ForwardRange& r );
        -
        -    template< class ForwardTraversalIterator, class ForwardRange >
        -    bool operator<( const ForwardRange& l,
        -                    const iterator_range<ForwardTraversalIterator>& r );
        -
        -    // external construction
        -    template< class ForwardTraversalIterator >
        -    iterator_range< ForwardTraversalIterator >
        -    make_iterator_range( ForwardTraversalIterator Begin,
        -                         ForwardTraversalIterator End );
        -
        -    // Make an iterator_range [first, boost::next(first, n) )
        -    template< class ForwardTraversalIterator, class Integer >
        -    iterator_range< ForwardTraversalIterator >
        -    make_iterator_range_n( ForwardTraversalIterator first, Integer n );
        -
        -
        -    template< class ForwardRange >
        -    iterator_range< typename range_iterator<ForwardRange>::type >
        -    make_iterator_range( ForwardRange& r );
        -
        -    template< class ForwardRange >
        -    iterator_range< typename range_iterator<const ForwardRange>::type >
        -    make_iterator_range( const ForwardRange& r );
        -
        -    template< class Range >
        -    iterator_range< typename range_iterator<Range>::type >
        -    make_iterator_range( Range& r,
        -                         typename range_difference<Range>::type advance_begin,
        -                         typename range_difference<Range>::type advance_end );
        -
        -    template< class Range >
        -    iterator_range< typename range_iterator<const Range>::type >
        -    make_iterator_range( const Range& r,
        -                         typename range_difference<const Range>::type advance_begin,
        -                         typename range_difference<const Range>::type advance_end );
        -
        -    // convenience
        -    template< class Sequence, class ForwardRange >
        -    Sequence copy_range( const ForwardRange& r );
        -
        -} // namespace 'boost'
        -
        -

        -

        -

        - If an instance of iterator_range - is constructed by a client with two iterators, the client must ensure that - the two iterators delimit a valid closed-open range [begin,end). -

        -

        - It is worth noticing that the templated constructors and assignment operators - allow conversion from iterator_range<iterator> to iterator_range<const_iterator>. Similarly, since the comparison operators - have two template arguments, we can compare ranges whenever the iterators - are comparable; for example when we are dealing with const and non-const - iterators from the same container. -

        -
        - - Details - member functions -
        -

        - operator unspecified_bool_type() const; -

        -

        - Returns !empty(); -

        -

        - bool equal( iterator_range& r ) const; -

        -

        - Returns begin() == r.begin() && - end() - == r.end(); -

        -
        - - Details - functions -
        -

        - bool operator==( const ForwardRange1& - l, - const ForwardRange2& r ); -

        -

        - Returns size(l) != size(r) ? false - : std::equal( begin(l), end(l), begin(r) ); -

        -

        - bool operator!=( const ForwardRange1& - l, - const ForwardRange2& r ); -

        -

        - Returns !( l == r ); -

        -

        - bool operator<( const ForwardRange1& - l, - const ForwardRange2& r ); -

        -

        - Returns std::lexicographical_compare( - begin(l), end(l), begin(r), end(r) ); -

        -

        -

        -
        iterator_range make_iterator_range( Range& r,
        -                                    typename range_difference<Range>::type advance_begin,
        -                                    typename range_difference<Range>::type advance_end );
        -
        -

        -

        -

        - Effects: -

        -

        -

        -
        iterator new_begin = begin( r ),
        -iterator new_end   = end( r );
        -std::advance( new_begin, advance_begin );
        -std::advance( new_end, advance_end );
        -return make_iterator_range( new_begin, new_end );
        -
        -

        -

        -

        - Sequence copy_range( const ForwardRange& - r ); -

        -

        - Returns Sequence( - begin(r), end(r) ); -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/utilities/join.html b/libs/range/doc/html/range/reference/utilities/join.html deleted file mode 100644 index e7f2296d2..000000000 --- a/libs/range/doc/html/range/reference/utilities/join.html +++ /dev/null @@ -1,132 +0,0 @@ - - - -Function join - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - The intention of the join - function is to join two ranges into one longer range. -

        -

        - The resultant range will have the lowest common traversal of the two ranges - supplied as parameters. -

        -

        - Note that the joined range incurs a performance cost due to the need to - check if the end of a range has been reached internally during traversal. -

        -
        - - Synopsis -
        -

        -

        -
        template<typename SinglePassRange1, typename SinglePassRange2>
        -joined_range<const SinglePassRange1, const SinglePassRange2>
        -join(const SinglePassRange1& rng1, const SinglePassRange2& rng2)
        -
        -template<typename SinglePassRange1, typename SinglePassRange2>
        -joined_range<SinglePassRange1, SinglePassRange2>
        -join(SinglePassRange1& rng1, SinglePassRange2& rng2);
        -
        -

        -

        -

        - For the const version: -

        -
          -
        • - Precondition: The range_value<SinglePassRange2>::type - must be convertible to range_value<SinglePassRange1>::type. - The range_reference<const - SinglePassRange2>::type must be convertible to range_reference<const SinglePassRange1>::type. -
        • -
        • - Range Category: Both rng1 and rng2 - must be a model of Single - Pass Range or better. -
        • -
        • - Range Return Type: joined_range<const - SinglePassRange1, - const SinglePassRange2> which is a model of the lesser - of the two range concepts passed. -
        • -
        • - Returned Range Category: The minimum - of the range category of rng1 - and rng2. -
        • -
        -

        - For the mutable version: -

        -
          -
        • - Precondition: The range_value<SinglePassRange2>::type - must be convertible to range_value<SinglePassRange1>::type. - The range_reference<SinglePassRange2>::type - must be convertible to range_reference<SinglePassRange1>::type. -
        • -
        • - Range Category: Both rng1 and rng2 - must be a model of Single - Pass Range or better. -
        • -
        • - Range Return Type: joined_range<SinglePassRange1, SinglePassRange2> which is a model of the lesser - of the two range concepts passed. -
        • -
        • - Returned Range Category: The minimum - of the range category of rng1 - and rng2. -
        • -
        -
        - - Example -
        -

        - The expression join(irange(0,5), irange(5,10)) would - evaluate to a range representing an integer range [0,10) -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/reference/utilities/sub_range.html b/libs/range/doc/html/range/reference/utilities/sub_range.html deleted file mode 100644 index 8255bfe66..000000000 --- a/libs/range/doc/html/range/reference/utilities/sub_range.html +++ /dev/null @@ -1,133 +0,0 @@ - - - -Class sub_range - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - The sub_range class inherits - all its functionality from the iterator_range class. The sub_range class is often easier to use - because one must specify the Forward - Range template argument instead of an iterator. Moreover, the sub_range class can propagate constness - since it knows what a corresponding const_iterator - is. -

        -
        - - Synopsis -
        -

        -

        -
        namespace boost
        -{
        -    template< class ForwardRange >
        -    class sub_range : public iterator_range< typename range_iterator<ForwardRange>::type >
        -    {
        -    public:
        -        typedef typename range_value<ForwardRange>::type value_type;
        -        typedef typename range_iterator<ForwardRange>::type iterator;
        -        typedef typename range_iterator<const ForwardRange>::type  const_iterator;
        -        typedef typename range_difference<ForwardRange>::type difference_type;
        -        typedef typename range_size<ForwardRange>::type size_type;
        -        typedef typename range_reference<ForwardRange>::type reference;
        -        typedef typename range_reference<const ForwardRange>::type const_reference;
        -
        -    public: // construction, assignment
        -        sub_range();
        -
        -        template< class ForwardTraversalIterator >
        -        sub_range( ForwardTraversalIterator Begin, ForwardTraversalIterator End );
        -
        -        template< class ForwardRange2 >
        -        sub_range( ForwardRange2& r );
        -
        -        template< class ForwardRange2 >
        -        sub_range( const Range2& r );
        -
        -        template< class ForwardRange2 >
        -        sub_range& operator=( ForwardRange2& r );
        -
        -        template< class ForwardRange2 >
        -        sub_range& operator=( const ForwardRange2& r );
        -
        -        // iterator accessors
        -        const_iterator begin() const;
        -        iterator begin();
        -        const_iterator end() const;
        -        iterator end();
        -
        -        reference front();
        -        const_reference front() const;
        -
        -        sub_range& advance_begin(difference_type n);
        -        sub_range& advance_end(difference_type n);
        -
        -        // If traversal >= bidirectional:
        -        reference back();
        -        const_reference back();
        -
        -        // If traversal >= random-access:
        -        reference operator[](difference_type n);
        -        const_reference operator[](difference_type n) const;
        -
        -    public:
        -        // rest of interface inherited from iterator_range
        -    };
        -
        -} // namespace 'boost'
        -
        -

        -

        -

        - The class should be trivial to use as seen below. Imagine that we have - an algorithm that searches for a sub-string in a string. The result is - an iterator_range, that delimits the match. We need to store the result - from this algorithm. Here is an example of how we can do it with and without - sub_range -

        -

        -

        -
        std::string str("hello");
        -iterator_range<std::string::iterator> ir = find_first( str, "ll" );
        -sub_range<std::string>               sub = find_first( str, "ll" );
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/style_guide.html b/libs/range/doc/html/range/style_guide.html deleted file mode 100644 index b27eef431..000000000 --- a/libs/range/doc/html/range/style_guide.html +++ /dev/null @@ -1,150 +0,0 @@ - - - -Terminology and style guidelines - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - The use of a consistent terminology is as important for Ranges - and range-based algorithms as it is for iterators and iterator-based algorithms. - If a conventional set of names are adopted, we can avoid misunderstandings - and write generic function prototypes that are self-documenting. -

        -

        - Since ranges are characterized by a specific underlying iterator type, we get - a type of range for each type of iterator. Hence we can speak of the following - types of ranges: -

        -
        -

        - Notice how we have used the categories from the new - style iterators. -

        -

        - Notice that an iterator (and therefore an range) has one traversal - property and one or more properties from the value - access category. So in reality we will mostly talk about - mixtures such as -

        -
          -
        • - Random Access Readable Writeable Range -
        • -
        • - Forward Lvalue Range -
        • -
        -

        - By convention, we should always specify the traversal - property first as done above. This seems reasonable since there will only be - one traversal property, - but perhaps many value access - properties. -

        -

        - It might, however, be reasonable to specify only one category if the other - category does not matter. For example, the iterator_range can be constructed - from a Forward Range. This means that we do not care about what value - access properties the Range has. Similarly, a Readable - Range will be one that has the lowest possible traversal - property (Single Pass). -

        -

        - As another example, consider how we specify the interface of std::sort(). Algorithms are usually more cumbersome to - specify the interface of since both traversal - and value access properties - must be exactly defined. The iterator-based version looks like this: -

        -

        -

        -
        template< class RandomAccessTraversalReadableWritableIterator >
        -void sort( RandomAccessTraversalReadableWritableIterator first,
        -           RandomAccessTraversalReadableWritableIterator last );
        -
        -

        -

        -

        - For ranges the interface becomes -

        -

        -

        -
        template< class RandomAccessReadableWritableRange >
        -void sort( RandomAccessReadableWritableRange& r );
        -
        -

        -

        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/upgrade.html b/libs/range/doc/html/range/upgrade.html deleted file mode 100644 index d4a2499d9..000000000 --- a/libs/range/doc/html/range/upgrade.html +++ /dev/null @@ -1,56 +0,0 @@ - - - -Upgrade version of Boost.Range - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        - - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/upgrade/upgrade_from_1_34.html b/libs/range/doc/html/range/upgrade/upgrade_from_1_34.html deleted file mode 100644 index 67a1fafa9..000000000 --- a/libs/range/doc/html/range/upgrade/upgrade_from_1_34.html +++ /dev/null @@ -1,79 +0,0 @@ - - - -Upgrade from version 1.34 - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - Boost version 1.35 introduced some larger refactorings of the library: -

        -
          -
        1. - Direct support for character arrays was abandoned in favor of uniform - treatment of all arrays. Instead string algorithms can use the new function - as_literal(). -
        2. -
        3. - size now requires a Random - Access Range. The old behavior is provided as distance(). -
        4. -
        5. - range_size<T>::type has been completely removed in - favor of range_difference<T>::type -
        6. -
        7. - boost_range_begin() - and boost_range_end() - have been renamed range_begin() and range_end() respectively. -
        8. -
        9. - range_result_iterator<T>::type - and range_reverse_result_iterator<T>::type - have been renamed range_iterator<T>::type - and range_reverse_iterator<T>::type. -
        10. -
        11. - The procedure that makes a custom type work with the library has been - greatly simplified. See Extending - the library for UDTs for details. -
        12. -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/upgrade/upgrade_from_1_42.html b/libs/range/doc/html/range/upgrade/upgrade_from_1_42.html deleted file mode 100644 index d9334b062..000000000 --- a/libs/range/doc/html/range/upgrade/upgrade_from_1_42.html +++ /dev/null @@ -1,69 +0,0 @@ - - - -Upgrade from version 1.42 - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -

        - New features: -

        - -

        - Removed: -

        -
        1. - iterator_range no longer - has a is_singular member - function. The singularity restrictions have been removed from the iterator_range class since this added - restrictions to ranges of iterators whose default constructors were not - singular. Previously the is_singular - member function always returned false - in release build configurations, hence it is not anticipated that this - interface change will produce difficulty in upgrading. -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/upgrade/upgrade_from_1_45.html b/libs/range/doc/html/range/upgrade/upgrade_from_1_45.html deleted file mode 100644 index de862b4ba..000000000 --- a/libs/range/doc/html/range/upgrade/upgrade_from_1_45.html +++ /dev/null @@ -1,65 +0,0 @@ - - - -Upgrade from version 1.45 - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
          -
        1. - size in addition to supporting - Random Access Range - now also supports extensibility via calls to the unqualified range_calculate_size(rng) - function. -
        2. -
        3. - strided - now in addition to working with any RandomAccessRange additionally works - for any SinglePassRange for which boost::size(rng) is valid. -
        4. -
        5. - strided - no longer requires distance(rng) % stride_size - == 0 - or stride_size < - distance(rng) -
        6. -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/upgrade/upgrade_from_1_49.html b/libs/range/doc/html/range/upgrade/upgrade_from_1_49.html deleted file mode 100644 index fbcfbc1c1..000000000 --- a/libs/range/doc/html/range/upgrade/upgrade_from_1_49.html +++ /dev/null @@ -1,50 +0,0 @@ - - - -Upgrade from version 1.49 - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
        1. - size now returns the type Rng::size_type - if the range has size_type; otherwise range_size<Rng>::type is - used. This is the distance type promoted to an unsigned type. -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/html/range/upgrade/upgrade_from_1_55.html b/libs/range/doc/html/range/upgrade/upgrade_from_1_55.html deleted file mode 100644 index f7691ff97..000000000 --- a/libs/range/doc/html/range/upgrade/upgrade_from_1_55.html +++ /dev/null @@ -1,64 +0,0 @@ - - - -Upgrade from version 1.55 - - - - - - - - - - - - - - - -
        Boost C++ LibrariesHomeLibrariesPeopleFAQMore
        -
        -
        -PrevUpHomeNext -
        -
        - -
          -
        1. - iterator_range is now implemented - by implementing the member functions size(), operator[] via inheritance of base-classes specialized - by the traversal type of the underlying iterator. This is normally requires - no alteration of code. It does mean that types that derive from iterator_range - may need to prefix this-> to the various member functions. - Additionally it has been noted that some calling code was relying on - member functions such as size() being present despite the underlying - iterators not being random-access due to iterator_reference<Iter>::type - not being a reference. The suggested refactoring is to use boost::size(rng). -
        2. -
        3. - The undocumented iterator_range pop_front() - has been deprecated and is replaced by drop_front(). Similarly - pop_back() has been replaced - by drop_back()`. -
        4. -
        -
        - - - -
        -
        -
        -PrevUpHomeNext -
        - - diff --git a/libs/range/doc/introduction.qbk b/libs/range/doc/introduction.qbk deleted file mode 100644 index d03a65bc7..000000000 --- a/libs/range/doc/introduction.qbk +++ /dev/null @@ -1,43 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:introduction Introduction] - -Generic algorithms have so far been specified in terms of two or more iterators. Two iterators would together form a range of values that the algorithm could work on. This leads to a very general interface, but also to a somewhat clumsy use of the algorithms with redundant specification of container names. Therefore we would like to raise the abstraction level for algorithms so they specify their interface in terms of __ranges__ as much as possible. - -The most common form of ranges used throughout the C++ community are standard library containers. When writing algorithms however, one often finds it desirable for the algorithm to accept other types that offer enough functionality to satisfy the needs of the generic code [*/if a suitable layer of indirection is applied/] . For example, raw arrays are often suitable for use with generic code that works with containers, provided a suitable adapter is used. Likewise, null terminated strings can be treated as containers of characters, if suitably adapted. - -This library therefore provides the means to adapt standard-like containers, null terminated strings, `std::pairs` of iterators, and raw arrays (and more), such that the same generic code can work with them all. The basic idea is to add another layer of indirection using __metafunctions__ and free-standing functions so syntactic and/or semantic differences can be removed. - -The main advantages are - -* simpler implementation and specification of generic range algorithms -* more flexible, compact and maintainable client code -* safe use of built-in arrays (for legacy code; why else would you use built-in arrays?) - -[heading Example - Iterate over the values in a map] -`` -using namespace boost; -using namespace boost::adaptors; -for_each( my_map | map_values, fn ); -`` - -[heading Example - Iterate over the keys in a map] -`` -using namespace boost; -using namespace boost::adaptors; -for_each( my_map | map_keys, fn ); -`` - -[heading Example - Push the even values from a map in reverse order into the container `target`] -`` -using namespace boost; -using namespace boost::adaptors; -// Assume that is_even is a predicate that has been implemented elsewhere... -push_back(target, my_map | map_values | filtered(is_even()) | reversed); -`` - -[endsect] - diff --git a/libs/range/doc/mfc_atl.qbk b/libs/range/doc/mfc_atl.qbk deleted file mode 100644 index 0056283d9..000000000 --- a/libs/range/doc/mfc_atl.qbk +++ /dev/null @@ -1,148 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[def __mfc_collections__ [@http://msdn.microsoft.com/en-us/library/942860sh.aspx MFC Collection Classes]] -[def __atl_collections__ [@http://msdn.microsoft.com/en-us/library/15e672bd.aspx ATL Collection Classes]] - -[section:mfc_atl MFC/ATL (courtesy of Shunsuke Sogame)] - -[h4 Introduction] -This implementation was kindly donated by Shunsuke Sogame. This header adapts MFC and ATL containers to the appropriate Range concepts. - -[table - [] - [[[*Author:]] [Shunsuke Sogame]] - [[[*Contact:]] [mb2act@yahoo.co.jp]] - [[[*Date:]] [26th of May 2006]] - [[[*Copyright:]] [Shunsuke Sogame 2005-2006. Use, modification and distribution is subject to the Boost Software License, Version 1.0]] -] - -[h4 Overview] - -Boost.Range MFC/ATL Extension provides Boost.Range support for MFC/ATL collection and string types. - -`` -CTypedPtrArray *> myArray; -... -BOOST_FOREACH (CList *theList, myArray) -{ - BOOST_FOREACH (CString& str, *theList) - { - boost::to_upper(str); - std::sort(boost::begin(str), boost::end(str)); - ... - } -} -`` - -[section:requirements Requirements] - -* Boost C++ Libraries Version 1.34.0 or later (no compilation required) -* Visual C++ 7.1 or later (for MFC and ATL) - -[endsect] - -[section:mfc_ranges MFC Ranges] -If the `` is included before or after Boost.Range headers, the MFC collections and strings become models of Range. The table below lists the Traversal Category and `range_reference` of MFC ranges. - -[table - [[Range] [Traversal Category] [`range_reference::type`]] - [[`CArray`] [__random_access_range__] [`T&`]] - [[`CList`] [__bidirectional_range__] [`T&`]] - [[`CMap`] [__forward_range__] [`Range::CPair&`]] - [[`CTypedPtrArray`] [__random_access_range__] [`T* const`]] - [[`CTypedPtrList`] [__bidirectional_range__] [`T* const`]] - [[`CTypedPtrMap`] [__forward_range__] [`std::pair const`]] - [[`CByteArray`] [__random_access_range__] [`BYTE&`]] - [[`CDWordArray`] [__random_access_range__] [`DWORD&`]] - [[`CObArray`] [__random_access_range__] [`CObject*&`]] - [[`CPtrArray`] [__random_access_range__] [`void*&`]] - [[`CStringArray`] [__random_access_range__] [`CString&`]] - [[`CUIntArray`] [__random_access_range__] [`UINT&`]] - [[`CWordArray`] [__random_access_range__] [`WORD&`]] - [[`CObList`] [__bidirectional_range__] [`CObject*&`]] - [[`CPtrList`] [__bidirectional_range__] [`void*&`]] - [[`CStringList`] [__bidirectional_range__] [`CString&`]] - [[`CMapPtrToWord`] [__forward_range__] [`std::pair const`]] - [[`CMapPtrToPtr`] [__forward_range__] [`std::pair const`]] - [[`CMapStringToOb`] [__forward_range__] [`std::pair const`]] - [[`CMapStringToString`] [__forward_range__] [`Range::CPair&`]] - [[`CMapWordToOb`] [__forward_range__] [`std::pair const`]] - [[`CMapWordToPtr`] [__forward_range__] [`std::pair const`]] -] - -Other Boost.Range metafunctions are defined by the following. Let `Range` be any type listed above and `Ref` be the same as `range_reference::type`. `range_value::type` is the same as `remove_reference::type>::type`, `range_difference::type` is the same as `std::ptrdiff_t`, and `range_pointer::type` is the same as `add_pointer::type>::type`. As for `const Range`, see below. - -Adam Walling has provided the header `` to add support -for the map adaptor with MFC map types. - -[endsect] - -[section:atl_ranges ATL Ranges] - -If the `` is included before or after Boost.Range headers, the ATL collections and strings become models of Range. The table below lists the Traversal Category and `range_reference` of ATL ranges. - -[table - [[Range] [Traversal Category] [`range_reference::type`]] - [[`CAtlArray`] [__random_access_range__] [`E&`]] - [[`CAutoPtrArray`] [__random_access_range__] [`E&`]] - [[`CInterfaceArray`] [__random_access_range__] [`CComQIPtr&`]] - [[`CAtlList`] [__bidirectional_range__] [`E&`]] - [[`CAutoPtrList`] [__bidirectional_range__] [`E&`]] - [[`CHeapPtrList`] [__bidirectional_range__] [`E&`]] - [[`CInterfaceList`] [__bidirectional_range__] [`CComQIPtr&`]] - [[`CAtlMap`] [__forward_range__] [`Range::CPair&`]] - [[`CRBTree`] [__bidirectional_range__] [`Range::CPair&`]] - [[`CRBMap`] [__bidirectional_range__] [`Range::CPair&`]] - [[`CRBMultiMap`] [__bidirectional_range__] [`Range::CPair&`]] - [[`CSimpleStringT`] [__random_access_range__] [`B&`]] - [[`CStringT`] [__random_access_range__] [`B&`]] - [[`CFixedStringT`] [__random_access_range__] [`range_reference::type`]] - [[`CComBSTR`] [__random_access_range__] [`OLECHAR&`]] - [[`CSimpleArray`] [__random_access_range__] [`T&`]] -] - -Other __boost_range_home__ metafunctions are defined by the following. Let `Range` be any type listed above and `Ref` be the same as `range_reference::type`. `range_value::type` is the same as `remove_reference::type`, `range_difference::type` is the same as `std::ptrdiff_t`, and `range_pointer::type` is the same as `add_pointer::type>::type`. As for `const Range`, see below. - -[endsect] - -[section:const_ranges const Ranges] - -`range_reference::type` is defined by the following algorithm. Let `Range` be any type listed above and `Ref` be the same as `range_reference::type`. - -`` -if (Range is CObArray || Range is CObList) - return CObject const * & -else if (Range is CPtrArray || Range is CPtrList) - return void const * & -else if (there is a type X such that X& is the same as Ref) - return X const & -else if (there is a type X such that X* const is the same as Ref) - return X const * const -else - return Ref -`` - - -Other Boost.Range metafunctions are defined by the following. - -[table - [[Range metafunction] [Result]] - [[`range_value::type`] [`range_value::type`]] - [[`range_difference::type`] [`std::ptrdiff_t`]] - [[`range_pointer::type`] [`add_pointer::type>::type>::type`]] -] - -[endsect] - -[section:references References] - -# __boost_range_home__ -# __mfc_collections__ -# __atl_collections__ - -[endsect] - -[endsect] diff --git a/libs/range/doc/mfc_atl.rst b/libs/range/doc/mfc_atl.rst deleted file mode 100644 index 67498fb25..000000000 --- a/libs/range/doc/mfc_atl.rst +++ /dev/null @@ -1,232 +0,0 @@ - -++++++++++++++++++++++++++++++++ - |Boost| Range MFC/ATL Extension -++++++++++++++++++++++++++++++++ - -.. |Boost| image:: http://www.boost.org/libs/ptr_container/doc/boost.png - - - -:Author: Shunsuke Sogame -:Contact: mb2act@yahoo.co.jp -:date: 26th of May 2006 -:copyright: Shunsuke Sogame 2005-2006. Use, modification and distribution is subject to the Boost Software License, Version 1.0 (see LICENSE_1_0.txt__). - -__ http://www.boost.org/LICENSE_1_0.txt - - - -======== -Overview -======== - -Boost.Range MFC/ATL Extension provides `Boost.Range`_ support for MFC/ATL collection and string types. - - -.. parsed-literal:: - - CTypedPtrArray \*> myArray; - ... - BOOST_FOREACH (CList \*theList, myArray) - { - BOOST_FOREACH (CString& str, \*theList) - { - boost::to_upper(str); - std::sort(boost::begin(str), boost::end(str)); - ... - } - } - - - -* `Requirements`_ -* `MFC Ranges`_ -* `ATL Ranges`_ -* `const Ranges`_ -* `References`_ - - - -============ -Requirements -============ - -- `Boost C++ Libraries Version 1.34.0`__ or later (no compilation required) -- Visual C++ 7.1 or Visual C++ 8.0 - -__ Boost_ - - - -========== -MFC Ranges -========== - -If the ```` is included before or after `Boost.Range`_ headers, -the MFC collections and strings become models of Range. -The table below lists the Traversal Category and ``range_reference`` of MFC ranges. - - -============================= ================== ======================================= -``Range`` Traversal Category ``range_reference::type`` -============================= ================== ======================================= -``CArray`` Random Access ``T&`` ------------------------------ ------------------ --------------------------------------- -``CList`` Bidirectional ``T&`` ------------------------------ ------------------ --------------------------------------- -``CMap`` Forward ``Range::CPair&`` ------------------------------ ------------------ --------------------------------------- -``CTypedPtrArray`` Random Access ``T* const`` ------------------------------ ------------------ --------------------------------------- -``CTypedPtrList`` Bidirectional ``T* const`` ------------------------------ ------------------ --------------------------------------- -``CTypedPtrMap`` Forward ``std::pair const`` ------------------------------ ------------------ --------------------------------------- -``CByteArray`` Random Access ``BYTE&`` ------------------------------ ------------------ --------------------------------------- -``CDWordArray`` Random Access ``DWORD&`` ------------------------------ ------------------ --------------------------------------- -``CObArray`` Random Access ``CObject* &`` ------------------------------ ------------------ --------------------------------------- -``CPtrArray`` Random Access ``void* &`` ------------------------------ ------------------ --------------------------------------- -``CStringArray`` Random Access ``CString&`` ------------------------------ ------------------ --------------------------------------- -``CUIntArray`` Random Access ``UINT&`` ------------------------------ ------------------ --------------------------------------- -``CWordArray`` Random Access ``WORD&`` ------------------------------ ------------------ --------------------------------------- -``CObList`` Bidirectional ``CObject* &`` ------------------------------ ------------------ --------------------------------------- -``CPtrList`` Bidirectional ``void* &`` ------------------------------ ------------------ --------------------------------------- -``CStringList`` Bidirectional ``CString&`` ------------------------------ ------------------ --------------------------------------- -``CMapPtrToWord`` Forward ``std::pair const`` ------------------------------ ------------------ --------------------------------------- -``CMapPtrToPtr`` Forward ``std::pair const`` ------------------------------ ------------------ --------------------------------------- -``CMapStringToOb`` Forward ``std::pair const`` ------------------------------ ------------------ --------------------------------------- -``CMapStringToString`` Forward ``Range::CPair&`` ------------------------------ ------------------ --------------------------------------- -``CMapWordToOb`` Forward ``std::pair const`` ------------------------------ ------------------ --------------------------------------- -``CMapWordToPtr`` Forward ``std::pair const`` -============================= ================== ======================================= - - -Other `Boost.Range`_ metafunctions are defined by the following. -Let ``Range`` be any type listed above and ``ReF`` be the same as ``range_reference::type``. -``range_value::type`` is the same as ``remove_reference::type>::type``, -``range_difference::type`` is the same as ``std::ptrdiff_t``, and -``range_pointer::type`` is the same as ``add_pointer::type>::type``. -As for ``const Range``, see `const Ranges`_. - - - -========== -ATL Ranges -========== - -If the ```` is included before or after `Boost.Range`_ headers, -the ATL collections and strings become models of Range. -The table below lists the Traversal Category and ``range_reference`` of ATL ranges. - - -============================= ================== ======================================= -``Range`` Traversal Category ``range_reference::type`` -============================= ================== ======================================= -``CAtlArray`` Random Access ``E&`` ------------------------------ ------------------ --------------------------------------- -``CAutoPtrArray`` Random Access ``E&`` ------------------------------ ------------------ --------------------------------------- -``CInterfaceArray`` Random Access ``CComQIPtr&`` ------------------------------ ------------------ --------------------------------------- -``CAtlList`` Bidirectional ``E&`` ------------------------------ ------------------ --------------------------------------- -``CAutoPtrList`` Bidirectional ``E&`` ------------------------------ ------------------ --------------------------------------- -``CHeapPtrList`` Bidirectional ``E&`` ------------------------------ ------------------ --------------------------------------- -``CInterfaceList`` Bidirectional ``CComQIPtr&`` ------------------------------ ------------------ --------------------------------------- -``CAtlMap`` Forward ``Range::CPair&`` ------------------------------ ------------------ --------------------------------------- -``CRBTree`` Bidirectional ``Range::CPair&`` ------------------------------ ------------------ --------------------------------------- -``CRBMap`` Bidirectional ``Range::CPair&`` ------------------------------ ------------------ --------------------------------------- -``CRBMultiMap`` Bidirectional ``Range::CPair&`` ------------------------------ ------------------ --------------------------------------- -``CSimpleStringT`` Random Access ``B&`` ------------------------------ ------------------ --------------------------------------- -``CStringT`` Random Access ``B&`` ------------------------------ ------------------ --------------------------------------- -``CFixedStringT`` Random Access ``range_reference::type`` ------------------------------ ------------------ --------------------------------------- -``CStringT`` Random Access ``B&`` ------------------------------ ------------------ --------------------------------------- -``CComBSTR`` Random Access ``OLECHAR&`` ------------------------------ ------------------ --------------------------------------- -``CSimpleArray`` Random Access ``T&`` -============================= ================== ======================================= - - -Other `Boost.Range`_ metafunctions are defined by the following. -Let ``Range`` be any type listed above and ``ReF`` be the same as ``range_reference::type``. -``range_value::type`` is the same as ``remove_reference::type``, -``range_difference::type`` is the same as ``std::ptrdiff_t``, and -``range_pointer::type`` is the same as ``add_pointer::type>::type``. -As for ``const Range``, see `const Ranges`_. - - - -============ -const Ranges -============ - -``range_reference::type`` is defined by the following algorithm. -Let ``Range`` be any type listed above and ``ReF`` be the same as ``range_reference::type``. - - -.. parsed-literal:: - - if (Range is CObArray || Range is CObList) - return CObject const \* & - else if (Range is CPtrArray || Range is CPtrList) - return void const \* & - else if (there is a type X such that X& is the same as ReF) - return X const & - else if (there is a type X such that X* const is the same as ReF) - return X const \* const - else - return ReF - - -Other `Boost.Range`_ metafunctions are defined by the following. -``range_value::type`` is the same as ``range_value::type``, -``range_difference::type`` is the same as ``std::ptrdiff_t``, and -``range_pointer::type`` is the same as ``add_pointer::type>::type>::type``. - - - -========== -References -========== -- `Boost.Range`_ -- `MFC Collections`__ -- `ATL Collection Classes`__ - -__ http://msdn2.microsoft.com/en-us/library/942860sh.aspx -__ http://msdn2.microsoft.com/en-US/library/15e672bd.aspx - - - -.. _Boost C++ Libraries: http://www.boost.org/ -.. _Boost: `Boost C++ Libraries`_ -.. _Boost.Range: ../index.html -.. _forward: range.html#forward_range -.. _bidirectional: range.html#forward_range -.. _random access: range.html#random_access_range - diff --git a/libs/range/doc/portability.qbk b/libs/range/doc/portability.qbk deleted file mode 100644 index fabaafcb8..000000000 --- a/libs/range/doc/portability.qbk +++ /dev/null @@ -1,27 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:portability Portability] - -A huge effort has been made to port the library to as many compilers as possible. - -Full support for built-in arrays require that the compiler supports class template partial specialization. For non-conforming compilers there might be a chance that it works anyway thanks to workarounds in the type traits library. -Visual C++ 6/7.0 has a limited support for arrays: as long as the arrays are of built-in type it should work. - -Notice also that some compilers cannot do function template ordering properly. In that case one must rely of __range_iterator__ and a single function definition instead of overloaded versions for const and non-const arguments. So if one cares about old compilers, one should not pass rvalues to the functions. - -For maximum portability you should follow these guidelines: - -# do not use built-in arrays, -# do not pass rvalues to __begin__`()`, __end__`()` and __iterator_range__ Range constructors and assignment operators, -# use __const_begin__`()` and __const_end__`()` whenever your code by intention is read-only; this will also solve most rvalue problems, -# do not rely on ADL: - * if you overload functions, include that header before the headers in this library, - * put all overloads in namespace boost. - - - -[endsect] - diff --git a/libs/range/doc/reference.qbk b/libs/range/doc/reference.qbk deleted file mode 100644 index 14cf8e865..000000000 --- a/libs/range/doc/reference.qbk +++ /dev/null @@ -1,21 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:reference Reference] - -[include reference/overview.qbk] - -[section:concept_implementation Range concept implementation] -[include reference/synopsis.qbk] -[include reference/semantics.qbk] -[endsect] - -[include reference/adaptors.qbk] -[include reference/algorithms.qbk] -[include reference/ranges.qbk] -[include reference/utilities.qbk] -[include reference/extending.qbk] - -[endsect] diff --git a/libs/range/doc/reference/adaptors.qbk b/libs/range/doc/reference/adaptors.qbk deleted file mode 100644 index b3efaee75..000000000 --- a/libs/range/doc/reference/adaptors.qbk +++ /dev/null @@ -1,187 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:adaptors Range Adaptors] - -[section:introduction Introduction and motivation] - -A [*Range Adaptor] is a class that wraps an existing Range to provide a new Range with different behaviour. Since the behaviour of Ranges is determined by their associated iterators, a Range Adaptor simply wraps the underlying iterators with new special iterators. In this example - -`` -#include -#include -#include -#include - -std::vector vec; -boost::copy( vec | boost::adaptors::reversed, - std::ostream_iterator(std::cout) ); -`` - -the iterators from `vec` are wrapped `reverse_iterator`s. The type of the underlying Range Adapter is not documented because you do not need to know it. All that is relevant is that the expression - -`` -vec | boost::adaptors::reversed -`` - -returns a Range Adaptor where the iterator type is now the iterator type of the range `vec` wrapped in `reverse_iterator`. The expression `boost::adaptors::reversed` is called an *Adaptor Generator*. - -There are two ways of constructing a range adaptor. The first is by using `operator|()`. This is my preferred technique, however while discussing range adaptors with others it became clear that some users of the library strongly prefer a more familiar function syntax, so equivalent functions of the present tense form have been added as an alternative syntax. The equivalent to `rng | reversed` is `adaptors::reverse(rng)` for example. - -Why do I prefer the `operator|` syntax? The answer is readability: - -`` -std::vector vec; -boost::copy( boost::adaptors::reverse(vec), - std::ostream_iterator(std::cout) ); -`` - -This might not look so bad, but when we apply several adaptors, it becomes much worse. Just compare - -`` -std::vector vec; -boost::copy( boost::adaptors::unique( boost::adaptors::reverse( vec ) ), - std::ostream_iterator(std::cout) ); -`` - -to - -`` -std::vector vec; -boost::copy( vec | boost::adaptors::reversed - | boost::adaptors::uniqued, - std::ostream_iterator(std::cout) ); -`` - -Furthermore, some of the adaptor generators take arguments themselves and these arguments are expressed with function call notation too. In those situations, you will really appreciate the succinctness of `operator|()`. - -[heading Composition of Adaptors] - -Range Adaptors are a powerful complement to Range algorithms. The reason is that adaptors are ['*orthogonal*] to algorithms. For example, consider these Range algorithms: - -* `boost::copy( rng, out )` -* `boost::count( rng, pred )` - -What should we do if we only want to copy an element `a` if it satisfies some predicate, say `pred(a)`? And what if we only want to count the elements that satisfy the same predicate? The naive answer would be to use these algorithms: - -* `boost::copy_if( rng, pred, out )` -* `boost::count_if( rng, pred )` - -These algorithms are only defined to maintain a one to one relationship with the standard library algorithms. This approach of adding algorithm suffers a combinatorial explosion. Inevitably many algorithms are missing `_if` variants and there is redundant development overhead for each new algorithm. The Adaptor Generator is the design solution to this problem. It is conceivable that some algorithms are capable of optimization by tightly coupling the filter with the algorithm. The adaptors provide a more general solution with superior separation of orthogonal concerns. - -[heading Range Adaptor alternative to copy_if algorithm] -`` -boost::copy_if( rng, pred, out ); -`` -can be expressed as -`` -boost::copy( rng | boost::adaptors::filtered(pred), out ); -`` - -[heading Range Adaptor alternative to count_if algorithm] -`` -boost::count_if( rng, pred ); -`` -can be expressed as -`` -boost::size( rng | boost::adaptors::filtered(pred) ); -`` - -What this means is that many algorithms no longer require nor benefit from an optimized implementation with an `_if` suffix. Furthermore, it turns out that algorithms with the `_copy` suffix are often not needed either. Consider `replace_copy_if()` which may be used as - -`` -std::vector vec; -boost::replace_copy_if( rng, std::back_inserter(vec), pred, new_value ); -`` - -With adaptors and algorithms we can express this as - -`` -std::vector vec; -boost::push_back(vec, rng | boost::adaptors::replaced_if(pred, new_value)); -`` - -The latter code has several benefits: - -1. it is more ['*efficient*] because we avoid extra allocations as might happen with `std::back_inserter` - -2. it is ['*flexible*] as we can subsequently apply even more adaptors, for example: `` -boost::push_back(vec, rng | boost::adaptors::replaced_if(pred, new_value) - | boost::adaptors::reversed); -`` - -3. it is ['*safer*] because there is no use of an unbounded output iterator. - -In this manner, the ['*composition*] of Range Adaptors has the following consequences: - -1. we no longer need many of the `_if`, `_copy`, `_copy_if` and `_n` variants of algorithms. - -2. we can generate a multitude of new algorithms on the fly, for example, above we generated `reverse_replace_copy_if()` - -In other words: - -[*Range Adaptors are to algorithms what algorithms are to containers] - -[endsect] - -[section:general_requirements General Requirements] - -In the description of generator expressions, the following notation is used: - -* `fwdRng` is an expression of a type `R` that models `ForwardRange` -* `biRng` is an expression of a type `R` that models `BidirectionalRange` -* `rndRng` is an expression of a type `R` that models `RandomAccessRange` -* `pred` is an expression of a type that models `UnaryPredicate` -* `bi_pred` is an expression of a type that models `BinaryPredicate` -* `fun` is an expression of a type that models `UnaryFunction` -* `value`, `new_value` and `old_value` are objects convertible to `boost::range_value::type` -* `n,m` are integer expressions convertible to `range_difference::type` - -Also note that `boost::range_value::type` must be implicitly convertible to the type arguments to `pred`, `bi_pred` and `fun`. - -Range Category in the following adaptor descriptions refers to the minimum range concept required by the range passed to the adaptor. The resultant range is a model of the same range concept as the input range unless specified otherwise. - -Returned Range Category is the concept of the returned range. In some cases the returned range is of a lesser category than the range passed to the adaptor. For example, the `filtered` adaptor returns only a `ForwardRange` regardless of the input. - -Furthermore, the following rules apply to any expression of the form -`` -rng | boost::adaptors::adaptor_generator -`` - -1. Applying `operator|()` to a range `R` (always left argument) and a range adapter `RA` (always right argument) yields a new range type which may not conform to the same range concept as `R`. - -2. The return-type of `operator|()` is otherwise unspecified. - -3. `operator|()` is found by Argument Dependent Lookup (ADL) because a range adaptor is implemented in namespace `boost::adaptors`. - -4. `operator|()` is used to add new behaviour ['*lazily*] and never modifies its left argument. - -5. All iterators extracted from the left argument are extracted using qualified calls to `boost::begin()` and `boost::end()`. - -6. In addition to the `throw`-clauses below, `operator|()` may throw exceptions as a result of copying iterators. If such copying cannot throw an exception, then neither can the whole expression. - -[endsect] - -[section:reference Reference] -[include adaptors/adjacent_filtered.qbk] -[include adaptors/copied.qbk] -[include adaptors/filtered.qbk] -[include adaptors/indexed.qbk] -[include adaptors/indirected.qbk] -[include adaptors/map_keys.qbk] -[include adaptors/map_values.qbk] -[include adaptors/replaced.qbk] -[include adaptors/replaced_if.qbk] -[include adaptors/reversed.qbk] -[include adaptors/sliced.qbk] -[include adaptors/strided.qbk] -[include adaptors/type_erased.qbk] -[include adaptors/tokenized.qbk] -[include adaptors/transformed.qbk] -[include adaptors/uniqued.qbk] -[endsect] - -[endsect] - diff --git a/libs/range/doc/reference/adaptors/adjacent_filtered.qbk b/libs/range/doc/reference/adaptors/adjacent_filtered.qbk deleted file mode 100644 index 312646c11..000000000 --- a/libs/range/doc/reference/adaptors/adjacent_filtered.qbk +++ /dev/null @@ -1,32 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:adjacent_filtered adjacent_filtered] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::adjacent_filtered(bi_pred)`]] - [[Function] [`boost::adaptors::adjacent_filter(rng, bi_pred)`]] -] - -* [*Precondition:] The `value_type` of the range is convertible to both argument types of `bi_pred`. -* [*Postcondition:] For all adjacent elements `[x,y]` in the returned range, `bi_pred(x,y)` is `true`. -* [*Throws:] Whatever the copy constructor of `bi_pred` might throw. -* [*Range Category:] __forward_range__ -* [*Return Type:] `boost::adjacent_filtered_range` -* [*Returned Range Category:] The minimum of the range category of `rng` and __forward_range__ - -[section:adjacent_filtered_example adjacent_filtered example] -[import ../../../test/adaptor_test/adjacent_filtered_example.cpp] -[adjacent_filtered_example] -[endsect] - -This would produce the output: -`` -1,2,3,4,5,6, -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/copied.qbk b/libs/range/doc/reference/adaptors/copied.qbk deleted file mode 100644 index 2a8abcc51..000000000 --- a/libs/range/doc/reference/adaptors/copied.qbk +++ /dev/null @@ -1,30 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:copied copied] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::copied(n, m)`]] - [[Function] [`boost::adaptors::copy(rng, n, m)`]] -] - -* [*Precondition:] `0 <= n && n <= m && m < distance(rng)` -* [*Returns:] A new `iterator_range` that holds the sliced range `[n,m)` of the original range. -* [*Range Category:] __random_access_range__ -* [*Returned Range Category:] __random_access_range__ - -[section:copied_example copied example] -[import ../../../test/adaptor_test/copied_example.cpp] -[copied_example] -[endsect] - -This would produce the output: -`` -2,3,4,5, -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/examples/indirected.cpp b/libs/range/doc/reference/adaptors/examples/indirected.cpp deleted file mode 100644 index efb9d13cc..000000000 --- a/libs/range/doc/reference/adaptors/examples/indirected.cpp +++ /dev/null @@ -1,32 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include -#include -#include -#include -#include - -int main(int argc, const char* argv[]) -{ - using namespace boost::adaptors; - - std::vector > input; - - for (int i = 0; i < 10; ++i) - input.push_back(boost::shared_ptr(new int(i))); - - boost::copy( - input | indirected, - std::ostream_iterator(std::cout, ",")); - - return 0; -} - diff --git a/libs/range/doc/reference/adaptors/filtered.qbk b/libs/range/doc/reference/adaptors/filtered.qbk deleted file mode 100644 index 4ca3f9163..000000000 --- a/libs/range/doc/reference/adaptors/filtered.qbk +++ /dev/null @@ -1,32 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:filtered filtered] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::filtered(pred)`]] - [[Function] [`boost::adaptors::filter(rng, pred)`]] -] - -* [*Precondition:] The `value_type` of the range is convertible to the argument type of `pred`. -* [*Postcondition:] For all elements `[x]` in the returned range, `pred(x)` is `true`. -* [*Throws:] Whatever the copy constructor of `pred` might throw. -* [*Range Category:] __singlepass_range__ -* [*Range Return Type:] `boost::filtered_range` -* [*Returned Range Category:] The minimum of the range category of `rng` and __bidirectional_range__ - -[section:filtered_example filtered example] -[import ../../../test/adaptor_test/filtered_example.cpp] -[filtered_example] -[endsect] - -This would produce the output: -`` -2,4,6,8, -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/formatted.qbk b/libs/range/doc/reference/adaptors/formatted.qbk deleted file mode 100644 index 9dd69c2ee..000000000 --- a/libs/range/doc/reference/adaptors/formatted.qbk +++ /dev/null @@ -1,51 +0,0 @@ -[/ - Copyright 2014 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:formatted formatted] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::formatted()`]] - [[Pipe] [`rng | boost::adaptors::formatted(sep)`]] - [[Pipe] [`rng | boost::adaptors::formatted(sep, prefix)`]] - [[Pipe] [`rng | boost::adaptors::formatted(sep, prefix, postfix)`]] - [[Function] [`boost::adaptors::format(rng)`]] - [[Function] [`boost::adaptors::format(rng, sep)`]] - [[Function] [`boost::adaptors::format(rng, sep, prefix)`]] - [[Function] [`boost::adaptors::format(rng, sep, prefix, postfix)`]] -] - -This adaptor produces a range that can be output streamed to a -`std::basic_ostream` to produce the output string formatted output. With the -default paramters given numbers 1 to 5 inclusively in a range the output when -streamed would be "{0,1,2,3,4,5}". The prefix, separator and postfix may be -passed as parameters. - -The general format of the output is thus: -... - -* [*Precondition:] - * `0 <= n`. - * `sep` has a type that is CopyConstructible and able to be streamed to `std::basic_ostream` - * `prefix` has a type that is CopyConstructible and able to be streamed to `std::basic_ostream` - * `postfix` has a type that is CopyConstructible and able to be streamed to `std::basic_ostream` -* [*Returns:] `boost::range::formatted_range` where -`Iter` is `typename boost::range_iterator::type`, `Sep` is the separator -type, `Prefix` is the prefix type and `Postfix` is the postfix type. -* [*Range Category:] __single_pass_range__ -* [*Returned Range Category:] The range category of `rng`. - -[section:formatted_example formatted example] -[import ../../../test/adaptor_test/formatted_example.cpp] -[separated_example] -[endsect] - -This would produce the output: -`` -{1,2,3,4,5} -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/indexed.qbk b/libs/range/doc/reference/adaptors/indexed.qbk deleted file mode 100644 index 4503fe6c6..000000000 --- a/libs/range/doc/reference/adaptors/indexed.qbk +++ /dev/null @@ -1,84 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:indexed indexed] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::indexed()`]] - [[Pipe] [`rng | boost::adaptors::indexed(start_index)`]] - [[Function] [`boost::adaptors::index(rng)`]] - [[Function] [`boost::adaptors::index(rng, start_index)`]] -] - -[heading Description] -The index within each returned `boost::range::index_value` is equal to -`start_index` + the offset of the element from the beginning of the range. In -the versions of the functions that omit `start_index` the starting index is -taken to be `0`. - -* [*Purpose:] Adapt `rng` to return elements that have the corresponding value -from `rng` and a numeric index. -* [*Returns:] A range adapted to return both the element and the associated -index. The returned range has elements of type: - -`` -boost::range::index_value< - typename boost::range_reference::type, - typename boost::range_difference::type -> -`` - -The synopsis of index_value is as follows: -`` -template -class index_value : public boost::tuple -{ -public: - - typedef ...unspecified... index_type; - typedef ...unspecified... const_index_type; - - typedef ...unspecified... value_type; - typedef ...unspecified... const_value_type; - - // ...unspecified... constructors - - index_type index(); - const_index_type index() const; - - value_type value(); - const_value_type value() const; -}; -`` - -* [*Range Category:] __single_pass_range__ -* [*Range Return Type:] `boost::indexed_range` -* [*Returned Range Category:] The range category of `rng` if and only if `rng` -is not a __bidirectional_range__. If `rng` is a __bidirectional_range__ then the -returned range category is __forward_range__. The rationale for the demotion of -__bidirectional_range__ inputs to __forward_range__ is to avoid slow calculation -of indices for `boost::end(rng)`. - -[section:indexed_example indexed example] -[import ../../../test/adaptor_test/indexed_example.cpp] -[indexed_example] -[endsect] - -This would produce the output: -`` -Element = 10 Index = 0 -Element = 20 Index = 1 -Element = 30 Index = 2 -Element = 40 Index = 3 -Element = 50 Index = 4 -Element = 60 Index = 5 -Element = 70 Index = 6 -Element = 80 Index = 7 -Element = 90 Index = 8 -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/indirected.qbk b/libs/range/doc/reference/adaptors/indirected.qbk deleted file mode 100644 index 3d6f41670..000000000 --- a/libs/range/doc/reference/adaptors/indirected.qbk +++ /dev/null @@ -1,31 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:indirected indirected] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::indirected`]] - [[Function] [`boost::adaptors::indirect(rng)`]] -] - -* [*Precondition:] The `value_type` of the range defines unary `operator*()` -* [*Postcondition:] For all elements `x` in the returned range, `x` is the result of `*y` where `y` is the corresponding element in the original range. -* [*Range Category:] __single_pass_range__ -* [*Range Return Type:] `boost::indirected_range` -* [*Returned Range Category:] The range category of `rng` - -[section:indirected_example indirected example] -[import ../../../test/adaptor_test/indirected_example.cpp] -[indirected_example] -[endsect] - -This would produce the output: -`` -0,1,2,3,4,5,6,7,8,9, -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/map_keys.qbk b/libs/range/doc/reference/adaptors/map_keys.qbk deleted file mode 100644 index e70b4b8c1..000000000 --- a/libs/range/doc/reference/adaptors/map_keys.qbk +++ /dev/null @@ -1,31 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:map_keys map_keys] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::map_keys`]] - [[Function] [`boost::adaptors::keys(rng)`]] -] - -* [*Precondition:] The `value_type` of the range is an instantiation of `std::pair`. -* [*Postcondition:] For all elements `x` in the returned range, `x` is the result of `y.first` where `y` is the corresponding element in the original range. -* [*Range Category:] __single_pass_range__ -* [*Range Return Type:] `boost::select_first_range` -* [*Returned Range Category:] The range category of `rng`. - -[section:map_keys_example map_keys example] -[import ../../../test/adaptor_test/map_keys_example.cpp] -[map_keys_example] -[endsect] - -This would produce the output: -`` -0,1,2,3,4,5,6,7,8,9, -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/map_values.qbk b/libs/range/doc/reference/adaptors/map_values.qbk deleted file mode 100644 index 845c9e879..000000000 --- a/libs/range/doc/reference/adaptors/map_values.qbk +++ /dev/null @@ -1,31 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:map_values map_values] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::map_values`]] - [[Function] [`boost::adaptors::values(rng)`]] -] - -* [*Precondition:] The `value_type` of the range is an instantiation of `std::pair`. -* [*Postcondition:] For all elements `x` in the returned range, `x` is the result of `y.second` where `y` is the corresponding element in the original range. -* [*Range Category:] __single_pass_range__ -* [*Range Return Type:] for constant ranges, `boost::select_second_const` otherwise `boost:select_second_mutable` -* [*Returned Range Category:] The range category of `rng`. - -[section:map_values_example map_values example] -[import ../../../test/adaptor_test/map_values_example.cpp] -[map_values_example] -[endsect] - -This would produce the output: -`` -0,10,20,30,40,50,60,70,80,90, -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/replaced.qbk b/libs/range/doc/reference/adaptors/replaced.qbk deleted file mode 100644 index 3afb2c57d..000000000 --- a/libs/range/doc/reference/adaptors/replaced.qbk +++ /dev/null @@ -1,33 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:replaced replaced] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::replaced(new_value, old_value)`]] - [[Function] [`boost::adaptors::replace(rng, new_value, old_value)`]] -] - -* [*Precondition:] - * `new_value` is convertible to the `value_type` of the range. - * `old_value` is convertible to the `value_type` of the range. -* [*Postcondition:] For all elements `x` in the returned range, the value `x` is equal to the value of `(y == old_value) ? new_value : y` where `y` is the corresponding element in the original range. -* [*Range Category:] __single_pass_range__ -* [*Range Return Type:] `boost::replaced_range` -* [*Returned Range Category:] The range category of `rng`. - -[section:replaced_example replaced example] -[import ../../../test/adaptor_test/replaced_example.cpp] -[replaced_example] -[endsect] - -This would produce the output: -`` -1,10,3,10,5,10,7,10,9, -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/replaced_if.qbk b/libs/range/doc/reference/adaptors/replaced_if.qbk deleted file mode 100644 index 99c1ed829..000000000 --- a/libs/range/doc/reference/adaptors/replaced_if.qbk +++ /dev/null @@ -1,33 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:replaced_if replaced_if] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::replaced_if(pred, new_value)`]] - [[Function] [`boost::adaptors::replace_if(rng, pred, new_value)`]] -] - -* [*Precondition:] - * The range `value_type` is convertible to the argument type of `pred`. - * `new_value` is convertible to the `value_type` of the range. -* [*Postconditions:] For all elements `x` in the returned range, the value `x` is equal to the value of `pred(y) ? new_value : y` where `y` is the corresponding element in the original range. -* [*Range Category:] __single_pass_range__ -* [*Range Return Type:] `boost::replaced_if_range` -* [*Returned Range Category:] The range category of `rng`. - -[section:replaced_if_example replaced_if example] -[import ../../../test/adaptor_test/replaced_if_example.cpp] -[replaced_if_example] -[endsect] - -This would produce the output: -`` -1,10,3,10,5,10,7,10,9, -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/reversed.qbk b/libs/range/doc/reference/adaptors/reversed.qbk deleted file mode 100644 index 8fe813fa2..000000000 --- a/libs/range/doc/reference/adaptors/reversed.qbk +++ /dev/null @@ -1,30 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:reversed reversed] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::reversed`]] - [[Function] [`boost::adaptors::reverse(rng)`]] -] - -* [*Returns:] A range whose iterators behave as if they were the original iterators wrapped in `reverse_iterator`. -* [*Range Category:] __bidirectional_range__ -* [*Range Return Type:] `boost::reversed_range` -* [*Returned Range Category:] The range category of `rng`. - -[section:reversed_example reversed example] -[import ../../../test/adaptor_test/reversed_example.cpp] -[reversed_example] -[endsect] - -This would produce the output: -`` -9,8,7,6,5,4,3,2,1, -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/sliced.qbk b/libs/range/doc/reference/adaptors/sliced.qbk deleted file mode 100644 index 81b4a160e..000000000 --- a/libs/range/doc/reference/adaptors/sliced.qbk +++ /dev/null @@ -1,31 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:sliced sliced] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::sliced(n, m)`]] - [[Function] [`boost::adaptors::slice(rng, n, m)`]] -] - -* [*Precondition:] `0 <= n && n <= m && m < distance(rng)` -* [*Returns:] `make_range(rng, n, m)` -* [*Range Category:] __random_access_range__ -* [*Range Return Type:] `boost::sliced_range` -* [*Returned Range Category:] __random_access_range__ - -[section:sliced_example sliced example] -[import ../../../test/adaptor_test/sliced_example.cpp] -[sliced_example] -[endsect] - -This would produce the output: -`` -3,4,5, -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/strided.qbk b/libs/range/doc/reference/adaptors/strided.qbk deleted file mode 100644 index a672e3d2a..000000000 --- a/libs/range/doc/reference/adaptors/strided.qbk +++ /dev/null @@ -1,30 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:strided strided] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::strided(n)`]] - [[Function] [`boost::adaptors::stride(rng, n)`]] -] - -* [*Precondition:] `0 <= n`. -* [*Returns:] A new range based on `rng` where traversal is performed in steps of `n`. -* [*Range Category:] __single_pass_range__ -* [*Returned Range Category:] The range category of `rng`. - -[section:strided_example strided example] -[import ../../../test/adaptor_test/strided_example.cpp] -[strided_example] -[endsect] - -This would produce the output: -`` -1,3,5,7,9, -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/tokenized.qbk b/libs/range/doc/reference/adaptors/tokenized.qbk deleted file mode 100644 index 2105323db..000000000 --- a/libs/range/doc/reference/adaptors/tokenized.qbk +++ /dev/null @@ -1,67 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:tokenized tokenized] - -[table - [[Syntax] [Code]] - [ - [Pipe] - [ - `` - rng | boost::adaptors::tokenized(regex) - rng | boost::adaptors::tokenized(regex, i) - rng | boost::adaptors::tokenized(regex, rndRng) - rng | boost::adaptors::tokenized(regex, i, flags) - rng | boost::adaptors::tokenized(regex, rndRng, flags) - `` - ] - ] - [ - [Function] - [ - `` - boost::adaptors::tokenize(rng, regex) - boost::adaptors::tokenize(rng, regex, i) - boost::adaptors::tokenize(rng, regex, rndRng) - boost::adaptors::tokenize(rng, regex, i, flags) - boost::adaptors::tokenize(rng, regex, rndRng, flags) - `` - ] - ] -] - -* [*Precondition:] - * Let `T` denote `typename range_value::type`, then `regex` has the type `basic_regex` or is implicitly convertible to one of these types. - * `i` has the type `int`. - * the `value_type` of `rndRng` is `int`. - * `flags` has the type `regex_constants::syntax_option_type`. -* [*Returns:] A range whose iterators behave as if they were the original iterators wrapped in `regex_token_iterator`. The first iterator in the range would be constructed by forwarding all the arguments of `tokenized()` to the `regex_token_iterator` constructor. -* [*Throws:] Whatever constructing and copying equivalent `regex_token_iterator`s might throw. -* [*Range Category:] __random_access_range__ -* [*Range Return Type:] `boost::tokenized_range` -* [*Returned Range Category:] __random_access_range__ - -[section:tokenized_example tokenized_example] -[import ../../../test/adaptor_test/tokenized_example.cpp] -[tokenized_example] -[endsect] - -This would produce the output: -`` -a -b -c -d -e -f -g -hijklmnopqrstuvwxyz - -`` - -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/transformed.qbk b/libs/range/doc/reference/adaptors/transformed.qbk deleted file mode 100644 index 0c71e8d89..000000000 --- a/libs/range/doc/reference/adaptors/transformed.qbk +++ /dev/null @@ -1,32 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:transformed transformed] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::transformed(fun)`]] - [[Function] [`boost::adaptors::transform(rng, fun)`]] -] - -* [*Precondition:] The `value_type` of the range is convertible to the argument type of `fun`. -* [*Postcondition:] For all elements `x` in the returned range, `x` is the result of `fun(y)` where `y` is the corresponding element in the original range. -* [*Throws:] Whatever the copy-constructor of `fun` might throw. -* [*Range Category:] __single_pass_range__ -* [*Range Return Type:] `boost::transformed_range` -* [*Returned Range Category:] The range category of `rng`. - -[section:transformed_example transformed example] -[import ../../../test/adaptor_test/transformed_example.cpp] -[transformed_example] -[endsect] - -This would produce the output: -`` -2,4,6,8,10,12,14,16,18,20, -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/type_erased.qbk b/libs/range/doc/reference/adaptors/type_erased.qbk deleted file mode 100644 index e55ff665c..000000000 --- a/libs/range/doc/reference/adaptors/type_erased.qbk +++ /dev/null @@ -1,65 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:type_erased type_erased] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::type_erased()`]] - [[Function] [`boost::adaptors::type_erase(rng, boost::adaptors::type_erased)`]] -] - -Please note that it is frequently unnecessary to use the `type_erased` adaptor. It is often better to use the implicit conversion to `any_range`. - -Let `Rng` be the type of `rng`. - -* [*Template parameters:] - * `Value` is the `value_type` for the `any_range`. If this is set to boost::use_default, `Value` will be calculated from the - range type when the adaptor is applied. - * `Traversal` is the tag used to identify the traversal of the resultant range. Frequently it is desirable to set a traversal category lower than the source container or range to maximize the number of ranges that can convert to the `any_range`. If this is left as boost::use_default then `Traversal` will be `typename boost::iterator_traversal::type>::type` - * `Reference` is the `reference` for the `any_range`. `boost::use_default` will equate to `typename range_reference::type`. - * `Difference` is the `difference_type` for the any_range. `boost::use_default` will equate to `typename boost::range_difference::type` - * `Buffer` is the storage used to allocate the underlying iterator wrappers. This can typically be ignored, but is available as a template parameter for customization. Buffer must be a model of the `AnyIteratorBufferConcept`. -* [*Precondition:] `Traversal` is one of `{ boost::use_default, boost::single_pass_traversal_tag, boost::forward_traversal_tag, boost::bidirectional_traversal_tag, boost::random_access_traversal_tag }` -* [*Returns:] The returned value is the same as `typename any_range_type_generator< Rng, Value, Traversal, Reference, Difference, Buffer >` that represents `rng` in a type-erased manner. -* [*Range Category:] __single_pass_range__ -* [*Returned Range Category:] if `Traversal` was specified as `boost::use_default` then `typename boost::iterator_traversal::type>::type`, otherwise `Traversal`. - -[heading AnyIteratorBufferConcept] -`` -class AnyIteratorBufferConcept -{ -public: - AnyIteratorBufferConcept(); - ~AnyIteratorBufferConcept(); - - // bytes is the requested size to allocate. This function - // must return a pointer to an adequate area of memory. - // throws: bad_alloc - // - // The buffer will only ever have zero or one - // outstanding memory allocations. - void* allocate(std::size_t bytes); - - // deallocate this buffer - void deallocate(); -}; -`` - -[section:type_erased_example type-erased example] -[import ../../../test/adaptor_test/type_erased_example.cpp] -[type_erased_example] -[endsect] - -This would produce the output: -`` -1,2,3,4,5, -6,7,8,9,10, -11,12,13,14,15, -11,12,13,14,15, -`` -[endsect] - - diff --git a/libs/range/doc/reference/adaptors/uniqued.qbk b/libs/range/doc/reference/adaptors/uniqued.qbk deleted file mode 100644 index 3fb38d766..000000000 --- a/libs/range/doc/reference/adaptors/uniqued.qbk +++ /dev/null @@ -1,31 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:uniqued uniqued] - -[table - [[Syntax] [Code]] - [[Pipe] [`rng | boost::adaptors::uniqued`]] - [[Function] [`boost::adaptors::unique(rng)`]] -] - -* [*Precondition:] The `value_type` of the range is comparable with `operator==()`. -* [*Postcondition:] For all adjacent elements `[x,y]` in the returned range, `x==y` is false. -* [*Range Category:] __forward_range__ -* [*Range Return Type:] `boost::uniqued_range` -* [*Returned Range Category:] The minimum of the range concept of `rng` and __forward_range__. - -[section:uniqued_example uniqued example] -[import ../../../test/adaptor_test/uniqued_example.cpp] -[uniqued_example] -[endsect] - -This would produce the output: -`` -1,2,3,4,5,6, -`` -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/adjacent_find.qbk b/libs/range/doc/reference/algorithm/adjacent_find.qbk deleted file mode 100644 index 67d78d48f..000000000 --- a/libs/range/doc/reference/algorithm/adjacent_find.qbk +++ /dev/null @@ -1,85 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:adjacent_find adjacent_find] - -[heading Prototype] - -`` -template -typename range_iterator::type -adjacent_find(ForwardRange& rng); - -template -typename range_iterator::type -adjacent_find(const ForwardRange& rng); - -template -typename range_iterator::type -adjacent_find(ForwardRange& rng, BinaryPred pred); - -template -typename range_iterator::type -adjacent_find(const ForwardRange& rng, BinaryPred pred); - -template -typename range_return::type -adjacent_find(ForwardRange& rng); - -template -typename range_return::type -adjacent_find(const ForwardRange& rng); - -template< - range_return_value re, - class ForwardRange, - class BinaryPredicate - > -typename range_return::type -adjacent_find(ForwardRange& rng, BinaryPredicate pred); - -template< - range_return_value re, - class ForwardRange, - class BinaryPredicate - > -typename range_return::type -adjacent_find(const ForwardRange& rng, BinaryPredicate pred); -`` - -[heading Description] - -[*Non-predicate versions:] - -`adjacent_find` finds the first adjacent elements `[x,y]` in `rng` where `x == y` - -[*Predicate versions:] - -`adjacent_find` finds the first adjacent elements `[x,y]` in `rng` where `pred(x,y)` is `true`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/adjacent_find.hpp` - -[heading Requirements] - -[*For the non-predicate versions of adjacent_find:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange`'s value type is a model of the `EqualityComparableConcept`. - -[*For the predicate versions of adjacent_find:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `BinaryPredicate` is a model of the `BinaryPredicateConcept`. -* `ForwardRange`'s value type is convertible to `BinaryPredicate`'s first argument type and to `BinaryPredicate`'s second argument type. - -[heading Complexity] - -Linear. If `empty(rng)` then no comparisons are performed; otherwise, at most `distance(rng) - 1` comparisons. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/binary_search.qbk b/libs/range/doc/reference/algorithm/binary_search.qbk deleted file mode 100644 index 42031b33b..000000000 --- a/libs/range/doc/reference/algorithm/binary_search.qbk +++ /dev/null @@ -1,60 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:binary_search binary_search] - -[heading Prototype] - -`` -template -bool binary_search(const ForwardRange& rng, const Value& val); - -template -bool binary_search(const ForwardRange& rng, const Value& val, BinaryPredicate pred); -`` - -[heading Description] - -`binary_search` returns `true` if and only if the value `val` exists in the range `rng`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/binary_search.hpp` - -[heading Requirements] - -[*For the non-predicate versions of binary_search:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `Value` is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `Value` is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. -* `ForwardRange`'s value type is the same type as `Value`. - -[*For the predicate versions of binary_search:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `ForwardRange`'s value type is the same type as `Value`. -* `ForwardRange`'s value type is convertible to `BinaryPredicate`'s argument type. - -[heading Precondition:] - -[*For the non-predicate version:] - -`rng` is ordered in ascending order according to `operator<`. - -[*For the predicate version:] - -`rng` is ordered in ascending order according to the function object `pred`. - -[heading Complexity] - -For non-random-access ranges, the complexity is `O(N)` where `N` is `distance(rng)`. - -For random-access ranges, the complexity is `O(log N)` where `N` is `distance(rng)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/copy.qbk b/libs/range/doc/reference/algorithm/copy.qbk deleted file mode 100644 index e40f1b137..000000000 --- a/libs/range/doc/reference/algorithm/copy.qbk +++ /dev/null @@ -1,41 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:copy copy] - -[heading Prototype] - -`` -template -OutputIterator copy(const SinglePassRange& source_rng, OutputIterator out_it); -`` - -[heading Description] - -`copy` copies all elements from `source_rng` to the range `[out_it, out_it + distance(source_rng))`. -The return value is `out_it + distance(source_rng)` - -[heading Definition] - -Defined in the header file `boost/range/algorithm/copy.hpp` - -[heading Requirements] - -* `SinglePassRange` is a model of the __single_pass_range__ Concept. -* `OutputIterator` is a model of the `OutputIteratorConcept`. -* The `value_type` of __single_pass_range__ Concept is convertible to a type in `OutputIterator`'s set of value types. - -[heading Precondition:] - -* `out_it` is not an iterator within the `source_rng`. -* `[out_it, out_it + distance(source_rng))` is a valid range. - -[heading Complexity] - -Linear. Exactly `distance(source_rng)` assignments are performed. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/copy_backward.qbk b/libs/range/doc/reference/algorithm/copy_backward.qbk deleted file mode 100644 index 8fdac5a86..000000000 --- a/libs/range/doc/reference/algorithm/copy_backward.qbk +++ /dev/null @@ -1,46 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:copy_backward copy_backward] - -[heading Prototype] - -`` -template - BidirectionalOutputIterator - copy_backward(const BidirectionalRange& source_rng, - BidirectionalOutputIterator out_it); -`` - -[heading Description] - -`copy_backward` copies all elements from `source_rng` to the range `[out_it - distance(source_rng), out_it)`. - -The values are copied in reverse order. The return value is `out_it - distance(source_rng)`. - -Note well that unlike all other standard algorithms `out_it` denotes the *end* of the output sequence. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/copy_backward.hpp` - -[heading Requirements] - -* `BidirectionalRange` is a model of __bidirectional_range__ Concept. -* `OutputIterator` is a model of the `OutputIteratorConcept`. -* The `value_type` of __bidirectional_range__ Concept is convertible to a type in `OutputIterator`'s set of value types. - -[heading Precondition:] - -* `out_it` is not an iterator within the `source_rng`. -* `[out_it, out_it + distance(source_rng))` is a valid range. - -[heading Complexity] - -Linear. Exactly `distance(source_rng)` assignments are performed. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/count.qbk b/libs/range/doc/reference/algorithm/count.qbk deleted file mode 100644 index a84af3c4a..000000000 --- a/libs/range/doc/reference/algorithm/count.qbk +++ /dev/null @@ -1,41 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:count count] - -[heading Prototype] - -`` -template -typename range_difference::type -count(SinglePassRange& rng, const Value& val); - -template -typename range_difference::type -count(const SinglePassRange& rng, const Value& val); -`` - -[heading Description] - -`count` returns the number of elements `x` in `rng` where `x == val` is `true`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/count.hpp` - -[heading Requirements] - -* `SinglePassRange` is a model of the __single_pass_range__ Concept. -* `Value` is a model of the `EqualityComparableConcept`. -* `SinglePassRange`'s value type is a model of the `EqualityComparableConcept`. -* An object of `SinglePassRange`'s value type can be compared for equality with an object of type `Value`. - -[heading Complexity] - -Linear. Exactly `distance(rng)` comparisons. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/count_if.qbk b/libs/range/doc/reference/algorithm/count_if.qbk deleted file mode 100644 index b95cc9196..000000000 --- a/libs/range/doc/reference/algorithm/count_if.qbk +++ /dev/null @@ -1,37 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:count_if count_if] - -[heading Prototype] - -`` -template -typename range_difference::type -count_if(const SinglePassRange& rng, UnaryPredicate pred); -`` - -[heading Description] - -`count_if` returns the number of elements `x` in `rng` where `pred(x)` is `true`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/count_if.hpp` - -[heading Requirements] - -* `SinglePassRange` is a model of the __single_pass_range__ Concept. -* `UnaryPredicate` is a model of the `UnaryPredicateConcept`. -* `SinglePassRange`'s value type is a model of the `EqualityComparableConcept`. -* The value type of `SinglePassRange` is convertible to the argument type of `UnaryPredicate`. - -[heading Complexity] - -Linear. Exactly `distance(rng)` invocations of `pred`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/equal.qbk b/libs/range/doc/reference/algorithm/equal.qbk deleted file mode 100644 index 37d1c02fa..000000000 --- a/libs/range/doc/reference/algorithm/equal.qbk +++ /dev/null @@ -1,64 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:equal equal] - -[heading Prototype] - -`` -template< - class SinglePassRange1, - class SinglePassRange2 -> -bool equal(const SinglePassRange1& rng1, - const SinglePassRange2& rng2); - -template< - class SinglePassRange1, - class SinglePassRange2, - class BinaryPredicate -> -bool equal(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - BinaryPredicate pred); -`` - -[heading Description] - -`equal` returns `true` if `distance(rng1)` is equal to the `distance(rng2)` and for each element `x` in `rng1`, the corresponding element `y` in `rng2` is equal. Otherwise `false` is returned. - -In this range version of `equal` it is perfectly acceptable to pass in two ranges of unequal lengths. - -Elements are considered equal in the non-predicate version if `operator==` returns `true`. Elements are considered equal in the predicate version if `pred(x,y)` is `true`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/equal.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `SinglePassRange1`'s value type is a model of the `EqualityComparableConcept`. -* `SinglePassRange2`'s value type is a model of the `EqualityComparableConcept`. -* `SinglePassRange1`'s value type can be compared for equality with `SinglePassRange2`'s value type. - -[*For the predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `BinaryPredicate` is a model of the `BinaryPredicateConcept`. -* `SinglePassRange1`'s value type is convertible to `BinaryPredicate`'s first argument type. -* `SinglePassRange2`'s value type is convertible to `BinaryPredicate`'s second argument type. - -[heading Complexity] - -Linear. At most `min(distance(rng1), distance(rng2))` comparisons. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/equal_range.qbk b/libs/range/doc/reference/algorithm/equal_range.qbk deleted file mode 100644 index 2d6c342df..000000000 --- a/libs/range/doc/reference/algorithm/equal_range.qbk +++ /dev/null @@ -1,83 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:equal_range equal_range] - -[heading Prototype] - -`` -template< - class ForwardRange, - class Value - > -std::pair::type, - typename range_iterator::type> -equal_range(ForwardRange& rng, const Value& val); - -template< - class ForwardRange, - class Value - > -std::pair::type, - typename range_iterator::type> -equal_range(const ForwardRange& rng, const Value& val); - -template< - class ForwardRange, - class Value, - class SortPredicate - > -std::pair::type, - typename range_iterator::type> -equal_range(ForwardRange& rng, const Value& val, SortPredicate pred); - -template< - class ForwardRange, - class Value, - class SortPredicate - > -std::pair::type, - typename range_iterator::type> -equal_range(const ForwardRange& rng, const Value& val, SortPredicate pred); - `` - -[heading Description] - -`equal_range` returns a range in the form of a pair of iterators where all of the elements are equal to `val`. If no values are found that are equal to `val`, then an empty range is returned, hence `result.first == result.second`. For the non-predicate versions of `equal_range` the equality of elements is determined by `operator<`. -For the predicate versions of `equal_range` the equality of elements is determined by `pred`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/equal_range.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `Value` is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `Value` is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. -* `ForwardRange`'s value type is the same type as `Value`. - -[*For the predicate versions:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `SortPredicate` is a model of the `StrictWeakOrderingConcept`. -* `ForwardRange`'s value type is the same as `Value`. -* `ForwardRange`'s value type is convertible to both of `SortPredicate`'s argument types. - -[heading Precondition:] - -For the non-predicate versions: `rng` is ordered in ascending order according to `operator<`. - -For the predicate versions: `rng` is ordered in ascending order according to `pred`. - -[heading Complexity] - -For random-access ranges, the complexity is `O(log N)`, otherwise the complexity is `O(N)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/fill.qbk b/libs/range/doc/reference/algorithm/fill.qbk deleted file mode 100644 index 4df2c0f4c..000000000 --- a/libs/range/doc/reference/algorithm/fill.qbk +++ /dev/null @@ -1,36 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:fill fill] - -[heading Prototype] - -`` -template -ForwardRange& fill( ForwardRange& rng, const Value& val ); -`` - -[heading Description] - -`fill` assigns the value `val` to every element in the range `rng`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/fill.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `Value` is a model of the `AssignableConcept`. -* `Value` is convertible to `ForwardRange`'s value type. - -[heading Complexity] - -Linear. Exactly `distance(rng)` assignments are performed. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/fill_n.qbk b/libs/range/doc/reference/algorithm/fill_n.qbk deleted file mode 100644 index 1375d4eea..000000000 --- a/libs/range/doc/reference/algorithm/fill_n.qbk +++ /dev/null @@ -1,36 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:fill_n fill_n] - -[heading Prototype] - -`` -template -ForwardRange& fill( ForwardRange& rng, Size n, const Value& val ); -`` - -[heading Description] - -`fill_n` assigns the value `val` to `n` elements in the range `rng` beginning with `boost::begin(rng)`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/fill_n.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `Value` is a model of the `AssignableConcept`. -* `Value` is convertible to `ForwardRange`'s value type. - -[heading Complexity] - -Linear. Exactly `n` assignments are performed. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/find.qbk b/libs/range/doc/reference/algorithm/find.qbk deleted file mode 100644 index ba5763721..000000000 --- a/libs/range/doc/reference/algorithm/find.qbk +++ /dev/null @@ -1,45 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:find find] - -[heading Prototype] - -`` -template -typename range_iterator::type -find(SinglePassRange& rng, Value val); - -template< - range_return_value re, - class SinglePassRange, - class Value - > -typename range_return::type -find(SinglePassRange& rng, Value val); -`` - -[heading Description] - -The versions of `find` that return an iterator, returns the first iterator in the range `rng` such that `*i == value`. `end(rng)` is returned if no such iterator exists. -The versions of find that return a `range_return`, defines `found` in the same manner as the returned iterator described above. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/find.hpp` - -[heading Requirements] - -* `SinglePassRange` is a model of the __single_pass_range__ Concept. -* `Value` is a model of the `EqualityComparableConcept`. -* The `operator==` is defined for type `Value` to be compared with the `SinglePassRange`'s value type. - -[heading Complexity] - -Linear. At most `distance(rng)` comparisons for equality. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/find_end.qbk b/libs/range/doc/reference/algorithm/find_end.qbk deleted file mode 100644 index dff17cdbe..000000000 --- a/libs/range/doc/reference/algorithm/find_end.qbk +++ /dev/null @@ -1,74 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:find_end find_end] - -[heading Prototype] - -`` -template -typename range_iterator::type -find_end(ForwardRange1& rng1, const ForwardRange2& rng2); - -template< - class ForwardRange1, - class ForwardRange2, - class BinaryPredicate - > -typename range_iterator::type -find_end(ForwardRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred); - -template< - range_return_value re, - class ForwardRange1, - class ForwardRange2 - > -typename range_return::type -find_end(ForwardRange1& rng1, const ForwardRange2& rng2); - -template< - range_return_value re, - class ForwardRange1, - class ForwardRange2, - class BinaryPredicate - > -typename range_return::type -find_end(ForwardRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred); -`` - -[heading Description] - -The versions of `find_end` that return an iterator, return an iterator to the beginning of the last sub-sequence equal to `rng2` within `rng1`. -Equality is determined by `operator==` for non-predicate versions of `find_end`, and by satisfying `pred` in the predicate versions. The versions of `find_end` that return a `range_return`, defines `found` in the same manner as the returned iterator described above. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/find_end.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `ForwardRange1` is a model of the __forward_range__ Concept. -* `ForwardRange2` is a model of the __forward_range__ Concept. -* `ForwardRange1`'s value type is a model of the `EqualityComparableConcept`. -* `ForwardRange2`'s value type is a model of the `EqualityComparableConcept`. -* Objects of `ForwardRange1`'s value type can be compared for equality with objects of `ForwardRange2`'s value type. - -[*For the predicate versions:] - -* `ForwardRange1` is a model of the __forward_range__ Concept. -* `ForwardRange2` is a model of the __forward_range__ Concept. -* `BinaryPredicate` is a model of the `BinaryPredicateConcept`. -* `ForwardRange1`'s value type is convertible to `BinaryPredicate`'s first argument type. -* `ForwardRange2`'s value type is convertible to `BinaryPredicate`'s second argument type. - -[heading Complexity] - -The number of comparisons is proportional to `distance(rng1) * distance(rng2)`. If both `ForwardRange1` and `ForwardRange2` are models of `BidirectionalRangeConcept` then the average complexity is linear and the worst case is `distance(rng1) * distance(rng2)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/find_first_of.qbk b/libs/range/doc/reference/algorithm/find_first_of.qbk deleted file mode 100644 index d10d986f2..000000000 --- a/libs/range/doc/reference/algorithm/find_first_of.qbk +++ /dev/null @@ -1,74 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:find_first_of find_first_of] - -[heading Prototype] - -`` -template -typename range_iterator::type -find_first_of(SinglePassRange1& rng1, const ForwardRange2& rng2); - -template< - class SinglePassRange1, - class ForwardRange2, - class BinaryPredicate - > -typename range_iterator::type -find_first_of(SinglePassRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred); - -template< - range_return_value re, - class SinglePassRange1, - class ForwardRange2 - > -typename range_return::type -find_first_of(SinglePassRange1& rng1, const ForwardRange2& rng2); - -template< - range_return_value re, - class SinglePassRange1, - class ForwardRange2, - class BinaryPredicate - > -typename range_return::type -find_first_of(SinglePassRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred); -`` - -[heading Description] - -The versions of `find_first_of` that return an iterator, return an iterator to the first occurrence in `rng1` of any of the elements in `rng2`. -Equality is determined by `operator==` for non-predicate versions of `find_first_of`, and by satisfying `pred` in the predicate versions. - -The versions of `find_first_of` that return a `range_return`, defines `found` in the same manner as the returned iterator described above. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/find_first_of.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `ForwardRange2` is a model of the __forward_range__ Concept. -* `SinglePassRange1`'s value type is a model of the `EqualityComparableConcept`, and can be compared for equality with `ForwardRange2`'s value type. - -[*For the predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `ForwardRange2` is a model of the __forward_range__ Concept. -* `BinaryPredicate` is a model of the `BinaryPredicateConcept`. -* `SinglePassRange1`'s value type is convertible to `BinaryPredicate`'s first argument type. -* `ForwardRange2`'s value type is convertible to `BinaryPredicate`'s second argument type. - -[heading Complexity] - -At most `distance(rng1) * distance(rng2)` comparisons. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/find_if.qbk b/libs/range/doc/reference/algorithm/find_if.qbk deleted file mode 100644 index 12ff91bcb..000000000 --- a/libs/range/doc/reference/algorithm/find_if.qbk +++ /dev/null @@ -1,50 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:find_if find_if] - -[heading Prototype] - -`` -template -typename range_iterator::type -find_if(SinglePassRange& rng, UnaryPredicate pred); - -template< - range_return_value re, - class SinglePassRange, - class UnaryPredicate - > -typename range_return::type -find_if(SinglePassRange& rng, UnaryPredicate pred); -`` - -[heading Description] - -The versions of `find_if` that return an iterator, returns the first iterator in the range `rng` such that `pred(*i)` is `true`. `end(rng)` is returned if no such iterator exists. - -The versions of `find_if` that return a `range_return`, defines found in the same manner as the returned iterator described above. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/find_if.hpp` - -[heading Requirements] - -* `SinglePassRange` is a model of the __single_pass_range__ Concept. -* `UnaryPredicate` is a model of the `PredicateConcept`. -* The value type of `SinglePassRange` is convertible to the argument type of `UnaryPredicate`. - -[heading Precondition:] - -For each iterator `i` in `rng`, `*i` is in the domain of `UnaryPredicate`. - -[heading Complexity] - -Linear. At most `distance(rng)` invocations of `pred`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/for_each.qbk b/libs/range/doc/reference/algorithm/for_each.qbk deleted file mode 100644 index 36613680f..000000000 --- a/libs/range/doc/reference/algorithm/for_each.qbk +++ /dev/null @@ -1,45 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:for_each for_each] - -[heading Prototype] - -`` -template< - class SinglePassRange, - class UnaryFunction - > -UnaryFunction for_each(SinglePassRange& rng, UnaryFunction fun); - -template< - class SinglePassRange, - class UnaryFunction - > -UnaryFunction for_each(const SinglePassRange& rng, UnaryFunction fun); -`` - -[heading Description] - -`for_each` traverses forward through `rng` and for each element `x` it invokes `fun(x)`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/for_each.hpp` - -[heading Requirements] - -* `SinglePassRange` is a model of the __single_pass_range__ Concept. -* `UnaryFunction` is a model of the `UnaryFunctionConcept`. -* `UnaryFunction` does not apply any non-constant operation through its argument. -* `SinglePassRange`'s value type is convertible to `UnaryFunction`'s argument type. - -[heading Complexity] - -Linear. Exactly `distance(rng)` applications of `UnaryFunction`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/generate.qbk b/libs/range/doc/reference/algorithm/generate.qbk deleted file mode 100644 index 3d196641a..000000000 --- a/libs/range/doc/reference/algorithm/generate.qbk +++ /dev/null @@ -1,44 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:generate generate] - -[heading Prototype] - -`` -template -ForwardRange& generate( ForwardRange& rng, Generator gen ); - -template -const ForwardRange& generate( const ForwardRange& rng, Generator gen ); -`` - -[heading Description] - -`generate` assigns the result of `gen()` to each element in range `rng`. Returns the resultant range. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/generate.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `Generator` is a model of the `GeneratorConcept`. -* The `value_type` of `SinglePassRange` is convertible to a type in `OutputIterator`'s set of value types. - -[heading Precondition:] - -* `out_it` is not an iterator within `rng`. -* `[out_it, out_it + distance(rng))` is a valid range. - -[heading Complexity] - -Linear. Exactly `distance(rng)` assignments are performed. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/includes.qbk b/libs/range/doc/reference/algorithm/includes.qbk deleted file mode 100644 index 5f1ca5f48..000000000 --- a/libs/range/doc/reference/algorithm/includes.qbk +++ /dev/null @@ -1,69 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:includes includes] - -[heading Prototype] - -`` -template -bool includes(const SinglePassRange1& rng1, const SinglePassRange2& rng2); - -template< - class SinglePassRange1, - class SinglePassRange2, - class BinaryPredicate - > -bool includes(const SinglePassRange1& rng1, const SinglePassRange2& rng2, - BinaryPredicate pred); -`` - -[heading Description] - -`includes` returns `true` if and only if, for every element in `rng2`, an equivalent element is also present in `rng1`. -The ordering relationship is determined by using `operator<` in the non-predicate versions, and by evaluating `pred` in the predicate versions. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/set_algorithm.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `SinglePassRange1` and `SinglePassRange2` have the same value type. -* `SinglePassRange1`'s value type is a model of the `LessThanComparableConcept`. -* `SinglePassRange2`'s value type is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `SinglePassRange1`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. -* The ordering of objects of type `SinglePassRange2`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - -[*For the predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `SinglePassRange1` and `SinglePassRange2` have the same value type. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `SinglePassRange1`'s value type is convertible to `BinaryPredicate`'s first argument type. -* `SinglePassRange2`'s value type is convertible to `BinaryPredicate`'s second argument types. - -[heading Precondition:] - -[*For the non-predicate versions:] - -`rng1` and `rng2` are sorted in ascending order according to `operator<`. - -[*For the predicate versions:] - -`rng1` and `rng2` are sorted in ascending order according to `pred`. - -[heading Complexity] - -Linear. `O(N)`, where `N` is `distance(rng1) + distance(rng2)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/inplace_merge.qbk b/libs/range/doc/reference/algorithm/inplace_merge.qbk deleted file mode 100644 index 015d9bbaf..000000000 --- a/libs/range/doc/reference/algorithm/inplace_merge.qbk +++ /dev/null @@ -1,77 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:inplace_merge inplace_merge] - -[heading Prototype] - -`` -template -BidirectionalRange& -inplace_merge( BidirectionalRange& rng, - typename range_iterator::type middle ); - -template -const BidirectionalRange& -inplace_merge( const BidirectionalRange& rng, - typename range_iterator::type middle ); - -template -BidirectionalRange& -inplace_merge( BidirectionalRange& rng, - typename range_iterator::type middle, - BinaryPredicate pred ); - -template -const BidirectionalRange& -inplace_merge( const BidirectionalRange& rng, - typename range_iterator::type middle, - BinaryPredicate pred ); -`` - -[heading Description] - -`inplace_merge` combines two consecutive sorted ranges `[begin(rng), middle)` and `[middle, end(rng))` into a single sorted range `[begin(rng), end(rng))`. That is, it starts with a range `[begin(rng), end(rng))` that consists of two pieces each of which is in ascending order, and rearranges it so that the entire range is in ascending order. `inplace_merge` is stable, meaning both that the relative order of elements within each input range is preserved. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/inplace_merge.hpp` - -[heading Requirements] - -[*For the non-predicate version:] - -* `BidirectionalRange` is a model of the __bidirectional_range__ Concept. -* `BidirectionalRange` is mutable. -* `range_value::type` is a model of `LessThanComparableConcept` -* The ordering on objects of `range_type::type` is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - -[*For the predicate version:] -* `BidirectionalRange` is a model of the __bidirectional_range__ Concept. -* `BidirectionalRange` is mutable. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `BidirectionalRange`'s value type is convertible to both `BinaryPredicate`'s argument types. - -[heading Precondition:] - -[heading For the non-predicate version:] - -* `middle` is in the range `rng`. -* `[begin(rng), middle)` is in ascending order. That is for each pair of adjacent elements `[x,y]`, `y < x` is `false`. -* `[middle, end(rng))` is in ascending order. That is for each pair of adjacent elements `[x,y]`, `y < x` is `false`. - -[heading For the predicate version:] - -* `middle` is in the range `rng`. -* `[begin(rng), middle)` is in ascending order. That is for each pair of adjacent elements `[x,y]`, `pred(y,x) == false`. -* `[middle, end(rng))` is in ascending order. That is for each pair of adjacent elements `[x,y]`, `pred(y,x) == false`. - -[heading Complexity] - -Worst case: `O(N log(N))` - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/lexicographical_compare.qbk b/libs/range/doc/reference/algorithm/lexicographical_compare.qbk deleted file mode 100644 index 8160b15fe..000000000 --- a/libs/range/doc/reference/algorithm/lexicographical_compare.qbk +++ /dev/null @@ -1,60 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:lexicographical_compare lexicographical_compare] - -[heading Prototype] - -`` -template< - class SinglePassRange1, - class SinglePassRange2 - > -bool lexicographical_compare(const SinglePassRange1& rng1, - const SinglePassRange2& rng2); - -template< - class SinglePassRange1, - class SinglePassRange2, - class BinaryPredicate - > -bool lexicographical_compare(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - BinaryPredicate pred); -`` - -[heading Description] - -`lexicographical_compare` compares element by element `rng1` against `rng2`. If the element from `rng1` is less than the element from `rng2` then `true` is returned. If the end of `rng1` without reaching the end of `rng2` this also causes the return value to be `true`. The return value is `false` in all other circumstances. The elements are compared using `operator<` in the non-predicate versions of `lexicographical_compare` and using `pred` in the predicate versions. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/lexicographical_compare.hpp` - -[heading Requirements] - -[*For the non-predicate versions of lexicographical_compare:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `SinglePassRange1`'s value type is a model of the `LessThanComparableConcept`. -* `SinglePassRange2`'s value type is a model of the `LessThanComparableConcept`. -* Let `x` be an object of `SinglePassRange1`'s value type. Let `y` be an object of `SinglePassRange2`'s value type. `x < y` must be valid. `y < x` must be valid. - -[*For the predicate versions of lexicographical_compare:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `BinaryPredicate` is a model of the `BinaryPredicateConcept`. -* `SinglePassRange1`'s value type is convertible to `BinaryPredicate`'s first argument type. -* `SinglePassRange2`'s value type is convertible to `BinaryPredicate`'s second argument type. - -[heading Complexity] - -Linear. At most `2 * min(distance(rng1), distance(rng2))` comparisons. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/lower_bound.qbk b/libs/range/doc/reference/algorithm/lower_bound.qbk deleted file mode 100644 index 2917d2670..000000000 --- a/libs/range/doc/reference/algorithm/lower_bound.qbk +++ /dev/null @@ -1,93 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:lower_bound lower_bound] - -[heading Prototype] - -`` -template< - class ForwardRange, - class Value - > -typename range_iterator::type -lower_bound(ForwardRange& rng, Value val); - -template< - range_return_value re, - class ForwardRange, - class Value - > -typename range_return::type -lower_bound(ForwardRange& rng, Value val); - -template< - class ForwardRange, - class Value, - class SortPredicate - > -typename range_iterator::type -lower_bound(ForwardRange& rng, Value val, SortPredicate pred); - -template< - range_return_value re, - class ForwardRange, - class Value, - class SortPredicate - > -typename range_return::type -lower_bound(ForwardRange& rng, Value val, SortPredicate pred); -`` - -[heading Description] - -The versions of `lower_bound` that return an iterator, returns the first iterator in the range `rng` such that: -without predicate - `*i < value` is `false`, -with predicate - `pred(*i, value)` is `false`. - -`end(rng)` is returned if no such iterator exists. - -The versions of `lower_bound` that return a `range_return`, defines `found` in the same manner as the returned iterator described above. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/lower_bound.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `Value` is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `Value` is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. -* `ForwardRange`'s value type is the same type as `Value`. - -[*For the predicate versions:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `ForwardRange`'s value type is the same type as `Value`. -* `ForwardRange`'s value type is convertible to both of `BinaryPredicate`'s argument types. - -[heading Precondition:] - -[*For the non-predicate versions:] - -`rng` is sorted in ascending order according to `operator<`. - -[*For the predicate versions:] - -`rng` is sorted in ascending order according to `pred`. - -[heading Complexity] - -For ranges that model the __random_access_range__ concept the complexity is `O(log N)`, where `N` is `distance(rng)`. - -For all other range types the complexity is `O(N)`. - - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/make_heap.qbk b/libs/range/doc/reference/algorithm/make_heap.qbk deleted file mode 100644 index df47fac22..000000000 --- a/libs/range/doc/reference/algorithm/make_heap.qbk +++ /dev/null @@ -1,56 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:make_heap make_heap] - -[heading Prototype] - -`` -template -RandomAccessRange& make_heap(RandomAccessRange& rng); - -template -const RandomAccessRange& make_heap(const RandomAccessRange& rng); - -template -RandomAccessRange& make_heap(RandomAccessRange& rng, Compare pred); - -template -const RandomAccessRange& make_heap(const RandomAccessRange& rng, Compare pred); -`` - -[heading Description] - -`make_heap` turns `rng` into a heap. - -The ordering relationship is determined by using `operator<` in the non-predicate versions, and by evaluating `pred` in the predicate versions. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/heap_algorithm.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `RandomAccessRange`'s value type is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `RandomAccessRange`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - -[*For the predicate versions:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `Compare` is a model of the `StrictWeakOrderingConcept`. -* `RandomAccessRange`'s value type is convertible to both of `Compare`'s argument types. - -[heading Complexity] - -Linear. At most `3 * distance(rng)` comparisons. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/max_element.qbk b/libs/range/doc/reference/algorithm/max_element.qbk deleted file mode 100644 index 01101a526..000000000 --- a/libs/range/doc/reference/algorithm/max_element.qbk +++ /dev/null @@ -1,86 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:max_element max_element] - -[heading Prototype] - -`` -template -typename range_iterator::type -max_element(ForwardRange& rng); - -template -typename range_iterator::type -max_element(const ForwardRange& rng); - -template -typename range_iterator::type -max_element(ForwardRange& rng, BinaryPredicate pred); - -template -typename range_iterator::type -max_element(const ForwardRange& rng, BinaryPredicate pred); - - -template< - range_return_value re, - class ForwardRange - > -typename range_return::type -max_element(ForwardRange& rng); - -template< - range_return_value_re, - class ForwardRange - > -typename range_return::type -max_element(const ForwardRange& rng); - -template< - range_return_value re, - class ForwardRange, - class BinaryPredicate - > -typename range_return::type -max_element(ForwardRange& rng, BinaryPredicate pred); - -template< - range_return_value re, - class ForwardRange, - class BinaryPredicate - > -typename range_return::type -max_element(const ForwardRange& rng, BinaryPredicate pred); -`` - -[heading Description] - -The versions of `max_element` that return an iterator, return the iterator to the maximum value as determined by using `operator<` if a predicate is not supplied. Otherwise the predicate `pred` is used to determine the maximum value. The versions of `max_element` that return a `range_return`, defines `found` in the same manner as the returned iterator described above. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/max_element.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange`'s value type is a model of the `LessThanComparableConcept`. - -[*For the predicate versions:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `BinaryPredicate` is a model of the `BinaryPredicateConcept`. -* `ForwardRange`'s value type is convertible to both of `BinaryPredicate`'s argument types. - -[heading Complexity] - -Linear. Zero comparisons if `empty(rng)`, otherwise `distance(rng) - 1` comparisons. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/merge.qbk b/libs/range/doc/reference/algorithm/merge.qbk deleted file mode 100644 index e8383585a..000000000 --- a/libs/range/doc/reference/algorithm/merge.qbk +++ /dev/null @@ -1,88 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:merge merge] - -[heading Prototype] - -`` -template< - class SinglePassRange1, - class SinglePassRange2, - class OutputIterator - > -OutputIterator merge(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - OutputIterator out); - -template< - class SinglePassRange1, - class SinglePassRange2, - class OutputIterator, - class BinaryPredicate - > -OutputIterator merge(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - OutputIterator out, - BinaryPredicate pred); -`` - -[heading Description] - -`merge` combines two sorted ranges `rng1` and `rng2` into a single sorted range by copying elements. `merge` is stable. The return value is `out + distance(rng1) + distance(rng2)`. - -The two versions of `merge` differ by how they compare the elements. - -The non-predicate version uses the `operator<()` for the range value type. The predicate version uses the predicate instead of `operator<()`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/merge.hpp` - -[heading Requirements] - -[*For the non-predicate version:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `range_value::type` is the same as `range_value::type`. -* `range_value::type` is a model of the `LessThanComparableConcept`. -* The ordering on objects of `range_value::type` is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. -* `range_value::type` is convertible to a type in `OutputIterator`'s set of value types. - -[*For the predicate version:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `range_value::type` is the same as `range_value::type`. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `SinglePassRange1`'s value type is convertible to both `BinaryPredicate`'s argument types. -* `range_value::type` is convertible to a type in `OutputIterator`'s set of value types. - -[heading Precondition:] - -[heading For the non-predicate version:] - -* The elements of `rng1` are in ascending order. That is, for each adjacent element pair `[x,y]` of `rng1`, `y < x == false`. -* The elements of `rng2` are in ascending order. That is, for each adjacent element pair `[x,y]` of `rng2`, `y < x == false`. -* The ranges `rng1` and `[out, out + distance(rng1) + distance(rng2))` do not overlap. -* The ranges `rng2` and `[out, out + distance(rng1) + distance(rng2))` do not overlap. -* `[out, out + distance(rng1) + distance(rng2))` is a valid range. - -[heading For the predicate version:] - -* The elements of `rng1` are in ascending order. That is, for each adjacent element pair `[x,y]`, of `rng1`, `pred(y, x) == false`. -* The elements of `rng2` are in ascending order. That is, for each adjacent element pair `[x,y]`, of `rng2`, `pred(y, x) == false`. -* The ranges `rng1` and `[out, out + distance(rng1) + distance(rng2))` do not overlap. -* The ranges `rng2` and `[out, out + distance(rng1) + distance(rng2))` do not overlap. -* `[out, out + distance(rng1) + distance(rng2))` is a valid range. - -[heading Complexity] - -Linear. There are no comparisons if both `rng1` and `rng2` are empty, otherwise at most `distance(rng1) + distance(rng2) - 1` comparisons. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/min_element.qbk b/libs/range/doc/reference/algorithm/min_element.qbk deleted file mode 100644 index 38955328f..000000000 --- a/libs/range/doc/reference/algorithm/min_element.qbk +++ /dev/null @@ -1,86 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:min_element min_element] - -[heading Prototype] - -`` -template -typename range_iterator::type -min_element(ForwardRange& rng); - -template -typename range_iterator::type -min_element(const ForwardRange& rng); - -template -typename range_iterator::type -min_element(ForwardRange& rng, BinaryPredicate pred); - -template -typename range_iterator::type -min_element(const ForwardRange& rng, BinaryPredicate pred); - - -template< - range_return_value re, - class ForwardRange - > -typename range_return::type -min_element(ForwardRange& rng); - -template< - range_return_value_re, - class ForwardRange - > -typename range_return::type -min_element(const ForwardRange& rng); - -template< - range_return_value re, - class ForwardRange, - class BinaryPredicate - > -typename range_return::type -min_element(ForwardRange& rng, BinaryPredicate pred); - -template< - range_return_value re, - class ForwardRange, - class BinaryPredicate - > -typename range_return::type -min_element(const ForwardRange& rng, BinaryPredicate pred); -`` - -[heading Description] - -The versions of `min_element` that return an iterator, return the iterator to the minimum value as determined by using `operator<` if a predicate is not supplied. Otherwise the predicate `pred` is used to determine the minimum value. The versions of `min_element` that return a `range_return`, defines `found` in the same manner as the returned iterator described above. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/min_element.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange`'s value type is a model of the `LessThanComparableConcept`. - -[*For the predicate versions:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `BinaryPredicate` is a model of the `BinaryPredicateConcept`. -* `ForwardRange`'s value type is convertible to both of `BinaryPredicate`'s argument types. - -[heading Complexity] - -Linear. Zero comparisons if `empty(rng)`, otherwise `distance(rng) - 1` comparisons. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/mismatch.qbk b/libs/range/doc/reference/algorithm/mismatch.qbk deleted file mode 100644 index 359973380..000000000 --- a/libs/range/doc/reference/algorithm/mismatch.qbk +++ /dev/null @@ -1,119 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:mismatch mismatch] - -[heading Prototype] - -`` -template -std::pair< - typename range_iterator::type, - typename range_iterator::type > -mismatch(SinglePassRange1& rng1, const SinglePassRange2& rng2); - -template -std::pair< - typename range_iterator::type, - typename range_iterator::type > -mismatch(const SinglePassRange1& rng1, const SinglePassRange2& rng2); - -template -std::pair< - typename range_iterator::type, - typename range_iterator::type > -mismatch(SinglePassRange1& rng1, SinglePassRange2& rng2); - -template -std::pair< - typename range_iterator::type, - typename range_iterator::type > -mismatch(const SinglePassRange1& rng1, SinglePassRange2& rng2); - - -template< - class SinglePassRange1, - class SinglePassRange2, - class BinaryPredicate - > -std::pair< - typename range_iterator::type, - typename range_iterator::type > -mismatch(SinglePassRange1& rng1, const SinglePassRange2& rng2, - BinaryPredicate pred); - -template< - class SinglePassRange1, - class SinglePassRange2, - class BinaryPredicate - > -std::pair< - typename range_iterator::type, - typename range_iterator::type > -mismatch(const SinglePassRange1& rng1, const SinglePassRange2& rng2, - BinaryPredicate pred); - -template< - class SinglePassRange1, - class SinglePassRange2, - class BinaryPredicate - > -std::pair< - typename range_iterator::type, - typename range_iterator::type > -mismatch(SinglePassRange1& rng1, SinglePassRange2& rng2, - BinaryPredicate pred); - -template< - class SinglePassRange1, - class SinglePassRange2, - class BinaryPredicate - > -std::pair< - typename range_iterator::type, - typename range_iterator::type > -mismatch(const SinglePassRange1& rng1, SinglePassRange2& rng2, - BinaryPredicate pred); -`` - -[heading Description] - -`mismatch` finds the first position where the corresponding elements from the two ranges `rng1` and `rng2` are not equal. - -Equality is determined by `operator==` for non-predicate versions of `mismatch`, and by satisfying `pred` in the predicate versions. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/mismatch.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `SinglePassRange1`'s value type is a model of the `EqualityComparableConcept`. -* `SinglePassRange2`'s value type is a model of the `EqualityComparableConcept`. -* `SinglePassRange1`s value type can be compared for equality with `SinglePassRange2`'s value type. - -[*For the predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `BinaryPredicate` is a model of the `BinaryPredicateConcept`. -* `SinglePassRange1`'s value type is convertible to `BinaryPredicate`'s first argument type. -* `SinglePassRange2`'s value type is convertible to `BinaryPredicate`'s second argument type. - -[heading Precondition:] - -`distance(rng2) >= distance(rng1)` - -[heading Complexity] - -Linear. At most `distance(rng1)` comparisons. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/next_permutation.qbk b/libs/range/doc/reference/algorithm/next_permutation.qbk deleted file mode 100644 index 4a8dc2168..000000000 --- a/libs/range/doc/reference/algorithm/next_permutation.qbk +++ /dev/null @@ -1,56 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:next_permutation next_permutation] - -[heading Prototype] - -`` -template -bool next_permutation(BidirectionalRange& rng); - -template -bool next_permutation(const BidirectionalRange& rng); - -template -bool next_permutation(BidirectionalRange& rng, Compare pred); - -template -bool next_permutation(const BidirectionalRange& rng, Compare pred); -`` - -[heading Description] - -`next_permutation` transforms the range of elements `rng` into the lexicographically next greater permutation of the elements if such a permutation exists. If one does not exist then the range is transformed into the lexicographically smallest permutation and `false` is returned. `true` is returned when the next greater permutation is successfully generated. - -The ordering relationship is determined by using `operator<` in the non-predicate versions, and by evaluating `pred` in the predicate versions. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/permutation.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `BidirectionalRange` is a model of the __bidirectional_range__ Concept. -* `BidirectionalRange` is mutable. -* `BidirectionalRange`'s value type is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `BidirectionalRange`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - -[*For the predicate versions:] - -* `BidirectionalRange` is a model of the __bidirectional_range__ Concept. -* `BidirectionalRange` is mutable. -* `Compare` is a model of the `StrictWeakOrderingConcept`. -* `BidirectionalRange`'s value type is convertible to both of `Compare`'s argument types. - -[heading Complexity] - -Linear. At most `distance(rng) / 2` swaps. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/nth_element.qbk b/libs/range/doc/reference/algorithm/nth_element.qbk deleted file mode 100644 index 9bd785e95..000000000 --- a/libs/range/doc/reference/algorithm/nth_element.qbk +++ /dev/null @@ -1,67 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:nth_element nth_element] - -[heading Prototype] - -`` -template -RandomAccessRange& nth_element( - RandomAccessRange& rng, - typename range_iterator::type nth); - -template -const RandomAccessRange& nth_element( - const RandomAccessRange& rng, - typename range_iterator::type nth); - -template -RandomAccessRange& nth_element( - RandomAccessRange& rng, - typename range_iterator::type nth, - BinaryPredicate sort_pred); - -template -const RandomAccessRange& nth_element( - const RandomAccessRange& rng, - typename range_iterator::type nth, - BinaryPredicate sort_pred); -`` - -[heading Description] - -`nth_element` partially orders a range of elements. `nth_element` arranges the range `rng` such that the element corresponding with the iterator `nth` is the same as the element that would be in that position if `rng` has been sorted. - - -[heading Definition] - -Defined in the header file `boost/range/algorithm/nth_element.hpp` - -[heading Requirements] - -[*For the non-predicate version:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `RandomAccessRange`'s value type is a model of the `LessThanComparableConcept`. -* The ordering relation on `RandomAccessRange`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - - -[*For the predicate version:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `RandomAccessRange`'s value type is convertible to both of `BinaryPredicate`'s argument types. - - -[heading Complexity] - -On average, linear in `distance(rng)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/partial_sort.qbk b/libs/range/doc/reference/algorithm/partial_sort.qbk deleted file mode 100644 index e2b887660..000000000 --- a/libs/range/doc/reference/algorithm/partial_sort.qbk +++ /dev/null @@ -1,69 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:partial_sort partial_sort] - -[heading Prototype] - -`` -template -RandomAccessRange& partial_sort( - RandomAccessRange& rng, - typename range_iterator::type middle); - -template -const RandomAccessRange& partial_sort( - const RandomAccessRange& rng, - typename range_iterator::type middle); - -template -RandomAccessRange& partial_sort( - RandomAccessRange& rng, - typename range_iterator::type middle, - BinaryPredicate sort_pred); - -template -const RandomAccessRange& partial_sort( - const RandomAccessRange& rng, - typename range_iterator::type middle, - BinaryPredicate sort_pred); -`` - -[heading Description] - -`partial_sort` rearranges the elements in `rng`. It places the smallest `distance(begin(rng), middle)` elements, sorted in ascending order, into the range `[begin(rng), middle)`. The remaining elements are placed in an unspecified order into `[middle, last)`. - -The non-predicative versions of this function specify that one element is less than another by using `operator<()`. The predicate versions use the predicate instead. - - -[heading Definition] - -Defined in the header file `boost/range/algorithm/partial_sort.hpp` - -[heading Requirements] - -[*For the non-predicate version:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `RandomAccessRange`'s value type is a model of the `LessThanComparableConcept`. -* The ordering relation on `RandomAccessRange`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - - -[*For the predicate version:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `RandomAccessRange`'s value type is convertible to both of `BinaryPredicate`'s argument types. - - -[heading Complexity] - -Approximately `distance(rng) * log(distance(begin(rng), middle))` comparisons. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/partition.qbk b/libs/range/doc/reference/algorithm/partition.qbk deleted file mode 100644 index a97a89301..000000000 --- a/libs/range/doc/reference/algorithm/partition.qbk +++ /dev/null @@ -1,63 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:partition partition] - -[heading Prototype] - -`` -template< - class ForwardRange, - class UnaryPredicate - > -typename range_iterator::type -partition(ForwardRange& rng, UnaryPredicate pred); - -template< - class ForwardRange, - class UnaryPredicate - > -typename range_iterator::type -partition(const ForwardRange& rng, UnaryPredicate pred); - -template< - range_return_value re, - class ForwardRange, - class UnaryPredicate - > -typename range_return::type -partition(ForwardRange& rng, UnaryPredicate pred); - -template< - range_return_value re, - class ForwardRange, - class UnaryPredicate - > -typename range_return::type -partition(const ForwardRange& rng, UnaryPredicate pred); -`` - -[heading Description] - -`partition` orders the elements in `rng` based on `pred`, such that the elements that satisfy `pred` precede the elements that do not. In the versions that return a single iterator, the return value is the middle iterator. In the versions that have a configurable range_return, `found` corresponds to the middle iterator. - - -[heading Definition] - -Defined in the header file `boost/range/algorithm/partition.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. For C++ versions prior to C++11 the underlying std::partition requires Bidirectional Iterators, hence the requirement for older library versions is for a __bidirectional_range__. -* `UnaryPredicate` is a model of the `PredicateConcept`. -* `ForwardRange`'s value type is convertible to `UnaryPredicate`'s argument type. - -[heading Complexity] - -Linear. Exactly `distance(rng)` applications of `pred`, and at most `distance(rng) / 2` swaps. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/pop_heap.qbk b/libs/range/doc/reference/algorithm/pop_heap.qbk deleted file mode 100644 index 9008de4e4..000000000 --- a/libs/range/doc/reference/algorithm/pop_heap.qbk +++ /dev/null @@ -1,61 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:pop_heap pop_heap] - -[heading Prototype] - -`` -template -RandomAccessRange& pop_heap(RandomAccessRange& rng); - -template -const RandomAccessRange& pop_heap(const RandomAccessRange& rng); - -template -RandomAccessRange& pop_heap(RandomAccessRange& rng, Compare pred); - -template -const RandomAccessRange& pop_heap(const RandomAccessRange& rng, Compare pred); -`` - -[heading Description] - -`pop_heap` removes the largest element from the heap. It is assumed that `begin(rng), prior(end(rng))` is already a heap (and therefore the largest element is `*begin(rng)`). - -The ordering relationship is determined by using `operator<` in the non-predicate versions, and by evaluating `pred` in the predicate versions. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/heap_algorithm.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `RandomAccessRange`'s value type is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `RandomAccessRange`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - -[*For the predicate versions:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `Compare` is a model of the `StrictWeakOrderingConcept`. -* `RandomAccessRange`'s value type is convertible to both of `Compare`'s argument types. - -[heading Precondition:] - -* `!empty(rng)` -* `rng` is a heap. - -[heading Complexity] - -Logarithmic. At most `2 * log(distance(rng))` comparisons. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/prev_permutation.qbk b/libs/range/doc/reference/algorithm/prev_permutation.qbk deleted file mode 100644 index 6d204317b..000000000 --- a/libs/range/doc/reference/algorithm/prev_permutation.qbk +++ /dev/null @@ -1,56 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:prev_permutation prev_permutation] - -[heading Prototype] - -`` -template -bool prev_permutation(BidirectionalRange& rng); - -template -bool prev_permutation(const BidirectionalRange& rng); - -template -bool prev_permutation(BidirectionalRange& rng, Compare pred); - -template -bool prev_permutation(const BidirectionalRange& rng, Compare pred); -`` - -[heading Description] - -`prev_permutation` transforms the range of elements `rng` into the lexicographically next smaller permutation of the elements if such a permutation exists. If one does not exist then the range is transformed into the lexicographically largest permutation and `false` is returned. `true` is returned when the next smaller permutation is successfully generated. - -The ordering relationship is determined by using `operator<` in the non-predicate versions, and by evaluating `pred` in the predicate versions. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/permutation.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `BidirectionalRange` is a model of the __bidirectional_range__ Concept. -* `BidirectionalRange` is mutable. -* `BidirectionalRange`'s value type is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `BidirectionalRange`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - -[*For the predicate versions:] - -* `BidirectionalRange` is a model of the __bidirectional_range__ Concept. -* `BidirectionalRange` is mutable. -* `Compare` is a model of the `StrictWeakOrderingConcept`. -* `BidirectionalRange`'s value type is convertible to both of `Compare`'s argument types. - -[heading Complexity] - -Linear. At most `distance(rng) / 2` swaps. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/push_heap.qbk b/libs/range/doc/reference/algorithm/push_heap.qbk deleted file mode 100644 index 8aff8c2f7..000000000 --- a/libs/range/doc/reference/algorithm/push_heap.qbk +++ /dev/null @@ -1,61 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:push_heap push_heap] - -[heading Prototype] - -`` -template -RandomAccessRange& push_heap(RandomAccessRange& rng); - -template -const RandomAccessRange& push_heap(const RandomAccessRange& rng); - -template -RandomAccessRange& push_heap(RandomAccessRange& rng, Compare pred); - -template -const RandomAccessRange& push_heap(const RandomAccessRange& rng, Compare pred); -`` - -[heading Description] - -`push_heap` adds an element to a heap. It is assumed that `begin(rng)`, `prior(end(rng))` is already a heap and that the element to be added is `*prior(end(rng))`. - -The ordering relationship is determined by using `operator<` in the non-predicate versions, and by evaluating `pred` in the predicate versions. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/heap_algorithm.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `RandomAccessRange`'s value type is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `RandomAccessRange`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - -[*For the predicate versions:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `Compare` is a model of the `StrictWeakOrderingConcept`. -* `RandomAccessRange`'s value type is convertible to both of `Compare`'s argument types. - -[heading Precondition:] - -* `!empty(rng)` -* `[begin(rng), prior(end(rng)))` is a heap. - -[heading Complexity] - -Logarithmic. At most `log(distance(rng))` comparisons. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/random_shuffle.qbk b/libs/range/doc/reference/algorithm/random_shuffle.qbk deleted file mode 100644 index b092c3619..000000000 --- a/libs/range/doc/reference/algorithm/random_shuffle.qbk +++ /dev/null @@ -1,55 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:random_shuffle random_shuffle] - -[heading Prototype] - -`` -template -RandomAccessRange& random_shuffle(RandomAccessRange& rng); - -template -const RandomAccessRange& random_shuffle(const RandomAccessRange& rng); - -template -RandomAccessRange& random_shuffle(RandomAccessRange& rng, Generator& gen); - -template -const RandomAccessRange& random_shuffle(const RandomAccessRange& rng, Generator& gen); -`` - -[heading Description] - -`random_shuffle` randomly rearranges the elements in `rng`. The versions of `random_shuffle` that do not specify a `Generator` use an internal random number generator. The versions of `random_shuffle` that do specify a `Generator` use this instead. Returns the shuffles range. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/random_shuffle.hpp` - -[heading Requirements] - -[*For the version without a Generator:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. - -[*For the version with a Generator:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `Generator` is a model of the `RandomNumberGeneratorConcept`. -* `RandomAccessRange`'s distance type is convertible to `Generator`'s argument type. - -[heading Precondition:] - -* `distance(rng)` is less than `gen`'s maximum value. - - -[heading Complexity] - -Linear. If `!empty(rng)`, exactly `distance(rng) - 1` swaps are performed. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/remove.qbk b/libs/range/doc/reference/algorithm/remove.qbk deleted file mode 100644 index f26b277c8..000000000 --- a/libs/range/doc/reference/algorithm/remove.qbk +++ /dev/null @@ -1,60 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:remove remove] -[heading Prototype] - -`` -template< - class ForwardRange, - class Value - > -typename range_iterator::type -remove(ForwardRange& rng, const Value& val); - -template< - class ForwardRange, - class Value - > -typename range_iterator::type -remove(const ForwardRange& rng, const Value& val); - -template< - range_return_value re, - class ForwardRange, - class Value - > -typename range_return::type -remove(ForwardRange& rng, const Value& val); - -template< - range_return_value re, - class ForwardRange, - class Value - > -typename range_return::type -remove(const ForwardRange& rng, const Value& val); -`` - -[heading Description] - -`remove` removes from `rng` all of the elements `x` for which `x == val` is `true`. The versions of `remove` that return an iterator, return an iterator `new_last` such that the range `[begin(rng), new_last)` contains no elements equal to `val`. The `range_return` versions of `remove` defines `found` as the new last element. The iterators in the range `[new_last, end(rng))` are dereferenceable, but the elements are unspecified. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/remove.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `Value` is a model of the `EqualityComparableConcept`. -* Objects of type `Value` can be compared for equality with objects of `ForwardRange`'s value type. - -[heading Complexity] - -Linear. `remove` performs exactly `distance(rng)` comparisons for equality. - -[endsect] \ No newline at end of file diff --git a/libs/range/doc/reference/algorithm/remove_copy.qbk b/libs/range/doc/reference/algorithm/remove_copy.qbk deleted file mode 100644 index b98da4717..000000000 --- a/libs/range/doc/reference/algorithm/remove_copy.qbk +++ /dev/null @@ -1,39 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:remove_copy remove_copy] - -[heading Prototype] - -`` -template -OutputIterator -remove_copy(ForwardRange& rng, OutputIterator out, const Value& val); - -template -OutputIterator -remove_copy(const ForwardRange& rng, OutputIterator out, const Value& val); -`` - -[heading Description] - -`remove_copy` copied all of the elements `x` from `rng` for which `x == val` is `false`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/remove_copy.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `Value` is a model of the `EqualityComparableConcept`. -* Objects of type `Value` can be compared for equality with objects of `ForwardRange`'s value type. - -[heading Complexity] - -Linear. `remove_copy` performs exactly `distance(rng)` comparisons for equality. - -[endsect] diff --git a/libs/range/doc/reference/algorithm/remove_copy_if.qbk b/libs/range/doc/reference/algorithm/remove_copy_if.qbk deleted file mode 100644 index d56647bc3..000000000 --- a/libs/range/doc/reference/algorithm/remove_copy_if.qbk +++ /dev/null @@ -1,38 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:remove_copy_if remove_copy_if] - -[heading Prototype] - -`` -template -OutputIterator -remove_copy_if(ForwardRange& rng, OutputIterator out, UnaryPred pred); - -template -OutputIterator -remove_copy_if(const ForwardRange& rng, OutputIterator out, UnaryPred pred); -`` - -[heading Description] - -`remove_copy_if` copied all of the elements `x` from `rng` for which `pred(x)` is `false`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/remove_copy_if.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `UnaryPred` is a model of the `UnaryPredicateConcept`. - -[heading Complexity] - -Linear. `remove_copy_if` performs exactly `distance(rng)` comparisons with UnaryPred. - -[endsect] diff --git a/libs/range/doc/reference/algorithm/remove_if.qbk b/libs/range/doc/reference/algorithm/remove_if.qbk deleted file mode 100644 index 64b6ac3c4..000000000 --- a/libs/range/doc/reference/algorithm/remove_if.qbk +++ /dev/null @@ -1,63 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:remove_if remove_if] - -[heading Prototype] - -`` -template< - class ForwardRange, - class UnaryPredicate - > -typename range_iterator::type -remove(ForwardRange& rng, UnaryPredicate pred); - -template< - class ForwardRange, - class UnaryPredicate - > -typename range_iterator::type -remove(const ForwardRange& rng, UnaryPredicate pred); - -template< - range_return_value re, - class ForwardRange, - class UnaryPredicate - > -typename range_return::type -remove(ForwardRange& rng, UnaryPredicate pred); - -template< - range_return_value re, - class ForwardRange, - class UnaryPredicate - > -typename range_return::type -remove(const ForwardRange& rng, UnaryPredicate pred); -`` - -[heading Description] - -`remove_if` removes from `rng` all of the elements `x` for which `pred(x)` is `true`. The versions of `remove_if` that return an iterator, return an iterator `new_last` such that the range `[begin(rng), new_last)` contains no elements where `pred(x)` is `true`. The iterators in the range `[new_last, end(rng))` are dereferenceable, but the elements are unspecified. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/remove_if.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `UnaryPredicate` is a model of the `PredicateConcept`. -* `ForwardRange`'s value type is convertible to `UnaryPredicate`'s argument type. - -[heading Complexity] - -Linear. `remove_if` performs exactly `distance(rng)` applications of `pred`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/replace.qbk b/libs/range/doc/reference/algorithm/replace.qbk deleted file mode 100644 index 27b6c1b79..000000000 --- a/libs/range/doc/reference/algorithm/replace.qbk +++ /dev/null @@ -1,46 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:replace replace] - -[heading Prototype] - -`` -template< - class ForwardRange, - class Value - > -ForwardRange& replace(ForwardRange& rng, const Value& what, const Value& with_what); - -template< - class ForwardRange, - class UnaryPredicate - > -const ForwardRange& replace(const ForwardRange& rng, const Value& what, const Value& with_what); -`` - -[heading Description] - -`replace` every element in `rng` equal to `what` with `with_what`. Return a reference to `rng`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/replace.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `Value` is convertible to `ForwardRange`'s value type. -* `Value` is a model of the `AssignableConcept`. -* `Value` is a model of the `EqualityComparableConcept`, and may be compared for equality with objects of `ForwardRange`'s value type. - -[heading Complexity] - -Linear. `replace` performs exactly `distance(rng)` comparisons for equality and at most `distance(rng)` assignments. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/replace_copy.qbk b/libs/range/doc/reference/algorithm/replace_copy.qbk deleted file mode 100644 index e936fc035..000000000 --- a/libs/range/doc/reference/algorithm/replace_copy.qbk +++ /dev/null @@ -1,38 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:replace_copy replace_copy] - -[heading Prototype] - -`` -template -OutputIterator replace_copy(const ForwardRange& rng, OutputIterator out, - const Value& what, const Value& with_what); -`` - -[heading Description] - -`replace_copy` copy every element `x` in `rng` such that the corresponding element in the output range `y` is `x == what ? with_what : x`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/replace_copy.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `Value` is convertible to `ForwardRange`'s value type. -* `Value` is a model of the `AssignableConcept`. -* `OutputIterator` is a model of the `OutputIteratorConcept`. - -[heading Complexity] - -Linear. `replace_copy` performs exactly `distance(rng)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/replace_copy_if.qbk b/libs/range/doc/reference/algorithm/replace_copy_if.qbk deleted file mode 100644 index 13305a770..000000000 --- a/libs/range/doc/reference/algorithm/replace_copy_if.qbk +++ /dev/null @@ -1,39 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:replace_copy_if replace_copy_if] - -[heading Prototype] - -`` -template -OutputIterator replace_copy_if(const ForwardRange& rng, OutputIterator out, - UnaryPredicate pred, const Value& with_what); -`` - -[heading Description] - -`replace_copy_if` copy every element `x` in `rng` such that the corresponding element in the output range `y` is `pred(x) ? with_what : x`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/replace_copy_if.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `Value` is convertible to `ForwardRange`'s value type. -* `Value` is a model of the `AssignableConcept`. -* `OutputIterator` is a model of the `OutputIteratorConcept`. -* `UnaryPredicate` is a model of the `UnaryPredicateConcept`. - -[heading Complexity] - -Linear. `replace_copy_if` performs exactly `distance(rng)` evaluations of `pred`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/replace_if.qbk b/libs/range/doc/reference/algorithm/replace_if.qbk deleted file mode 100644 index 18480a97f..000000000 --- a/libs/range/doc/reference/algorithm/replace_if.qbk +++ /dev/null @@ -1,41 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:replace_if replace_if] - -[heading Prototype] - -`` -template -ForwardRange& replace_if(ForwardRange& rng, UnaryPredicate pred, const Value& with_what); - -template -const ForwardRange& replace_if(const ForwardRange& rng, UnaryPredicate pred, const Value& with_what); -`` - -[heading Description] - -`replace_if` replaces every element `x` in `rng` for which `pred(x) == true` with `with_what`. Returns a reference to `rng`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/replace_if.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `UnaryPredicate` is a model of the `PredicateConcept` -* `ForwardRange`'s value type is convertible to `UnaryPredicate`'s argument type. -* `Value` is convertible to `ForwardRange`'s value type. -* `Value` is a model of the `AssignableConcept`. - -[heading Complexity] - -Linear. `replace_if` performs exactly `distance(rng)` applications of `pred`, and at most `distance(rng)` assignments. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/reverse.qbk b/libs/range/doc/reference/algorithm/reverse.qbk deleted file mode 100644 index 6ecb31b59..000000000 --- a/libs/range/doc/reference/algorithm/reverse.qbk +++ /dev/null @@ -1,37 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:reverse reverse] - -[heading Prototype] - -`` -template -BidirectionalRange& reverse(BidirectionalRange& rng); - -template -const BidirectionalRange& reverse(const BidirectionalRange& rng); -`` - -[heading Description] - -`reverse` reverses a range. Returns a reference to the reversed range. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/reverse.hpp` - -[heading Requirements] - -* `BidirectionalRange` is a model of the __bidirectional_range__ Concept. -* `BidirectionalRange` is mutable. - -[heading Complexity] - -Linear. `reverse` makes `distance(rng)/2` calls to `iter_swap`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/reverse_copy.qbk b/libs/range/doc/reference/algorithm/reverse_copy.qbk deleted file mode 100644 index b19ed9fe0..000000000 --- a/libs/range/doc/reference/algorithm/reverse_copy.qbk +++ /dev/null @@ -1,36 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:reverse_copy reverse_copy] - -[heading Prototype] - -`` -template -OutputIterator reverse_copy(const BidirectionalRange& rng, OutputIterator out); -`` - -[heading Description] - -`reverse_copy` copies the elements from `rng` in reverse order to `out`. -Returns the output iterator one passed the last copied element. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/reverse_copy.hpp` - -[heading Requirements] - -* `BidirectionalRange` is a model of the __bidirectional_range__ Concept. -* `BidirectionalRange` is mutable. -* `OutputIterator` is a model of the `OutputIteratorConcept`. - -[heading Complexity] - -Linear. `reverse_copy` makes `distance(rng)` copies. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/rotate.qbk b/libs/range/doc/reference/algorithm/rotate.qbk deleted file mode 100644 index e28641b2a..000000000 --- a/libs/range/doc/reference/algorithm/rotate.qbk +++ /dev/null @@ -1,44 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:rotate rotate] - -[heading Prototype] - -`` -template -ForwardRange& rotate(ForwardRange& rng, - typename range_iterator::type middle); - -template -const ForwardRange& rotate(const ForwardRange& rng, - typename range_iterator::type middle); -`` - -[heading Description] - -`rotate` rotates the elements in a range. It exchanges the two ranges `[begin(rng), middle)` and `[middle, end(rng))`. Returns a reference to `rng`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/rotate.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. - -[heading Precondition:] - -* `[begin(rng), middle)` is a valid range. -* `[middle, end(rng))` is a valid range. - -[heading Complexity] - -Linear. At most `distance(rng)` swaps are performed. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/rotate_copy.qbk b/libs/range/doc/reference/algorithm/rotate_copy.qbk deleted file mode 100644 index 0f11bdc7d..000000000 --- a/libs/range/doc/reference/algorithm/rotate_copy.qbk +++ /dev/null @@ -1,43 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:rotate_copy rotate_copy] - -[heading Prototype] - -`` -template -OutputIterator rotate_copy( - const ForwardRange& rng, - typename range_iterator::type middle, - OutputIterator out); -`` - -[heading Description] - -`rotate_copy` rotates the elements in a range. It copies the two ranges `[begin(rng), middle)` and `[middle, end(rng))` to `out`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/rotate_copy.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `OutputIterator` is a model of the `OutputIteratorConcept`. - -[heading Precondition:] - -* `[begin(rng), middle)` is a valid range. -* `[middle, end(rng))` is a valid range. - -[heading Complexity] - -Linear. Exactly `distance(rng)` elements are copied. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/search.qbk b/libs/range/doc/reference/algorithm/search.qbk deleted file mode 100644 index 5c2c2a819..000000000 --- a/libs/range/doc/reference/algorithm/search.qbk +++ /dev/null @@ -1,106 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:search search] - -[heading Prototype] - -`` -template -typename range_iterator::type -search(ForwardRange1& rng1, const ForwardRange2& rng2); - -template -typename range_iterator::type -search(const ForwardRange1& rng1, const ForwardRange2& rng2); - -template< - class ForwardRange1, - class ForwardRange2, - class BinaryPredicate - > -typename range_iterator::type, -search(ForwardRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred); - -template< - class ForwardRange1, - class ForwardRange2, - class BinaryPredicate - > -typename range_iterator::type -search(const ForwardRange1& rng1, ForwardRange2& rng2, BinaryPredicate pred); - - -template< - range_return_value re, - class ForwardRange1, - class ForwardRange2 - > -typename range_return::type -search(ForwardRange1& rng1, const ForwardRange2& rng2); - -template< - range_return_value re, - class ForwardRange1, - class ForwardRange2 - > -typename range_return::type -search(const ForwardRange1& rng1, const ForwardRange2& rng2); - -template< - range_return_value re, - class ForwardRange1, - class ForwardRange2, - class BinaryPredicate - > -typename range_return::type, -search(ForwardRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred); - -template< - range_return_value re, - class ForwardRange1, - class ForwardRange2, - class BinaryPredicate - > -typename range_return::type -search(const ForwardRange1& rng1, const ForwardRange2& rng2, BinaryPredicate pred); -`` - -[heading Description] - -The versions of `search` that return an iterator, return an iterator to the start of the first subsequence in `rng1` that is equal to the subsequence `rng2`. The `end(rng1)` is returned if no such subsequence exists in `rng1`. -Equality is determined by `operator==` for non-predicate versions of `search`, and by satisfying `pred` in the predicate versions. - -The versions of `search` that return a `range_return`, defines `found` in the same manner as the returned iterator described above. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/search.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `ForwardRange1` is a model of the __forward_range__ Concept. -* `ForwardRange2` is a model of the __forward_range__ Concept. -* `ForwardRange1`'s value type is a model of the `EqualityComparableConcept`. -* `ForwardRange2`'s value type is a model of the `EqualityComparableConcept`. -* `ForwardRange1`s value type can be compared for equality with `ForwardRange2`'s value type. - -[*For the predicate versions:] - -* `ForwardRange1` is a model of the __forward_range__ Concept. -* `ForwardRange2` is a model of the __forward_range__ Concept. -* `BinaryPredicate` is a model of the `BinaryPredicateConcept`. -* `ForwardRange1`'s value type is convertible to `BinaryPredicate`'s first argument type. -* `ForwardRange2`'s value type is convertible to `BinaryPredicate`'s second argument type. - -[heading Complexity] - -Average complexity is Linear. Worst-case complexity is quadratic. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/search_n.qbk b/libs/range/doc/reference/algorithm/search_n.qbk deleted file mode 100644 index ad8cbd272..000000000 --- a/libs/range/doc/reference/algorithm/search_n.qbk +++ /dev/null @@ -1,63 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:search_n search_n] - -[heading Prototype] - -`` -template -typename range_iterator::type -search_n(ForwardRange& rng, Integer n, const Value& value); - -template -typename range_iterator::type -search_n(const ForwardRange& rng, Integer n, const Value& value); - -template -typename range_iterator::type -search_n(ForwardRange& rng, Integer n, const Value& value, - BinaryPredicate binary_pred); - -template -typename range_iterator::type -search_n(const ForwardRange& rng, Integer n, const Value& value, - BinaryPredicate binary_pred); -`` - -[heading Description] - -`search_n` searches `rng` for a sequence of length `n` equal to `value` where -equality is determined by operator== in the non-predicate case, and by a -predicate when one is supplied. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/search_n.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange`'s value type is a model of the `EqualityComparableConcept`. -* `ForwardRange`s value type can be compared for equality with `Value`. -* `Integer` is a model of the `IntegerConcept`. - -[*For the predicate versions:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `BinaryPredicate` is a model of the `BinaryPredicateConcept`. -* `ForwardRange`'s value type is convertible to `BinaryPredicate`'s first argument type. -* `Value` is convertible to `BinaryPredicate`'s second argument type. -* `Integer` is a model of the `IntegerConcept`. - -[heading Complexity] - -Average complexity is Linear. Worst-case complexity is quadratic. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/set_difference.qbk b/libs/range/doc/reference/algorithm/set_difference.qbk deleted file mode 100644 index 8ab5091aa..000000000 --- a/libs/range/doc/reference/algorithm/set_difference.qbk +++ /dev/null @@ -1,81 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:set_difference set_difference] - -[heading Prototype] - -`` -template< - class SinglePassRange1, - class SinglePassRange2, - class OutputIterator - > -OutputIterator set_difference(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - OutputIterator out); - -template< - class SinglePassRange1, - class SinglePassRange2, - class OutputIterator, - class BinaryPredicate - > -OutputIterator set_difference(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - OutputIterator out, - BinaryPredicate pred); -`` - -[heading Description] - -`set_difference` constructs a sorted range that is the set difference of the sorted ranges `rng1` and `rng2`. The return value is the end of the output range. - -The ordering relationship is determined by using `operator<` in the non-predicate versions, and by evaluating `pred` in the predicate versions. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/set_algorithm.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `OutputIterator` is a model of the `OutputIteratorConcept`. -* `SinglePassRange1` and `SinglePassRange2` have the same value type. -* `SinglePassRange1`'s value type is a model of the `LessThanComparableConcept`. -* `SinglePassRange2`'s value type is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `SinglePassRange1`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. -* The ordering of objects of type `SinglePassRange2`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - -[*For the predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `OutputIterator` is a model of the `OutputIteratorConcept`. -* `SinglePassRange1` and `SinglePassRange2` have the same value type. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `SinglePassRange1`'s value type is convertible to `BinaryPredicate`'s first argument type. -* `SinglePassRange2`'s value type is convertible to `BinaryPredicate`'s second argument types. - -[heading Precondition:] - -[*For the non-predicate versions:] - -`rng1` and `rng2` are sorted in ascending order according to `operator<`. - -[*For the predicate versions:] - -`rng1` and `rng2` are sorted in ascending order according to `pred`. - -[heading Complexity] - -Linear. `O(N)`, where `N` is `distance(rng1) + distance(rng2)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/set_intersection.qbk b/libs/range/doc/reference/algorithm/set_intersection.qbk deleted file mode 100644 index 3d46109e1..000000000 --- a/libs/range/doc/reference/algorithm/set_intersection.qbk +++ /dev/null @@ -1,81 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:set_intersection set_intersection] - -[heading Prototype] - -`` -template< - class SinglePassRange1, - class SinglePassRange2, - class OutputIterator - > -OutputIterator set_intersection(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - OutputIterator out); - -template< - class SinglePassRange1, - class SinglePassRange2, - class OutputIterator, - class BinaryPredicate - > -OutputIterator set_intersection(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - OutputIterator out, - BinaryPredicate pred); -`` - -[heading Description] - -`set_intersection` constructs a sorted range that is the intersection of the sorted ranges `rng1` and `rng2`. The return value is the end of the output range. - -The ordering relationship is determined by using `operator<` in the non-predicate versions, and by evaluating `pred` in the predicate versions. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/set_algorithm.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `OutputIterator` is a model of the `OutputIteratorConcept`. -* `SinglePassRange1` and `SinglePassRange2` have the same value type. -* `SinglePassRange1`'s value type is a model of the `LessThanComparableConcept`. -* `SinglePassRange2`'s value type is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `SinglePassRange1`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. -* The ordering of objects of type `SinglePassRange2`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - -[*For the predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `OutputIterator` is a model of the `OutputIteratorConcept`. -* `SinglePassRange1` and `SinglePassRange2` have the same value type. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `SinglePassRange1`'s value type is convertible to `BinaryPredicate`'s first argument type. -* `SinglePassRange2`'s value type is convertible to `BinaryPredicate`'s second argument types. - -[heading Precondition:] - -[*For the non-predicate versions:] - -`rng1` and `rng2` are sorted in ascending order according to `operator<`. - -[*For the predicate versions:] - -`rng1` and `rng2` are sorted in ascending order according to `pred`. - -[heading Complexity] - -Linear. `O(N)`, where `N` is `distance(rng1) + distance(rng2)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/set_symmetric_difference.qbk b/libs/range/doc/reference/algorithm/set_symmetric_difference.qbk deleted file mode 100644 index 9110cf07a..000000000 --- a/libs/range/doc/reference/algorithm/set_symmetric_difference.qbk +++ /dev/null @@ -1,83 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:set_symmetric_difference set_symmetric_difference] - -[heading Prototype] - -`` -template< - class SinglePassRange1, - class SinglePassRange2, - class OutputIterator - > -OutputIterator -set_symmetric_difference(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - OutputIterator out); - -template< - class SinglePassRange1, - class SinglePassRange2, - class OutputIterator, - class BinaryPredicate - > -OutputIterator -set_symmetric_difference(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - OutputIterator out, - BinaryPredicate pred); -`` - -[heading Description] - -`set_symmetric_difference` constructs a sorted range that is the set symmetric difference of the sorted ranges `rng1` and `rng2`. The return value is the end of the output range. - -The ordering relationship is determined by using `operator<` in the non-predicate versions, and by evaluating `pred` in the predicate versions. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/set_algorithm.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `OutputIterator` is a model of the `OutputIteratorConcept`. -* `SinglePassRange1` and `SinglePassRange2` have the same value type. -* `SinglePassRange1`'s value type is a model of the `LessThanComparableConcept`. -* `SinglePassRange2`'s value type is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `SinglePassRange1`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. -* The ordering of objects of type `SinglePassRange2`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - -[*For the predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `OutputIterator` is a model of the `OutputIteratorConcept`. -* `SinglePassRange1` and `SinglePassRange2` have the same value type. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `SinglePassRange1`'s value type is convertible to `BinaryPredicate`'s first argument type. -* `SinglePassRange2`'s value type is convertible to `BinaryPredicate`'s second argument types. - -[heading Precondition:] - -[*For the non-predicate versions:] - -`rng1` and `rng2` are sorted in ascending order according to `operator<`. - -[*For the predicate versions:] - -`rng1` and `rng2` are sorted in ascending order according to `pred`. - -[heading Complexity] - -Linear. `O(N)`, where `N` is `distance(rng1) + distance(rng2)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/set_union.qbk b/libs/range/doc/reference/algorithm/set_union.qbk deleted file mode 100644 index 679ec71cf..000000000 --- a/libs/range/doc/reference/algorithm/set_union.qbk +++ /dev/null @@ -1,80 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:set_union set_union] - -[heading Prototype] - -`` -template< - class SinglePassRange1, - class SinglePassRange2, - class OutputIterator - > -OutputIterator set_union(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - OutputIterator out); - -template< - class SinglePassRange1, - class SinglePassRange2, - class OutputIterator, - class BinaryPredicate - > -OutputIterator set_union(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - OutputIterator out, - BinaryPredicate pred); - `` - -[heading Description] - -`set_union` constructs a sorted range that is the union of the sorted ranges `rng1` and `rng2`. The return value is the end of the output range. -The ordering relationship is determined by using `operator<` in the non-predicate versions, and by evaluating `pred` in the predicate versions. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/set_algorithm.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `OutputIterator` is a model of the `OutputIteratorConcept`. -* `SinglePassRange1` and `SinglePassRange2` have the same value type. -* `SinglePassRange1`'s value type is a model of the `LessThanComparableConcept`. -* `SinglePassRange2`'s value type is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `SinglePassRange1`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. -* The ordering of objects of type `SinglePassRange2`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - -[*For the predicate versions:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `OutputIterator` is a model of the `OutputIteratorConcept`. -* `SinglePassRange1` and `SinglePassRange2` have the same value type. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `SinglePassRange1`'s value type is convertible to `BinaryPredicate`'s first argument type. -* `SinglePassRange2`'s value type is convertible to `BinaryPredicate`'s second argument types. - -[heading Precondition:] - -[*For the non-predicate versions:] - -`rng1` and `rng2` are sorted in ascending order according to `operator<`. - -[*For the predicate versions:] - -`rng1` and `rng2` are sorted in ascending order according to `pred`. - -[heading Complexity] - -Linear. `O(N)`, where `N` is `distance(rng1) + distance(rng2)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/sort.qbk b/libs/range/doc/reference/algorithm/sort.qbk deleted file mode 100644 index 3027c8913..000000000 --- a/libs/range/doc/reference/algorithm/sort.qbk +++ /dev/null @@ -1,58 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:sort sort] - -[heading Prototype] - -`` -template -RandomAccessRange& sort(RandomAccessRange& rng); - -template -const RandomAccessRange& sort(const RandomAccessRange& rng); - -template -RandomAccessRange& sort(RandomAccessRange& rng, BinaryPredicate pred); - -template -const RandomAccessRange& sort(const RandomAccessRange& rng, BinaryPredicate pred); -`` - -[heading Description] - -`sort` sorts the elements in `rng` into ascending order. `sort` is not guaranteed to be stable. Returns the sorted range. - -For versions of the `sort` function without a predicate, ascending order is defined by `operator<()` such that for all adjacent elements `[x,y]`, `y < x == false`. - -For versions of the `sort` function with a predicate, ascending order is defined by `pred` such that for all adjacent elements `[x,y]`, `pred(y, x) == false`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/sort.hpp` - -[heading Requirements] - -[*For versions of sort without a predicate:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `RandomAccessRange`'s value type is a model of the `LessThanComparableConcept`. -* The ordering relation on `RandomAccessRange`'s value type is a [*strict weak ordering], as defined in the `LessThanComparableConcept` requirements. - -[*For versions of sort with a predicate] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `RandomAccessRange`'s value type is convertible to both of `BinaryPredicate`'s argument types. - -[heading Complexity] - -`O(N log(N))` comparisons (both average and worst-case), where `N` is `distance(rng)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/sort_heap.qbk b/libs/range/doc/reference/algorithm/sort_heap.qbk deleted file mode 100644 index b065ce530..000000000 --- a/libs/range/doc/reference/algorithm/sort_heap.qbk +++ /dev/null @@ -1,60 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:sort_heap sort_heap] - -[heading Prototype] - -`` -template -RandomAccessRange& sort_heap(RandomAccessRange& rng); - -template -const RandomAccessRange& sort_heap(const RandomAccessRange& rng); - -template -RandomAccessRange& sort_heap(RandomAccessRange& rng, Compare pred); - -template -const RandomAccessRange& sort_heap(const RandomAccessRange& rng, Compare pred); -`` - -[heading Description] - -`sort_heap` turns a heap into a sorted range. - -The ordering relationship is determined by using `operator<` in the non-predicate versions, and by evaluating `pred` in the predicate versions. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/heap_algorithm.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `RandomAccessRange`'s value type is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `RandomAccessRange`'s value type is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. - -[*For the predicate versions:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `Compare` is a model of the `StrictWeakOrderingConcept`. -* `RandomAccessRange`'s value type is convertible to both of `Compare`'s argument types. - -[heading Precondition:] - -`rng` is a heap. - -[heading Complexity] - -At most `N * log(N)` comparisons, where `N` is `distance(rng)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/stable_partition.qbk b/libs/range/doc/reference/algorithm/stable_partition.qbk deleted file mode 100644 index a820bcdba..000000000 --- a/libs/range/doc/reference/algorithm/stable_partition.qbk +++ /dev/null @@ -1,61 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:stable_partition stable_partition] - -[heading Prototype] - -`` -template -typename range_iterator::type -stable_partition(ForwardRange& rng, UnaryPredicate pred); - -template -typename range_iterator::type -stable_partition(const ForwardRange& rng, UnaryPredicate pred); - -template< - range_return_value re, - class ForwardRange, - class UnaryPredicate -> -typename range_return::type -stable_partition(ForwardRange& rng, UnaryPredicate pred); - -template< - range_return_value re, - class ForwardRange, - class UnaryPredicate -> -typename range_return::type -stable_partition(const ForwardRange& rng, UnaryPredicate pred); -`` - -[heading Description] - -`stable_partition` reorders the elements in the range `rng` base on the function object `pred`. Once this function has completed all of the elements that satisfy `pred` appear before all of the elements that fail to satisfy it. `stable_partition` differs from `partition` because it preserves relative order. It is stable. - -For the versions that return an iterator, the return value is the iterator to the first element that fails to satisfy `pred`. - -For versions that return a `range_return`, the `found` iterator is the iterator to the first element that fails to satisfy `pred`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/stable_partition.hpp` - -[heading Requirements] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `UnaryPredicate` is a model of the `PredicateConcept`. - -[heading Complexity] - -Best case: `O(N)` where `N` is `distance(rng)`. -Worst case: `N * log(N)` swaps, where `N` is `distance(rng)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/stable_sort.qbk b/libs/range/doc/reference/algorithm/stable_sort.qbk deleted file mode 100644 index 502551f58..000000000 --- a/libs/range/doc/reference/algorithm/stable_sort.qbk +++ /dev/null @@ -1,59 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:stable_sort stable_sort] - -[heading Prototype] - -`` -template -RandomAccessRange& stable_sort(RandomAccessRange& rng); - -template -const RandomAccessRange& stable_sort(const RandomAccessRange& rng); - -template -RandomAccessRange& stable_sort(RandomAccessRange& rng, BinaryPredicate pred); - -template -const RandomAccessRange& stable_sort(const RandomAccessRange& rng, BinaryPredicate pred); -`` - -[heading Description] - -`stable_sort` sorts the elements in `rng` into ascending order. `stable_sort` is guaranteed to be stable. The order is preserved for equivalent elements. - -For versions of the `stable_sort` function without a predicate ascending order is defined by `operator<()` such that for all adjacent elements `[x,y]`, `y < x == false`. - -For versions of the `stable_sort` function with a predicate, ascending order is designed by `pred` such that for all adjacent elements `[x,y]`, `pred(y,x) == false`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/stable_sort.hpp` - -[heading Requirements] - -[*For versions of stable_sort without a predicate] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `RandomAccessRange`'s value type is a model of the `LessThanComparableConcept`. -* The ordering relation on `RandomAccessRange`'s value type is a [*strict weak ordering], as defined in the `LessThanComparableConcept` requirements. - -[*For versions of stable_sort with a predicate:] - -* `RandomAccessRange` is a model of the __random_access_range__ Concept. -* `RandomAccessRange` is mutable. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `RandomAccessRange`'s value type is convertible to both of `BinaryPredicate`'s argument types. - -[heading Complexity] - -Best case: `O(N)` where `N` is `distance(rng)`. -Worst case: `O(N log(N)^2)` comparisons, where `N` is `distance(rng)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/swap_ranges.qbk b/libs/range/doc/reference/algorithm/swap_ranges.qbk deleted file mode 100644 index 9dcb764c6..000000000 --- a/libs/range/doc/reference/algorithm/swap_ranges.qbk +++ /dev/null @@ -1,37 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:swap_ranges swap_ranges] - -[heading Prototype] - -`` -template -SinglePassRange2& swap_ranges(SinglePassRange1& rng1, SinglePassRange& rng2); -`` - -[heading Description] - -`swap_ranges` swaps each element `x` in `rng1` with the corresponding element `y` in `rng2`. -Returns a reference to `rng2`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/swap_ranges.hpp` - -[heading Requirements] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange1` is mutable. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is mutable. - -[heading Complexity] - -Linear. Exactly `distance(rng1)` elements are swapped. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/transform.qbk b/libs/range/doc/reference/algorithm/transform.qbk deleted file mode 100644 index d1e5ac44c..000000000 --- a/libs/range/doc/reference/algorithm/transform.qbk +++ /dev/null @@ -1,88 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:transform transform] - -[heading Prototype] - -`` -template< - class SinglePassRange1, - class OutputIterator, - class UnaryOperation -> -OutputIterator transform(const SinglePassRange1& rng, - OutputIterator out, - UnaryOperation fun); - -template< - class SinglePassRange1, - class SinglePassRange2, - class OutputIterator, - class BinaryOperation -> -OutputIterator transform(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - OutputIterator out, - BinaryOperation fun); -`` - -[heading Description] - -[*UnaryOperation version:] - -`transform` assigns the value `y` to each element `[out, out + distance(rng)), y = fun(x)` where `x` is the corresponding value to `y` in `rng1`. The return value is `out + distance(rng)`. - -[*BinaryOperation version:] - -`transform` assigns the value `z` to each element `[out, out + min(distance(rng1), distance(rng2))), z = fun(x,y)` where `x` is the corresponding value in `rng1` and `y` is the corresponding value in `rng2`. This version of `transform` stops upon reaching either the end of `rng1`, or the end of `rng2`. Hence there isn't a requirement for `distance(rng1) == distance(rng2)` since there is a safe guaranteed behaviour, unlike with the iterator counterpart in the standard library. - -The return value is `out + min(distance(rng1), distance(rng2))`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/transform.hpp` - -[heading Requirements] - -[*For the unary versions of transform:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `OutputIterator` is a model of the `OutputIteratorConcept`. -* `UnaryOperation` is a model of the `UnaryFunctionConcept`. -* `SinglePassRange1`'s value type must be convertible to `UnaryFunction`'s argument type. -* `UnaryFunction`'s result type must be convertible to a type in `OutputIterator`'s set of value types. - -[*For the binary versions of transform:] - -* `SinglePassRange1` is a model of the __single_pass_range__ Concept. -* `SinglePassRange2` is a model of the __single_pass_range__ Concept. -* `OutputIterator` is a model of the `OutputIteratorConcept`. -* `BinaryOperation` is a model of the `BinaryFunctionConcept`. -* `SinglePassRange1`'s value type must be convertible to `BinaryFunction`'s first argument type. -* `SinglePassRange2`'s value type must be convertible to `BinaryFunction`'s second argument type. -* `BinaryOperation`'s result type must be convertible to a type in `OutputIterator`'s set of value types. - -[heading Precondition:] - -[*For the unary version of transform:] - -* `out` is not an iterator within the range `[begin(rng1) + 1, end(rng1))`. -* `[out, out + distance(rng1))` is a valid range. - -[*For the binary version of transform:] - -* `out` is not an iterator within the range `[begin(rng1) + 1, end(rng1))`. -* `out` is not an iterator within the range `[begin(rng2) + 1, end(rng2))`. -* `[out, out + min(distance(rng1), distance(rng2)))` is a valid range. - - -[heading Complexity] - -Linear. The operation is applied exactly `distance(rng1)` for the unary version and `min(distance(rng1), distance(rng2))` for the binary version. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/unique.qbk b/libs/range/doc/reference/algorithm/unique.qbk deleted file mode 100644 index bc2cdcea7..000000000 --- a/libs/range/doc/reference/algorithm/unique.qbk +++ /dev/null @@ -1,77 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:unique unique] - -[heading Prototype] - -`` -template -typename range_return::type -unique(ForwardRange& rng); - -template -typename range_return::type -unique(const ForwardRange& rng); - -template -typename range_return::type -unique(ForwardRange& rng, BinaryPredicate pred); - -template -typename range_return::type -unique(const ForwardRange& rng, BinaryPredicate pred); - -template -typename range_return::type -unique(ForwardRange& rng); - -template -typename range_return::type -unique(const ForwardRange& rng); - -template -typename range_return::type -unique(ForwardRange& rng, BinaryPredicate pred); - -template -typename range_return::type -unique(const ForwardRange& rng, BinaryPredicate pred); -`` - -[heading Description] - -`unique` removes all but the first element of each sequence of duplicate encountered in `rng`. - -Elements in the range `[new_last, end(rng))` are dereferenceable but undefined. - -Equality is determined by the predicate if one is supplied, or by `operator==()` for `ForwardRange`'s value type. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/unique.hpp` - -[heading Requirements] - -[*For the non-predicate versions of unique:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `ForwardRange`'s value type is a model of the `EqualityComparableConcept`. - -[*For the predicate versions of unique:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `ForwardRange` is mutable. -* `BinaryPredicate` is a model of the `BinaryPredicateConcept`. -* `ForwardRange`'s value type is convertible to `BinaryPredicate`'s first argument type and to `BinaryPredicate`'s second argument type. - -[heading Complexity] - -Linear. `O(N)` where `N` is `distance(rng)`. Exactly `distance(rng)` comparisons are performed. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm/unique_copy.qbk b/libs/range/doc/reference/algorithm/unique_copy.qbk deleted file mode 100644 index f10a85fb1..000000000 --- a/libs/range/doc/reference/algorithm/unique_copy.qbk +++ /dev/null @@ -1,49 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:unique_copy unique_copy] - -[heading Prototype] - -`` -template -OutputIterator unique_copy(const SinglePassRange& rng, OutputIterator out); - -template -OutputIterator unique_copy(const SinglePassRange& rng, OutputIterator out, BinaryPredicate pred); -`` - -[heading Description] - -`unique_copy` copies the first element of each sequence of duplicates encountered in `rng` to `out`. - -Equality is determined by the predicate if one is supplied, or by `operator==()` for `SinglePassRange`'s value type. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/unique_copy.hpp` - -[heading Requirements] - -[*For the non-predicate versions of unique:] - -* `SinglePassRange` is a model of the __single_pass_range__ Concept. -* `SinglePassRange` is mutable. -* `SinglePassRange`'s value type is a model of the `EqualityComparableConcept`. -* `OutputIterator` is a model of the `OutputIteratorConcept`. - -[*For the predicate versions of unique:] - -* `SinglePassRange` is a model of the __single_pass_range__ Concept. -* `SinglePassRange` is mutable. -* `BinaryPredicate` is a model of the `BinaryPredicateConcept`. -* `SinglePassRange`'s value type is convertible to `BinaryPredicate`'s first argument type and to `BinaryPredicate`'s second argument type. -* `OutputIterator` is a model of the `OutputIteratorConcept`. - -[heading Complexity] - -Linear. `O(N)` where `N` is `distance(rng)`. Exactly `distance(rng)` comparisons are performed. - -[endsect] diff --git a/libs/range/doc/reference/algorithm/upper_bound.qbk b/libs/range/doc/reference/algorithm/upper_bound.qbk deleted file mode 100644 index d636a77b0..000000000 --- a/libs/range/doc/reference/algorithm/upper_bound.qbk +++ /dev/null @@ -1,90 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:upper_bound upper_bound] - -[heading Prototype] - -`` -template< - class ForwardRange, - class Value - > -typename range_iterator::type -upper_bound(ForwardRange& rng, Value val); - -template< - range_return_value re, - class ForwardRange, - class Value - > -typename range_return::type -upper_bound(ForwardRange& rng, Value val); - -template< - class ForwardRange, - class Value, - class SortPredicate - > -typename range_iterator::type -upper_bound(ForwardRange& rng, Value val, SortPredicate pred); - -template< - range_return_value re, - class ForwardRange, - class Value, - class SortPredicate - > -typename range_return::type -upper_bound(ForwardRange& rng, Value val, SortPredicate pred); -`` - -[heading Description] - -The versions of `upper_bound` that return an iterator, returns the first iterator in the range `rng` such that: -without predicate - `val < *i` is `true`, -with predicate - `pred(val, *i)` is `true`. - -`end(rng)` is returned if no such iterator exists. - -The versions of `upper_bound` that return a `range_return`, defines `found` in the same manner as the returned iterator described above. - -[heading Definition] - -Defined in the header file `boost/range/algorithm/upper_bound.hpp` - -[heading Requirements] - -[*For the non-predicate versions:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `Value` is a model of the `LessThanComparableConcept`. -* The ordering of objects of type `Value` is a [*/strict weak ordering/], as defined in the `LessThanComparableConcept` requirements. -* `ForwardRange`'s value type is the same type as `Value`. - -[*For the predicate versions:] - -* `ForwardRange` is a model of the __forward_range__ Concept. -* `BinaryPredicate` is a model of the `StrictWeakOrderingConcept`. -* `ForwardRange`'s value type is the same type as `Value`. -* `ForwardRange`'s value type is convertible to both of `BinaryPredicate`'s argument types. - -[heading Precondition:] - -[*For the non-predicate versions:] - -`rng` is sorted in ascending order according to `operator<`. - -[*For the predicate versions:] - -`rng` is sorted in ascending order according to `pred`. - -[heading Complexity] - -For ranges that model the __random_access_range__ Concept the complexity is `O(log N)`, where `N` is `distance(rng)`. For all other range types the complexity is `O(N)`. - -[endsect] - - diff --git a/libs/range/doc/reference/algorithm_ext/copy_n.qbk b/libs/range/doc/reference/algorithm_ext/copy_n.qbk deleted file mode 100644 index 6b34c7bf0..000000000 --- a/libs/range/doc/reference/algorithm_ext/copy_n.qbk +++ /dev/null @@ -1,37 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:copy_n copy_n] - -[heading Prototype] - -`` -template -OutputIterator copy_n(const SinglePassRange& rng, Size n, OutputIterator out); -`` - -[heading Description] - -`copy_n` is provided to completely replicate the standard algorithm header, -it is preferable to use Range Adaptors and the extension functions to achieve -the same result with greater safety. - -`copy_n` copies elements from `[boost::begin(rng), boost::begin(rng) + n)` to the range `[out, out + n)` - -[heading Definition] - -Defined in the header file `boost/range/algorithm_ext/copy_n.hpp` - -[heading Requirements] - -# `SinglePassRange` is a model of the __single_pass_range__ Concept. -# `Size` is a model of the `Integer` Concept. -# `OutputIterator` is a model of the `OutputIteratorConcept`. - -[heading Complexity] - -Linear. Exactly `n` elements are copied. - -[endsect] diff --git a/libs/range/doc/reference/algorithm_ext/erase.qbk b/libs/range/doc/reference/algorithm_ext/erase.qbk deleted file mode 100644 index 5b640a28f..000000000 --- a/libs/range/doc/reference/algorithm_ext/erase.qbk +++ /dev/null @@ -1,37 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:erase erase] - -[heading Prototype] - -`` -template -Container& erase( - Container& target, - iterator_range to_erase); -`` - -[heading Description] - -`erase` the iterator range `to_erase` from the container `target`. - -`remove_erase` performs the frequently used combination equivalent to `target.erase(std::remove(target.begin(), target.end(), value), target.end());` - -`remove_erase_if` performs the frequently used combination equivalent to `target.erase(std::remove_if(target.begin(), target.end(), pred), target.end());` - -[heading Definition] - -Defined in the header file `boost/range/algorithm_ext/erase.hpp` - -[heading Requirements] - -# `Container` supports erase of an iterator range. - -[heading Complexity] - -Linear. Proprotional to `distance(to_erase)`. - -[endsect] diff --git a/libs/range/doc/reference/algorithm_ext/for_each.qbk b/libs/range/doc/reference/algorithm_ext/for_each.qbk deleted file mode 100644 index fdfcb999f..000000000 --- a/libs/range/doc/reference/algorithm_ext/for_each.qbk +++ /dev/null @@ -1,73 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:for_each for_each] - -[heading Prototype] - -`` -template< - class SinglePassRange1, - class SinglePassRange2, - class BinaryFunction - > -BinaryFunction for_each(const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - BinaryFunction fn); - -template< - class SinglePassRange1, - class SinglePassRange2, - class BinaryFunction - > -BinaryFunction for_each(const SinglePassRange1& rng1, - SinglePassRange2& rng2, - BinaryFunction fn); - -template< - class SinglePassRange1, - class SinglePassRange2, - class BinaryFunction - > -BinaryFunction for_each(SinglePassRange1& rng1, - const SinglePassRange2& rng2, - BinaryFunction fn); - -template< - class SinglePassRange1, - class SinglePassRange2, - class BinaryFunction - > -BinaryFunction for_each(SinglePassRange1& rng1, - SinglePassRange2& rng2, - BinaryFunction fn); -`` - -[heading Description] - -`for_each` traverses forward through `rng1` and `rng2` simultaneously. -For each iteration, the element `x` is used from `rng1` and the corresponding -element `y` is used from `rng2` to invoke `fn(x,y)`. - -Iteration is stopped upon reaching the end of the shorter of `rng1`, or `rng2`. -It is safe to call this function with unequal length ranges. - -[heading Definition] - -Defined in the header file `boost/range/algorithm_ext/for_each.hpp` - -[heading Requirements] - -# `SinglePassRange1` is a model of the __single_pass_range__ Concept. -# `SinglePassRange2` is a model of the __single_pass_range__ Concept. -# `BinaryFunction` is a model of the `BinaryFunctionConcept`. -# `SinglePassRange1`'s value type is convertible to `BinaryFunction`'s first argument type. -# `SinglepassRange2`'s value type is convertible to `BinaryFunction`'s second argument type. - -[heading Complexity] - -Linear. Exactly `min(distance(rng1), distance(rng2))` applications of `BinaryFunction`. - -[endsect] diff --git a/libs/range/doc/reference/algorithm_ext/insert.qbk b/libs/range/doc/reference/algorithm_ext/insert.qbk deleted file mode 100644 index e9f48ebc0..000000000 --- a/libs/range/doc/reference/algorithm_ext/insert.qbk +++ /dev/null @@ -1,46 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:insert insert] - -[heading Prototype] - -`` -template< - class Container, - class SinglePassRange -> -Container& insert(Container& target, - typename Container::iterator before, - const SinglePassRange& from); - -// This overload is for target containers that do not require an insertion -// position e.g. set/map -template< - class Container, - class SinglePassRange -> -Container& insert(Container& target, const SinglePassRange& from); -`` - -[heading Description] - -`insert` all of the elements in the range `from` before the `before` iterator into `target`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm_ext/insert.hpp` - -[heading Requirements] - -# `SinglePassRange` is a model of the __single_pass_range__ Concept. -# `Container` supports insert at a specified position. -# `SinglePassRange`'s value type is convertible to `Container`'s value type. - -[heading Complexity] - -Linear. `distance(from)` assignments are performed. - -[endsect] diff --git a/libs/range/doc/reference/algorithm_ext/iota.qbk b/libs/range/doc/reference/algorithm_ext/iota.qbk deleted file mode 100644 index 0a5f79963..000000000 --- a/libs/range/doc/reference/algorithm_ext/iota.qbk +++ /dev/null @@ -1,33 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:iota iota] - -[heading Prototype] - -`` -template -ForwardRange& iota(ForwardRange& rng, Value x); -`` - -[heading Description] - -`iota` traverses forward through `rng`, each element `y` in `rng` is assigned a value equivalent -to `x + boost::distance(boost::begin(rng), it)` - -[heading Definition] - -Defined in the header file `boost/range/algorithm_ext/iota.hpp` - -[heading Requirements] - -# `ForwardRange` is a model of the __forward_range__ Concept. -# `Value` is a model of the `Incrementable` Concept. - -[heading Complexity] - -Linear. Exactly `distance(rng)` assignments into `rng`. - -[endsect] diff --git a/libs/range/doc/reference/algorithm_ext/is_sorted.qbk b/libs/range/doc/reference/algorithm_ext/is_sorted.qbk deleted file mode 100644 index f9c07b4f7..000000000 --- a/libs/range/doc/reference/algorithm_ext/is_sorted.qbk +++ /dev/null @@ -1,40 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:is_sorted is_sorted] - -[heading Prototype] - -`` -template -bool is_sorted(const SinglePassRange& rng); - -template -bool is_sorted(const SinglePassRange& rng, BinaryPredicate pred); -`` - -[heading Description] - -`is_sorted` determines if a range is sorted. -For the non-predicate version the return value is `true` if and only if for -each adjacent elements `[x,y]` the expression `x < y` is `true`. -For the predicate version the return value is `true` is and only if for each -adjacent elements `[x,y]` the expression `pred(x,y)` is `true`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm_ext/is_sorted.hpp` - -[heading Requirements] - -# `SinglePassRange` is a model of the __single_pass_range__ Concept. -# `BinaryPredicate` is a model of the `BinaryPredicate` Concept. -# The value type of `SinglePassRange` is convertible to both argument types of `BinaryPredicate`. - -[heading Complexity] - -Linear. A maximum of `distance(rng)` comparisons are performed. - -[endsect] diff --git a/libs/range/doc/reference/algorithm_ext/overwrite.qbk b/libs/range/doc/reference/algorithm_ext/overwrite.qbk deleted file mode 100644 index a265833c5..000000000 --- a/libs/range/doc/reference/algorithm_ext/overwrite.qbk +++ /dev/null @@ -1,39 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:overwrite overwrite] - -[heading Prototype] - -`` -template< - class SinglePassRange1, - class SinglePassRange2 - > -void overwrite(const SinglePassRange1& from, - SinglePassRange2& to); -`` - -[heading Description] - -`overwrite` assigns the values from the range `from` into the range `to`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm_ext/overwrite.hpp` - -[heading Requirements] - -# `SinglePassRange1` is a model of the __single_pass_range__ Concept. -# `SinglePassRange2` is a model of the __single_pass_range__ Concept. -# `SinglePassRange2` is mutable. -# `distance(SinglePassRange1) <= distance(SinglePassRange2)` -# `SinglePassRange1`'s value type is convertible to `SinglePassRange2`'s value type. - -[heading Complexity] - -Linear. `distance(rng1)` assignments are performed. - -[endsect] diff --git a/libs/range/doc/reference/algorithm_ext/push_back.qbk b/libs/range/doc/reference/algorithm_ext/push_back.qbk deleted file mode 100644 index ec46d0b69..000000000 --- a/libs/range/doc/reference/algorithm_ext/push_back.qbk +++ /dev/null @@ -1,37 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:push_back push_back] - -[heading Prototype] - -`` -template< - class Container, - class SinglePassRange - > -Container& push_back(Container& target, - const SinglePassRange& from); -`` - -[heading Description] - -`push_back` all of the elements in the range `from` to the back of the container `target`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm_ext/push_back.hpp` - -[heading Requirements] - -# `SinglePassRange` is a model of the __single_pass_range__ Concept. -# `Container` supports insert at `end()`. -# `SinglePassRange`'s value type is convertible to `Container`'s value type. - -[heading Complexity] - -Linear. `distance(from)` assignments are performed. - -[endsect] diff --git a/libs/range/doc/reference/algorithm_ext/push_front.qbk b/libs/range/doc/reference/algorithm_ext/push_front.qbk deleted file mode 100644 index d9ca4fe2e..000000000 --- a/libs/range/doc/reference/algorithm_ext/push_front.qbk +++ /dev/null @@ -1,37 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:push_front push_front] - -[heading Prototype] - -`` -template< - class Container, - class SinglePassRange - > -Container& push_front(Container& target, - const SinglePassRange& from); -`` - -[heading Description] - -`push_front` all of the elements in the range `from` to the front of the container `target`. - -[heading Definition] - -Defined in the header file `boost/range/algorithm_ext/push_front.hpp` - -[heading Requirements] - -# `SinglePassRange` is a model of the __single_pass_range__ Concept. -# `Container` supports insert at `begin()`. -# `SinglePassRange`'s value type is convertible to `Container`'s value type. - -[heading Complexity] - -Linear. `distance(from)` assignments are performed. - -[endsect] diff --git a/libs/range/doc/reference/algorithm_ext/remove_erase.qbk b/libs/range/doc/reference/algorithm_ext/remove_erase.qbk deleted file mode 100644 index eecc97b64..000000000 --- a/libs/range/doc/reference/algorithm_ext/remove_erase.qbk +++ /dev/null @@ -1,33 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:remove_erase remove_erase] - -[heading Prototype] - -`` -template -Container& remove_erase(Container& target, - const Value& value); -`` - -[heading Description] - -`remove_erase` actually eliminates the elements equal to `value` from the container. This -is in contrast to the `remove` algorithm which merely rearranges elements. - -[heading Definition] - -Defined in the header file `boost/range/algorithm_ext/erase.hpp` - -[heading Requirements] - -# `Container` supports erase of an iterator range. - -[heading Complexity] - -Linear. Proportional to `distance(target)`s. - -[endsect] diff --git a/libs/range/doc/reference/algorithm_ext/remove_erase_if.qbk b/libs/range/doc/reference/algorithm_ext/remove_erase_if.qbk deleted file mode 100644 index 5eab44669..000000000 --- a/libs/range/doc/reference/algorithm_ext/remove_erase_if.qbk +++ /dev/null @@ -1,34 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:remove_erase_if remove_erase_if] - -[heading Prototype] - -`` -template -Container& remove_erase_if(Container& target, - Pred pred); -`` - -[heading Description] - -`remove_erase_if` removes the elements `x` that satisfy `pred(x)` from the container. -This is in contrast to the `erase` algorithm which merely rearranges elements. - -[heading Definition] - -Defined in the header file `boost/range/algorithm_ext/erase.hpp` - -[heading Requirements] - -# `Container` supports erase of an iterator range. -# `Pred` is a model of the `Predicate` Concept. - -[heading Complexity] - -Linear. Proportional to `distance(target)`s. - -[endsect] diff --git a/libs/range/doc/reference/algorithms.qbk b/libs/range/doc/reference/algorithms.qbk deleted file mode 100644 index 8dcd84896..000000000 --- a/libs/range/doc/reference/algorithms.qbk +++ /dev/null @@ -1,182 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:algorithms Range Algorithms] -[section:introduction Introduction and motivation] -In its most simple form a [*Range Algorithm] (or range-based algorithm) is simply an iterator-based algorithm where the /two/ iterator arguments have been replaced by /one/ range argument. For example, we may write - -`` -#include -#include - -std::vector vec = ...; -boost::sort(vec); -`` - -instead of - -`` -std::sort(vec.begin(), vec.end()); -`` - -However, the return type of range algorithms is almost always different from that of existing iterator-based algorithms. - -One group of algorithms, like `boost::sort()`, will simply return the same range so that we can continue to pass the range around and/or further modify it. Because of this we may write -`` -boost:unique(boost::sort(vec)); -`` -to first sort the range and then run `unique()` on the sorted range. - -Algorithms like `boost::unique()` fall into another group of algorithms that return (potentially) narrowed views of the original range. By default `boost::unique(rng)` returns the range `[boost::begin(rng), found)` where `found` denotes the iterator returned by `std::unique(boost::begin(rng), boost::end(rng))` - -Therefore exactly the unique values can be copied by writing -`` -boost::copy(boost::unique(boost::sort(vec)), - std::ostream_iterator(std::cout)); -`` - -Algorithms like `boost::unique` usually return the range: `[boost::begin(rng), found)`. -However, this behaviour may be changed by supplying a `range_return_value` -as a template parameter to the algorithm: - -[table - [[Expression] [Return]] - [[`boost::unique(rng)`] [returns a single iterator like `std::unique`]] - [[`boost::unique(rng)`] [returns the range `[boost::begin(rng), found)` (this is the default)]] - [[`boost::unique(rng)`] [returns the range `[boost::begin(rng), boost::next(found))`]] - [[`boost::unique(rng)`] [returns the range `[found, boost::end(rng))`]] - [[`boost::unique(rng)`] [returns the range `[boost::next(found),boost::end(rng))`]] - [[`boost::unique(rng)`] [returns the entire original range.]] -] - -This functionality has the following advantages: - -# it allows for ['*seamless functional-style programming*] where you do not need to use named local variables to store intermediate results -# it is very ['*safe*] because the algorithm can verify out-of-bounds conditions and handle tricky conditions that lead to empty ranges - -For example, consider how easy we may erase the duplicates in a sorted container: - -`` -std::vector vec = ...; -boost::erase(vec, boost::unique(boost::sort(vec))); -`` - -Notice the use of `boost::return_found_end`. What if we wanted to erase all the duplicates except one of them? In old-fashioned STL-programming we might write - -`` -// assume 'vec' is already sorted -std::vector::iterator i = std::unique(vec.begin(), vec.end()); - -// remember this check or you get into problems -if (i != vec.end()) - ++i; - -vec.erase(i, vec.end()); -`` - -The same task may be accomplished simply with -`` -boost::erase(vec, boost::unique(vec)); -`` -and there is no need to worry about generating an invalid range. Furthermore, if the container is complex, calling `vec.end()` several times will be more expensive than using a range algorithm. - -[endsect] - -[section:mutating Mutating algorithms] -[include algorithm/copy.qbk] -[include algorithm/copy_backward.qbk] -[include algorithm/fill.qbk] -[include algorithm/fill_n.qbk] -[include algorithm/generate.qbk] -[include algorithm/inplace_merge.qbk] -[include algorithm/merge.qbk] -[include algorithm/nth_element.qbk] -[include algorithm/partial_sort.qbk] -[include algorithm/partition.qbk] -[include algorithm/random_shuffle.qbk] -[include algorithm/remove.qbk] -[include algorithm/remove_copy.qbk] -[include algorithm/remove_copy_if.qbk] -[include algorithm/remove_if.qbk] -[include algorithm/replace.qbk] -[include algorithm/replace_copy.qbk] -[include algorithm/replace_copy_if.qbk] -[include algorithm/replace_if.qbk] -[include algorithm/reverse.qbk] -[include algorithm/reverse_copy.qbk] -[include algorithm/rotate.qbk] -[include algorithm/rotate_copy.qbk] -[include algorithm/sort.qbk] -[include algorithm/stable_partition.qbk] -[include algorithm/stable_sort.qbk] -[include algorithm/swap_ranges.qbk] -[include algorithm/transform.qbk] -[include algorithm/unique.qbk] -[include algorithm/unique_copy.qbk] -[endsect] - -[section:non_mutating Non-mutating algorithms] -[include algorithm/adjacent_find.qbk] -[include algorithm/binary_search.qbk] -[include algorithm/count.qbk] -[include algorithm/count_if.qbk] -[include algorithm/equal.qbk] -[include algorithm/equal_range.qbk] -[include algorithm/for_each.qbk] -[include algorithm/find.qbk] -[include algorithm/find_end.qbk] -[include algorithm/find_first_of.qbk] -[include algorithm/find_if.qbk] -[include algorithm/lexicographical_compare.qbk] -[include algorithm/lower_bound.qbk] -[include algorithm/max_element.qbk] -[include algorithm/min_element.qbk] -[include algorithm/mismatch.qbk] -[include algorithm/search.qbk] -[include algorithm/search_n.qbk] -[include algorithm/upper_bound.qbk] -[endsect] - -[section:set Set algorithms] -[include algorithm/includes.qbk] -[include algorithm/set_union.qbk] -[include algorithm/set_intersection.qbk] -[include algorithm/set_difference.qbk] -[include algorithm/set_symmetric_difference.qbk] -[endsect] - -[section:heap Heap algorithms] -[include algorithm/push_heap.qbk] -[include algorithm/pop_heap.qbk] -[include algorithm/make_heap.qbk] -[include algorithm/sort_heap.qbk] -[endsect] - -[section:permutation Permutation algorithms] -[include algorithm/next_permutation.qbk] -[include algorithm/prev_permutation.qbk] -[endsect] - -[section:new New algorithms] -[include algorithm_ext/copy_n.qbk] -[include algorithm_ext/erase.qbk] -[include algorithm_ext/for_each.qbk] -[include algorithm_ext/insert.qbk] -[include algorithm_ext/iota.qbk] -[include algorithm_ext/is_sorted.qbk] -[include algorithm_ext/overwrite.qbk] -[include algorithm_ext/push_back.qbk] -[include algorithm_ext/push_front.qbk] -[include algorithm_ext/remove_erase.qbk] -[include algorithm_ext/remove_erase_if.qbk] -[endsect] - -[section:numeric Numeric algorithms] -[include numeric/accumulate.qbk] -[include numeric/adjacent_difference.qbk] -[include numeric/inner_product.qbk] -[include numeric/partial_sum.qbk] -[endsect] -[endsect] diff --git a/libs/range/doc/reference/extending.qbk b/libs/range/doc/reference/extending.qbk deleted file mode 100644 index 46652d606..000000000 --- a/libs/range/doc/reference/extending.qbk +++ /dev/null @@ -1,328 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:extending Extending the library] - -[section:method_1 Method 1: provide member functions and nested types] - -This procedure assumes that you have control over the types that should be made conformant to a Range concept. If not, see [link range.reference.extending.method_2 method 2]. - -The primary templates in this library are implemented such that standard containers will work automatically and so will __boost_array__. Below is given an overview of which member functions and member types a class must specify to be useable as a certain Range concept. - -[table - [[Member function] [Related concept ]] - [[`begin()` ] [__single_pass_range__]] - [[`end()` ] [__single_pass_range__]] -] - -Notice that `rbegin()` and `rend()` member functions are not needed even though the container can support bidirectional iteration. - -The required member types are: - -[table - [[Member type ] [Related concept ]] - [[`iterator` ] [__single_pass_range__]] - [[`const_iterator`] [__single_pass_range__]] -] - -Again one should notice that member types `reverse_iterator` and `const_reverse_iterator` are not needed. - -[endsect] - -[section:method_2 Method 2: provide free-standing functions and specialize metafunctions] - -This procedure assumes that you cannot (or do not wish to) change the types that should be made conformant to a Range concept. If this is not true, see [link range.reference.extending.method_1 method 1]. - -The primary templates in this library are implemented such that certain functions are found via argument-dependent-lookup (ADL). Below is given an overview of which free-standing functions a class must specify to be useable as a certain Range concept. Let `x` be a variable (`const` or `mutable`) of the class in question. - -[table - [[Function ] [Related concept ]] - [[`range_begin(x)`] [__single_pass_range__]] - [[`range_end(x)` ] [__single_pass_range__]] - [[`range_calculate_size(x)`] [ Optional. This can be used to specify a mechanism for constant-time computation of the size of a range. The default behaviour is to return `boost::end(x) - boost::begin(x)` for random access ranges, and to return `x.size()` for ranges with lesser traversal capability. This behaviour can be changed by implementing `range_calculate_size` in a manner that will be found via ADL. The ability to calculate size in O(1) is often possible even with ranges with traversal categories less than random access.]] -] - -`range_begin()` and `range_end()` must be overloaded for both `const` and `mutable` reference arguments. - -You must also specialize two metafunctions for your type `X`: - -[table - [[Metafunction ] [Related concept ]] - [[`boost::range_mutable_iterator`] [__single_pass_range__]] - [[`boost::range_const_iterator`] [__single_pass_range__]] -] - -A complete example is given here: - -`` - #include - #include // for std::iterator_traits, std::distance() - - namespace Foo - { - // - // Our sample UDT. A 'Pair' - // will work as a range when the stored - // elements are iterators. - // - template< class T > - struct Pair - { - T first, last; - }; - - } // namespace 'Foo' - - namespace boost - { - // - // Specialize metafunctions. We must include the range.hpp header. - // We must open the 'boost' namespace. - // - - template< class T > - struct range_mutable_iterator< Foo::Pair > - { - typedef T type; - }; - - template< class T > - struct range_const_iterator< Foo::Pair > - { - // - // Remark: this is defined similar to 'range_iterator' - // because the 'Pair' type does not distinguish - // between an iterator and a const_iterator. - // - typedef T type; - }; - - } // namespace 'boost' - - namespace Foo - { - // - // The required functions. These should be defined in - // the same namespace as 'Pair', in this case - // in namespace 'Foo'. - // - - template< class T > - inline T range_begin( Pair& x ) - { - return x.first; - } - - template< class T > - inline T range_begin( const Pair& x ) - { - return x.first; - } - - template< class T > - inline T range_end( Pair& x ) - { - return x.last; - } - - template< class T > - inline T range_end( const Pair& x ) - { - return x.last; - } - - } // namespace 'Foo' - - #include - - int main(int argc, const char* argv[]) - { - typedef std::vector::iterator iter; - std::vector vec; - Foo::Pair pair = { vec.begin(), vec.end() }; - const Foo::Pair& cpair = pair; - // - // Notice that we call 'begin' etc with qualification. - // - iter i = boost::begin( pair ); - iter e = boost::end( pair ); - i = boost::begin( cpair ); - e = boost::end( cpair ); - boost::range_difference< Foo::Pair >::type s = boost::size( pair ); - s = boost::size( cpair ); - boost::range_reverse_iterator< const Foo::Pair >::type - ri = boost::rbegin( cpair ), - re = boost::rend( cpair ); - - return 0; - } -`` - -[endsect] - -[section:method_3 Method 3: provide range adaptor implementations] - -[section:method_3_1 Method 3.1: Implement a Range Adaptor without arguments] - -To implement a Range Adaptor without arguments (e.g. reversed) you need to: - -# Provide a range for your return type, for example: -`` -#include -#include - -template< typename R > -struct reverse_range : - boost::iterator_range< - boost::reverse_iterator< - typename boost::range_iterator::type> > -{ -private: - typedef boost::iterator_range< - boost::reverse_iterator< - typename boost::range_iterator::type> > base; - -public: - typedef boost::reverse_iterator< - typename boost::range_iterator::type > iterator; - - reverse_range(R& r) - : base(iterator(boost::end(r)), iterator(boost::begin(r))) - { } -}; -`` - -# Provide a tag to uniquely identify your adaptor in the `operator|` function overload set -`` -namespace detail { - struct reverse_forwarder {}; -} -`` - -# Implement `operator|` -`` -template< class BidirectionalRng > -inline reverse_range -operator|( BidirectionalRng& r, detail::reverse_forwarder ) -{ - return reverse_range( r ); -} - -template< class BidirectionalRng > -inline reverse_range -operator|( const BidirectionalRng& r, detail::reverse_forwarder ) -{ - return reverse_range( r ); -} -`` - -# Declare the adaptor itself (it is a variable of the tag type). -`` -namespace -{ - const detail::reverse_forwarder reversed = detail::reverse_forwarder(); -} -`` - -[endsect] - -[section:method_3_2 Method 3.2: Implement a Range Adaptor with arguments] - -# Provide a range for your return type, for example: -`` -#include -#include -#include - -template -class replace_value -{ -public: - typedef const Value& result_type; - typedef const Value& argument_type; - - replace_value(const Value& from, const Value& to) - : m_from(from), m_to(to) - { - } - - const Value& operator()(const Value& x) const - { - return (x == m_from) ? m_to : x; - } -private: - Value m_from; - Value m_to; -}; - -template -class replace_range -: public boost::iterator_range< - boost::transform_iterator< - replace_value::type>, - typename boost::range_iterator::type> > -{ -private: - typedef typename boost::range_value::type value_type; - typedef typename boost::range_iterator::type iterator_base; - typedef replace_value Fn; - typedef boost::transform_iterator replaced_iterator; - typedef boost::iterator_range base_t; - -public: - replace_range(Range& rng, value_type from, value_type to) - : base_t(replaced_iterator(boost::begin(rng), Fn(from,to)), - replaced_iterator(boost::end(rng), Fn(from,to))) - { - } - }; -`` - -# Implement a holder class to hold the arguments required to construct the RangeAdaptor. -The holder combines multiple parameters into one that can be passed as the right operand of `operator|()`. -`` -template -class replace_holder : public boost::range_detail::holder2 -{ -public: - replace_holder(const T& from, const T& to) - : boost::range_detail::holder2(from, to) - { } -private: - void operator=(const replace_holder&); -}; -`` - -# Define an instance of the holder with the name of the adaptor -`` -static boost::range_detail::forwarder2 -replaced = boost::range_detail::forwarder2(); -`` - -# Define `operator|` -`` -template -inline replace_range -operator|(SinglePassRange& rng, - const replace_holder::type>& f) -{ - return replace_range(rng, f.val1, f.val2); -} - -template -inline replace_range -operator|(const SinglePassRange& rng, - const replace_holder::type>& f) -{ - return replace_range(rng, f.val1, f.val2); -} -`` - -[endsect] - -[endsect] - -[endsect] - diff --git a/libs/range/doc/reference/numeric/accumulate.qbk b/libs/range/doc/reference/numeric/accumulate.qbk deleted file mode 100644 index e151e631b..000000000 --- a/libs/range/doc/reference/numeric/accumulate.qbk +++ /dev/null @@ -1,61 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:accumulate accumulate] - -[heading Prototype] - -`` -template< - class SinglePassRange, - class Value - > -Value accumulate(const SinglePassRange& source_rng, - Value init); - -template< - class SinglePassRange, - class Value, - class BinaryOperation - > -Value accumulate(const SinglePassRange& source_rng, - Value init, - BinaryOperation op); -`` - -[heading Description] - -`accumulate` is a generalisation of summation. It computes a binary operation (`operator+` -in the non-predicate version) of `init` and all of the elements in `rng`. - -The return value is the resultant value of the above algorithm. - -[heading Definition] - -Defined in the header file `boost/range/numeric.hpp` - -[heading Requirements] - -[heading For the first version] - -# `SinglePassRange` is a model of the __single_pass_range__ Concept. -# `Value` is a model of the `AssignableConcept`. -# An `operator+` is defined for a left-hand operand of type `Value` and a right-hand operand of the `SinglePassRange` value type. -# The return type of the above operator is convertible to `Value`. - -[heading For the second version] - -# `SinglePassRange` is a model of the __single_pass_range__ Concept. -# `Value` is a model of the `AssignableConcept`. -# `BinaryOperation` is a model of the `BinaryFunctionConcept`. -# `Value` is convertible to `BinaryOperation`'s first argument type. -# `SinglePassRange`'s value type is convertible to `BinaryOperation`'s second argument type. -# The return type of `BinaryOperation` is convertible to `Value`. - -[heading Complexity] - -Linear. Exactly `distance(source_rng)`. - -[endsect] diff --git a/libs/range/doc/reference/numeric/adjacent_difference.qbk b/libs/range/doc/reference/numeric/adjacent_difference.qbk deleted file mode 100644 index 7580036a9..000000000 --- a/libs/range/doc/reference/numeric/adjacent_difference.qbk +++ /dev/null @@ -1,68 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:adjacent_difference adjacent_difference] - -[heading Prototype] - -`` -template< - class SinglePassRange, - class OutputIterator - > -OutputIterator adjacent_difference( - const SinglePassRange& source_rng, - OutputIterator out_it); - -template< - class SinglePassRange, - class OutputIterator, - class BinaryOperation - > -OutputIterator adjacent_difference( - const SinglePassRange& source_rng, - OutputIterator out_it, - BinaryOperation op); -`` - -[heading Description] - -`adjacent_difference` calculates the differences of adjacent_elements in `rng`. - -The first version of `adjacent_difference` uses `operator-()` to calculate the differences. -The second version uses `BinaryOperation` instead of `operator-()`. - -[heading Definition] - -Defined in the header file `boost/range/numeric.hpp` - -[heading Requirements] - -[heading For the first version] - -# `SinglePassRange` is a model of the __single_pass_range__ Concept. -# `OutputIterator` is a model of the `OutputIteratorConcept`. -# If `x` and `y` are objects of `SinglePassRange`'s value type, then `x - y` is defined. -# The value type of `SinglePassRange` is convertible to a type in `OutputIterator`'s set of value types. -# The return type of `x - y` is convertible to a type in `OutputIterator`'s set of value types. - -[heading For the second version] - -# `SinglePassRange` is a model of the __single_pass_range__ Concept. -# `OutputIterator` is a model of the `OutputIteratorConcept`. -# `BinaryOperation` is a model of the `BinaryFunctionConcept`. -# The value type of `SinglePassRange` is convertible to `BinaryOperation`'s first and second argument types. -# The value type of `SinglePassRange` is convertible to a type in `OutputIterator`'s set of value types. -# The result type of `BinaryOperation` is convertible to a type in `OutputIterator`'s set of value types. - -[heading Precondition:] - -`[result, result + distance(rng))` is a valid range. - -[heading Complexity] - -Linear. If `empty(rng)` then zero applications, otherwise `distance(rng) - 1` applications are performed. - -[endsect] diff --git a/libs/range/doc/reference/numeric/inner_product.qbk b/libs/range/doc/reference/numeric/inner_product.qbk deleted file mode 100644 index bb4fc3c70..000000000 --- a/libs/range/doc/reference/numeric/inner_product.qbk +++ /dev/null @@ -1,73 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:inner_product inner_product] - -[heading Prototype] - -`` -template - Value inner_product( const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - Value init ); - -template - Value inner_product( const SinglePassRange1& rng1, - const SinglePassRange2& rng2, - Value init, - BinaryOperation1 op1, - BinaryOperation2 op2 ); -`` - -[heading Description] - -`inner_product` calculates a generalised inner product of the range `rng1` and `rng2`. - -For further information on the `inner_product` algorithm please see __sgi_inner_product__. - -[heading Definition] - -Defined in the header file `boost/range/numeric.hpp` - -[heading Requirements] - -[heading For the first version] - -# `SinglePassRange1` is a model of the __single_pass_range__ Concept. -# `SinglePassRange2` is a model of the __single_pass_range__ Concept. -# `Value` is a model of the `AssignableConcept`. -# If `x` is an object of type `Value`, `y` is an object of `SinglePassRange1`'s value -type, and `z` is an object of `SinglePassRange2`'s value type, then `x + y * z` -is defined. -# The result type of the expression `x + y * z` is convertible to `Value`. - -[heading For the second version] - -# `SinglePassRange1` is a model of the __single_pass_range__ Concept. -# `SinglePassRange2` is a model of the __single_pass_range__ Concept. -# `Value` is a model of the `AssignableConcept`. -# `BinaryOperation1` is a model of the `BinaryFunctionConcept`. -# `BinaryOperation2` is a model of the `BinaryFunctionConcept`. -# The value type of `SinglePassRange1` is convertible to the first argument type of `BinaryOperation2`. -# The value type of `SinglePassRange2` is convertible to the second argument type of `BinaryOperation2`. -# `Value` is convertible to the value type of `BinaryOperation1`. -# The return type of `BinaryOperation2` is convertible to the second argument type of `BinaryOperation1`. -# The return type of `BinaryOperation1` is convertible to `Value`. - -[heading Precondition:] - -`distance(rng2) >= distance(rng1)` is a valid range. - -[heading Complexity] - -Linear. Exactly `distance(rng)`. - -[endsect] diff --git a/libs/range/doc/reference/numeric/partial_sum.qbk b/libs/range/doc/reference/numeric/partial_sum.qbk deleted file mode 100644 index f52e4657d..000000000 --- a/libs/range/doc/reference/numeric/partial_sum.qbk +++ /dev/null @@ -1,60 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:partial_sum partial_sum] - -[heading Prototype] - -`` -template -OutputIterator partial_sum(const SinglePassRange& rng, - OutputIterator out_it); - -template -OutputIterator partial_sum(const SinglePassRange& rng, - OutputIterator out_it, - BinaryOperation op); -`` - -[heading Description] - -`partial_sum` calculates a generalised partial sum of `rng` in the same manner as -`std::partial_sum(boost::begin(rng), boost::end(rng), out_it)`. See __sgi_partial_sum__. - - -[heading Definition] - -Defined in the header file `boost/range/numeric.hpp` - -[heading Requirements] - -[heading For the first version] - -# `SinglePassRange` is a model of the __single_pass_range__ Concept. -# `OutputIterator` is a model of the `OutputIteratorConcept`. -# If `x` and `y` are objects of `SinglePassRange`'s value type, then `x + y` is defined. -# The return type of `x + y` is convertible to the value type of `SinglePassRange`. -# The value type of `SinglePassRange` is convertible to a type in `OutputIterator`'s set of value types. - -[heading For the second version] - -# `SinglePassRange` is a model of the __single_pass_range__ Concept. -# `OutputIterator` is a model of the `OutputIteratorConcept`. -# `BinaryOperation` is a model of the `BinaryFunctionConcept`. -# The result type of `BinaryOperation` is convertible to the value type of `SinglePassRange`. -# The value type of `SinglePassRange` is convertible to a type in `OutputIterator`'s set of value types. - -[heading Precondition:] - -`[result, result + distance(rng))` is a valid range. - -[heading Complexity] - -Linear. If `empty(rng)` then zero applications, otherwise `distance(rng) - 1` applications are performed. - -[endsect] diff --git a/libs/range/doc/reference/overview.qbk b/libs/range/doc/reference/overview.qbk deleted file mode 100644 index af7ef2cab..000000000 --- a/libs/range/doc/reference/overview.qbk +++ /dev/null @@ -1,19 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:overview Overview] - -Three types of objects are currently supported by the library: - -* standard-like containers -* `std::pair` -* built-in arrays - -Even though the behavior of the primary templates are exactly such that standard containers will be supported by default, the requirements are much lower than the standard container requirements. For example, the utility class __iterator_range__ implements the __minimal_interface__ required to make the class a __forward_range__. - -Please also see __range_concepts__ for more details. - -[endsect] - diff --git a/libs/range/doc/reference/ranges.qbk b/libs/range/doc/reference/ranges.qbk deleted file mode 100644 index 5b853d545..000000000 --- a/libs/range/doc/reference/ranges.qbk +++ /dev/null @@ -1,14 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:ranges Provided Ranges] - -[include ranges/any_range.qbk] -[include ranges/counting_range.qbk] -[include ranges/istream_range.qbk] -[include ranges/irange.qbk] - -[endsect] - diff --git a/libs/range/doc/reference/ranges/any_range.qbk b/libs/range/doc/reference/ranges/any_range.qbk deleted file mode 100644 index 1888ed86d..000000000 --- a/libs/range/doc/reference/ranges/any_range.qbk +++ /dev/null @@ -1,115 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:any_range any_range] - -[heading Description] - -`any_range` is a range that has the type information erased hence a `any_range` -can be used to represent a `std::vector`, a `std::list` or many other types. - -The __type_erasure_article__ covers the motivation and goals of type erasure in this context. Clearly -my implementation is building upon a lot of prior art created by others. Thomas Becker's `any_iterator` was a strong -influence. Adobe also have an `any_iterator` implementation, but this has very tight coupling to other parts of the -library that precluded it from use in Boost.Range. -Early development versions of this Range Adaptor directly used Thomas Becker's any_iterator implementation. -Subsequently I discovered that the heap allocations of this and many other implementations cause poor -speed performance particularly at the tails of the distribution. To solve this required a new design that -incorporated the embedded buffer optimization. - -Despite the underlying `any_iterator` being the fastest available implementation, the performance overhead of `any_range` is still appreciable due to the cost of virtual function calls required to implement `increment`, `decrement`, `advance`, `equal` etc. Frequently a better design choice is to convert to a canonical form. - -Please see the __range_adaptors_type_erased__ for a Range Adaptor that returns `any_range` instances. - -[heading Synopsis] - -`` -template< - class Value - , class Traversal - , class Reference - , class Difference - , class Buffer = any_iterator_default_buffer -> -class any_range - : public iterator_range< - range_detail::any_iterator< - Value - , Traversal - , Reference - , Difference - , Buffer - > - > -{ - typedef range_detail::any_iterator< - Value - , Traversal - , Reference - , Difference - , Buffer - > any_iterator_type; - - typedef iterator_range base_type; - - struct enabler {}; - struct disabler {}; -public: - typedef any_iterator_type iterator; - typedef any_iterator_type const_iterator; - - any_range() - { - } - - any_range(const any_range& other) - : base_type(other) - { - } - - template - any_range(WrappedRange& wrapped_range) - : base_type(boost::begin(wrapped_range), - boost::end(wrapped_range)) - { - } - - template - any_range(const WrappedRange& wrapped_range) - : base_type(boost::begin(wrapped_range), - boost::end(wrapped_range)) - { - } - - template< - class OtherValue - , class OtherTraversal - , class OtherReference - , class OtherDifference - > - any_range(const any_range< - OtherValue - , OtherTraversal - , OtherReference - , OtherDifference - , Buffer - >& other) - : base_type(boost::begin(other), boost::end(other)) - { - } - - template - any_range(Iterator first, Iterator last) - : base_type(first, last) - { - } -}; -`` - -[heading Definition] - -Defined in header file `boost/range/any_range.hpp` - -[endsect] diff --git a/libs/range/doc/reference/ranges/counting_range.qbk b/libs/range/doc/reference/ranges/counting_range.qbk deleted file mode 100644 index 31037a95e..000000000 --- a/libs/range/doc/reference/ranges/counting_range.qbk +++ /dev/null @@ -1,36 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:counting_range counting_range] - -[heading Prototype] - -`` -template< class Incrementable > inline -iterator_range< counting_iterator > -counting_range(Incrementable first, Incrementable last); - -template< class SinglePassRange > inline -iterator_range< counting_iterator::type > -counting_range(const SinglePassRange& rng); - -template< class SinglePassRange > inline -iterator_range< counting_iterator::type > -counting_range(SinglePassRange& rng); -`` - -[heading Description] - -`counting_range` is a function to generator that generates an `iterator_range` wrapping a `counting_iterator` (from Boost.Iterator). - -[heading Definition] - -Defined in header file `boost/range/counting_range.hpp` - -[heading Requirements] - -# `Incrementable` is a model of the `Incrementable` Concept. - -[endsect] diff --git a/libs/range/doc/reference/ranges/irange.qbk b/libs/range/doc/reference/ranges/irange.qbk deleted file mode 100644 index 6e59cb1b9..000000000 --- a/libs/range/doc/reference/ranges/irange.qbk +++ /dev/null @@ -1,40 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:irange irange] - -[heading Prototype] - -`` -template -iterator_range< range_detail::integer_iterator > -irange(Integer first, Integer last); - -template -iterator_range< range_detail::integer_iterator_with_step > -irange(Integer first, Integer last, StepSize step_size); -`` - -[heading Description] - -`irange` is a function to generate an Integer Range. - -`irange` allows treating integers as a model of the __random_access_range__ Concept. It should be noted that the `first` and `last` parameters denoted a half-open range. - -[heading Definition] - -Defined in the header file `boost/range/irange.hpp` - -[heading Requirements] - -# `Integer` is a model of the `Integer` Concept. -# `StepSize` is a model of the `SignedInteger` Concept. - -[heading Complexity] - -Constant. Since this function generates a new range the most significant performance cost is incurred through the iteration of the generated range. - -[endsect] - diff --git a/libs/range/doc/reference/ranges/istream_range.qbk b/libs/range/doc/reference/ranges/istream_range.qbk deleted file mode 100644 index 66a1e8448..000000000 --- a/libs/range/doc/reference/ranges/istream_range.qbk +++ /dev/null @@ -1,24 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:istream_range istream_range] - -[heading Prototype] - -`` -template< class Type, class Elem, class Traits > inline -iterator_range< std::istream_iterator > -istream_range(std::basic_istream& in); -`` - -[heading Description] - -`istream_range` is a function to generator that generates an `iterator_range` wrapping a `std::istream_iterator`. - -[heading Definition] - -Defined in header file `boost/range/istream_range.hpp` - -[endsect] diff --git a/libs/range/doc/reference/semantics.qbk b/libs/range/doc/reference/semantics.qbk deleted file mode 100644 index c7cf8f4a8..000000000 --- a/libs/range/doc/reference/semantics.qbk +++ /dev/null @@ -1,200 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:semantics Semantics] - -[heading notation] - -[table - [[Type ] [Object] [Describes ]] - [[`X` ] [`x` ] [any type ]] - [[`T` ] [`t` ] [denotes behavior of the primary templates]] - [[`P` ] [`p` ] [denotes `std::pair` ]] - [[`A[sz]`] [`a` ] [denotes an array of type `A` of size `sz`]] - [[`Char*`] [`s` ] [denotes either `char*` or `wchar_t*` ]] -] - -[section Metafunctions] - -[table - [[Expression] [Return type] [Complexity]] - [ - [`range_iterator::type`] - [`` - T::iterator - P::first_type - A* - ``] - [compile time] - ] - [ - [`range_iterator::type`] - [`` - T::const_iterator - P::first_type - const A* - ``] - [compile time] - ] - [ - [`range_value::type`] - [`boost::iterator_value::type>::type`] - [compile time] - ] - [ - [`range_reference::type`] - [`boost::iterator_reference::type>::type`] - [compile time] - ] - [ - [`range_pointer::type`] - [`boost::iterator_pointer::type>::type`] - [compile time] - ] - [ - [`range_category::type`] - [`boost::iterator_category::type>::type`] - [compile time] - ] - [ - [`range_difference::type`] - [`boost::iterator_difference::type>::type`] - [compile time] - ] - [ - [`range_reverse_iterator::type`] - [`boost::reverse_iterator::type>`] - [compile time] - ] - [ - [`range_reverse_iterator::type`] - [`boost::reverse_iterator::type`] - [compile time] - ] - [ - [`has_range_iterator::type`] - [`mpl::true_` if `range_mutable_iterator::type` is a valid expression, `mpl::false_` otherwise] - [compile time] - ] - [ - [`has_range_const_iterator::type`] - [`mpl::true_` if `range_const_iterator::type` is a valid expression, `mpl::false_` otherwise] - [compile time] - ] -] - -[endsect] - -[section Functions] - -[table - [[Expression] [Return type] [Returns] [Complexity]] - - [ - [`begin(x)`] - [`range_iterator::type`] - [ - `p.first` if `p` is of type `std::pair` - `a` if `a` is an array - `range_begin(x)` if that expression would invoke a function found by ADL - `t.begin()` otherwise - ] - [constant time] - ] - [ - [`end(x)`] - [`range_iterator::type`] - [ - `p.second` if `p` is of type `std::pair` - `a + sz` if `a` is an array of size `sz` - `range_end(x)` if that expression would invoke a function found by ADL - `t.end()` otherwise - ] - [constant time] - ] - [ - [`empty(x)`] - [`bool`] - [`boost::begin(x) == boost::end(x)`] - [constant time] - ] - [ - [`distance(x)`] - [`range_difference::type`] - [`std::distance(boost::begin(x),boost::end(x))`] - [-] - ] - [ - [`size(x)`] - [`range_size::type`] - [`range_calculate_size(x)` which by default is `boost::end(x) - boost::begin(x)`. Users may supply alternative implementations by implementing `range_calculate_size(x)` so that it will be found via ADL] - [constant time] - ] - [ - [`rbegin(x)`] - [`range_reverse_iterator::type`] - [`range_reverse_iterator::type(boost::end(x))`] - [constant time] - ] - [ - [`rend(x)`] - [`range_reverse_iterator::type`] - [`range_reverse_iterator::type(boost::begin(x))`] - [constant time] - ] - [ - [`const_begin(x)`] - [`range_iterator::type`] - [`range_iterator::type(boost::begin(x))`] - [constant time] - ] - [ - [`const_end(x)`] - [`range_iterator::type`] - [`range_iterator::type(boost::end(x))`] - [constant time] - ] - [ - [`const_rbegin(x)`] - [`range_reverse_iterator::type`] - [`range_reverse_iterator::type(boost::rbegin(x))`] - [constant time] - ] - [ - [`const_rend(x)`] - [`range_reverse_iterator::type`] - [`range_reverse_iterator::type(boost::rend(x))`] - [constant time] - ] - [ - [`as_literal(x)`] - [`iterator_range` where `U` is `Char*` if `x` is a pointer to a string and `U` is `range_iterator::type` otherwise] - [ - `[s,s + std::char_traits::length(s))` if `s` is a `Char*` or an array of `Char` `[boost::begin(x),boost::end(x))` otherwise - ] - [ - linear time for pointers to a string or arrays of `Char`, constant time otherwise - ] - ] - [ - [`as_array(x)`] - [`iterator_range`] - [`[boost::begin(x),boost::end(x))`] - ] -] - -The special `const_`-named functions are useful when you want to document clearly that your code is read-only. - -`as_literal()` can be used ['*internally*] in string algorithm libraries such that arrays of characters are handled correctly. - -`as_array()` can be used with string algorithm libraries to make it clear that arrays of characters are handled like an array and not like a string. - -Notice that the above functions should always be called with qualification (`boost::`) to prevent ['*unintended*] Argument Dependent Lookup (ADL). - -[endsect] - -[endsect] - - diff --git a/libs/range/doc/reference/synopsis.qbk b/libs/range/doc/reference/synopsis.qbk deleted file mode 100644 index 26f964119..000000000 --- a/libs/range/doc/reference/synopsis.qbk +++ /dev/null @@ -1,144 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:synopsis Synopsis] - -`` -namespace boost -{ - // - // Single Pass Range metafunctions - // - - template< class T, class Enabler=void > - struct range_iterator; - - template< class T > - struct range_value; - - template< class T > - struct range_reference; - - template< class T > - struct range_pointer; - - template< class T > - struct range_category; - - // - // Forward Range metafunctions - // - - template< class T > - struct range_difference; - - // - // Bidirectional Range metafunctions - // - - template< class T > - struct range_reverse_iterator; - - // - // Single Pass Range functions - // - - template< class T > - typename range_iterator::type - begin( T& r ); - - template< class T > - typename range_iterator::type - begin( const T& r ); - - template< class T > - typename range_iterator::type - end( T& r ); - - template< class T > - typename range_iterator::type - end( const T& r ); - - template< class T > - bool - empty( const T& r ); - - // - // Forward Range functions - // - - template< class T > - typename range_difference::type - distance( const T& r ); - - template< class T > - typename range_size::type - size( const T& r ); - - // - // Bidirectional Range functions - // - - template< class T > - typename range_reverse_iterator::type - rbegin( T& r ); - - template< class T > - typename range_reverse_iterator::type - rbegin( const T& r ); - - template< class T > - typename range_reverse_iterator::type - rend( T& r ); - - template< class T > - typename range_reverse_iterator::type - rend( const T& r ); - - // - // Special const Range functions - // - - template< class T > - typename range_iterator::type - const_begin( const T& r ); - - template< class T > - typename range_iterator::type - const_end( const T& r ); - - template< class T > - typename range_reverse_iterator::type - const_rbegin( const T& r ); - - template< class T > - typename range_reverse_iterator::type - const_rend( const T& r ); - - // - // String utilities - // - - template< class T > - iterator_range< ... see below ... > - as_literal( T& r ); - - template< class T > - iterator_range< ... see below ... > - as_literal( const T& r ); - - template< class T > - iterator_range< typename range_iterator::type > - as_array( T& r ); - - template< class T > - iterator_range< typename range_iterator::type > - as_array( const T& r ); - -} // namespace 'boost' -`` - -[endsect] - diff --git a/libs/range/doc/reference/utilities.qbk b/libs/range/doc/reference/utilities.qbk deleted file mode 100644 index 8cbc34a38..000000000 --- a/libs/range/doc/reference/utilities.qbk +++ /dev/null @@ -1,417 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:utilities Utilities] - -Having an abstraction that encapsulates a pair of iterators is very useful. The standard library uses `std::pair` in some circumstances, but that class is cumbersome to use because we need to specify two template arguments, and for all range algorithm purposes we must enforce the two template arguments to be the same. Moreover, `std::pair` is hardly self-documenting whereas more domain specific class names are. Therefore these two classes are provided: - -* Class `iterator_range` -* Class `sub_range` -* Function `combine` -* Function `join` - -The `iterator_range` class is templated on an __forward_traversal_iterator__ and should be used whenever fairly general code is needed. The `sub_range` class is templated on an __forward_range__ and it is less general, but a bit easier to use since its template argument is easier to specify. The biggest difference is, however, that a `sub_range` can propagate constness because it knows what a corresponding `const_iterator` is. - -Both classes can be used as ranges since they implement the __minimal_interface__ required for this to work automatically. - -[section:iterator_range Class `iterator_range`] - -The intention of the `iterator_range` class is to encapsulate two iterators so they fulfill the __forward_range__ concept. A few other functions are also provided for convenience. - -If the template argument is not a model of __forward_traversal_iterator__, one can still use a subset of the interface. In particular, `size()` requires Random Access Traversal Iterators whereas `empty()` only requires Single Pass Iterators. - -Recall that many default constructed iterators are [*/singular/] and hence can only be assigned, but not compared or incremented or anything. However, if one creates a default constructed `iterator_range`, then one can still call all its member functions. This design decision avoids the `iterator_range` imposing limitations upon ranges of iterators that are not singular. Any singularity limitation is simply propagated from the underlying iterator type. - - -[h4 Synopsis] - -The core functionality is in the header file -`` this includes all of the functionality -except the `boost::hash_value` and `std::iostream` support. - -The `std::iostream` support is in the header `` -while the `boost::hash_value` support is in -`` - -`` -namespace boost -{ - template< class ForwardTraversalIterator > - class iterator_range - { - public: // Forward Range types - typedef ForwardTraversalIterator iterator; - typedef ForwardTraversalIterator const_iterator; - typedef iterator_difference::type difference_type; - - public: // construction, assignment - template< class ForwardTraversalIterator2 > - iterator_range( ForwardTraversalIterator2 Begin, ForwardTraversalIterator2 End ); - - template< class ForwardRange > - iterator_range( ForwardRange& r ); - - template< class ForwardRange > - iterator_range( const ForwardRange& r ); - - template< class ForwardRange > - iterator_range& operator=( ForwardRange& r ); - - template< class ForwardRange > - iterator_range& operator=( const ForwardRange& r ); - - public: // Forward Range functions - iterator begin() const; - iterator end() const; - - public: // convenience - operator unspecified_bool_type() const; - bool equal( const iterator_range& ) const; - value_type& front() const; - void drop_front(); - void drop_front(difference_type n); - bool empty() const; - - iterator_range& advance_begin(difference_type n); - iterator_range& advance_end(difference_type n); - - // for Bidirectional: - value_type& back() const; - void drop_back(); - void drop_back(difference_type n); - // for Random Access only: - reference operator[]( difference_type at ) const; - value_type operator()( difference_type at ) const; - size_type size() const; - }; - - // stream output - template< class ForwardTraversalIterator, class T, class Traits > - std::basic_ostream& - operator<<( std::basic_ostream& Os, - const iterator_range& r ); - - // comparison - template< class ForwardTraversalIterator, class ForwardTraversalIterator2 > - bool operator==( const iterator_range& l, - const iterator_range& r ); - - template< class ForwardTraversalIterator, class ForwardRange > - bool operator==( const iterator_range& l, - const ForwardRange& r ); - - template< class ForwardTraversalIterator, class ForwardRange > - bool operator==( const ForwardRange& l, - const iterator_range& r ); - - template< class ForwardTraversalIterator, class ForwardTraversalIterator2 > - bool operator!=( const iterator_range& l, - const iterator_range& r ); - - template< class ForwardTraversalIterator, class ForwardRange > - bool operator!=( const iterator_range& l, - const ForwardRange& r ); - - template< class ForwardTraversalIterator, class ForwardRange > - bool operator!=( const ForwardRange& l, - const iterator_range& r ); - - template< class ForwardTraversalIterator, class ForwardTraversalIterator2 > - bool operator<( const iterator_range& l, - const iterator_range& r ); - - template< class ForwardTraversalIterator, class ForwardRange > - bool operator<( const iterator_range& l, - const ForwardRange& r ); - - template< class ForwardTraversalIterator, class ForwardRange > - bool operator<( const ForwardRange& l, - const iterator_range& r ); - - // external construction - template< class ForwardTraversalIterator > - iterator_range< ForwardTraversalIterator > - make_iterator_range( ForwardTraversalIterator Begin, - ForwardTraversalIterator End ); - - // Make an iterator_range [first, boost::next(first, n) ) - template< class ForwardTraversalIterator, class Integer > - iterator_range< ForwardTraversalIterator > - make_iterator_range_n( ForwardTraversalIterator first, Integer n ); - - - template< class ForwardRange > - iterator_range< typename range_iterator::type > - make_iterator_range( ForwardRange& r ); - - template< class ForwardRange > - iterator_range< typename range_iterator::type > - make_iterator_range( const ForwardRange& r ); - - template< class Range > - iterator_range< typename range_iterator::type > - make_iterator_range( Range& r, - typename range_difference::type advance_begin, - typename range_difference::type advance_end ); - - template< class Range > - iterator_range< typename range_iterator::type > - make_iterator_range( const Range& r, - typename range_difference::type advance_begin, - typename range_difference::type advance_end ); - - // convenience - template< class Sequence, class ForwardRange > - Sequence copy_range( const ForwardRange& r ); - -} // namespace 'boost' -`` - -If an instance of `iterator_range` is constructed by a client with two iterators, the client must ensure that the two iterators delimit a valid closed-open range [begin,end). - -It is worth noticing that the templated constructors and assignment operators allow conversion from `iterator_range` to `iterator_range`. Similarly, since the comparison operators have two template arguments, we can compare ranges whenever the iterators are comparable; for example when we are dealing with const and non-const iterators from the same container. - -[h4 Details member functions] - -`operator unspecified_bool_type() const;` - -[:['[*Returns]] `!empty();`] - -`bool equal( iterator_range& r ) const;` - -[:['[*Returns]] `begin() == r.begin() && end() == r.end();`] - -[h4 Details functions] - -`bool operator==( const ForwardRange1& l, const ForwardRange2& r );` - -[:['[*Returns]] `size(l) != size(r) ? false : std::equal( begin(l), end(l), begin(r) );`] - -`bool operator!=( const ForwardRange1& l, const ForwardRange2& r );` - -[:['[*Returns]] `!( l == r );`] - -`bool operator<( const ForwardRange1& l, const ForwardRange2& r );` - -[:['[*Returns]] `std::lexicographical_compare( begin(l), end(l), begin(r), end(r) );`] - -`` -iterator_range make_iterator_range( Range& r, - typename range_difference::type advance_begin, - typename range_difference::type advance_end ); -`` - -[:['[*Effects:]]] - -`` - iterator new_begin = begin( r ), - iterator new_end = end( r ); - std::advance( new_begin, advance_begin ); - std::advance( new_end, advance_end ); - return make_iterator_range( new_begin, new_end ); -`` - -`Sequence copy_range( const ForwardRange& r );` - -[:['[*Returns]] `Sequence( begin(r), end(r) );`] - -[endsect] - -[section:sub_range Class `sub_range`] - -The `sub_range` class inherits all its functionality from the __iterator_range__ class. The `sub_range` class is often easier to use because one must specify the __forward_range__ template argument instead of an iterator. Moreover, the `sub_range` class can propagate constness since it knows what a corresponding `const_iterator` is. - -[h4 Synopsis] - -`` -namespace boost -{ - template< class ForwardRange > - class sub_range : public iterator_range< typename range_iterator::type > - { - public: - typedef typename range_value::type value_type; - typedef typename range_iterator::type iterator; - typedef typename range_iterator::type const_iterator; - typedef typename range_difference::type difference_type; - typedef typename range_size::type size_type; - typedef typename range_reference::type reference; - typedef typename range_reference::type const_reference; - - public: // construction, assignment - sub_range(); - - template< class ForwardTraversalIterator > - sub_range( ForwardTraversalIterator Begin, ForwardTraversalIterator End ); - - template< class ForwardRange2 > - sub_range( ForwardRange2& r ); - - template< class ForwardRange2 > - sub_range( const Range2& r ); - - template< class ForwardRange2 > - sub_range& operator=( ForwardRange2& r ); - - template< class ForwardRange2 > - sub_range& operator=( const ForwardRange2& r ); - - // iterator accessors - const_iterator begin() const; - iterator begin(); - const_iterator end() const; - iterator end(); - - reference front(); - const_reference front() const; - - sub_range& advance_begin(difference_type n); - sub_range& advance_end(difference_type n); - - // If traversal >= bidirectional: - reference back(); - const_reference back(); - - // If traversal >= random-access: - reference operator[](difference_type n); - const_reference operator[](difference_type n) const; - - public: - // rest of interface inherited from iterator_range - }; - -} // namespace 'boost' -`` - -The class should be trivial to use as seen below. Imagine that we have an algorithm that searches for a sub-string in a string. The result is an iterator_range, that delimits the match. We need to store the result from this algorithm. Here is an example of how we can do it with and without `sub_range` - -`` -std::string str("hello"); -iterator_range ir = find_first( str, "ll" ); -sub_range sub = find_first( str, "ll" ); -`` - -[endsect] - -[section:combine Function combine] - -The `combine` function is used to make one range from multiple ranges. The -`combine` function returns a `combined_range` which is an `iterator_range` of -a `zip_iterator` from the Boost.Iterator library. - -[h4 Synopsis] - -`` -namespace boost -{ - namespace range - { - -template -class combined_range - : public iterator_range > -{ -public: - combined_range(IterTuple first, IterTuple last); -}; - -template -auto combine(Ranges&&... rngs) -> - combined_range - - } // namespace range -} // namespace boost -`` - -* [*Precondition:] For each type `r` in `Ranges`, `r` is a model of -__single_pass_range__ or better. -* [*Return Type:] `combined_range::type...> >` -* [*Returned Range Category:] The minimum of the range category of every range -`r` in `Ranges`. - -[h4 Example] - -`` -#include -#include -#include -#include -#include - -int main(int, const char*[]) -{ - std::vector v; - std::list l; - for (int i = 0; i < 5; ++i) - { - v.push_back(i); - l.push_back(static_cast(i) + 'a'); - } - - int ti; - char tc; - BOOST_FOREACH(boost::tie(ti, tc), boost::combine(v, l)) - { - std::cout << '(' << ti << ',' << tv << ')' << '\n'; - } - - return 0; -} -`` - -This produces the output: -`` -(0,a) -(1,b) -(2,c) -(3,d) -(4,e) -`` - -[endsect] - -[section:join Function join] - -The intention of the `join` function is to join two ranges into one longer range. - -The resultant range will have the lowest common traversal of the two ranges supplied as parameters. - -Note that the joined range incurs a performance cost due to the need to check if the end of a range has been reached internally during traversal. - -[h4 Synopsis] - -`` -template -joined_range -join(const SinglePassRange1& rng1, const SinglePassRange2& rng2) - -template -joined_range -join(SinglePassRange1& rng1, SinglePassRange2& rng2); -`` - -For the const version: - -* [*Precondition:] The `range_value::type` must be convertible to `range_value::type`. The `range_reference::type` must be convertible to `range_reference::type`. -* [*Range Category:] Both `rng1` and `rng2` must be a model of __single_pass_range__ or better. -* [*Range Return Type:] `joined_range` which is a model of the lesser of the two range concepts passed. -* [*Returned Range Category:] The minimum of the range category of `rng1` and `rng2`. - -For the mutable version: - -* [*Precondition:] The `range_value::type` must be convertible to `range_value::type`. The `range_reference::type` must be convertible to `range_reference::type`. -* [*Range Category:] Both `rng1` and `rng2` must be a model of __single_pass_range__ or better. -* [*Range Return Type:] `joined_range` which is a model of the lesser of the two range concepts passed. -* [*Returned Range Category:] The minimum of the range category of `rng1` and `rng2`. - -[h4 Example] - -The expression `join(irange(0,5), irange(5,10))` would evaluate to a range representing an integer range `[0,10)` - - -[endsect] - -[endsect] - diff --git a/libs/range/doc/style.qbk b/libs/range/doc/style.qbk deleted file mode 100644 index 2074ba67f..000000000 --- a/libs/range/doc/style.qbk +++ /dev/null @@ -1,50 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:style_guide Terminology and style guidelines] - -The use of a consistent terminology is as important for __ranges__ and range-based algorithms as it is for iterators and iterator-based algorithms. If a conventional set of names are adopted, we can avoid misunderstandings and write generic function prototypes that are [*/self-documenting/]. - -Since ranges are characterized by a specific underlying iterator type, we get a type of range for each type of iterator. Hence we can speak of the following types of ranges: - -* [*/Value access/] category: - * Readable Range - * Writeable Range - * Swappable Range - * Lvalue Range -* [*/Traversal/] category: - * __single_pass_range__ - * __forward_range__ - * __bidirectional_range__ - * __random_access_range__ - -Notice how we have used the categories from the __new_style_iterators__. - -Notice that an iterator (and therefore an range) has one [*/traversal/] property and one or more properties from the [*/value access/] category. So in reality we will mostly talk about mixtures such as - -* Random Access Readable Writeable Range -* Forward Lvalue Range - -By convention, we should always specify the [*/traversal/] property first as done above. This seems reasonable since there will only be one [*/traversal/] property, but perhaps many [*/value access/] properties. - -It might, however, be reasonable to specify only one category if the other category does not matter. For example, the __iterator_range__ can be constructed from a Forward Range. This means that we do not care about what [*/value access/] properties the Range has. Similarly, a Readable Range will be one that has the lowest possible [*/traversal/] property (Single Pass). - -As another example, consider how we specify the interface of `std::sort()`. Algorithms are usually more cumbersome to specify the interface of since both [*/traversal/] and [*/value access/] properties must be exactly defined. The iterator-based version looks like this: - -`` - template< class RandomAccessTraversalReadableWritableIterator > - void sort( RandomAccessTraversalReadableWritableIterator first, - RandomAccessTraversalReadableWritableIterator last ); -`` - -For ranges the interface becomes - -`` - template< class RandomAccessReadableWritableRange > - void sort( RandomAccessReadableWritableRange& r ); -`` - -[endsect] - diff --git a/libs/range/doc/upgrade.qbk b/libs/range/doc/upgrade.qbk deleted file mode 100644 index 47fa8cb9f..000000000 --- a/libs/range/doc/upgrade.qbk +++ /dev/null @@ -1,67 +0,0 @@ -[/ - Copyright 2010 Neil Groves - Distributed under the Boost Software License, Version 1.0. - (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -/] -[section:upgrade Upgrade version of Boost.Range] - -[section:upgrade_from_1_55 Upgrade from version 1.55] -# __iterator_range__ is now implemented by implementing the member functions -`size()`, `operator[]` via inheritance of base-classes specialized by the -traversal type of the underlying iterator. This is normally requires no -alteration of code. It does mean that types that derive from iterator_range may -need to prefix `this->` to the various member functions. Additionally it has -been noted that some calling code was relying on member functions such as -`size()` being present despite the underlying iterators not being random-access -due to `iterator_reference::type` not being a reference. The suggested -refactoring is to use `boost::size(rng)`. -# The undocumented __iterator_range__ `pop_front()` has been deprecated and is -replaced by `drop_front(). Similarly `pop_back()` has been replaced by -`drop_back()`. - -[endsect] - -[section:upgrade_from_1_49 Upgrade from version 1.49] - -# __size__ now returns the type Rng::size_type if the range has size_type; -otherwise range_size::type is used. This is the distance type promoted to -an unsigned type. - -[endsect] - -[section:upgrade_from_1_45 Upgrade from version 1.45] - -# __size__ in addition to supporting __random_access_range__ now also supports extensibility via calls to the unqualified `range_calculate_size(rng)` function. -# __range_adaptors_strided__ now in addition to working with any RandomAccessRange additionally works for any SinglePassRange for which `boost::size(rng)` is valid. -# __range_adaptors_strided__ no longer requires `distance(rng) % stride_size == 0` or `stride_size < distance(rng)` - -[endsect] - -[section:upgrade_from_1_42 Upgrade from version 1.42] - -New features: - -# __range_adaptors__ -# __range_algorithms__ - -Removed: - -# `iterator_range` no longer has a `is_singular` member function. The singularity restrictions have been removed from the `iterator_range` class since this added restrictions to ranges of iterators whose default constructors were not singular. Previously the `is_singular` member function always returned `false` in release build configurations, hence it is not anticipated that this interface change will produce difficulty in upgrading. - - -[endsect] - -[section:upgrade_from_1_34 Upgrade from version 1.34] - -Boost version 1.35 introduced some larger refactorings of the library: - -# Direct support for character arrays was abandoned in favor of uniform treatment of all arrays. Instead string algorithms can use the new function __as_literal__`()`. -# __size__ now requires a __random_access_range__. The old behavior is provided as __distance__`()`. -# `range_size::type` has been completely removed in favor of `range_difference::type` -# `boost_range_begin()` and `boost_range_end()` have been renamed `range_begin()` and `range_end()` respectively. -# `range_result_iterator::type` and `range_reverse_result_iterator::type` have been renamed `range_iterator::type` and `range_reverse_iterator::type`. -# The procedure that makes a custom type work with the library has been greatly simplified. See __extending_for_udts__ for details. - -[endsect] - -[endsect] diff --git a/libs/range/index.html b/libs/range/index.html deleted file mode 100644 index 29b7f42cc..000000000 --- a/libs/range/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Boost.Range Documentation - - - - - - Automatic redirection failed, please go to doc/html/index.html - - - - - diff --git a/libs/range/meta/libraries.json b/libs/range/meta/libraries.json deleted file mode 100644 index 9e2be2093..000000000 --- a/libs/range/meta/libraries.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "key": "range", - "name": "Range", - "authors": [ - "Niel Groves", - "Thorsten Ottosen" - ], - "description": "A new infrastructure for generic algorithms that builds on top of the new iterator concepts.", - "category": [ - "Algorithms" - ], - "maintainers": [ - "Neil Groves ", - "Nathan Ridge " - ] -} diff --git a/libs/range/test/Jamfile.v2 b/libs/range/test/Jamfile.v2 deleted file mode 100644 index 05937c7d4..000000000 --- a/libs/range/test/Jamfile.v2 +++ /dev/null @@ -1,221 +0,0 @@ -# Boost.Range library -# -# Copyright Neil Groves 2009 -# Copyright Thorsten Ottosen 2003-2004. 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) -# -# For more information, see http://www.boost.org/libs/range/ -# - -# bring in rules for testing -import testing ; - -project - : requirements - /boost/test//boost_unit_test_framework/ - /boost/regex//boost_regex/ - static - multi - ; - -rule range-test ( name : includes * ) -{ - return [ - run $(name).cpp /boost/test//boost_unit_test_framework /boost/regex//boost_regex/static - : - : - : gcc:"-Wall -Wunused " - ] ; -} - -test-suite range : - [ compile-fail compile_fail/iterator_range1.cpp ] - [ compile-fail compile_fail/adaptor/adjacent_filtered_concept.cpp ] - [ compile-fail compile_fail/adaptor/adjacent_filtered_concept2.cpp ] - [ compile-fail compile_fail/adaptor/adjacent_filtered_concept3.cpp ] - [ compile-fail compile_fail/adaptor/adjacent_filtered_concept4.cpp ] - [ compile-fail compile_fail/adaptor/copied_concept.cpp ] - [ compile-fail compile_fail/adaptor/copied_concept2.cpp ] - [ compile-fail compile_fail/adaptor/copied_concept3.cpp ] - [ compile-fail compile_fail/adaptor/copied_concept4.cpp ] - [ compile-fail compile_fail/adaptor/reversed_concept.cpp ] - [ compile-fail compile_fail/adaptor/reversed_concept2.cpp ] - [ compile-fail compile_fail/adaptor/reversed_concept3.cpp ] - [ compile-fail compile_fail/adaptor/reversed_concept4.cpp ] - [ compile-fail compile_fail/adaptor/sliced_concept.cpp ] - [ compile-fail compile_fail/adaptor/sliced_concept2.cpp ] - [ compile-fail compile_fail/adaptor/sliced_concept3.cpp ] - [ compile-fail compile_fail/adaptor/sliced_concept4.cpp ] - [ compile-fail compile_fail/adaptor/uniqued_concept.cpp ] - [ compile-fail compile_fail/adaptor/uniqued_concept2.cpp ] - [ compile-fail compile_fail/adaptor/uniqued_concept3.cpp ] - [ compile-fail compile_fail/adaptor/uniqued_concept4.cpp ] - [ range-test adaptor_test/adjacent_filtered ] - [ range-test adaptor_test/chained ] - [ range-test adaptor_test/copied ] - [ range-test adaptor_test/filtered ] - [ range-test adaptor_test/indexed ] - [ range-test adaptor_test/indirected ] - [ range-test adaptor_test/map ] - [ range-test adaptor_test/replaced ] - [ range-test adaptor_test/replaced_if ] - [ range-test adaptor_test/reversed ] - [ range-test adaptor_test/sliced ] - [ range-test adaptor_test/strided ] - [ range-test adaptor_test/strided2 ] - [ range-test adaptor_test/ticket_6742_transformed_c4789_warning ] - [ range-test adaptor_test/ticket_8676_sliced_transformed ] - [ range-test adaptor_test/ticket_9519_strided_reversed ] - [ range-test adaptor_test/tokenized ] - [ range-test adaptor_test/transformed ] - [ range-test adaptor_test/type_erased ] - [ range-test adaptor_test/type_erased_abstract ] - [ range-test adaptor_test/type_erased_brackets ] - [ range-test adaptor_test/type_erased_mix_values ] - [ range-test adaptor_test/type_erased_tparam_conv ] - [ range-test adaptor_test/type_erased_single_pass ] - [ range-test adaptor_test/type_erased_forward ] - [ range-test adaptor_test/type_erased_bidirectional ] - [ range-test adaptor_test/type_erased_random_access ] - [ range-test adaptor_test/uniqued ] - [ range-test adaptor_test/adjacent_filtered_example ] - [ range-test adaptor_test/copied_example ] - [ range-test adaptor_test/filtered_example ] - [ range-test adaptor_test/formatted ] - [ range-test adaptor_test/formatted_example ] - [ range-test adaptor_test/indexed_example ] - [ range-test adaptor_test/indirected_example ] - [ range-test adaptor_test/map_keys_example ] - [ range-test adaptor_test/map_values_example ] - [ range-test adaptor_test/replaced_example ] - [ range-test adaptor_test/replaced_if_example ] - [ range-test adaptor_test/reversed_example ] - [ range-test adaptor_test/sliced_example ] - [ range-test adaptor_test/strided_example ] - [ range-test adaptor_test/transformed_example ] - [ range-test adaptor_test/tokenized_example ] - [ range-test adaptor_test/type_erased_example ] - [ range-test adaptor_test/uniqued_example ] - [ range-test algorithm_test/adjacent_find ] - [ range-test algorithm_test/binary_search ] - [ range-test algorithm_test/copy ] - [ range-test algorithm_test/copy_backward ] - [ range-test algorithm_test/count ] - [ range-test algorithm_test/count_if ] - [ range-test algorithm_test/equal ] - [ range-test algorithm_test/equal_range ] - [ range-test algorithm_test/fill ] - [ range-test algorithm_test/find ] - [ range-test algorithm_test/find_if ] - [ range-test algorithm_test/find_end ] - [ range-test algorithm_test/find_first_of ] - [ range-test algorithm_test/for_each ] - [ range-test algorithm_test/generate ] - [ range-test algorithm_test/heap ] - [ range-test algorithm_test/includes ] - [ range-test algorithm_test/inplace_merge ] - [ range-test algorithm_test/lexicographical_compare ] - [ range-test algorithm_test/lower_bound ] - [ range-test algorithm_test/max_element ] - [ range-test algorithm_test/merge ] - [ range-test algorithm_test/min_element ] - [ range-test algorithm_test/mismatch ] - [ range-test algorithm_test/next_permutation ] - [ range-test algorithm_test/nth_element ] - [ range-test algorithm_test/partial_sort ] - [ range-test algorithm_test/partition ] - [ range-test algorithm_test/prev_permutation ] - [ range-test algorithm_test/random_shuffle ] - [ range-test algorithm_test/remove ] - [ range-test algorithm_test/remove_copy ] - [ range-test algorithm_test/remove_copy_if ] - [ range-test algorithm_test/remove_if ] - [ range-test algorithm_test/replace ] - [ range-test algorithm_test/replace_copy ] - [ range-test algorithm_test/replace_copy_if ] - [ range-test algorithm_test/replace_if ] - [ range-test algorithm_test/reverse ] - [ range-test algorithm_test/reverse_copy ] - [ range-test algorithm_test/rotate ] - [ range-test algorithm_test/rotate_copy ] - [ range-test algorithm_test/search ] - [ range-test algorithm_test/search_n ] - [ range-test algorithm_test/set_difference ] - [ range-test algorithm_test/set_intersection ] - [ range-test algorithm_test/set_symmetric_difference ] - [ range-test algorithm_test/set_union ] - [ range-test algorithm_test/sort ] - [ range-test algorithm_test/stable_partition ] - [ range-test algorithm_test/stable_sort ] - [ range-test algorithm_test/swap_ranges ] - [ range-test algorithm_test/transform ] - [ range-test algorithm_test/unique ] - [ range-test algorithm_test/unique_copy ] - [ range-test algorithm_test/upper_bound ] - [ range-test algorithm_ext_test/copy_n ] - [ range-test algorithm_ext_test/erase ] - [ range-test algorithm_ext_test/for_each_ext ] - [ range-test algorithm_ext_test/insert ] - [ range-test algorithm_ext_test/iota ] - [ range-test algorithm_ext_test/is_sorted ] - [ range-test algorithm_ext_test/overwrite ] - [ range-test algorithm_ext_test/push_back ] - [ range-test algorithm_ext_test/push_front ] - [ range-test adl_conformance ] - [ range-test adl_conformance_no_using ] - [ range-test algorithm ] - [ range-test algorithm_example ] - [ range-test array ] -# [ range-test atl : $(VC71_ROOT)/atlmfc/include ] - [ range-test begin ] - [ range-test category ] - [ range-test combine ] - [ range-test compat2 ] - [ range-test compat3 ] - [ range-test const_iterator ] - [ range-test const_ranges ] - [ range-test const_reverse_iterator ] - [ range-test counting_range ] - [ range-test difference_type ] - [ range-test end ] - [ range-test extension_mechanism ] - [ range-test extension_size ] - [ range-test has_range_iterator ] - [ range-test irange ] - [ range-test istream_range ] - [ range-test iterator ] - [ range-test iterator_ext ] - [ range-test iterator_pair ] - [ range-test iterator_range ] - [ range-test iterator_range_drop ] - [ range-test iterator_range_equality_bug ] - [ range-test iterator_range_hash ] - [ range-test iterator_range_variant ] -# [ range-test mfc : $(VC71_ROOT)/atlmfc/include ] - [ range-test join ] - [ range-test mutable_iterator ] - [ range-test partial_workaround ] - [ range-test pointer ] - [ range-test pointer_as_iterator ] - [ range-test reference ] - [ range-test result_iterator ] - [ range-test reverse_iterator ] - [ range-test reverse_result_iterator ] - [ range-test reversible_range ] - [ range-test size_type ] - [ range-test std_container ] - [ range-test string ] - [ range-test sub_range ] - [ range-test ticket_5486 ] - [ range-test ticket_5544_terminate_irange ] - [ range-test ticket_5547 ] - [ range-test ticket_5556_is_sorted_namespace ] - [ range-test ticket_5811_indirected_optional ] - [ range-test ticket_6715_iterator_range_equality ] - [ range-test ticket_6944 ] - [ range-test ticket_10336 ] - [ range-test value_type ] - ; - diff --git a/libs/range/test/adaptor_test/adjacent_filtered.cpp b/libs/range/test/adaptor_test/adjacent_filtered.cpp deleted file mode 100644 index 48025abf1..000000000 --- a/libs/range/test/adaptor_test/adjacent_filtered.cpp +++ /dev/null @@ -1,110 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void adjacent_filtered_test_impl( Container& c ) - { - using namespace boost::adaptors; - - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - // This is my preferred syntax using the | operator. - std::vector< value_t > test_result1 - = boost::copy_range< std::vector< value_t > >( - c | adjacent_filtered(std::not_equal_to< value_t >())); - - // This is an alternative syntax preferred by some. - std::vector< value_t > test_result2 - = boost::copy_range< std::vector< value_t > >( - adaptors::adjacent_filter(c, std::not_equal_to< value_t >())); - - // Calculate the reference result. - std::vector< value_t > reference_result; - typedef BOOST_DEDUCED_TYPENAME Container::const_iterator iter_t; - value_t prev_v = value_t(); - for (iter_t it = c.begin(); it != c.end(); ++it) - { - if (it == c.begin()) - { - reference_result.push_back(*it); - } - else if (*it != prev_v) - { - reference_result.push_back(*it); - } - prev_v = *it; - } - - BOOST_CHECK_EQUAL_COLLECTIONS( reference_result.begin(), - reference_result.end(), - test_result1.begin(), - test_result1.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference_result.begin(), - reference_result.end(), - test_result2.begin(), - test_result2.end() ); - } - - template< class Collection > - void adjacent_filtered_test_impl() - { - using namespace boost::assign; - - Collection c; - - // test empty collection - adjacent_filtered_test_impl(c); - - // test one element; - c += 1; - adjacent_filtered_test_impl(c); - - // test many elements; - c += 1,2,2,2,3,4,4,4,4,5,6,7,8,9,9; - adjacent_filtered_test_impl(c); - } - - void adjacent_filtered_test() - { - adjacent_filtered_test_impl< std::vector< int > >(); - adjacent_filtered_test_impl< std::list< int > >(); - adjacent_filtered_test_impl< std::set< int > >(); - adjacent_filtered_test_impl< std::multiset< int > >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.adjacent_filtered" ); - - test->add( BOOST_TEST_CASE( &boost::adjacent_filtered_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/adjacent_filtered_example.cpp b/libs/range/test/adaptor_test/adjacent_filtered_example.cpp deleted file mode 100644 index 83f7a8ac7..000000000 --- a/libs/range/test/adaptor_test/adjacent_filtered_example.cpp +++ /dev/null @@ -1,65 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[adjacent_filtered_example -#include -#include -#include -#include -#include -#include -#include - -//<- -#include - -#include -#include - -namespace -{ -void adjacent_filtered_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::assign; - using namespace boost::adaptors; - - std::vector input; - input += 1,1,2,2,2,3,4,5,6; - - boost::copy( - input | adjacent_filtered(std::not_equal_to()), - std::ostream_iterator(std::cout, ",")); - -//= return 0; -//=} -//] - std::vector reference; - reference += 1,2,3,4,5,6; - - std::vector test; - boost::push_back(test, input | adjacent_filtered(std::not_equal_to())); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.adjacent_filtered_example" ); - - test->add( BOOST_TEST_CASE( &adjacent_filtered_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/chained.cpp b/libs/range/test/adaptor_test/chained.cpp deleted file mode 100644 index 1b756c9cf..000000000 --- a/libs/range/test/adaptor_test/chained.cpp +++ /dev/null @@ -1,117 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -// Credits: -// Jurgen Hunold provided a test case that demonstrated that the range adaptors -// were producing iterators that were not default constructible. This became -// symptomatic after enabling concept checking assertions. This test is a -// lightly modified version of his supplied code to ensure that his use case -// never breaks again. (hopefully!) -// - -#include -#include -#include -#include - -#include -#include - -#include -#include - -namespace boost_range_test -{ - namespace - { - -class foo -{ -public: - static foo from_string(const std::string& source) - { - foo f; - f.m_valid = true; - f.m_value = 0u; - for (std::string::const_iterator it = source.begin(); - it != source.end(); ++it) - { - f.m_value += *it; - if ((*it < 'a') || (*it > 'z')) - f.m_valid = false; - } - return f; - } - bool is_valid() const - { - return m_valid; - } - bool operator<(const foo& other) const - { - return m_value < other.m_value; - } - bool operator==(const foo& other) const - { - return m_value == other.m_value && m_valid == other.m_valid; - } - bool operator!=(const foo& other) const - { - return !operator==(other); - } - - friend inline std::ostream& operator<<(std::ostream& out, const foo& obj) - { - out << "{value=" << obj.m_value - << ", valid=" << std::boolalpha << obj.m_valid << "}\n"; - return out; - } - -private: - boost::uint64_t m_value; - bool m_valid; -}; - -void chained_adaptors_test() -{ - std::vector sep; - - sep.push_back("AB"); - sep.push_back("ab"); - sep.push_back("aghj"); - - std::set foos; - - boost::copy(sep - | boost::adaptors::transformed(boost::bind(&foo::from_string, _1)) - | boost::adaptors::filtered(boost::bind(&foo::is_valid, _1)), - std::inserter(foos, foos.end())); - - std::vector reference; - reference.push_back(foo::from_string("ab")); - reference.push_back(foo::from_string("aghj")); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - foos.begin(), foos.end()); -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.chained adaptors" ); - - test->add(BOOST_TEST_CASE( boost_range_test::chained_adaptors_test)); - - return test; -} diff --git a/libs/range/test/adaptor_test/copied.cpp b/libs/range/test/adaptor_test/copied.cpp deleted file mode 100644 index 93f1cb795..000000000 --- a/libs/range/test/adaptor_test/copied.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include - -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void copied_test_impl( Container& c ) - { - using namespace boost::adaptors; - - // This is my preferred syntax using the | operator. - std::vector< int > test_result1; - boost::push_back(test_result1, c | copied(0u, c.size())); - - // This is the alternative syntax preferred by some. - std::vector< int > test_result2; - boost::push_back(test_result2, adaptors::copy(c, 0u, c.size())); - - BOOST_CHECK_EQUAL_COLLECTIONS( test_result1.begin(), test_result1.end(), - c.begin(), c.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( test_result2.begin(), test_result2.end(), - c.begin(), c.end() ); - } - - template< class Container > - void copied_test_impl() - { - using namespace boost::assign; - - Container c; - - // test empty collection - copied_test_impl(c); - - // test one element - c += 1; - copied_test_impl(c); - - // test many elements - c += 1,2,2,2,3,4,4,4,4,5,6,7,8,9,9; - copied_test_impl(c); - } - - void copied_test() - { - copied_test_impl< std::vector< int > >(); - copied_test_impl< std::deque< int > >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.copied" ); - - test->add( BOOST_TEST_CASE( &boost::copied_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/copied_example.cpp b/libs/range/test/adaptor_test/copied_example.cpp deleted file mode 100644 index c1d0e31d9..000000000 --- a/libs/range/test/adaptor_test/copied_example.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[copied_example -#include -#include -#include -#include -#include -#include - -//<- -#include - -#include -#include - -namespace -{ -void copied_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::assign; - using namespace boost::adaptors; - - std::vector input; - input += 1,2,3,4,5,6,7,8,9,10; - - boost::copy( - input | copied(1, 5), - std::ostream_iterator(std::cout, ",")); - -//= return 0; -//=} -//] - std::vector reference; - reference += 2,3,4,5; - - std::vector test; - boost::push_back(test, input | copied(1, 5)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.copied_example" ); - - test->add( BOOST_TEST_CASE( &copied_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/filtered.cpp b/libs/range/test/adaptor_test/filtered.cpp deleted file mode 100644 index 17a457fb9..000000000 --- a/libs/range/test/adaptor_test/filtered.cpp +++ /dev/null @@ -1,159 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - struct always_false_pred - { - template< class T1 > - bool operator()(T1) const { return false; } - }; - - struct always_true_pred - { - template< class T1 > - bool operator()(T1) const { return true; } - }; - - struct is_even - { - template< class IntegerT > - bool operator()( IntegerT x ) const { return x % 2 == 0; } - }; - - struct is_odd - { - template< class IntegerT > - bool operator()( IntegerT x ) const { return x % 2 != 0; } - }; - - template< class Container, class Pred > - void filtered_test_impl( Container& c, Pred pred ) - { - using namespace boost::adaptors; - - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - // This is my preferred syntax using the | operator. - std::vector< value_t > test_result1; - boost::push_back(test_result1, c | filtered(pred)); - - // This is an alternative syntax preferred by some. - std::vector< value_t > test_result2; - boost::push_back(test_result2, adaptors::filter(c, pred)); - - // Calculate the reference result. - std::vector< value_t > reference_result; - typedef BOOST_DEDUCED_TYPENAME Container::const_iterator iter_t; - for (iter_t it = c.begin(); it != c.end(); ++it) - { - if (pred(*it)) - reference_result.push_back(*it); - } - - BOOST_CHECK_EQUAL_COLLECTIONS( reference_result.begin(), - reference_result.end(), - test_result1.begin(), - test_result1.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference_result.begin(), - reference_result.end(), - test_result2.begin(), - test_result2.end() ); - } - - template< class Container, class Pred > - void filtered_test_impl() - { - using namespace boost::assign; - - Container c; - - // test empty container - filtered_test_impl(c, Pred()); - - // test one element - c += 1; - filtered_test_impl(c, Pred()); - - // test many elements - c += 1,2,2,2,3,4,4,4,4,5,6,7,8,9,9; - filtered_test_impl(c, Pred()); - } - - template< class Container > - void filtered_test_all_predicates() - { - filtered_test_impl< Container, always_false_pred >(); - filtered_test_impl< Container, always_true_pred >(); - filtered_test_impl< Container, is_odd >(); - filtered_test_impl< Container, is_even >(); - } - - void ticket_10988_single_pass() - { - std::vector v; - std::string str("0 1 2 3 4 5"); - std::istringstream in(str); - - boost::push_back(v, - boost::make_iterator_range( - std::istream_iterator(in), - std::istream_iterator()) - | boost::adaptors::filtered(is_even())); - - std::vector reference; - for (int i = 0; i < 6; i += 2) - { - reference.push_back(i); - } - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - v.begin(), v.end()); - } - - void filtered_test() - { - filtered_test_all_predicates< std::vector< int > >(); - filtered_test_all_predicates< std::list< int > >(); - filtered_test_all_predicates< std::set< int > >(); - filtered_test_all_predicates< std::multiset< int > >(); - ticket_10988_single_pass(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.filtered" ); - - test->add( BOOST_TEST_CASE( &boost::filtered_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/filtered_example.cpp b/libs/range/test/adaptor_test/filtered_example.cpp deleted file mode 100644 index e16d0af60..000000000 --- a/libs/range/test/adaptor_test/filtered_example.cpp +++ /dev/null @@ -1,71 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[filtered_example -#include -#include -#include -#include -#include -#include - -//<- -#include -#include - -#include - -namespace -{ -//-> -struct is_even -{ - bool operator()( int x ) const { return x % 2 == 0; } -}; - -//<- -void filtered_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::assign; - using namespace boost::adaptors; - - std::vector input; - input += 1,2,3,4,5,6,7,8,9; - - boost::copy( - input | filtered(is_even()), - std::ostream_iterator(std::cout, ",")); - -//= return 0; -//=} -//] - std::vector reference; - reference += 2,4,6,8; - - std::vector test; - boost::push_back(test, input | filtered(is_even())); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.filtered_example" ); - - test->add( BOOST_TEST_CASE( &filtered_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/formatted.cpp b/libs/range/test/adaptor_test/formatted.cpp deleted file mode 100644 index b6c1783c2..000000000 --- a/libs/range/test/adaptor_test/formatted.cpp +++ /dev/null @@ -1,311 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost_range_test -{ - namespace - { - - template - std::string make_string(T x) - { - std::ostringstream result; - result << x; - return result.str(); - } - - template - std::string make_string(T1 x, T2 y) - { - std::ostringstream result; - result << x << y; - return result.str(); - } - -std::string reference_result(const std::vector& v, - const std::string& separator, - const std::string& prefix, - const std::string& postfix) -{ - std::ostringstream out; - out << prefix; - if (!v.empty()) - { - out << v.at(0); - std::vector::const_iterator it = v.begin(); - for (++it; it != v.end(); ++it) - { - out << separator << *it; - } - } - out << postfix; - - return out.str(); -} - -void test_formatted_0args_impl(const std::vector& v) -{ - std::ostringstream out1; - out1 << '[' << (v | boost::adaptors::formatted()) << ']'; - BOOST_CHECK_EQUAL(out1.str(), reference_result(v, ",", "[{", "}]")); - - std::ostringstream out2; - out2 << '[' << boost::adaptors::format(v) << ']'; - BOOST_CHECK_EQUAL(out2.str(), reference_result(v, ",", "[{", "}]")); - - std::ostringstream out3; - out3 << (v | boost::adaptors::formatted()); - BOOST_CHECK_EQUAL(out3.str(), reference_result(v, ",", "{", "}")); - - std::ostringstream out4; - out4 << boost::adaptors::format(v); - BOOST_CHECK_EQUAL(out4.str(), reference_result(v, ",", "{", "}")); -} - -template -void test_formatted_1arg_impl( - const std::vector& v, - const Sep& sep) -{ - const std::string ref_sep = make_string(sep); - std::ostringstream out1; - out1 << '[' << (v | boost::adaptors::formatted(sep)) << ']'; - - BOOST_CHECK_EQUAL(out1.str(), reference_result(v, ref_sep, "[{", "}]")); - - std::ostringstream out2; - out2 << '[' << boost::adaptors::format(v, sep) << ']'; - BOOST_CHECK_EQUAL(out2.str(), reference_result(v, ref_sep, "[{", "}]")); - - std::ostringstream out3; - out3 << (v | boost::adaptors::formatted(sep)); - BOOST_CHECK_EQUAL(out3.str(), reference_result(v, ref_sep, "{", "}")); - - std::ostringstream out4; - out4 << boost::adaptors::format(v, sep); - BOOST_CHECK_EQUAL(out4.str(), reference_result(v, ref_sep, "{", "}")); -} - -void test_formatted_1arg_impl(const std::vector& v) -{ - test_formatted_1arg_impl(v, ','); - test_formatted_1arg_impl(v, ' '); - test_formatted_1arg_impl(v, ":?"); -} - -template -void test_formatted_2args_impl( - const std::vector& v, - const Sep& sep, - const Prefix& prefix -) -{ - const std::string ref_sep = make_string(sep); - - std::ostringstream out1; - out1 << '[' << (v | boost::adaptors::formatted(sep, prefix)) << ']'; - BOOST_CHECK_EQUAL( - out1.str(), - reference_result(v, ref_sep, make_string('[', prefix), "}]")); - - std::ostringstream out2; - out2 << '[' << boost::adaptors::format(v, sep, prefix) << ']'; - BOOST_CHECK_EQUAL( - out2.str(), - reference_result(v, ref_sep, make_string('[', prefix), "}]")); - - std::ostringstream out3; - out3 << (v | boost::adaptors::formatted(sep, prefix)); - BOOST_CHECK_EQUAL( - out3.str(), - reference_result(v, ref_sep, make_string(prefix), "}")); - - std::ostringstream out4; - out4 << boost::adaptors::format(v, sep, prefix); - BOOST_CHECK_EQUAL( - out4.str(), - reference_result(v, ref_sep, make_string(prefix), "}")); -} - -void test_formatted_2args_impl(const std::vector& v) -{ - test_formatted_2args_impl(v, ',', '{'); - test_formatted_2args_impl(v, ':', '('); - test_formatted_2args_impl(v, ',', "{!"); - test_formatted_2args_impl(v, "#$", '{'); - test_formatted_2args_impl(v, "#$", "{!"); -} - -template -void test_formatted_3args_impl( - const std::vector& v, - const Sep& sep, - const Prefix& prefix, - const Postfix& postfix -) -{ - const std::string ref_sep = make_string(sep); - - std::ostringstream out1; - out1 << '[' << (v | boost::adaptors::formatted(sep, prefix, postfix)) - << ']'; - BOOST_CHECK_EQUAL( - out1.str(), - reference_result(v, ref_sep, make_string('[', prefix), - make_string(postfix, ']'))); -} - -void test_formatted_3args_impl(const std::vector& v) -{ - test_formatted_3args_impl(v, ',', '{', '}'); - test_formatted_3args_impl(v, ':', '(', ')'); - test_formatted_3args_impl(v, ',', '{', "!}"); - test_formatted_3args_impl(v, ',', "{!", '}'); - test_formatted_3args_impl(v, "#$", '{', '}'); - test_formatted_3args_impl< - const char[3], const char[3], const char[3] - >(v, "#$", "{!", "!}"); -} - -void test_formatted_impl(const std::vector& v) -{ - test_formatted_0args_impl(v); - test_formatted_1arg_impl(v); - test_formatted_2args_impl(v); - test_formatted_3args_impl(v); -} - -void test_formatted1() -{ - std::vector v; - for (boost::int32_t i = 0; i < 10; ++i) - v.push_back(i); - - test_formatted_impl(v); -} - -void test_formatted2() -{ - std::vector v; - v.push_back(3); - - test_formatted_impl(v); -} - -void test_formatted3() -{ - std::vector v; - - test_formatted_impl(v); -} - -void test_formatted4() -{ - std::vector v; - for (boost::int32_t i = 0; i < 5; ++i) - v.push_back(i); - - test_formatted_impl(v); -} - -struct udt_separator -{ -}; - -template -inline std::basic_ostream& -operator<<(std::basic_ostream& out, udt_separator) -{ - return out << "[sep]"; -} - -void test_formatted5() -{ - std::vector v; - for (boost::int32_t i = 0; i < 5; ++i) - v.push_back(i); - - std::ostringstream out1; - out1 << (v | boost::adaptors::formatted(udt_separator())); - BOOST_CHECK_EQUAL(out1.str(), "{0[sep]1[sep]2[sep]3[sep]4}"); - - std::ostringstream out2; - out2 << boost::adaptors::format(v, udt_separator()); - BOOST_CHECK_EQUAL(out2.str(), "{0[sep]1[sep]2[sep]3[sep]4}"); -} - -// This test is already covered by the more complex code above. This -// code duplicates coverage to ensure that char literal arrays are handled -// correctly. I was particularly concerned that my test code above may pass -// erroneously by decaying a char literal to a pointer. This function makes -// it very plain that character literal strings work. -void test_formatted_empty() -{ - std::vector v; - - std::ostringstream out1; - out1 << (v | boost::adaptors::formatted()); - BOOST_CHECK_EQUAL(out1.str(), "{}"); - - std::ostringstream out2; - out2 << boost::adaptors::format(v); - BOOST_CHECK_EQUAL(out2.str(), "{}"); - - std::ostringstream out3; - out3 << (v | boost::adaptors::formatted(',')); - BOOST_CHECK_EQUAL(out3.str(), "{}"); - - std::ostringstream out4; - out4 << boost::adaptors::format(v, ','); - BOOST_CHECK_EQUAL(out4.str(), "{}"); - - std::ostringstream out5; - out5 << (v | boost::adaptors::formatted("#$")); - BOOST_CHECK_EQUAL(out5.str(), "{}"); - - std::ostringstream out6; - out6 << boost::adaptors::format(v, "#$"); - BOOST_CHECK_EQUAL(out6.str(), "{}"); - - std::ostringstream out7; - out7 << (v | boost::adaptors::formatted("", "12", "34")); - BOOST_CHECK_EQUAL(out7.str(), "1234"); - - std::ostringstream out8; - out8 << boost::adaptors::format(v, "", "12", "34"); - BOOST_CHECK_EQUAL(out8.str(), "1234"); -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite(int, char*[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE( "Boost.Range formatted test suite" ); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_formatted1)); - test->add(BOOST_TEST_CASE(&boost_range_test::test_formatted2)); - test->add(BOOST_TEST_CASE(&boost_range_test::test_formatted3)); - test->add(BOOST_TEST_CASE(&boost_range_test::test_formatted4)); - test->add(BOOST_TEST_CASE(&boost_range_test::test_formatted5)); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_formatted_empty)); - - return test; -} diff --git a/libs/range/test/adaptor_test/formatted_example.cpp b/libs/range/test/adaptor_test/formatted_example.cpp deleted file mode 100644 index 838a67123..000000000 --- a/libs/range/test/adaptor_test/formatted_example.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[formatted_example -#include -#include -#include -#include -#include -#include -#include - -//<- -#include -#include - -#include - -namespace -{ -void formatted_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::assign; - - std::vector input; - input += 1,2,3,4,5; - - std::cout << boost::adaptors::format(input) << std::endl; - - // Alternatively this can be written: - // std::cout << (input | boost::adaptors::formatted()) << std::endl; - -//= return 0; -//=} -//] - std::ostringstream test; - test << boost::adaptors::format(input); - - BOOST_CHECK_EQUAL(test.str(), "{1,2,3,4,5}"); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.formatted_example" ); - - test->add( BOOST_TEST_CASE( &formatted_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/indexed.cpp b/libs/range/test/adaptor_test/indexed.cpp deleted file mode 100644 index f4085be04..000000000 --- a/libs/range/test/adaptor_test/indexed.cpp +++ /dev/null @@ -1,152 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include - -#include -#include -#include - -#include "../test_utils.hpp" - -namespace boost_range_test -{ - namespace - { - -template -void check_result( - const Container& reference_range, - const AdaptedRange& adapted_range, - std::ptrdiff_t start_index - ) -{ - typedef typename boost::range_iterator::type - reference_iterator; - - typedef typename boost::range_iterator::type - adapted_iterator; - - BOOST_REQUIRE_EQUAL(boost::size(reference_range), - boost::size(adapted_range)); - - reference_iterator reference_it = boost::begin(reference_range); - adapted_iterator adapted_it = boost::begin(adapted_range); - for (std::ptrdiff_t i = start_index; - reference_it != boost::end(reference_range); - ++reference_it, ++adapted_it, ++i) - { - BOOST_CHECK_EQUAL(i, adapted_it->index()); - BOOST_CHECK_EQUAL(*reference_it, adapted_it->value()); - } -} - -template -void indexed_test_impl(Container& c, std::ptrdiff_t start_index) -{ - // This is my preferred syntax using the | operator. - check_result(c, c | boost::adaptors::indexed(), 0); - check_result(c, c | boost::adaptors::indexed(start_index), start_index); - - // This is the function syntax - check_result(c, boost::adaptors::index(c), 0); - check_result(c, boost::adaptors::index(c, start_index), start_index); -} - -template -void indexed_test_impl(Container& c) -{ - indexed_test_impl(c, 0); - indexed_test_impl(c, -1); - indexed_test_impl(c, 4); -} - -template -void indexed_test_impl() -{ - using namespace boost::assign; - - Container c; - - // test empty container - indexed_test_impl(c); - - // test one element - c += 1; - indexed_test_impl(c); - - // test many elements - c += 1,2,2,2,3,4,4,4,4,5,6,7,8,9,9; - indexed_test_impl(c); -} - -template -void check_traversal(const Range& rng) -{ - BOOST_STATIC_ASSERT( - boost::is_convertible< - typename boost::range_traversal::type, - Traversal - >::value); -} - -template -void check_not_traversal(const Range& rng) -{ - BOOST_STATIC_ASSERT( - !boost::is_convertible< - typename boost::range_traversal::type, - Traversal - >::value); -} - -void indexed_test() -{ - indexed_test_impl< std::vector< int > >(); - indexed_test_impl< std::list< int > >(); - - std::vector vi; - - check_traversal( - vi | boost::adaptors::indexed()); - - std::list li; - - check_traversal( - li | boost::adaptors::indexed()); - - check_not_traversal( - li | boost::adaptors::indexed()); - - check_not_traversal( - li | boost::adaptors::indexed()); -} - - } // anonymous namesapce -} // namespace boost_range_test - -boost::unit_test::test_suite* -init_unit_test_suite(int, char*[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "Boost.Range indexed adaptor test suite" ); - - test->add(BOOST_TEST_CASE(&boost_range_test::indexed_test)); - - return test; -} diff --git a/libs/range/test/adaptor_test/indexed_example.cpp b/libs/range/test/adaptor_test/indexed_example.cpp deleted file mode 100644 index c65e62e1e..000000000 --- a/libs/range/test/adaptor_test/indexed_example.cpp +++ /dev/null @@ -1,104 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[indexed_example - -//<- -#include -//-> - -#include -#include -#include -#include -#include - -//<- -#include -#include - -namespace -{ - -template -void check_element_and_index( - Iterator1 test_first, - Iterator1 test_last, - Iterator2 reference_first, - Iterator2 reference_last) -{ - BOOST_CHECK_EQUAL( std::distance(test_first, test_last), - std::distance(reference_first, reference_last) ); - - std::ptrdiff_t reference_index = 0; - - Iterator1 test_it = test_first; - Iterator2 reference_it = reference_first; - for (; test_it != test_last; ++test_it, ++reference_it, ++reference_index) - { - BOOST_CHECK_EQUAL(test_it->value(), *reference_it); - BOOST_CHECK_EQUAL(test_it->index(), reference_index); - } -} - -template -void check_element_and_index( - const SinglePassRange1& test_rng, - const SinglePassRange2& reference_rng) -{ - check_element_and_index( - boost::begin(test_rng), boost::end(test_rng), - boost::begin(reference_rng), boost::end(reference_rng)); -} -//-> - -//<- -void indexed_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::assign; - using namespace boost::adaptors; - - std::vector input; - input += 10,20,30,40,50,60,70,80,90; - -//<- -#ifndef BOOST_NO_CXX11_RANGE_BASED_FOR -//-> - for (const auto& element : input | indexed(0)) - { - std::cout << "Element = " << element.value() - << " Index = " << element.index() - << std::endl; - } -//<- -#endif // C++11 has range for loop -//-> - -//= return 0; -//=} -//] - check_element_and_index( - input | indexed(0), - input); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.indexed_example" ); - - test->add( BOOST_TEST_CASE( &indexed_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/indirected.cpp b/libs/range/test/adaptor_test/indirected.cpp deleted file mode 100644 index fe3ebdfa2..000000000 --- a/libs/range/test/adaptor_test/indirected.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -namespace boost -{ - namespace - { - - template< class Container > - void indirected_test_impl( Container& c ) - { - using namespace boost::adaptors; - - // This is my preferred syntax using the | operator. - std::vector< int > test_result1; - boost::push_back(test_result1, c | indirected); - - // This is an alternative syntax preferred by some. - std::vector< int > test_result2; - boost::push_back(test_result2, adaptors::indirect(c)); - - // Calculate the reference result. - std::vector< int > reference_result; - typedef BOOST_DEDUCED_TYPENAME Container::const_iterator iter_t; - for (iter_t it = c.begin(); it != c.end(); ++it) - { - reference_result.push_back(**it); - } - - BOOST_CHECK_EQUAL_COLLECTIONS( reference_result.begin(), - reference_result.end(), - test_result1.begin(), - test_result1.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference_result.begin(), - reference_result.end(), - test_result2.begin(), - test_result2.end() ); - } - - template< class Container > - void indirected_test_impl() - { - using namespace boost::assign; - - Container c; - - indirected_test_impl(c); - - c += boost::shared_ptr(new int(1)); - indirected_test_impl(c); - - std::vector v; - v += 1,1,2,2,2,3,4,4,4,4,5,6,7,8,9,9; - for (std::vector::const_iterator it = v.begin(); it != v.end(); ++it) - { - c += boost::shared_ptr(new int(*it)); - } - indirected_test_impl(c); - } - - void indirected_test() - { - indirected_test_impl< std::vector< boost::shared_ptr< int > > >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.indirected" ); - - test->add( BOOST_TEST_CASE( &boost::indirected_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/indirected_example.cpp b/libs/range/test/adaptor_test/indirected_example.cpp deleted file mode 100644 index 8b538b5ae..000000000 --- a/libs/range/test/adaptor_test/indirected_example.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[indirected_example -#include -#include -#include -#include -#include -#include - -//<- -#include -#include - -#include - -namespace -{ -void indirected_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::adaptors; - - std::vector > input; - - for (int i = 0; i < 10; ++i) - input.push_back(boost::shared_ptr(new int(i))); - - boost::copy( - input | indirected, - std::ostream_iterator(std::cout, ",")); - -//= return 0; -//=} -//] - std::vector reference; - for (int i = 0; i < 10; ++i) - reference.push_back(i); - - std::vector test; - boost::push_back(test, input | indirected); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.indirected_example" ); - - test->add( BOOST_TEST_CASE( &indirected_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/map.cpp b/libs/range/test/adaptor_test/map.cpp deleted file mode 100644 index 615b4677c..000000000 --- a/libs/range/test/adaptor_test/map.cpp +++ /dev/null @@ -1,171 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void map_test_keys( Container& c ) - { - using namespace boost::adaptors; - - std::vector keys; - boost::push_back(keys, c | map_keys); - - std::vector keys2; - boost::push_back(keys2, adaptors::keys(c)); - - std::vector reference_keys; - typedef BOOST_DEDUCED_TYPENAME Container::const_iterator iter_t; - for (iter_t it = c.begin(); it != c.end(); ++it) - { - reference_keys.push_back(it->first); - } - - BOOST_CHECK_EQUAL_COLLECTIONS( reference_keys.begin(), - reference_keys.end(), - keys.begin(), - keys.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference_keys.begin(), - reference_keys.end(), - keys2.begin(), - keys2.end() ); - } - - template< class Container > - void map_test_values( Container& c ) - { - using namespace boost::adaptors; - - std::vector values; - boost::push_back(values, c | map_values); - - std::vector values2; - boost::push_back(values2, adaptors::values(c)); - - std::vector reference_values; - typedef BOOST_DEDUCED_TYPENAME Container::const_iterator iter_t; - for (iter_t it = c.begin(); it != c.end(); ++it) - { - reference_values.push_back(it->second); - } - - BOOST_CHECK_EQUAL_COLLECTIONS( reference_values.begin(), - reference_values.end(), - values.begin(), - values.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference_values.begin(), - reference_values.end(), - values2.begin(), - values2.end() ); - } - - template< class Container > - void map_test_impl() - { - using namespace boost::assign; - - Container c; - - // Test empty - map_test_keys(c); - map_test_values(c); - - // Test one element - c.insert(std::make_pair(1,2)); - map_test_keys(c); - map_test_values(c); - - // Test many elements - for (int x = 2; x < 10; ++x) - { - c.insert(std::make_pair(x, x * 2)); - } - map_test_keys(c); - map_test_values(c); - } - - void map_test() - { - map_test_impl< std::map >(); - } - - void test_trac_item_4388() - { - typedef std::pair pair_t; - const boost::array ar = {{ - pair_t(3, 'a'), - pair_t(1, 'b'), - pair_t(4, 'c') - }}; - - const boost::array expected_keys = {{ 3, 1, 4 }}; - const boost::array expected_values = {{ 'a', 'b', 'c' }}; - - { - std::vector test; - boost::push_back(test, ar | boost::adaptors::map_keys); - BOOST_CHECK_EQUAL_COLLECTIONS( - expected_keys.begin(), expected_keys.end(), - test.begin(), test.end() - ); - } - - { - std::vector test; - boost::push_back(test, ar | boost::adaptors::map_values); - BOOST_CHECK_EQUAL_COLLECTIONS( - expected_values.begin(), expected_values.end(), - test.begin(), test.end() - ); - } - - { - std::vector test; - boost::array, 3> src(ar); - boost::push_back(test, src | boost::adaptors::map_values); - BOOST_CHECK_EQUAL_COLLECTIONS( - expected_values.begin(), expected_values.end(), - test.begin(), test.end() - ); - } - } - - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.map" ); - - test->add( BOOST_TEST_CASE( &boost::map_test ) ); - test->add( BOOST_TEST_CASE( &boost::test_trac_item_4388 ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/map_keys_example.cpp b/libs/range/test/adaptor_test/map_keys_example.cpp deleted file mode 100644 index 99f8505cc..000000000 --- a/libs/range/test/adaptor_test/map_keys_example.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[map_keys_example -#include -#include -#include -#include -#include -#include -#include - -//<- -#include -#include - -#include - -namespace -{ -void map_keys_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::assign; - using namespace boost::adaptors; - - std::map input; - for (int i = 0; i < 10; ++i) - input.insert(std::make_pair(i, i * 10)); - - boost::copy( - input | map_keys, - std::ostream_iterator(std::cout, ",")); - -//= return 0; -//=} -//] - std::vector reference; - reference += 0,1,2,3,4,5,6,7,8,9; - - std::vector test; - boost::push_back(test, input | map_keys); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.map_keys_example" ); - - test->add( BOOST_TEST_CASE( &map_keys_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/map_values_example.cpp b/libs/range/test/adaptor_test/map_values_example.cpp deleted file mode 100644 index bfa533fd0..000000000 --- a/libs/range/test/adaptor_test/map_values_example.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[map_values_example -#include -#include -#include -#include -#include -#include -#include - -//<- -#include -#include - -#include - -namespace -{ -void map_values_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::assign; - using namespace boost::adaptors; - - std::map input; - for (int i = 0; i < 10; ++i) - input.insert(std::make_pair(i, i * 10)); - - boost::copy( - input | map_values, - std::ostream_iterator(std::cout, ",")); - -//= return 0; -//=} -//] - std::vector reference; - reference += 0,10,20,30,40,50,60,70,80,90; - - std::vector test; - boost::push_back(test, input | map_values); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.map_values_example" ); - - test->add( BOOST_TEST_CASE( &map_values_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/replaced.cpp b/libs/range/test/adaptor_test/replaced.cpp deleted file mode 100644 index d3eac813d..000000000 --- a/libs/range/test/adaptor_test/replaced.cpp +++ /dev/null @@ -1,87 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void replaced_test_impl( Container& c ) - { - using namespace boost::adaptors; - - const int value_to_replace = 1; - const int replacement_value = 0; - - std::vector< int > test_result1; - boost::push_back(test_result1, c | replaced(value_to_replace, replacement_value)); - - std::vector< int > test_result2; - boost::push_back(test_result2, adaptors::replace(c, value_to_replace, replacement_value)); - - std::vector< int > reference( c.begin(), c.end() ); - std::replace(reference.begin(), reference.end(), value_to_replace, replacement_value); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test_result1.begin(), test_result1.end() ); - } - - template< class Container > - void replaced_test_impl() - { - using namespace boost::assign; - - Container c; - - // Test empty - replaced_test_impl(c); - - // Test one - c += 1; - replaced_test_impl(c); - - // Test many - c += 1,1,1,2,2,2,3,3,3,3,3,4,5,6,6,6,7,8,9; - replaced_test_impl(c); - } - - void replaced_test() - { - replaced_test_impl< std::vector< int > >(); - replaced_test_impl< std::list< int > >(); - replaced_test_impl< std::set< int > >(); - replaced_test_impl< std::multiset< int > >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.replaced" ); - - test->add( BOOST_TEST_CASE( &boost::replaced_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/replaced_example.cpp b/libs/range/test/adaptor_test/replaced_example.cpp deleted file mode 100644 index 8e1f11453..000000000 --- a/libs/range/test/adaptor_test/replaced_example.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[replaced_example -#include -#include -#include -#include -#include -#include - -//<- -#include -#include - -#include - -namespace -{ -void replaced_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::adaptors; - using namespace boost::assign; - - std::vector input; - input += 1,2,3,2,5,2,7,2,9; - - boost::copy( - input | replaced(2, 10), - std::ostream_iterator(std::cout, ",")); - -//= return 0; -//=} -//] - std::vector reference; - reference += 1,10,3,10,5,10,7,10,9; - - std::vector test; - boost::push_back(test, input | replaced(2, 10)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.replaced_example" ); - - test->add( BOOST_TEST_CASE( &replaced_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/replaced_if.cpp b/libs/range/test/adaptor_test/replaced_if.cpp deleted file mode 100644 index 0bf227f31..000000000 --- a/libs/range/test/adaptor_test/replaced_if.cpp +++ /dev/null @@ -1,96 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include - -namespace boost -{ - namespace - { - struct if_value_is_one - { - bool operator()(int x) const { return x == 1; } - }; - - template< class Container > - void replaced_if_test_impl( Container& c ) - { - using namespace boost::adaptors; - - if_value_is_one pred; - - const int replacement_value = 0; - - std::vector< int > test_result1; - boost::push_back(test_result1, c | replaced_if(pred, replacement_value)); - - std::vector< int > test_result2; - boost::push_back(test_result2, boost::adaptors::replace_if(c, pred, replacement_value)); - - std::vector< int > reference( c.begin(), c.end() ); - std::replace_if(reference.begin(), reference.end(), pred, replacement_value); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test_result1.begin(), test_result1.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test_result2.begin(), test_result2.end() ); - } - - template< class Container > - void replaced_if_test_impl() - { - using namespace boost::assign; - - Container c; - - // Test empty - replaced_if_test_impl(c); - - // Test one - c += 1; - replaced_if_test_impl(c); - - // Test many - c += 1,1,1,2,2,2,3,3,3,3,3,4,5,6,6,6,7,8,9; - replaced_if_test_impl(c); - } - - void replaced_if_test() - { - replaced_if_test_impl< std::vector< int > >(); - replaced_if_test_impl< std::list< int > >(); - replaced_if_test_impl< std::set< int > >(); - replaced_if_test_impl< std::multiset< int > >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.replaced_if" ); - - test->add( BOOST_TEST_CASE( &boost::replaced_if_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/replaced_if_example.cpp b/libs/range/test/adaptor_test/replaced_if_example.cpp deleted file mode 100644 index 05b5e7804..000000000 --- a/libs/range/test/adaptor_test/replaced_if_example.cpp +++ /dev/null @@ -1,71 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[replaced_if_example -#include -#include -#include -#include -#include -#include - -//<- -#include -#include - -#include - -namespace -{ -//-> -struct is_even -{ - bool operator()(int x) const { return x % 2 == 0; } -}; - -//<- -void replaced_if_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::adaptors; - using namespace boost::assign; - - std::vector input; - input += 1,2,3,4,5,6,7,8,9; - - boost::copy( - input | replaced_if(is_even(), 10), - std::ostream_iterator(std::cout, ",")); - -//= return 0; -//=} -//] - std::vector reference; - reference += 1,10,3,10,5,10,7,10,9; - - std::vector test; - boost::push_back(test, input | replaced_if(is_even(), 10)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.replaced_if_example" ); - - test->add( BOOST_TEST_CASE( &replaced_if_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/reversed.cpp b/libs/range/test/adaptor_test/reversed.cpp deleted file mode 100644 index 6663b368c..000000000 --- a/libs/range/test/adaptor_test/reversed.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include - -namespace boost -{ - template< class Container > - void reversed_test_impl( Container& c ) - { - using namespace boost::adaptors; - - std::vector< int > test_result1; - boost::push_back(test_result1, c | reversed); - - std::vector< int > test_result2; - boost::push_back(test_result2, adaptors::reverse(c)); - - std::vector< int > reference( c.rbegin(), c.rend() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test_result1.begin(), test_result1.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test_result2.begin(), test_result2.end() ); - } - - template< class Container > - void reversed_test_impl() - { - using namespace boost::assign; - - Container c; - - // Test empty - reversed_test_impl(c); - - // Test one - c += 1; - reversed_test_impl(c); - - // Test many - c += 1,1,1,2,2,2,2,2,3,3,3,3,3,3,4,5,6,7,8,9; - reversed_test_impl(c); - } - - void reversed_test() - { - reversed_test_impl< std::vector< int > >(); - reversed_test_impl< std::list< int > >(); - reversed_test_impl< std::set< int > >(); - reversed_test_impl< std::multiset< int > >(); - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.reversed" ); - - test->add( BOOST_TEST_CASE( &boost::reversed_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/reversed_example.cpp b/libs/range/test/adaptor_test/reversed_example.cpp deleted file mode 100644 index 585108fc8..000000000 --- a/libs/range/test/adaptor_test/reversed_example.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[reversed_example -#include -#include -#include -#include -#include -#include - -//<- -#include -#include - -#include - -namespace -{ -void reversed_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::adaptors; - using namespace boost::assign; - - std::vector input; - input += 1,2,3,4,5,6,7,8,9; - - boost::copy( - input | reversed, - std::ostream_iterator(std::cout, ",")); - -//= return 0; -//=} -//] - std::vector test; - boost::push_back(test, input | reversed); - - BOOST_CHECK_EQUAL_COLLECTIONS( input.rbegin(), input.rend(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.reversed_example" ); - - test->add( BOOST_TEST_CASE( &reversed_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/sliced.cpp b/libs/range/test/adaptor_test/sliced.cpp deleted file mode 100644 index f2221f660..000000000 --- a/libs/range/test/adaptor_test/sliced.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include - -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void sliced_test_impl( Container& c ) - { - using namespace boost::adaptors; - - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - std::vector< value_t > test_result1; - boost::push_back(test_result1, c | sliced(0u,c.size())); - - BOOST_CHECK_EQUAL_COLLECTIONS( test_result1.begin(), test_result1.end(), - c.begin(), c.end() ); - - std::vector< value_t > test_alt_result1; - boost::push_back(test_alt_result1, adaptors::slice(c, 0u, c.size())); - BOOST_CHECK_EQUAL_COLLECTIONS( test_alt_result1.begin(), test_alt_result1.end(), - c.begin(), c.end() ); - - BOOST_CHECK( boost::empty(c | sliced(0u, 0u)) ); - - const std::size_t half_count = c.size() / 2u; - if (half_count > 0u) - { - std::vector< value_t > test_result2; - boost::push_back(test_result2, c | sliced(0u, half_count)); - - BOOST_CHECK_EQUAL_COLLECTIONS( test_result2.begin(), test_result2.end(), - c.begin(), c.begin() + half_count ); - - std::vector< value_t > test_alt_result2; - boost::push_back(test_alt_result2, adaptors::slice(c, 0u, half_count)); - BOOST_CHECK_EQUAL_COLLECTIONS( test_alt_result2.begin(), test_alt_result2.end(), - c.begin(), c.begin() + half_count ); - } - } - - template< class Container > - void sliced_test_impl() - { - using namespace boost::assign; - - Container c; - - // Test empty - sliced_test_impl(c); - - // Test one element - c += 1; - sliced_test_impl(c); - - // Test many elements - c += 1,1,1,2,2,3,4,5,6,6,6,7,8,9; - sliced_test_impl(c); - } - - void sliced_test() - { - sliced_test_impl< std::vector< int > >(); - sliced_test_impl< std::deque< int > >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.sliced" ); - - test->add( BOOST_TEST_CASE( &boost::sliced_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/sliced_example.cpp b/libs/range/test/adaptor_test/sliced_example.cpp deleted file mode 100644 index 2b1569105..000000000 --- a/libs/range/test/adaptor_test/sliced_example.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[sliced_example -#include -#include -#include -#include -#include -#include - -//<- -#include -#include - -#include - -namespace -{ -void sliced_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::adaptors; - using namespace boost::assign; - - std::vector input; - input += 1,2,3,4,5,6,7,8,9; - - boost::copy( - input | sliced(2, 5), - std::ostream_iterator(std::cout, ",")); - -//= return 0; -//=} -//] - std::vector reference; - reference += 3,4,5; - - std::vector test; - boost::push_back(test, input | sliced(2, 5)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.sliced_example" ); - - test->add( BOOST_TEST_CASE( &sliced_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/strided.cpp b/libs/range/test/adaptor_test/strided.cpp deleted file mode 100644 index 6c8475dd2..000000000 --- a/libs/range/test/adaptor_test/strided.cpp +++ /dev/null @@ -1,313 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -// The strided_defect_Trac5014 test case is a modified version of a test case -// contributed by Michel Morin as part of the trac ticket. -// -// The deque test case has been removed due to erroneous standard library -// implementations causing test failures. -// -#include - -#include -#include -#include - -#include -#include - -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void strided_test_impl( Container& c, int stride_size ) - { - using namespace boost::adaptors; - - // Rationale: - // This requirement was too restrictive. It makes the use of the - // strided adaptor too dangerous, and a simple solution existed - // to make it safe, hence the strided adaptor has been modified - // and this restriction no longer applies. - //BOOST_ASSERT( c.size() % STRIDE_SIZE == 0 ); - - Container reference; - - { - typedef BOOST_DEDUCED_TYPENAME Container::const_iterator - iterator_t BOOST_RANGE_UNUSED; - typedef BOOST_DEDUCED_TYPENAME Container::difference_type - diff_t BOOST_RANGE_UNUSED; - typedef BOOST_DEDUCED_TYPENAME Container::size_type - size_type BOOST_RANGE_UNUSED; - iterator_t it = c.begin(); - - iterator_t last = c.end(); - for (; it != last; ) - { - reference.push_back(*it); - - for (int i = 0; (it != last) && (i < stride_size); ++i) - ++it; - } - } - - Container test; - boost::push_back( test, c | strided(stride_size) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( test.begin(), test.end(), - reference.begin(), reference.end() ); - - Container test2; - boost::push_back( test2, adaptors::stride(c, stride_size) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( test2.begin(), test2.end(), - reference.begin(), reference.end() ); - - // Test the const versions: - const Container& cc = c; - Container test3; - boost::push_back( test3, cc | strided(stride_size) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( test3.begin(), test3.end(), - reference.begin(), reference.end() ); - - Container test4; - boost::push_back( test4, adaptors::stride(cc, stride_size) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( test4.begin(), test4.end(), - reference.begin(), reference.end() ); - } - - template< class Container > - void strided_test_impl(int stride_size) - { - using namespace boost::assign; - - Container c; - - // Test empty - strided_test_impl(c, stride_size); - - // Test two elements - c += 1,2; - strided_test_impl(c, stride_size); - - // Test many elements - c += 1,1,1,2,2,3,4,5,6,6,6,7,8,9; - strided_test_impl(c, stride_size); - - // Test an odd number of elements to determine that the relaxation - // of the requirements has been successful - // Test a sequence of length 1 with a stride of 2 - c.clear(); - c += 1; - strided_test_impl(c, stride_size); - - // Test a sequence of length 2 with a stride of 2 - c.clear(); - c += 1,2; - strided_test_impl(c, stride_size); - - // Test a sequence of length 3 with a stride of 2 - c.clear(); - c += 1,2,3; - strided_test_impl(c, stride_size); - } - - template - void strided_test_zero_stride() - { - Container c; - c.push_back(1); - - typedef boost::strided_range strided_range_t; - strided_range_t rng( boost::adaptors::stride(c, 0) ); - boost::ignore_unused_variable_warning(rng); - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - - typedef BOOST_DEDUCED_TYPENAME boost::iterator_traversal< - BOOST_DEDUCED_TYPENAME Container::const_iterator - >::type container_traversal_tag; - - iter_t first = boost::range_detail::make_begin_strided_iterator( - c, 0, container_traversal_tag()); - - iter_t last = boost::range_detail::make_end_strided_iterator( - c, 0, container_traversal_tag()); - - iter_t it = first; - for (int i = 0; i < 10; ++i, ++it) - { - BOOST_CHECK(it == first); - } - } - - template - void strided_test_impl() - { - strided_test_zero_stride< Container >(); - - const int MAX_STRIDE_SIZE = 10; - for (int stride_size = 1; stride_size <= MAX_STRIDE_SIZE; ++stride_size) - { - strided_test_impl< Container >(stride_size); - } - } - - void strided_test() - { - strided_test_impl< std::vector >(); - strided_test_impl< std::list >(); - } - - void strided_defect_Trac5014() - { - using namespace boost::assign; - - std::vector v; - for (int i = 0; i < 30; ++i) - v.push_back(i); - - std::vector reference; - reference += 0,4,8,12,16,20,24,28; - - std::vector output; - boost::push_back(output, v | boost::adaptors::strided(4)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - output.begin(), output.end() ); - - BOOST_CHECK_EQUAL( output.back(), 28 ); - } - - template - class strided_mock_iterator - : public boost::iterator_adaptor< - strided_mock_iterator - , BaseIterator - , boost::use_default - , Category - > - { - typedef boost::iterator_adaptor< - strided_mock_iterator - , BaseIterator - , boost::use_default - , Category - > super_t; - public: - explicit strided_mock_iterator(BaseIterator it) - : super_t(it) - { - } - - private: - void increment() - { - ++(this->base_reference()); - } - - friend class boost::iterator_core_access; - }; - - template - boost::iterator_range::type, Category> > - as_mock_range(Range& rng) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type range_iter_t; - typedef strided_mock_iterator mock_iter_t; - - return boost::iterator_range( - mock_iter_t(boost::begin(rng)), - mock_iter_t(boost::end(rng))); - } - - void strided_test_traversal() - { - using namespace boost::assign; - - std::vector v; - for (int i = 0; i < 30; ++i) - v.push_back(i); - - std::vector reference; - reference += 0,4,8,12,16,20,24,28; - - std::vector output; - boost::push_back(output, as_mock_range(v) | boost::adaptors::strided(4)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - output.begin(), output.end() ); - - output.clear(); - boost::push_back(output, as_mock_range(v) | boost::adaptors::strided(4)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - output.begin(), output.end() ); - - output.clear(); - boost::push_back(output, as_mock_range(v) | boost::adaptors::strided(4)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - output.begin(), output.end() ); - } - - template - void strided_test_ticket_5236_check_bidirectional(const Range& rng) - { - BOOST_CHECK_EQUAL( boost::distance(rng), 1 ); - BOOST_CHECK_EQUAL( std::distance(boost::begin(rng), boost::prior(boost::end(rng))), 0 ); - } - - template - void strided_test_ticket_5236_check(const Range& rng) - { - strided_test_ticket_5236_check_bidirectional(rng); - - typename boost::range_iterator::type it = boost::end(rng); - it = it - 1; - BOOST_CHECK_EQUAL( std::distance(boost::begin(rng), it), 0 ); - } - - void strided_test_ticket_5236() - { - std::vector v; - v.push_back(1); - strided_test_ticket_5236_check( v | boost::adaptors::strided(2) ); - - // Ensure that there is consistency between the random-access implementation - // and the bidirectional. - - std::list l; - l.push_back(1); - strided_test_ticket_5236_check_bidirectional( l | boost::adaptors::strided(2) ); - } - - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.strided" ); - - test->add( BOOST_TEST_CASE( &boost::strided_test ) ); - test->add( BOOST_TEST_CASE( &boost::strided_defect_Trac5014 ) ); - test->add( BOOST_TEST_CASE( &boost::strided_test_traversal ) ); - test->add( BOOST_TEST_CASE( &boost::strided_test_ticket_5236 ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/strided2.cpp b/libs/range/test/adaptor_test/strided2.cpp deleted file mode 100644 index 4ac91f50d..000000000 --- a/libs/range/test/adaptor_test/strided2.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// - -// This test was added due to a report that the Range Adaptors: -// 1. Caused havoc when using namespace boost::adaptors was used -// 2. Did not work with non-member functions -// 3. The strided adaptor could not be composed with sliced -// -// None of these issues could be reproduced on GCC 4.4, but this -// work makes for useful additional test coverage since this -// uses chaining of adaptors and non-member functions whereas -// most of the tests avoid this use case. - -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include - -namespace boost -{ - namespace - { - int times_two(int x) { return x * 2; } - - void strided_test2() - { - using namespace boost::adaptors; - using namespace boost::assign; - std::vector v; - boost::push_back(v, boost::irange(0,10)); - std::vector z; - boost::push_back(z, v | sliced(2,6) | strided(2) | transformed(×_two)); - std::vector reference; - reference += 4,8; - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - z.begin(), z.end() ); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.strided2" ); - - test->add( BOOST_TEST_CASE( &boost::strided_test2 ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/strided_example.cpp b/libs/range/test/adaptor_test/strided_example.cpp deleted file mode 100644 index b1f8b4248..000000000 --- a/libs/range/test/adaptor_test/strided_example.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[strided_example -#include -#include -#include -#include -#include -#include - -//<- -#include -#include - -#include - -namespace -{ -void strided_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::adaptors; - using namespace boost::assign; - - std::vector input; - input += 1,2,3,4,5,6,7,8,9,10; - - boost::copy( - input | strided(2), - std::ostream_iterator(std::cout, ",")); - -//= return 0; -//=} -//] - std::vector reference; - reference += 1,3,5,7,9; - - std::vector test; - boost::push_back(test, input | strided(2)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.strided_example" ); - - test->add( BOOST_TEST_CASE( &strided_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/ticket_6742_transformed_c4789_warning.cpp b/libs/range/test/adaptor_test/ticket_6742_transformed_c4789_warning.cpp deleted file mode 100644 index fdd71180c..000000000 --- a/libs/range/test/adaptor_test/ticket_6742_transformed_c4789_warning.cpp +++ /dev/null @@ -1,69 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - struct test_struct - { - double x; - double y; - }; - - struct get_x - { - typedef double result_type; - double operator()(const test_struct& s) const - { - return s.x; - } - }; - - void range_transformed_warning() - { - using namespace boost::phoenix::arg_names; - using namespace boost::adaptors; - - test_struct t; - t.x = 2.0; - t.y = -4.0; - std::vector v(10u, t); - - std::vector output1; - boost::push_back(output1, v | transformed((&arg1)->*& test_struct::x)); - - std::vector output2; - boost::push_back(output2, v | transformed(get_x())); - - BOOST_CHECK_EQUAL_COLLECTIONS( - output1.begin(), output1.end(), - output2.begin(), output2.end()); - } -} // anonymous namespace - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "Range adaptors - transformed warning" ); - - test->add(BOOST_TEST_CASE(&range_transformed_warning)); - - return test; -} diff --git a/libs/range/test/adaptor_test/ticket_8676_sliced_transformed.cpp b/libs/range/test/adaptor_test/ticket_8676_sliced_transformed.cpp deleted file mode 100644 index da0125ecc..000000000 --- a/libs/range/test/adaptor_test/ticket_8676_sliced_transformed.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include -#include -#include -#include -#include - -namespace -{ - struct identity - { - typedef int result_type; - result_type operator()(int i) const { return i; } - }; - - void sliced_and_transformed() - { - using namespace boost::adaptors; - - std::vector input; - for (int i = 0; i < 10; ++i) - input.push_back(i); - - std::vector out1; - boost::push_back(out1, input | sliced(2, 8) - | transformed(identity())); - - std::vector out2; - boost::push_back(out2, input | transformed(identity()) - | sliced(2, 8)); - - BOOST_CHECK_EQUAL_COLLECTIONS(out1.begin(), out1.end(), - out2.begin(), out2.end()); - } -} // anonymous namespace - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "Range adaptors - sliced and transformed" ); - - test->add(BOOST_TEST_CASE(&sliced_and_transformed)); - - return test; -} diff --git a/libs/range/test/adaptor_test/ticket_9519_strided_reversed.cpp b/libs/range/test/adaptor_test/ticket_9519_strided_reversed.cpp deleted file mode 100644 index 0c9159815..000000000 --- a/libs/range/test/adaptor_test/ticket_9519_strided_reversed.cpp +++ /dev/null @@ -1,67 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -// Credit goes to Eric Niebler for providing an example to demonstrate this -// issue. This has been trivially modified to create this test case. -// -#include -#include -#include - -#include -#include - -#include -#include -#include - -namespace boost -{ - namespace - { - -void ticket_9519_strided_reversed_test() -{ - using namespace boost::adaptors; - - std::vector vi; - for (int i = 0; i < 50; ++i) - { - vi.push_back(i); - } - - std::vector output; - boost::push_back(output, vi | strided(3) | reversed); - - std::list reference; - for (int i = 0; i < 50; i += 3) - { - reference.push_front(i); - } - - BOOST_CHECK_EQUAL_COLLECTIONS(output.begin(), output.end(), - reference.begin(), reference.end()); -} - - } // anonymous namespace -} // namespace boost - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( - "RangeTestSuite.adaptor.ticket_9519_strided_reversed"); - - test->add(BOOST_TEST_CASE(&boost::ticket_9519_strided_reversed_test)); - - return test; -} - diff --git a/libs/range/test/adaptor_test/tokenized.cpp b/libs/range/test/adaptor_test/tokenized.cpp deleted file mode 100644 index 8180747cf..000000000 --- a/libs/range/test/adaptor_test/tokenized.cpp +++ /dev/null @@ -1,79 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include - -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Iterator, class Container > - void tokenized_test_impl( Container& c, std::size_t expected_result ) - { - using namespace boost::adaptors; - - std::vector< boost::sub_match< Iterator > > test_result1; - boost::push_back(test_result1, c | tokenized(boost::regex("\\b"))); - - BOOST_CHECK_EQUAL( test_result1.size(), expected_result ); - -// std::vector< boost::sub_match< Iterator > > test_result2; -// boost::push_back(test_result2, adaptors::tokenize(c, boost::regex("\\b"))); - -// BOOST_CHECK_EQUAL( test_result2.size(), expected_result ); - } - - template< class Container1, class Container2 > - void tokenized_test_impl() - { - Container1 c; - Container2& r = c; - - typedef typename boost::range_iterator::type It; - - // Test empty - tokenized_test_impl(r, 0u); - - // Test one element - c = "a"; - tokenized_test_impl(r, 2u); - - // Test many elements - c = "a b c d e f g hijlmnopqrstuvwxyz"; - tokenized_test_impl(r, 16u); - } - - void tokenized_test() - { -// tokenized_test_impl(); - tokenized_test_impl(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.tokenized" ); - - test->add( BOOST_TEST_CASE( &boost::tokenized_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/tokenized_example.cpp b/libs/range/test/adaptor_test/tokenized_example.cpp deleted file mode 100644 index 5f59bb16b..000000000 --- a/libs/range/test/adaptor_test/tokenized_example.cpp +++ /dev/null @@ -1,65 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[tokenized_example -#include -#include -#include -#include -#include -#include - -//<- -#include -#include - -#include - -namespace -{ -void tokenized_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::adaptors; - - typedef boost::sub_match< std::string::iterator > match_type; - - std::string input = " a b c d e f g hijklmnopqrstuvwxyz"; - boost::copy( - input | tokenized(boost::regex("\\w+")), - std::ostream_iterator(std::cout, "\n")); - -//= return 0; -//=} -//] - using namespace boost::assign; - - std::vector reference; - reference += "a","b","c","d","e","f","g","hijklmnopqrstuvwxyz"; - - std::vector test; - boost::push_back(test, input | tokenized(boost::regex("\\w+"))); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.tokenized_example" ); - - test->add( BOOST_TEST_CASE( &tokenized_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/transformed.cpp b/libs/range/test/adaptor_test/transformed.cpp deleted file mode 100644 index adadafc8a..000000000 --- a/libs/range/test/adaptor_test/transformed.cpp +++ /dev/null @@ -1,132 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -namespace boost -{ - namespace - { - struct double_x - { - typedef int result_type; - int operator()(int x) const { return x * 2; } - }; - - struct halve_x - { - typedef int result_type; - int operator()(int x) const { return x / 2; } - }; - - template< class Container, class TransformFn > - void transformed_test_impl_core( Container& c, TransformFn fn ) - { - using namespace boost::adaptors; - - std::vector< int > test_result1; - boost::push_back(test_result1, c | transformed(fn)); - - std::vector< int > test_result2; - boost::push_back(test_result2, adaptors::transform(c, fn)); - - std::vector< int > reference; - std::transform(c.begin(), c.end(), std::back_inserter(reference), fn); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test_result1.begin(), test_result1.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test_result2.begin(), test_result2.end() ); - } - - template< class Container, class TransformFn > - void transformed_test_fn_impl() - { - using namespace boost::assign; - - Container c; - TransformFn fn; - - // Test empty - transformed_test_impl_core(c, fn); - - // Test one element - c += 1; - transformed_test_impl_core(c, fn); - - // Test many elements - c += 1,1,1,2,2,2,2,2,3,4,5,6,7,8,9; - transformed_test_impl_core(c, fn); - } - - template< class Container > - void transformed_test_impl() - { - transformed_test_fn_impl< Container, double_x >(); - transformed_test_fn_impl< Container, halve_x >(); - } - - void transformed_test() - { - transformed_test_impl< std::vector< int > >(); - transformed_test_impl< std::list< int > >(); - transformed_test_impl< std::set< int > >(); - transformed_test_impl< std::multiset< int > >(); - } - - struct foo_bind - { - int foo() const { return 7; } - }; - - void transformed_bind() - { - using namespace boost::adaptors; - - std::vector input(5); - std::vector output; - boost::range::push_back( - output, - input | transformed(boost::bind(&foo_bind::foo, _1))); - - BOOST_CHECK_EQUAL(output.size(), input.size()); - - std::vector reference_output(5, 7); - BOOST_CHECK_EQUAL_COLLECTIONS( - output.begin(), output.end(), - reference_output.begin(), reference_output.end()); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.transformed" ); - - test->add(BOOST_TEST_CASE(&boost::transformed_test)); - test->add(BOOST_TEST_CASE(&boost::transformed_bind)); - - return test; -} diff --git a/libs/range/test/adaptor_test/transformed_example.cpp b/libs/range/test/adaptor_test/transformed_example.cpp deleted file mode 100644 index ff4a689ab..000000000 --- a/libs/range/test/adaptor_test/transformed_example.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[transformed_example -#include -#include -#include -#include -#include -#include - -//<- -#include -#include - -#include - -namespace -{ -//-> -struct double_int -{ - typedef int result_type; - int operator()(int x) const { return x * 2; } -}; - -//<- -void transformed_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::adaptors; - using namespace boost::assign; - - std::vector input; - input += 1,2,3,4,5,6,7,8,9,10; - - boost::copy( - input | transformed(double_int()), - std::ostream_iterator(std::cout, ",")); - -//= return 0; -//=} -//] - std::vector reference; - reference += 2,4,6,8,10,12,14,16,18,20; - - std::vector test; - boost::push_back(test, input | transformed(double_int())); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.transformed_example" ); - - test->add( BOOST_TEST_CASE( &transformed_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/type_erased.cpp b/libs/range/test/adaptor_test/type_erased.cpp deleted file mode 100644 index edea1c46b..000000000 --- a/libs/range/test/adaptor_test/type_erased.cpp +++ /dev/null @@ -1,44 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -#include -#include "type_erased_test.hpp" - -#include - -#include -#include - -namespace boost_range_adaptor_type_erased_test -{ - namespace - { - -void test_type_erased() -{ - test_driver< std::list >(); - test_driver< std::vector >(); - - test_driver< std::list >(); - test_driver< std::vector >(); -} - - } // anonymous namespace -} // namespace boost_range_adaptor_type_erased_test - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("RangeTestSuite.adaptor.type_erased"); - - test->add(BOOST_TEST_CASE( - &boost_range_adaptor_type_erased_test::test_type_erased)); - - return test; -} - diff --git a/libs/range/test/adaptor_test/type_erased_abstract.cpp b/libs/range/test/adaptor_test/type_erased_abstract.cpp deleted file mode 100644 index dd5489051..000000000 --- a/libs/range/test/adaptor_test/type_erased_abstract.cpp +++ /dev/null @@ -1,88 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -#include -#include "type_erased_test.hpp" - -#include - -#include - -namespace boost_range_adaptor_type_erased_test -{ - namespace - { - -class dummy_interface -{ -public: - virtual ~dummy_interface() { } - virtual void test() = 0; -protected: - dummy_interface() { } -private: - dummy_interface(const dummy_interface&); - void operator=(const dummy_interface&); -}; - -class dummy_impl - : public dummy_interface -{ -public: - dummy_impl() { } - dummy_impl(const dummy_impl&) { } - dummy_impl& operator=(const dummy_impl&) { return *this; } - virtual void test() { } -}; - -typedef boost::any_range< - dummy_interface, - boost::random_access_traversal_tag, - dummy_interface&, - std::ptrdiff_t -> any_interface_range; - -struct foo_dummy_interface_fn -{ - void operator()(dummy_interface& iface) - { - iface.test(); - } -}; - -void foo_test_dummy_interface_range(any_interface_range rng) -{ - std::for_each(boost::begin(rng), boost::end(rng), - foo_dummy_interface_fn()); -} - -void test_type_erased_abstract() -{ - std::vector v(10); - - any_interface_range r(v); - - foo_test_dummy_interface_range(r); - - foo_test_dummy_interface_range(any_interface_range(v)); -} - - } // anonymous namespace -} // namespace boost_range_adaptor_type_erased_test - -boost::unit_test::test_suite* -init_unit_test_suite(int, char*[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE("RangeTestSuite.adaptor.type_erased_abstract"); - - test->add( - BOOST_TEST_CASE( - &boost_range_adaptor_type_erased_test::test_type_erased_abstract)); - - return test; -} diff --git a/libs/range/test/adaptor_test/type_erased_bidirectional.cpp b/libs/range/test/adaptor_test/type_erased_bidirectional.cpp deleted file mode 100644 index 3dc86feac..000000000 --- a/libs/range/test/adaptor_test/type_erased_bidirectional.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -#include -#include "type_erased_test.hpp" - -#include - -#include -#include -#include - -namespace boost_range_adaptor_type_erased_test -{ - namespace - { - -void test_bidirectional() -{ - test_type_erased_exercise_buffer_types< - std::list, boost::bidirectional_traversal_tag >(); - - test_type_erased_exercise_buffer_types< - std::deque, boost::bidirectional_traversal_tag >(); - - test_type_erased_exercise_buffer_types< - std::vector, boost::bidirectional_traversal_tag >(); - - test_type_erased_exercise_buffer_types< - std::list, boost::bidirectional_traversal_tag >(); - - test_type_erased_exercise_buffer_types< - std::deque, boost::bidirectional_traversal_tag >(); - - test_type_erased_exercise_buffer_types< - std::vector, boost::bidirectional_traversal_tag >(); -} - - } // anonymous namespace -} // namespace boost_range_adaptor_type_erased_test - -boost::unit_test::test_suite* -init_unit_test_suite(int, char*[]) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("RangeTestSuite.adaptor.type_erased_bidirectional"); - - test->add(BOOST_TEST_CASE( - &boost_range_adaptor_type_erased_test::test_bidirectional)); - - return test; -} - diff --git a/libs/range/test/adaptor_test/type_erased_brackets.cpp b/libs/range/test/adaptor_test/type_erased_brackets.cpp deleted file mode 100644 index 9d5c7dda3..000000000 --- a/libs/range/test/adaptor_test/type_erased_brackets.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -#include -#include "type_erased_test.hpp" - -#include - -#include - -namespace boost_range_adaptor_type_erased_test -{ - namespace - { - -void test_operator_brackets() -{ - typedef boost::adaptors::type_erased<> type_erased_t; - - std::vector c; - for (int i = 0; i < 10; ++i) - c.push_back(i); - - typedef boost::any_range_type_generator< - std::vector >::type any_range_type; - - BOOST_STATIC_ASSERT(( - boost::is_same< - int, - boost::range_value::type - >::value - )); - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::random_access_traversal_tag, - boost::iterator_traversal< - boost::range_iterator::type - >::type - >::value - )); - - any_range_type rng = c | type_erased_t(); - - for (int i = 0; i < 10; ++i) - { - BOOST_CHECK_EQUAL(rng[i], i); - } -} - - } // anonymous namespace -} // namespace boost_range_adaptor_type_erased_test - -boost::unit_test::test_suite* -init_unit_test_suite(int, char*[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE("RangeTestSuite.adaptor.type_erased_brackets"); - - test->add( - BOOST_TEST_CASE( - &boost_range_adaptor_type_erased_test::test_operator_brackets)); - - return test; -} - diff --git a/libs/range/test/adaptor_test/type_erased_example.cpp b/libs/range/test/adaptor_test/type_erased_example.cpp deleted file mode 100644 index f8416ae07..000000000 --- a/libs/range/test/adaptor_test/type_erased_example.cpp +++ /dev/null @@ -1,124 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[type_erased_example -#include -#include -#include -#include -#include -#include -#include -#include -//<- -#include -#include - -namespace -{ - namespace boost_range_test - { - namespace type_erased_example - { -//-> - -// The client interface from an OO perspective merely requires a sequence -// of integers that can be forward traversed -typedef boost::any_range< - int - , boost::forward_traversal_tag - , int - , std::ptrdiff_t -> integer_range; - -namespace server -{ - void display_integers(const integer_range& rng) - { - boost::copy(rng, - std::ostream_iterator(std::cout, ",")); - - std::cout << std::endl; - } -} - -namespace client -{ - void run() - { - using namespace boost::assign; - using namespace boost::adaptors; - - // Under most conditions one would simply use an appropriate - // any_range as a function parameter. The type_erased adaptor - // is often superfluous. However because the type_erased - // adaptor is applied to a range, we can use default template - // arguments that are generated in conjunction with the - // range type to which we are applying the adaptor. - - std::vector input; - input += 1,2,3,4,5; - - // Note that this call is to a non-template function - server::display_integers(input); - - std::list input2; - input2 += 6,7,8,9,10; - - // Note that this call is to the same non-tempate function - server::display_integers(input2); - - input2.clear(); - input2 += 11,12,13,14,15; - - // Calling using the adaptor looks like this: - // Notice that here I have a type_erased that would be a - // bidirectional_traversal_tag, but this is convertible - // to the forward_traversal_tag equivalent hence this - // works. - server::display_integers(input2 | type_erased<>()); - - // However we may simply wish to define an adaptor that - // takes a range and makes it into an appropriate - // forward_traversal any_range... - typedef boost::adaptors::type_erased< - boost::use_default - , boost::forward_traversal_tag - > type_erased_forward; - - // This adaptor can turn other containers with different - // value_types and reference_types into the appropriate - // any_range. - - server::display_integers(input2 | type_erased_forward()); - } -} - -//=int main(int argc, const char* argv[]) -//={ -//= client::run(); -//= return 0; -//=} -//] - - } // namespace type_erased_example - } // namespace boost_range_test -} // anonymous namespace - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.type_erased_example" ); - - test->add( BOOST_TEST_CASE( &boost_range_test::type_erased_example::client::run) ); - - return test; -} diff --git a/libs/range/test/adaptor_test/type_erased_forward.cpp b/libs/range/test/adaptor_test/type_erased_forward.cpp deleted file mode 100644 index 7f6540f7c..000000000 --- a/libs/range/test/adaptor_test/type_erased_forward.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -#include -#include "type_erased_test.hpp" - -#include - -#include -#include -#include - -namespace boost_range_adaptor_type_erased_test -{ - namespace - { - -void test_forward() -{ - test_type_erased_exercise_buffer_types< - std::list, boost::forward_traversal_tag >(); - - test_type_erased_exercise_buffer_types< - std::deque, boost::forward_traversal_tag >(); - - test_type_erased_exercise_buffer_types< - std::vector, boost::forward_traversal_tag >(); - - test_type_erased_exercise_buffer_types< - std::list, boost::forward_traversal_tag >(); - - test_type_erased_exercise_buffer_types< - std::deque, boost::forward_traversal_tag >(); - - test_type_erased_exercise_buffer_types< - std::vector, boost::forward_traversal_tag >(); -} - - } // anonymous namespace -} // namespace boost_range_adaptor_type_erased_test - -boost::unit_test::test_suite* -init_unit_test_suite(int, char*[]) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE( "RangeTestSuite.adaptor.type_erased_forward" ); - - test->add(BOOST_TEST_CASE( - &boost_range_adaptor_type_erased_test::test_forward)); - - return test; -} - diff --git a/libs/range/test/adaptor_test/type_erased_mix_values.cpp b/libs/range/test/adaptor_test/type_erased_mix_values.cpp deleted file mode 100644 index e91644ce4..000000000 --- a/libs/range/test/adaptor_test/type_erased_mix_values.cpp +++ /dev/null @@ -1,94 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -#include -#include "type_erased_test.hpp" - -#include - -#include - -namespace boost_range_adaptor_type_erased_test -{ - namespace - { - -template< - class Traversal - , class ValueType - , class SourceValueType - , class SourceReference - , class TargetValueType - , class TargetReference -> -void mix_values_impl() -{ - typedef std::vector Container; - - typedef typename boost::any_range_type_generator< - Container - , SourceValueType - , Traversal - , SourceReference - >::type source_type; - - typedef typename boost::any_range_type_generator< - Container - , TargetValueType - , Traversal - , TargetReference - >::type target_type; - - Container test_data; - for (int i = 0; i < 10; ++i) - test_data.push_back(i); - - const source_type source_data(test_data); - target_type t1(source_data); - BOOST_CHECK_EQUAL_COLLECTIONS(source_data.begin(), source_data.end(), - t1.begin(), t1.end()); - - target_type t2; - t2 = source_data; - BOOST_CHECK_EQUAL_COLLECTIONS(source_data.begin(), source_data.end(), - t2.begin(), t2.end()); -} - -template -void mix_values_driver() -{ - mix_values_impl< - Traversal, - MockType, - MockType2, const MockType&, - MockType, const MockType& - >(); -} - -void mix_values() -{ - mix_values_driver(); - mix_values_driver(); - mix_values_driver(); - mix_values_driver(); -} - - } // anonymous namespace -} // namespace boost_range_adaptor_type_erased_test - -boost::unit_test::test_suite* -init_unit_test_suite(int, char*[]) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("RangeTestSuite.adaptor.type_erased_mix_values"); - - test->add(BOOST_TEST_CASE( - &boost_range_adaptor_type_erased_test::mix_values)); - - return test; -} - diff --git a/libs/range/test/adaptor_test/type_erased_random_access.cpp b/libs/range/test/adaptor_test/type_erased_random_access.cpp deleted file mode 100644 index 39cf1c6ed..000000000 --- a/libs/range/test/adaptor_test/type_erased_random_access.cpp +++ /dev/null @@ -1,50 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -#include -#include "type_erased_test.hpp" - -#include - -#include -#include - -namespace boost_range_adaptor_type_erased_test -{ - namespace - { - -void test_random_access() -{ - test_type_erased_exercise_buffer_types< - std::deque, boost::random_access_traversal_tag >(); - - test_type_erased_exercise_buffer_types< - std::vector, boost::random_access_traversal_tag >(); - - test_type_erased_exercise_buffer_types< - std::deque, boost::random_access_traversal_tag >(); - - test_type_erased_exercise_buffer_types< - std::vector, boost::random_access_traversal_tag >(); -} - - } // anonymous namespace -} // namespace boost_range_adaptor_type_erased_test - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("RangeTestSuite.adaptor.type_erased_random_access"); - - test->add(BOOST_TEST_CASE( - &boost_range_adaptor_type_erased_test::test_random_access)); - - return test; -} - diff --git a/libs/range/test/adaptor_test/type_erased_single_pass.cpp b/libs/range/test/adaptor_test/type_erased_single_pass.cpp deleted file mode 100644 index ad0c4ae11..000000000 --- a/libs/range/test/adaptor_test/type_erased_single_pass.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -#include -#include "type_erased_test.hpp" - -#include - -#include -#include -#include - -namespace boost_range_adaptor_type_erased_test -{ - namespace - { - -void test_single_pass() -{ - test_type_erased_exercise_buffer_types< - std::list, boost::single_pass_traversal_tag>(); - - test_type_erased_exercise_buffer_types< - std::deque, boost::single_pass_traversal_tag>(); - - test_type_erased_exercise_buffer_types< - std::vector, boost::single_pass_traversal_tag>(); - - test_type_erased_exercise_buffer_types< - std::list, boost::single_pass_traversal_tag>(); - - test_type_erased_exercise_buffer_types< - std::deque, boost::single_pass_traversal_tag>(); - - test_type_erased_exercise_buffer_types< - std::vector, boost::single_pass_traversal_tag>(); -} - - } // anonymous namespace -} // namespace boost_range_adaptor_type_erased_test - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("RangeTestSuite.adaptor.type_erased_single_pass"); - - test->add(BOOST_TEST_CASE( - &boost_range_adaptor_type_erased_test::test_single_pass)); - - return test; -} - diff --git a/libs/range/test/adaptor_test/type_erased_test.hpp b/libs/range/test/adaptor_test/type_erased_test.hpp deleted file mode 100644 index 9a42e81d2..000000000 --- a/libs/range/test/adaptor_test/type_erased_test.hpp +++ /dev/null @@ -1,289 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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_RANGE_ADAPTOR_TEST_TYPE_ERASED_TEST_HPP -#define BOOST_RANGE_ADAPTOR_TEST_TYPE_ERASED_TEST_HPP - -#include -#include -#include -#include - -namespace boost_range_adaptor_type_erased_test -{ - -class MockType -{ -public: - MockType() - : m_x(0) - { - } - - MockType(boost::int32_t x) - : m_x(x) - { - } - - boost::int32_t get() const { return m_x; } - - inline bool operator==(const MockType& other) const - { - return m_x == other.m_x; - } - - inline bool operator!=(const MockType& other) const - { - return m_x != other.m_x; - } - -private: - boost::int32_t m_x; -}; - -class MockType2 : public MockType -{ -public: - MockType2() {} - MockType2(boost::int32_t x) : MockType(x) { } - MockType2(const MockType& other) : MockType(other) { } -}; - -inline std::ostream& operator<<(std::ostream& out, const MockType& obj) -{ - out << obj.get(); - return out; -} - -template -void test_type_erased_impl(Container& c) -{ - using namespace boost::adaptors; - typedef typename boost::range_value::type value_type; - typedef typename boost::adaptors::type_erased<> type_erased_t; - - - std::vector output; - - boost::push_back(output, boost::adaptors::type_erase(c, type_erased_t())); - - BOOST_CHECK_EQUAL_COLLECTIONS( output.begin(), output.end(), - c.begin(), c.end() ); - - output.clear(); - boost::push_back(output, c | type_erased_t()); - - BOOST_CHECK_EQUAL_COLLECTIONS( output.begin(), output.end(), - c.begin(), c.end() ); -} - -template -void test_const_and_mutable(Container& c) -{ - test_type_erased_impl(c); - - const Container& const_c = c; - test_type_erased_impl(const_c); -} - -template -void test_driver() -{ - using namespace boost::assign; - - typedef typename boost::range_value::type value_type; - - Container c; - test_const_and_mutable(c); - - c += value_type(1); - test_const_and_mutable(c); - - c += value_type(2); - test_const_and_mutable(c); -} - -template< - class Traversal - , class Container -> -void test_writeable(Container&, boost::single_pass_traversal_tag) -{} - -template< - class Traversal - , class Container -> -void test_writeable(Container& source, boost::forward_traversal_tag) -{ - using namespace boost::adaptors; - - typedef typename boost::range_value::type value_type; - typedef typename boost::range_difference::type difference_type; - typedef typename boost::range_reference::type mutable_reference_type; - typedef boost::any_range< - value_type - , Traversal - , mutable_reference_type - , difference_type - > mutable_any_range; - - mutable_any_range r = source | boost::adaptors::type_erased<>(); - std::vector output_test; - boost::fill(r, value_type(1)); - BOOST_CHECK_EQUAL( boost::distance(r), boost::distance(source) ); - std::vector reference_output(source.size(), value_type(1)); - BOOST_CHECK_EQUAL_COLLECTIONS( reference_output.begin(), reference_output.end(), - r.begin(), r.end() ); - -} - -template< - class Container - , class Traversal - , class Buffer -> -void test_type_erased_impl() -{ - using namespace boost::adaptors; - - typedef typename boost::range_value::type value_type; - - typedef typename boost::any_range_type_generator< - Container - , boost::use_default - , Traversal - , boost::use_default - , boost::use_default - , Buffer - >::type mutable_any_range; - - typedef typename boost::any_range_type_generator< - const Container - , boost::use_default - , Traversal - , boost::use_default - , boost::use_default - , Buffer - >::type const_any_range; - - typedef boost::adaptors::type_erased< - boost::use_default - , Traversal - , boost::use_default - , boost::use_default - , Buffer - > type_erased_t; - - Container source; - for (int i = 0; i < 10; ++i) - source.push_back(value_type(i)); - - mutable_any_range r(source); - BOOST_CHECK_EQUAL_COLLECTIONS( source.begin(), source.end(), - r.begin(), r.end() ); - - r = mutable_any_range(); - BOOST_CHECK_EQUAL( r.empty(), true ); - - r = source | type_erased_t(); - BOOST_CHECK_EQUAL_COLLECTIONS( source.begin(), source.end(), - r.begin(), r.end() ); - r = mutable_any_range(); - - r = boost::adaptors::type_erase(source, type_erased_t()); - BOOST_CHECK_EQUAL_COLLECTIONS( source.begin(), source.end(), - r.begin(), r.end() ); - r = mutable_any_range(); - - test_writeable(source, Traversal()); - - // convert and construct a const any_range from a mutable source - // range - const_any_range cr(source); - BOOST_CHECK_EQUAL_COLLECTIONS( source.begin(), source.end(), - cr.begin(), cr.end() ); - // assign an empty range and ensure that this correctly results - // in an empty range. This is important for the validity of - // the rest of the tests. - cr = const_any_range(); - BOOST_CHECK_EQUAL( cr.empty(), true ); - - // Test the pipe type_erased adaptor from a constant source - // range to a constant any_range - const Container& const_source = source; - cr = const_any_range(); - cr = const_source | type_erased_t(); - BOOST_CHECK_EQUAL_COLLECTIONS( const_source.begin(), const_source.end(), - cr.begin(), cr.end() ); - - // Test the pipe type erased adaptor from a mutable source - // range to a constant any_range - cr = const_any_range(); - cr = source | type_erased_t(); - BOOST_CHECK_EQUAL_COLLECTIONS( source.begin(), source.end(), - cr.begin(), cr.end() ); - - // Use the function form of the type_erase adaptor from a constant - // source range - cr = const_any_range(); - cr = boost::adaptors::type_erase(const_source, type_erased_t()); - BOOST_CHECK_EQUAL_COLLECTIONS( const_source.begin(), const_source.end(), - cr.begin(), cr.end() ); - - // Assignment from mutable to const... - cr = const_any_range(); - cr = r; - BOOST_CHECK_EQUAL_COLLECTIONS( cr.begin(), cr.end(), - r.begin(), r.end() ); - - // Converting copy from mutable to const... - cr = const_any_range(); - cr = const_any_range(r); - BOOST_CHECK_EQUAL_COLLECTIONS( cr.begin(), cr.end(), - r.begin(), r.end() ); -} - -template< - class Container - , class Traversal - , class Buffer -> -class test_type_erased_impl_fn -{ -public: - typedef void result_type; - void operator()() - { - test_type_erased_impl< Container, Traversal, Buffer >(); - } -}; - -template< - class Container - , class Traversal -> -void test_type_erased_exercise_buffer_types() -{ - using boost::any_iterator_default_buffer; - using boost::any_iterator_buffer; - using boost::any_iterator_heap_only_buffer; - using boost::any_iterator_stack_only_buffer; - - test_type_erased_impl_fn< Container, Traversal, any_iterator_default_buffer >()(); - test_type_erased_impl_fn< Container, Traversal, any_iterator_heap_only_buffer >()(); - test_type_erased_impl_fn< Container, Traversal, any_iterator_buffer<1> >()(); - test_type_erased_impl_fn< Container, Traversal, any_iterator_buffer<2> >()(); - test_type_erased_impl_fn< Container, Traversal, any_iterator_buffer<32> >()(); - test_type_erased_impl_fn< Container, Traversal, any_iterator_buffer<64> >()(); - test_type_erased_impl_fn< Container, Traversal, any_iterator_buffer<128> >()(); - test_type_erased_impl_fn< Container, Traversal, any_iterator_stack_only_buffer<128> >()(); -} - -} // namespace boost_range_adaptor_type_erased_test - -#endif // include guard diff --git a/libs/range/test/adaptor_test/type_erased_tparam_conv.cpp b/libs/range/test/adaptor_test/type_erased_tparam_conv.cpp deleted file mode 100644 index e235ab30f..000000000 --- a/libs/range/test/adaptor_test/type_erased_tparam_conv.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -#include -#include "type_erased_test.hpp" - -#include - -#include -#include - -namespace boost_range_adaptor_type_erased_test -{ - namespace - { - -void template_parameter_conversion() -{ - typedef boost::any_range< - int - , boost::random_access_traversal_tag - , int& - , std::ptrdiff_t - > source_range_type; - - typedef boost::any_range< - int - , boost::single_pass_traversal_tag - , const int& - , std::ptrdiff_t - > target_range_type; - - source_range_type source; - - // Converting via construction - target_range_type t1(source); - - // Converting via assignment - target_range_type t2; - t2 = source; - - // Converting via construction to a type with a reference type - // that is a value - typedef boost::any_range< - int - , boost::single_pass_traversal_tag - , int - , std::ptrdiff_t - > target_range2_type; - - target_range2_type t3(source); - target_range2_type t4; - t4 = source; -} - - } // anonymous namespace -} // namespace boost_range_adaptor_type_erased_test - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("RangeTestSuite.adaptor.type_erased_tparam_conv"); - - test->add(BOOST_TEST_CASE( - &boost_range_adaptor_type_erased_test::template_parameter_conversion)); - - return test; -} - diff --git a/libs/range/test/adaptor_test/uniqued.cpp b/libs/range/test/adaptor_test/uniqued.cpp deleted file mode 100644 index fdf5454a7..000000000 --- a/libs/range/test/adaptor_test/uniqued.cpp +++ /dev/null @@ -1,168 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void uniqued_test_impl( Container& c ) - { - using namespace boost::adaptors; - - std::vector< int > test_result1; - boost::push_back(test_result1, c | uniqued); - - std::vector< int > test_result2; - boost::push_back(test_result2, adaptors::unique(c)); - - std::vector< int > reference(c.begin(), c.end()); - reference.erase( - std::unique(reference.begin(), reference.end()), - reference.end()); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test_result1.begin(), test_result1.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test_result2.begin(), test_result2.end() ); - } - - template< class Container > - void uniqued_test_impl() - { - using namespace boost::assign; - - Container c; - - // Test empty - uniqued_test_impl(c); - - // Test one - c += 1; - uniqued_test_impl(c); - - // Test many - c += 1,1,1,2,2,2,2,2,3,3,3,3,4,5,6,6,6,7,7,7,8,8,9,9,9,9,9,10; - uniqued_test_impl(c); - } - - void uniqued_test() - { - uniqued_test_impl< std::vector< int > >(); - uniqued_test_impl< std::list< int > >(); - uniqued_test_impl< std::set< int > >(); - uniqued_test_impl< std::multiset< int > >(); - } - -class istring -{ -public: - istring() - : m_value("") - { - } - - explicit istring(const char* value) - : m_value(value) - { - } - - bool operator==(istring r) const - { - return boost::iequals(m_value, r.m_value); - } - - bool operator!=(istring r) const - { - return !operator==(r); - } - - inline friend std::ostream& operator<<(std::ostream& out, istring o) - { - return out << o.m_value; - } - - const char* get() const { return m_value; } - -private: - const char* m_value; -}; - -struct istring_to_string -{ - typedef std::string result_type; - - std::string operator()(istring s) const - { - return s.get(); - } -}; - -// This is based on a test-case provided by Eric Neibler. -void uniqued_return_first() -{ - using namespace boost::adaptors; - - std::vector strs; - strs.push_back(istring("hello")); - strs.push_back(istring("hElLo")); - strs.push_back(istring("HELLO")); - strs.push_back(istring("ZZZZ")); - - std::vector output1; - - boost::unique_copy(strs, std::back_inserter(output1)); - - std::vector output2; - boost::push_back(output2, strs | uniqued); - - std::vector test1; - boost::push_back(test1, output1 | transformed(istring_to_string())); - - std::vector test2; - boost::push_back(test2, output2 | transformed(istring_to_string())); - - BOOST_CHECK_EQUAL_COLLECTIONS(test1.begin(), test1.end(), - test2.begin(), test2.end()); -} - - } // anonymous namespace -} // namespace boost - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.uniqued" ); - - test->add( BOOST_TEST_CASE( &boost::uniqued_test ) ); - - test->add(BOOST_TEST_CASE(&boost::uniqued_return_first)); - - return test; -} diff --git a/libs/range/test/adaptor_test/uniqued_example.cpp b/libs/range/test/adaptor_test/uniqued_example.cpp deleted file mode 100644 index cf1407a79..000000000 --- a/libs/range/test/adaptor_test/uniqued_example.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -//[uniqued_example -#include -#include -#include -#include -#include -#include - -//<- -#include - -#include -#include - -namespace -{ -void uniqued_example_test() -//-> -//=int main(int argc, const char* argv[]) -{ - using namespace boost::assign; - using namespace boost::adaptors; - - std::vector input; - input += 1,1,2,2,2,3,4,5,6; - - boost::copy( - input | uniqued, - std::ostream_iterator(std::cout, ",")); - -//= return 0; -//=} -//] - std::vector reference; - reference += 1,2,3,4,5,6; - - std::vector test; - boost::push_back( test, input | uniqued ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); -} -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.uniqued_example" ); - - test->add( BOOST_TEST_CASE( &uniqued_example_test ) ); - - return test; -} diff --git a/libs/range/test/adaptors.cpp b/libs/range/test/adaptors.cpp deleted file mode 100644 index ea0f5036e..000000000 --- a/libs/range/test/adaptors.cpp +++ /dev/null @@ -1,236 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2006. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -template< class T > -struct less_than -{ - T val; - - less_than() : val(0) - {} - - less_than( T t ) : val(t) - {} - - bool operator()( const T& r ) const - { - return r < val; - } -}; - - - -template< class T > -struct multiply -{ - T val; - - typedef T& result_type; - - multiply( T t ) : val(t) - { } - - T& operator()( T& r ) const - { - return r *= 2; - } -}; - - - -template< class Rng > -void check_copy( Rng r ) -{ - // - // Make sure the generated iterators - // can actually be copied - // - Rng r2 = r; - r2 = r; -} - - -template< class Rng > -void check_direct() -{ - using namespace boost::adaptors; - - Rng rng = boost::assign::list_of(1)(2)(3)(4)(5).to_container( rng ); - Rng out; - - // - // test each alphabetically - // - BOOST_FOREACH( int i, rng | filtered( less_than(4) ) - /*| reversed*/ - | transformed( multiply(2) ) ) - { - out.push_back( i ); - } - - BOOST_CHECK_EQUAL( out.size(), 3u ); - BOOST_CHECK_EQUAL( *out.begin(), 2 ); - BOOST_CHECK_EQUAL( *boost::next(out.begin()), 4 ); - BOOST_CHECK_EQUAL( *boost::next(out.begin(),2), 6 ); - - rng = boost::assign::list_of(1)(1)(2)(2)(3)(3)(4)(5).to_container( rng ); - out.clear(); - /* - BOOST_FOREACH( int i, rng | adjacent_filtered( std::equal_to() ) - | uniqued ) - { - - out.push_back( i ); - }*/ - -} - - -template< class IndirectRng > -void check_indirect() -{ - using namespace boost::adaptors; - - IndirectRng rng; - - std::vector< boost::shared_ptr< int > > holder; - - for( unsigned i = 0u; i != 20u; ++i ) - { - boost::shared_ptr v(new int(i)); - rng.push_back( v.get() ); - } - - BOOST_FOREACH( int& i, rng | indirected | reversed - | transformed( multiply(2) ) ) - { - i += 1; - } - - - -} - - - -template< class RandomAccessRng > -void check_random_access() -{ - using namespace boost::adaptors; - - RandomAccessRng rng(1, 20u); - RandomAccessRng out; - - BOOST_FOREACH( int i, rng | reversed - | transformed( multiply(2) ) - /* | sliced(0,15) */ ) - { - out.push_back( i ); - } - - - BOOST_FOREACH( int i, rng | copied(3u,13u) ) - { - out.push_back( i ); - } -} - - - -template< class Map > -void check_map() -{ - using namespace boost::adaptors; - - Map m; - m.insert( std::make_pair(1,2) ); - m.insert( std::make_pair(2,2) ); - m.insert( std::make_pair(3,2) ); - m.insert( std::make_pair(4,2) ); - m.insert( std::make_pair(5,2) ); - m.insert( std::make_pair(6,2) ); - m.insert( std::make_pair(7,2) ); - - std::vector keys - = boost::copy_range< std::vector >( m | map_keys ); - std::vector values - = boost::copy_range< std::vector >( m | map_values ); -} - - - -void check_regex() -{ - using namespace boost::adaptors; - std::string s("This is a string of tokens"); - std::vector tokens = - boost::copy_range< std::vector >( s | tokenized( "\\s+", -1 ) ); -} - - -void check_adaptors() -{ - check_direct< std::vector >(); - check_direct< std::list >(); - check_indirect< std::vector >(); - check_indirect< std::list >(); - - check_map< std::map >(); -// check_random_access< std::vector >(); - check_regex(); - - using namespace boost::adaptors; - std::vector vec(10u,20); - std::vector pvec; - std::map map; - - check_copy( vec | adjacent_filtered( std::equal_to() ) ); - // check_copy( vec | indexed ); - check_copy( vec | reversed ); - check_copy( vec | uniqued ); - check_copy( pvec | indirected ); - -// check_copy( vec | sliced(1,5) ); - // - // This does not return an iterator_range<>, so - // won't pass this test of implicit conversion - // check_copy( vec | copied(1,5) ); - // - check_copy( map | map_values ); - check_copy( map | map_keys ); - check_copy( std::string( "a string" ) | tokenized( "\\s+", -1 ) ); - check_copy( vec | filtered( less_than(2) ) ); - check_copy( vec | transformed( multiply(2) ) ); -} - -using boost::unit_test::test_suite; - -test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - using namespace boost; - - test_suite* test = BOOST_TEST_SUITE( "Range Test Suite - Adaptors" ); - - test->add( BOOST_TEST_CASE( &check_adaptors ) ); - - return test; -} - - diff --git a/libs/range/test/adl_conformance.cpp b/libs/range/test/adl_conformance.cpp deleted file mode 100644 index 8bae491be..000000000 --- a/libs/range/test/adl_conformance.cpp +++ /dev/null @@ -1,188 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include - -enum adl_types -{ - unused, - boost_namespace, - templated_namespace, - non_templated_namespace, - global_namespace -}; - -// Use boost_test rather than boost as the namespace for this test -// to allow the test framework to use boost::begin() etc. without -// violating the One Defintion Rule. -namespace boost_test -{ - namespace range_detail - { - template< class Range > - inline typename Range::iterator begin( Range& r ) - { - return boost_namespace; - } - - template< class Range > - inline typename Range::iterator begin( const Range& r ) - { - return boost_namespace; - } - - } - - template< class Range > - inline typename Range::iterator begin( Range& r ) - { - using range_detail::begin; // create ADL hook - return begin( r ); - } - - template< class Range > - inline typename Range::iterator begin( const Range& r ) - { - using range_detail::begin; // create ADL hook - return begin( r ); - } -} // 'boost_test' - - -namespace find_templated -{ - template< class T > - struct range - { - typedef adl_types iterator; - - range() { /* allow const objects */ } - iterator begin() { return unused; } - iterator begin() const { return unused; } - iterator end() { return unused; } - iterator end() const { return unused; } - }; - - // - // A fully generic version here will create - // ambiguity. - // - template< class T > - inline typename range::iterator begin( range& r ) - { - return templated_namespace; - } - - template< class T > - inline typename range::iterator begin( const range& r ) - { - return templated_namespace; - } - -} - -namespace find_non_templated -{ - struct range - { - typedef adl_types iterator; - - range() { /* allow const objects */ } - iterator begin() { return unused; } - iterator begin() const { return unused; } - iterator end() { return unused; } - iterator end() const { return unused; } - }; - - inline range::iterator begin( range& r ) - { - return non_templated_namespace; - } - - - inline range::iterator begin( const range& r ) - { - return non_templated_namespace; - } -} - -struct range -{ - typedef adl_types iterator; - - range() { /* allow const objects */ } - iterator begin() { return unused; } - iterator begin() const { return unused; } - iterator end() { return unused; } - iterator end() const { return unused; } -}; - -inline range::iterator begin( range& r ) -{ - return global_namespace; -} - -inline range::iterator begin( const range& r ) -{ - return global_namespace; -} - -void check_adl_conformance() -{ - find_templated::range r; - const find_templated::range r2; - find_non_templated::range r3; - const find_non_templated::range r4; - range r5; - const range r6; - - // - // Notice how ADL kicks in even when we have qualified - // notation! - // - - - BOOST_CHECK( boost_test::begin( r ) != boost_namespace ); - BOOST_CHECK( boost_test::begin( r2 ) != boost_namespace ); - BOOST_CHECK( boost_test::begin( r3 ) != boost_namespace ); - BOOST_CHECK( boost_test::begin( r4 ) != boost_namespace ); - BOOST_CHECK( boost_test::begin( r5 ) != boost_namespace ); - BOOST_CHECK( boost_test::begin( r6 ) != boost_namespace ); - - BOOST_CHECK_EQUAL( boost_test::begin( r ), templated_namespace ) ; - BOOST_CHECK_EQUAL( boost_test::begin( r2 ), templated_namespace ); - BOOST_CHECK_EQUAL( boost_test::begin( r3 ), non_templated_namespace ); - BOOST_CHECK_EQUAL( boost_test::begin( r4 ), non_templated_namespace ); - BOOST_CHECK_EQUAL( boost_test::begin( r5 ), global_namespace ); - BOOST_CHECK_EQUAL( boost_test::begin( r6 ), global_namespace ); -} - -#include - -using boost::unit_test::test_suite; - -test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add( BOOST_TEST_CASE( &check_adl_conformance ) ); - - return test; -} - - diff --git a/libs/range/test/adl_conformance_no_using.cpp b/libs/range/test/adl_conformance_no_using.cpp deleted file mode 100644 index 82c1cd2e3..000000000 --- a/libs/range/test/adl_conformance_no_using.cpp +++ /dev/null @@ -1,110 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include - -namespace A -{ - namespace detail - { - template< typename T > - int f( const T& x ) - { - // Default: - std::cout << 1 << std::endl; - return 1; - } - - template< typename T > - int adl_f2( const T& x, int* ) - { - return f( x ); - } - - template< typename T > - int adl_f( const T& x ) - { - return adl_f2( x, 0 ); - } - } - - template< typename T > - int f( const T& x ) - { - return detail::adl_f( x ); - } - - template< typename T > - int adl_f2( const T& x, int ) - { - return detail::f( x ); - } - - //-------------------------------- - - class C {}; -/* - // Optional: - int f( const C& x ) - { - std::cout << 2 << std::endl; - } -*/ - template< typename T > - class D {}; -/* - // Optional: - template< typename T > - int f( const D< T >& x ) - { - std::cout << 3 << std::endl; - } - */ -} - - -namespace B -{ - class C {}; - - // Optional: -/* int f( const C& ) - { - std::cout << 4 << std::endl; - } -*/ - template< typename T > - class D {}; -/* - // Optional: - template< typename T > - int f( const D< T >& x ) - { - std::cout << 5 << std::endl; - } - */ -} - -int main() -{ - A::f( 42 ); - - A::C ac; - A::f( ac ); - - A::D< int > ad; - A::f( ad ); - - B::C bc; - A::f( bc ); - - B::D< int > bd; - A::f( bd ); -} diff --git a/libs/range/test/algorithm.cpp b/libs/range/test/algorithm.cpp deleted file mode 100644 index ebe0496e4..000000000 --- a/libs/range/test/algorithm.cpp +++ /dev/null @@ -1,479 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2006. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// -// (C) Copyright Eric Niebler 2004. -// 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) - -/* - Revision history: - 13 December 2004 : Initial version. -*/ - -#ifdef _MSC_VER -// The 'secure' library warnings produce so much noise that it makes it -// impossible to see more useful warnings. - #define _SCL_SECURE_NO_WARNINGS -#endif - -#ifdef _MSC_VER - // counting_iterator generates a warning about truncating an integer - #pragma warning(push) - #pragma warning(disable : 4244) -#endif -#include -#ifdef _MSC_VER - template ::boost::counting_iterator; - #pragma warning(pop) -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -/////////////////////////////////////////////////////////////////////////////// -// dummy function object, used with algorithms -// -struct null_fun -{ - template - void operator()(T const &t) const - { - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// dummy predicate, used with algorithms -// -struct null_pred -{ - template - bool operator()(T const &t) const - { - return t == T(); - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// dummy unary op, used with algorithms -// -struct null_op1 -{ - template - T const & operator()(T const & t) const - { - return t; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// dummy binary op, used with algorithms -// -struct null_op2 -{ - template - T const & operator()(T const & t, U const & u) const - { - return t; - } -}; - -template -void test_random_algorithms(Rng & rng, std::random_access_iterator_tag) -{ - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iterator; - - typedef BOOST_DEDUCED_TYPENAME boost::range_value::type value_type; - - typedef BOOST_DEDUCED_TYPENAME boost::range_size::type - size_type BOOST_RANGE_UNUSED; - - typedef BOOST_DEDUCED_TYPENAME boost::iterator_category::type - iterator_category BOOST_RANGE_UNUSED; - - // just make sure these compile (for now) - if(0) - { - boost::random_shuffle(rng); - - // Must be a value since random_shuffle must take the generator by - // reference to match the standard. - null_op1 rng_generator; - boost::random_shuffle(rng, rng_generator); - - boost::sort(rng); - boost::sort(rng, std::less()); - - boost::stable_sort(rng); - boost::stable_sort(rng, std::less()); - - boost::partial_sort(rng, boost::begin(rng)); - boost::partial_sort(rng, boost::begin(rng), std::less()); - - boost::nth_element(rng, boost::begin(rng)); - boost::nth_element(rng, boost::begin(rng), std::less()); - - boost::push_heap(rng); - boost::push_heap(rng, std::less()); - - boost::pop_heap(rng); - boost::pop_heap(rng, std::less()); - - boost::make_heap(rng); - boost::make_heap(rng, std::less()); - - boost::sort_heap(rng); - boost::sort_heap(rng, std::less()); - } -} - -template -void test_random_algorithms(Rng & rng, std::input_iterator_tag) -{ - // no-op -} - -template -void test_algorithms(Rng & rng) -{ - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iterator; - typedef BOOST_DEDUCED_TYPENAME boost::range_value::type value_type; - typedef BOOST_DEDUCED_TYPENAME boost::range_size::type size_type; - typedef BOOST_DEDUCED_TYPENAME boost::iterator_category::type iterator_category; - - // just make sure these compile (for now) - if(0) - { - value_type val = value_type(); - - value_type rng2[] = {value_type(),value_type(),value_type()}; - typedef value_type* iterator2; - - value_type out[100] = {}; - typedef value_type* out_iterator; - - null_fun f = null_fun(); - iterator i = iterator(); - bool b = bool(); - out_iterator o = out_iterator(); - size_type s = size_type(); - - f = boost::for_each(rng, null_fun()); - - i = boost::find(rng, val); - i = boost::find_if(rng, null_pred()); - - i = boost::find_end(rng, rng2); - i = boost::find_end(rng, rng2, std::equal_to()); - - i = boost::find_first_of(rng, rng2); - i = boost::find_first_of(rng, rng2, std::equal_to()); - - i = boost::adjacent_find(rng); - i = boost::adjacent_find(rng, std::equal_to()); - - s = boost::count(rng, val); - s = boost::count_if(rng, null_pred()); - - std::pair p1; - p1 = boost::mismatch(rng, rng2); - p1 = boost::mismatch(rng, rng2, std::equal_to()); - - b = boost::equal(rng, rng2); - b = boost::equal(rng, rng2, std::equal_to()); - - i = boost::search(rng, rng2); - i = boost::search(rng, rng2, std::equal_to()); - - o = boost::copy(rng, boost::begin(out)); - o = boost::copy_backward(rng, boost::end(out)); - - o = boost::transform(rng, boost::begin(out), null_op1()); - o = boost::transform(rng, rng2, boost::begin(out), null_op2()); - - boost::replace(rng, val, val); - boost::replace_if(rng, null_pred(), val); - -/* - o = boost::replace_copy(rng, boost::begin(out), val, val); - o = boost::replace_copy_if(rng, boost::begin(out), null_pred(), val); -*/ - - boost::fill(rng, val); - // - // size requires RandomAccess - // - //boost::fill_n(rng, boost::size(rng), val); - //boost::fill_n(rng, std::distance(boost::begin(rng),boost::end(rng)),val); - - boost::generate(rng, &std::rand); - // - // size requires RandomAccess - // - //boost::generate_n(rng, boost::size(rng), &std::rand); - //boost::generate_n(rng,std::distance(boost::begin(rng),boost::end(rng)), &std::rand); - - i = boost::remove(rng, val); - i = boost::remove_if(rng, null_pred()); - -/* - o = boost::remove_copy(rng, boost::begin(out), val); - o = boost::remove_copy_if(rng, boost::begin(out), null_pred()); -*/ - - typename boost::range_return::type rrng = boost::unique(rng); - rrng = boost::unique(rng, std::equal_to()); - -/* - o = boost::unique_copy(rng, boost::begin(out)); - o = boost::unique_copy(rng, boost::begin(out), std::equal_to()); -*/ - - boost::reverse(rng); - -/* - o = boost::reverse_copy(rng, boost::begin(out)); -*/ - - boost::rotate(rng, boost::begin(rng)); - -/* - o = boost::rotate_copy(rng, boost::begin(rng), boost::begin(out)); -*/ - - i = boost::partition(rng, null_pred()); - i = boost::stable_partition(rng, null_pred()); - -/* - o = boost::partial_sort_copy(rng, out); - o = boost::partial_sort_copy(rng, out, std::less()); -*/ - - i = boost::lower_bound(rng, val); - i = boost::lower_bound(rng, val, std::less()); - - i = boost::upper_bound(rng, val); - i = boost::upper_bound(rng, val, std::less()); - - std::pair p2; - p2 = boost::equal_range(rng, val); - p2 = boost::equal_range(rng, val, std::less()); - - b = boost::binary_search(rng, val); - b = boost::binary_search(rng, val, std::less()); - - boost::inplace_merge(rng, boost::begin(rng)); - boost::inplace_merge(rng, boost::begin(rng), std::less()); - - b = boost::includes(rng, rng2); - b = boost::includes(rng, rng2, std::equal_to()); - - o = boost::set_union(rng, rng2, boost::begin(out)); - o = boost::set_union(rng, rng2, boost::begin(out), std::equal_to()); - - o = boost::set_intersection(rng, rng2, boost::begin(out)); - o = boost::set_intersection(rng, rng2, boost::begin(out), std::equal_to()); - - o = boost::set_difference(rng, rng2, boost::begin(out)); - o = boost::set_difference(rng, rng2, boost::begin(out), std::equal_to()); - - o = boost::set_symmetric_difference(rng, rng2, boost::begin(out)); - o = boost::set_symmetric_difference(rng, rng2, boost::begin(out), std::equal_to()); - - i = boost::min_element(rng); - i = boost::min_element(rng, std::less()); - - i = boost::max_element(rng); - i = boost::max_element(rng, std::less()); - - b = boost::lexicographical_compare(rng, rng); - b = boost::lexicographical_compare(rng, rng, std::equal_to()); - - b = boost::next_permutation(rng); - b = boost::next_permutation(rng, std::less()); - - b = boost::prev_permutation(rng); - b = boost::prev_permutation(rng, std::less()); - - ///////////////////////////////////////////////////////////////////// - // numeric algorithms - ///////////////////////////////////////////////////////////////////// - - val = boost::accumulate( rng, val ); - val = boost::accumulate( rng, val, null_op2() ); - val = boost::inner_product( rng, rng, val ); - val = boost::inner_product( rng, rng, val, - null_op2(), null_op2() ); - o = boost::partial_sum( rng, boost::begin(out) ); - o = boost::partial_sum( rng, boost::begin(out), null_op2() ); - o = boost::adjacent_difference( rng, boost::begin(out) ); - o = boost::adjacent_difference( rng, boost::begin(out), - null_op2() ); - - boost::ignore_unused_variable_warning(b); - - } - - // test the algorithms that require a random-access range - test_random_algorithms(rng, iterator_category()); -} - -int* addr(int &i) { return &i; } -bool true_(int) { return true; } - -/////////////////////////////////////////////////////////////////////////////// -// test_main -// -void simple_compile_test() -{ - // int_iterator - typedef ::boost::counting_iterator int_iterator; - - // define come containers - std::list my_list(int_iterator(1),int_iterator(6)); - - - std::vector my_vector(int_iterator(1),int_iterator(6)); - - std::pair::iterator,std::vector::iterator> my_pair(my_vector.begin(),my_vector.end()); - - // test the algorithms with list and const list - test_algorithms(my_list); - test_algorithms(my_vector); - test_algorithms(my_pair); - - - std::vector v; - std::vector& cv = v; - - using namespace boost; - -#define BOOST_RANGE_RETURNS_TEST( function_name, cont ) \ - function_name (cont); \ - function_name (cont); \ - function_name (cont); \ - function_name (cont); \ - function_name (cont); \ - function_name (cont); \ - function_name (cont); \ - function_name (cont); \ - function_name (cont); \ - function_name (cont); - - BOOST_RANGE_RETURNS_TEST( adjacent_find, cv ); - BOOST_RANGE_RETURNS_TEST( adjacent_find, v ); - BOOST_RANGE_RETURNS_TEST( max_element, cv ); - BOOST_RANGE_RETURNS_TEST( max_element, v ); - BOOST_RANGE_RETURNS_TEST( min_element, cv ); - BOOST_RANGE_RETURNS_TEST( min_element, v ); - BOOST_RANGE_RETURNS_TEST( unique, v ); -#undef BOOST_RANGE_RETURNS_TEST - -#define BOOST_RANGE_RETURNS_TEST1( function_name, cont, arg1 ) \ - function_name (cont, arg1); \ - function_name (cont, arg1); \ - function_name (cont, arg1); \ - function_name (cont, arg1); \ - function_name (cont, arg1); \ - function_name (cont, arg1); \ - function_name (cont, arg1); \ - function_name (cont, arg1); \ - function_name (cont, arg1); \ - function_name (cont, arg1); - - BOOST_RANGE_RETURNS_TEST1( adjacent_find, cv, std::less() ); - BOOST_RANGE_RETURNS_TEST1( adjacent_find, v, std::less() ); - BOOST_RANGE_RETURNS_TEST1( find, cv, 0 ); - BOOST_RANGE_RETURNS_TEST1( find, v, 0 ); - BOOST_RANGE_RETURNS_TEST1( find_end, cv, cv ); - BOOST_RANGE_RETURNS_TEST1( find_end, cv, v ); - BOOST_RANGE_RETURNS_TEST1( find_end, v, cv ); - BOOST_RANGE_RETURNS_TEST1( find_end, v, v ); - BOOST_RANGE_RETURNS_TEST1( find_first_of, cv, cv ); - BOOST_RANGE_RETURNS_TEST1( find_first_of, cv, v ); - BOOST_RANGE_RETURNS_TEST1( find_first_of, v, cv ); - BOOST_RANGE_RETURNS_TEST1( find_first_of, v, v ); - BOOST_RANGE_RETURNS_TEST1( find_if, cv, std::negate() ); - BOOST_RANGE_RETURNS_TEST1( find_if, v, std::negate() ); - BOOST_RANGE_RETURNS_TEST1( search, cv, cv ); - BOOST_RANGE_RETURNS_TEST1( search, cv, v ); - BOOST_RANGE_RETURNS_TEST1( search, v, cv ); - BOOST_RANGE_RETURNS_TEST1( search, v, v ); - - BOOST_RANGE_RETURNS_TEST1( remove, v, 0 ); - BOOST_RANGE_RETURNS_TEST1( remove_if, v, std::negate() ); - - BOOST_RANGE_RETURNS_TEST1( lower_bound, cv, 0 ); - BOOST_RANGE_RETURNS_TEST1( lower_bound, v, 0 ); - BOOST_RANGE_RETURNS_TEST1( max_element, cv, std::less() ); - BOOST_RANGE_RETURNS_TEST1( max_element, v, std::less() ); - BOOST_RANGE_RETURNS_TEST1( min_element, cv, std::less() ); - BOOST_RANGE_RETURNS_TEST1( min_element, v, std::less() ); - BOOST_RANGE_RETURNS_TEST1( upper_bound, cv, 0 ); - BOOST_RANGE_RETURNS_TEST1( upper_bound, v, 0 ); - BOOST_RANGE_RETURNS_TEST1( partition, cv, std::negate() ); - BOOST_RANGE_RETURNS_TEST1( partition, v, std::negate() ); - BOOST_RANGE_RETURNS_TEST1( stable_partition, cv, std::negate() ); - BOOST_RANGE_RETURNS_TEST1( stable_partition, v, std::negate() ); - -#undef BOOST_RANGE_RETURNS_TEST1 - -#define BOOST_RANGE_RETURNS_TEST2( function_name, arg1, arg2 ) \ - function_name (v, arg1, arg2); \ - function_name (v, arg1, arg2); \ - function_name (v, arg1, arg2); \ - function_name (v, arg1, arg2); \ - function_name (v, arg1, arg2); \ - function_name (v, arg1, arg2); \ - function_name (v, arg1, arg2); \ - function_name (v, arg1, arg2); \ - function_name (v, arg1, arg2); \ - function_name (v, arg1, arg2); - - BOOST_RANGE_RETURNS_TEST2( find_end, v, std::less() ); - BOOST_RANGE_RETURNS_TEST2( find_first_of, v, std::less() ); - BOOST_RANGE_RETURNS_TEST2( search, v, std::less() ); - BOOST_RANGE_RETURNS_TEST2( lower_bound, 0, std::less() ); - BOOST_RANGE_RETURNS_TEST2( upper_bound, 0, std::less() ); - -#undef BOOST_RANGE_RETURNS_TEST2 -} - -using boost::unit_test::test_suite; - -test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - using namespace boost; - - test_suite* test = BOOST_TEST_SUITE( "Range Test Suite - Algorithm" ); - - test->add( BOOST_TEST_CASE( &simple_compile_test ) ); - - return test; -} - diff --git a/libs/range/test/algorithm_example.cpp b/libs/range/test/algorithm_example.cpp deleted file mode 100644 index 80c787540..000000000 --- a/libs/range/test/algorithm_example.cpp +++ /dev/null @@ -1,92 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - // - // example: extracting bounds in a generic algorithm - // - template< typename Range, typename T > - inline typename boost::range_iterator::type - find( Range& c, const T& value ) - { - return std::find( boost::begin( c ), boost::end( c ), value ); - } - - template< typename Range, typename T > - inline typename boost::range_iterator::type - find( const Range& c, const T& value ) - { - return std::find( boost::begin( c ), boost::end( c ), value ); - } - - // - // replace first value and return its index - // - template< class Range, class T > - inline typename boost::range_difference::type - my_generic_replace( Range& c, const T& value, const T& replacement ) - { - typename boost::range_iterator::type found = find( c, value ); - - if( found != boost::end( c ) ) - *found = replacement; - return std::distance( boost::begin( c ), found ); - } -} - - -void check_algorithm() -{ - // - // usage - // - const int N = 5; - std::vector my_vector; - int values[] = { 1,2,3,4,5,6,7,8,9 }; - my_vector.assign( values, values + 9 ); - typedef std::vector::iterator iterator; - std::pair my_view( boost::begin( my_vector ), - boost::begin( my_vector ) + N ); - BOOST_CHECK_EQUAL( my_generic_replace( my_vector, 4, 2 ), 3 ); - BOOST_CHECK_EQUAL( my_generic_replace( my_view, 4, 2 ), N ); - -} - -#include -using boost::unit_test::test_suite; - -test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add( BOOST_TEST_CASE( &check_algorithm ) ); - - return test; -} - - - diff --git a/libs/range/test/algorithm_ext_test/copy_n.cpp b/libs/range/test/algorithm_ext_test/copy_n.cpp deleted file mode 100644 index 854962feb..000000000 --- a/libs/range/test/algorithm_ext_test/copy_n.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include - -namespace -{ - template< class Container > - void test_copy_n_impl() - { - std::vector source; - for (std::size_t i = 0; i < 10; ++i) - source.push_back(i); - - for (std::size_t k = 0; k < 10; ++k) - { - std::vector reference; - for (std::size_t j = 0; j < k; ++j) - reference.push_back(j); - - Container test; - boost::copy_n(source, k, std::back_inserter(test)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - } - } - - void test_copy_n() - { - test_copy_n_impl< std::vector >(); - test_copy_n_impl< std::list >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm_ext.copy_n" ); - - test->add( BOOST_TEST_CASE( &test_copy_n ) ); - - return test; -} diff --git a/libs/range/test/algorithm_ext_test/erase.cpp b/libs/range/test/algorithm_ext_test/erase.cpp deleted file mode 100644 index 3bdf2dab0..000000000 --- a/libs/range/test/algorithm_ext_test/erase.cpp +++ /dev/null @@ -1,128 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include - -namespace -{ - template< class Container > - void test_erase_impl() - { - Container source; - for (int i = 0; i < 10; ++i) - source.push_back(i); - - Container reference(source); - Container test(source); - - typedef BOOST_DEDUCED_TYPENAME Container::iterator iterator_t; - - iterator_t first_ref = reference.begin(); - iterator_t last_ref = reference.end(); - - boost::iterator_range< iterator_t > test_range(test.begin(), test.end()); - - reference.erase(first_ref, last_ref); - boost::erase(test, test_range); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - } - - void test_erase() - { - test_erase_impl >(); - test_erase_impl >(); - } - - template< class Container > - void test_remove_erase_impl() - { - Container source; - for (int i = 0; i < 10; ++i) - source.push_back(i); - - Container reference(source); - Container test(source); - - boost::remove_erase(test, 5); - - reference.erase( std::find(reference.begin(), reference.end(), 5) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - } - - void test_remove_erase() - { - test_remove_erase_impl >(); - test_remove_erase_impl >(); - } - - struct is_even - { - typedef bool result_type; - typedef int argument_type; - bool operator()(int x) const { return x % 2 == 0; } - }; - - template< class Container > - void test_remove_erase_if_impl() - { - Container source; - for (int i = 0; i < 10; ++i) - source.push_back(i); - - Container reference; - typedef BOOST_DEDUCED_TYPENAME Container::const_iterator iterator_t; - iterator_t last_source = source.end(); - is_even pred; - for (iterator_t it_source = source.begin(); it_source != last_source; ++it_source) - { - if (!pred(*it_source)) - reference.push_back(*it_source); - } - - Container test(source); - boost::remove_erase_if(test, is_even()); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - } - - void test_remove_erase_if() - { - test_remove_erase_if_impl >(); - test_remove_erase_if_impl >(); - } - -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm_ext.erase" ); - - test->add( BOOST_TEST_CASE( &test_erase ) ); - test->add( BOOST_TEST_CASE( &test_remove_erase ) ); - test->add( BOOST_TEST_CASE( &test_remove_erase_if ) ); - - return test; -} diff --git a/libs/range/test/algorithm_ext_test/for_each_ext.cpp b/libs/range/test/algorithm_ext_test/for_each_ext.cpp deleted file mode 100644 index 9df16c59f..000000000 --- a/libs/range/test/algorithm_ext_test/for_each_ext.cpp +++ /dev/null @@ -1,98 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include - -namespace -{ - struct MockBinaryFn - { - typedef void result_type; - typedef int first_argument_type; - typedef int second_argument_type; - - void operator()(int x, int y) - { - xs.push_back(x); - ys.push_back(y); - } - - std::vector xs; - std::vector ys; - }; - - template< class Range1, class Range2 > - void test_for_each_impl( Range1& rng1, Range2& rng2 ) - { - MockBinaryFn fn = boost::range::for_each(rng1, rng2, MockBinaryFn()); - - BOOST_CHECK_EQUAL_COLLECTIONS( ::boost::begin(rng1), ::boost::end(rng1), - fn.xs.begin(), fn.xs.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( ::boost::begin(rng2), ::boost::end(rng2), - fn.ys.begin(), fn.ys.end() ); - } - - template< class Collection1, class Collection2 > - void test_for_each_impl(const int max_count) - { - Collection1 c1; - for (int i = 0; i < max_count; ++i) - c1.push_back(i); - - Collection2 c2; - for (int i = 0; i < max_count; ++i) - c2.push_back(i); - - test_for_each_impl(c1, c2); - - const Collection1& const_c1 = c1; - const Collection2& const_c2 = c2; - - test_for_each_impl(c1, const_c2); - test_for_each_impl(const_c1, c2); - test_for_each_impl(const_c1, const_c2); - } - - template< class Collection1, class Collection2 > - void test_for_each_impl() - { - test_for_each_impl< Collection1, Collection2 >(0); - test_for_each_impl< Collection1, Collection2 >(1); - test_for_each_impl< Collection1, Collection2 >(10); - } - - void test_for_each() - { - test_for_each_impl< std::vector, std::vector >(); - test_for_each_impl< std::list, std::list >(); - test_for_each_impl< std::vector, std::list >(); - test_for_each_impl< std::list, std::vector >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm_ext.for_each" ); - - test->add( BOOST_TEST_CASE( &test_for_each ) ); - - return test; -} diff --git a/libs/range/test/algorithm_ext_test/insert.cpp b/libs/range/test/algorithm_ext_test/insert.cpp deleted file mode 100644 index ff1f706a4..000000000 --- a/libs/range/test/algorithm_ext_test/insert.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include - -namespace -{ - template< class Container > - void test_insert_impl( int n ) - { - Container test; - boost::insert( test, test.end(), boost::irange(0, n) ); - - Container reference; - for (int i = 0; i < n; ++i) - reference.push_back(i); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - // Do it again so that we are inserting into a non-empty target - boost::insert( test, test.end(), boost::irange(0, n) ); - - for (int j = 0; j < n; ++j) - reference.push_back(j); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - } - - template< class Container > - void test_insert_impl() - { - test_insert_impl< Container >(0); - test_insert_impl< Container >(1); - test_insert_impl< Container >(2); - test_insert_impl< Container >(100); - } - - void test_insert() - { - test_insert_impl< std::vector >(); - test_insert_impl< std::list >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm_ext.insert" ); - - test->add( BOOST_TEST_CASE( &test_insert ) ); - - return test; -} diff --git a/libs/range/test/algorithm_ext_test/iota.cpp b/libs/range/test/algorithm_ext_test/iota.cpp deleted file mode 100644 index 64d9b0e7a..000000000 --- a/libs/range/test/algorithm_ext_test/iota.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include - -namespace -{ - template< class Container > - void test_iota_impl(std::size_t n) - { - Container test; - test.resize( n ); - boost::iota( test, n ); - - Container reference; - reference.resize( n ); - std::size_t i = n; - typedef BOOST_DEDUCED_TYPENAME Container::iterator iterator_t; - iterator_t last = reference.end(); - for (iterator_t it = reference.begin(); it != last; ++it, ++i) - { - *it = i; - } - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - } - - template< class Container > - void test_iota_impl() - { - test_iota_impl< Container >(0); - test_iota_impl< Container >(1); - test_iota_impl< Container >(2); - test_iota_impl< Container >(100); - } - - void test_iota() - { - test_iota_impl< std::vector >(); - test_iota_impl< std::list >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm_ext.iota" ); - - test->add( BOOST_TEST_CASE( &test_iota ) ); - - return test; -} diff --git a/libs/range/test/algorithm_ext_test/is_sorted.cpp b/libs/range/test/algorithm_ext_test/is_sorted.cpp deleted file mode 100644 index bddc5f89d..000000000 --- a/libs/range/test/algorithm_ext_test/is_sorted.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include - -namespace -{ - template< class Container > - void test_is_sorted_impl() - { - Container ascending; - Container descending; - - // Empty ranges are regarded as sorted against any predicate. - BOOST_CHECK( boost::is_sorted(ascending) ); - BOOST_CHECK( boost::is_sorted(ascending, std::less()) ); - BOOST_CHECK( boost::is_sorted(ascending, std::greater()) ); - - for (std::size_t i = 0; i < 10; ++i) - { - ascending.push_back(i); - descending.push_back(9 - i); - } - - BOOST_CHECK( boost::is_sorted(ascending) ); - BOOST_CHECK( !boost::is_sorted(descending) ); - BOOST_CHECK( !boost::is_sorted(ascending, std::greater()) ); - BOOST_CHECK( boost::is_sorted(descending, std::greater()) ); - } - - void test_is_sorted() - { - test_is_sorted_impl< std::vector >(); - test_is_sorted_impl< std::list >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm_ext.is_sorted" ); - - test->add( BOOST_TEST_CASE( &test_is_sorted ) ); - - return test; -} diff --git a/libs/range/test/algorithm_ext_test/overwrite.cpp b/libs/range/test/algorithm_ext_test/overwrite.cpp deleted file mode 100644 index 0d8604a3f..000000000 --- a/libs/range/test/algorithm_ext_test/overwrite.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include - -namespace -{ - template< class Container > - void test_overwrite_impl(std::size_t n) - { - Container overwrite_source; - for (std::size_t i = 0; i < n; ++i) - overwrite_source.push_back(i); - - Container reference; - reference.resize(n); - std::copy(overwrite_source.begin(), overwrite_source.end(), reference.begin()); - - Container test; - test.resize(n); - boost::overwrite(overwrite_source, test); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - test.clear(); - test.resize(n); - const Container& const_overwrite_source = overwrite_source; - boost::overwrite(const_overwrite_source, test); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - } - - template< class Container > - void test_overwrite_impl() - { - test_overwrite_impl(0); - test_overwrite_impl(1); - test_overwrite_impl(10); - } - - void test_overwrite() - { - test_overwrite_impl< std::vector >(); - test_overwrite_impl< std::list >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm_ext.overwrite" ); - - test->add( BOOST_TEST_CASE( &test_overwrite ) ); - - return test; -} diff --git a/libs/range/test/algorithm_ext_test/push_back.cpp b/libs/range/test/algorithm_ext_test/push_back.cpp deleted file mode 100644 index 7e9d539f3..000000000 --- a/libs/range/test/algorithm_ext_test/push_back.cpp +++ /dev/null @@ -1,72 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include - -namespace -{ - template< class Container > - void test_push_back_impl(std::size_t n) - { - Container reference; - for (std::size_t i = 0; i < n; ++i) - reference.push_back(i); - - Container test; - boost::push_back(test, boost::irange(0, n)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - // Do it again to push onto non-empty container - for (std::size_t j = 0; j < n; ++j) - reference.push_back(j); - - boost::push_back(test, boost::irange(0, n)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - } - - template< class Container > - void test_push_back_impl() - { - test_push_back_impl< Container >(0); - test_push_back_impl< Container >(1); - test_push_back_impl< Container >(2); - test_push_back_impl< Container >(100); - } - - void test_push_back() - { - test_push_back_impl< std::vector >(); - test_push_back_impl< std::list >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm_ext.push_back" ); - - test->add( BOOST_TEST_CASE( &test_push_back ) ); - - return test; -} diff --git a/libs/range/test/algorithm_ext_test/push_front.cpp b/libs/range/test/algorithm_ext_test/push_front.cpp deleted file mode 100644 index 071a7cece..000000000 --- a/libs/range/test/algorithm_ext_test/push_front.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include - -namespace -{ - struct DoubleValue - { - template< class Value > - Value operator()(Value x) - { - return x * 2; - } - }; - - template< class Container > - void test_push_front_impl(std::size_t n) - { - Container reference; - for (std::size_t i = 0; i < n; ++i) - reference.push_back(i); - - Container test; - boost::push_front(test, boost::irange(0, n)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - // copy the original reference sequence - Container reference_copy(reference); - std::transform(reference.begin(), reference.end(), reference.begin(), DoubleValue()); - - // Do it again to push onto non-empty container - reference.insert(reference.end(), reference_copy.begin(), reference_copy.end()); - - boost::push_front(test, boost::irange(0, n * 2, 2)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - } - - template< class Container > - void test_push_front_impl() - { - test_push_front_impl< Container >(0); - test_push_front_impl< Container >(1); - test_push_front_impl< Container >(2); - test_push_front_impl< Container >(100); - } - - void test_push_front() - { - test_push_front_impl< std::vector >(); - test_push_front_impl< std::list >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm_ext.push_front" ); - - test->add( BOOST_TEST_CASE( &test_push_front ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/adjacent_find.cpp b/libs/range/test/algorithm_test/adjacent_find.cpp deleted file mode 100644 index 63b65e814..000000000 --- a/libs/range/test/algorithm_test/adjacent_find.cpp +++ /dev/null @@ -1,95 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void test_adjacent_find_impl() - { - using namespace boost::assign; - - typedef BOOST_DEDUCED_TYPENAME Container::iterator iterator_t; - typedef BOOST_DEDUCED_TYPENAME Container::const_iterator const_iterator_t; - - Container cont; - const Container& cref_cont = cont; - - std::equal_to pred; - - BOOST_CHECK( boost::adjacent_find(cont) == cont.end() ); - BOOST_CHECK( boost::adjacent_find(cref_cont) == cref_cont.end() ); - BOOST_CHECK( boost::adjacent_find(boost::make_iterator_range(cont)) == cont.end() ); - BOOST_CHECK( boost::adjacent_find(cont, pred) == cont.end() ); - BOOST_CHECK( boost::adjacent_find(cref_cont, pred) == cref_cont.end() ); - BOOST_CHECK( boost::adjacent_find(boost::make_iterator_range(cont), pred) == cont.end() ); - - cont += 1; - BOOST_CHECK( boost::adjacent_find(cont) == cont.end() ); - BOOST_CHECK( boost::adjacent_find(cref_cont) == cref_cont.end() ); - BOOST_CHECK( boost::adjacent_find(boost::make_iterator_range(cont)) == cont.end() ); - BOOST_CHECK( boost::adjacent_find(cont, pred) == cont.end() ); - BOOST_CHECK( boost::adjacent_find(cref_cont, pred) == cref_cont.end() ); - BOOST_CHECK( boost::adjacent_find(boost::make_iterator_range(cont), pred) == cont.end() ); - - cont += 2,3,4,5,5,5,6,7,8,9; - iterator_t it = boost::adjacent_find(cont); - iterator_t it_pred = boost::adjacent_find(cont, pred); - BOOST_CHECK( it == it_pred ); - BOOST_CHECK( it != cont.end() ); - BOOST_CHECK( it == std::adjacent_find(cont.begin(), cont.end()) ); - if (it != cont.end()) - { - BOOST_CHECK( *it == 5 ); - } - BOOST_CHECK( it == boost::adjacent_find(boost::make_iterator_range(cont)) ); - BOOST_CHECK( it_pred == boost::adjacent_find(boost::make_iterator_range(cont), pred) ); - const_iterator_t cit = boost::adjacent_find(cref_cont); - const_iterator_t cit_pred = boost::adjacent_find(cref_cont, pred); - BOOST_CHECK( cit == cit_pred ); - BOOST_CHECK( cit != cref_cont.end() ); - BOOST_CHECK( cit == std::adjacent_find(cref_cont.begin(), cref_cont.end()) ); - if (cit != cref_cont.end()) - { - BOOST_CHECK( *cit == 5 ); - } - } - - void test_adjacent_find() - { - test_adjacent_find_impl< std::vector >(); - test_adjacent_find_impl< std::list >(); - test_adjacent_find_impl< std::multiset >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.adjacent_find" ); - - test->add( BOOST_TEST_CASE( &boost::test_adjacent_find ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/binary_search.cpp b/libs/range/test/algorithm_test/binary_search.cpp deleted file mode 100644 index 2646c2e28..000000000 --- a/libs/range/test/algorithm_test/binary_search.cpp +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void test(Container& cont) - { - Container reference(cont); - Container test(cont); - - bool reference_result - = std::binary_search(reference.begin(), reference.end(), 5); - - bool test_result = boost::binary_search(test, 5); - - BOOST_CHECK( reference_result == test_result ); - - BOOST_CHECK( test_result == boost::binary_search(boost::make_iterator_range(test), 5) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - } - - template - void sort_container(Container& cont, BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - std::vector temp(cont.begin(), cont.end()); - std::sort(temp.begin(), temp.end(), pred); - cont.assign(temp.begin(), temp.end()); - } - - template - void test_pred(Container& cont, BinaryPredicate pred) - { - Container reference(cont); - Container test(cont); - - sort_container(reference, pred); - sort_container(test, pred); - - bool reference_result - = std::binary_search(reference.begin(), reference.end(), 5, - pred); - - bool test_result = boost::binary_search(test, 5, pred); - - BOOST_CHECK( test_result == boost::binary_search(boost::make_iterator_range(test), 5, pred) ); - - BOOST_CHECK( reference_result == test_result ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - } - - template - void test_binary_search_impl() - { - using namespace boost::assign; - - Container cont; - - test(cont); - test_pred(cont, std::less()); - test_pred(cont, std::greater()); - - cont.clear(); - cont += 1; - test(cont); - test_pred(cont, std::less()); - test_pred(cont, std::greater()); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test(cont); - test_pred(cont, std::less()); - test_pred(cont, std::greater()); - } - - void test_binary_search() - { - test_binary_search_impl< std::vector >(); - test_binary_search_impl< std::list >(); - test_binary_search_impl< std::deque >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.binary_search" ); - - test->add( BOOST_TEST_CASE( &boost::test_binary_search ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/copy.cpp b/libs/range/test/algorithm_test/copy.cpp deleted file mode 100644 index 4b9fcc2f3..000000000 --- a/libs/range/test/algorithm_test/copy.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void test_copy_impl() - { - Container source; - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - std::vector target; - target.resize(source.size()); - - typedef BOOST_DEDUCED_TYPENAME range_iterator< std::vector >::type iterator_t; - iterator_t it = boost::copy(source, target.begin()); - - BOOST_CHECK( it == target.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - target.begin(), target.end(), - source.begin(), source.end() - ); - - it = boost::copy(boost::make_iterator_range(source), target.begin()); - - BOOST_CHECK( it == target.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS(target.begin(), target.end(), - source.begin(), source.end()); - } - - void test_copy() - { - test_copy_impl< std::vector >(); - test_copy_impl< std::list >(); - test_copy_impl< std::set >(); - test_copy_impl< std::multiset >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.copy" ); - - test->add( BOOST_TEST_CASE( &boost::test_copy ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/copy_backward.cpp b/libs/range/test/algorithm_test/copy_backward.cpp deleted file mode 100644 index 4879c2870..000000000 --- a/libs/range/test/algorithm_test/copy_backward.cpp +++ /dev/null @@ -1,84 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -// Credits: -// awulkiew highlighted that this test was not successfully testing the -// algorithm. -// -#include - -#include -#include - -#include -#include -#include -#include -#include - -namespace boost_range_test -{ - namespace - { -template -void test_copy_backward_impl(std::size_t n) -{ - Container source; - typedef typename Container::value_type value_t; - for (std::size_t i = 0; i < n; ++i) - source.push_back(static_cast(i)); - - std::vector target(n); - - typedef typename boost::range_iterator< - std::vector - >::type iterator_t; - - iterator_t it = boost::copy_backward(source, target.end()); - - BOOST_CHECK(it == target.begin()); - - BOOST_CHECK_EQUAL_COLLECTIONS(target.begin(), target.end(), - source.begin(), source.end()); - - BOOST_CHECK(it == boost::copy_backward( - boost::make_iterator_range(source), target.end())); - - BOOST_CHECK_EQUAL_COLLECTIONS(target.begin(), target.end(), - source.begin(), source.end()); -} - -template -void test_copy_backward_impl() -{ - test_copy_backward_impl(0u); - test_copy_backward_impl(1u); - test_copy_backward_impl(100u); -} - -void test_copy_backward() -{ - test_copy_backward_impl >(); - test_copy_backward_impl >(); -} - } // anonymous namespace -} // namespace boost_range_test - - -boost::unit_test::test_suite* -init_unit_test_suite(int, char*[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE("RangeTestSuite.algorithm.copy_backward"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_copy_backward)); - - return test; -} diff --git a/libs/range/test/algorithm_test/copy_n.cpp b/libs/range/test/algorithm_test/copy_n.cpp deleted file mode 100644 index 230eb0322..000000000 --- a/libs/range/test/algorithm_test/copy_n.cpp +++ /dev/null @@ -1,70 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace -{ - template< class Container > - void test_copy_n_impl() - { - Container source; - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - std::vector target; - target.resize(source.size()); - - typedef BOOST_DEDUCED_TYPENAME range_iterator< std::vector >::type iterator_t; - iterator_t it = boost::copy(source, target.begin()); - - BOOST_CHECK( it == target.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - target.begin(), target.end(), - source.begin(), source.end() - ); - - it = boost::copy(boost::make_iterator_range(source), target.begin()); - - BOOST_CHECK( it == target.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS(target.begin(), target.end(), - source.begin(), source.end()); - } - - void test_copy_n() - { - test_copy_n_impl< std::vector >(); - test_copy_n_impl< std::list >(); - test_copy_n_impl< std::set >(); - test_copy_n_impl< std::multiset >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.copy_n" ); - - test->add( BOOST_TEST_CASE( &::test_copy_n ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/count.cpp b/libs/range/test/algorithm_test/count.cpp deleted file mode 100644 index 90b209032..000000000 --- a/libs/range/test/algorithm_test/count.cpp +++ /dev/null @@ -1,85 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void test_count_impl() - { - using namespace boost::assign; - - Container cont; - const Container& cref_cont = cont; - - BOOST_CHECK_EQUAL( 0u, boost::count(cont, 0u) ); - BOOST_CHECK_EQUAL( 0u, boost::count(cref_cont, 0u) ); - BOOST_CHECK_EQUAL( 0u, boost::count(boost::make_iterator_range(cont), 0u) ); - - cont += 1; - BOOST_CHECK_EQUAL( 0u, boost::count(cont, 0u) ); - BOOST_CHECK_EQUAL( 0u, boost::count(cref_cont, 0u) ); - BOOST_CHECK_EQUAL( 0u, boost::count(boost::make_iterator_range(cont), 0u) ); - BOOST_CHECK_EQUAL( 1u, boost::count(cont, 1u) ); - BOOST_CHECK_EQUAL( 1u, boost::count(cref_cont, 1u) ); - BOOST_CHECK_EQUAL( 1u, boost::count(boost::make_iterator_range(cont), 1u) ); - - cont += 2,3,4,5,6,7,8,9; - BOOST_CHECK_EQUAL( 0u, boost::count(cont, 0u) ); - BOOST_CHECK_EQUAL( 0u, boost::count(cref_cont, 0u) ); - BOOST_CHECK_EQUAL( 0u, boost::count(boost::make_iterator_range(cont), 0u) ); - BOOST_CHECK_EQUAL( 1u, boost::count(cont, 1u) ); - BOOST_CHECK_EQUAL( 1u, boost::count(cref_cont, 1u) ); - BOOST_CHECK_EQUAL( 1u, boost::count(boost::make_iterator_range(cont), 1u) ); - - cont += 2; - BOOST_CHECK_EQUAL( 0u, boost::count(cont, 0u) ); - BOOST_CHECK_EQUAL( 0u, boost::count(cref_cont, 0u) ); - BOOST_CHECK_EQUAL( 0u, boost::count(boost::make_iterator_range(cont), 0u) ); - BOOST_CHECK_EQUAL( 1u, boost::count(cont, 1u) ); - BOOST_CHECK_EQUAL( 1u, boost::count(cref_cont, 1u) ); - BOOST_CHECK_EQUAL( 1u, boost::count(boost::make_iterator_range(cont), 1u) ); - BOOST_CHECK_EQUAL( 2u, boost::count(cont, 2u) ); - BOOST_CHECK_EQUAL( 2u, boost::count(cref_cont, 2u) ); - BOOST_CHECK_EQUAL( 2u, boost::count(boost::make_iterator_range(cont), 2u) ); - } - - void test_count() - { - test_count_impl< std::vector >(); - test_count_impl< std::list >(); - test_count_impl< std::multiset >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.count" ); - - test->add( BOOST_TEST_CASE( &boost::test_count ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/count_if.cpp b/libs/range/test/algorithm_test/count_if.cpp deleted file mode 100644 index e028741c0..000000000 --- a/libs/range/test/algorithm_test/count_if.cpp +++ /dev/null @@ -1,100 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include "../test_function/false_predicate.hpp" -#include "../test_function/true_predicate.hpp" -#include "../test_function/equal_to_x.hpp" -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void test_count_if_impl() - { - using namespace boost::range_test_function; - using namespace boost::assign; - - typedef equal_to_x pred_t; - typedef BOOST_DEDUCED_TYPENAME std::iterator_traits::difference_type diff_t; - - Container cont; - const Container& cref_cont = cont; - - BOOST_CHECK_EQUAL( 0u, boost::count_if(cont, pred_t(0)) ); - BOOST_CHECK_EQUAL( 0u, boost::count_if(cref_cont, pred_t(0)) ); - BOOST_CHECK_EQUAL( 0u, boost::count_if(boost::make_iterator_range(cont), pred_t(0)) ); - - cont += 1; - BOOST_CHECK_EQUAL( 0u, boost::count_if(cont, pred_t(0)) ); - BOOST_CHECK_EQUAL( 0u, boost::count_if(cref_cont, pred_t(0)) ); - BOOST_CHECK_EQUAL( 0u, boost::count_if(boost::make_iterator_range(cont), pred_t(0)) ); - BOOST_CHECK_EQUAL( 1u, boost::count_if(cont, pred_t(1)) ); - BOOST_CHECK_EQUAL( 1u, boost::count_if(cref_cont, pred_t(1)) ); - BOOST_CHECK_EQUAL( 1u, boost::count_if(boost::make_iterator_range(cont), pred_t(1)) ); - - cont += 2,3,4,5,6,7,8,9; - BOOST_CHECK_EQUAL( 0u, boost::count_if(cont, pred_t(0)) ); - BOOST_CHECK_EQUAL( 0u, boost::count_if(cref_cont, pred_t(0)) ); - BOOST_CHECK_EQUAL( 0u, boost::count_if(boost::make_iterator_range(cont), pred_t(0)) ); - BOOST_CHECK_EQUAL( 1u, boost::count_if(cont, pred_t(1)) ); - BOOST_CHECK_EQUAL( 1u, boost::count_if(cref_cont, pred_t(1)) ); - BOOST_CHECK_EQUAL( 1u, boost::count_if(boost::make_iterator_range(cont), pred_t(1)) ); - - cont += 2; - BOOST_CHECK_EQUAL( 0u, boost::count_if(cont, pred_t(0)) ); - BOOST_CHECK_EQUAL( 0u, boost::count_if(cref_cont, pred_t(0)) ); - BOOST_CHECK_EQUAL( 0u, boost::count_if(boost::make_iterator_range(cont), pred_t(0)) ); - BOOST_CHECK_EQUAL( 1u, boost::count_if(cont, pred_t(1)) ); - BOOST_CHECK_EQUAL( 1u, boost::count_if(cref_cont, pred_t(1)) ); - BOOST_CHECK_EQUAL( 1u, boost::count_if(boost::make_iterator_range(cont), pred_t(1)) ); - BOOST_CHECK_EQUAL( 2u, boost::count_if(cont, pred_t(2)) ); - BOOST_CHECK_EQUAL( 2u, boost::count_if(cref_cont, pred_t(2)) ); - BOOST_CHECK_EQUAL( 2u, boost::count_if(boost::make_iterator_range(cont), pred_t(2)) ); - - BOOST_CHECK_EQUAL( 0u, boost::count_if(cont, false_predicate()) ); - BOOST_CHECK_EQUAL( 0u, boost::count_if(cref_cont, false_predicate()) ); - BOOST_CHECK_EQUAL( 0u, boost::count_if(boost::make_iterator_range(cont), false_predicate()) ); - - BOOST_CHECK_EQUAL( static_cast(cont.size()), boost::count_if(cont, true_predicate()) ); - BOOST_CHECK_EQUAL( static_cast(cont.size()), boost::count_if(cref_cont, true_predicate()) ); - BOOST_CHECK_EQUAL( static_cast(cont.size()), boost::count_if(boost::make_iterator_range(cont), true_predicate()) ); - } - - void test_count_if() - { - test_count_if_impl< std::vector >(); - test_count_if_impl< std::list >(); - test_count_if_impl< std::multiset >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.count_if" ); - - test->add( BOOST_TEST_CASE( &boost::test_count_if ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/equal.cpp b/libs/range/test/algorithm_test/equal.cpp deleted file mode 100644 index 243f0645f..000000000 --- a/libs/range/test/algorithm_test/equal.cpp +++ /dev/null @@ -1,143 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container1, class Container2 > - void test_equal_impl() - { - using namespace boost::assign; - - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type container1_t; - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type container2_t; - - container1_t mcont1; - container2_t mcont2; - - Container1& cont1 = mcont1; - Container2& cont2 = mcont2; - - BOOST_CHECK( boost::equal(cont1, cont2) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), cont2) ); - BOOST_CHECK( boost::equal(cont1, boost::make_iterator_range(cont2)) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2)) ); - BOOST_CHECK( boost::equal(cont1, cont2, std::equal_to()) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), cont2, std::equal_to()) ); - BOOST_CHECK( boost::equal(cont1, boost::make_iterator_range(cont2), std::equal_to()) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2), std::equal_to()) ); - BOOST_CHECK( boost::equal(cont1, cont2, std::not_equal_to()) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), cont2, std::not_equal_to()) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2), std::not_equal_to()) ); - - mcont1 += 1; - BOOST_CHECK( !boost::equal(cont1, cont2) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), cont2) ); - BOOST_CHECK( !boost::equal(cont1, boost::make_iterator_range(cont2)) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2)) ); - BOOST_CHECK( !boost::equal(cont1, cont2, std::equal_to()) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), cont2, std::equal_to()) ); - BOOST_CHECK( !boost::equal(cont1, boost::make_iterator_range(cont2), std::equal_to()) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2), std::equal_to()) ); - BOOST_CHECK( !boost::equal(cont1, cont2, std::not_equal_to()) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), cont2, std::not_equal_to()) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2), std::not_equal_to()) ); - - mcont1.clear(); - mcont2 += 1; - BOOST_CHECK( !boost::equal(cont1, cont2) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), cont2) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2)) ); - BOOST_CHECK( !boost::equal(cont1, cont2, std::equal_to()) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), cont2, std::equal_to()) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2), std::equal_to()) ); - BOOST_CHECK( !boost::equal(cont1, cont2, std::not_equal_to()) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), cont2, std::not_equal_to()) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2), std::not_equal_to()) ); - - mcont1 += 1; - BOOST_CHECK( boost::equal(cont1, cont2) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), cont2) ); - BOOST_CHECK( boost::equal(cont1, boost::make_iterator_range(cont2)) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2)) ); - BOOST_CHECK( boost::equal(cont1, cont2, std::equal_to()) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), cont2, std::equal_to()) ); - BOOST_CHECK( boost::equal(cont1, boost::make_iterator_range(cont2), std::equal_to()) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2), std::equal_to()) ); - BOOST_CHECK( !boost::equal(cont1, cont2, std::not_equal_to()) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), cont2, std::not_equal_to()) ); - BOOST_CHECK( !boost::equal(cont1, boost::make_iterator_range(cont2), std::not_equal_to()) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2), std::not_equal_to()) ); - - mcont1 += 2,3,4,5,6,7,8,9; - mcont2 += 2,3,4,5,6,7,8,9; - BOOST_CHECK( boost::equal(cont1, cont2) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), cont2) ); - BOOST_CHECK( boost::equal(cont1, boost::make_iterator_range(cont2)) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2)) ); - BOOST_CHECK( boost::equal(cont1, cont2, std::equal_to()) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), cont2, std::equal_to()) ); - BOOST_CHECK( boost::equal(cont1, boost::make_iterator_range(cont2), std::equal_to()) ); - BOOST_CHECK( boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2), std::equal_to()) ); - BOOST_CHECK( !boost::equal(cont1, cont2, std::not_equal_to()) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), cont2, std::not_equal_to()) ); - BOOST_CHECK( !boost::equal(cont1, boost::make_iterator_range(cont2), std::not_equal_to()) ); - BOOST_CHECK( !boost::equal(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2), std::not_equal_to()) ); - } - - template< class Container1, class Container2 > - void test_driver() - { - typedef Container1 container1_t; - typedef Container2 container2_t; - typedef BOOST_DEDUCED_TYPENAME boost::add_const::type const_container1_t; - typedef BOOST_DEDUCED_TYPENAME boost::add_const::type const_container2_t; - - test_equal_impl< const_container1_t, const_container2_t >(); - test_equal_impl< const_container1_t, container2_t >(); - test_equal_impl< container1_t, const_container2_t >(); - test_equal_impl< container1_t, container2_t >(); - } - - void test_equal() - { - test_driver< std::list, std::list >(); - test_driver< std::vector, std::vector >(); - test_driver< std::set, std::set >(); - test_driver< std::multiset, std::multiset >(); - test_driver< std::list, std::vector >(); - test_driver< std::vector, std::list >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.equal" ); - - test->add( BOOST_TEST_CASE( &boost::test_equal ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/equal_range.cpp b/libs/range/test/algorithm_test/equal_range.cpp deleted file mode 100644 index 612f1a479..000000000 --- a/libs/range/test/algorithm_test/equal_range.cpp +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void check_result( - const Container& reference, - Pair reference_pair, - const Container& test, - Pair test_pair - ) - { - typedef BOOST_DEDUCED_TYPENAME range_iterator::type - const_iterator_t; - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - - BOOST_CHECK_EQUAL( - std::distance(reference.begin(), reference_pair.first), - std::distance(test.begin(), test_pair.first) - ); - - BOOST_CHECK_EQUAL( - std::distance(reference.begin(), reference_pair.second), - std::distance(test.begin(), test_pair.second) - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference_pair.first, reference_pair.second, - test_pair.first, test_pair.second - ); - } - - template - void test(Container& cont) - { - Container reference(cont); - Container test(cont); - - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator_t; - typedef std::pair pair_t; - - pair_t reference_result - = std::equal_range(reference.begin(), reference.end(), 5); - - pair_t test_result = boost::equal_range(test, 5); - - check_result(reference, reference_result, test, test_result); - - pair_t test_result2 = boost::equal_range(boost::make_iterator_range(test), 5); - - check_result(reference, reference_result, test, test_result2); - } - - template - void sort_container(Container& cont, BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - std::vector temp(cont.begin(), cont.end()); - std::sort(temp.begin(), temp.end(), pred); - cont.assign(temp.begin(), temp.end()); - } - - template - void test_pred(Container& cont, BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type container_t; - - container_t reference_temp(cont); - container_t test_temp(cont); - - sort_container(reference_temp, pred); - sort_container(test_temp, pred); - - Container reference(reference_temp); - Container test(test_temp); - - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator_t; - typedef std::pair pair_t; - - pair_t reference_result - = std::equal_range(reference.begin(), reference.end(), 5, - BinaryPredicate()); - - pair_t test_result = boost::equal_range(test, 5, BinaryPredicate()); - - check_result(reference, reference_result, test, test_result); - - pair_t test_result2 = boost::equal_range(boost::make_iterator_range(test), 5, BinaryPredicate()); - - check_result(reference, reference_result, test, test_result2); - } - - template - void test_driver(const Container& cont) - { - Container mutable_cont(cont); - test(mutable_cont); - - test(cont); - } - - template - void test_pred_driver(const Container& cont, BinaryPredicate pred) - { - Container mutable_cont(cont); - test_pred(mutable_cont, pred); - - test_pred(cont, pred); - } - - template - void test_equal_range_impl() - { - using namespace boost::assign; - - Container cont; - - test_driver(cont); - test_pred_driver(cont, std::less()); - test_pred_driver(cont, std::greater()); - - cont.clear(); - cont += 1; - test_driver(cont); - test_pred_driver(cont, std::less()); - test_pred_driver(cont, std::greater()); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_driver(cont); - test_pred_driver(cont, std::less()); - test_pred_driver(cont, std::greater()); - } - - void test_equal_range() - { - test_equal_range_impl< std::vector >(); - test_equal_range_impl< std::list >(); - test_equal_range_impl< std::deque >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.equal_range" ); - - test->add( BOOST_TEST_CASE( &boost::test_equal_range ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/fill.cpp b/libs/range/test/algorithm_test/fill.cpp deleted file mode 100644 index 2f975c4ca..000000000 --- a/libs/range/test/algorithm_test/fill.cpp +++ /dev/null @@ -1,86 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void test_fill_impl(Container& cont) - { - Container reference(cont); - std::fill(reference.begin(), reference.end(), 1); - - Container target(cont); - boost::fill(target, 1); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target.begin(), target.end() ); - - Container target2(cont); - boost::fill(boost::make_iterator_range(target2), 1); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target2.begin(), target2.end() ); - } - - template< class Container > - void test_fill_impl() - { - using namespace boost::assign; - - Container cont; - test_fill_impl(cont); - - cont.clear(); - cont += 2; - test_fill_impl(cont); - - cont.clear(); - cont += 1,2; - test_fill_impl(cont); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_fill_impl(cont); - } - - void test_fill() - { - test_fill_impl< std::vector >(); - test_fill_impl< std::list >(); - test_fill_impl< std::deque >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.fill" ); - - test->add( BOOST_TEST_CASE( &boost::test_fill ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/find.cpp b/libs/range/test/algorithm_test/find.cpp deleted file mode 100644 index 02c9f7171..000000000 --- a/libs/range/test/algorithm_test/find.cpp +++ /dev/null @@ -1,131 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include "../test_driver/range_return_test_driver.hpp" -#include -#include -#include -#include -#include -#include - -namespace boost_range_test_algorithm_find -{ - class find_test_policy - { - public: - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::find(cont, 3); - iter_t result2 = boost::find(boost::make_iterator_range(cont), 3); - BOOST_CHECK( result == result2 ); - return result; - } - - template - struct test_range - { - template - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy&, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - result_t result = boost::find(cont, 3); - result_t result2 = boost::find(boost::make_iterator_range(cont), 3); - BOOST_CHECK( result == result2 ); - return result; - } - }; - - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::find(cont.begin(), cont.end(), 3); - } - }; - - template - void test_find_container() - { - using namespace boost::assign; - - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type container_t; - - boost::range_test::range_return_test_driver test_driver; - - container_t mcont; - Container& cont = mcont; - test_driver(cont, find_test_policy()); - - mcont.clear(); - mcont += 1; - test_driver(cont, find_test_policy()); - - mcont.clear(); - mcont += 1,2,3,4,5,6,7,8,9; - test_driver(cont, find_test_policy()); - } - - void test_find() - { - test_find_container< std::vector >(); - test_find_container< std::list >(); - test_find_container< std::deque >(); - - test_find_container< const std::vector >(); - test_find_container< const std::list >(); - test_find_container< const std::deque >(); - - std::vector vi; - const std::vector& cvi = vi; - std::vector::const_iterator it = boost::find(vi, 0); - std::vector::const_iterator it2 = boost::find(cvi, 0); - BOOST_CHECK( it == it2 ); - } - - // The find algorithm can be used like a "contains" algorithm - // since the returned iterator_range is convertible to bool. - // Therefore if the return value is an empty range it will - // convert to the equivalent to "false" whereas a range that - // is not empty will convert to "true". Therefore one can - // use the syntax boost::find(rng, x) - // as a contains function. - void test_find_as_contains() - { - std::list l; - for (int i = 0; i < 10; ++i) - l.push_back(i); - - BOOST_CHECK(boost::find(l, 3)); - BOOST_CHECK(!boost::find(l, 10)); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.find" ); - - test->add( BOOST_TEST_CASE( &boost_range_test_algorithm_find::test_find ) ); - test->add( BOOST_TEST_CASE( &boost_range_test_algorithm_find::test_find_as_contains ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/find_end.cpp b/libs/range/test/algorithm_test/find_end.cpp deleted file mode 100644 index b4d77a089..000000000 --- a/libs/range/test/algorithm_test/find_end.cpp +++ /dev/null @@ -1,200 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include "../test_driver/range_return_test_driver.hpp" -#include -#include -#include -#include -#include - -namespace boost_range_test_algorithm_find_end -{ - template - class find_end_test_policy - { - typedef Container2 container2_t; - public: - explicit find_end_test_policy(const Container2& cont) - : m_cont(cont) - { - } - - container2_t cont() { return m_cont; } - - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::find_end(cont, m_cont); - BOOST_CHECK( result == boost::find_end(boost::make_iterator_range(cont), m_cont) ); - BOOST_CHECK( result == boost::find_end(cont, boost::make_iterator_range(m_cont)) ); - BOOST_CHECK( result == boost::find_end(boost::make_iterator_range(cont), boost::make_iterator_range(m_cont)) ); - return result; - } - - template - struct test_range - { - template - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - result_t result = boost::find_end(cont, policy.cont()); - BOOST_CHECK( result == boost::find_end(boost::make_iterator_range(cont), policy.cont()) ); - BOOST_CHECK( result == boost::find_end(cont, boost::make_iterator_range(policy.cont())) ); - BOOST_CHECK( result == boost::find_end(boost::make_iterator_range(cont), - boost::make_iterator_range(policy.cont())) ); - return result; - } - }; - - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::find_end(cont.begin(), cont.end(), - m_cont.begin(), m_cont.end()); - } - - private: - Container2 m_cont; - }; - - template - class find_end_pred_test_policy - { - typedef Container2 container2_t; - public: - explicit find_end_pred_test_policy(const Container2& cont) - : m_cont(cont) - { - } - - container2_t& cont() { return m_cont; } - BinaryPredicate& pred() { return m_pred; } - - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t it = boost::find_end(cont, m_cont, m_pred); - BOOST_CHECK( it == boost::find_end(boost::make_iterator_range(cont), m_cont, m_pred) ); - BOOST_CHECK( it == boost::find_end(cont, boost::make_iterator_range(m_cont), m_pred) ); - BOOST_CHECK( it == boost::find_end(boost::make_iterator_range(cont), boost::make_iterator_range(m_cont), m_pred) ); - return it; - } - - template - struct test_range - { - template - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - result_t result = boost::find_end(cont, policy.cont(), policy.pred()); - BOOST_CHECK( result == boost::find_end(boost::make_iterator_range(cont), policy.cont(), policy.pred()) ); - BOOST_CHECK( result == boost::find_end(cont, boost::make_iterator_range(policy.cont()), policy.pred()) ); - BOOST_CHECK( result == boost::find_end(boost::make_iterator_range(cont), - boost::make_iterator_range(policy.cont()), policy.pred()) ); - return boost::find_end(cont, policy.cont(), policy.pred()); - } - }; - - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::find_end(cont.begin(), cont.end(), - m_cont.begin(), m_cont.end(), - m_pred); - } - - private: - Container2 m_cont; - BinaryPredicate m_pred; - }; - - template - void run_tests(Container1& cont1, Container2& cont2) - { - boost::range_test::range_return_test_driver test_driver; - test_driver(cont1, find_end_test_policy(cont2)); - test_driver(cont1, find_end_pred_test_policy >(cont2)); - test_driver(cont2, find_end_pred_test_policy >(cont2)); - } - - template - void test_find_end_impl() - { - using namespace boost::assign; - - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type container1_t; - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type container2_t; - - container1_t mcont1; - Container1& cont1 = mcont1; - container2_t mcont2; - Container2& cont2 = mcont2; - - run_tests(cont1, cont2); - - mcont1 += 1; - run_tests(cont1, cont2); - - mcont2 += 1; - run_tests(cont1, cont2); - - mcont1 += 2,3,4,5,6,7,8,9; - mcont2 += 2,3,4; - run_tests(cont1, cont2); - - mcont2.clear(); - mcont2 += 7,8,9; - run_tests(cont1, cont2); - } - - void test_find_end() - { - test_find_end_impl< std::vector, std::vector >(); - test_find_end_impl< std::list, std::list >(); - test_find_end_impl< std::deque, std::deque >(); - test_find_end_impl< const std::vector, const std::vector >(); - test_find_end_impl< const std::list, const std::list >(); - test_find_end_impl< const std::deque, const std::deque >(); - test_find_end_impl< const std::vector, const std::list >(); - test_find_end_impl< const std::list, const std::vector >(); - test_find_end_impl< const std::vector, std::list >(); - test_find_end_impl< const std::list, std::vector >(); - test_find_end_impl< std::vector, std::list >(); - test_find_end_impl< std::list, std::vector >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.find_end" ); - - test->add( BOOST_TEST_CASE( &boost_range_test_algorithm_find_end::test_find_end ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/find_first_of.cpp b/libs/range/test/algorithm_test/find_first_of.cpp deleted file mode 100644 index 296b8fce3..000000000 --- a/libs/range/test/algorithm_test/find_first_of.cpp +++ /dev/null @@ -1,198 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include "../test_driver/range_return_test_driver.hpp" -#include -#include -#include -#include -#include - -namespace boost_range_test_algorithm_find_first_of -{ - template - class find_first_of_test_policy - { - typedef Container2 container2_t; - public: - explicit find_first_of_test_policy(const Container2& cont) - : m_cont(cont) - { - } - - container2_t& cont() { return m_cont; } - - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::find_first_of(cont, m_cont); - BOOST_CHECK( result == boost::find_first_of(boost::make_iterator_range(cont), m_cont) ); - BOOST_CHECK( result == boost::find_first_of(cont, boost::make_iterator_range(m_cont)) ); - BOOST_CHECK( result == boost::find_first_of(boost::make_iterator_range(cont), boost::make_iterator_range(m_cont)) ); - return result; - } - - template - struct test_range - { - template - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - result_t result = boost::find_first_of(cont, policy.cont()); - BOOST_CHECK( result == boost::find_first_of(boost::make_iterator_range(cont), policy.cont()) ); - BOOST_CHECK( result == boost::find_first_of(cont, boost::make_iterator_range(policy.cont())) ); - BOOST_CHECK( result == boost::find_first_of(boost::make_iterator_range(cont), boost::make_iterator_range(policy.cont())) ); - return result; - } - }; - - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::find_first_of(cont.begin(), cont.end(), - m_cont.begin(), m_cont.end()); - } - - private: - Container2 m_cont; - }; - - template - class find_first_of_pred_test_policy - { - typedef Container2 container2_t; - public: - explicit find_first_of_pred_test_policy(const Container2& cont) - : m_cont(cont) - { - } - - container2_t& cont() { return m_cont; } - BinaryPredicate& pred() { return m_pred; } - - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::find_first_of(cont, m_cont, m_pred); - BOOST_CHECK( result == boost::find_first_of(boost::make_iterator_range(cont), m_cont, m_pred) ); - BOOST_CHECK( result == boost::find_first_of(cont, boost::make_iterator_range(m_cont), m_pred) ); - BOOST_CHECK( result == boost::find_first_of(boost::make_iterator_range(cont), boost::make_iterator_range(m_cont), m_pred) ); - return result; - } - - template - struct test_range - { - template - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - result_t result = boost::find_first_of(cont, policy.cont(), policy.pred()); - BOOST_CHECK( result == boost::find_first_of(boost::make_iterator_range(cont), policy.cont(), policy.pred()) ); - BOOST_CHECK( result == boost::find_first_of(cont, boost::make_iterator_range(policy.cont()), policy.pred()) ); - BOOST_CHECK( result == boost::find_first_of(boost::make_iterator_range(cont), boost::make_iterator_range(policy.cont()), policy.pred()) ); - return result; - } - }; - - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::find_first_of(cont.begin(), cont.end(), - m_cont.begin(), m_cont.end(), - m_pred); - } - - private: - Container2 m_cont; - BinaryPredicate m_pred; - }; - - template - void run_tests(Container1& cont1, Container2& cont2) - { - boost::range_test::range_return_test_driver test_driver; - test_driver(cont1, find_first_of_test_policy(cont2)); - test_driver(cont1, find_first_of_pred_test_policy >(cont2)); - test_driver(cont2, find_first_of_pred_test_policy >(cont2)); - } - - template - void test_find_first_of_impl() - { - using namespace boost::assign; - - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type container1_t; - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type container2_t; - - container1_t mcont1; - Container1& cont1 = mcont1; - container2_t mcont2; - Container2& cont2 = mcont2; - - run_tests(cont1, cont2); - - mcont1 += 1; - run_tests(cont1, cont2); - - mcont2 += 1; - run_tests(cont1, cont2); - - mcont1 += 2,3,4,5,6,7,8,9; - mcont2 += 2,3,4; - run_tests(cont1, cont2); - - mcont2.clear(); - mcont2 += 7,8,9; - run_tests(cont1, cont2); - } - - void test_find_first_of() - { - test_find_first_of_impl< std::vector, std::vector >(); - test_find_first_of_impl< std::list, std::list >(); - test_find_first_of_impl< std::deque, std::deque >(); - test_find_first_of_impl< const std::vector, const std::vector >(); - test_find_first_of_impl< const std::list, const std::list >(); - test_find_first_of_impl< const std::deque, const std::deque >(); - test_find_first_of_impl< const std::vector, const std::list >(); - test_find_first_of_impl< const std::list, const std::vector >(); - test_find_first_of_impl< const std::vector, std::list >(); - test_find_first_of_impl< const std::list, std::vector >(); - test_find_first_of_impl< std::vector, std::list >(); - test_find_first_of_impl< std::list, std::vector >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.find_first_of" ); - - test->add( BOOST_TEST_CASE( &boost_range_test_algorithm_find_first_of::test_find_first_of ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/find_if.cpp b/libs/range/test/algorithm_test/find_if.cpp deleted file mode 100644 index 3ab22c930..000000000 --- a/libs/range/test/algorithm_test/find_if.cpp +++ /dev/null @@ -1,126 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include "../test_driver/range_return_test_driver.hpp" -#include "../test_function/greater_than_x.hpp" -#include "../test_function/false_predicate.hpp" -#include -#include -#include -#include -#include - -namespace boost_range_test_algorithm_find_if -{ - template - class find_if_test_policy - { - public: - explicit find_if_test_policy(UnaryPredicate pred) - : m_pred(pred) {} - - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::find_if(cont, m_pred); - BOOST_CHECK( result == boost::find_if(boost::make_iterator_range(cont), m_pred) ); - return result; - } - - template - struct test_range - { - template - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(find_if_test_policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - result_t result = boost::find_if(cont, policy.pred()); - BOOST_CHECK( result == boost::find_if(boost::make_iterator_range(cont), policy.pred()) ); - return result; - } - }; - - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::find_if(cont.begin(), cont.end(), m_pred); - } - - UnaryPredicate& pred() { return m_pred; } - - private: - UnaryPredicate m_pred; - }; - - template - find_if_test_policy - make_policy(UnaryPredicate pred) - { - return find_if_test_policy(pred); - } - - template - void test_find_if_container() - { - using namespace boost::assign; - using namespace boost::range_test_function; - - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type container_t; - - boost::range_test::range_return_test_driver test_driver; - - container_t mcont; - Container& cont = mcont; - test_driver(cont, make_policy(greater_than_x(5))); - test_driver(cont, make_policy(false_predicate())); - - mcont.clear(); - mcont += 1; - test_driver(cont, make_policy(greater_than_x(5))); - test_driver(cont, make_policy(false_predicate())); - - mcont.clear(); - mcont += 1,2,3,4,5,6,7,8,9; - test_driver(cont, make_policy(greater_than_x(5))); - test_driver(cont, make_policy(false_predicate())); - } - - void test_find_if() - { - test_find_if_container< std::vector >(); - test_find_if_container< std::list >(); - test_find_if_container< std::deque >(); - - test_find_if_container< const std::vector >(); - test_find_if_container< const std::list >(); - test_find_if_container< const std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.find_if" ); - - test->add( BOOST_TEST_CASE( &boost_range_test_algorithm_find_if::test_find_if ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/for_each.cpp b/libs/range/test/algorithm_test/for_each.cpp deleted file mode 100644 index 701d676c4..000000000 --- a/libs/range/test/algorithm_test/for_each.cpp +++ /dev/null @@ -1,95 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include "../test_function/check_equal_fn.hpp" - -namespace boost -{ - namespace - { - template< class Range > - unsigned int udistance(Range& rng) - { - return static_cast(boost::distance(rng)); - } - - template< class SinglePassRange > - void test_for_each_impl( SinglePassRange rng ) - { - using namespace boost::range_test_function; - - typedef check_equal_fn< SinglePassRange > fn_t; - - // Test the mutable version - fn_t result_fn = boost::for_each(rng, fn_t(rng)); - BOOST_CHECK_EQUAL( boost::udistance(rng), result_fn.invocation_count() ); - - fn_t result_fn2 = boost::for_each(boost::make_iterator_range(rng), fn_t(rng)); - BOOST_CHECK_EQUAL( boost::udistance(rng), result_fn2.invocation_count() ); - - // Test the constant version - const SinglePassRange& cref_rng = rng; - result_fn = boost::for_each(cref_rng, fn_t(cref_rng)); - BOOST_CHECK_EQUAL( boost::udistance(cref_rng), result_fn.invocation_count() ); - } - - template< class Container > - void test_for_each_t() - { - using namespace boost::assign; - - // Test empty - Container cont; - test_for_each_impl(cont); - - // Test one element - cont += 0; - test_for_each_impl(cont); - - // Test many elements - cont += 1,2,3,4,5,6,7,8,9; - test_for_each_impl(cont); - } - - void test_for_each() - { - boost::array a = {{ 0,1,2,3,4,5,6,7,8,9 }}; - test_for_each_impl(a); - - test_for_each_t< std::vector >(); - test_for_each_t< std::list >(); - test_for_each_t< std::set >(); - test_for_each_t< std::multiset >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.for_each" ); - - test->add( BOOST_TEST_CASE( &boost::test_for_each ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/generate.cpp b/libs/range/test/algorithm_test/generate.cpp deleted file mode 100644 index d8fc0e6a8..000000000 --- a/libs/range/test/algorithm_test/generate.cpp +++ /dev/null @@ -1,96 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - class generator_fn - { - public: - typedef int result_type; - - generator_fn() : m_count(0) {} - int operator()() { return ++m_count; } - - private: - int m_count; - }; - - template< class Container > - void test_generate_impl(Container& cont) - { - Container reference(cont); - std::generate(reference.begin(), reference.end(), generator_fn()); - - Container test(cont); - boost::generate(test, generator_fn()); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - Container test2(cont); - boost::generate(boost::make_iterator_range(test2), generator_fn()); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test2.begin(), test2.end() ); - } - - template< class Container > - void test_generate_impl() - { - using namespace boost::assign; - - Container cont; - test_generate_impl(cont); - - cont.clear(); - cont += 9; - test_generate_impl(cont); - - cont.clear(); - cont += 9,8,7,6,5,4,3,2,1; - test_generate_impl(cont); - } - - void test_generate() - { - test_generate_impl< std::vector >(); - test_generate_impl< std::list >(); - test_generate_impl< std::deque >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.generate" ); - - test->add( BOOST_TEST_CASE( &boost::test_generate ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/heap.cpp b/libs/range/test/algorithm_test/heap.cpp deleted file mode 100644 index 74b7fa341..000000000 --- a/libs/range/test/algorithm_test/heap.cpp +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void check_equal(const Container1& cont1, const Container2& cont2) - { - BOOST_CHECK_EQUAL_COLLECTIONS( - cont1.begin(), cont1.end(), - cont2.begin(), cont2.end() - ); - } - - void test() - { - using namespace boost::assign; - - std::vector reference; - reference += 1,2,3,4,5,6,7,8,9; - - std::vector test_cont(reference); - std::vector test_cont2(reference); - - std::make_heap(reference.begin(), reference.end()); - boost::make_heap(test_cont); - check_equal(reference, test_cont); - boost::make_heap(boost::make_iterator_range(test_cont2)); - check_equal(reference, test_cont2); - - std::push_heap(reference.begin(), reference.end()); - boost::push_heap(test_cont); - check_equal(reference, test_cont); - boost::push_heap(boost::make_iterator_range(test_cont2)); - check_equal(reference, test_cont2); - - std::make_heap(reference.begin(), reference.end()); - boost::make_heap(test_cont); - boost::make_heap(boost::make_iterator_range(test_cont2)); - - std::sort_heap(reference.begin(), reference.end()); - boost::sort_heap(test_cont); - check_equal(reference, test_cont); - boost::sort_heap(boost::make_iterator_range(test_cont2)); - check_equal(reference, test_cont2); - - std::make_heap(reference.begin(), reference.end()); - boost::make_heap(test_cont); - boost::make_heap(boost::make_iterator_range(test_cont2)); - - std::pop_heap(reference.begin(), reference.end()); - boost::pop_heap(test_cont); - check_equal(reference, test_cont); - boost::pop_heap(boost::make_iterator_range(test_cont2)); - check_equal(reference, test_cont2); - } - - template - void test_pred(BinaryPredicate pred) - { - using namespace boost::assign; - - std::vector reference; - reference += 1,2,3,4,5,6,7,8,9; - std::sort(reference.begin(), reference.end(), pred); - - std::vector test_cont(reference); - std::vector test_cont2(reference); - - std::make_heap(reference.begin(), reference.end(), pred); - boost::make_heap(test_cont, pred); - check_equal(reference, test_cont); - boost::make_heap(boost::make_iterator_range(test_cont2), pred); - check_equal(reference, test_cont2); - - reference.push_back(5); - test_cont.push_back(5); - test_cont2.push_back(5); - std::push_heap(reference.begin(), reference.end(), pred); - boost::push_heap(test_cont, pred); - check_equal(reference, test_cont); - boost::push_heap(boost::make_iterator_range(test_cont2), pred); - check_equal(reference, test_cont2); - - std::make_heap(reference.begin(), reference.end(), pred); - boost::make_heap(test_cont, pred); - boost::make_heap(boost::make_iterator_range(test_cont2), pred); - - std::sort_heap(reference.begin(), reference.end(), pred); - boost::sort_heap(test_cont, pred); - check_equal(reference, test_cont); - boost::sort_heap(boost::make_iterator_range(test_cont2), pred); - check_equal(reference, test_cont2); - - std::make_heap(reference.begin(), reference.end(), pred); - boost::make_heap(test_cont, pred); - boost::make_heap(boost::make_iterator_range(test_cont2), pred); - - std::pop_heap(reference.begin(), reference.end(), pred); - boost::pop_heap(test_cont, pred); - check_equal(reference, test_cont); - boost::pop_heap(boost::make_iterator_range(test_cont2), pred); - check_equal(reference, test_cont2); - } - - void test_heap() - { - test(); - test_pred(std::less()); - test_pred(std::greater()); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.heap" ); - - test->add( BOOST_TEST_CASE( &boost::test_heap ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/includes.cpp b/libs/range/test/algorithm_test/includes.cpp deleted file mode 100644 index 897753290..000000000 --- a/libs/range/test/algorithm_test/includes.cpp +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void test(Container1& cont1, Container2& cont2) - { - Container1 old_cont1(cont1); - Container2 old_cont2(cont2); - - bool reference_result - = std::includes(cont1.begin(), cont1.end(), - cont2.begin(), cont2.end()); - - bool test_result = boost::includes(cont1, cont2); - - BOOST_CHECK( reference_result == test_result ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - old_cont1.begin(), old_cont1.end(), - cont1.begin(), cont1.end() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - old_cont2.begin(), old_cont2.end(), - cont2.begin(), cont2.end() - ); - - BOOST_CHECK( test_result == boost::includes(boost::make_iterator_range(cont1), cont2) ); - BOOST_CHECK( test_result == boost::includes(cont1, boost::make_iterator_range(cont2)) ); - BOOST_CHECK( test_result == boost::includes(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2)) ); - } - - template - void sort_container(Container& cont, BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - std::vector temp(cont.begin(), cont.end()); - std::sort(temp.begin(), temp.end(), pred); - cont.assign(temp.begin(), temp.end()); - } - - template - void test_pred(Container1 cont1, Container2 cont2, - BinaryPredicate pred) - { - sort_container(cont1, pred); - sort_container(cont2, pred); - - Container1 old_cont1(cont1); - Container2 old_cont2(cont2); - - bool reference_result - = std::includes(cont1.begin(), cont1.end(), - cont2.begin(), cont2.end(), - pred); - - bool test_result = boost::includes(cont1, cont2, pred); - - BOOST_CHECK( reference_result == test_result ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - old_cont1.begin(), old_cont1.end(), - cont1.begin(), cont1.end() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - old_cont2.begin(), old_cont2.end(), - cont2.begin(), cont2.end() - ); - - BOOST_CHECK( test_result == boost::includes(boost::make_iterator_range(cont1), cont2, pred) ); - BOOST_CHECK( test_result == boost::includes(cont1, boost::make_iterator_range(cont2), pred) ); - BOOST_CHECK( test_result == boost::includes(boost::make_iterator_range(cont1), boost::make_iterator_range(cont2), pred) ); - } - - template - void test_includes_impl( - Container1& cont1, - Container2& cont2 - ) - { - test(cont1, cont2); - test_pred(cont1, cont2, std::less()); - test_pred(cont1, cont2, std::greater()); - } - - template - void test_includes_impl() - { - using namespace boost::assign; - - Container1 cont1; - Container2 cont2; - - test_includes_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1; - test_includes_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont2 += 1; - test_includes_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1,2,3,4,5,6,7,8,9; - cont2 += 2,3,4; - test_includes_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 2,3,4; - cont2 += 1,2,3,4,5,6,7,8,9; - test_includes_impl(cont1, cont2); - } - - void test_includes() - { - test_includes_impl< std::vector, std::vector >(); - test_includes_impl< std::list, std::list >(); - test_includes_impl< std::deque, std::deque >(); - test_includes_impl< std::vector, std::list >(); - test_includes_impl< std::list, std::vector >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.includes" ); - - test->add( BOOST_TEST_CASE( &boost::test_includes ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/inplace_merge.cpp b/libs/range/test/algorithm_test/inplace_merge.cpp deleted file mode 100644 index 948e95eff..000000000 --- a/libs/range/test/algorithm_test/inplace_merge.cpp +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void test(Container1& cont1, Container2& cont2) - { - typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t; - - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator - iterator_t BOOST_RANGE_UNUSED; - - std::vector reference_target(cont1.begin(), cont1.end()); - reference_target.insert(reference_target.end(), - cont2.begin(), cont2.end()); - - std::vector test_target(reference_target); - std::vector test_target2(reference_target); - - std::inplace_merge(reference_target.begin(), - reference_target.begin() + cont1.size(), - reference_target.end()); - - boost::inplace_merge(test_target, - test_target.begin() + cont1.size()); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference_target.begin(), reference_target.end(), - test_target.begin(), test_target.end() - ); - - boost::inplace_merge(boost::make_iterator_range(test_target2), - test_target2.begin() + cont1.size()); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference_target.begin(), reference_target.end(), - test_target2.begin(), test_target2.end() - ); - } - - template - void sort_container(Container& cont, BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - std::vector temp(cont.begin(), cont.end()); - std::sort(temp.begin(), temp.end(), pred); - cont.assign(temp.begin(), temp.end()); - } - - template - void test_pred(Container1 cont1, Container2 cont2, BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t; - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator - iterator_t BOOST_RANGE_UNUSED; - - sort_container(cont1, pred); - sort_container(cont2, pred); - - std::vector reference_target(cont1.begin(), cont1.end()); - reference_target.insert(reference_target.end(), - cont2.begin(), cont2.end()); - - std::vector test_target(reference_target); - std::vector test_target2(reference_target); - - std::inplace_merge(reference_target.begin(), - reference_target.begin() + cont1.size(), - reference_target.end(), pred); - - boost::inplace_merge(test_target, - test_target.begin() + cont1.size(), - pred); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference_target.begin(), reference_target.end(), - test_target.begin(), test_target.end() - ); - - boost::inplace_merge(boost::make_iterator_range(test_target2), - test_target2.begin() + cont1.size(), - pred); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference_target.begin(), reference_target.end(), - test_target2.begin(), test_target2.end() - ); - } - - template - void test_inplace_merge_impl(Container1& cont1, Container2& cont2) - { - test(cont1, cont2); - test_pred(cont1, cont2, std::less()); - test_pred(cont1, cont2, std::greater()); - } - - template - void test_inplace_merge_impl() - { - using namespace boost::assign; - - Container1 cont1; - Container2 cont2; - - test_inplace_merge_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1; - test_inplace_merge_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont2 += 1; - test_inplace_merge_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1,3,5,7,9,11,13,15,17,19; - cont2 += 2,4,6,8,10,12,14,16,18,20; - test_inplace_merge_impl(cont1, cont2); - } - - void test_inplace_merge() - { - test_inplace_merge_impl< std::vector, std::vector >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.inplace_merge" ); - - test->add( BOOST_TEST_CASE( &boost::test_inplace_merge ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/lexicographical_compare.cpp b/libs/range/test/algorithm_test/lexicographical_compare.cpp deleted file mode 100644 index f724bd1eb..000000000 --- a/libs/range/test/algorithm_test/lexicographical_compare.cpp +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void test_lexicographical_compare_impl_nopred(ForwardRange1& rng1, - ForwardRange2& rng2) - { - const bool reference = std::lexicographical_compare( - boost::begin(rng1), boost::end(rng1), - boost::begin(rng2), boost::end(rng2)); - - const bool test = boost::lexicographical_compare(rng1, rng2); - - BOOST_CHECK( reference == test ); - BOOST_CHECK( test == boost::lexicographical_compare(boost::make_iterator_range(rng1), rng2) ); - BOOST_CHECK( test == boost::lexicographical_compare(rng1, boost::make_iterator_range(rng2)) ); - BOOST_CHECK( test == boost::lexicographical_compare(boost::make_iterator_range(rng1), boost::make_iterator_range(rng2)) ); - } - - template - void test_lexicographical_compare_impl_pred(ForwardRange1& rng1, - ForwardRange2& rng2, - BinaryPredicate pred) - { - const bool reference = std::lexicographical_compare( - boost::begin(rng1), boost::end(rng1), - boost::begin(rng2), boost::end(rng2), - pred); - - const bool test = boost::lexicographical_compare(rng1, rng2, pred); - - BOOST_CHECK( reference == test ); - BOOST_CHECK( test == boost::lexicographical_compare(boost::make_iterator_range(rng1), rng2, pred) ); - BOOST_CHECK( test == boost::lexicographical_compare(rng1, boost::make_iterator_range(rng2), pred) ); - BOOST_CHECK( test == boost::lexicographical_compare(boost::make_iterator_range(rng1), boost::make_iterator_range(rng2), pred) ); - } - - template - void test_lexicographical_compare_impl(Container1& cont1, - Container2& cont2) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_value::type value_t; - - test_lexicographical_compare_impl_nopred(cont1, cont2); - test_lexicographical_compare_impl_pred(cont1, cont2, std::less()); - test_lexicographical_compare_impl_pred(cont1, cont2, std::greater()); - } - - template - void test_lexicographical_compare_impl() - { - using namespace boost::assign; - - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type container1_t; - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type container2_t; - - container1_t cont1; - container2_t cont2; - test_lexicographical_compare_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1.push_back(1); - cont2.push_back(1); - test_lexicographical_compare_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 2; - cont2 += 1; - test_lexicographical_compare_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1; - cont2 += 2; - test_lexicographical_compare_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1,2,3,4,5,6,7; - cont2 += 1,2,3,4,5,6,7; - test_lexicographical_compare_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1,2,3,4,5,6,7; - cont2 += 1,2,3,4,5,6; - test_lexicographical_compare_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1,2,3,4,5,6; - cont2 += 1,2,3,4,5,6,7; - test_lexicographical_compare_impl(cont1, cont2); - } - - template - void test_lexicographical_compare_rhs() - { - typedef BOOST_DEDUCED_TYPENAME range_value::type value_t; - - test_lexicographical_compare_impl >(); - test_lexicographical_compare_impl >(); - test_lexicographical_compare_impl >(); - test_lexicographical_compare_impl >(); - test_lexicographical_compare_impl >(); - test_lexicographical_compare_impl >(); - } - - void test_lexicographical_compare() - { - test_lexicographical_compare_rhs< const std::vector >(); - test_lexicographical_compare_rhs< const std::deque >(); - test_lexicographical_compare_rhs< const std::list >(); - test_lexicographical_compare_rhs< std::vector >(); - test_lexicographical_compare_rhs< std::deque >(); - test_lexicographical_compare_rhs< std::list >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.lexicographical_compare" ); - - test->add( BOOST_TEST_CASE( &boost::test_lexicographical_compare ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/lower_bound.cpp b/libs/range/test/algorithm_test/lower_bound.cpp deleted file mode 100644 index 2a120a487..000000000 --- a/libs/range/test/algorithm_test/lower_bound.cpp +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include "../test_driver/range_return_test_driver.hpp" -#include -#include -#include -#include -#include -#include - -namespace boost_range_test_algorithm_lower_bound -{ - class lower_bound_policy - { - public: - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::lower_bound(cont, 5); - BOOST_CHECK( result == boost::lower_bound(boost::make_iterator_range(cont), 5) ); - return result; - } - - template - struct test_range - { - template - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy&, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - result_t result = boost::lower_bound(cont, 5); - BOOST_CHECK( result == boost::lower_bound(boost::make_iterator_range(cont), 5) ); - return result; - } - }; - - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::lower_bound(cont.begin(), cont.end(), 5); - } - }; - - template< class BinaryPredicate > - struct lower_bound_pred_policy - { - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::lower_bound(cont, 5, m_pred); - BOOST_CHECK( result == boost::lower_bound( - boost::make_iterator_range(cont), 5, m_pred) ); - return result; - } - - template< boost::range_return_value return_type > - struct test_range - { - template - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - result_t result = boost::lower_bound(cont, 5, policy.pred()); - BOOST_CHECK( result == boost::lower_bound( - boost::make_iterator_range(cont), 5, policy.pred()) ); - return result; - } - }; - - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::lower_bound( - cont.begin(), cont.end(), 5, m_pred); - } - - BinaryPredicate& pred() { return m_pred; } - - private: - BinaryPredicate m_pred; - }; - - template - void test_lower_bound_impl(TestPolicy policy, BinaryPredicate pred) - { - using namespace boost::assign; - - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type container_t; - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - boost::range_test::range_return_test_driver test_driver; - - container_t mcont; - Container& cont = mcont; - - test_driver(cont, policy); - - mcont.clear(); - mcont += 1; - - std::vector temp(mcont.begin(), mcont.end()); - std::sort(temp.begin(), temp.end(), pred); - mcont.assign(temp.begin(), temp.end()); - - test_driver(cont, policy); - - mcont.clear(); - mcont += 1,2,3,4,5,6,7,8,9; - - temp.assign(mcont.begin(), mcont.end()); - std::sort(temp.begin(), temp.end(), pred); - mcont.assign(temp.begin(), temp.end()); - - test_driver(cont, policy); - } - - template - void test_lower_bound_impl() - { - test_lower_bound_impl( - lower_bound_policy(), - std::less() - ); - - test_lower_bound_impl( - lower_bound_pred_policy >(), - std::less() - ); - - test_lower_bound_impl( - lower_bound_pred_policy >(), - std::greater() - ); - } - - void test_lower_bound() - { - test_lower_bound_impl< std::vector >(); - test_lower_bound_impl< std::list >(); - test_lower_bound_impl< std::deque >(); - - test_lower_bound_impl< const std::vector >(); - test_lower_bound_impl< const std::list >(); - test_lower_bound_impl< const std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.lower_bound" ); - - test->add( BOOST_TEST_CASE( &boost_range_test_algorithm_lower_bound::test_lower_bound ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/max_element.cpp b/libs/range/test/algorithm_test/max_element.cpp deleted file mode 100644 index d4e87d5e7..000000000 --- a/libs/range/test/algorithm_test/max_element.cpp +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include "../test_driver/range_return_test_driver.hpp" -#include -#include -#include -#include -#include -#include - -namespace boost_range_test_algorithm_max_element -{ - class max_element_test_policy - { - public: - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::max_element(cont); - BOOST_CHECK( result == boost::max_element( - boost::make_iterator_range(cont)) ); - return result; - } - - template - struct test_range - { - template - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy&, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - result_t result = boost::max_element(cont); - BOOST_CHECK( result == boost::max_element( - boost::make_iterator_range(cont)) ); - return result; - } - }; - - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::max_element(cont.begin(), cont.end()); - } - }; - - template - class max_element_pred_test_policy - { - public: - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::max_element(cont, Pred()); - BOOST_CHECK( result == boost::max_element( - boost::make_iterator_range(cont), Pred()) ); - return result; - } - - Pred pred() const { return Pred(); } - - template< boost::range_return_value return_type > - struct test_range - { - template< class Container, class Policy > - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - result_t result = boost::max_element(cont, policy.pred()); - BOOST_CHECK( result == boost::max_element( - boost::make_iterator_range(cont), policy.pred()) ); - return result; - } - }; - - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::max_element(cont.begin(), cont.end(), Pred()); - } - }; - - template - void test_max_element_impl(TestPolicy policy) - { - using namespace boost::assign; - - typedef BOOST_DEDUCED_TYPENAME Container::value_type - value_t BOOST_RANGE_UNUSED; - - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type - container_t; - - boost::range_test::range_return_test_driver test_driver; - - container_t cont; - - test_driver(cont, policy); - - cont.clear(); - cont += 1; - - test_driver(cont, policy); - - cont.clear(); - cont += 1,2,2,2,3,4,5,6,7,8,9; - - test_driver(cont, policy); - } - - template - void test_max_element_impl() - { - test_max_element_impl(max_element_test_policy()); - - test_max_element_impl( - max_element_pred_test_policy >()); - - test_max_element_impl( - max_element_pred_test_policy >()); - } - - void test_max_element() - { - test_max_element_impl< const std::vector >(); - test_max_element_impl< const std::deque >(); - test_max_element_impl< const std::list >(); - - test_max_element_impl< std::vector >(); - test_max_element_impl< std::deque >(); - test_max_element_impl< std::list >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.max_element" ); - - test->add( BOOST_TEST_CASE( &boost_range_test_algorithm_max_element::test_max_element ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/merge.cpp b/libs/range/test/algorithm_test/merge.cpp deleted file mode 100644 index 503878219..000000000 --- a/libs/range/test/algorithm_test/merge.cpp +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void test(Container1& cont1, Container2& cont2) - { - typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t; - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator iterator_t; - - std::vector reference_target( cont1.size() + cont2.size() ); - - iterator_t reference_it - = std::merge(cont1.begin(), cont1.end(), - cont2.begin(), cont2.end(), - reference_target.begin()); - - std::vector test_target( cont1.size() + cont2.size() ); - - iterator_t test_it - = boost::merge(cont1, cont2, test_target.begin()); - - BOOST_CHECK_EQUAL( - std::distance(reference_target.begin(), reference_it), - std::distance(test_target.begin(), test_it) - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference_target.begin(), reference_target.end(), - test_target.begin(), test_target.end() - ); - - test_it = boost::merge(boost::make_iterator_range(cont1), - cont2, test_target.begin()); - - BOOST_CHECK_EQUAL( - std::distance(reference_target.begin(), reference_it), - std::distance(test_target.begin(), test_it) - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference_target.begin(), reference_target.end(), - test_target.begin(), test_target.end() - ); - - test_it = boost::merge(cont1, boost::make_iterator_range(cont2), - test_target.begin()); - - BOOST_CHECK_EQUAL( - std::distance(reference_target.begin(), reference_it), - std::distance(test_target.begin(), test_it) - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference_target.begin(), reference_target.end(), - test_target.begin(), test_target.end() - ); - - test_it = boost::merge(boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2), - test_target.begin()); - - BOOST_CHECK_EQUAL( - std::distance(reference_target.begin(), reference_it), - std::distance(test_target.begin(), test_it) - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference_target.begin(), reference_target.end(), - test_target.begin(), test_target.end() - ); - } - - template - void sort_container(Container& cont, BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - std::vector temp(cont.begin(), cont.end()); - std::sort(temp.begin(), temp.end(), pred); - cont.assign(temp.begin(), temp.end()); - } - - template - void test_pred(Container1 cont1, Container2 cont2, BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t; - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator iterator_t; - - sort_container(cont1, pred); - sort_container(cont2, pred); - - std::vector reference_target( cont1.size() + cont2.size() ); - - iterator_t reference_it - = std::merge(cont1.begin(), cont1.end(), - cont2.begin(), cont2.end(), - reference_target.begin(), pred); - - std::vector test_target( cont1.size() + cont2.size() ); - - iterator_t test_it - = boost::merge(cont1, cont2, test_target.begin(), pred); - - BOOST_CHECK_EQUAL( - std::distance(reference_target.begin(), reference_it), - std::distance(test_target.begin(), test_it) - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference_target.begin(), reference_target.end(), - test_target.begin(), test_target.end() - ); - - test_it = boost::merge(boost::make_iterator_range(cont1), cont2, - test_target.begin(), pred); - - BOOST_CHECK_EQUAL( - std::distance(reference_target.begin(), reference_it), - std::distance(test_target.begin(), test_it) - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference_target.begin(), reference_target.end(), - test_target.begin(), test_target.end() - ); - - test_it = boost::merge(cont1, boost::make_iterator_range(cont2), - test_target.begin(), pred); - - BOOST_CHECK_EQUAL( - std::distance(reference_target.begin(), reference_it), - std::distance(test_target.begin(), test_it) - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference_target.begin(), reference_target.end(), - test_target.begin(), test_target.end() - ); - - test_it = boost::merge(boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2), - test_target.begin(), pred); - - BOOST_CHECK_EQUAL( - std::distance(reference_target.begin(), reference_it), - std::distance(test_target.begin(), test_it) - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference_target.begin(), reference_target.end(), - test_target.begin(), test_target.end() - ); - } - - template - void test_merge_impl(Container1& cont1, Container2& cont2) - { - test(cont1, cont2); - test_pred(cont1, cont2, std::less()); - test_pred(cont1, cont2, std::greater()); - } - - template - void test_merge_impl() - { - using namespace boost::assign; - - Container1 cont1; - Container2 cont2; - - test_merge_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1; - test_merge_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont2 += 1; - test_merge_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1,3,5,7,9,11,13,15,17,19; - cont2 += 2,4,6,8,10,12,14,16,18,20; - test_merge_impl(cont1, cont2); - } - - void test_merge() - { - test_merge_impl< std::vector, std::vector >(); - test_merge_impl< std::list, std::list >(); - test_merge_impl< std::deque, std::deque >(); - - test_merge_impl< std::list, std::vector >(); - test_merge_impl< std::vector, std::list >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.merge" ); - - test->add( BOOST_TEST_CASE( &boost::test_merge ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/min_element.cpp b/libs/range/test/algorithm_test/min_element.cpp deleted file mode 100644 index bb92d2c1b..000000000 --- a/libs/range/test/algorithm_test/min_element.cpp +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include "../test_driver/range_return_test_driver.hpp" -#include -#include -#include -#include -#include -#include - -namespace boost_range_test_algorithm_min_element -{ - class min_element_test_policy - { - public: - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::min_element(cont); - BOOST_CHECK( result == boost::min_element(boost::make_iterator_range(cont)) ); - return result; - } - - template< boost::range_return_value return_type > - struct test_range - { - template< class Container, class Policy > - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy&, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - result_t result = boost::min_element(cont); - BOOST_CHECK( result == boost::min_element(boost::make_iterator_range(cont)) ); - return result; - } - }; - - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::min_element(cont.begin(), cont.end()); - } - }; - - template - class min_element_pred_test_policy - { - public: - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::min_element(cont, Pred()); - BOOST_CHECK( result == boost::min_element( - boost::make_iterator_range(cont), Pred()) ); - return result; - } - - Pred pred() const { return Pred(); } - - template< boost::range_return_value return_type > - struct test_range - { - template< class Container, class Policy > - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - result_t result = boost::min_element(cont, policy.pred()); - BOOST_CHECK( result == boost::min_element( - boost::make_iterator_range(cont), policy.pred()) ); - return result; - } - }; - - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::min_element(cont.begin(), cont.end(), Pred()); - } - }; - - template - void test_min_element_impl(TestPolicy policy) - { - using namespace boost::assign; - - typedef BOOST_DEDUCED_TYPENAME Container::value_type - value_t BOOST_RANGE_UNUSED; - - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type - container_t; - - boost::range_test::range_return_test_driver test_driver; - - container_t cont; - - test_driver(cont, policy); - - cont.clear(); - cont += 1; - - test_driver(cont, policy); - - cont.clear(); - cont += 1,2,2,2,3,4,5,6,7,8,9; - - test_driver(cont, policy); - } - - template - void test_min_element_impl() - { - test_min_element_impl(min_element_test_policy()); - - test_min_element_impl( - min_element_pred_test_policy >()); - - test_min_element_impl( - min_element_pred_test_policy >()); - } - - void test_min_element() - { - test_min_element_impl< const std::vector >(); - test_min_element_impl< const std::deque >(); - test_min_element_impl< const std::list >(); - - test_min_element_impl< std::vector >(); - test_min_element_impl< std::deque >(); - test_min_element_impl< std::list >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.min_element" ); - - test->add( BOOST_TEST_CASE( &boost_range_test_algorithm_min_element::test_min_element ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/mismatch.cpp b/libs/range/test/algorithm_test/mismatch.cpp deleted file mode 100644 index 407b5fcbb..000000000 --- a/libs/range/test/algorithm_test/mismatch.cpp +++ /dev/null @@ -1,242 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container1, class Container2 > - void eval_mismatch(Container1& cont1, - Container2& cont2, - BOOST_DEDUCED_TYPENAME range_iterator::type ref_it1, - BOOST_DEDUCED_TYPENAME range_iterator::type ref_it2 - ) - { - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter1_t; - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter2_t; - typedef std::pair result_pair_t; - - result_pair_t result = boost::mismatch(cont1, cont2); - BOOST_CHECK( result.first == ref_it1 ); - BOOST_CHECK( result.second == ref_it2 ); - - result = boost::mismatch(boost::make_iterator_range(cont1), - cont2); - BOOST_CHECK( result.first == ref_it1 ); - BOOST_CHECK( result.second == ref_it2 ); - - result = boost::mismatch(cont1, - boost::make_iterator_range(cont2)); - BOOST_CHECK( result.first == ref_it1 ); - BOOST_CHECK( result.second == ref_it2 ); - - result = boost::mismatch(boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2)); - BOOST_CHECK( result.first == ref_it1 ); - BOOST_CHECK( result.second == ref_it2 ); - } - - template< class Container1, class Container2, class Pred > - void eval_mismatch(Container1& cont1, - Container2& cont2, - Pred pred, - BOOST_DEDUCED_TYPENAME range_iterator::type ref_it1, - BOOST_DEDUCED_TYPENAME range_iterator::type ref_it2 - ) - { - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter1_t; - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter2_t; - typedef std::pair result_pair_t; - - result_pair_t result = boost::mismatch(cont1, cont2, pred); - BOOST_CHECK( result.first == ref_it1 ); - BOOST_CHECK( result.second == ref_it2 ); - - result = boost::mismatch(boost::make_iterator_range(cont1), - cont2, pred); - BOOST_CHECK( result.first == ref_it1 ); - BOOST_CHECK( result.second == ref_it2 ); - - result = boost::mismatch(cont1, - boost::make_iterator_range(cont2), pred); - BOOST_CHECK( result.first == ref_it1 ); - BOOST_CHECK( result.second == ref_it2 ); - - result = boost::mismatch(boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2), - pred); - BOOST_CHECK( result.first == ref_it1 ); - BOOST_CHECK( result.second == ref_it2 ); - } - - template< class Container1, class Container2 > - void eval_mismatch(Container1& cont1, - Container2& cont2, - const int ref1, - const int ref2) - { - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter1_t; - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter2_t; - typedef std::pair result_pair_t; - - result_pair_t result = boost::mismatch(cont1, cont2); - BOOST_CHECK_EQUAL( ref1, *result.first ); - BOOST_CHECK_EQUAL( ref2, *result.second ); - - result = boost::mismatch(boost::make_iterator_range(cont1), cont2); - BOOST_CHECK_EQUAL( ref1, *result.first ); - BOOST_CHECK_EQUAL( ref2, *result.second ); - - result = boost::mismatch(cont1, boost::make_iterator_range(cont2)); - BOOST_CHECK_EQUAL( ref1, *result.first ); - BOOST_CHECK_EQUAL( ref2, *result.second ); - - result = boost::mismatch(boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2)); - BOOST_CHECK_EQUAL( ref1, *result.first ); - BOOST_CHECK_EQUAL( ref2, *result.second ); - } - - template< class Container1, class Container2, class Pred > - void eval_mismatch(Container1& cont1, - Container2& cont2, - Pred pred, - const int ref1, - const int ref2) - { - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter1_t; - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iter2_t; - typedef std::pair result_pair_t; - - result_pair_t result = boost::mismatch(cont1, cont2, pred); - BOOST_CHECK_EQUAL( ref1, *result.first ); - BOOST_CHECK_EQUAL( ref2, *result.second ); - - result = boost::mismatch(boost::make_iterator_range(cont1), - cont2, pred); - BOOST_CHECK_EQUAL( ref1, *result.first ); - BOOST_CHECK_EQUAL( ref2, *result.second ); - - result = boost::mismatch(cont1, boost::make_iterator_range(cont2), - pred); - BOOST_CHECK_EQUAL( ref1, *result.first ); - BOOST_CHECK_EQUAL( ref2, *result.second ); - - result = boost::mismatch(boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2), - pred); - BOOST_CHECK_EQUAL( ref1, *result.first ); - BOOST_CHECK_EQUAL( ref2, *result.second ); - } - - template< class Container1, class Container2 > - void test_mismatch_impl() - { - using namespace boost::assign; - - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type MutableContainer1; - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type MutableContainer2; - - MutableContainer1 cont1; - const Container1& cref_cont1 = cont1; - MutableContainer2 cont2; - const Container2& cref_cont2 = cont2; - - typedef BOOST_DEDUCED_TYPENAME Container1::iterator - iterator1_t BOOST_RANGE_UNUSED; - - typedef BOOST_DEDUCED_TYPENAME Container1::const_iterator - const_iterator1_t BOOST_RANGE_UNUSED; - - typedef BOOST_DEDUCED_TYPENAME Container2::iterator - iterator2_t BOOST_RANGE_UNUSED; - - typedef BOOST_DEDUCED_TYPENAME Container2::const_iterator - const_iterator2_t BOOST_RANGE_UNUSED; - - eval_mismatch(cont1, cont2, cont1.end(), cont2.end()); - eval_mismatch(cont1, cont2, std::equal_to(), cont1.end(), cont2.end()); - eval_mismatch(cref_cont1, cont2, cref_cont1.end(), cont2.end()); - eval_mismatch(cref_cont1, cont2, std::equal_to(), cref_cont1.end(), cont2.end()); - eval_mismatch(cont1, cref_cont2, cont1.end(), cref_cont2.end()); - eval_mismatch(cont1, cref_cont2, std::equal_to(), cont1.end(), cref_cont2.end()); - eval_mismatch(cref_cont1, cref_cont2, cref_cont1.end(), cref_cont2.end()); - eval_mismatch(cref_cont1, cref_cont2, std::equal_to(), cref_cont1.end(), cref_cont2.end()); - - cont1 += 1,2,3,4; - cont2 += 1,2,3,4; - eval_mismatch(cont1, cont2, cont1.end(), cont2.end()); - eval_mismatch(cont1, cont2, std::equal_to(), cont1.end(), cont2.end()); - eval_mismatch(cref_cont1, cont2, cref_cont1.end(), cont2.end()); - eval_mismatch(cref_cont1, cont2, std::equal_to(), cref_cont1.end(), cont2.end()); - eval_mismatch(cont1, cref_cont2, cont1.end(), cref_cont2.end()); - eval_mismatch(cont1, cref_cont2, std::equal_to(), cont1.end(), cref_cont2.end()); - eval_mismatch(cref_cont1, cref_cont2, cref_cont1.end(), cref_cont2.end()); - eval_mismatch(cref_cont1, cref_cont2, std::equal_to(), cref_cont1.end(), cref_cont2.end()); - - cont1.clear(); - cont2.clear(); - cont1 += 1,2,3,4; - cont2 += 1,2,5,4; - eval_mismatch(cont1, cont2, 3, 5); - eval_mismatch(cont1, cont2, std::equal_to(), 3, 5); - eval_mismatch(cont1, cont2, std::not_equal_to(), cont1.begin(), cont2.begin()); - eval_mismatch(cref_cont1, cont2, 3, 5); - eval_mismatch(cref_cont1, cont2, std::equal_to(), 3, 5); - eval_mismatch(cref_cont1, cont2, std::not_equal_to(), cref_cont1.begin(), cont2.begin()); - eval_mismatch(cont1, cref_cont2, 3, 5); - eval_mismatch(cont1, cref_cont2, std::equal_to(), 3, 5); - eval_mismatch(cont1, cref_cont2, std::not_equal_to(), cont1.begin(), cref_cont2.begin()); - eval_mismatch(cref_cont1, cref_cont2, 3, 5); - eval_mismatch(cref_cont1, cref_cont2, std::equal_to(), 3, 5); - eval_mismatch(cref_cont1, cref_cont2, std::not_equal_to(), cref_cont1.begin(), cref_cont2.begin()); - } - - void test_mismatch() - { - test_mismatch_impl< std::list, std::list >(); - test_mismatch_impl< const std::list, std::list >(); - test_mismatch_impl< std::list, const std::list >(); - test_mismatch_impl< const std::list, const std::list >(); - - test_mismatch_impl< std::vector, std::list >(); - test_mismatch_impl< const std::vector, std::list >(); - test_mismatch_impl< std::vector, const std::list >(); - test_mismatch_impl< const std::vector, const std::list >(); - - test_mismatch_impl< std::list, std::vector >(); - test_mismatch_impl< const std::list, std::vector >(); - test_mismatch_impl< std::list, const std::vector >(); - test_mismatch_impl< const std::list, const std::vector >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.mismatch" ); - - test->add( BOOST_TEST_CASE( &boost::test_mismatch ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/next_permutation.cpp b/libs/range/test/algorithm_test/next_permutation.cpp deleted file mode 100644 index ee1c3716f..000000000 --- a/libs/range/test/algorithm_test/next_permutation.cpp +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void test_next_permutation_impl(const Container& cont) - { - Container reference(cont); - Container test(cont); - - const bool reference_ret - = std::next_permutation(reference.begin(), reference.end()); - - const bool test_ret = boost::next_permutation(test); - - BOOST_CHECK( reference_ret == test_ret ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - - test = cont; - - BOOST_CHECK( test_ret == boost::next_permutation(boost::make_iterator_range(test)) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - } - - template - void test_next_permutation_pred_impl(const Container& cont, - BinaryPredicate pred) - { - Container reference(cont); - Container test(cont); - - const bool reference_ret - = std::next_permutation(reference.begin(), reference.end(), - pred); - - const bool test_ret - = boost::next_permutation(test, pred); - - BOOST_CHECK( reference_ret == test_ret ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - - test = cont; - - BOOST_CHECK( test_ret == boost::next_permutation(boost::make_iterator_range(test), pred) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - } - - template - void test_next_permutation_(const Container& cont) - { - test_next_permutation_impl(cont); - test_next_permutation_pred_impl(cont, std::less()); - test_next_permutation_pred_impl(cont, std::greater()); - } - - template - void run_tests() - { - using namespace boost::assign; - - Container cont; - test_next_permutation_(cont); - - cont.clear(); - cont += 1; - test_next_permutation_(cont); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_next_permutation_(cont); - } - - void test_next_permutation() - { - run_tests< std::vector >(); - run_tests< std::list >(); - run_tests< std::deque >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.next_permutation" ); - - test->add( BOOST_TEST_CASE( &boost::test_next_permutation ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/nth_element.cpp b/libs/range/test/algorithm_test/nth_element.cpp deleted file mode 100644 index df241e9b5..000000000 --- a/libs/range/test/algorithm_test/nth_element.cpp +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - struct nth_element_policy - { - template - void test_nth_element(Container& cont, Iterator mid) - { - const Container old_cont(cont); - - boost::nth_element(cont, mid); - - // Test the same operation on the container, for the - // case where a temporary is passed as the first - // argument. - Container cont2(old_cont); - const std::size_t index = std::distance(cont.begin(), mid); - Iterator mid2(cont2.begin()); - std::advance(mid2, index); - boost::nth_element(boost::make_iterator_range(cont2), mid2); - - BOOST_CHECK_EQUAL_COLLECTIONS( cont.begin(), cont.end(), - cont2.begin(), cont2.end() ); - } - - template - void reference_nth_element(Container& cont, Iterator mid) - { - std::nth_element(cont.begin(), mid, cont.end()); - } - }; - - template - struct nth_element_pred_policy - { - template - void test_nth_element(Container& cont, Iterator mid) - { - const Container old_cont(cont); - - boost::nth_element(cont, mid, BinaryPredicate()); - - Container cont2(old_cont); - const std::size_t index = std::distance(cont.begin(), mid); - Iterator mid2(cont2.begin()); - std::advance(mid2, index); - boost::nth_element(boost::make_iterator_range(cont2), mid2, - BinaryPredicate()); - - BOOST_CHECK_EQUAL_COLLECTIONS( cont.begin(), cont.end(), - cont2.begin(), cont2.end() ); - } - - template - void reference_nth_element(Container& cont, Iterator mid) - { - std::nth_element(cont.begin(), mid, cont.end(), BinaryPredicate()); - } - }; - - template - void test_nth_element_tp_impl(Container& cont, TestPolicy policy) - { - Container reference(cont); - Container test(cont); - - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator_t; - - BOOST_CHECK_EQUAL( reference.size(), test.size() ); - if (reference.size() != test.size()) - return; - - iterator_t reference_mid = reference.begin(); - iterator_t test_mid = test.begin(); - - bool complete = false; - while (!complete) - { - if (reference_mid == reference.end()) - complete = true; - - policy.test_nth_element(test, test_mid); - policy.reference_nth_element(reference, reference_mid); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - - if (reference_mid != reference.end()) - { - ++reference_mid; - ++test_mid; - } - } - } - - template - void test_nth_element_impl(Container& cont) - { - test_nth_element_tp_impl(cont, nth_element_policy()); - } - - template - void test_nth_element_impl(Container& cont, BinaryPredicate pred) - { - test_nth_element_tp_impl(cont, nth_element_pred_policy()); - } - - template - void run_tests(Container& cont) - { - test_nth_element_impl(cont); - test_nth_element_impl(cont, std::less()); - test_nth_element_impl(cont, std::greater()); - } - - template - void test_nth_element_impl() - { - using namespace boost::assign; - - Container cont; - run_tests(cont); - - cont.clear(); - cont += 1; - run_tests(cont); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - run_tests(cont); - } - - void test_nth_element() - { - test_nth_element_impl< std::vector >(); - test_nth_element_impl< std::deque >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.nth_element" ); - - test->add( BOOST_TEST_CASE( &boost::test_nth_element ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/partial_sort.cpp b/libs/range/test/algorithm_test/partial_sort.cpp deleted file mode 100644 index c13f7f1aa..000000000 --- a/libs/range/test/algorithm_test/partial_sort.cpp +++ /dev/null @@ -1,171 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - struct partial_sort_policy - { - template - void test_partial_sort(Container& cont, Iterator mid) - { - const Container old_cont(cont); - - boost::partial_sort(cont, mid); - - const std::size_t index = std::distance(cont.begin(), mid); - Container cont2(old_cont); - Iterator mid2(cont2.begin()); - std::advance(mid2, index); - boost::partial_sort(cont2, mid2); - - BOOST_CHECK_EQUAL_COLLECTIONS( cont.begin(), cont.end(), - cont2.begin(), cont2.end() ); - } - - template - void reference_partial_sort(Container& cont, Iterator mid) - { - std::partial_sort(cont.begin(), mid, cont.end()); - } - }; - - template - struct partial_sort_pred_policy - { - template - void test_partial_sort(Container& cont, Iterator mid) - { - const Container old_cont(cont); - - boost::partial_sort(cont, mid, BinaryPredicate()); - - const std::size_t index = std::distance(cont.begin(), mid); - Container cont2(old_cont); - Iterator mid2(cont2.begin()); - std::advance(mid2, index); - boost::partial_sort(cont2, mid2, BinaryPredicate()); - - BOOST_CHECK_EQUAL_COLLECTIONS( cont.begin(), cont.end(), - cont2.begin(), cont2.end() ); - } - - template - void reference_partial_sort(Container& cont, Iterator mid) - { - std::partial_sort(cont.begin(), mid, cont.end(), BinaryPredicate()); - } - }; - - template - void test_partial_sort_tp_impl(Container& cont, TestPolicy policy) - { - Container reference(cont); - Container test(cont); - - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator_t; - - BOOST_CHECK_EQUAL( reference.size(), test.size() ); - if (reference.size() != test.size()) - return; - - iterator_t reference_mid = reference.begin(); - iterator_t test_mid = test.begin(); - - bool complete = false; - while (!complete) - { - if (reference_mid == reference.end()) - complete = true; - - policy.test_partial_sort(test, test_mid); - policy.reference_partial_sort(reference, reference_mid); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - - if (reference_mid != reference.end()) - { - ++reference_mid; - ++test_mid; - } - } - } - - template - void test_partial_sort_impl(Container& cont) - { - test_partial_sort_tp_impl(cont, partial_sort_policy()); - } - - template - void test_partial_sort_impl(Container& cont, BinaryPredicate pred) - { - test_partial_sort_tp_impl(cont, partial_sort_pred_policy()); - } - - template - void test_partial_sort_impl() - { - using namespace boost::assign; - - Container cont; - test_partial_sort_impl(cont); - test_partial_sort_impl(cont, std::less()); - test_partial_sort_impl(cont, std::greater()); - - cont.clear(); - cont += 1; - test_partial_sort_impl(cont); - test_partial_sort_impl(cont, std::less()); - test_partial_sort_impl(cont, std::greater()); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_partial_sort_impl(cont); - test_partial_sort_impl(cont, std::less()); - test_partial_sort_impl(cont, std::greater()); - } - - void test_partial_sort() - { - test_partial_sort_impl< std::vector >(); - test_partial_sort_impl< std::deque >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.partial_sort" ); - - test->add( BOOST_TEST_CASE( &boost::test_partial_sort ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/partition.cpp b/libs/range/test/algorithm_test/partition.cpp deleted file mode 100644 index 22aefd68f..000000000 --- a/libs/range/test/algorithm_test/partition.cpp +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include "../test_driver/range_return_test_driver.hpp" -#include -#include -#include -#include -#include -#include - -namespace boost_range_test_algorithm_partition -{ - struct equal_to_5 - { - typedef bool result_type; - typedef int argument_type; - bool operator()(int x) const { return x == 5; } - }; - - // test the 'partition' algorithm - template - class partition_test_policy - { - public: - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - - const Container old_cont(cont); - Container cont2(old_cont); - iter_t result = boost::partition(cont, UnaryPredicate()); - - boost::partition(cont2, UnaryPredicate()); - cont2 = old_cont; - boost::partition( - boost::make_iterator_range(cont2), UnaryPredicate()); - - BOOST_CHECK_EQUAL_COLLECTIONS( cont.begin(), cont.end(), - cont2.begin(), cont2.end() ); - - return result; - } - - UnaryPredicate pred() const { return UnaryPredicate(); } - - template< boost::range_return_value return_type > - struct test_range - { - template< class Container, class Policy > - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - - const Container old_cont(cont); - Container cont2(old_cont); - result_t result = boost::partition(cont, policy.pred()); - - // Test that operation a temporary created by using - // make_iterator_range. - boost::partition( - boost::make_iterator_range(cont2), policy.pred()); - - BOOST_CHECK_EQUAL_COLLECTIONS( cont.begin(), cont.end(), - cont2.begin(), cont2.end() ); - - return result; - } - }; - - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::partition(cont.begin(), cont.end(), UnaryPredicate()); - } - }; - - template - void test_partition_impl() - { - using namespace boost::assign; - - boost::range_test::range_return_test_driver test_driver; - - partition_test_policy< equal_to_5 > policy; - - Container cont; - test_driver(cont, policy); - - cont.clear(); - cont += 1; - test_driver(cont, policy); - - cont.clear(); - cont += 1,2,2,2,2,2,3,4,5,6,7,8,9; - test_driver(cont, policy); - - cont.clear(); - cont += 1,2,2,2,2,2,3,3,3,3,4,4,4,4,4,4,4,5,6,7,8,9; - test_driver(cont, policy); - } - - void test_partition() - { - test_partition_impl< std::vector >(); - test_partition_impl< std::list >(); - test_partition_impl< std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.partition" ); - - test->add( BOOST_TEST_CASE( &boost_range_test_algorithm_partition::test_partition ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/prev_permutation.cpp b/libs/range/test/algorithm_test/prev_permutation.cpp deleted file mode 100644 index a4adc7b34..000000000 --- a/libs/range/test/algorithm_test/prev_permutation.cpp +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void test_prev_permutation_impl(const Container& cont) - { - Container reference(cont); - Container test(cont); - Container test2(cont); - - const bool reference_ret - = std::prev_permutation(reference.begin(), reference.end()); - - const bool test_ret = boost::prev_permutation(test); - - BOOST_CHECK( reference_ret == test_ret ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - - BOOST_CHECK( test_ret == boost::prev_permutation( - boost::make_iterator_range(test2)) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test2.begin(), test2.end() - ); - } - - template - void test_prev_permutation_pred_impl(const Container& cont, - BinaryPredicate pred) - { - Container reference(cont); - Container test(cont); - Container test2(cont); - - const bool reference_ret - = std::prev_permutation(reference.begin(), reference.end(), - pred); - - const bool test_ret = boost::prev_permutation(test, pred); - - BOOST_CHECK( reference_ret == test_ret ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - - BOOST_CHECK( test_ret == boost::prev_permutation( - boost::make_iterator_range(test2), pred) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test2.begin(), test2.end() - ); - } - - template - void test_prev_permutation_(const Container& cont) - { - test_prev_permutation_impl(cont); - test_prev_permutation_pred_impl(cont, std::less()); - test_prev_permutation_pred_impl(cont, std::greater()); - } - - template - void run_tests() - { - using namespace boost::assign; - - Container cont; - test_prev_permutation_(cont); - - cont.clear(); - cont += 1; - test_prev_permutation_(cont); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_prev_permutation_(cont); - } - - void test_prev_permutation() - { - run_tests< std::vector >(); - run_tests< std::list >(); - run_tests< std::deque >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.prev_permutation" ); - - test->add( BOOST_TEST_CASE( &boost::test_prev_permutation ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/random_shuffle.cpp b/libs/range/test/algorithm_test/random_shuffle.cpp deleted file mode 100644 index 71915ee83..000000000 --- a/libs/range/test/algorithm_test/random_shuffle.cpp +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include "../test_function/counted_function.hpp" -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - class counted_generator - : private range_test_function::counted_function - { - public: - typedef Int result_type; - typedef Int argument_type; - - using range_test_function::counted_function::invocation_count; - - result_type operator()(argument_type modulo_value) - { - invoked(); - return static_cast(std::rand() % modulo_value); - } - }; - - template - bool test_shuffle_result( - const Container& old_cont, - const Container& new_cont - ) - { - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator_t; - - // The size must remain equal - BOOST_CHECK_EQUAL( old_cont.size(), new_cont.size() ); - if (old_cont.size() != new_cont.size()) - return false; - - if (new_cont.size() < 2) - { - BOOST_CHECK_EQUAL_COLLECTIONS( - old_cont.begin(), old_cont.end(), - new_cont.begin(), new_cont.end() - ); - - return std::equal(old_cont.begin(), old_cont.end(), - new_cont.begin()); - } - - // Elements must only be moved around. This is tested by - // ensuring the count of each element remains the - // same. - bool failed = false; - iterator_t last = old_cont.end(); - for (iterator_t it = old_cont.begin(); !failed && (it != last); ++it) - { - const std::size_t old_count - = std::count(old_cont.begin(), old_cont.end(), *it); - - const std::size_t new_count - = std::count(new_cont.begin(), new_cont.end(), *it); - - BOOST_CHECK_EQUAL( old_count, new_count ); - - failed = (old_count != new_count); - } - - return !failed; - } - - template - void test_random_shuffle_nogen_impl(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME range_iterator::type - iterator_t BOOST_RANGE_UNUSED; - - const int MAX_RETRIES = 10000; - - bool shuffled = false; - for (int attempt = 0; !shuffled && (attempt < MAX_RETRIES); ++attempt) - { - Container test(cont); - boost::random_shuffle(test); - bool ok = test_shuffle_result(cont, test); - if (!ok) - break; - - // Since the counts are equal, then if they are - // not equal the contents must have been shuffled - if (cont.size() == test.size() - && !std::equal(cont.begin(), cont.end(), test.begin())) - { - shuffled = true; - } - - // Verify that the shuffle can be performed on a - // temporary range - Container test2(cont); - boost::random_shuffle(boost::make_iterator_range(test2)); - ok = test_shuffle_result(cont, test2); - if (!ok) - break; - } - } - - template - void test_random_shuffle_gen_impl(Container& cont) - { - RandomGenerator gen; - Container old_cont(cont); - boost::random_shuffle(cont, gen); - test_shuffle_result(cont, old_cont); - if (cont.size() > 2) - { - BOOST_CHECK( gen.invocation_count() > 0 ); - } - - // Test that random shuffle works when - // passed a temporary range - RandomGenerator gen2; - Container cont2(old_cont); - boost::random_shuffle(boost::make_iterator_range(cont2), gen2); - test_shuffle_result(cont2, old_cont); - if (cont2.size() > 2) - { - BOOST_CHECK( gen2.invocation_count() > 0 ); - } - } - - template - void test_random_shuffle_impl(Container& cont) - { - Container old_cont(cont); - boost::random_shuffle(cont); - test_shuffle_result(cont, old_cont); - } - - template - void test_random_shuffle_impl() - { - using namespace boost::assign; - - typedef counted_generator< - BOOST_DEDUCED_TYPENAME range_difference::type > generator_t; - - Container cont; - test_random_shuffle_nogen_impl(cont); - test_random_shuffle_gen_impl(cont); - - cont.clear(); - cont += 1; - test_random_shuffle_nogen_impl(cont); - test_random_shuffle_gen_impl(cont); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_random_shuffle_nogen_impl(cont); - test_random_shuffle_gen_impl(cont); - } - - void test_random_shuffle() - { - test_random_shuffle_impl< std::vector >(); - test_random_shuffle_impl< std::deque >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.random_shuffle" ); - - test->add( BOOST_TEST_CASE( &boost::test_random_shuffle ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/remove.cpp b/libs/range/test/algorithm_test/remove.cpp deleted file mode 100644 index 3e4ab16b2..000000000 --- a/libs/range/test/algorithm_test/remove.cpp +++ /dev/null @@ -1,101 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container, class Value > - void test_remove_impl( const Container& c, Value to_remove ) - { - Container reference(c); - - typedef BOOST_DEDUCED_TYPENAME Container::iterator iterator_t; - - iterator_t reference_it - = std::remove(reference.begin(), reference.end(), to_remove); - - Container test(c); - iterator_t test_it = boost::remove(test, to_remove); - - BOOST_CHECK_EQUAL( std::distance(test.begin(), test_it), - std::distance(reference.begin(), reference_it) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - Container test2(c); - iterator_t test_it2 = boost::remove(test2, to_remove); - - BOOST_CHECK_EQUAL( std::distance(test2.begin(), test_it2), - std::distance(reference.begin(), reference_it) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test2.begin(), test2.end() ); - } - - template< class Container > - void test_remove_impl() - { - using namespace boost::assign; - - Container cont; - test_remove_impl(cont, 0); - - cont.clear(); - cont += 1; - test_remove_impl(cont, 0); - test_remove_impl(cont, 1); - - cont.clear(); - cont += 1,1,1,1,1; - test_remove_impl(cont, 0); - test_remove_impl(cont, 1); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_remove_impl(cont, 1); - test_remove_impl(cont, 9); - test_remove_impl(cont, 4); - } - - void test_remove() - { - test_remove_impl< std::vector >(); - test_remove_impl< std::list >(); - test_remove_impl< std::deque >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.remove" ); - - test->add( BOOST_TEST_CASE( &boost::test_remove ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/remove_copy.cpp b/libs/range/test/algorithm_test/remove_copy.cpp deleted file mode 100644 index b3eb8e22c..000000000 --- a/libs/range/test/algorithm_test/remove_copy.cpp +++ /dev/null @@ -1,108 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - template - void test_append(Iterator target, Value value) - { - *target++ = value; - } - - template< class Container, class Value > - void test_remove_copy_impl( const Container& c, Value to_remove ) - { - typedef typename boost::range_value::type value_type; - std::vector reference; - - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator - iterator_t BOOST_RANGE_UNUSED; - - test_append( - std::remove_copy(c.begin(), c.end(), - std::back_inserter(reference), to_remove), - to_remove); - - std::vector test; - test_append( - boost::remove_copy(c, std::back_inserter(test), to_remove), - to_remove); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - std::vector test2; - test_append( - boost::remove_copy(boost::make_iterator_range(c), - std::back_inserter(test2), to_remove), - to_remove); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test2.begin(), test2.end() ); - } - - template< class Container > - void test_remove_copy_impl() - { - using namespace boost::assign; - - Container cont; - test_remove_copy_impl(cont, 0); - - cont.clear(); - cont += 1; - test_remove_copy_impl(cont, 0); - test_remove_copy_impl(cont, 1); - - cont.clear(); - cont += 1,1,1,1,1; - test_remove_copy_impl(cont, 0); - test_remove_copy_impl(cont, 1); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_remove_copy_impl(cont, 1); - test_remove_copy_impl(cont, 9); - test_remove_copy_impl(cont, 4); - } - - void test_remove_copy() - { - test_remove_copy_impl< std::vector >(); - test_remove_copy_impl< std::list >(); - test_remove_copy_impl< std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.remove_copy" ); - - test->add( BOOST_TEST_CASE( &test_remove_copy ) ); - - return test; -} - diff --git a/libs/range/test/algorithm_test/remove_copy_if.cpp b/libs/range/test/algorithm_test/remove_copy_if.cpp deleted file mode 100644 index c269c2a69..000000000 --- a/libs/range/test/algorithm_test/remove_copy_if.cpp +++ /dev/null @@ -1,113 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - template< class Iterator, class Value > - void test_append(Iterator target, Value value) - { - *target++ = value; - } - - template< class Container, class UnaryPredicate > - void test_remove_copy_if_impl( const Container& c, UnaryPredicate pred ) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_value::type value_type; - std::vector reference; - - test_append( - std::remove_copy_if(c.begin(), c.end(), std::back_inserter(reference), pred), - value_type() - ); - - std::vector test; - test_append( - boost::remove_copy_if(c, std::back_inserter(test), pred), - value_type() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - std::vector test2; - test_append( - boost::remove_copy_if(boost::make_iterator_range(c), - std::back_inserter(test2), pred), - value_type() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test2.begin(), test2.end() ); - } - - template< class Container > - void test_remove_copy_if_( const Container& c, int to_remove ) - { - test_remove_copy_if_impl(c, boost::bind(std::equal_to(), _1, to_remove)); - test_remove_copy_if_impl(c, boost::bind(std::not_equal_to(), _1, to_remove)); - } - - template< class Container > - void test_remove_copy_if_impl() - { - using namespace boost::assign; - - Container cont; - test_remove_copy_if_(cont, 0); - - cont.clear(); - cont += 1; - test_remove_copy_if_(cont, 0); - test_remove_copy_if_(cont, 1); - - cont.clear(); - cont += 1,1,1,1,1; - test_remove_copy_if_(cont, 0); - test_remove_copy_if_(cont, 1); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_remove_copy_if_(cont, 1); - test_remove_copy_if_(cont, 9); - test_remove_copy_if_(cont, 4); - } - - inline void test_remove_copy_if() - { - test_remove_copy_if_impl< std::vector >(); - test_remove_copy_if_impl< std::list >(); - test_remove_copy_if_impl< std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.remove_copy_if" ); - - test->add( BOOST_TEST_CASE( &test_remove_copy_if ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/remove_if.cpp b/libs/range/test/algorithm_test/remove_if.cpp deleted file mode 100644 index 58fc07f26..000000000 --- a/libs/range/test/algorithm_test/remove_if.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container, class UnaryPredicate > - void test_remove_if_impl( const Container& c, UnaryPredicate pred ) - { - Container reference(c); - - typedef BOOST_DEDUCED_TYPENAME Container::iterator iterator_t; - - iterator_t reference_it - = std::remove_if(reference.begin(), reference.end(), pred); - - Container test(c); - iterator_t test_it = boost::remove_if(test, pred); - - BOOST_CHECK_EQUAL( std::distance(test.begin(), test_it), - std::distance(reference.begin(), reference_it) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - Container test2(c); - iterator_t test_it2 = boost::remove_if( - boost::make_iterator_range(test2), pred); - - BOOST_CHECK_EQUAL( std::distance(test2.begin(), test_it2), - std::distance(reference.begin(), reference_it) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test2.begin(), test2.end() ); - } - - template< class Container > - void test_remove_if_( const Container& c, int to_remove ) - { - test_remove_if_impl(c, boost::bind(std::equal_to(), _1, to_remove)); - test_remove_if_impl(c, boost::bind(std::not_equal_to(), _1, to_remove)); - } - - template< class Container > - void test_remove_if_impl() - { - using namespace boost::assign; - - Container cont; - test_remove_if_(cont, 0); - - cont.clear(); - cont += 1; - test_remove_if_(cont, 0); - test_remove_if_(cont, 1); - - cont.clear(); - cont += 1,1,1,1,1; - test_remove_if_(cont, 0); - test_remove_if_(cont, 1); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_remove_if_(cont, 1); - test_remove_if_(cont, 9); - test_remove_if_(cont, 4); - } - - inline void test_remove_if() - { - test_remove_if_impl< std::vector >(); - test_remove_if_impl< std::list >(); - test_remove_if_impl< std::deque >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.remove_if" ); - - test->add( BOOST_TEST_CASE( &boost::test_remove_if ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/replace.cpp b/libs/range/test/algorithm_test/replace.cpp deleted file mode 100644 index 356024ff5..000000000 --- a/libs/range/test/algorithm_test/replace.cpp +++ /dev/null @@ -1,86 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void test_replace_impl(Container& cont) - { - const int what = 2; - const int with_what = 5; - - std::vector reference(cont.begin(), cont.end()); - std::replace(reference.begin(), reference.end(), what, with_what); - - std::vector target(cont.begin(), cont.end()); - boost::replace(target, what, with_what); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target.begin(), target.end() ); - - std::vector target2(cont.begin(), cont.end()); - boost::replace(boost::make_iterator_range(target2), what, - with_what); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target2.begin(), target2.end() ); - - } - - template< class Container > - void test_replace_impl() - { - using namespace boost::assign; - - Container cont; - test_replace_impl(cont); - - cont.clear(); - cont += 1; - test_replace_impl(cont); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_replace_impl(cont); - } - - void test_replace() - { - test_replace_impl< std::vector >(); - test_replace_impl< std::list >(); - test_replace_impl< std::deque >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.replace" ); - - test->add( BOOST_TEST_CASE( &boost::test_replace ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/replace_copy.cpp b/libs/range/test/algorithm_test/replace_copy.cpp deleted file mode 100644 index 56298569a..000000000 --- a/libs/range/test/algorithm_test/replace_copy.cpp +++ /dev/null @@ -1,111 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - template - void test_append(Iterator target, Value value) - { - *target++ = value; - } - - template< class Container, class Value > - void test_replace_copy_impl( const Container& c, Value to_replace ) - { - const Value replace_with = to_replace * 2; - - typedef typename boost::range_value::type value_type; - std::vector reference; - - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator - iterator_t BOOST_RANGE_UNUSED; - - test_append( - std::replace_copy(c.begin(), c.end(), - std::back_inserter(reference), to_replace, replace_with), - to_replace); - - std::vector test; - test_append( - boost::replace_copy(c, std::back_inserter(test), to_replace, replace_with), - to_replace); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - std::vector test2; - test_append( - boost::replace_copy(boost::make_iterator_range(c), - std::back_inserter(test2), to_replace, - replace_with), - to_replace); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test2.begin(), test2.end() ); - } - - template< class Container > - void test_replace_copy_impl() - { - using namespace boost::assign; - - Container cont; - test_replace_copy_impl(cont, 0); - - cont.clear(); - cont += 1; - test_replace_copy_impl(cont, 0); - test_replace_copy_impl(cont, 1); - - cont.clear(); - cont += 1,1,1,1,1; - test_replace_copy_impl(cont, 0); - test_replace_copy_impl(cont, 1); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_replace_copy_impl(cont, 1); - test_replace_copy_impl(cont, 9); - test_replace_copy_impl(cont, 4); - } - - void test_replace_copy() - { - test_replace_copy_impl< std::vector >(); - test_replace_copy_impl< std::list >(); - test_replace_copy_impl< std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.replace_copy" ); - - test->add( BOOST_TEST_CASE( &test_replace_copy ) ); - - return test; -} - diff --git a/libs/range/test/algorithm_test/replace_copy_if.cpp b/libs/range/test/algorithm_test/replace_copy_if.cpp deleted file mode 100644 index 68735477c..000000000 --- a/libs/range/test/algorithm_test/replace_copy_if.cpp +++ /dev/null @@ -1,115 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - template< class Iterator, class Value > - void test_append(Iterator target, Value value) - { - *target++ = value; - } - - template< class Container, class UnaryPredicate > - void test_replace_copy_if_impl( const Container& c, UnaryPredicate pred ) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_value::type value_type; - const value_type replace_with = value_type(); - std::vector reference; - - test_append( - std::replace_copy_if(c.begin(), c.end(), std::back_inserter(reference), pred, replace_with), - value_type() - ); - - std::vector test; - test_append( - boost::replace_copy_if(c, std::back_inserter(test), pred, replace_with), - value_type() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - std::vector test2; - test_append( - boost::replace_copy_if(boost::make_iterator_range(c), - std::back_inserter(test2), pred, - replace_with), - value_type() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test2.begin(), test2.end() ); - } - - template< class Container > - void test_replace_copy_if_( const Container& c, int to_replace ) - { - test_replace_copy_if_impl(c, boost::bind(std::equal_to(), _1, to_replace)); - test_replace_copy_if_impl(c, boost::bind(std::not_equal_to(), _1, to_replace)); - } - - template< class Container > - void test_replace_copy_if_impl() - { - using namespace boost::assign; - - Container cont; - test_replace_copy_if_(cont, 0); - - cont.clear(); - cont += 1; - test_replace_copy_if_(cont, 0); - test_replace_copy_if_(cont, 1); - - cont.clear(); - cont += 1,1,1,1,1; - test_replace_copy_if_(cont, 0); - test_replace_copy_if_(cont, 1); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_replace_copy_if_(cont, 1); - test_replace_copy_if_(cont, 9); - test_replace_copy_if_(cont, 4); - } - - inline void test_replace_copy_if() - { - test_replace_copy_if_impl< std::vector >(); - test_replace_copy_if_impl< std::list >(); - test_replace_copy_if_impl< std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.replace_copy_if" ); - - test->add( BOOST_TEST_CASE( &test_replace_copy_if ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/replace_if.cpp b/libs/range/test/algorithm_test/replace_if.cpp deleted file mode 100644 index 12d729349..000000000 --- a/libs/range/test/algorithm_test/replace_if.cpp +++ /dev/null @@ -1,96 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container, class UnaryPredicate > - void test_replace_if_impl(Container& cont, UnaryPredicate pred) - { - const int what = 2; - const int with_what = 5; - - std::vector reference(cont.begin(), cont.end()); - std::replace_if(reference.begin(), reference.end(), - boost::bind(pred, _1, what), with_what); - - std::vector target(cont.begin(), cont.end()); - boost::replace_if(target, boost::bind(pred, _1, what), with_what); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target.begin(), target.end() ); - - std::vector target2(cont.begin(), cont.end()); - boost::replace_if(boost::make_iterator_range(target2), - boost::bind(pred, _1, what), with_what); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target2.begin(), target2.end() ); - } - - template< class Container > - void test_replace_if_impl(Container& cont) - { - test_replace_if_impl(cont, std::equal_to()); - test_replace_if_impl(cont, std::not_equal_to()); - } - - template< class Container > - void test_replace_if_impl() - { - using namespace boost::assign; - - Container cont; - test_replace_if_impl(cont); - - cont.clear(); - cont += 1; - test_replace_if_impl(cont); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_replace_if_impl(cont); - } - - void test_replace_if() - { - test_replace_if_impl< std::vector >(); - test_replace_if_impl< std::list >(); - test_replace_if_impl< std::deque >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.replace_if" ); - - test->add( BOOST_TEST_CASE( &boost::test_replace_if ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/reverse.cpp b/libs/range/test/algorithm_test/reverse.cpp deleted file mode 100644 index 3ad63cb0f..000000000 --- a/libs/range/test/algorithm_test/reverse.cpp +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void test_reverse_impl(Container& cont) - { - Container reference(cont); - Container test(cont); - Container test2(cont); - - boost::reverse(test); - std::reverse(reference.begin(), reference.end()); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - boost::reverse(boost::make_iterator_range(test2)); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test2.begin(), test2.end() ); - } - - template - void test_reverse_impl() - { - using namespace boost::assign; - - Container cont; - test_reverse_impl(cont); - - cont.clear(); - cont += 1; - test_reverse_impl(cont); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_reverse_impl(cont); - } - - void test_reverse() - { - test_reverse_impl< std::vector >(); - test_reverse_impl< std::list >(); - test_reverse_impl< std::deque >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.reverse" ); - - test->add( BOOST_TEST_CASE( &boost::test_reverse ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/reverse_copy.cpp b/libs/range/test/algorithm_test/reverse_copy.cpp deleted file mode 100644 index 92ef48557..000000000 --- a/libs/range/test/algorithm_test/reverse_copy.cpp +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - template - void test_append(OutputIterator out, Value value) - { - *out++ = value; - } - - template - void test_reverse_copy_impl(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_value::type value_type; - std::vector reference; - std::vector test; - - test_append( - std::reverse_copy(cont.begin(), cont.end(), std::back_inserter(reference)), - value_type() - ); - - test_append( - boost::reverse_copy(cont, std::back_inserter(test)), - value_type() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - test.clear(); - - test_append( - boost::reverse_copy(boost::make_iterator_range(cont), - std::back_inserter(test)), - value_type() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - } - - template - void test_reverse_copy_impl() - { - using namespace boost::assign; - - Container cont; - test_reverse_copy_impl(cont); - - cont.clear(); - cont += 1; - test_reverse_copy_impl(cont); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_reverse_copy_impl(cont); - } - - void test_reverse_copy() - { - test_reverse_copy_impl< std::vector >(); - test_reverse_copy_impl< std::list >(); - test_reverse_copy_impl< std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.reverse_copy" ); - - test->add( BOOST_TEST_CASE( &::test_reverse_copy ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/rotate.cpp b/libs/range/test/algorithm_test/rotate.cpp deleted file mode 100644 index b6b7af27d..000000000 --- a/libs/range/test/algorithm_test/rotate.cpp +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void test_rotate_impl(Container& cont, Iterator where_it) - { - Container reference(cont); - Container test(cont); - - Iterator reference_where_it = reference.begin(); - std::advance(reference_where_it, - std::distance(cont.begin(), where_it)); - - std::rotate(reference.begin(), reference_where_it, reference.end()); - - Iterator test_where_it = test.begin(); - std::advance(test_where_it, - std::distance(cont.begin(), where_it)); - - boost::rotate(test, test_where_it); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - test = cont; - test_where_it = test.begin(); - std::advance(test_where_it, - std::distance(cont.begin(), where_it)); - - boost::rotate(boost::make_iterator_range(test), test_where_it); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - } - - template - void test_rotate_impl(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator_t; - - iterator_t last = cont.end(); - for (iterator_t it = cont.begin(); it != last; ++it) - { - test_rotate_impl(cont, it); - } - } - - template - void test_rotate_impl() - { - using namespace boost::assign; - - Container cont; - test_rotate_impl(cont); - - cont.clear(); - cont += 1; - test_rotate_impl(cont); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_rotate_impl(cont); - } - - void test_rotate() - { - test_rotate_impl< std::vector >(); - test_rotate_impl< std::list >(); - test_rotate_impl< std::deque >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.rotate" ); - - test->add( BOOST_TEST_CASE( &boost::test_rotate ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/rotate_copy.cpp b/libs/range/test/algorithm_test/rotate_copy.cpp deleted file mode 100644 index 05aa4d255..000000000 --- a/libs/range/test/algorithm_test/rotate_copy.cpp +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - template - void test_append(OutputIterator target, Value value) - { - *target++ = value; - } - - template - void test_rotate_copy_impl(Container& cont, Iterator where_it) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_value::type - value_type; - - std::vector reference; - std::vector test; - - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type - iterator_t BOOST_RANGE_UNUSED; - - test_append( - std::rotate_copy(cont.begin(), where_it, cont.end(), - std::back_inserter(reference)), - value_type() - ); - - test_append( - boost::rotate_copy(cont, where_it, std::back_inserter(test)), - value_type() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - test.clear(); - - test_append( - boost::rotate_copy(boost::make_iterator_range(cont), where_it, - std::back_inserter(test)), - value_type() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - } - - template - void test_rotate_copy_impl(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iterator_t; - - iterator_t last = cont.end(); - for (iterator_t it = cont.begin(); it != last; ++it) - { - test_rotate_copy_impl(cont, it); - } - } - - template - void test_rotate_copy_impl() - { - using namespace boost::assign; - - Container cont; - test_rotate_copy_impl(cont); - - cont.clear(); - cont += 1; - test_rotate_copy_impl(cont); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_rotate_copy_impl(cont); - } - - void test_rotate_copy() - { - test_rotate_copy_impl< std::vector >(); - test_rotate_copy_impl< std::list >(); - test_rotate_copy_impl< std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.rotate_copy" ); - - test->add( BOOST_TEST_CASE( &test_rotate_copy ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/search.cpp b/libs/range/test/algorithm_test/search.cpp deleted file mode 100644 index 91f19bd66..000000000 --- a/libs/range/test/algorithm_test/search.cpp +++ /dev/null @@ -1,113 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container1, class Container2 > - void test_search_impl(Container1& cont1, Container2& cont2) - { - typedef BOOST_DEDUCED_TYPENAME Container1::const_iterator const_iterator1_t; - typedef BOOST_DEDUCED_TYPENAME Container1::iterator iterator1_t; - - const Container1& ccont1 = cont1; - const Container2& ccont2 = cont2; - - iterator1_t it = boost::search(cont1, cont2); - BOOST_CHECK( it == boost::search(boost::make_iterator_range(cont1), cont2) ); - BOOST_CHECK( it == boost::search(cont1, boost::make_iterator_range(cont2)) ); - BOOST_CHECK( it == boost::search(boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2)) ); - iterator1_t it2 = boost::search(cont1, ccont2); - BOOST_CHECK( it2 == boost::search(boost::make_iterator_range(cont1), ccont2) ); - BOOST_CHECK( it2 == boost::search(cont1, boost::make_iterator_range(ccont2)) ); - BOOST_CHECK( it2 == boost::search(boost::make_iterator_range(cont1), - boost::make_iterator_range(ccont2)) ); - const_iterator1_t cit = boost::search(ccont1, cont2); - BOOST_CHECK( cit == boost::search(boost::make_iterator_range(ccont1), cont2) ); - BOOST_CHECK( cit == boost::search(ccont1, boost::make_iterator_range(cont2)) ); - BOOST_CHECK( cit == boost::search(boost::make_iterator_range(ccont1), - boost::make_iterator_range(cont2)) ); - const_iterator1_t cit2 = boost::search(ccont1, ccont2); - BOOST_CHECK( cit2 == boost::search(boost::make_iterator_range(ccont1), ccont2) ); - BOOST_CHECK( cit2 == boost::search(ccont1, boost::make_iterator_range(ccont2)) ); - BOOST_CHECK( cit2 == boost::search(boost::make_iterator_range(ccont1), - boost::make_iterator_range(ccont2)) ); - - BOOST_CHECK( it == std::search(cont1.begin(), cont1.end(), cont2.begin(), cont2.end()) ); - BOOST_CHECK( it2 == std::search(cont1.begin(), cont1.end(), ccont2.begin(), ccont2.end()) ); - BOOST_CHECK( cit == std::search(ccont1.begin(), ccont1.end(), cont2.begin(), cont2.end()) ); - BOOST_CHECK( cit2 == std::search(ccont1.begin(), ccont1.end(), ccont2.begin(), ccont2.end()) ); - } - - template< class Container1, class Container2 > - void test_search_impl() - { - using namespace boost::assign; - - Container1 cont1; - Container2 cont2; - - test_search_impl(cont1, cont2); - - cont1 += 1; - test_search_impl(cont1, cont2); - - cont1.clear(); - cont2 += 1; - test_search_impl(cont1, cont2); - - cont1 += 1; - test_search_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1,2,3,4,5,6,7,8,9; - cont2 += 10,11,12; - test_search_impl(cont1, cont2); - - cont2.clear(); - cont2 += 4,5,6; - test_search_impl(cont1, cont2); - } - - void test_search() - { - test_search_impl< std::list, std::list >(); - test_search_impl< std::vector, std::vector >(); - test_search_impl< std::set, std::set >(); - test_search_impl< std::list, std::vector >(); - test_search_impl< std::vector, std::list >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.search" ); - - test->add( BOOST_TEST_CASE( &boost::test_search ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/search_n.cpp b/libs/range/test/algorithm_test/search_n.cpp deleted file mode 100644 index 76f5b784f..000000000 --- a/libs/range/test/algorithm_test/search_n.cpp +++ /dev/null @@ -1,198 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include - -namespace -{ - template - inline ForwardIterator - reference_search_n(ForwardIterator first, ForwardIterator last, - Integer count, const Value& value) - { - if (count <= 0) - return first; - else if (count == 1) - return std::find(first, last, value); - else - { - first = std::find(first, last, value); - while (first != last) - { - typename std::iterator_traits::difference_type n = count; - ForwardIterator i = first; - ++i; - while (i != last && n != 1 && *i==value) - { - ++i; - --n; - } - if (n == 1) - return first; - if (i == last) - return last; - first = std::find(++i, last, value); - } - } - return last; - } - - template - inline ForwardIterator - reference_search_n(ForwardIterator first, ForwardIterator last, - Integer count, const Value& value, - BinaryPredicate pred) - { - typedef typename std::iterator_traits< - ForwardIterator - >::iterator_category cat_t BOOST_RANGE_UNUSED; - - if (count <= 0) - return first; - if (count == 1) - { - while (first != last && !static_cast(pred(*first, value))) - ++first; - return first; - } - else - { - typedef typename std::iterator_traits::difference_type difference_t; - - while (first != last && !static_cast(pred(*first, value))) - ++first; - - while (first != last) - { - difference_t n = count; - ForwardIterator i = first; - ++i; - while (i != last && n != 1 && static_cast(pred(*i, value))) - { - ++i; - --n; - } - if (n == 1) - return first; - if (i == last) - return last; - first = ++i; - while (first != last && !static_cast(pred(*first, value))) - ++first; - } - } - return last; - } - - template< class Container1, class Value, class Pred > - void test_search_n_pred_impl(Container1& cont1, Value value, Pred pred) - { - typedef BOOST_DEDUCED_TYPENAME Container1::const_iterator const_iterator1_t; - typedef BOOST_DEDUCED_TYPENAME Container1::iterator iterator1_t; - - const Container1& ccont1 = cont1; - - for (std::size_t n = 0; n < cont1.size(); ++n) - { - iterator1_t it = boost::search_n(cont1, n, value, pred); - BOOST_CHECK( it == boost::search_n(boost::make_iterator_range(cont1), n, value, pred) ); - BOOST_CHECK( it == reference_search_n(cont1.begin(), cont1.end(), n, value, pred) ); - - const_iterator1_t cit = boost::search_n(ccont1, n, value, pred); - BOOST_CHECK( cit == boost::search_n(boost::make_iterator_range(ccont1), n, value, pred) ); - BOOST_CHECK( cit == reference_search_n(ccont1.begin(), ccont1.end(), n, value, pred) ); - } - } - - template< class Container1, class Value > - void test_search_n_impl(Container1& cont1, Value value) - { - typedef BOOST_DEDUCED_TYPENAME Container1::const_iterator const_iterator1_t; - typedef BOOST_DEDUCED_TYPENAME Container1::iterator iterator1_t; - - const Container1& ccont1 = cont1; - - for (std::size_t n = 0; n < cont1.size(); ++n) - { - iterator1_t it = boost::search_n(cont1, n, value); - BOOST_CHECK( it == boost::search_n(boost::make_iterator_range(cont1), n, value) ); - BOOST_CHECK( it == reference_search_n(cont1.begin(), cont1.end(), n, value) ); - - const_iterator1_t cit = boost::search_n(ccont1, n, value); - BOOST_CHECK( cit == boost::search_n(boost::make_iterator_range(ccont1), n, value) ); - BOOST_CHECK( cit == reference_search_n(ccont1.begin(), ccont1.end(), n, value) ); - } - - test_search_n_pred_impl(cont1, value, std::less()); - test_search_n_pred_impl(cont1, value, std::greater()); - test_search_n_pred_impl(cont1, value, std::equal_to()); - test_search_n_pred_impl(cont1, value, std::not_equal_to()); - } - - template< class Container1, class Container2 > - void test_search_n_impl() - { - using namespace boost::assign; - - Container1 cont1; - - test_search_n_impl(cont1, 1); - - cont1 += 1; - test_search_n_impl(cont1, 1); - test_search_n_impl(cont1, 0); - - cont1.clear(); - cont1 += 1,1; - test_search_n_impl(cont1, 1); - test_search_n_impl(cont1, 0); - - cont1 += 1,1,1; - test_search_n_impl(cont1, 1); - test_search_n_impl(cont1, 0); - - cont1.clear(); - cont1 += 1,2,3,4,5,6,7,8,9; - test_search_n_impl(cont1, 1); - test_search_n_impl(cont1, 2); - test_search_n_impl(cont1, 5); - test_search_n_impl(cont1, 9); - } - - void test_search_n() - { - test_search_n_impl< std::list, std::list >(); - test_search_n_impl< std::vector, std::vector >(); - test_search_n_impl< std::set, std::set >(); - test_search_n_impl< std::list, std::vector >(); - test_search_n_impl< std::vector, std::list >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.search_n" ); - - test->add( BOOST_TEST_CASE( &test_search_n ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/set_difference.cpp b/libs/range/test/algorithm_test/set_difference.cpp deleted file mode 100644 index 84dc62c9d..000000000 --- a/libs/range/test/algorithm_test/set_difference.cpp +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void check_result( - Container1& reference, - Iterator reference_result, - Container2& test_cont, - Iterator test_result - ) - { - BOOST_CHECK_EQUAL( - std::distance(reference.begin(), reference_result), - std::distance(test_cont.begin(), test_result) - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test_cont.begin(), test_cont.end() - ); - } - - template - void test(Container1& cont1, Container2& cont2) - { - typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t; - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator iterator_t; - - std::vector reference(cont1.size() + cont2.size()); - std::vector test_cont(reference); - - iterator_t reference_result - = std::set_difference(cont1.begin(), cont1.end(), - cont2.begin(), cont2.end(), - reference.begin()); - - iterator_t test_result - = boost::set_difference(cont1, cont2, test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_difference( - boost::make_iterator_range(cont1), cont2, - test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_difference( - cont1, boost::make_iterator_range(cont2), - test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_difference( - boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2), - test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - } - - template - void sort_container(Container& cont, BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - std::vector temp(cont.begin(), cont.end()); - std::sort(temp.begin(), temp.end(), pred); - cont.assign(temp.begin(), temp.end()); - } - - template - void test_pred(Container1 cont1, Container2 cont2, - BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t; - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator iterator_t; - - sort_container(cont1, pred); - sort_container(cont2, pred); - - std::vector reference(cont1.size() + cont2.size()); - std::vector test_cont(reference); - - iterator_t reference_result - = std::set_difference(cont1.begin(), cont1.end(), - cont2.begin(), cont2.end(), - reference.begin(), - pred); - - iterator_t test_result - = boost::set_difference(cont1, cont2, test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_difference( - boost::make_iterator_range(cont1), cont2, - test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_difference( - cont1, boost::make_iterator_range(cont2), - test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_difference( - boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2), - test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - } - - template - void test_set_difference_impl( - Container1& cont1, - Container2& cont2 - ) - { - test(cont1, cont2); - test_pred(cont1, cont2, std::less()); - test_pred(cont1, cont2, std::greater()); - } - - template - void test_set_difference_impl() - { - using namespace boost::assign; - - Container1 cont1; - Container2 cont2; - - test_set_difference_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1; - test_set_difference_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont2 += 1; - test_set_difference_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1,2,3,4,5,6,7,8,9; - cont2 += 2,3,4; - test_set_difference_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 2,3,4; - cont2 += 1,2,3,4,5,6,7,8,9; - test_set_difference_impl(cont1, cont2); - } - - void test_set_difference() - { - test_set_difference_impl< std::vector, std::vector >(); - test_set_difference_impl< std::list, std::list >(); - test_set_difference_impl< std::deque, std::deque >(); - test_set_difference_impl< std::vector, std::list >(); - test_set_difference_impl< std::list, std::vector >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.set_difference" ); - - test->add( BOOST_TEST_CASE( &boost::test_set_difference ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/set_intersection.cpp b/libs/range/test/algorithm_test/set_intersection.cpp deleted file mode 100644 index 213bbdf73..000000000 --- a/libs/range/test/algorithm_test/set_intersection.cpp +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void check_result( - Container1& reference, - Iterator reference_result, - Container2& test_cont, - Iterator test_result - ) - { - BOOST_CHECK_EQUAL( - std::distance(reference.begin(), reference_result), - std::distance(test_cont.begin(), test_result) - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test_cont.begin(), test_cont.end() - ); - } - - template - void test(Container1& cont1, Container2& cont2) - { - typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t; - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator iterator_t; - - std::vector reference(cont1.size() + cont2.size()); - std::vector test_cont(reference); - - iterator_t reference_result - = std::set_intersection(cont1.begin(), cont1.end(), - cont2.begin(), cont2.end(), - reference.begin()); - - iterator_t test_result - = boost::set_intersection(cont1, cont2, test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_intersection( - boost::make_iterator_range(cont1), cont2, - test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_intersection( - cont1, boost::make_iterator_range(cont2), - test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_intersection( - boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2), - test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - } - - template - void sort_container(Container& cont, BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - std::vector temp(cont.begin(), cont.end()); - std::sort(temp.begin(), temp.end(), pred); - cont.assign(temp.begin(), temp.end()); - } - - template - void test_pred(Container1 cont1, Container2 cont2, - BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t; - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator iterator_t; - - sort_container(cont1, pred); - sort_container(cont2, pred); - - std::vector reference(cont1.size() + cont2.size()); - std::vector test_cont(reference); - - iterator_t reference_result - = std::set_intersection(cont1.begin(), cont1.end(), - cont2.begin(), cont2.end(), - reference.begin(), - pred); - - iterator_t test_result - = boost::set_intersection(cont1, cont2, test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_intersection( - boost::make_iterator_range(cont1), cont2, - test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_intersection( - cont1, boost::make_iterator_range(cont2), - test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_intersection( - boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2), - test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - } - - template - void test_set_intersection_impl( - Container1& cont1, - Container2& cont2 - ) - { - test(cont1, cont2); - test_pred(cont1, cont2, std::less()); - test_pred(cont1, cont2, std::greater()); - } - - template - void test_set_intersection_impl() - { - using namespace boost::assign; - - Container1 cont1; - Container2 cont2; - - test_set_intersection_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1; - test_set_intersection_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont2 += 1; - test_set_intersection_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1,2,3,4,5,6,7,8,9; - cont2 += 2,3,4; - test_set_intersection_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 2,3,4; - cont2 += 1,2,3,4,5,6,7,8,9; - test_set_intersection_impl(cont1, cont2); - } - - void test_set_intersection() - { - test_set_intersection_impl< std::vector, std::vector >(); - test_set_intersection_impl< std::list, std::list >(); - test_set_intersection_impl< std::deque, std::deque >(); - test_set_intersection_impl< std::vector, std::list >(); - test_set_intersection_impl< std::list, std::vector >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.set_intersection" ); - - test->add( BOOST_TEST_CASE( &boost::test_set_intersection ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/set_symmetric_difference.cpp b/libs/range/test/algorithm_test/set_symmetric_difference.cpp deleted file mode 100644 index b792fd871..000000000 --- a/libs/range/test/algorithm_test/set_symmetric_difference.cpp +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void check_result( - Container1& reference, - Iterator reference_result, - Container2& test_cont, - Iterator test_result - ) - { - BOOST_CHECK_EQUAL( - std::distance(reference.begin(), reference_result), - std::distance(test_cont.begin(), test_result) - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test_cont.begin(), test_cont.end() - ); - } - - template - void test(Container1& cont1, Container2& cont2) - { - typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t; - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator iterator_t; - - std::vector reference(cont1.size() + cont2.size()); - std::vector test_cont(reference); - - iterator_t reference_result - = std::set_symmetric_difference(cont1.begin(), cont1.end(), - cont2.begin(), cont2.end(), - reference.begin()); - - iterator_t test_result - = boost::set_symmetric_difference(cont1, cont2, - test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_symmetric_difference( - boost::make_iterator_range(cont1), cont2, - test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_symmetric_difference( - cont1, boost::make_iterator_range(cont2), - test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_symmetric_difference( - boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2), - test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - } - - template - void sort_container(Container& cont, BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - std::vector temp(cont.begin(), cont.end()); - std::sort(temp.begin(), temp.end(), pred); - cont.assign(temp.begin(), temp.end()); - } - - template - void test_pred(Container1 cont1, Container2 cont2, - BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t; - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator iterator_t; - - sort_container(cont1, pred); - sort_container(cont2, pred); - - std::vector reference(cont1.size() + cont2.size()); - std::vector test_cont(reference); - - iterator_t reference_result - = std::set_symmetric_difference(cont1.begin(), cont1.end(), - cont2.begin(), cont2.end(), - reference.begin(), - pred); - - iterator_t test_result - = boost::set_symmetric_difference(cont1, cont2, - test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_symmetric_difference( - boost::make_iterator_range(cont1), cont2, - test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_symmetric_difference( - cont1, boost::make_iterator_range(cont2), - test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_symmetric_difference( - boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2), - test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - } - - template - void test_set_symmetric_difference_impl( - Container1& cont1, - Container2& cont2 - ) - { - test(cont1, cont2); - test_pred(cont1, cont2, std::less()); - test_pred(cont1, cont2, std::greater()); - } - - template - void test_set_symmetric_difference_impl() - { - using namespace boost::assign; - - Container1 cont1; - Container2 cont2; - - test_set_symmetric_difference_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1; - test_set_symmetric_difference_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont2 += 1; - test_set_symmetric_difference_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1,2,3,4,5,6,7,8,9; - cont2 += 2,3,4; - test_set_symmetric_difference_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 2,3,4; - cont2 += 1,2,3,4,5,6,7,8,9; - test_set_symmetric_difference_impl(cont1, cont2); - } - - void test_set_symmetric_difference() - { - test_set_symmetric_difference_impl< std::vector, std::vector >(); - test_set_symmetric_difference_impl< std::list, std::list >(); - test_set_symmetric_difference_impl< std::deque, std::deque >(); - test_set_symmetric_difference_impl< std::vector, std::list >(); - test_set_symmetric_difference_impl< std::list, std::vector >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.set_symmetric_difference" ); - - test->add( BOOST_TEST_CASE( &boost::test_set_symmetric_difference ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/set_union.cpp b/libs/range/test/algorithm_test/set_union.cpp deleted file mode 100644 index 7f9f10a1c..000000000 --- a/libs/range/test/algorithm_test/set_union.cpp +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void check_result( - Container1& reference, - Iterator reference_result, - Container2& test_cont, - Iterator test_result - ) - { - BOOST_CHECK_EQUAL( - std::distance(reference.begin(), reference_result), - std::distance(test_cont.begin(), test_result) - ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test_cont.begin(), test_cont.end() - ); - } - - template - void test(Container1& cont1, Container2& cont2) - { - typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t; - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator iterator_t; - - std::vector reference(cont1.size() + cont2.size()); - std::vector test_cont(reference); - - iterator_t reference_result - = std::set_union(cont1.begin(), cont1.end(), - cont2.begin(), cont2.end(), - reference.begin()); - - iterator_t test_result - = boost::set_union(cont1, cont2, test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_union(boost::make_iterator_range(cont1), - cont2, test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_union(cont1, - boost::make_iterator_range(cont2), - test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_union(boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2), - test_cont.begin()); - - check_result(reference, reference_result, - test_cont, test_result); - } - - template - void sort_container(Container& cont, BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - std::vector temp(cont.begin(), cont.end()); - std::sort(temp.begin(), temp.end(), pred); - cont.assign(temp.begin(), temp.end()); - } - - template - void test_pred(Container1 cont1, Container2 cont2, - BinaryPredicate pred) - { - typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t; - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator iterator_t; - - sort_container(cont1, pred); - sort_container(cont2, pred); - - std::vector reference(cont1.size() + cont2.size()); - std::vector test_cont(reference); - - iterator_t reference_result - = std::set_union(cont1.begin(), cont1.end(), - cont2.begin(), cont2.end(), - reference.begin(), - pred); - - iterator_t test_result - = boost::set_union(cont1, cont2, test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_union(boost::make_iterator_range(cont1), - cont2, test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_union(cont1, - boost::make_iterator_range(cont2), - test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - - test_result = boost::set_union(boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2), - test_cont.begin(), pred); - - check_result(reference, reference_result, - test_cont, test_result); - } - - template - void test_set_union_impl( - Container1& cont1, - Container2& cont2 - ) - { - test(cont1, cont2); - test_pred(cont1, cont2, std::less()); - test_pred(cont1, cont2, std::greater()); - } - - template - void test_set_union_impl() - { - using namespace boost::assign; - - Container1 cont1; - Container2 cont2; - - test_set_union_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1; - test_set_union_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont2 += 1; - test_set_union_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 1,2,3,4,5,6,7,8,9; - cont2 += 2,3,4; - test_set_union_impl(cont1, cont2); - - cont1.clear(); - cont2.clear(); - cont1 += 2,3,4; - cont2 += 1,2,3,4,5,6,7,8,9; - test_set_union_impl(cont1, cont2); - } - - void test_set_union() - { - test_set_union_impl< std::vector, std::vector >(); - test_set_union_impl< std::list, std::list >(); - test_set_union_impl< std::deque, std::deque >(); - test_set_union_impl< std::vector, std::list >(); - test_set_union_impl< std::list, std::vector >(); - } - } -} - - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.set_union" ); - - test->add( BOOST_TEST_CASE( &boost::test_set_union ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/sort.cpp b/libs/range/test/algorithm_test/sort.cpp deleted file mode 100644 index c6611f7c6..000000000 --- a/libs/range/test/algorithm_test/sort.cpp +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void test_sort_impl(Container& cont) - { - Container reference(cont); - Container test(cont); - - boost::sort(test); - std::sort(reference.begin(), reference.end()); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - Container test2(cont); - boost::sort(boost::make_iterator_range(test2)); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test2.begin(), test2.end() ); - } - - template - void test_sort_impl(Container& cont, BinaryPredicate pred) - { - Container reference(cont); - Container test(cont); - - boost::sort(test, pred); - std::sort(reference.begin(), reference.end(), pred); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - - Container test2(cont); - boost::sort(boost::make_iterator_range(test2), pred); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test2.begin(), test2.end() ); - } - - template - void test_sort_impl() - { - using namespace boost::assign; - - Container cont; - test_sort_impl(cont); - test_sort_impl(cont, std::less()); - test_sort_impl(cont, std::greater()); - - cont.clear(); - cont += 1; - test_sort_impl(cont); - test_sort_impl(cont, std::less()); - test_sort_impl(cont, std::greater()); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_sort_impl(cont); - test_sort_impl(cont, std::less()); - test_sort_impl(cont, std::greater()); - } - - void test_sort() - { - test_sort_impl< std::vector >(); - test_sort_impl< std::deque >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.sort" ); - - test->add( BOOST_TEST_CASE( &boost::test_sort ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/stable_partition.cpp b/libs/range/test/algorithm_test/stable_partition.cpp deleted file mode 100644 index b39161f54..000000000 --- a/libs/range/test/algorithm_test/stable_partition.cpp +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include "../test_driver/range_return_test_driver.hpp" -#include -#include -#include -#include -#include -#include - -namespace boost_range_test_algorithm_stable_partition -{ - struct equal_to_5 - { - typedef bool result_type; - typedef int argument_type; - bool operator()(int x) const { return x == 5; } - }; - - // test the 'partition' algorithm - template - class stable_partition_test_policy - { - public: - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - Container cont2(cont); - - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::stable_partition(cont, UnaryPredicate()); - - iter_t temp_result = boost::stable_partition( - boost::make_iterator_range(cont2), UnaryPredicate()); - - BOOST_CHECK_EQUAL( std::distance(cont.begin(), result), - std::distance(cont2.begin(), temp_result) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( cont.begin(), cont.end(), - cont2.begin(), cont2.end() ); - - return result; - } - - UnaryPredicate pred() const { return UnaryPredicate(); } - - template< boost::range_return_value return_type > - struct test_range - { - template< class Container, class Policy > - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - Container cont2(cont); - result_t result = boost::stable_partition(cont, policy.pred()); - - result_t result2 = boost::stable_partition( - boost::make_iterator_range(cont2), policy.pred()); - - boost::ignore_unused_variable_warning(result2); - - BOOST_CHECK_EQUAL_COLLECTIONS( cont2.begin(), cont2.end(), - cont.begin(), cont.end() ); - - return result; - } - }; - - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::stable_partition(cont.begin(), cont.end(), UnaryPredicate()); - } - }; - - template - void test_stable_partition_impl() - { - using namespace boost::assign; - - boost::range_test::range_return_test_driver test_driver; - - stable_partition_test_policy< equal_to_5 > policy; - - Container cont; - test_driver(cont, policy); - - cont.clear(); - cont += 1; - test_driver(cont, policy); - - cont.clear(); - cont += 1,2,2,2,2,2,3,4,5,6,7,8,9; - test_driver(cont, policy); - - cont.clear(); - cont += 1,2,2,2,2,2,3,3,3,3,4,4,4,4,4,4,4,5,6,7,8,9; - test_driver(cont, policy); - } - - void test_stable_partition() - { - test_stable_partition_impl< std::vector >(); - test_stable_partition_impl< std::list >(); - test_stable_partition_impl< std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.stable_partition" ); - - test->add( BOOST_TEST_CASE( &boost_range_test_algorithm_stable_partition::test_stable_partition ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/stable_sort.cpp b/libs/range/test/algorithm_test/stable_sort.cpp deleted file mode 100644 index 8372bd6e2..000000000 --- a/libs/range/test/algorithm_test/stable_sort.cpp +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template - void test_stable_sort_impl(Container& cont) - { - Container reference(cont); - Container test(cont); - - boost::stable_sort(test); - std::stable_sort(reference.begin(), reference.end()); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - test = cont; - boost::stable_sort(boost::make_iterator_range(test)); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - } - - template - void test_stable_sort_impl(Container& cont, BinaryPredicate pred) - { - Container reference(cont); - Container test(cont); - - boost::stable_sort(test, pred); - std::stable_sort(reference.begin(), reference.end(), pred); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - test = cont; - boost::stable_sort(boost::make_iterator_range(test), pred); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - } - - template - void test_stable_sort_impl() - { - using namespace boost::assign; - - Container cont; - test_stable_sort_impl(cont); - test_stable_sort_impl(cont, std::less()); - test_stable_sort_impl(cont, std::greater()); - - cont.clear(); - cont += 1; - test_stable_sort_impl(cont); - test_stable_sort_impl(cont, std::less()); - test_stable_sort_impl(cont, std::greater()); - - cont.clear(); - cont += 1,2,3,4,5,6,7,8,9; - test_stable_sort_impl(cont); - test_stable_sort_impl(cont, std::less()); - test_stable_sort_impl(cont, std::greater()); - } - - void test_stable_sort() - { - test_stable_sort_impl< std::vector >(); - test_stable_sort_impl< std::deque >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.stable_sort" ); - - test->add( BOOST_TEST_CASE( &boost::test_stable_sort ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/swap_ranges.cpp b/libs/range/test/algorithm_test/swap_ranges.cpp deleted file mode 100644 index a96bface3..000000000 --- a/libs/range/test/algorithm_test/swap_ranges.cpp +++ /dev/null @@ -1,116 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - template - void test_swap_ranges_impl(const Container1& source1, const Container2& source2) - { - Container1 reference1(source1); - Container2 reference2(source2); - std::swap_ranges(reference1.begin(), reference1.end(), reference2.begin()); - - Container1 test1(source1); - Container2 test2(source2); - boost::swap_ranges(test1, test2); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference1.begin(), reference1.end(), - test1.begin(), test1.end() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference2.begin(), reference2.end(), - test2.begin(), test2.end() ); - - test1 = source1; - test2 = source2; - boost::swap_ranges(boost::make_iterator_range(test1), test2); - BOOST_CHECK_EQUAL_COLLECTIONS( reference1.begin(), reference1.end(), - test1.begin(), test1.end() ); - BOOST_CHECK_EQUAL_COLLECTIONS( reference2.begin(), reference2.end(), - test2.begin(), test2.end() ); - - test1 = source1; - test2 = source2; - boost::swap_ranges(test1, boost::make_iterator_range(test2)); - BOOST_CHECK_EQUAL_COLLECTIONS( reference1.begin(), reference1.end(), - test1.begin(), test1.end() ); - BOOST_CHECK_EQUAL_COLLECTIONS( reference2.begin(), reference2.end(), - test2.begin(), test2.end() ); - - test1 = source1; - test2 = source2; - boost::swap_ranges(boost::make_iterator_range(test1), - boost::make_iterator_range(test2)); - BOOST_CHECK_EQUAL_COLLECTIONS( reference1.begin(), reference1.end(), - test1.begin(), test1.end() ); - BOOST_CHECK_EQUAL_COLLECTIONS( reference2.begin(), reference2.end(), - test2.begin(), test2.end() ); - } - - template - void test_swap_ranges_impl() - { - using namespace boost::assign; - - Container1 c1; - Container2 c2; - - test_swap_ranges_impl(c1, c2); - - c1.clear(); - c1 += 1; - c2.clear(); - c2 += 2; - test_swap_ranges_impl(c1, c2); - - c1.clear(); - c1 += 1,2,3,4,5,6,7,8,9,10; - c2.clear(); - c2 += 10,9,8,7,6,5,4,3,2,1; - test_swap_ranges_impl(c1, c2); - } - - inline void test_swap_ranges() - { - test_swap_ranges_impl< std::vector, std::vector >(); - test_swap_ranges_impl< std::vector, std::list >(); - test_swap_ranges_impl< std::vector, std::deque >(); - test_swap_ranges_impl< std::list, std::vector >(); - test_swap_ranges_impl< std::list, std::list >(); - test_swap_ranges_impl< std::list, std::deque >(); - test_swap_ranges_impl< std::deque, std::vector >(); - test_swap_ranges_impl< std::deque, std::list >(); - test_swap_ranges_impl< std::deque, std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.swap_ranges" ); - - test->add( BOOST_TEST_CASE( &test_swap_ranges ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/transform.cpp b/libs/range/test/algorithm_test/transform.cpp deleted file mode 100644 index 11ac5f0f3..000000000 --- a/libs/range/test/algorithm_test/transform.cpp +++ /dev/null @@ -1,184 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include "../test_function/multiply_by_x.hpp" -#include -#include -#include -#include - -namespace boost -{ - namespace - { - template< class Container > - void test_transform_impl1(Container& cont) - { - using namespace boost::range_test_function; - - const Container& ccont = cont; - - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - std::vector target(cont.size()); - std::vector reference(cont.size()); - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator iterator_t; - - multiply_by_x fn(2); - - iterator_t reference_it - = std::transform(cont.begin(), cont.end(), reference.begin(), fn); - - boost::ignore_unused_variable_warning(reference_it); - - iterator_t test_it - = boost::transform(cont, target.begin(), fn); - - BOOST_CHECK( test_it == target.end() ); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target.begin(), target.end() ); - - BOOST_CHECK( test_it == boost::transform(boost::make_iterator_range(cont), target.begin(), fn) ); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target.begin(), target.end() ); - - target.clear(); - target.resize(ccont.size()); - - test_it = boost::transform(ccont, target.begin(), fn); - - BOOST_CHECK( test_it == target.end() ); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target.begin(), target.end() ); - BOOST_CHECK( test_it == boost::transform(boost::make_iterator_range(ccont), target.begin(), fn) ); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target.begin(), target.end() ); - } - - template< class Container > - void test_transform_impl1() - { - using namespace boost::assign; - - Container cont; - - test_transform_impl1(cont); - - cont += 1; - test_transform_impl1(cont); - - cont += 2,3,4,5,6,7; - test_transform_impl1(cont); - } - - template< class Container1, class Container2 > - void test_transform_impl2(Container1& cont1, Container2& cont2) - { - const Container1& ccont1 = cont1; - const Container2& ccont2 = cont2; - - BOOST_CHECK_EQUAL( cont1.size(), cont2.size() ); - - typedef BOOST_DEDUCED_TYPENAME Container1::value_type value_t; - - std::vector target(cont1.size()); - std::vector reference(cont1.size()); - typedef BOOST_DEDUCED_TYPENAME std::vector::iterator iterator_t; - - std::multiplies fn; - - iterator_t reference_it - = std::transform(cont1.begin(), cont1.end(), - cont2.begin(), reference.begin(), fn); - - boost::ignore_unused_variable_warning(reference_it); - - iterator_t test_it - = boost::transform(cont1, cont2, target.begin(), fn); - - BOOST_CHECK( test_it == target.end() ); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target.begin(), target.end() ); - - BOOST_CHECK( test_it == boost::transform(boost::make_iterator_range(cont1), cont2, target.begin(), fn) ); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target.begin(), target.end() ); - - BOOST_CHECK( test_it == boost::transform(cont1, boost::make_iterator_range(cont2), target.begin(), fn) ); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target.begin(), target.end() ); - - BOOST_CHECK( test_it == boost::transform(boost::make_iterator_range(cont1), - boost::make_iterator_range(cont2), - target.begin(), fn) ); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target.begin(), target.end() ); - - - target.clear(); - target.resize(ccont1.size()); - - test_it = boost::transform(ccont1, ccont2, target.begin(), fn); - - BOOST_CHECK( test_it == target.end() ); - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target.begin(), target.end() ); - } - - template< class Container1, class Container2 > - void test_transform_impl2() - { - using namespace boost::assign; - - Container1 cont1; - Container2 cont2; - - test_transform_impl2(cont1, cont2); - - cont1 += 1; - cont2 += 2; - test_transform_impl2(cont1, cont2); - - cont1 += 2,3,4,5,6,7; - cont2 += 4,6,8,10,12,14; - test_transform_impl2(cont1, cont2); - } - - void test_transform() - { - test_transform_impl1< std::vector >(); - test_transform_impl1< std::list >(); - test_transform_impl1< std::set >(); - test_transform_impl1< std::multiset >(); - - test_transform_impl2< std::vector, std::list >(); - test_transform_impl2< std::list, std::vector >(); - test_transform_impl2< std::set, std::set >(); - test_transform_impl2< std::multiset, std::list >(); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.transform" ); - - test->add( BOOST_TEST_CASE( &boost::test_transform ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/unique.cpp b/libs/range/test/algorithm_test/unique.cpp deleted file mode 100644 index d8eb7846f..000000000 --- a/libs/range/test/algorithm_test/unique.cpp +++ /dev/null @@ -1,263 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include - -#include -#include - -#include -#include -#include -#include "../test_driver/range_overload_test_driver.hpp" -#include -#include -#include -#include -#include -#include - -namespace boost_range_test_algorithm_unique -{ - // test the 'unique' algorithm without a predicate - class unique_test_policy - { - public: - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - // There isn't an iterator return version of boost::unique, so just - // perform the standard algorithm - return std::unique(cont.begin(), cont.end()); - } - - template< boost::range_return_value return_type > - struct test_range - { - template< class Container, class Policy > - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy&, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - - Container cont2(cont); - - result_t result = boost::unique(cont); - - boost::unique(boost::make_iterator_range(cont2)); - - BOOST_CHECK_EQUAL_COLLECTIONS( cont.begin(), cont.end(), - cont2.begin(), cont2.end() ); - - return result; - } - }; - - template - struct test_range_overload - { - BOOST_STATIC_CONSTANT( - ::boost::range_return_value, - result_type = ::boost::return_begin_found); - - template - BOOST_DEDUCED_TYPENAME boost::range_return< - Container, result_type - >::type - operator()(Policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return< - Container,result_type>::type result_t; - - Container cont2(cont); - - result_t result = boost::unique(cont); - - boost::unique(boost::make_iterator_range(cont2)); - - BOOST_CHECK_EQUAL_COLLECTIONS( - cont.begin(), cont.end(), - cont2.begin(), cont2.end()); - - return result; - } - }; - - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::unique(cont.begin(), cont.end()); - } - }; - - // test the 'unique' algorithm with a predicate - template - class unique_pred_test_policy - { - public: - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - // There isn't an iterator return version of boost::unique, so just - // perform the standard algorithm - return std::unique(cont.begin(), cont.end(), Pred()); - } - - Pred pred() const { return Pred(); } - - template< boost::range_return_value return_type > - struct test_range - { - template< class Container, class Policy > - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - - Container cont2(cont); - - result_t result = boost::unique(cont, policy.pred()); - - boost::unique(boost::make_iterator_range(cont2), policy.pred()); - - BOOST_CHECK_EQUAL_COLLECTIONS( cont.begin(), cont.end(), - cont2.begin(), cont2.end() ); - - return result; - } - }; - - template - struct test_range_overload - { - BOOST_STATIC_CONSTANT( - ::boost::range_return_value, - result_type = ::boost::return_begin_found); - - template - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return< - Container,result_type>::type result_t; - - Container cont2(cont); - - result_t result = boost::unique(cont, policy.pred()); - - boost::unique(boost::make_iterator_range(cont2), policy.pred()); - - BOOST_CHECK_EQUAL_COLLECTIONS( - cont.begin(), cont.end(), - cont2.begin(), cont2.end()); - - return result; - } - }; - - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::unique(cont.begin(), cont.end(), Pred()); - } - }; - - template - void test_unique_impl(TestPolicy policy, Pred pred) - { - using namespace boost::assign; - - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - boost::range_test::range_overload_test_driver test_driver; - - Container cont; - - test_driver(cont, policy); - - cont.clear(); - cont += 1; - - std::vector temp(cont.begin(), cont.end()); - std::sort(temp.begin(), temp.end(), pred); - cont.assign(temp.begin(), temp.end()); - - test_driver(cont, policy); - - cont.clear(); - cont += 1,2,2,2,2,3,4,5,6,7,8,9; - - temp.assign(cont.begin(), cont.end()); - std::sort(temp.begin(), temp.end(), pred); - cont.assign(temp.begin(), temp.end()); - - test_driver(cont, policy); - } - - template - struct equal_div_2 - { - typedef bool result_type; - typedef const T& first_argument_type; - typedef const T& second_argument_type; - - bool operator()(const T& left, const T& right) const - { - return left / 2 == right / 2; - } - }; - - template - void test_unique_impl() - { - test_unique_impl( - unique_test_policy(), - std::less() - ); - - test_unique_impl( - unique_pred_test_policy >(), - std::less() - ); - - test_unique_impl( - unique_pred_test_policy >(), - std::greater() - ); - - test_unique_impl( - unique_pred_test_policy >(), - std::less() - ); - } - - void test_unique() - { - test_unique_impl< std::vector >(); - test_unique_impl< std::list >(); - test_unique_impl< std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.unique" ); - - test->add( BOOST_TEST_CASE( &boost_range_test_algorithm_unique::test_unique ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/unique_copy.cpp b/libs/range/test/algorithm_test/unique_copy.cpp deleted file mode 100644 index 21f107a8a..000000000 --- a/libs/range/test/algorithm_test/unique_copy.cpp +++ /dev/null @@ -1,158 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - template - void test_append(OutputIterator target, Value value) - { - *target++ = value; - } - - template - void test_unique_copy_impl(Container& c) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_value::type value_type; - std::vector reference; - std::vector test; - - test_append( - std::unique_copy(c.begin(), c.end(), std::back_inserter(reference)), - value_type() - ); - - test_append( - boost::unique_copy(c, std::back_inserter(test)), - value_type() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS(reference.begin(), reference.end(), - test.begin(), test.end()); - - test.clear(); - - test_append( - boost::unique_copy(boost::make_iterator_range(c), - std::back_inserter(test)), - value_type() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS(reference.begin(), reference.end(), - test.begin(), test.end()); - } - - template - void test_unique_copy_impl(Container& c, Pred pred) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_value::type value_type; - std::vector reference; - std::vector test; - - test_append( - std::unique_copy(c.begin(), c.end(), std::back_inserter(reference), pred), - value_type() - ); - - test_append( - boost::unique_copy(c, std::back_inserter(test), pred), - value_type() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS(reference.begin(), reference.end(), - test.begin(), test.end()); - - test.clear(); - - test_append( - boost::unique_copy(boost::make_iterator_range(c), - std::back_inserter(test), pred), - value_type() - ); - - BOOST_CHECK_EQUAL_COLLECTIONS(reference.begin(), reference.end(), - test.begin(), test.end()); - } - - template - void test_unique_copy_driver(Pred pred) - { - using namespace boost::assign; - - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - Container cont; - - test_unique_copy_impl(cont); - test_unique_copy_impl(cont, pred); - - cont.clear(); - cont += 1; - - std::vector temp(cont.begin(), cont.end()); - std::sort(temp.begin(), temp.end()); - cont.assign(temp.begin(), temp.end()); - test_unique_copy_impl(cont); - - std::sort(temp.begin(), temp.end(), pred); - cont.assign(temp.begin(), temp.end()); - test_unique_copy_impl(cont, pred); - - cont.clear(); - cont += 1,2,2,2,2,3,4,5,6,7,8,9; - - temp.assign(cont.begin(), cont.end()); - std::sort(temp.begin(), temp.end()); - cont.assign(temp.begin(), temp.end()); - test_unique_copy_impl(cont); - - std::sort(temp.begin(), temp.end(), pred); - cont.assign(temp.begin(), temp.end()); - test_unique_copy_impl(cont, pred); - } - - template - void test_unique_copy_impl() - { - test_unique_copy_driver(std::less()); - test_unique_copy_driver(std::greater()); - } - - void test_unique_copy() - { - test_unique_copy_impl< std::vector >(); - test_unique_copy_impl< std::list >(); - test_unique_copy_impl< std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.unique_copy" ); - - test->add( BOOST_TEST_CASE( &test_unique_copy ) ); - - return test; -} diff --git a/libs/range/test/algorithm_test/upper_bound.cpp b/libs/range/test/algorithm_test/upper_bound.cpp deleted file mode 100644 index daae76444..000000000 --- a/libs/range/test/algorithm_test/upper_bound.cpp +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include - -#include -#include -#include "../test_driver/range_return_test_driver.hpp" -#include -#include -#include -#include -#include -#include - -namespace boost_range_test_algorithm_upper_bound -{ - class upper_bound_policy - { - public: - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::upper_bound(cont, 5); - BOOST_CHECK( result == boost::upper_bound(boost::make_iterator_range(cont), 5) ); - return result; - } - - template - struct test_range - { - template - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy&, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - result_t result = boost::upper_bound(cont, 5); - BOOST_CHECK( result == boost::upper_bound(boost::make_iterator_range(cont), 5) ); - return result; - } - }; - - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::upper_bound(cont.begin(), cont.end(), 5); - } - }; - - template< class BinaryPredicate > - struct upper_bound_pred_policy - { - template< class Container > - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - test_iter(Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type iter_t; - iter_t result = boost::upper_bound(cont, 5, BinaryPredicate()); - BOOST_CHECK( result == boost::upper_bound(boost::make_iterator_range(cont), 5, BinaryPredicate()) ); - return result; - } - - template< boost::range_return_value result_type> - struct test_range - { - template< class Container, class Policy > - BOOST_DEDUCED_TYPENAME boost::range_return::type - operator()(Policy& policy, Container& cont) - { - typedef BOOST_DEDUCED_TYPENAME boost::range_return::type result_t; - - result_t result = boost::upper_bound(cont, 5, policy.pred()); - - BOOST_CHECK( result == boost::upper_bound( - boost::make_iterator_range(cont), 5, policy.pred()) ); - - return result; - } - }; - - template - BOOST_DEDUCED_TYPENAME boost::range_iterator::type - reference(Container& cont) - { - return std::upper_bound( - cont.begin(), cont.end(), 5, BinaryPredicate()); - } - - BinaryPredicate& pred() { return m_pred; } - - private: - BinaryPredicate m_pred; - }; - - template - void test_upper_bound_impl(TestPolicy policy, BinaryPredicate pred) - { - using namespace boost::assign; - - typedef BOOST_DEDUCED_TYPENAME boost::remove_const::type container_t; - typedef BOOST_DEDUCED_TYPENAME Container::value_type value_t; - - boost::range_test::range_return_test_driver test_driver; - - container_t mcont; - Container& cont = mcont; - - test_driver(cont, policy); - - mcont.clear(); - mcont += 1; - - std::vector temp(mcont.begin(), mcont.end()); - std::sort(temp.begin(), temp.end(), pred); - mcont.assign(temp.begin(), temp.end()); - - test_driver(cont, policy); - - mcont.clear(); - mcont += 1,2,3,4,5,6,7,8,9; - - temp.assign(mcont.begin(), mcont.end()); - std::sort(temp.begin(), temp.end(), pred); - mcont.assign(temp.begin(), temp.end()); - - test_driver(cont, policy); - } - - template - void test_upper_bound_impl() - { - test_upper_bound_impl( - upper_bound_policy(), - std::less() - ); - - test_upper_bound_impl( - upper_bound_pred_policy >(), - std::less() - ); - - test_upper_bound_impl( - upper_bound_pred_policy >(), - std::greater() - ); - } - - void test_upper_bound() - { - test_upper_bound_impl< std::vector >(); - test_upper_bound_impl< std::list >(); - test_upper_bound_impl< std::deque >(); - - test_upper_bound_impl< const std::vector >(); - test_upper_bound_impl< const std::list >(); - test_upper_bound_impl< const std::deque >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.upper_bound" ); - - test->add( BOOST_TEST_CASE( &boost_range_test_algorithm_upper_bound::test_upper_bound ) ); - - return test; -} diff --git a/libs/range/test/array.cpp b/libs/range/test/array.cpp deleted file mode 100644 index b913fdef4..000000000 --- a/libs/range/test/array.cpp +++ /dev/null @@ -1,83 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include -#include -#include -#include -#include - -using namespace boost; -using namespace std; - -void check_array() -{ - const int sz = 9; - typedef int array_t[sz]; - int my_array[sz] = { 1,2,3,4,5,6,7,8,9 }; - const array_t ca = { 1,2,3,4,5,6,7,8,10 }; - - -// BOOST_RANGE_NO_STATIC_ASSERT -#if !defined( __BORLANDC__ ) -#else - BOOST_STATIC_ASSERT(( is_same< range_value::type, int >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, int* >::value )); - BOOST_STATIC_ASSERT(( is_same< range_const_iterator::type, const int* >::value )); - BOOST_STATIC_ASSERT(( is_same< range_difference::type, std::ptrdiff_t >::value )); - BOOST_STATIC_ASSERT(( is_same< range_size::type, std::size_t >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, int* >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, const int* >::value )); - - BOOST_STATIC_ASSERT(( is_same< range_value::type, const int >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, const int* >::value )); - BOOST_STATIC_ASSERT(( is_same< range_const_iterator::type, const int* >::value )); - BOOST_STATIC_ASSERT(( is_same< range_difference::type, std::ptrdiff_t >::value )); - BOOST_STATIC_ASSERT(( is_same< range_size::type, std::size_t >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, const int* >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, const int* >::value )); -#endif - - BOOST_CHECK_EQUAL( begin( my_array ), my_array ); - BOOST_CHECK_EQUAL( end( my_array ), my_array + size( my_array ) ); - BOOST_CHECK_EQUAL( empty( my_array ), false ); - - BOOST_CHECK_EQUAL( begin( ca ), ca ); - BOOST_CHECK_EQUAL( end( ca ), ca + size( ca ) ); - BOOST_CHECK_EQUAL( empty( ca ),false ); - - const char A[] = "\0A"; - BOOST_CHECK_EQUAL( boost::size(A), 3 ); -} - -using boost::unit_test::test_suite; - -test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add( BOOST_TEST_CASE( &check_array ) ); - - return test; -} - - - - - diff --git a/libs/range/test/atl.cpp b/libs/range/test/atl.cpp deleted file mode 100644 index 50905b16a..000000000 --- a/libs/range/test/atl.cpp +++ /dev/null @@ -1,623 +0,0 @@ - - -// Boost.Range ATL Extension -// -// Copyright Shunsuke Sogame 2005-2006. -// Distributed under the 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 - -#include -#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS -#define _ATL_NO_AUTOMATIC_NAMESPACE - -#define BOOST_LIB_NAME boost_test_exec_monitor -#include - -#define BOOST_RANGE_DETAIL_MICROSOFT_TEST -#include // can be placed first - - -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -#include - - -#include // for ATL3 CSimpleArray/CSimpleValArray -#if !(_ATL_VER < 0x0700) - #include - #include - #include - #include -#endif - - -namespace brdm = boost::range_detail_microsoft; - - -#if !(_ATL_VER < 0x0700) - - -template< class ArrayT, class SampleRange > -bool test_init_auto_ptr_array(ArrayT& arr, SampleRange& sample) -{ - typedef typename boost::range_iterator::type iter_t; - - for (iter_t it = boost::begin(sample), last = boost::end(sample); it != last; ++it) { - arr.Add(*it); // moves ownership - } - - return boost::distance(arr) == boost::distance(sample); -} - - -template< class ListT, class SampleRange > -bool test_init_auto_ptr_list(ListT& lst, SampleRange& sample) -{ - typedef typename boost::range_iterator::type iter_t; - typedef typename boost::range_value::type val_t; - - for (iter_t it = boost::begin(sample), last = boost::end(sample); it != last; ++it) { - lst.AddTail(*it); // moves ownership - } - - return boost::distance(lst) == boost::distance(sample); -} - - -// Workaround: -// CRBTree provides no easy access function, but yes, it is the range! -// -template< class AtlMapT, class KeyT, class MappedT > -bool test_atl_map_has(AtlMapT& map, const KeyT& k, const MappedT m) -{ - typedef typename boost::range_iterator::type iter_t; - - for (iter_t it = boost::begin(map), last = boost::end(map); it != last; ++it) { - if (it->m_key == k && it->m_value == m) - return true; - } - - return false; -} - - -template< class AtlMapT, class MapT > -bool test_atl_map(AtlMapT& map, const MapT& sample) -{ - typedef typename boost::range_iterator::type iter_t; - typedef typename boost::range_const_iterator::type siter_t; - - bool result = true; - - result = result && (boost::distance(map) == boost::distance(sample)); - if (!result) - return false; - - { - for (iter_t it = boost::begin(map), last = boost::end(map); it != last; ++it) { - result = result && brdm::test_find_key_and_mapped(sample, std::make_pair(it->m_key, it->m_value)); - } - } - - { - for (siter_t it = boost::begin(sample), last = boost::end(sample); it != last; ++it) { - result = result && (test_atl_map_has)(map, it->first, it->second); - } - } - - return result; -} - - -template< class MapT, class SampleMap > -bool test_init_atl_multimap(MapT& map, const SampleMap& sample) -{ - typedef typename boost::range_const_iterator::type iter_t; - - for (iter_t it = boost::const_begin(sample), last = boost::const_end(sample); it != last; ++it) { - map.Insert(it->first, it->second); - } - - return boost::distance(map) == boost::distance(sample); -} - - -// arrays -// - -template< class Range > -void test_CAtlArray(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ATL::CAtlArray rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_array(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class ValT, class Range > -void test_CAutoPtrArray(Range& sample) -{ - typedef ValT val_t; - - typedef ATL::CAutoPtrArray rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter *> >::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter const*> >::value )); - - rng_t rng; - BOOST_CHECK( ::test_init_auto_ptr_array(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class I, class Range > -void test_CInterfaceArray(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ATL::CInterfaceArray rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter * >::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter const* >::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_array(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -// lists -// - -template< class Range > -void test_CAtlList(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ATL::CAtlList rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, brdm::list_iterator >::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator >::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_list(rng, sample) ); - BOOST_CHECK( brdm::test_bidirectional(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class ValT, class Range > -void test_CAutoPtrList(Range& sample) -{ - typedef ValT val_t; - - typedef ATL::CAutoPtrList rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, boost::indirect_iterator< brdm::list_iterator > > >::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, boost::indirect_iterator< brdm::list_iterator const> > >::value )); - - rng_t rng; - BOOST_CHECK( ::test_init_auto_ptr_list(rng, sample) ); - BOOST_CHECK( brdm::test_bidirectional(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class ValT, class Range > -void test_CHeapPtrList(const Range& sample) -{ - typedef ValT val_t; - - typedef ATL::CHeapPtrList rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, boost::indirect_iterator< brdm::list_iterator > > >::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, boost::indirect_iterator< brdm::list_iterator const> > >::value )); - - rng_t rng; - BOOST_CHECK( ::test_init_auto_ptr_list(rng, sample) ); - BOOST_CHECK( brdm::test_bidirectional(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class I, class Range > -void test_CInterfaceList(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ATL::CInterfaceList rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, brdm::list_iterator > >::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator const> >::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_list(rng, sample) ); - BOOST_CHECK( brdm::test_bidirectional(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -// strings -// - -template< class Range > -void test_CSimpleStringT(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef typename boost::mpl::if_< boost::is_same, - ATL::CAtlStringA, - ATL::CAtlStringW - >::type derived_t; - - typedef ATL::CSimpleStringT rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - derived_t drng; - rng_t& rng = drng; - BOOST_CHECK( brdm::test_init_string(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - // BOOST_CHECK( brdm::test_emptiness(rng) ); no default constructible -} - - -template< int n, class Range > -void test_CFixedStringT(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef typename boost::mpl::if_< boost::is_same, - ATL::CAtlStringA, - ATL::CAtlStringW - >::type base_t; - - typedef ATL::CFixedStringT rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_string(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class Range > -void test_CStringT(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef typename boost::mpl::if_< boost::is_same, - ATL::CAtlStringA, // == CStringT - ATL::CAtlStringW // == CStringT - >::type rng_t; - - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_string(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class Range > -void test_CStaticString(const Range& sample) -{ -#if !defined(BOOST_RANGE_ATL_NO_TEST_UNDOCUMENTED_RANGE) - { - typedef ATL::CStaticString rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng("hello static string"); - BOOST_CHECK( *(boost::begin(rng)+4) == 'o' ); - BOOST_CHECK( *(boost::end(rng)-3) == 'i' ); - } - - { - typedef ATL::CStaticString rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng(L"hello static string"); - BOOST_CHECK( *(boost::begin(rng)+4) == L'o' ); - BOOST_CHECK( *(boost::end(rng)-3) == L'i' ); - } -#endif - - (void)sample; // unused -} - - -#endif // !(_ATL_VER < 0x0700) - - -template< class Range > -void test_CComBSTR(const Range& sample) -{ - typedef ATL::CComBSTR rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng(OLESTR("hello CComBSTR range!")); - BOOST_CHECK( brdm::test_equals(rng, std::string("hello CComBSTR range!")) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); - - (void)sample; // unused -} - - -// simples -// - -template< class Range > -void test_CSimpleArray(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ATL::CSimpleArray rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_array(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class Range > -void test_CSimpleMap(const Range& sample) -{ -#if !defined(BOOST_RANGE_ATL_NO_TEST_UNDOCUMENTED_RANGE) - - typedef ATL::CSimpleMap rng_t; - - rng_t rng; - rng.Add(3, 3.0); - rng.Add(4, 2.0); - - BOOST_CHECK( boost::begin(rng)->get<0>() == 3.0 ); - BOOST_CHECK( (boost::end(rng)-1)->get<1>() == 2.0 ); - -#endif - - (void)sample; // unused -} - - -template< class Range > -void test_CSimpleValArray(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ATL::CSimpleArray rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_array(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -// maps -// - -template< class MapT > -void test_CAtlMap(const MapT& sample) -{ - typedef typename MapT::key_type k_t; - typedef typename MapT::mapped_type m_t; - - typedef ATL::CAtlMap rng_t; - - rng_t rng; - boost::function_requires< boost::ForwardRangeConcept >(); - BOOST_CHECK( brdm::test_init_map(rng, sample) ); - BOOST_CHECK( ::test_atl_map(rng, sample) ); -} - - -template< class MapT > -void test_CRBTree(const MapT& sample) -{ - typedef typename MapT::key_type k_t; - typedef typename MapT::mapped_type m_t; - - typedef ATL::CRBMap derived_t; - typedef ATL::CRBTree rng_t; - - derived_t drng; - rng_t& rng = drng; - - boost::function_requires< boost::BidirectionalRangeConcept >(); - BOOST_CHECK( brdm::test_init_map(drng, sample) ); - BOOST_CHECK( ::test_atl_map(rng, sample) ); -} - - -template< class MapT > -void test_CRBMap(const MapT& sample) -{ - typedef typename MapT::key_type k_t; - typedef typename MapT::mapped_type m_t; - - typedef ATL::CRBMap rng_t; - - rng_t rng; - boost::function_requires< boost::BidirectionalRangeConcept >(); - BOOST_CHECK( brdm::test_init_map(rng, sample) ); - BOOST_CHECK( ::test_atl_map(rng, sample) ); -} - - -template< class MapT > -void test_CRBMultiMap(const MapT& sample) -{ - typedef typename MapT::key_type k_t; - typedef typename MapT::mapped_type m_t; - - typedef ATL::CRBMultiMap rng_t; - - rng_t rng; - boost::function_requires< boost::BidirectionalRangeConcept >(); - BOOST_CHECK( ::test_init_atl_multimap(rng, sample) ); - BOOST_CHECK( ::test_atl_map(rng, sample) ); -} - - -// main test -// - -void test_atl() -{ - - // ordinary ranges - // - { - std::string sample("rebecca judy and mary whiteberry chat monchy"); -#if !(_ATL_VER < 0x0700) - ::test_CAtlArray(sample); - ::test_CAtlList(sample); - ::test_CSimpleStringT(sample); - ::test_CFixedStringT<44>(sample); - ::test_CStringT(sample); - ::test_CStaticString(sample); -#endif - ::test_CComBSTR(sample); - ::test_CSimpleArray(sample); - ::test_CSimpleMap(sample); - ::test_CSimpleValArray(sample); - } - - - { - std::wstring sample(L"rebecca judy and mary whiteberry chat monchy"); -#if !(_ATL_VER < 0x0700) - ::test_CAtlArray(sample); - ::test_CAtlList(sample); - ::test_CSimpleStringT(sample); - ::test_CFixedStringT<44>(sample); - ::test_CStringT(sample); - ::test_CStaticString(sample); -#endif - ::test_CComBSTR(sample); - ::test_CSimpleArray(sample); - ::test_CSimpleMap(sample); - ::test_CSimpleValArray(sample); - } - - // pointer ranges - // -#if !(_ATL_VER < 0x0700) - { - typedef ATL::CAutoPtr ptr_t; - ptr_t - ptr0(new int(3)), ptr1(new int(4)), ptr2(new int(5)), ptr3(new int(4)), - ptr4(new int(1)), ptr5(new int(2)), ptr6(new int(4)), ptr7(new int(0)); - - ptr_t ptrs[8] = { - ptr0, ptr1, ptr2, ptr3, ptr4, ptr5, ptr6, ptr7 - }; - - boost::iterator_range< ptr_t * > workaround(ptrs, ptrs+8); - ::test_CAutoPtrArray(workaround); - } - - { - typedef ATL::CAutoPtr ptr_t; - ptr_t - ptr0(new int(3)), ptr1(new int(4)), ptr2(new int(5)), ptr3(new int(4)), - ptr4(new int(1)), ptr5(new int(2)), ptr6(new int(4)), ptr7(new int(0)); - - ptr_t ptrs[8] = { - ptr0, ptr1, ptr2, ptr3, ptr4, ptr5, ptr6, ptr7 - }; - - boost::iterator_range< ptr_t * > workaround(ptrs, ptrs+8); - ::test_CAutoPtrList(workaround); - } - - { - typedef ATL::CHeapPtr ptr_t; - ptr_t ptrs[5]; { - ptrs[0].AllocateBytes(sizeof(int)); - ptrs[1].AllocateBytes(sizeof(int)); - ptrs[2].AllocateBytes(sizeof(int)); - ptrs[3].AllocateBytes(sizeof(int)); - ptrs[4].AllocateBytes(sizeof(int)); - } - - boost::iterator_range< ptr_t * > workaround(ptrs, ptrs+5); - ::test_CHeapPtrList(workaround); - } - - - { - typedef ATL::CComQIPtr ptr_t; - ptr_t ptrs[8]; - - boost::iterator_range< ptr_t * > workaround(ptrs, ptrs+8); - ::test_CInterfaceArray(workaround); - ::test_CInterfaceList(workaround); - } -#endif - - // maps - // - { -#if !(_ATL_VER < 0x0700) - std::map sample; { - sample[0] = "hello"; - sample[1] = "range"; - sample[2] = "atl"; - sample[3] = "mfc"; - sample[4] = "collections"; - } - - ::test_CAtlMap(sample); - ::test_CRBTree(sample); - ::test_CRBMap(sample); - ::test_CRBMultiMap(sample); -#endif - } - - -} // test_atl - - -#include -using boost::unit_test::test_suite; - - -test_suite * -init_unit_test_suite(int argc, char* argv[]) -{ - test_suite *test = BOOST_TEST_SUITE("ATL Range Test Suite"); - test->add(BOOST_TEST_CASE(&test_atl)); - - (void)argc, (void)argv; // unused - return test; -} diff --git a/libs/range/test/begin.cpp b/libs/range/test/begin.cpp deleted file mode 100644 index f01453514..000000000 --- a/libs/range/test/begin.cpp +++ /dev/null @@ -1,119 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include -#include -#include - -namespace mock_std -{ - template - inline BOOST_DEDUCED_TYPENAME boost::range_iterator::type - begin(SinglePassRange& rng) - { - return rng.begin(); - } - - template - inline BOOST_DEDUCED_TYPENAME boost::range_iterator::type - begin(const SinglePassRange& rng) - { - return rng.begin(); - } - - template - void mock_algorithm_using_begin(const SinglePassRange& rng) - { - BOOST_CHECK( begin(rng) == rng.begin() ); - } - - template - void mock_algorithm_using_begin(SinglePassRange& rng) - { - BOOST_CHECK( begin(rng) == rng.begin() ); - } -} - -namespace boost -{ -#ifdef BOOST_RANGE_SIMULATE_BEGIN_WITHOUT_ADL_NAMESPACE_BARRIER - template - inline BOOST_DEDUCED_TYPENAME range_iterator::type - begin(SinglePassRange& rng) - { - return rng.begin(); - } - - template - inline BOOST_DEDUCED_TYPENAME range_iterator::type - begin(const SinglePassRange& rng) - { - return rng.begin(); - } -#endif - - class MockTestBeginCollection - { - public: - typedef char value_type; - typedef const char* const_pointer; - typedef char* pointer; - typedef const_pointer const_iterator; - typedef pointer iterator; - - MockTestBeginCollection() - : m_first() - , m_last() - { - } - - const_iterator begin() const { return m_first; } - iterator begin() { return m_first; } - const_iterator end() const { return m_last; } - iterator end() { return m_last; } - - private: - iterator m_first; - iterator m_last; - }; -} - -namespace -{ - void test_range_begin() - { - boost::MockTestBeginCollection c; - const boost::MockTestBeginCollection& const_c = c; - mock_std::mock_algorithm_using_begin(const_c); - mock_std::mock_algorithm_using_begin(c); - } -} - -using boost::unit_test::test_suite; - -boost::unit_test::test_suite* -init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = BOOST_TEST_SUITE( "Range Test Suite - begin() ADL namespace barrier" ); - - test->add( BOOST_TEST_CASE( &test_range_begin ) ); - - return test; -} - - diff --git a/libs/range/test/category.cpp b/libs/range/test/category.cpp deleted file mode 100644 index 154c411e7..000000000 --- a/libs/range/test/category.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_category() -{ - typedef std::vector cont; - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::iterator_category::type, - boost::range_category::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::iterator_category::type, - boost::range_category::type - >::value)); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::iterator_category::type, - boost::range_category::type - >::value)); -#endif -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range range_category meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_category)); - - return test; -} diff --git a/libs/range/test/combine.cpp b/libs/range/test/combine.cpp deleted file mode 100644 index 11f674b5d..000000000 --- a/libs/range/test/combine.cpp +++ /dev/null @@ -1,160 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014 -// -// Copyright Thorsten Ottosen 2006. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include - -#include -#include -#include -#include - -namespace boost_range_test -{ - namespace - { - -template -void test_combine2() -{ - std::vector v; - std::list l; - - for (int i = 0; i < 10; ++i) - { - v.push_back(i); - l.push_back(i * 2); - } - - ContRef1& in1 = v; - ContRef2& in2 = l; - - std::vector > output; - boost::push_back(output, boost::combine(in1, in2)); - - int index = 0; - int i1, i2; - BOOST_FOREACH(boost::tie(i1,i2), output) - { - BOOST_CHECK_EQUAL(i1, index); - BOOST_CHECK_EQUAL(i2, index * 2); - ++index; - } -} - -template -void test_combine3() -{ - std::vector v1; - std::vector v2; - std::vector v3; - - for (int i = 0; i < 10; ++i) - { - v1.push_back(i); - v2.push_back(i * 2); - v3.push_back(i * 3); - } - - ContRef1& in1 = v1; - ContRef2& in2 = v2; - ContRef3& in3 = v3; - - std::vector > output; - boost::push_back(output, boost::combine(in1, in2, in3)); - - int index = 0; - int i1, i2, i3; - - BOOST_FOREACH(boost::tie(i1,i2,i3), output) - { - BOOST_CHECK_EQUAL(i1, index); - BOOST_CHECK_EQUAL(i2, index * 2); - BOOST_CHECK_EQUAL(i3, index * 3); - ++index; - } -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite(int, char*[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE( "Boost.Range combine() test suite" ); - - test->add(BOOST_TEST_CASE(( - &boost_range_test::test_combine2< - const std::vector, const std::list >))); - - test->add(BOOST_TEST_CASE(( - &boost_range_test::test_combine2< - const std::vector, std::list >))); - - test->add(BOOST_TEST_CASE(( - &boost_range_test::test_combine2< - std::vector, const std::list >))); - - test->add(BOOST_TEST_CASE(( - &boost_range_test::test_combine2< - std::vector, std::list >))); - - test->add(BOOST_TEST_CASE(( - &boost_range_test::test_combine3< - std::vector, - std::vector, - std::vector >))); - - test->add(BOOST_TEST_CASE(( - &boost_range_test::test_combine3< - std::vector, - std::vector, - const std::vector >))); - - test->add(BOOST_TEST_CASE(( - &boost_range_test::test_combine3< - std::vector, - const std::vector, - std::vector >))); - - test->add(BOOST_TEST_CASE(( - &boost_range_test::test_combine3< - std::vector, - const std::vector, - const std::vector >))); - - test->add(BOOST_TEST_CASE(( - &boost_range_test::test_combine3< - const std::vector, - std::vector, - std::vector >))); - - test->add(BOOST_TEST_CASE(( - &boost_range_test::test_combine3< - const std::vector, - std::vector, - const std::vector >))); - - test->add(BOOST_TEST_CASE(( - &boost_range_test::test_combine3< - const std::vector, - const std::vector, - std::vector >))); - - test->add(BOOST_TEST_CASE(( - &boost_range_test::test_combine3< - const std::vector, - const std::vector, - const std::vector >))); - - return test; -} diff --git a/libs/range/test/compat2.cpp b/libs/range/test/compat2.cpp deleted file mode 100644 index feaa047bd..000000000 --- a/libs/range/test/compat2.cpp +++ /dev/null @@ -1,75 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include -#include - -enum Container {}; -enum String {}; - -template< typename T > -struct range_iterator; - -template<> -struct range_iterator -{ - template< typename C > - struct pts - { - typedef BOOST_DEDUCED_TYPENAME C::iterator type; - }; -}; - -template<> -struct range_iterator -{ - template< typename C > - struct pts - { - typedef C type; - }; -}; - -template< typename C > -class iterator_of -{ -public: - typedef BOOST_DEDUCED_TYPENAME range_iterator::BOOST_NESTED_TEMPLATE pts::type type; -}; - -#include - -void compat1() -{ - std::vector v; - iterator_of< std::vector >::type i = v.begin(); - boost::ignore_unused_variable_warning(i); -} - -#include - -using boost::unit_test::test_suite; - -test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add( BOOST_TEST_CASE( &compat1 ) ); - - return test; -} - - - - - - diff --git a/libs/range/test/compat3.cpp b/libs/range/test/compat3.cpp deleted file mode 100644 index e4e4c8349..000000000 --- a/libs/range/test/compat3.cpp +++ /dev/null @@ -1,75 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include -#include - -enum Container {}; -enum String {}; - -template< typename T > -struct range_iterator; - -template<> -struct range_iterator -{ - template< typename C > - struct pts - { - typedef BOOST_DEDUCED_TYPENAME C::iterator type; - }; -}; - -template<> -struct range_iterator -{ - template< typename C > - struct pts - { - typedef C type; - }; -}; - -template< typename C > -class iterator_of -{ -public: - typedef BOOST_DEDUCED_TYPENAME range_iterator:: template pts::type type; -}; - -#include - -void compat1() -{ - std::vector v; - iterator_of< std::vector >::type i = v.begin(); - boost::ignore_unused_variable_warning(i); -} - -#include - -using boost::unit_test::test_suite; - -test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add( BOOST_TEST_CASE( &compat1 ) ); - - return test; -} - - - - - - diff --git a/libs/range/test/compile_fail/adaptor/adjacent_filtered_concept.cpp b/libs/range/test/compile_fail/adaptor/adjacent_filtered_concept.cpp deleted file mode 100644 index e67215df9..000000000 --- a/libs/range/test/compile_fail/adaptor/adjacent_filtered_concept.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -namespace -{ - -struct always_true -{ - typedef bool result_type; - - bool operator()(int, int) const - { - return true; - } -}; - -} // anonymous namespace - -int main(int, const char**) -{ - using boost::range::unit_test::mock_range; - using boost::adaptors::adjacent_filtered; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adjacent_filtered adaptor takes at least a - // ForwardRange. - return (mock_range() | - adjacent_filtered(always_true())).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/adjacent_filtered_concept2.cpp b/libs/range/test/compile_fail/adaptor/adjacent_filtered_concept2.cpp deleted file mode 100644 index 160f7c9d2..000000000 --- a/libs/range/test/compile_fail/adaptor/adjacent_filtered_concept2.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -namespace -{ - -struct always_true -{ - typedef bool result_type; - - bool operator()(int, int) const - { - return true; - } -}; - -} // anonymous namespace - -int main(int, const char**) -{ - using boost::range::unit_test::mock_const_range; - using boost::adaptors::adjacent_filtered; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adjacent_filtered adaptor takes at least a - // ForwardRange. - return (mock_const_range() | - adjacent_filtered(always_true())).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/adjacent_filtered_concept3.cpp b/libs/range/test/compile_fail/adaptor/adjacent_filtered_concept3.cpp deleted file mode 100644 index 310ac21ca..000000000 --- a/libs/range/test/compile_fail/adaptor/adjacent_filtered_concept3.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -namespace -{ - -struct always_true -{ - typedef bool result_type; - - bool operator()(int, int) const - { - return true; - } -}; - -} // anonymous namespace - -int main(int, const char**) -{ - using boost::range::unit_test::mock_range; - using boost::adaptors::adjacent_filter; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adjacent_filtered adaptor takes at least a - // ForwardRange. - return adjacent_filter( - mock_range(), - always_true()).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/adjacent_filtered_concept4.cpp b/libs/range/test/compile_fail/adaptor/adjacent_filtered_concept4.cpp deleted file mode 100644 index f84b31ec3..000000000 --- a/libs/range/test/compile_fail/adaptor/adjacent_filtered_concept4.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -namespace -{ - -struct always_true -{ - typedef bool result_type; - - bool operator()(int, int) const - { - return true; - } -}; - -} // anonymous namespace - -int main(int, const char**) -{ - using boost::range::unit_test::mock_const_range; - using boost::adaptors::adjacent_filter; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adjacent_filtered adaptor takes at least a - // ForwardRange. - return adjacent_filter( - mock_const_range(), - always_true()).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/copied_concept.cpp b/libs/range/test/compile_fail/adaptor/copied_concept.cpp deleted file mode 100644 index 27e7f72d9..000000000 --- a/libs/range/test/compile_fail/adaptor/copied_concept.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_range; - using boost::adaptors::copied; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a RandomAccessRange. - return (mock_range() | - copied(0,1)).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/copied_concept2.cpp b/libs/range/test/compile_fail/adaptor/copied_concept2.cpp deleted file mode 100644 index 5df8ab6b9..000000000 --- a/libs/range/test/compile_fail/adaptor/copied_concept2.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_const_range; - using boost::adaptors::copied; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a RandomAccessRange. - return (mock_const_range() | - copied(0,1)).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/copied_concept3.cpp b/libs/range/test/compile_fail/adaptor/copied_concept3.cpp deleted file mode 100644 index da1659fb0..000000000 --- a/libs/range/test/compile_fail/adaptor/copied_concept3.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_range; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a RandomAccessRange. - return boost::adaptors::copy( - mock_range(), 0, 1).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/copied_concept4.cpp b/libs/range/test/compile_fail/adaptor/copied_concept4.cpp deleted file mode 100644 index 3df0a6c45..000000000 --- a/libs/range/test/compile_fail/adaptor/copied_concept4.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_const_range; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a RandomAccessRange. - return boost::adaptors::copy( - mock_const_range(), - 0, 1).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/mock_iterator.hpp b/libs/range/test/compile_fail/adaptor/mock_iterator.hpp deleted file mode 100644 index 97f67a917..000000000 --- a/libs/range/test/compile_fail/adaptor/mock_iterator.hpp +++ /dev/null @@ -1,82 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// -#ifndef BOOST_RANGE_UNIT_TEST_ADAPTOR_MOCK_ITERATOR_HPP_INCLUDED -#define BOOST_RANGE_UNIT_TEST_ADAPTOR_MOCK_ITERATOR_HPP_INCLUDED - -#include - -namespace boost -{ - namespace range - { - namespace unit_test - { - -template -class mock_iterator - : public boost::iterator_facade< - mock_iterator, - int, - TraversalTag, - const int& - > -{ -public: - mock_iterator() - : m_value(0) - { - } - - explicit mock_iterator(int value) - : m_value(value) - { - } - -private: - - void increment() - { - ++m_value; - } - - void decrement() - { - --m_value; - } - - bool equal(const mock_iterator& other) const - { - return m_value == other.m_value; - } - - void advance(std::ptrdiff_t offset) - { - m_value += offset; - } - - std::ptrdiff_t distance_to(const mock_iterator& other) const - { - return other.m_value - m_value; - } - - const int& dereference() const - { - return m_value; - } - - int m_value; - friend class boost::iterator_core_access; -}; - - } // namespace unit_test - } // namespace range -} // namespace boost - -#endif // include guard diff --git a/libs/range/test/compile_fail/adaptor/mock_range.hpp b/libs/range/test/compile_fail/adaptor/mock_range.hpp deleted file mode 100644 index 18fe2fa35..000000000 --- a/libs/range/test/compile_fail/adaptor/mock_range.hpp +++ /dev/null @@ -1,50 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// -#ifndef BOOST_RANGE_UNIT_TEST_ADAPTOR_MOCK_RANGE_HPP_INCLUDED -#define BOOST_RANGE_UNIT_TEST_ADAPTOR_MOCK_RANGE_HPP_INCLUDED - -#include "mock_iterator.hpp" -#include - -namespace boost -{ - namespace range - { - namespace unit_test - { - -// Make a non-empty range that models the corresponding range concept. -// This is only useful in unit tests. It is main use is to help test concepts -// assertions are present. -template -iterator_range >& - mock_range() -{ - static iterator_range > instance( - mock_iterator(0), - mock_iterator(1)); - return instance; -} - -template -const iterator_range >& - mock_const_range() -{ - static iterator_range > instance( - mock_iterator(0), - mock_iterator(1)); - return instance; -} - - } // namespace unit_test - } // namespace range -} // namespace boost - -#endif // include guard diff --git a/libs/range/test/compile_fail/adaptor/reversed_concept.cpp b/libs/range/test/compile_fail/adaptor/reversed_concept.cpp deleted file mode 100644 index 5ad00419b..000000000 --- a/libs/range/test/compile_fail/adaptor/reversed_concept.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_range; - using boost::adaptors::reversed; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a BidirectionalRange. - return (mock_range() | reversed).front(); -} - diff --git a/libs/range/test/compile_fail/adaptor/reversed_concept2.cpp b/libs/range/test/compile_fail/adaptor/reversed_concept2.cpp deleted file mode 100644 index e2b8cb6fd..000000000 --- a/libs/range/test/compile_fail/adaptor/reversed_concept2.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_const_range; - using boost::adaptors::reversed; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a BidirectionalRange. - return (mock_const_range() | reversed).front(); -} - diff --git a/libs/range/test/compile_fail/adaptor/reversed_concept3.cpp b/libs/range/test/compile_fail/adaptor/reversed_concept3.cpp deleted file mode 100644 index 619dfa8a8..000000000 --- a/libs/range/test/compile_fail/adaptor/reversed_concept3.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_range; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a BidirectionalRange. - return boost::adaptors::reverse( - mock_range()).front(); -} - diff --git a/libs/range/test/compile_fail/adaptor/reversed_concept4.cpp b/libs/range/test/compile_fail/adaptor/reversed_concept4.cpp deleted file mode 100644 index 0e183eea9..000000000 --- a/libs/range/test/compile_fail/adaptor/reversed_concept4.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_const_range; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a BidirectionalRange. - return boost::adaptors::reverse( - mock_const_range()).front(); -} - diff --git a/libs/range/test/compile_fail/adaptor/sliced_concept.cpp b/libs/range/test/compile_fail/adaptor/sliced_concept.cpp deleted file mode 100644 index 08a653f41..000000000 --- a/libs/range/test/compile_fail/adaptor/sliced_concept.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_range; - using boost::adaptors::sliced; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a RandomAccessRange. - return (mock_range() | - sliced(0,1)).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/sliced_concept2.cpp b/libs/range/test/compile_fail/adaptor/sliced_concept2.cpp deleted file mode 100644 index 996502039..000000000 --- a/libs/range/test/compile_fail/adaptor/sliced_concept2.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_const_range; - using boost::adaptors::sliced; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a RandomAccessRange. - return (mock_const_range() | - sliced(0,1)).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/sliced_concept3.cpp b/libs/range/test/compile_fail/adaptor/sliced_concept3.cpp deleted file mode 100644 index 12749113d..000000000 --- a/libs/range/test/compile_fail/adaptor/sliced_concept3.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_range; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a RandomAccessRange. - return boost::adaptors::slice( - mock_range(), 0, 1).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/sliced_concept4.cpp b/libs/range/test/compile_fail/adaptor/sliced_concept4.cpp deleted file mode 100644 index c7f8206a6..000000000 --- a/libs/range/test/compile_fail/adaptor/sliced_concept4.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_const_range; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a RandomAccessRange. - return boost::adaptors::slice( - mock_const_range(), 0, 1).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/uniqued_concept.cpp b/libs/range/test/compile_fail/adaptor/uniqued_concept.cpp deleted file mode 100644 index bbaaf118c..000000000 --- a/libs/range/test/compile_fail/adaptor/uniqued_concept.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_range; - using boost::adaptors::uniqued; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a ForwardRange. - return (mock_range() | uniqued).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/uniqued_concept2.cpp b/libs/range/test/compile_fail/adaptor/uniqued_concept2.cpp deleted file mode 100644 index a390d1365..000000000 --- a/libs/range/test/compile_fail/adaptor/uniqued_concept2.cpp +++ /dev/null @@ -1,23 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_const_range; - using boost::adaptors::uniqued; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a ForwardRange. - return (mock_const_range() | - uniqued).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/uniqued_concept3.cpp b/libs/range/test/compile_fail/adaptor/uniqued_concept3.cpp deleted file mode 100644 index fea058cc6..000000000 --- a/libs/range/test/compile_fail/adaptor/uniqued_concept3.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_range; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a ForwardRange. - return boost::adaptors::unique( - mock_range()).front(); -} diff --git a/libs/range/test/compile_fail/adaptor/uniqued_concept4.cpp b/libs/range/test/compile_fail/adaptor/uniqued_concept4.cpp deleted file mode 100644 index 1e0239048..000000000 --- a/libs/range/test/compile_fail/adaptor/uniqued_concept4.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include "mock_range.hpp" -#include - -int main(int, const char**) -{ - using boost::range::unit_test::mock_const_range; - - // This next line should fail when Boost.Range concept checking is - // enabled since the adaptor takes at least a ForwardRange. - return boost::adaptors::unique( - mock_const_range()).front(); -} diff --git a/libs/range/test/compile_fail/iterator_range1.cpp b/libs/range/test/compile_fail/iterator_range1.cpp deleted file mode 100644 index 2e5eec379..000000000 --- a/libs/range/test/compile_fail/iterator_range1.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2011. 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) -// -// For more information, see http://www.boost.org/libs/range -// - -#include - -namespace iterator_range_test_detail -{ - void check_iterator_range_doesnt_convert_pointers() - { - double source[] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 }; - boost::iterator_range rng = boost::make_iterator_range(source); - boost::ignore_unused_variable_warning(rng); - } -} - diff --git a/libs/range/test/const_iterator.cpp b/libs/range/test/const_iterator.cpp deleted file mode 100644 index 63238c88e..000000000 --- a/libs/range/test/const_iterator.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_const_iterator() -{ - typedef std::vector cont; - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::const_iterator, - boost::range_const_iterator::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::const_iterator, - boost::range_const_iterator::type - >::value)); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::const_iterator, - boost::range_const_iterator::type - >::value)); -#endif -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range range_const_iterator meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_const_iterator)); - - return test; -} diff --git a/libs/range/test/const_ranges.cpp b/libs/range/test/const_ranges.cpp deleted file mode 100644 index 22bf83ce6..000000000 --- a/libs/range/test/const_ranges.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include -#include -#include - -template< class T > -const T& as_const( const T& r ) -{ - return r; -} - -void check_const_ranges() -{ - std::string foo( "foo" ); - const std::string bar( "bar" ); - - BOOST_CHECK( boost::const_begin( foo ) == boost::begin( as_const( foo ) ) ); - BOOST_CHECK( boost::const_end( foo ) == boost::end( as_const( foo ) ) ); - BOOST_CHECK( boost::const_rbegin( foo ) == boost::rbegin( as_const( foo ) ) ); - BOOST_CHECK( boost::const_rend( foo ) == boost::rend( as_const( foo ) ) ); - - BOOST_CHECK( boost::const_begin( bar ) == boost::begin( as_const( bar ) ) ); - BOOST_CHECK( boost::const_end( bar ) == boost::end( as_const( bar ) ) ); - BOOST_CHECK( boost::const_rbegin( bar ) == boost::rbegin( as_const( bar ) ) ); - BOOST_CHECK( boost::const_rend( bar ) == boost::rend( as_const( bar ) ) ); - -} - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add( BOOST_TEST_CASE( &check_const_ranges ) ); - - return test; -} - - - - - diff --git a/libs/range/test/const_reverse_iterator.cpp b/libs/range/test/const_reverse_iterator.cpp deleted file mode 100644 index 44726fd83..000000000 --- a/libs/range/test/const_reverse_iterator.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_const_reverse_iterator() -{ - typedef std::vector cont; - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::reverse_iterator, - boost::range_const_reverse_iterator::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::reverse_iterator, - boost::range_const_reverse_iterator::type - >::value)); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::reverse_iterator, - boost::range_const_reverse_iterator::type - >::value)); -#endif -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE( - "Boost.Range range_const_reverse_iterator meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_const_reverse_iterator)); - - return test; -} diff --git a/libs/range/test/counting_range.cpp b/libs/range/test/counting_range.cpp deleted file mode 100644 index d1f1d3f5a..000000000 --- a/libs/range/test/counting_range.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -// Disable a warning from since this noise might -// stop us detecting a problem in our code. -#include -#include - -#include -#include - -#include - -#include -#include -#include -#include -#include -namespace boost -{ - namespace - { - template - void counting_range_test_impl(int first, int last) - { - Container reference; - for (int i = first; i < last; ++i) - reference.push_back(i); - - Container test; - push_back( test, counting_range(first, last) ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end()); - } - - template - void counting_range_test_impl() - { - counting_range_test_impl(0, 0); - counting_range_test_impl(-1, -1); - counting_range_test_impl(-1, 0); - counting_range_test_impl(0, 1); - counting_range_test_impl(-100, 100); - counting_range_test_impl(50, 55); - } - - void counting_range_test_range() - { - std::vector v; - for (int i = 0; i < 10; ++i) - v.push_back(i); - - std::vector::iterator> x; - push_back(x, counting_range(v)); - - std::vector t; - push_back(t, x | boost::adaptors::indirected); - - BOOST_CHECK_EQUAL_COLLECTIONS(t.begin(), t.end(), - v.begin(), v.end()); - } - } - - void counting_range_test() - { - counting_range_test_impl >(); - counting_range_test_impl >(); - counting_range_test_impl >(); - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.counting_range" ); - - test->add( BOOST_TEST_CASE( &boost::counting_range_test ) ); - - return test; -} diff --git a/libs/range/test/difference_type.cpp b/libs/range/test/difference_type.cpp deleted file mode 100644 index 556250ac1..000000000 --- a/libs/range/test/difference_type.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_difference() -{ - typedef std::vector cont; - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::difference_type, - boost::range_difference::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::difference_type, - boost::range_difference::type - >::value)); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::difference_type, - boost::range_difference::type - >::value)); -#endif -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range range_difference meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_difference)); - - return test; -} diff --git a/libs/range/test/end.cpp b/libs/range/test/end.cpp deleted file mode 100644 index c8855552f..000000000 --- a/libs/range/test/end.cpp +++ /dev/null @@ -1,119 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include -#include -#include - -namespace mock_std -{ - template - inline BOOST_DEDUCED_TYPENAME boost::range_iterator::type - end(SinglePassRange& rng) - { - return rng.end(); - } - - template - inline BOOST_DEDUCED_TYPENAME boost::range_iterator::type - end(const SinglePassRange& rng) - { - return rng.end(); - } - - template - void mock_algorithm_using_end(const SinglePassRange& rng) - { - BOOST_CHECK( end(rng) == rng.end() ); - } - - template - void mock_algorithm_using_end(SinglePassRange& rng) - { - BOOST_CHECK( end(rng) == rng.end() ); - } -} - -namespace boost -{ -#ifdef BOOST_RANGE_SIMULATE_END_WITHOUT_ADL_NAMESPACE_BARRIER - template - inline BOOST_DEDUCED_TYPENAME range_iterator::type - end(SinglePassRange& rng) - { - return rng.end(); - } - - template - inline BOOST_DEDUCED_TYPENAME range_iterator::type - end(const SinglePassRange& rng) - { - return rng.end(); - } -#endif - - class MockTestEndCollection - { - public: - typedef char value_type; - typedef const char* const_pointer; - typedef char* pointer; - typedef const_pointer const_iterator; - typedef pointer iterator; - - MockTestEndCollection() - : m_first() - , m_last() - { - } - - const_iterator begin() const { return m_first; } - iterator begin() { return m_first; } - const_iterator end() const { return m_last; } - iterator end() { return m_last; } - - private: - iterator m_first; - iterator m_last; - }; -} - -namespace -{ - void test_range_end_adl_avoidance() - { - boost::MockTestEndCollection c; - const boost::MockTestEndCollection& const_c = c; - mock_std::mock_algorithm_using_end(const_c); - mock_std::mock_algorithm_using_end(c); - } -} - -using boost::unit_test::test_suite; - -boost::unit_test::test_suite* -init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = BOOST_TEST_SUITE( "Range Test Suite - end() ADL namespace barrier" ); - - test->add( BOOST_TEST_CASE( &test_range_end_adl_avoidance ) ); - - return test; -} - - diff --git a/libs/range/test/extension_mechanism.cpp b/libs/range/test/extension_mechanism.cpp deleted file mode 100644 index b8b711275..000000000 --- a/libs/range/test/extension_mechanism.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include -#include -#include - -// -// Generic range algorithm -// -template< class Rng > -typename boost::range_iterator::type foo_algo( Rng& r ) -{ - // - // This will only compile for Rng = UDT if the qualified calls - // find boost_range_XXX via ADL. - // - return boost::size(r) == 0u ? boost::begin(r) : boost::end(r); -} - -namespace Foo -{ - // - // Our sample UDT - // - struct X - { - X() : vec() { } - - typedef std::vector data_t; - typedef data_t::iterator iterator; - typedef data_t::const_iterator const_iterator; - - data_t vec; - - void push_back( int i ) - { vec.push_back(i); } - }; - - // - // The required functions. No type-traits need - // to be defined because X defines the proper set of - // nested types. - // - inline X::iterator range_begin( X& x ) - { - return x.vec.begin(); - } - - - inline X::const_iterator range_begin( const X& x ) - { - return x.vec.begin(); - } - - - inline X::iterator range_end( X& x ) - { - return x.vec.end(); - } - - inline X::const_iterator range_end( const X& x ) - { - return x.vec.end(); - } - -} - -void check_extension() -{ - Foo::X x; - x.push_back(3); - const Foo::X x2; - - foo_algo( x ); - foo_algo( x2 ); -} - -using boost::unit_test::test_suite; - -test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add( BOOST_TEST_CASE( &check_extension ) ); - - return test; -} - - - - - diff --git a/libs/range/test/extension_size.cpp b/libs/range/test/extension_size.cpp deleted file mode 100644 index b9cc1b24e..000000000 --- a/libs/range/test/extension_size.cpp +++ /dev/null @@ -1,224 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include -#include -#include -#include -#include -#include - -namespace boost_range_extension_size_test -{ - class FooWithoutSize - { - typedef std::list impl_t; - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::range_size >::type, - std::list::size_type - >::value)); - - typedef impl_t::const_iterator const_iterator; - typedef impl_t::iterator iterator; - - public: - friend inline const_iterator range_begin(const FooWithoutSize& obj) { return obj.m_impl.begin(); } - friend inline iterator range_begin(FooWithoutSize& obj) { return obj.m_impl.begin(); } - friend inline const_iterator range_end(const FooWithoutSize& obj) { return obj.m_impl.end(); } - friend inline iterator range_end(FooWithoutSize& obj){ return obj.m_impl.end(); } - - private: - impl_t m_impl; - }; - - template - class FooWithSize - { - public: - typedef SizeType size_type; - typedef boost::uint8_t* iterator; - typedef const boost::uint8_t* const_iterator; - - const_iterator begin() const; - iterator begin(); - const_iterator end() const; - iterator end(); - }; - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::uint8_t, - boost::range_size >::type - >::value - )); - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::uint16_t, - boost::range_size >::type - >::value - )); - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::uint32_t, - boost::range_size >::type - >::value - )); - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::uint64_t, - boost::range_size >::type - >::value - )); - - class UdtSizeType - { - public: - typedef boost::uint16_t value_type; - - UdtSizeType() : value_(0) { } - UdtSizeType(value_type value) : value_(value) { } - - operator value_type() const { return value_; } - - private: - value_type value_; - }; - - BOOST_STATIC_ASSERT(( - boost::is_same< - UdtSizeType, - boost::range_size >::type - >::value - )); - - class Foo2WithoutSize - { - public: - struct const_iterator - { - typedef std::forward_iterator_tag iterator_category; - typedef boost::int8_t difference_type; - typedef boost::int16_t value_type; - typedef value_type* pointer; - typedef value_type& reference; - - reference operator*() const; - pointer operator->() const; - const_iterator& operator++(); - const_iterator operator++(int); - bool operator==(const const_iterator&) const; - bool operator!=(const const_iterator&) const; - }; - - struct iterator : const_iterator - { - typedef const value_type* pointer; - typedef const value_type& reference; - - reference operator*() const; - pointer operator->() const; - - iterator& operator++(); - iterator operator++(int); - - bool operator==(const iterator&) const; - bool operator!=(const iterator&) const; - }; - - const_iterator begin() const; - iterator begin(); - const_iterator end() const; - iterator end(); - }; - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::uint8_t, - boost::range_size< - ::boost_range_extension_size_test::Foo2WithoutSize>::type - >::value - )); -} - -namespace boost -{ - template<> struct range_iterator - { - typedef std::list::const_iterator type; - }; - - template<> struct range_iterator< ::boost_range_extension_size_test::FooWithoutSize> - { - typedef std::list::iterator type; - }; -} - -namespace boost_range_extension_size_test -{ - inline boost::range_size::type - range_calculate_size(const FooWithoutSize& rng) - { - return 2u; - } -} - -BOOST_STATIC_ASSERT(( - boost::is_same< - boost::make_unsigned::type, - boost::range_size< - boost_range_extension_size_test::FooWithoutSize>::type - >::value -)); - -typedef boost::make_unsigned::type t1; -typedef boost::range_size::type t1; - -namespace -{ - -void check_size_works_with_random_access() -{ - std::vector container; - container.push_back(1); - BOOST_CHECK_EQUAL( boost::size(container), 1u ); -} - -void check_extension_size() -{ - BOOST_CHECK_EQUAL( boost::size(boost_range_extension_size_test::FooWithoutSize()), 2u ); -} - -} // anonymous namespace - -using boost::unit_test::test_suite; - -test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add( BOOST_TEST_CASE( &check_size_works_with_random_access )); - test->add( BOOST_TEST_CASE( &check_extension_size ) ); - - return test; -} diff --git a/libs/range/test/has_range_iterator.cpp b/libs/range/test/has_range_iterator.cpp deleted file mode 100644 index 2efc88b06..000000000 --- a/libs/range/test/has_range_iterator.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include - -#include -#include - -#include - -namespace -{ - class MockClassWithoutIterators {}; - - template - void test_has_range_iterator_impl(const bool expected_value) - { - BOOST_CHECK_EQUAL( boost::has_range_iterator::value, expected_value ); - } - - template - void test_has_range_const_iterator_impl(const bool expected_value) - { - BOOST_CHECK_EQUAL( boost::has_range_const_iterator::value, expected_value ); - } - - void test_has_range_iterator() - { - test_has_range_iterator_impl< std::vector >(true); - test_has_range_iterator_impl< MockClassWithoutIterators >(false); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - test_has_range_iterator_impl&&>(true); - test_has_range_iterator_impl(false); -#endif - } - - void test_has_range_const_iterator() - { - test_has_range_const_iterator_impl< std::vector >(true); - test_has_range_const_iterator_impl< MockClassWithoutIterators >(false); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - test_has_range_const_iterator_impl&&>(true); - test_has_range_const_iterator_impl(false); -#endif - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.has_range_iterator" ); - - test->add(BOOST_TEST_CASE(&test_has_range_iterator)); - test->add(BOOST_TEST_CASE(&test_has_range_const_iterator)); - - return test; -} diff --git a/libs/range/test/irange.cpp b/libs/range/test/irange.cpp deleted file mode 100644 index 659401ba0..000000000 --- a/libs/range/test/irange.cpp +++ /dev/null @@ -1,153 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include -#include -#include -#include -#include -#include - -namespace boost -{ - // Test an integer range with a step size of 1. - template - void test_irange_impl(Integer first, Integer last) - { - std::vector reference; - for (Integer i = first; i < last; ++i) - { - reference.push_back(i); - } - - std::vector test; - boost::push_back(test, boost::irange(first, last)); - - BOOST_CHECK_EQUAL_COLLECTIONS( test.begin(), test.end(), - reference.begin(), reference.end() ); - } - - // Test an integer range with a runtime specified step size. - template - void test_irange_impl(IntegerInput first, IntegerInput last, int step) - { - BOOST_ASSERT( step != 0 ); - - // Skip tests that have negative values if the type is - // unsigned - if ((static_cast(static_cast(first)) != first) - || (static_cast(static_cast(last)) != last)) - return; - - std::vector reference; - - const std::ptrdiff_t first_p = static_cast(first); - const std::ptrdiff_t last_p = static_cast(last); - const std::ptrdiff_t step_p = static_cast(step); - for (std::ptrdiff_t current_value = first_p; - step_p >= 0 ? current_value < last_p : current_value > last_p; - current_value += step_p) - reference.push_back(current_value); - - std::vector test; - boost::push_back(test, boost::irange(first, last, step)); - - BOOST_CHECK_EQUAL_COLLECTIONS( test.begin(), test.end(), - reference.begin(), reference.end() ); - } - - // Test driver function that for an integer range [first, last) - // drives the test implementation through various integer - // types. - void test_irange(int first, int last) - { - test_irange_impl(first,last); - test_irange_impl(first, last); - test_irange_impl(first, last); - test_irange_impl(first, last); - test_irange_impl(first, last); - test_irange_impl(first, last); - test_irange_impl(first, last); - test_irange_impl(first, last); - } - - // Test driver function that for an integer range [first, last) - // drives the test implementation through various integer - // types step_size items at a time. - void test_irange(int first, int last, int step_size) - { - BOOST_ASSERT( step_size != 0 ); - test_irange_impl(first, last, step_size); - test_irange_impl(first, last, step_size); - test_irange_impl(first, last, step_size); - test_irange_impl(first, last, step_size); - test_irange_impl(first, last, step_size); - test_irange_impl(first, last, step_size); - test_irange_impl(first, last, step_size); - test_irange_impl(first, last, step_size); - } - - // Implementation of the unit test for the integer range - // function. - // This starts the test drivers to drive a set of integer types - // for a combination of range values chosen to exercise a large - // number of implementation branches. - void irange_unit_test() - { - // Test the single-step version of irange(first, last) - test_irange(0, 0); - test_irange(0, 1); - test_irange(0, 10); - test_irange(1, 1); - test_irange(1, 2); - test_irange(1, 11); - - // Test the n-step version of irange(first, last, step-size) - test_irange(0, 0, 1); - test_irange(0, 0, -1); - test_irange(0, 10, 1); - test_irange(10, 0, -1); - test_irange(0, 2, 2); - test_irange(2, 0, -2); - test_irange(0, 9, 2); - test_irange(9, 0, -2); - test_irange(-9, 0, 2); - test_irange(-9, 9, 2); - test_irange(9, -9, -2); - test_irange(10, 20, 5); - test_irange(20, 10, -5); - - test_irange(0, 0, 3); - test_irange(0, 1, 3); - test_irange(0, 2, 3); - test_irange(0, 3, 3); - test_irange(0, 4, 3); - test_irange(0, 10, 3); - - test_irange(0, 0, -3); - test_irange(0, -1, -3); - test_irange(0, -2, -3); - test_irange(0, -3, -3); - test_irange(0, -4, -3); - test_irange(0, -10, -3); - } -} // namespace boost - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.irange" ); - - test->add(BOOST_TEST_CASE( &boost::irange_unit_test )); - - return test; -} diff --git a/libs/range/test/istream_range.cpp b/libs/range/test/istream_range.cpp deleted file mode 100644 index 7d10313ff..000000000 --- a/libs/range/test/istream_range.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - template - void test_istream_range_impl() - { - std::basic_stringstream s; - std::vector reference; - for (int i = 0; i < 10; ++i) - { - reference.push_back(i); - s << i << CharT(' '); - } - - std::vector target; - boost::push_back(target, boost::range::istream_range(s)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - target.begin(), target.end() ); - } - - // Test an istream range. - void test_istream_range() - { - test_istream_range_impl(); - test_istream_range_impl(); - } - -} // namespace anonymous namespace - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.istream_range" ); - - test->add(BOOST_TEST_CASE( &test_istream_range )); - - return test; -} diff --git a/libs/range/test/iterator.cpp b/libs/range/test/iterator.cpp deleted file mode 100644 index 76c915a98..000000000 --- a/libs/range/test/iterator.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_iterator() -{ - typedef std::vector cont; - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::iterator, - boost::range_iterator::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::const_iterator, - boost::range_iterator::type - >::value)); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::iterator, - boost::range_iterator::type - >::value)); -#endif -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range range_iterator meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_iterator)); - - return test; -} diff --git a/libs/range/test/iterator_ext.cpp b/libs/range/test/iterator_ext.cpp deleted file mode 100644 index 820bf2a4a..000000000 --- a/libs/range/test/iterator_ext.cpp +++ /dev/null @@ -1,153 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - -struct point -{ - int x; - int y; -}; - -class shape -{ -public: - virtual ~shape() - { - } - - const std::vector& points() const - { - return m_points; - } - -private: - std::vector m_points; -}; - -class rectangle : public shape -{ -}; - -class circle : public shape -{ -}; - -class container -{ - typedef std::vector impl_t; -}; - -} // namespace boost_range_test - -namespace boost -{ - template - struct range_mutable_iterator< - T, - typename boost::enable_if< - boost::is_base_of< - boost_range_test::shape, - typename boost::remove_reference< - typename boost::remove_cv::type - >::type - > - >::type - > - { - typedef std::vector::iterator type; - }; - - template - struct range_const_iterator< - T, - typename boost::enable_if< - boost::is_base_of< - boost_range_test::shape, - typename boost::remove_reference< - typename boost::remove_cv::type - >::type - > - >::type - > - { - typedef std::vector::const_iterator type; - }; - - template<> - struct range_mutable_iterator - { - typedef std::vector::iterator type; - }; - - template<> - struct range_const_iterator - { - typedef std::vector::const_iterator type; - }; -} - -namespace boost_range_test -{ - template - void test_iterator_impl() - { - BOOST_STATIC_ASSERT(( - boost::is_same< - std::vector::iterator, - typename boost::range_iterator::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - std::vector::const_iterator, - typename boost::range_iterator::type - >::value)); - - #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - std::vector::iterator, - typename boost::range_iterator::type - >::value)); - #endif - } - - void test_iterator() - { - test_iterator_impl(); - test_iterator_impl(); - test_iterator_impl(); - - test_iterator_impl(); - } -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range range_iterator meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_iterator)); - - return test; -} diff --git a/libs/range/test/iterator_pair.cpp b/libs/range/test/iterator_pair.cpp deleted file mode 100644 index ba13d75ca..000000000 --- a/libs/range/test/iterator_pair.cpp +++ /dev/null @@ -1,102 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include -#include -#include -#include -#include -#include - -void check_iterator_pair() -{ - typedef std::vector vec_t; - vec_t vec; - vec.push_back( 4 ); - typedef std::pair - pair_t; - typedef std::pair - const_pair_t; - typedef const pair_t const_pair_tt; - pair_t pair = std::make_pair( boost::begin( vec ), boost::end( vec ) ); - const_pair_t const_pair = std::make_pair( boost::begin( vec ), boost::end( vec ) ); - const_pair_tt constness_pair( pair ); - - - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_value::type, - boost::detail::iterator_traits::value_type>::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator::type, pair_t::first_type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_const_iterator::type, pair_t::first_type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_difference::type, - boost::detail::iterator_traits::difference_type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_size::type, std::size_t >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator::type, pair_t::first_type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator::type, const_pair_t::first_type >::value )); - - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_value::type, - boost::detail::iterator_traits::value_type>::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator::type, const_pair_tt::first_type >::value )); - // - // This behavior is not supported with v2. - //BOOST_STATIC_ASSERT(( is_same< range_const_iterator::type, const_pair_tt::first_type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_difference::type, - boost::detail::iterator_traits::difference_type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_size::type, std::size_t >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator::type, const_pair_tt::first_type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator::type, const_pair_tt::first_type >::value )); - - BOOST_CHECK( boost::begin( pair ) == pair.first ); - BOOST_CHECK( boost::end( pair ) == pair.second ); - BOOST_CHECK( boost::empty( pair ) == (pair.first == pair.second) ); - BOOST_CHECK( boost::size( pair ) == - static_cast( - std::distance(pair.first, pair.second)) ); - - BOOST_CHECK( boost::begin( const_pair ) == const_pair.first ); - BOOST_CHECK( boost::end( const_pair ) == const_pair.second ); - BOOST_CHECK( boost::empty( const_pair ) == (const_pair.first == const_pair.second) ); - BOOST_CHECK( boost::size( const_pair ) == - static_cast( - std::distance(const_pair.first, const_pair.second)) ); - - BOOST_CHECK( boost::begin( constness_pair ) == constness_pair.first ); - BOOST_CHECK( boost::end( constness_pair ) == constness_pair.second ); - BOOST_CHECK( boost::empty( constness_pair ) == (constness_pair.first == const_pair.second) ); - BOOST_CHECK( boost::size( constness_pair ) == - static_cast( - std::distance(constness_pair.first, - constness_pair.second)) ); -} - - -#include - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add( BOOST_TEST_CASE( &check_iterator_pair ) ); - - return test; -} - - - - - - diff --git a/libs/range/test/iterator_range.cpp b/libs/range/test/iterator_range.cpp deleted file mode 100644 index 9bbcff2b6..000000000 --- a/libs/range/test/iterator_range.cpp +++ /dev/null @@ -1,330 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen & Larry Evans 2003-2005. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -//#include - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void check_reference_type(); - -void check_iterator_range() -{ - - typedef std::string::iterator iterator; - typedef std::string::const_iterator const_iterator; - typedef boost::iterator_range irange; - typedef boost::iterator_range cirange; - std::string str = "hello world"; - const std::string cstr = "const world"; - irange r = boost::make_iterator_range( str ); - r = boost::make_iterator_range( str.begin(), str.end() ); - cirange r2 = boost::make_iterator_range( cstr ); - r2 = boost::make_iterator_range( cstr.begin(), cstr.end() ); - r2 = boost::make_iterator_range( str ); - - BOOST_CHECK( !r.empty() ); - BOOST_CHECK( !r2.empty() ); - -//#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -// if( !(bool)r ) -// BOOST_CHECK( false ); -// if( !(bool)r2 ) -// BOOST_CHECK( false ); -//#else - if( !r ) - BOOST_CHECK( false ); - if( !r2 ) - BOOST_CHECK( false ); -//#endif - - BOOST_CHECK_EQUAL( r.size(), boost::size( r ) ); - BOOST_CHECK_EQUAL( r2.size(), boost::size( r2 ) ); - - BOOST_CHECK_EQUAL( std::distance( r.begin(), r.end() ), - std::distance( boost::begin( r2 ), boost::end( r2 ) ) ); - std::cout << r << r2; - - -#ifndef BOOST_NO_STD_WSTRING - std::wcout << boost::make_iterator_range( std::wstring( L"a wide string" ) ) - << boost::make_iterator_range( L"another wide string" ); -#endif - - std::string res = boost::copy_range( r ); - BOOST_CHECK_EQUAL_COLLECTIONS( res.begin(), res.end(), r.begin(), r.end() ); - - irange rr = boost::make_iterator_range( str ); - BOOST_CHECK( rr.equal( r ) ); - - rr = boost::make_iterator_range( str.begin(), str.begin() + 5 ); - BOOST_CHECK( rr == boost::as_literal("hello") ); - BOOST_CHECK( rr != boost::as_literal("hell") ); - BOOST_CHECK( rr < boost::as_literal("hello dude") ); - BOOST_CHECK( boost::as_literal("hello") == rr ); - BOOST_CHECK( boost::as_literal("hell") != rr ); - BOOST_CHECK( ! (boost::as_literal("hello dude") < rr ) ); - irange rrr = rr; - BOOST_CHECK( rrr == rr ); - BOOST_CHECK( !( rrr != rr ) ); - BOOST_CHECK( !( rrr < rr ) ); - - const irange cr = boost::make_iterator_range( str ); - BOOST_CHECK_EQUAL( cr.front(), 'h' ); - BOOST_CHECK_EQUAL( cr.back(), 'd' ); - BOOST_CHECK_EQUAL( cr[1], 'e' ); - BOOST_CHECK_EQUAL( cr(1), 'e' ); - - rrr = boost::make_iterator_range( str, 1, -1 ); - BOOST_CHECK( rrr == boost::as_literal("ello worl") ); - rrr = boost::make_iterator_range( rrr, -1, 1 ); - BOOST_CHECK( rrr == str ); - - check_reference_type(); - - // Check that an iterator range can be instantiated with - // a pointer to an array as an iterator. - int arr[2][2]; - boost::make_iterator_range(arr, arr + 2); -} - -namespace iterator_range_test_detail -{ - struct less - { - template< class Left, class Right > - bool operator()(const Left& l, const Right& r) const - { - return l < r; - } - }; - - struct greater - { - template< class Left, class Right > - bool operator()(const Left& l, const Right& r) const - { - return l > r; - } - }; - - struct less_or_equal - { - template< class Left, class Right > - bool operator()(const Left& l, const Right& r) const - { - return l <= r; - } - }; - - struct greater_or_equal - { - template< class Left, class Right > - bool operator()(const Left& l, const Right& r) const - { - return l >= r; - } - }; - - struct equal_to - { - template< class Left, class Right > - bool operator()(const Left& l, const Right& r) const - { - return l == r; - } - }; - - struct not_equal_to - { - template< class Left, class Right > - bool operator()(const Left& l, const Right& r) const - { - return l != r; - } - }; - - template< class Pred > - void check_iterator_range_operators_impl(Pred pred) - { - std::vector vals; - vals.push_back(std::string()); - vals.push_back("a"); - vals.push_back("b"); - vals.push_back("z"); - vals.push_back("ab"); - vals.push_back("ba"); - vals.push_back("abc"); - vals.push_back("cba"); - vals.push_back("aa"); - vals.push_back("aaa"); - vals.push_back("aab"); - vals.push_back("bba"); - - typedef std::string::const_iterator citer; - typedef boost::iterator_range iter_range; - - typedef std::vector::const_iterator value_const_iterator; - value_const_iterator first_val = vals.begin(); - value_const_iterator last_val = vals.end(); - - for (value_const_iterator left_it = first_val; left_it != last_val; ++left_it) - { - const std::string& leftValue = *left_it; - for (value_const_iterator right_it = first_val; right_it != last_val; ++right_it) - { - const std::string& rightValue = *right_it; - iter_range left = boost::make_iterator_range(leftValue); - iter_range right = boost::make_iterator_range(rightValue); - - const bool reference = pred(leftValue, rightValue); - - BOOST_CHECK_EQUAL( pred(left, right), reference ); - BOOST_CHECK_EQUAL( pred(left, rightValue), reference ); - BOOST_CHECK_EQUAL( pred(leftValue, right), reference ); - } - } - } - - void check_iterator_range_from_array() - { - double source[] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 }; - boost::iterator_range rng = boost::make_iterator_range(source); - BOOST_CHECK_EQUAL_COLLECTIONS( rng.begin(), rng.end(), - source, source + 6 ); - } - - void check_make_iterator_range_n() - { - using boost::uint32_t; - - std::vector input; - for (uint32_t i = 0; i < 10u; ++i) - input.push_back(i); - - boost::iterator_range::iterator> rng = - boost::make_iterator_range_n(boost::begin(input), 8u); - - BOOST_CHECK(rng.begin() == input.begin()); - BOOST_CHECK(rng.end() == input.begin() + 8); - BOOST_CHECK_EQUAL(rng.size(), 8u); - - const std::vector& cinput = input; - - boost::iterator_range::const_iterator> crng = - boost::make_iterator_range_n(boost::begin(cinput), 8u); - - BOOST_CHECK(crng.begin() == cinput.begin()); - BOOST_CHECK(crng.end() == cinput.begin() + 8); - BOOST_CHECK_EQUAL(crng.size(), 8u); - } - -} // namespace iterator_range_test_detail - -template -inline void check_iterator_range_operator() -{ - iterator_range_test_detail::check_iterator_range_operators_impl( - Pred()); -} - -inline void test_advance() -{ - std::vector l; - l.push_back(1); - l.push_back(2); - typedef boost::iterator_range::iterator> rng_t; - - rng_t r1(l.begin(), l.end()); - BOOST_CHECK(r1.advance_begin(1).advance_end(-1).empty()); - - rng_t r2(l.begin(), l.end()); - BOOST_CHECK_EQUAL(r2.advance_begin(1).size(), 1u); - - rng_t r3(l.begin(), l.end()); - BOOST_CHECK_EQUAL(r3.advance_end(-1).size(), 1u); -} - -struct ptr_iterator - : boost::iterator_adaptor -{ - ptr_iterator() {} - ptr_iterator(int *p) : boost::iterator_adaptor(p) {} -private: - typedef void iterator; // To throw off the SFINAE mechanism in iterator_range -}; - -void test_sfinae() -{ - boost::iterator_range r(ptr_iterator(0), ptr_iterator(0)); -} - -// -// -// Check that constness is propagated correct from -// the iterator types. -// -// Test contributed by Larry Evans. -// - -template< class Container > -int test_iter_range( Container& a_cont ) -{ - typedef BOOST_DEDUCED_TYPENAME boost::range_iterator::type citer_type; - typedef boost::iterator_range riter_type; - riter_type a_riter( boost::make_iterator_range( a_cont ) ); - a_riter.front(); - a_riter.back(); - int i = a_riter[0]; - return i; -} - - - -void check_reference_type() -{ - typedef std::vector veci_type; - veci_type a_vec; - a_vec.push_back( 999 ); - test_iter_range(a_vec); - test_iter_range(a_vec); -} - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add(BOOST_TEST_CASE(&check_iterator_range)); - test->add(BOOST_TEST_CASE(&check_iterator_range_operator)); - test->add(BOOST_TEST_CASE(&check_iterator_range_operator)); - test->add(BOOST_TEST_CASE(&check_iterator_range_operator)); - test->add(BOOST_TEST_CASE(&check_iterator_range_operator)); - test->add(BOOST_TEST_CASE(&check_iterator_range_operator)); - test->add(BOOST_TEST_CASE(&check_iterator_range_operator)); - test->add(BOOST_TEST_CASE(&iterator_range_test_detail::check_make_iterator_range_n)); - test->add(BOOST_TEST_CASE(&test_advance)); - - return test; -} - diff --git a/libs/range/test/iterator_range_drop.cpp b/libs/range/test/iterator_range_drop.cpp deleted file mode 100644 index 58ac43ca0..000000000 --- a/libs/range/test/iterator_range_drop.cpp +++ /dev/null @@ -1,200 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -class single_pass_iterator - : public boost::iterator_facade< - single_pass_iterator, - boost::int32_t, - boost::single_pass_traversal_tag, - const boost::int32_t& - > -{ - friend class boost::iterator_core_access; - - typedef std::vector::const_iterator iterator_t; - -public: - single_pass_iterator() { } - - explicit single_pass_iterator(iterator_t it) - : m_it(it) - { - } - -private: - void increment() - { - ++m_it; - } - - bool equal(single_pass_iterator other) const - { - return m_it == other.m_it; - } - - reference dereference() const - { - return *m_it; - } - - iterator_t m_it; -}; - -class bidirectional_iterator - : public boost::iterator_facade< - bidirectional_iterator, - boost::int32_t, - boost::bidirectional_traversal_tag, - const boost::int32_t& - > -{ - friend class boost::iterator_core_access; - - typedef std::vector::const_iterator iterator_t; - -public: - bidirectional_iterator() { } - - explicit bidirectional_iterator(iterator_t it) - : m_it(it) - { - } - -private: - void increment() - { - ++m_it; - } - - void decrement() - { - --m_it; - } - - bool equal(bidirectional_iterator other) const - { - return m_it == other.m_it; - } - - reference dereference() const - { - return *m_it; - } - - iterator_t m_it; -}; - -template -boost::iterator_range -single_pass_range(const SinglePassRange& rng) -{ - return boost::iterator_range( - single_pass_iterator(boost::begin(rng)), - single_pass_iterator(boost::end(rng))); -} - -template -boost::iterator_range -bidirectional_range(const BidirectionalRange& rng) -{ - return boost::iterator_range( - bidirectional_iterator(boost::begin(rng)), - bidirectional_iterator(boost::end(rng))); -} - -void test_drop_front() -{ - std::vector v; - std::vector ref_output; - - for (boost::int32_t i = 0; i < 10; ++i) - { - v.push_back(i); - ref_output.push_back(i); - } - - boost::iterator_range rng = single_pass_range(v); - - BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(), - ref_output.begin(), ref_output.end()); - - rng.drop_front(); - - ref_output.erase(ref_output.begin()); - - BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(), - ref_output.begin(), ref_output.end()); - - rng.drop_front(5); - - ref_output.erase(ref_output.begin(), ref_output.begin() + 5); - - BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(), - ref_output.begin(), ref_output.end()); -} - -void test_drop_back() -{ - std::vector v; - std::vector ref_output; - - for (boost::int32_t i = 0; i < 10; ++i) - { - v.push_back(i); - ref_output.push_back(i); - } - - boost::iterator_range rng = bidirectional_range(v); - - BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(), - ref_output.begin(), ref_output.end()); - - rng.drop_back(); - - ref_output.pop_back(); - - BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(), - ref_output.begin(), ref_output.end()); - - rng.drop_back(5); - - ref_output.erase(ref_output.end() - 5, ref_output.end()); - - BOOST_CHECK_EQUAL_COLLECTIONS(rng.begin(), rng.end(), - ref_output.begin(), ref_output.end()); -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range iterator_range drop functions"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_drop_front)); - test->add(BOOST_TEST_CASE(&boost_range_test::test_drop_back)); - - return test; -} diff --git a/libs/range/test/iterator_range_equality_bug.cpp b/libs/range/test/iterator_range_equality_bug.cpp deleted file mode 100644 index eea47cb5b..000000000 --- a/libs/range/test/iterator_range_equality_bug.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -// As reported in https://groups.google.com/forum/#!msg/boost-developers-archive/6JVNg7ZPb4k/RAlvPUec4MAJ - -#include -#include -#include - -namespace boost -{ - enum {unnamed}; - struct S { - bool operator<(int) const {return false;} - bool operator==(int) const {return false;} - }; - template - bool foo(T i) - { - return i < unnamed || i == unnamed; - } -} - -int main() -{ - using boost::lambda::_1; - (void)(_1 == 42); - (void)(42 == _1); - - boost::foo(42); - boost::foo(boost::S()); -} diff --git a/libs/range/test/iterator_range_hash.cpp b/libs/range/test/iterator_range_hash.cpp deleted file mode 100644 index 3ef9007fa..000000000 --- a/libs/range/test/iterator_range_hash.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_iterator_range_hash() -{ - std::vector v; - - for (boost::int32_t i = 0; i < 10; ++i) - { - v.push_back(i); - } - - std::size_t ref_output = boost::hash_range(v.begin(), v.end()); - - boost::iterator_range::iterator> rng(v); - - std::size_t test_output = boost::hash_value(rng); - - BOOST_CHECK_EQUAL(ref_output, test_output); -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range iterator_range hash function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_iterator_range_hash)); - - return test; -} diff --git a/libs/range/test/iterator_range_variant.cpp b/libs/range/test/iterator_range_variant.cpp deleted file mode 100644 index d55ae8531..000000000 --- a/libs/range/test/iterator_range_variant.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - enum E - { - e1, e2, e3 - }; - - void test_variant_report() - { - typedef boost::mpl::vector< - E, - std::string, - boost::iterator_range - >::type args; - - typedef boost::make_variant_over::type variant_t; - - variant_t v; - std::string s; - v = boost::iterator_range(s.begin(), s.end()); - v = e2; - v = std::string(); - - // Rationale: - // This is cast to const char* to guard against ambiguity in the case - // where std::string::iterator it a char* - v = static_cast(""); - } -} - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("iterator range and variant interoperability"); - - test->add(BOOST_TEST_CASE(&test_variant_report)); - - return test; -} diff --git a/libs/range/test/join.cpp b/libs/range/test/join.cpp deleted file mode 100644 index 586f05ce9..000000000 --- a/libs/range/test/join.cpp +++ /dev/null @@ -1,396 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -// Credits: -// Trac 7376 - was raised by Leonid Gershanovich and his sample was used to -// make the test case to cover this condition. -// -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include - -#include -#include -#include -#include - -namespace boost -{ - namespace - { - // This function is a helper function that writes integers - // of increasing value into a range. It is used to test - // that joined ranged may be written to. - // - // Requires: - // - Range uses shallow copy semantics. - template< typename Range > - void fill_with_ints(Range rng) - { - typedef typename range_iterator::type iterator; - iterator target = boost::begin(rng); - const int count = boost::distance(rng); - for (int i = 0; i < count; ++i) - { - *target = i; - ++target; - } - } - - // The test_join_traversal function is used to provide additional - // tests based upon the underlying join iterator traversal. - // The join iterator takes care of the appropriate demotion, and - // this demotion. - - // test_join_traversal - additional tests for input and forward - // traversal iterators. This is of course a no-op. - template< typename Range1, typename Range2, typename TraversalTag > - void test_join_traversal(Range1& rng1, Range2& rng2, TraversalTag) - { - } - - // test_join_traversal - additional tests for bidirectional - // traversal iterators. - template< typename Range1, typename Range2 > - void test_join_traversal(Range1& rng1, Range2& rng2, boost::bidirectional_traversal_tag) - { - typedef typename range_value::type value_type; - std::vector reference(boost::begin(rng1), boost::end(rng1)); - boost::push_back(reference, rng2); - std::reverse(reference.begin(), reference.end()); - - std::vector test_result; - BOOST_REVERSE_FOREACH( value_type x, join(rng1, rng2) ) - { - test_result.push_back(x); - } - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test_result.begin(), test_result.end() ); - } - - // Test helper function to implement the additional tests for random - // access traversal iterators. This is used by the test_join_traversal - // function for random access iterators. The reason that the test - // implementation is put into this function is to utilise - // template parameter type deduction for the joined range type. - template< typename Range1, typename Range2, typename JoinedRange > - void test_random_access_join(Range1& rng1, Range2& rng2, JoinedRange joined) - { - BOOST_CHECK_EQUAL( boost::end(joined) - boost::begin(joined), boost::distance(joined) ); - BOOST_CHECK( boost::end(joined) <= boost::begin(joined) ); - BOOST_CHECK( boost::begin(joined) >= boost::end(joined) ); - if (boost::empty(joined)) - { - BOOST_CHECK(!(boost::begin(joined) < boost::end(joined))); - BOOST_CHECK(!(boost::end(joined) > boost::begin(joined))); - } - else - { - BOOST_CHECK(boost::begin(joined) < boost::end(joined)); - BOOST_CHECK(boost::end(joined) < boost::begin(joined)); - } - - typedef typename boost::range_difference::type difference_t; - const difference_t count = boost::distance(joined); - BOOST_CHECK( boost::begin(joined) + count == boost::end(joined) ); - BOOST_CHECK( boost::end(joined) - count == boost::begin(joined) ); - - typedef typename boost::range_iterator::type iterator_t; - iterator_t it = boost::begin(joined); - it += count; - BOOST_CHECK( it == boost::end(joined) ); - - it = boost::end(joined); - it -= count; - BOOST_CHECK( it == boost::begin(joined) ); - } - - // test_join_traversal function for random access traversal joined - // ranges. - template< typename Range1, typename Range2 > - void test_join_traversal(Range1& rng1, Range2& rng2, boost::random_access_traversal_tag) - { - test_join_traversal(rng1, rng2, boost::bidirectional_traversal_tag()); - test_random_access_join(rng1, rng2, join(rng1, rng2)); - } - - // Test the ability to write values into a joined range. This is - // achieved by copying the constant collections, altering them - // and then checking the result. Hence this relies upon both - // rng1 and rng2 having value copy semantics. - template< typename Collection1, typename Collection2 > - void test_write_to_joined_range(const Collection1& rng1, const Collection2& rng2) - { - Collection1 c1(rng1); - Collection2 c2(rng2); - - typedef BOOST_DEDUCED_TYPENAME boost::range_value< - Collection1 - >::type value_t BOOST_RANGE_UNUSED; - - fill_with_ints(boost::join(c1,c2)); - - // Ensure that the size of the written range has not been - // altered. - BOOST_CHECK_EQUAL( boost::distance(c1), boost::distance(rng1) ); - BOOST_CHECK_EQUAL( boost::distance(c2), boost::distance(rng2) ); - - // For each element x, in c1 ensure that it has been written to - // with incrementing integers - int x = 0; - typedef typename range_iterator::type iterator1; - iterator1 it1 = boost::begin(c1); - for (; it1 != boost::end(c1); ++it1) - { - BOOST_CHECK_EQUAL( x, *it1 ); - ++x; - } - - // For each element y, in c2 ensure that it has been written to - // with incrementing integers - typedef typename range_iterator::type iterator2; - iterator2 it2 = boost::begin(c2); - for (; it2 != boost::end(c2); ++it2) - { - BOOST_CHECK_EQUAL( x, *it2 ); - ++x; - } - } - - // Perform a unit test of a Boost.Range join() comparing - // it to a reference that is populated by appending - // elements from both source ranges into a vector. - template< typename Collection1, typename Collection2 > - void test_join_impl(Collection1& rng1, Collection2& rng2) - { - typedef typename range_value::type value_type; - std::vector reference(boost::begin(rng1), boost::end(rng1)); - boost::push_back(reference, rng2); - - std::vector test_result; - boost::push_back(test_result, join(rng1, rng2)); - - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test_result.begin(), test_result.end() ); - - typedef boost::range_detail::join_iterator< - typename boost::range_iterator::type, - typename boost::range_iterator::type - > join_iterator_t; - - typedef boost::iterator_traversal< join_iterator_t > tag_t; - - test_join_traversal(rng1, rng2, tag_t()); - - test_write_to_joined_range(rng1, rng2); - } - - // Make a collection filling it with items from the source - // range. This is used to build collections of various - // sizes populated with various values designed to optimize - // the code coverage exercised by the core test function - // test_join_impl. - template - boost::shared_ptr makeCollection(const Range& source) - { - boost::shared_ptr c(new Collection); - c->insert(c->end(), boost::begin(source), boost::end(source)); - return c; - } - - // This templatised version of the test_join_impl function - // generates and populates collections which are later - // used as input to the core test function. - // The caller of this function explicitly provides the - // template parameters. This supports the generation - // of testing a large combination of range types to be - // joined. It is of particular importance to remember - // to combine a random_access range with a bidirectional - // range to determine that the correct demotion of - // types occurs in the join_iterator. - template< typename Collection1, typename Collection2 > - void test_join_impl() - { - typedef boost::shared_ptr collection1_ptr; - typedef boost::shared_ptr collection2_ptr; - typedef boost::shared_ptr collection1_cptr; - typedef boost::shared_ptr collection2_cptr; - std::vector< collection1_cptr > left_containers; - std::vector< collection2_cptr > right_containers; - - left_containers.push_back(collection1_ptr(new Collection1)); - left_containers.push_back(makeCollection(irange(0,1))); - left_containers.push_back(makeCollection(irange(0,100))); - - right_containers.push_back(collection2_ptr(new Collection2)); - right_containers.push_back(makeCollection(irange(0,1))); - right_containers.push_back(makeCollection(irange(0,100))); - - BOOST_FOREACH( collection1_cptr left_container, left_containers ) - { - BOOST_FOREACH( collection2_cptr right_container, right_containers ) - { - test_join_impl(*left_container, *right_container); - } - } - } - - // entry-point into the unit test for the join() function - // this tests a representative sample of combinations of - // source range type. - void join_test() - { - test_join_impl< std::vector, std::vector >(); - test_join_impl< std::list, std::list >(); - test_join_impl< std::deque, std::deque >(); - - test_join_impl< std::vector, std::list >(); - test_join_impl< std::list, std::vector >(); - test_join_impl< std::vector, std::deque >(); - test_join_impl< std::deque, std::vector >(); - } - - void test_join_iterator_reference_type_constness_ticket8483() - { - // Just test that this compiles. - // Before the fix for bug 8483, the reference type of the joined - // range's iterator was incorrect ('int&' instead of 'const int&'), - // causing compiler errors. - const std::vector v1; - std::vector v2; - std::vector joined; - boost::push_back(joined, join(v1, v2)); - } - - namespace trac7376 - { - struct base_type - { - explicit base_type(boost::int32_t value) - : value(value) - { - } - - virtual boost::int32_t get() const = 0; - - boost::int32_t value; - }; - - struct derived_type1 - : base_type - { - derived_type1(boost::int32_t value) - : base_type(value) - { - } - - virtual boost::int32_t get() const - { - return value * 2; - } - }; - - struct derived_type2 - : base_type - { - derived_type2(boost::int32_t value) - : base_type(value) - { - } - - virtual boost::int32_t get() const - { - return value * 4; - } - }; - - struct apply_get - { - typedef boost::int32_t result_type; - result_type operator()(const base_type& arg) const - { - return arg.get(); - } - }; - - void test_reference_types() - { - using namespace boost::adaptors; - - typedef boost::range_detail::join_iterator< - std::vector::iterator, - std::vector::iterator, - const base_type&, - const base_type& - > join_iterator_t; - - std::vector reference_output; - - std::vector x; - for (boost::int32_t i = 0; i < 10; ++i) - { - x.push_back(derived_type1(i)); - reference_output.push_back(i * 2); - } - - std::vector y; - for (boost::int32_t i = 0; i < 10; ++i) - { - y.push_back(derived_type2(i)); - reference_output.push_back(i * 4); - } - - join_iterator_t it( - x, - y, - boost::range_detail::join_iterator_begin_tag()); - - std::vector output; - boost::push_back( - output, - boost::make_iterator_range( - join_iterator_t( - x, y, - boost::range_detail::join_iterator_begin_tag()), - join_iterator_t( - x, y, - boost::range_detail::join_iterator_end_tag())) - | transformed(apply_get())); - - BOOST_CHECK_EQUAL_COLLECTIONS( - output.begin(), output.end(), - reference_output.begin(), reference_output.end()); - } - } // namespace trac7376 - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.joined" ); - - test->add( BOOST_TEST_CASE( &boost::join_test ) ); - test->add( BOOST_TEST_CASE( &boost::test_join_iterator_reference_type_constness_ticket8483 ) ); - test->add( BOOST_TEST_CASE( &boost::trac7376::test_reference_types ) ); - - return test; -} diff --git a/libs/range/test/mfc.cpp b/libs/range/test/mfc.cpp deleted file mode 100644 index 7a13e8e9e..000000000 --- a/libs/range/test/mfc.cpp +++ /dev/null @@ -1,743 +0,0 @@ -// Boost.Range MFC Extension -// -// Copyright Shunsuke Sogame 2005-2006. -// Distributed under the 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 // must be here - -// #include - -#include -#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS -#define _ATL_NO_AUTOMATIC_NAMESPACE - -#define BOOST_LIB_NAME boost_test_exec_monitor -#include - -#define BOOST_RANGE_DETAIL_MICROSOFT_TEST -#include // can be placed first - - -#include -#include -// #include -#include -#include -#include -#include -#include - - -#include -#include -#include - -#if !(_ATL_VER < 0x0700) - #include - #include - #include -#endif - - -namespace brdm = boost::range_detail_microsoft; - - -// helpers -// - -template< class MfcMapT, class MapT > -bool test_mfc_map(MfcMapT& map, const MapT& sample) -{ - typedef typename boost::range_iterator::type iter_t; - typedef typename boost::range_const_iterator::type siter_t; - - bool result = true; - - result = result && (boost::distance(map) == boost::distance(sample)); - if (!result) - return false; - - { - for (iter_t it = boost::begin(map), last = boost::end(map); it != last; ++it) { - result = result && brdm::test_find_key_and_mapped(sample, *it); - } - } - - { - for (siter_t it = boost::begin(sample), last = boost::end(sample); it != last; ++it) { - result = result && (map[it->first] == it->second); - } - } - - return result; -} - - -template< class MfcMapT, class MapT > -bool test_mfc_cpair_map(MfcMapT& map, const MapT& sample) -{ - typedef typename boost::range_iterator::type iter_t; - typedef typename boost::range_const_iterator::type siter_t; - - bool result = true; - - result = result && (boost::distance(map) == boost::distance(sample)); - if (!result) - return false; - - { - for (iter_t it = boost::begin(map), last = boost::end(map); it != last; ++it) { - result = result && brdm::test_find_key_and_mapped(sample, std::make_pair(it->key, it->value)); - } - } - - { - for (siter_t it = boost::begin(sample), last = boost::end(sample); it != last; ++it) { - result = result && (map[it->first] == it->second); - } - } - - return result; -} - - -// arrays -// -template< class Range > -void test_CByteArray(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ::CByteArray rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_array(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class Range > -void test_CDWordArray(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ::CDWordArray rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_array(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class Range > -void test_CObArray(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ::CObArray rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter >::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter >::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_array(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class Range > -void test_CPtrArray(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ::CPtrArray rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter >::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter >::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_array(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class Range > -void test_CStringArray(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ::CStringArray rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_array(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class Range > -void test_CUIntArray(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ::CUIntArray rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_array(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class Range > -void test_CWordArray(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ::CWordArray rng_t; - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_array(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -// lists -// - -template< class Range > -void test_CObList(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ::CObList rng_t; - - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, brdm::list_iterator >::value )); -#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF) - BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator >::value )); -#else - BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator >::value )); -#endif - - rng_t rng; - BOOST_CHECK( brdm::test_init_list(rng, sample) ); - BOOST_CHECK( brdm::test_bidirectional(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class Range > -void test_CPtrList(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ::CPtrList rng_t; - - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, brdm::list_iterator >::value )); -#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF) - BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator >::value )); -#else - BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator >::value )); -#endif - - rng_t rng; - BOOST_CHECK( brdm::test_init_list(rng, sample) ); - BOOST_CHECK( brdm::test_bidirectional(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class Range > -void test_CStringList(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ::CStringList rng_t; - - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, brdm::list_iterator >::value )); -#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF) - BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator >::value )); -#else - BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator >::value )); -#endif - - rng_t rng; - BOOST_CHECK( brdm::test_init_list(rng, sample) ); - BOOST_CHECK( brdm::test_bidirectional(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -// maps -// - -template< class MapT > -void test_CMapPtrToWord(const MapT& sample) -{ - typedef ::CMapPtrToWord rng_t; - - rng_t rng; - boost::function_requires< boost::ForwardRangeConcept >(); - BOOST_CHECK( brdm::test_init_map(rng, sample) ); - BOOST_CHECK( ::test_mfc_map(rng, sample) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class MapT > -void test_CMapPtrToPtr(const MapT& sample) -{ - typedef ::CMapPtrToPtr rng_t; - - rng_t rng; - boost::function_requires< boost::ForwardRangeConcept >(); - BOOST_CHECK( brdm::test_init_map(rng, sample) ); - BOOST_CHECK( ::test_mfc_map(rng, sample) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class MapT > -void test_CMapStringToOb(const MapT& sample) -{ - typedef ::CMapStringToOb rng_t; - - rng_t rng; - boost::function_requires< boost::ForwardRangeConcept >(); - BOOST_CHECK( brdm::test_init_map(rng, sample) ); - BOOST_CHECK( ::test_mfc_map(rng, sample) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class MapT > -void test_CMapStringToPtr(const MapT& sample) -{ - typedef ::CMapStringToPtr rng_t; - - rng_t rng; - boost::function_requires< boost::ForwardRangeConcept >(); - BOOST_CHECK( brdm::test_init_map(rng, sample) ); - BOOST_CHECK( ::test_mfc_map(rng, sample) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class MapT > -void test_CMapStringToString(const MapT& sample) -{ - typedef ::CMapStringToString rng_t; - - rng_t rng; - boost::function_requires< boost::ForwardRangeConcept >(); - BOOST_CHECK( brdm::test_init_map(rng, sample) ); -#if !defined(BOOST_RANGE_MFC_NO_CPAIR) - BOOST_CHECK( ::test_mfc_cpair_map(rng, sample) ); -#endif - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class MapT > -void test_CMapWordToOb(const MapT& sample) -{ - typedef ::CMapWordToOb rng_t; - - rng_t rng; - boost::function_requires< boost::ForwardRangeConcept >(); - BOOST_CHECK( brdm::test_init_map(rng, sample) ); - BOOST_CHECK( ::test_mfc_map(rng, sample) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class MapT > -void test_CMapWordToPtr(const MapT& sample) -{ - typedef ::CMapWordToPtr rng_t; - - rng_t rng; - boost::function_requires< boost::ForwardRangeConcept >(); - BOOST_CHECK( brdm::test_init_map(rng, sample) ); - BOOST_CHECK( ::test_mfc_map(rng, sample) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -// templates -// - -template< class Range > -void test_CArray(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ::CArray rng_t; // An old MFC needs the second template argument. - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_array(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class Range > -void test_CList(const Range& sample) -{ - typedef typename boost::range_value::type val_t; - - typedef ::CList rng_t; - - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter< rng_t, brdm::list_iterator >::value )); -#if !defined(BOOST_RANGE_MFC_CONST_COL_RETURNS_NON_REF) - BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator >::value )); -#else - BOOST_STATIC_ASSERT(( brdm::test_const_iter < rng_t, brdm::list_iterator >::value )); -#endif - - rng_t rng; - BOOST_CHECK( brdm::test_init_list(rng, sample) ); - BOOST_CHECK( brdm::test_bidirectional(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -template< class MapT > -void test_CMap(const MapT& sample) -{ - typedef typename MapT::key_type k_t; - typedef typename MapT::mapped_type m_t; - - typedef ::CMap rng_t; - - rng_t rng; - boost::function_requires< boost::ForwardRangeConcept >(); - BOOST_CHECK( brdm::test_init_map(rng, sample) ); -#if !defined(BOOST_RANGE_MFC_NO_CPAIR) - BOOST_CHECK( ::test_mfc_cpair_map(rng, sample) ); -#endif - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -void test_CTypedPtrArray() -{ - typedef ::CTypedPtrArray< ::CPtrArray, int * > rng_t; - boost::function_requires< boost::RandomAccessRangeConcept >(); - - rng_t rng; - int o1, o2, o3, o4, o5; - int *data[] = { &o1, &o2, &o3, &o4, &o5 }; - BOOST_CHECK( brdm::test_init_array(rng, boost::make_iterator_range(data, data+5)) ); - - BOOST_CHECK( *(boost::begin(rng) + 2) == &o3 ); - BOOST_CHECK( *(boost::end(rng) - 1) == &o5 ); - - // BOOST_CHECK( brdm::test_random_access(rng) ); this range is not mutable - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -void test_CTypedPtrList() -{ - typedef ::CTypedPtrList< ::CObList, ::CObList * > rng_t; - boost::function_requires< boost::BidirectionalRangeConcept >(); - - rng_t rng; - - ::CObList o1, o2, o3, o4, o5; - ::CObList *data[] = { &o1, &o2, &o3, &o4, &o5 }; - BOOST_CHECK( brdm::test_init_list(rng, data) ); - - boost::range_iterator::type it = boost::begin(rng); - std::advance(it, 1); - BOOST_CHECK( *it == &o2 ); - std::advance(it, 2); - BOOST_CHECK( *it == &o4 ); - - // BOOST_CHECK( brdm::test_bidirectional(rng) ); this range is not mutable - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -void test_CTypedPtrMap() -{ - typedef ::CTypedPtrMap< ::CMapStringToPtr, ::CString, int *> rng_t; - boost::function_requires< boost::ForwardRangeConcept >(); - - rng_t rng; - ::CString o0(_T('a')), o1(_T('c')), o2(_T('f')), o3(_T('q')), o4(_T('g')); - int d0, d1, d2, d3, d4; - std::map< ::CString, int * > data; - data[o0] = &d0, data[o1] = &d1, data[o2] = &d2, data[o3] = &d3, data[o4] = &d4; - - BOOST_CHECK( brdm::test_init_map(rng, data) ); - BOOST_CHECK( ::test_mfc_map(rng, data) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); -} - - -// strings -// -#if defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING) - - template< class Range > - void test_CString(const Range& sample) - { - typedef typename boost::range_value::type val_t; - - typedef ::CString rng_t; // An old MFC needs the second template argument. - BOOST_STATIC_ASSERT(( brdm::test_mutable_iter::value )); - BOOST_STATIC_ASSERT(( brdm::test_const_iter ::value )); - - rng_t rng; - BOOST_CHECK( brdm::test_init_string(rng, sample) ); - BOOST_CHECK( brdm::test_random_access(rng) ); - BOOST_CHECK( brdm::test_emptiness(rng) ); - } - -#endif - - -struct CPerson -{ - void hello_range() { }; -}; - - -void test_mfc() -{ -#if 0 - // overview - // - { - CTypedPtrArray *> myArray; - // ... - BOOST_FOREACH (CList *theList, myArray) - { - BOOST_FOREACH (CString& str, *theList) - { - boost::to_upper(str); - std::sort(boost::begin(str), boost::end(str)); - // ... - } - } - } -#endif - - // arrays - // - { - BYTE data[] = { 4,5,1,3,5,12,3,1,3,1,6,1,3,60,1,1,5,1,3,1,10 }; - - ::test_CByteArray(boost::make_iterator_range(data, data+22)); - } - - { - DWORD data[] = { 4,5,1,3,5,12,3,1,3,1,6,1,3,60,1,1,5,1,3,1,10 }; - - test_CDWordArray(boost::make_iterator_range(data, data+22)); - } - - { - ::CObArray o1, o2, o3, o4, o5; - ::CObject *data[] = { &o1, &o2, &o3, &o4, &o5 }; - - ::test_CObArray(boost::make_iterator_range(data, data+5)); - } - - { - ::CPtrArray o1, o2, o3, o4, o5; - void *data[] = { &o1, &o2, &o3, &o4, &o5 }; - - ::test_CPtrArray(boost::make_iterator_range(data, data+5)); - } - - { - ::CString data[] = { - ::CString(_T('0')), ::CString(_T('1')), ::CString(_T('2')), ::CString(_T('3')), - ::CString(_T('4')), ::CString(_T('5')), ::CString(_T('6')), ::CString(_T('7')) - }; - - ::test_CStringArray(boost::make_iterator_range(data, data+8)); - } - - { - ::CUIntArray rng; - UINT data[] = { 4,5,1,3,5,12,3,1,3,1,6,1,3,60,1,1,5,1,3,1,10 }; - - ::test_CUIntArray(boost::make_iterator_range(data, data+22)); - } - - { - ::CWordArray rng; - WORD data[] = { 4,5,1,3,5,12,3,1,3,1,6,1,3,60,1,1,5,1,3,1,10 }; - - ::test_CWordArray(boost::make_iterator_range(data, data+22)); - } - - - // lists - // - { - ::CObList rng; - ::CObList o1, o2, o3, o4, o5; - ::CObject *data[] = { &o1, &o2, &o3, &o4, &o5 }; - - ::test_CObList(boost::make_iterator_range(data, data+5)); - } - - { - ::CPtrList rng; - ::CPtrList o1, o2, o3, o4, o5; - void *data[] = { &o1, &o2, &o3, &o4, &o5 }; - - ::test_CPtrList(boost::make_iterator_range(data, data+5)); - } - - { - ::CString data[] = { - ::CString(_T('0')), ::CString(_T('1')), ::CString(_T('2')), ::CString(_T('3')), - ::CString(_T('4')), ::CString(_T('5')), ::CString(_T('6')), ::CString(_T('7')) - }; - - ::test_CStringList(boost::make_iterator_range(data, data+8)); - } - - - // maps - // - { - std::map data; - int o0, o1, o2, o3, o4; - data[&o0] = 15, data[&o1] = 14, data[&o2] = 3, data[&o3] = 6, data[&o4] = 1; - - ::test_CMapPtrToWord(data); - } - - { - std::map data; - int o0, o1, o2, o3, o4; - data[&o0] = &o3, data[&o1] = &o2, data[&o2] = &o1, data[&o3] = &o0, data[&o4] = &o4; - - ::test_CMapPtrToPtr(data); - } - - { - std::map< ::CString, CObject * > data; - CObArray o0, o1, o2, o3, o4; - data[ ::CString('0') ] = &o0, data[ ::CString('1') ] = &o1, data[ ::CString('2') ] = &o2, - data[ ::CString('3') ] = &o3, data[ ::CString('4') ] = &o4; - - ::test_CMapStringToOb(data); - } - - { - std::map< ::CString, void * > data; - CObArray o0, o1, o2, o3, o4; - data[ ::CString('0') ] = &o0, data[ ::CString('1') ] = &o1, data[ ::CString('2') ] = &o2, - data[ ::CString('3') ] = &o3, data[ ::CString('4') ] = &o4; - - ::test_CMapStringToPtr(data); - } - - { - std::map< ::CString, ::CString > data; - CString o0('a'), o1('b'), o2('c'), o3('d'), o4('e'); - data[ ::CString('0') ] = o0, data[ ::CString('1') ] = o1, data[ ::CString('2') ] = o2, - data[ ::CString('3') ] = o3, data[ ::CString('4') ] = o4; - - ::test_CMapStringToString(data); - } - - { - std::map< WORD, CObject * > data; - ::CDWordArray o0, o1, o2, o3, o4; - data[21] = &o3, data[52] = &o2, data[12] = &o1, data[76] = &o0, data[54] = &o4; - - ::test_CMapWordToOb(data); - } - - { - std::map< WORD, void * > data; - ::CDWordArray o0, o1, o2, o3, o4; - data[21] = &o3, data[52] = &o2, data[12] = &o1, data[76] = &o0, data[54] = &o4; - - ::test_CMapWordToPtr(data); - } - - // templates - // - { - std::string data("0987654321qwertyuiop"); - ::test_CArray(data); - ::test_CList(data); - } - - { - std::wstring data(L"asdfghjklzxcvbnm"); - ::test_CArray(data); - ::test_CList(data); - } - - { - std::map< int, std::string > data; - data[0] = "abcde", data[1] = "ajfie", data[2] = "lij", data[3] = "abc", data[4] = "ioiu"; - - ::test_CMap(data); - } - - - // typed - // - { - ::test_CTypedPtrArray(); - ::test_CTypedPtrList(); - ::test_CTypedPtrMap(); - } - - - // strings - // -#if defined(BOOST_RANGE_MFC_HAS_LEGACY_STRING) - { - std::string data("123456789 abcdefghijklmn"); - ::test_CString(data); - } -#endif - - -} // test_mfc - - -#include -using boost::unit_test::test_suite; - - -test_suite * -init_unit_test_suite(int argc, char* argv[]) -{ - test_suite *test = BOOST_TEST_SUITE("MFC Range Test Suite"); - test->add(BOOST_TEST_CASE(&test_mfc)); - - (void)argc, (void)argv; // unused - return test; -} diff --git a/libs/range/test/mutable_iterator.cpp b/libs/range/test/mutable_iterator.cpp deleted file mode 100644 index 40a38791d..000000000 --- a/libs/range/test/mutable_iterator.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_mutable_iterator() -{ - typedef std::vector cont; - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::iterator, - boost::range_mutable_iterator::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::iterator, - boost::range_mutable_iterator::type - >::value)); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::iterator, - boost::range_mutable_iterator::type - >::value)); -#endif -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range range_mutable_iterator meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_mutable_iterator)); - - return test; -} diff --git a/libs/range/test/partial_workaround.cpp b/libs/range/test/partial_workaround.cpp deleted file mode 100644 index edaae71e7..000000000 --- a/libs/range/test/partial_workaround.cpp +++ /dev/null @@ -1,114 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -//#define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION 1 - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -using namespace boost; -using namespace std; - -void check_partial_workaround() -{ - using namespace range_detail; - using type_traits::yes_type; - using type_traits::no_type; - - ////////////////////////////////////////////////////////////////////// - // string - ////////////////////////////////////////////////////////////////////// - char* c_ptr; - const char* cc_ptr; - wchar_t* w_ptr; - const wchar_t* cw_ptr; - - BOOST_STATIC_ASSERT( sizeof( yes_type ) == sizeof( is_string_impl( c_ptr ) ) ); - BOOST_STATIC_ASSERT( sizeof( yes_type ) == sizeof( is_string_impl( cc_ptr ) ) ); - BOOST_STATIC_ASSERT( sizeof( yes_type ) == sizeof( is_string_impl( w_ptr ) ) ); - BOOST_STATIC_ASSERT( sizeof( yes_type ) == sizeof( is_string_impl( cw_ptr ) ) ); - - BOOST_STATIC_ASSERT( sizeof( yes_type ) == sizeof( is_char_ptr_impl( c_ptr ) ) ); - BOOST_STATIC_ASSERT( sizeof( no_type ) == sizeof( is_char_ptr_impl( cc_ptr ) ) ); - - BOOST_STATIC_ASSERT( sizeof( yes_type ) == sizeof( is_wchar_t_ptr_impl( w_ptr ) ) ); - BOOST_STATIC_ASSERT( sizeof( no_type ) == sizeof( is_wchar_t_ptr_impl( cw_ptr ) ) ); - - BOOST_STATIC_ASSERT( sizeof( yes_type ) == sizeof( is_const_char_ptr_impl( c_ptr ) ) ); - BOOST_STATIC_ASSERT( sizeof( yes_type ) == sizeof( is_const_char_ptr_impl( cc_ptr ) ) ); - - BOOST_STATIC_ASSERT( sizeof( yes_type ) == sizeof( is_const_wchar_t_ptr_impl( w_ptr ) ) ); - BOOST_STATIC_ASSERT( sizeof( yes_type ) == sizeof( is_const_wchar_t_ptr_impl( cw_ptr ) ) ); - - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_detail::std_container_, - boost::range_detail::range< vector >::type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_detail::std_pair_, - boost::range_detail::range< pair >::type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_detail::array_, - boost::range_detail::range< int[42] >::type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_detail::char_ptr_, - boost::range_detail::range< char* >::type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_detail::const_char_ptr_, - boost::range_detail::range< const char* >::type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_detail::wchar_t_ptr_, - boost::range_detail::range< wchar_t* >::type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_detail::const_wchar_t_ptr_, - boost::range_detail::range< const wchar_t* >::type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_detail::std_container_, - boost::range_detail::range< vector >::type >::value )); - -} - -#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - -void check_partial_workaround() -{ - // - // test if warnings are generated - // - std::size_t s = boost::range_detail::array_size( "foo" ); - BOOST_CHECK_EQUAL( s, 4u ); -} - -#endif - -#include -using boost::unit_test::test_suite; - -test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add( BOOST_TEST_CASE( &check_partial_workaround ) ); - - return test; -} diff --git a/libs/range/test/pointer.cpp b/libs/range/test/pointer.cpp deleted file mode 100644 index 94e78f3d3..000000000 --- a/libs/range/test/pointer.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_pointer() -{ - typedef std::vector cont; - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::pointer, - boost::range_pointer::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::const_pointer, - boost::range_pointer::type - >::value)); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::pointer, - boost::range_pointer::type - >::value)); -#endif -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range range_pointer meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_pointer)); - - return test; -} diff --git a/libs/range/test/pointer_as_iterator.cpp b/libs/range/test/pointer_as_iterator.cpp deleted file mode 100644 index e0e28d065..000000000 --- a/libs/range/test/pointer_as_iterator.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - void test_pointer_as_iterator() - { - boost::array arr; - boost::iterator_range r(arr.begin(), arr.end()); - r[0]; - } -} // anonymous namespace - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.pointer_as_iterator" ); - - test->add(BOOST_TEST_CASE( &test_pointer_as_iterator )); - - return test; -} diff --git a/libs/range/test/reference.cpp b/libs/range/test/reference.cpp deleted file mode 100644 index 755be0ea0..000000000 --- a/libs/range/test/reference.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_reference() -{ - typedef std::vector cont; - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::reference, - boost::range_reference::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::const_reference, - boost::range_reference::type - >::value)); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::reference, - boost::range_reference::type - >::value)); -#endif -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range range_reference meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_reference)); - - return test; -} diff --git a/libs/range/test/result_iterator.cpp b/libs/range/test/result_iterator.cpp deleted file mode 100644 index 88dd7a51a..000000000 --- a/libs/range/test/result_iterator.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_result_iterator() -{ - typedef std::vector cont; - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::iterator, - boost::range_result_iterator::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::const_iterator, - boost::range_result_iterator::type - >::value)); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::iterator, - boost::range_result_iterator::type - >::value)); -#endif -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range range_result_iterator meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_result_iterator)); - - return test; -} diff --git a/libs/range/test/reverse_iterator.cpp b/libs/range/test/reverse_iterator.cpp deleted file mode 100644 index 827f244d7..000000000 --- a/libs/range/test/reverse_iterator.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_reverse_iterator() -{ - typedef std::vector cont; - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::reverse_iterator, - boost::range_reverse_iterator::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::reverse_iterator, - boost::range_reverse_iterator::type - >::value)); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::reverse_iterator, - boost::range_reverse_iterator::type - >::value)); -#endif -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range range_reverse_iterator meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_reverse_iterator)); - - return test; -} diff --git a/libs/range/test/reverse_result_iterator.cpp b/libs/range/test/reverse_result_iterator.cpp deleted file mode 100644 index 7d160fe1c..000000000 --- a/libs/range/test/reverse_result_iterator.cpp +++ /dev/null @@ -1,62 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_reverse_result_iterator() -{ - typedef std::vector cont; - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::reverse_iterator, - boost::range_reverse_result_iterator::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::reverse_iterator, - boost::range_reverse_result_iterator::type - >::value)); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - boost::reverse_iterator, - boost::range_reverse_result_iterator::type - >::value)); -#endif -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE( - "Boost.Range range_reverse_result_iterator meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_reverse_result_iterator)); - - return test; -} diff --git a/libs/range/test/reversible_range.cpp b/libs/range/test/reversible_range.cpp deleted file mode 100644 index a3dd20c77..000000000 --- a/libs/range/test/reversible_range.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void check_iterator() -{ - typedef std::vector vec_t; - typedef vec_t::iterator iterator; - typedef std::pair pair_t; - typedef boost::range_reverse_iterator::type rev_iterator; - typedef std::pair rev_pair_t; - - vec_t vec; - pair_t p = std::make_pair( vec.begin(), vec.end() ); - rev_pair_t rp = std::make_pair( boost::rbegin( p ), boost::rend( p ) ); - int a[] = {1,2,3,4,5,6,7,8,9,10}; - const int ca[] = {1,2,3,4,5,6,7,8,9,10,11,12}; - BOOST_CHECK( boost::rbegin( vec ) == boost::range_reverse_iterator::type( vec.end() ) ); - BOOST_CHECK( boost::rend( vec ) == boost::range_reverse_iterator::type( vec.begin() ) ); - BOOST_CHECK( std::distance( boost::rbegin( vec ), boost::rend( vec ) ) == std::distance( boost::begin( vec ), boost::end( vec ) ) ); - - BOOST_CHECK( boost::rbegin( p ) == boost::begin( rp ) ); - BOOST_CHECK( boost::rend( p ) == boost::end( rp ) ); - BOOST_CHECK( std::distance( boost::rbegin( p ), boost::rend( p ) ) == std::distance( boost::begin( rp ), boost::end( rp ) ) ); - BOOST_CHECK( std::distance( boost::begin( p ), boost::end( p ) ) == std::distance( boost::rbegin( rp ), boost::rend( rp ) ) ); - - - BOOST_CHECK_EQUAL( &*boost::begin( a ), &*( boost::rend( a ) - 1 ) ); - BOOST_CHECK_EQUAL( &*( boost::end( a ) - 1 ), &*boost::rbegin( a ) ); - BOOST_CHECK_EQUAL( &*boost::begin( ca ), &*( boost::rend( ca ) - 1 ) ); - BOOST_CHECK_EQUAL( &*( boost::end( ca ) - 1 ), &*boost::rbegin( ca ) ); -} - - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add( BOOST_TEST_CASE( &check_iterator ) ); - - return test; -} - - - - - - - diff --git a/libs/range/test/size_type.cpp b/libs/range/test/size_type.cpp deleted file mode 100644 index 9c335f14b..000000000 --- a/libs/range/test/size_type.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_size() -{ - typedef std::vector cont; - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::size_type, - boost::range_size::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::size_type, - boost::range_size::type - >::value)); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::size_type, - boost::range_size::type - >::value)); -#endif -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range range_size meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_size)); - - return test; -} diff --git a/libs/range/test/std_container.cpp b/libs/range/test/std_container.cpp deleted file mode 100644 index 75a584f6e..000000000 --- a/libs/range/test/std_container.cpp +++ /dev/null @@ -1,74 +0,0 @@ - // Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include -#include -#include -#include -#include -#include - -void check_std_container() -{ - typedef std::vector vec_t; - vec_t vec; - vec.push_back( 3 ); vec.push_back( 4 ); - const vec_t cvec( vec ); - - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_value::type, vec_t::value_type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator::type, vec_t::iterator >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator::type, vec_t::const_iterator >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_difference::type, vec_t::difference_type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_size::type, vec_t::size_type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator::type, vec_t::iterator >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_iterator::type, vec_t::const_iterator >::value )); - - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_value::type, vec_t::value_type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_difference::type, vec_t::difference_type >::value )); - BOOST_STATIC_ASSERT(( boost::is_same< boost::range_size::type, vec_t::size_type >::value )); - - BOOST_CHECK( boost::begin( vec ) == vec.begin() ); - BOOST_CHECK( boost::end( vec ) == vec.end() ); - BOOST_CHECK( boost::empty( vec ) == vec.empty() ); - BOOST_CHECK( static_cast(boost::size( vec )) == vec.size() ); - - BOOST_CHECK( boost::begin( cvec ) == cvec.begin() ); - BOOST_CHECK( boost::end( cvec ) == cvec.end() ); - BOOST_CHECK( boost::empty( cvec ) == cvec.empty() ); - BOOST_CHECK( static_cast(boost::size( cvec )) == cvec.size() ); - -} - - -#include - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add( BOOST_TEST_CASE( &check_std_container ) ); - - return test; -} - - - - - - diff --git a/libs/range/test/string.cpp b/libs/range/test/string.cpp deleted file mode 100644 index 9ff13f92e..000000000 --- a/libs/range/test/string.cpp +++ /dev/null @@ -1,280 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -//#define _MSL_USING_NAMESPACE 1 - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace -{ - template< class CharT, std::size_t Length > - class test_string - { - public: - typedef CharT value_type; - typedef value_type* pointer; - typedef const value_type* const_pointer; - typedef std::size_t size_type; - typedef value_type array_t[Length]; - typedef const value_type const_array_t[Length]; - - explicit test_string(const CharT literal_sz[]) - { - std::copy(literal_sz, literal_sz + Length, m_buffer.data()); - m_buffer[Length] = value_type(); - } - - const_pointer const_sz() const { return m_buffer.data(); } - pointer mutable_sz() { return m_buffer.data(); } - - private: - typedef boost::array buffer_t; - buffer_t m_buffer; - }; -} - -template< class T > -inline BOOST_DEDUCED_TYPENAME boost::range_iterator::type -str_begin( T& r ) -{ - return boost::begin( boost::as_literal(r) ); -} - -template< class T > -inline BOOST_DEDUCED_TYPENAME boost::range_iterator::type -str_end( T& r ) -{ - return boost::end( boost::as_literal(r) ); -} - -template< class T > -inline BOOST_DEDUCED_TYPENAME boost::range_difference::type -str_size( const T& r ) -{ - return boost::size( boost::as_literal(r) ); -} - -template< class T > -inline bool -str_empty( T& r ) -{ - return boost::empty( boost::as_literal(r) ); -} - -template< typename Container, typename T > -BOOST_DEDUCED_TYPENAME boost::range_iterator::type -find( Container& c, T value ) -{ - return std::find( str_begin(c), str_end(c), - value ); -} - -template< typename Container, typename T > -BOOST_DEDUCED_TYPENAME boost::range_iterator::type -find( const Container& c, T value ) -{ - return std::find( str_begin(c), str_end(c), - value ); -} - -template< typename Container, typename T > -BOOST_DEDUCED_TYPENAME boost::range_iterator::type -find_mutable( Container& c, T value ) -{ - str_size( c ); - return std::find( str_begin(c), str_end(c), - value ); -} - -template< typename Container, typename T > -BOOST_DEDUCED_TYPENAME boost::range_iterator::type -find_const( const Container& c, T value ) -{ - str_size( c ); - return std::find( str_begin(c), str_end(c), - value ); -} - - -std::vector -check_rvalue_return() -{ - return std::vector( 10, 'm' ); -} - -using namespace boost; - - -void check_char() -{ - typedef boost::range_difference::type diff_t; - typedef char* char_iterator_t; - typedef char char_array_t[10]; - - test_string a_string("a string"); - test_string another_string("another string"); - - const char* char_s = a_string.const_sz(); - char my_string[] = "another_string"; - const char my_const_string[] = "another string"; - const diff_t my_string_length = 14; - char* char_s2 = a_string.mutable_sz(); - - BOOST_STATIC_ASSERT(( is_same< range_value::type, - detail::iterator_traits::value_type>::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, char_iterator_t >::value )); - - BOOST_STATIC_ASSERT(( is_same< range_difference::type, - ::std::ptrdiff_t >::value )); - BOOST_STATIC_ASSERT(( is_same< range_size::type, std::size_t >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, char_iterator_t >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, const char* >::value )); - - BOOST_STATIC_ASSERT(( is_same< range_value::type, - char>::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, char* >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, const char* >::value )); - BOOST_STATIC_ASSERT(( is_same< range_difference::type, - ::std::ptrdiff_t >::value )); - BOOST_STATIC_ASSERT(( is_same< range_size::type, std::size_t >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, char* >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, const char* >::value )); - - BOOST_CHECK_EQUAL( str_begin( char_s ), char_s ); - const diff_t sz = str_size(char_s); - const char* str_end1 = str_begin( char_s ) + sz; - BOOST_CHECK_EQUAL( str_end( char_s ), str_end1 ); - BOOST_CHECK_EQUAL( str_empty( char_s ), (char_s == 0 || char_s[0] == char()) ); - BOOST_CHECK_EQUAL( sz, static_cast(std::char_traits::length(char_s)) ); - - BOOST_CHECK_EQUAL( str_begin( my_string ), my_string ); - range_iterator::type str_end2 = str_begin( my_string ) + str_size(my_string); - range_iterator::type str_end3 = str_end(my_string); - BOOST_CHECK_EQUAL( str_end3, str_end2 ); - BOOST_CHECK_EQUAL( str_empty( my_string ), (my_string == 0 || my_string[0] == char()) ); - BOOST_CHECK_EQUAL( str_size( my_string ), my_string_length ); - BOOST_CHECK_EQUAL( str_size( my_string ), static_cast(std::char_traits::length(my_string)) ); - - char to_search = 'n'; - BOOST_CHECK( find_mutable( char_s, to_search ) != str_end( char_s ) ); - BOOST_CHECK( find_const( char_s, to_search ) != str_end(char_s) ); - - BOOST_CHECK( find_mutable( my_string, to_search ) != str_end(my_string) ); - BOOST_CHECK( find_const( my_string, to_search ) != str_end(my_string) ); - - BOOST_CHECK( find_mutable( char_s2, to_search ) != str_end(char_s) ); - BOOST_CHECK( find_const( char_s2, to_search ) != str_end(char_s2) ); - - BOOST_CHECK( find_const( as_array( my_string ), to_search ) != str_end(my_string) ); - BOOST_CHECK( find_const( as_array( my_const_string ), to_search ) != str_end(my_string) ); - - // - // Test that as_literal() always scan for null terminator - // - char an_array[] = "foo\0bar"; - BOOST_CHECK_EQUAL( str_begin( an_array ), an_array ); - BOOST_CHECK_EQUAL( str_end( an_array ), an_array + 3 ); - BOOST_CHECK_EQUAL( str_size( an_array ), 3 ); - - const char a_const_array[] = "foobar\0doh"; - BOOST_CHECK_EQUAL( str_begin( a_const_array ), a_const_array ); - BOOST_CHECK_EQUAL( str_end( a_const_array ), a_const_array + 6 ); - BOOST_CHECK_EQUAL( str_size( a_const_array ), 6 ); - -} - - - -void check_string() -{ - check_char(); - -#ifndef BOOST_NO_STD_WSTRING - typedef wchar_t* wchar_iterator_t; - - test_string a_wide_string(L"a wide string"); - test_string another_wide_string(L"another wide string"); - - const wchar_t* char_ws = a_wide_string.const_sz(); - wchar_t my_wstring[] = L"another wide string"; - wchar_t* char_ws2 = a_wide_string.mutable_sz(); - - BOOST_STATIC_ASSERT(( is_same< range_value::type, - detail::iterator_traits::value_type>::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, wchar_iterator_t >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, const wchar_t* >::value )); - BOOST_STATIC_ASSERT(( is_same< range_difference::type, - detail::iterator_traits::difference_type >::value )); - BOOST_STATIC_ASSERT(( is_same< range_size::type, std::size_t >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, wchar_iterator_t >::value )); - BOOST_STATIC_ASSERT(( is_same< range_iterator::type, const wchar_t* >::value )); - - typedef boost::range_difference::type diff_t; - const diff_t sz = str_size( char_ws ); - BOOST_CHECK_EQUAL( str_begin( char_ws ), char_ws ); - BOOST_CHECK_EQUAL( str_end(char_ws), (str_begin( char_ws ) + sz) ); - BOOST_CHECK_EQUAL( str_empty( char_ws ), (char_ws == 0 || char_ws[0] == wchar_t()) ); - BOOST_CHECK_EQUAL( sz, static_cast(std::char_traits::length(char_ws)) ); - - wchar_t to_search = L'n'; - BOOST_CHECK( find( char_ws, to_search ) != str_end(char_ws) ); - BOOST_CHECK( find( char_ws2, to_search ) != str_end(char_ws2) ); - -#if BOOST_WORKAROUND(_MSC_VER, BOOST_TESTED_AT(1300)) - - BOOST_CHECK( find( my_wstring, to_search ) != str_end(my_wstring) ); - -#else - - boost::ignore_unused_variable_warning( my_wstring ); - -#endif -#endif - - find( check_rvalue_return(), 'n' ); - -} - -#include -using boost::unit_test::test_suite; - - -test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - test_suite* test = BOOST_TEST_SUITE( "Range Test Suite" ); - - test->add( BOOST_TEST_CASE( &check_string ) ); - - return test; -} - - - - - - diff --git a/libs/range/test/sub_range.cpp b/libs/range/test/sub_range.cpp deleted file mode 100644 index a6dbb36b7..000000000 --- a/libs/range/test/sub_range.cpp +++ /dev/null @@ -1,289 +0,0 @@ -// Boost.Range library -// -// Copyright Thorsten Ottosen 2003-2004. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - - -#include - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# pragma warn -8091 // suppress warning in Boost.Test -# pragma warn -8057 // unused argument argc/argv in Boost.Test -#endif - -#include -#include -#include -#include -#include -#include -#include - -namespace boost_range_test -{ - namespace - { - -void check_sub_range() -{ - - typedef std::string::iterator iterator; - typedef std::string::const_iterator const_iterator; - typedef boost::iterator_range irange; - typedef boost::iterator_range cirange; - std::string str = "hello world"; - const std::string cstr = "const world"; - irange r = boost::make_iterator_range( str ); - r = boost::make_iterator_range( str.begin(), str.end() ); - cirange r2 = boost::make_iterator_range( cstr ); - r2 = boost::make_iterator_range( cstr.begin(), cstr.end() ); - r2 = boost::make_iterator_range( str ); - - typedef boost::sub_range srange; - typedef boost::sub_range csrange; - srange s = r; - BOOST_CHECK( r == r ); - BOOST_CHECK( s == r ); - s = boost::make_iterator_range( str ); - csrange s2 = r; - s2 = r2; - s2 = boost::make_iterator_range( cstr ); - BOOST_CHECK( r2 == r2 ); - BOOST_CHECK( s2 != r2 ); - s2 = boost::make_iterator_range( str ); - BOOST_CHECK( !(s != s) ); - - BOOST_CHECK( r.begin() == s.begin() ); - BOOST_CHECK( r2.begin()== s2.begin() ); - BOOST_CHECK( r.end() == s.end() ); - BOOST_CHECK( r2.end() == s2.end() ); - BOOST_CHECK_EQUAL( r.size(), s.size() ); - BOOST_CHECK_EQUAL( r2.size(), s2.size() ); - -//#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -// if( !(bool)r ) -// BOOST_CHECK( false ); -// if( !(bool)r2 ) -// BOOST_CHECK( false ); -// if( !(bool)s ) -// BOOST_CHECK( false ); -// if( !(bool)s2 ) -// BOOST_CHECK( false ); -//#else - if( !r ) - BOOST_CHECK( false ); - if( !r2 ) - BOOST_CHECK( false ); - if( !s ) - BOOST_CHECK( false ); - if( !s2 ) - BOOST_CHECK( false ); -//#endif - - std::cout << r << r2 << s << s2; - - std::string res = boost::copy_range( r ); - BOOST_CHECK_EQUAL_COLLECTIONS( res.begin(), res.end(), r.begin(), r.end() ); - - r.empty(); - s.empty(); - r.size(); - s.size(); - - // - // As of range v2 not legal anymore. - // - //irange singular_irange; - //BOOST_CHECK( singular_irange.empty() ); - //BOOST_CHECK( singular_irange.size() == 0 ); - // - //srange singular_srange; - //BOOST_CHECK( singular_srange.empty() ); - //BOOST_CHECK( singular_srange.size() == 0 ); - // - //BOOST_CHECK( empty( singular_irange ) ); - //BOOST_CHECK( empty( singular_srange ) ); - // - - srange rr = boost::make_iterator_range( str ); - BOOST_CHECK( rr.equal( r ) ); - - rr = boost::make_iterator_range( str.begin(), str.begin() + 5 ); - BOOST_CHECK( rr == boost::as_literal("hello") ); - BOOST_CHECK( rr != boost::as_literal("hell") ); - BOOST_CHECK( rr < boost::as_literal("hello dude") ); - BOOST_CHECK( boost::as_literal("hello") == rr ); - BOOST_CHECK( boost::as_literal("hell") != rr ); - BOOST_CHECK( ! (boost::as_literal("hello dude") < rr ) ); - - irange rrr = rr; - BOOST_CHECK( rrr == rr ); - BOOST_CHECK( !( rrr != rr ) ); - BOOST_CHECK( !( rrr < rr ) ); - - const irange cr = boost::make_iterator_range( str ); - BOOST_CHECK_EQUAL( cr.front(), 'h' ); - BOOST_CHECK_EQUAL( cr.back(), 'd' ); - BOOST_CHECK_EQUAL( cr[1], 'e' ); - BOOST_CHECK_EQUAL( cr(1), 'e' ); - - rrr = boost::make_iterator_range( str, 1, -1 ); - BOOST_CHECK( rrr == boost::as_literal("ello worl") ); - rrr = boost::make_iterator_range( rrr, -1, 1 ); - BOOST_CHECK( rrr == str ); - rrr.front() = 'H'; - rrr.back() = 'D'; - rrr[1] = 'E'; - BOOST_CHECK( rrr == boost::as_literal("HEllo worlD") ); -} - -template -void check_mutable_type(T&) -{ - BOOST_STATIC_ASSERT(!boost::is_const::value); -} - -template -void check_constant_type(T&) -{ - BOOST_STATIC_ASSERT(boost::is_const::value); -} - -template -void check_is_const_iterator(Iterator it) -{ - BOOST_STATIC_ASSERT(( - boost::is_same< - BOOST_DEDUCED_TYPENAME boost::range_iterator< - BOOST_DEDUCED_TYPENAME boost::add_const::type - >::type, - Iterator - >::value)); -} - -template -void check_is_iterator(Iterator it) -{ - BOOST_STATIC_ASSERT(( - boost::is_same< - BOOST_DEDUCED_TYPENAME boost::range_iterator< - BOOST_DEDUCED_TYPENAME boost::remove_const::type - >::type, - Iterator - >::value)); -} - -void const_propagation_mutable_collection(void) -{ - typedef std::vector coll_t; - typedef boost::sub_range sub_range_t; - - coll_t c; - c.push_back(0); - - sub_range_t rng(c); - const sub_range_t crng(c); - - check_is_iterator(rng.begin()); - check_is_iterator(rng.end()); - - check_is_const_iterator(crng.begin()); - check_is_const_iterator(crng.end()); - - check_mutable_type(rng[0]); - check_mutable_type(rng.front()); - check_mutable_type(rng.back()); - check_constant_type(crng[0]); - check_constant_type(crng.front()); - check_constant_type(crng.back()); -} - -void const_propagation_const_collection(void) -{ - typedef std::vector coll_t; - typedef boost::sub_range sub_range_t; - - coll_t c; - c.push_back(0); - - sub_range_t rng(c); - const sub_range_t crng(c); - - check_is_const_iterator(rng.begin()); - check_is_const_iterator(rng.end()); - - check_is_const_iterator(crng.begin()); - check_is_const_iterator(crng.end()); - - check_constant_type(rng[0]); - check_constant_type(rng.front()); - check_constant_type(rng.back()); - check_constant_type(crng[0]); - check_constant_type(crng.front()); - check_constant_type(crng.back()); -} - -inline void test_advance() -{ - std::vector l; - l.push_back(1); - l.push_back(2); - typedef boost::sub_range > rng_t; - rng_t r1(l.begin(), l.end()); - BOOST_CHECK(r1.advance_begin(1).advance_end(-1).empty()); - - rng_t r2(l.begin(), l.end()); - BOOST_CHECK_EQUAL(r2.advance_begin(1).size(), 1u); - - rng_t r3(l.begin(), l.end()); - BOOST_CHECK_EQUAL(r3.advance_end(-1).size(), 1u); -} - -void ticket_10514() -{ - typedef std::vector vec_t; - typedef boost::sub_range range_t; - vec_t v(10); - range_t r(v.begin(), v.end()); - const range_t& cr = r; - range_t copy_r = cr; - - BOOST_CHECK(r.begin() == copy_r.begin()); - BOOST_CHECK(r.end() == copy_r.end()); - - BOOST_CHECK(cr.begin() == copy_r.begin()); - BOOST_CHECK(cr.end() == copy_r.end()); -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite(int, char*[]) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE( "Boost.Range sub_range test suite" ); - - test->add(BOOST_TEST_CASE(&boost_range_test::check_sub_range)); - - test->add(BOOST_TEST_CASE( - &boost_range_test::const_propagation_const_collection)); - - test->add(BOOST_TEST_CASE( - &boost_range_test::const_propagation_mutable_collection)); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_advance)); - - test->add(BOOST_TEST_CASE(&boost_range_test::ticket_10514)); - - return test; -} - - - - - diff --git a/libs/range/test/test_driver/range_overload_test_driver.hpp b/libs/range/test/test_driver/range_overload_test_driver.hpp deleted file mode 100644 index e4b2ce787..000000000 --- a/libs/range/test/test_driver/range_overload_test_driver.hpp +++ /dev/null @@ -1,74 +0,0 @@ - // Copyright Neil Groves 2013. 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) - // - // - // For more information, see http://www.boost.org/libs/range/ - // - // Acknowledgments: - // Implemented by Andy in response to Ticket 6888 - unique fix - // - #ifndef BOOST_RANGE_TEST_TEST_DRIVER_RANGE_OVERLOAD_TEST_DRIVER_HPP_INCLUDED - #define BOOST_RANGE_TEST_TEST_DRIVER_RANGE_OVERLOAD_TEST_DRIVER_HPP_INCLUDED - - #include "range_return_test_driver.hpp" - #include - #include - #include - - namespace boost - { - namespace range_test - { - - // A test driver to exercise a test through range_return_test_driver - // plus the overload that determines the return_type by overload - // - // The test driver also contains the code required to check the - // return value correctness. - // - // The TestPolicy needs to implement all those required by - // range_return_test_driver, and additionally - // - // - perform the boost range version of the algorithm that determines - // the return_type by overload - class range_overload_test_driver : range_return_test_driver - { - public: - template< class Container, - class TestPolicy > - void operator()(Container& cont, TestPolicy policy) - { - range_return_test_driver::operator()(cont, policy); - test_range_overload()(cont, policy); - } - - private: - template< class Container, class TestPolicy > - struct test_range_overload - { - void operator()(Container& cont, TestPolicy policy) - { - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator_t; - typedef BOOST_DEDUCED_TYPENAME TestPolicy::template test_range_overload test_range_overload_t; - const range_return_value result_type = test_range_overload_t::result_type; - typedef BOOST_DEDUCED_TYPENAME range_return::type range_return_t; - - Container reference(cont); - Container test_cont(cont); - - test_range_overload_t test_range_overload_fn; - range_return_t range_result = test_range_overload_fn(policy, test_cont); - - iterator_t reference_it = policy.reference(reference); - - check_results::test(test_cont, reference, - range_result, reference_it); - } - }; - }; - } - } - - #endif // include guard \ No newline at end of file diff --git a/libs/range/test/test_driver/range_return_test_driver.hpp b/libs/range/test/test_driver/range_return_test_driver.hpp deleted file mode 100644 index 3dfd2a241..000000000 --- a/libs/range/test/test_driver/range_return_test_driver.hpp +++ /dev/null @@ -1,406 +0,0 @@ -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#ifndef BOOST_RANGE_TEST_TEST_DRIVER_RANGE_RETURN_TEST_DRIVER_HPP_INCLUDED -#define BOOST_RANGE_TEST_TEST_DRIVER_RANGE_RETURN_TEST_DRIVER_HPP_INCLUDED - -#include -#include -#include - -namespace boost -{ - namespace range_test - { - // check the results of an algorithm that returns - // a range_return. - // - // This version is the general version. It should never be called. - // All calls should invoke specialized implementations. - template< range_return_value return_type > - struct check_results - { - template< class Container, class Iterator > - static void test( - Container& test, - Container& reference, - Iterator test_it, - Iterator reference_it - ) - { - BOOST_ASSERT( false ); - } - }; - - // check the results of an algorithm that returns - // a 'found' iterator - template< > - struct check_results - { - template< class Container, class Iterator > - static void test( - Container& test, - Container& reference, - Iterator test_it, - Iterator reference_it - ) - { - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - BOOST_CHECK_EQUAL( std::distance(test.begin(), test_it), - std::distance(reference.begin(), reference_it) ); - } - }; - - // check the results of an algorithm that returns - // a 'next(found)' iterator - template< > - struct check_results - { - template< class Container, class Iterator > - static void test( - Container& test, - Container& reference, - Iterator test_it, - Iterator reference_it - ) - { - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - if (reference_it == reference.end()) - { - BOOST_CHECK( test_it == test.end() ); - } - else - { - BOOST_CHECK_EQUAL( - std::distance(test.begin(), test_it), - std::distance(reference.begin(), reference_it) + 1); - } - } - }; - - // check the results of an algorithm that returns - // a 'prior(found)' iterator - template< > - struct check_results - { - template< class Container, class Iterator > - static void test( - Container& test, - Container& reference, - Iterator test_it, - Iterator reference_it - ) - { - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - if (reference_it == reference.begin()) - { - BOOST_CHECK( test_it == test.begin() ); - } - else - { - BOOST_CHECK_EQUAL( - std::distance(test.begin(), test_it) + 1, - std::distance(reference.begin(), reference_it)); - } - } - }; - - // check the results of an algorithm that returns - // a '[begin, found)' range - template< > - struct check_results - { - template< class Container, class Iterator > - static void test( - Container& test, - Container& reference, - iterator_range test_rng, - Iterator reference_it - ) - { - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - - BOOST_CHECK( test_rng.begin() == test.begin() ); - - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference_it, - boost::begin(test_rng), boost::end(test_rng) - ); - } - }; - - // check the results of an algorithm that returns - // a '[begin, next(found))' range - template< > - struct check_results - { - template< class Container, class Iterator > - static void test( - Container& test, - Container& reference, - iterator_range test_rng, - Iterator reference_it - ) - { - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - - BOOST_CHECK( test_rng.begin() == test.begin() ); - - if (reference_it == reference.end()) - { - BOOST_CHECK( test_rng.end() == test.end() ); - } - else - { - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), boost::next(reference_it), - test_rng.begin(), test_rng.end()); - } - } - }; - - // check the results of an algorithm that returns - // a '[begin, prior(found))' range - template< > - struct check_results - { - template< class Container, class Iterator > - static void test( - Container& test, - Container& reference, - iterator_range test_rng, - Iterator reference_it - ) - { - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - BOOST_CHECK( test_rng.begin() == test.begin() ); - - if (reference_it == reference.begin()) - { - BOOST_CHECK( boost::end(test_rng) == test.begin() ); - } - else - { - BOOST_CHECK_EQUAL( std::distance(boost::begin(test_rng), boost::end(test_rng)) + 1, - std::distance(reference.begin(), reference_it) ); - } - } - }; - - // check the results of an algorithm that returns - // a '[found, end)' range - template< > - struct check_results - { - template< class Container, class Iterator > - static void test( - Container& test, - Container& reference, - iterator_range test_rng, - Iterator reference_it - ) - { - BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(), - test.begin(), test.end() ); - - BOOST_CHECK_EQUAL( - std::distance(test.begin(), boost::begin(test_rng)), - std::distance(reference.begin(), reference_it)); - - BOOST_CHECK( boost::end(test_rng) == test.end() ); - } - }; - - // check the results of an algorithm that returns - // a '[next(found), end)' range - template< > - struct check_results - { - template< class Container, class Iterator > - static void test( - Container& test, - Container& reference, - iterator_range test_rng, - Iterator reference_it - ) - { - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - - BOOST_CHECK( test_rng.end() == test.end() ); - - if (reference_it == reference.end()) - { - BOOST_CHECK( test_rng.begin() == test.end() ); - } - else - { - BOOST_CHECK_EQUAL_COLLECTIONS( - boost::next(reference_it), reference.end(), - test_rng.begin(), test_rng.end() - ); - } - } - }; - - // check the results of an algorithm that returns - // a 'prior(found), end)' range - template< > - struct check_results - { - template< class Container, class Iterator > - static void test( - Container& test, - Container& reference, - iterator_range test_rng, - Iterator reference_it - ) - { - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - - BOOST_CHECK( test_rng.end() == test.end() ); - - if (reference_it == reference.begin()) - { - BOOST_CHECK( test_rng.begin() == test.begin() ); - } - else - { - BOOST_CHECK_EQUAL_COLLECTIONS( - boost::prior(reference_it), reference.end(), - test_rng.begin(), test_rng.end() - ); - } - } - }; - - // check the results of an algorithm that returns - // a '[begin, end)' range - template< > - struct check_results - { - template< class Container, class Iterator > - static void test( - Container& test, - Container& reference, - iterator_range test_rng, - Iterator reference_it - ) - { - BOOST_CHECK_EQUAL_COLLECTIONS( - reference.begin(), reference.end(), - test.begin(), test.end() - ); - - BOOST_CHECK( test_rng.begin() == test.begin() ); - BOOST_CHECK( test_rng.end() == test.end() ); - } - }; - - // A test driver to exercise a test through all of the range_return - // combinations. - // - // The test driver also contains the code required to check the - // return value correctness. - // - // The TestPolicy needs to implement two functions: - // - // - perform the boost range version of the algorithm that returns - // a range_return::type - // template - // BOOST_DEDUCED_TYPENAME range_return::type - // test(Container& cont); - // - // - perform the reference std version of the algorithm that - // returns the standard iterator result - // template - // BOOST_DEDUCED_TYPENAME range_iterator::type - // reference(Container& cont); - class range_return_test_driver - { - public: - template< class Container, - class TestPolicy > - void operator()(Container& cont, TestPolicy policy) - { - test_range_iter (cont, policy); - test_range ()(cont, policy); - test_range ()(cont, policy); - test_range ()(cont, policy); - test_range()(cont, policy); - test_range ()(cont, policy); - test_range()(cont, policy); - test_range ()(cont, policy); - test_range ()(cont, policy); - test_range ()(cont, policy); - test_range ()(cont, policy); - } - - private: - template< class Container, class TestPolicy > - void test_range_iter( - Container& cont, - TestPolicy policy - ) - { - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator_t; - - Container reference(cont); - Container test(cont); - - iterator_t range_result = policy.test_iter(test); - iterator_t reference_it = policy.reference(reference); - - check_results::test(test, reference, - range_result, reference_it); - } - - template< range_return_value result_type, class Container, class TestPolicy > - struct test_range - { - void operator()(Container& cont, TestPolicy policy) - { - typedef BOOST_DEDUCED_TYPENAME range_iterator::type iterator_t; - typedef BOOST_DEDUCED_TYPENAME range_return::type range_return_t; - typedef BOOST_DEDUCED_TYPENAME TestPolicy::template test_range test_range_t; - - Container reference(cont); - Container test_cont(cont); - - test_range_t test_range_fn; - range_return_t range_result = test_range_fn(policy, test_cont); - iterator_t reference_it = policy.reference(reference); - - check_results::test(test_cont, reference, - range_result, reference_it); - } - }; - }; - } -} - -#endif // include guard diff --git a/libs/range/test/test_function/check_equal_fn.hpp b/libs/range/test/test_function/check_equal_fn.hpp deleted file mode 100644 index 8da2ed837..000000000 --- a/libs/range/test/test_function/check_equal_fn.hpp +++ /dev/null @@ -1,49 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#ifndef BOOST_RANGE_TEST_FUNCTIONS_CHECK_EQUAL_FN_HPP_INCLUDED -#define BOOST_RANGE_TEST_FUNCTIONS_CHECK_EQUAL_FN_HPP_INCLUDED - -#include "counted_function.hpp" - -namespace boost -{ - namespace range_test_function - { - template< class Collection > - class check_equal_fn : private counted_function - { - typedef BOOST_DEDUCED_TYPENAME Collection::const_iterator iter_t; - public: - explicit check_equal_fn( const Collection& c ) - : m_it(boost::begin(c)), m_last(boost::end(c)) {} - - using counted_function::invocation_count; - - void operator()(int x) const - { - invoked(); - BOOST_CHECK( m_it != m_last ); - if (m_it != m_last) - { - BOOST_CHECK_EQUAL( *m_it, x ); - ++m_it; - } - } - - private: - mutable iter_t m_it; - iter_t m_last; - }; - - } // namespace range_test_function -} // namespace boost - -#endif // include guard diff --git a/libs/range/test/test_function/counted_function.hpp b/libs/range/test/test_function/counted_function.hpp deleted file mode 100644 index 4a74515cc..000000000 --- a/libs/range/test/test_function/counted_function.hpp +++ /dev/null @@ -1,40 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#ifndef BOOST_RANGE_TEST_FUNCTION_COUNTED_FUNCTION_HPP_INCLUDED -#define BOOST_RANGE_TEST_FUNCTION_COUNTED_FUNCTION_HPP_INCLUDED - -namespace boost -{ - namespace range_test_function - { - - class counted_function - { - public: - counted_function() : m_count(0u) {} - - void invoked() const - { - ++m_count; - } - - // Return the number of times that this function object - // has been invoked. - unsigned int invocation_count() const { return m_count; } - - private: - mutable unsigned int m_count; - }; - - } -} - -#endif // include guard diff --git a/libs/range/test/test_function/equal_to_x.hpp b/libs/range/test/test_function/equal_to_x.hpp deleted file mode 100644 index 14d00162b..000000000 --- a/libs/range/test/test_function/equal_to_x.hpp +++ /dev/null @@ -1,33 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#ifndef BOOST_RANGE_TEST_TEST_FUNCTION_EQUAL_TO_X_HPP_INCLUDED -#define BOOST_RANGE_TEST_TEST_FUNCTION_EQUAL_TO_X_HPP_INCLUDED - -namespace boost -{ - namespace range_test_function - { - template - struct equal_to_x - { - typedef bool result_type; - typedef Arg argument_type; - - explicit equal_to_x(Arg x) : m_x(x) {} - bool operator()(Arg x) const { return x == m_x; } - - private: - Arg m_x; - }; - } -} - -#endif // include guard diff --git a/libs/range/test/test_function/false_predicate.hpp b/libs/range/test/test_function/false_predicate.hpp deleted file mode 100644 index 533e83d5c..000000000 --- a/libs/range/test/test_function/false_predicate.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#ifndef BOOST_RANGE_TEST_TEST_FUNCTION_FALSE_PREDICATE_HPP_INCLUDED -#define BOOST_RANGE_TEST_TEST_FUNCTION_FALSE_PREDICATE_HPP_INCLUDED - -namespace boost -{ - namespace range_test_function - { - struct false_predicate - { - typedef bool result_type; - - bool operator()() const { return false; } - template bool operator()(Arg) const { return false; } - template bool operator()(Arg1,Arg2) const { return false; } - }; - } -} - -#endif // include guard diff --git a/libs/range/test/test_function/greater_than_x.hpp b/libs/range/test/test_function/greater_than_x.hpp deleted file mode 100644 index 032f594ef..000000000 --- a/libs/range/test/test_function/greater_than_x.hpp +++ /dev/null @@ -1,32 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#ifndef BOOST_RANGE_TEST_FUNCTION_GREATER_THAN_X_HPP_INCLUDED -#define BOOST_RANGE_TEST_FUNCTION_GREATER_THAN_X_HPP_INCLUDED - -namespace boost -{ - namespace range_test_function - { - template< class Number > - struct greater_than_x - { - typedef bool result_type; - typedef Number argument_type; - - explicit greater_than_x(Number x) : m_x(x) {} - bool operator()(Number x) const { return x > m_x; } - private: - Number m_x; - }; - } // namespace range_test_function -} // namespace boost - -#endif // include guard diff --git a/libs/range/test/test_function/multiply_by_x.hpp b/libs/range/test/test_function/multiply_by_x.hpp deleted file mode 100644 index b343c61ed..000000000 --- a/libs/range/test/test_function/multiply_by_x.hpp +++ /dev/null @@ -1,32 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2009. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#ifndef BOOST_RANGE_TEST_TEST_FUNCTION_MULTIPLY_BY_X_HPP_INCLUDED -#define BOOST_RANGE_TEST_TEST_FUNCTION_MULTIPLY_BY_X_HPP_INCLUDED - -namespace boost -{ - namespace range_test_function - { - template< class Arg > - struct multiply_by_x - { - typedef Arg result_type; - typedef Arg argument_type; - - explicit multiply_by_x(Arg x) : m_x(x) {} - Arg operator()(Arg x) const { return x * m_x; } - private: - Arg m_x; - }; - } -} - -#endif // include guard diff --git a/libs/range/test/test_function/true_predicate.hpp b/libs/range/test/test_function/true_predicate.hpp deleted file mode 100644 index 87a0dcafc..000000000 --- a/libs/range/test/test_function/true_predicate.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2010. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#ifndef BOOST_RANGE_TEST_TEST_FUNCTION_TRUE_PREDICATE_HPP_INCLUDED -#define BOOST_RANGE_TEST_TEST_FUNCTION_TRUE_PREDICATE_HPP_INCLUDED - -namespace boost -{ - namespace range_test_function - { - struct true_predicate - { - typedef bool result_type; - - bool operator()() const { return true; } - template bool operator()(Arg) const { return true; } - template bool operator()(Arg1,Arg2) const { return true; } - }; - } -} - -#endif // include guard diff --git a/libs/range/test/test_utils.hpp b/libs/range/test/test_utils.hpp deleted file mode 100644 index 7af920a43..000000000 --- a/libs/range/test/test_utils.hpp +++ /dev/null @@ -1,24 +0,0 @@ -// Boost.Range library -// -// Copyright Akira Takahashi 2013. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include - -template -void check_random_access_range_concept(const RandomAccessRng& rng) -{ - BOOST_RANGE_CONCEPT_ASSERT(( boost::RandomAccessRangeConcept )); -} - -template -void check_bidirectional_range_concept(const BidirectionalRng& rng) -{ - BOOST_RANGE_CONCEPT_ASSERT(( boost::BidirectionalRangeConcept )); -} diff --git a/libs/range/test/ticket_10336.cpp b/libs/range/test/ticket_10336.cpp deleted file mode 100644 index 541e037a6..000000000 --- a/libs/range/test/ticket_10336.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2011. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include - -#include -#include - -namespace boost -{ - namespace - { - // Ticket 10336 - compilation error in iterator_range and unordered_map - void test_ticket_10336() - { - typedef boost::unordered_map container_t; - typedef container_t::const_iterator citer_t; - typedef boost::iterator_range rng_t; - - const container_t c; - rng_t rng(c.begin(), c.end()); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.ticket_10336" ); - - test->add( BOOST_TEST_CASE( &boost::test_ticket_10336 ) ); - - return test; -} diff --git a/libs/range/test/ticket_5486.cpp b/libs/range/test/ticket_5486.cpp deleted file mode 100644 index 3a6bf4bf3..000000000 --- a/libs/range/test/ticket_5486.cpp +++ /dev/null @@ -1,56 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2011. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include - -#include -#include - -#include -#include - -namespace boost -{ - namespace - { - class TestTicket5486Pred - : public std::binary_function - { - public: - explicit TestTicket5486Pred(int x) {} - bool operator()(int,int) const { return true; } - private: - TestTicket5486Pred(); - }; - - // Ticket 5486 - pertained to predicates erroneous - // requiring default construction - void test_ticket_5486() - { - std::vector v; - boost::push_back(v, v | boost::adaptors::adjacent_filtered(TestTicket5486Pred(1))); - - BOOST_CHECK_EQUAL_COLLECTIONS( v.begin(), v.end(), - v.begin(), v.end() ); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.ticket_5486" ); - - test->add( BOOST_TEST_CASE( &boost::test_ticket_5486 ) ); - - return test; -} diff --git a/libs/range/test/ticket_5544_terminate_irange.cpp b/libs/range/test/ticket_5544_terminate_irange.cpp deleted file mode 100644 index fa64436c0..000000000 --- a/libs/range/test/ticket_5544_terminate_irange.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2011. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include - -#include -#include - -#include - -namespace boost -{ - namespace - { - void test_irange_termination() - { - std::vector reference; - for (int i = 0; i < 9; i += 2) - reference.push_back(i); - - std::vector actual; - boost::push_back(actual, boost::irange(0,9,2)); - - BOOST_CHECK_EQUAL_COLLECTIONS(actual.begin(), actual.end(), - reference.begin(), reference.end()); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.ticket_5544" ); - - test->add( BOOST_TEST_CASE( &boost::test_irange_termination ) ); - - return test; -} diff --git a/libs/range/test/ticket_5547.cpp b/libs/range/test/ticket_5547.cpp deleted file mode 100644 index 1b9d3f6f6..000000000 --- a/libs/range/test/ticket_5547.cpp +++ /dev/null @@ -1,42 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2011. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include - -#include -#include - -#include - -namespace boost -{ - namespace - { - - // Ticket 5547 - boost::join ambiguous with algorithm::join - void test_ticket_5547() - { - std::vector x; - boost::range::join(x,x); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.ticket_5547" ); - - test->add( BOOST_TEST_CASE( &boost::test_ticket_5547 ) ); - - return test; -} diff --git a/libs/range/test/ticket_5556_is_sorted_namespace.cpp b/libs/range/test/ticket_5556_is_sorted_namespace.cpp deleted file mode 100644 index 78a75cde5..000000000 --- a/libs/range/test/ticket_5556_is_sorted_namespace.cpp +++ /dev/null @@ -1,37 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2011. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// - -// Embarrasingly, the mere inclusion of these headers in this order was -// enough to trigger the defect. -#include -#include - -#include -#include - -namespace boost -{ - namespace - { - void test_ticket_5556() {} - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.ticket_5556" ); - - test->add( BOOST_TEST_CASE( &boost::test_ticket_5556 ) ); - - return test; -} diff --git a/libs/range/test/ticket_5811_indirected_optional.cpp b/libs/range/test/ticket_5811_indirected_optional.cpp deleted file mode 100644 index 1279a4a47..000000000 --- a/libs/range/test/ticket_5811_indirected_optional.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include -#include - -#include -#include - -#include - -namespace boost -{ - namespace - { - void test_ticket_5811_indirected_optional() - { - std::vector > v; - std::vector r; - for (int i = 0; i < 10; ++i) - { - v.push_back(i); - r.push_back(i); - } - BOOST_CHECK_EQUAL_COLLECTIONS(r.begin(), r.end(), - v.begin(), v.end()); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE("RangeTestSuite.ticket_5811_indirected_optional"); - - test->add(BOOST_TEST_CASE(&boost::test_ticket_5811_indirected_optional)); - - return test; -} diff --git a/libs/range/test/ticket_6715_iterator_range_equality.cpp b/libs/range/test/ticket_6715_iterator_range_equality.cpp deleted file mode 100644 index 6c6972df3..000000000 --- a/libs/range/test/ticket_6715_iterator_range_equality.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include - -#include -#include -#include - -namespace boost -{ - namespace - { - class str_ref : public boost::iterator_range - { - public: - explicit str_ref(const std::string& str) - : boost::iterator_range( - str.c_str(), str.c_str() + str.size()) - { - } - }; - - void test_ticket_6715_iterator_range_equality() - { - std::string src("test"); - str_ref a(src); - str_ref b(src); - BOOST_CHECK(a == b); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( - "RangeTestSuite.ticket_6715_iterator_range_equality"); - - test->add(BOOST_TEST_CASE( - &boost::test_ticket_6715_iterator_range_equality)); - - return test; -} diff --git a/libs/range/test/ticket_6944.cpp b/libs/range/test/ticket_6944.cpp deleted file mode 100644 index 43796a8cd..000000000 --- a/libs/range/test/ticket_6944.cpp +++ /dev/null @@ -1,46 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2011. 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) -// -// -// For more information, see http://www.boost.org/libs/range/ -// -#include -#include -#include -#include - -#include -#include - -#include - -namespace boost -{ - typedef std::vector::iterator iter_base; - struct iter : boost::iterator_adaptor {}; // will be deduced as random-access traversal but input category - typedef boost::iterator_range iter_range; - - namespace - { - // Ticket 6944 - Some Range concepts use the incorrect Iterator concept - void test_ticket_6944() - { - BOOST_CONCEPT_ASSERT(( boost::RandomAccessRangeConcept )); - } - } -} - -boost::unit_test::test_suite* -init_unit_test_suite(int argc, char* argv[]) -{ - boost::unit_test::test_suite* test - = BOOST_TEST_SUITE( "RangeTestSuite.ticket_6944" ); - - test->add( BOOST_TEST_CASE( &boost::test_ticket_6944 ) ); - - return test; -} diff --git a/libs/range/test/value_type.cpp b/libs/range/test/value_type.cpp deleted file mode 100644 index 9a18b2f25..000000000 --- a/libs/range/test/value_type.cpp +++ /dev/null @@ -1,61 +0,0 @@ -// Boost.Range library -// -// Copyright Neil Groves 2014. 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) -// -// For more information, see http://www.boost.org/libs/range/ -// - -#include -#include -#include - -#include -#include - -#include - -namespace boost_range_test -{ - namespace - { - -void test_value_type() -{ - typedef std::vector cont; - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::value_type, - boost::range_value::type - >::value)); - - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::value_type, - boost::range_value::type - >::value)); - -#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES - BOOST_STATIC_ASSERT(( - boost::is_same< - cont::value_type, - boost::range_value::type - >::value)); -#endif -} - - } // anonymous namespace -} // namespace boost_range_test - -boost::unit_test::test_suite* init_unit_test_suite( int argc, char* argv[] ) -{ - boost::unit_test::test_suite* test = - BOOST_TEST_SUITE("Boost.Range range_value meta-function"); - - test->add(BOOST_TEST_CASE(&boost_range_test::test_value_type)); - - return test; -}
        -

        pointee and indirect_reference

        - --- - - - - - - - - - - - -
        Author:David Abrahams
        Contact:dave@boost-consulting.com
        Organization:Boost Consulting
        Date:2006-09-11
        Copyright:Copyright David Abrahams 2004.
        - - - - --- - - - -
        abstract:Provides the capability to deduce the referent types of -pointers, smart pointers and iterators in generic code.
        -
        -
        -

        Reference

        -
        -

        pointee

        - - - -
        -template <class Dereferenceable>
        -struct pointee
        -{
        -    typedef /* see below */ type;
        -};
        -
        - --- - - - -
        Requires:For an object x of type Dereferenceable, *x -is well-formed. If ++x is ill-formed it shall neither be -ambiguous nor shall it violate access control, and -Dereferenceable::element_type shall be an accessible type. -Otherwise iterator_traits<Dereferenceable>::value_type shall -be well formed. [Note: These requirements need not apply to -explicit or partial specializations of pointee]
        -

        type is determined according to the following algorithm, where -x is an object of type Dereferenceable:

        -
        -if ( ++x is ill-formed )
        -{
        -    return ``Dereferenceable::element_type``
        -}
        -else if (``*x`` is a mutable reference to
        -         std::iterator_traits<Dereferenceable>::value_type)
        -{
        -    return iterator_traits<Dereferenceable>::value_type
        -}
        -else
        -{
        -    return iterator_traits<Dereferenceable>::value_type const
        -}
        -
        -
        -
        -

        indirect_reference

        - - - -
        -template <class Dereferenceable>
        -struct indirect_reference
        -{
        -    typedef /* see below */ type;
        -};
        -
        - --- - - - -
        Requires:For an object x of type Dereferenceable, *x -is well-formed. If ++x is ill-formed it shall neither be -ambiguous nor shall it violate access control, and -pointee<Dereferenceable>::type& shall be well-formed. -Otherwise iterator_traits<Dereferenceable>::reference shall -be well formed. [Note: These requirements need not apply to -explicit or partial specializations of indirect_reference]
        -

        type is determined according to the following algorithm, where -x is an object of type Dereferenceable:

        -
        -if ( ++x is ill-formed )
        -    return ``pointee<Dereferenceable>::type&``
        -else
        -    std::iterator_traits<Dereferenceable>::reference
        -
        -
        -
        -
        -

        Iterator Archetype

        - --- - - - - - - - - - - - -
        Author:David Abrahams, Jeremy Siek, Thomas Witt
        Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
        Organization:Boost Consulting, Indiana University Open Systems -Lab, Zephyr Associates, Inc.
        Date:2006-09-11
        Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004.
        - - - - --- - - - -
        abstract:The iterator_archetype class constructs a minimal implementation of -one of the iterator access concepts and one of the iterator traversal concepts. -This is used for doing a compile-time check to see if a the type requirements -of a template are really enough to cover the implementation of the template. -For further information see the documentation for the boost::concept_check library.
        -
        -
        -

        Reference

        -
        -

        iterator_archetype Synopsis

        -
        -namespace iterator_archetypes
        -{
        -    // Access categories
        -
        -    typedef /*implementation  defined*/ readable_iterator_t;
        -    typedef /*implementation  defined*/ writable_iterator_t;
        -    typedef /*implementation  defined*/ readable_writable_iterator_t;
        -    typedef /*implementation  defined*/ readable_lvalue_iterator_t;
        -    typedef /*implementation  defined*/ writable_lvalue_iterator_t;
        -
        -}
        -
        -template <
        -    class Value
        -  , class AccessCategory
        -  , class TraversalCategory
        ->
        -class iterator_archetype
        -{
        -    typedef /* see below */ value_type;
        -    typedef /* see below */ reference;
        -    typedef /* see below */ pointer;
        -    typedef /* see below */ difference_type;
        -    typedef /* see below */ iterator_category;
        -};
        -
        -
        -
        -

        Access Category Tags

        -

        The access category types provided correspond to the following -standard iterator access concept combinations:

        -
        -readable_iterator_t :=
        -
        -  Readable Iterator
        -
        -writable_iterator_t :=
        -
        -  Writeable Iterator
        -
        -readable_writable_iterator_t :=
        -
        -  Readable Iterator & Writeable Iterator & Swappable Iterator
        -
        -readable_lvalue_iterator_t :=
        -
        -  Readable Iterator & Lvalue Iterator
        -
        -writeable_lvalue_iterator_t :=
        -
        -  Readable Iterator & Writeable Iterator & Swappable Iterator & Lvalue Iterator
        -
        -
        -
        -

        iterator_archetype Requirements

        -

        The AccessCategory argument must be one of the predefined access -category tags. The TraversalCategory must be one of the standard -traversal tags. The Value type must satisfy the requirements of -the iterator concept specified by AccessCategory and -TraversalCategory as implied by the nested traits types.

        -
        -
        -

        iterator_archetype Models

        -

        iterator_archetype models the iterator concepts specified by the -AccessCategory and TraversalCategory -arguments. iterator_archetype does not model any other access -concepts or any more derived traversal concepts.

        -
        -
        -

        Traits

        -

        The nested trait types are defined as follows:

        -
        -if (AccessCategory == readable_iterator_t)
        -
        -  value_type = Value
        -  reference  = Value
        -  pointer    = Value*
        -
        -else if (AccessCategory == writable_iterator_t)
        -
        -  value_type = void
        -  reference  = void
        -  pointer    = void
        -
        -else if (AccessCategory == readable_writable_iterator_t)
        -
        -  value_type = Value
        -
        -  reference :=
        -
        -    A type X that is convertible to Value for which the following
        -    expression is valid. Given an object x of type X and v of type
        -    Value.
        -
        -    x = v
        -
        -  pointer    = Value*
        -
        -else if (AccessCategory == readable_lvalue_iterator_t)
        -
        -  value_type = Value
        -  reference  = Value const&
        -  pointer    = Value const*
        -
        -else if (AccessCategory == writable_lvalue_iterator_t)
        -
        -  value_type = Value
        -  reference  = Value&
        -  pointer    = Value*
        -
        -if ( TraversalCategory is convertible to forward_traversal_tag )
        -
        -  difference_type := ptrdiff_t
        -
        -else
        -
        -  difference_type := unspecified type
        -
        -
        -iterator_category :=
        -
        -  A type X satisfying the following two constraints:
        -
        -     1. X is convertible to X1, and not to any more-derived
        -        type, where X1 is defined by:
        -
        -          if (reference is a reference type
        -              && TraversalCategory is convertible to forward_traversal_tag)
        -          {
        -              if (TraversalCategory is convertible to random_access_traversal_tag)
        -                  X1 = random_access_iterator_tag
        -              else if (TraversalCategory is convertible to bidirectional_traversal_tag)
        -                  X1 = bidirectional_iterator_tag
        -              else
        -                  X1 = forward_iterator_tag
        -          }
        -          else
        -          {
        -              if (TraversalCategory is convertible to single_pass_traversal_tag
        -                  && reference != void)
        -                  X1 = input_iterator_tag
        -              else
        -                  X1 = output_iterator_tag
        -          }
        -
        -     2. X is convertible to TraversalCategory
        -
        -
        -
        -
        -

        Filter Iterator

        - --- - - - - - - - - - - - -
        Author:David Abrahams, Jeremy Siek, Thomas Witt
        Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
        Organization:Boost Consulting, Indiana University Open Systems -Lab, University of Hanover Institute for Transport -Railway Operation and Construction
        Date:2006-09-11
        Copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
        - - - - --- - - - -
        abstract: - - -The filter iterator adaptor creates a view of an iterator range in -which some elements of the range are skipped. A predicate function -object controls which elements are skipped. When the predicate is -applied to an element, if it returns true then the element is -retained and if it returns false then the element is skipped -over. When skipping over elements, it is necessary for the filter -adaptor to know when to stop so as to avoid going past the end of the -underlying range. A filter iterator is therefore constructed with pair -of iterators indicating the range of elements in the unfiltered -sequence to be traversed.
        -
        -
        -

        filter_iterator synopsis

        - - - - -
        -template <class Predicate, class Iterator>
        -class filter_iterator
        -{
        - public:
        -    typedef iterator_traits<Iterator>::value_type value_type;
        -    typedef iterator_traits<Iterator>::reference reference;
        -    typedef iterator_traits<Iterator>::pointer pointer;
        -    typedef iterator_traits<Iterator>::difference_type difference_type;
        -    typedef /* see below */ iterator_category;
        -
        -    filter_iterator();
        -    filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
        -    filter_iterator(Iterator x, Iterator end = Iterator());
        -    template<class OtherIterator>
        -    filter_iterator(
        -        filter_iterator<Predicate, OtherIterator> const& t
        -        , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
        -        );
        -    Predicate predicate() const;
        -    Iterator end() const;
        -    Iterator const& base() const;
        -    reference operator*() const;
        -    filter_iterator& operator++();
        -private:
        -    Predicate m_pred; // exposition only
        -    Iterator m_iter;  // exposition only
        -    Iterator m_end;   // exposition only
        -};
        -
        -

        If Iterator models Readable Lvalue Iterator and Bidirectional Traversal -Iterator then iterator_category is convertible to -std::bidirectional_iterator_tag. -Otherwise, if Iterator models Readable Lvalue Iterator and Forward Traversal -Iterator then iterator_category is convertible to -std::forward_iterator_tag. -Otherwise iterator_category is -convertible to std::input_iterator_tag.

        -
        -
        -

        filter_iterator requirements

        -

        The Iterator argument shall meet the requirements of Readable -Iterator and Single Pass Iterator or it shall meet the requirements of -Input Iterator.

        -

        The Predicate argument must be Assignable, Copy Constructible, and -the expression p(x) must be valid where p is an object of type -Predicate, x is an object of type -iterator_traits<Iterator>::value_type, and where the type of -p(x) must be convertible to bool.

        -
        -
        -

        filter_iterator models

        -

        The concepts that filter_iterator models are dependent on which -concepts the Iterator argument models, as specified in the -following tables.

        - ---- - - - - - - - - - - - - - - - - -
        If Iterator modelsthen filter_iterator models
        Single Pass IteratorSingle Pass Iterator
        Forward Traversal IteratorForward Traversal Iterator
        Bidirectional Traversal IteratorBidirectional Traversal Iterator
        - ---- - - - - - - - - - - - - - - - - -
        If Iterator modelsthen filter_iterator models
        Readable IteratorReadable Iterator
        Writable IteratorWritable Iterator
        Lvalue IteratorLvalue Iterator
        - ---- - - - - - - - - - - - - - - - - - - - -
        If Iterator modelsthen filter_iterator models
        Readable Iterator, Single Pass IteratorInput Iterator
        Readable Lvalue Iterator, Forward Traversal IteratorForward Iterator
        Writable Lvalue Iterator, Forward Traversal IteratorMutable Forward Iterator
        Writable Lvalue Iterator, Bidirectional IteratorMutable Bidirectional Iterator
        -

        filter_iterator<P1, X> is interoperable with filter_iterator<P2, Y> -if and only if X is interoperable with Y.

        -
        -
        -

        filter_iterator operations

        -

        In addition to those operations required by the concepts that -filter_iterator models, filter_iterator provides the following -operations.

        -

        filter_iterator();

        - --- - - - - - -
        Requires:Predicate and Iterator must be Default Constructible.
        Effects:Constructs a filter_iterator whose``m_pred``, m_iter, and m_end -members are a default constructed.
        -

        filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());

        - --- - - - -
        Effects:Constructs a filter_iterator where m_iter is either -the first position in the range [x,end) such that f(*m_iter) == true -or else``m_iter == end``. The member m_pred is constructed from -f and m_end from end.
        -

        filter_iterator(Iterator x, Iterator end = Iterator());

        - --- - - - - - -
        Requires:Predicate must be Default Constructible and -Predicate is a class type (not a function pointer).
        Effects:Constructs a filter_iterator where m_iter is either -the first position in the range [x,end) such that m_pred(*m_iter) == true -or else``m_iter == end``. The member m_pred is default constructed.
        -
        -template <class OtherIterator>
        -filter_iterator(
        -    filter_iterator<Predicate, OtherIterator> const& t
        -    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
        -    );``
        -
        - --- - - - - - -
        Requires:OtherIterator is implicitly convertible to Iterator.
        Effects:Constructs a filter iterator whose members are copied from t.
        -

        Predicate predicate() const;

        - --- - - - -
        Returns:m_pred
        -

        Iterator end() const;

        - --- - - - -
        Returns:m_end
        -

        Iterator const& base() const;

        - --- - - - -
        Returns:m_iterator
        -

        reference operator*() const;

        - --- - - - -
        Returns:*m_iter
        -

        filter_iterator& operator++();

        - --- - - - - - -
        Effects:Increments m_iter and then continues to -increment m_iter until either m_iter == m_end -or m_pred(*m_iter) == true.
        Returns:*this
        - - - -
        -template <class Predicate, class Iterator>
        -filter_iterator<Predicate,Iterator>
        -make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
        -
        - --- - - - -
        Returns:filter_iterator<Predicate,Iterator>(f, x, end)
        -
        -template <class Predicate, class Iterator>
        -filter_iterator<Predicate,Iterator>
        -make_filter_iterator(Iterator x, Iterator end = Iterator());
        -
        - --- - - - -
        Returns:filter_iterator<Predicate,Iterator>(x, end)
        - - - -
        -
        -

        Example

        -

        This example uses filter_iterator and then -make_filter_iterator to output only the positive integers from an -array of integers. Then make_filter_iterator is is used to output -the integers greater than -2.

        -
        -struct is_positive_number {
        -  bool operator()(int x) { return 0 < x; }
        -};
        -
        -int main()
        -{
        -  int numbers_[] = { 0, -1, 4, -3, 5, 8, -2 };
        -  const int N = sizeof(numbers_)/sizeof(int);
        -
        -  typedef int* base_iterator;
        -  base_iterator numbers(numbers_);
        -
        -  // Example using filter_iterator
        -  typedef boost::filter_iterator<is_positive_number, base_iterator>
        -    FilterIter;
        -
        -  is_positive_number predicate;
        -  FilterIter filter_iter_first(predicate, numbers, numbers + N);
        -  FilterIter filter_iter_last(predicate, numbers + N, numbers + N);
        -
        -  std::copy(filter_iter_first, filter_iter_last, std::ostream_iterator<int>(std::cout, " "));
        -  std::cout << std::endl;
        -
        -  // Example using make_filter_iterator()
        -  std::copy(boost::make_filter_iterator<is_positive_number>(numbers, numbers + N),
        -            boost::make_filter_iterator<is_positive_number>(numbers + N, numbers + N),
        -            std::ostream_iterator<int>(std::cout, " "));
        -  std::cout << std::endl;
        -
        -  // Another example using make_filter_iterator()
        -  std::copy(
        -      boost::make_filter_iterator(
        -          std::bind2nd(std::greater<int>(), -2)
        -        , numbers, numbers + N)
        -
        -    , boost::make_filter_iterator(
        -          std::bind2nd(std::greater<int>(), -2)
        -        , numbers + N, numbers + N)
        -
        -    , std::ostream_iterator<int>(std::cout, " ")
        -  );
        -
        -  std::cout << std::endl;
        -
        -  return boost::exit_success;
        -}
        -
        -

        The output is:

        -
        -4 5 8
        -4 5 8
        -0 -1 4 5 8
        -
        -

        The source code for this example can be found here.

        -
        -
        -

        Iterator Facade and Adaptor

        - --- - - - - - - - - - - - -
        Author:David Abrahams, Jeremy Siek, Thomas Witt
        Contact:dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
        Organization:Boost Consulting, Indiana University Open Systems -Lab, Zephyr Associates, Inc.
        Date:2006-09-11
        Number:This is a revised version of N1530=03-0113, which was -accepted for Technical Report 1 by the C++ standard -committee's library working group.
        - - - - - --- - - - -
        copyright:Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
        - --- - - - -
        abstract:We propose a set of class templates that help programmers -build standard-conforming iterators, both from scratch and -by adapting other iterators.
        -
        -

        Table of Contents

        -
        -
        -
        -

        Motivation

        -

        Iterators play an important role in modern C++ programming. The -iterator is the central abstraction of the algorithms of the Standard -Library, allowing algorithms to be re-used in in a wide variety of -contexts. The C++ Standard Library contains a wide variety of useful -iterators. Every one of the standard containers comes with constant -and mutable iterators2, and also reverse versions of those -same iterators which traverse the container in the opposite direction. -The Standard also supplies istream_iterator and -ostream_iterator for reading from and writing to streams, -insert_iterator, front_insert_iterator and -back_insert_iterator for inserting elements into containers, and -raw_storage_iterator for initializing raw memory [7].

        -

        Despite the many iterators supplied by the Standard Library, obvious -and useful iterators are missing, and creating new iterator types is -still a common task for C++ programmers. The literature documents -several of these, for example line_iterator [3] and Constant_iterator -[9]. The iterator abstraction is so powerful that we expect -programmers will always need to invent new iterator types.

        -

        Although it is easy to create iterators that almost conform to the -standard, the iterator requirements contain subtleties which can make -creating an iterator which actually conforms quite difficult. -Further, the iterator interface is rich, containing many operators -that are technically redundant and tedious to implement. To automate -the repetitive work of constructing iterators, we propose -iterator_facade, an iterator base class template which provides -the rich interface of standard iterators and delegates its -implementation to member functions of the derived class. In addition -to reducing the amount of code necessary to create an iterator, the -iterator_facade also provides compile-time error detection. -Iterator implementation mistakes that often go unnoticed are turned -into compile-time errors because the derived class implementation must -match the expectations of the iterator_facade.

        -

        A common pattern of iterator construction is the adaptation of one -iterator to form a new one. The functionality of an iterator is -composed of four orthogonal aspects: traversal, indirection, equality -comparison and distance measurement. Adapting an old iterator to -create a new one often saves work because one can reuse one aspect of -functionality while redefining the other. For example, the Standard -provides reverse_iterator, which adapts any Bidirectional Iterator -by inverting its direction of traversal. As with plain iterators, -iterator adaptors defined outside the Standard have become commonplace -in the literature:

        -
          -
        • Checked iter[13] adds bounds-checking to an existing iterator.
        • -
        • The iterators of the View Template Library[14], which adapts -containers, are themselves adaptors over the underlying iterators.
        • -
        • Smart iterators [5] adapt an iterator's dereferencing behavior by -applying a function object to the object being referenced and -returning the result.
        • -
        • Custom iterators [4], in which a variety of adaptor types are enumerated.
        • -
        • Compound iterators [1], which access a slice out of a container of containers.
        • -
        • Several iterator adaptors from the MTL [12]. The MTL contains a -strided iterator, where each call to operator++() moves the -iterator ahead by some constant factor, and a scaled iterator, which -multiplies the dereferenced value by some constant.
        • -
        - - - - - -
        [1]We use the term concept to mean a set of requirements -that a type must satisfy to be used with a particular template -parameter.
        - - - - - -
        [2]The term mutable iterator refers to iterators over objects that -can be changed by assigning to the dereferenced iterator, while -constant iterator refers to iterators over objects that cannot be -modified.
        -

        To fulfill the need for constructing adaptors, we propose the -iterator_adaptor class template. Instantiations of -iterator_adaptor serve as a base classes for new iterators, -providing the default behavior of forwarding all operations to the -underlying iterator. The user can selectively replace these features -in the derived iterator class. This proposal also includes a number -of more specialized adaptors, such as the transform_iterator that -applies some user-specified function during the dereference of the -iterator.

        -
        -
        -

        Impact on the Standard

        -

        This proposal is purely an addition to the C++ standard library. -However, note that this proposal relies on the proposal for New -Iterator Concepts.

        -
        -
        -

        Design

        -
        -

        Iterator Concepts

        -

        This proposal is formulated in terms of the new iterator concepts -as proposed in n1550, since user-defined and especially adapted -iterators suffer from the well known categorization problems that are -inherent to the current iterator categories.

        -

        This proposal does not strictly depend on proposal n1550, as there -is a direct mapping between new and old categories. This proposal -could be reformulated using this mapping if n1550 was not accepted.

        -
        -
        -

        Interoperability

        -

        The question of iterator interoperability is poorly addressed in the -current standard. There are currently two defect reports that are -concerned with interoperability issues.

        -

        Issue 179 concerns the fact that mutable container iterator types -are only required to be convertible to the corresponding constant -iterator types, but objects of these types are not required to -interoperate in comparison or subtraction expressions. This situation -is tedious in practice and out of line with the way built in types -work. This proposal implements the proposed resolution to issue -179, as most standard library implementations do nowadays. In other -words, if an iterator type A has an implicit or user defined -conversion to an iterator type B, the iterator types are interoperable -and the usual set of operators are available.

        -

        Issue 280 concerns the current lack of interoperability between -reverse iterator types. The proposed new reverse_iterator template -fixes the issues raised in 280. It provides the desired -interoperability without introducing unwanted overloads.

        -
        -
        -

        Iterator Facade

        - - - - - -

        While the iterator interface is rich, there is a core subset of the -interface that is necessary for all the functionality. We have -identified the following core behaviors for iterators:

        -
          -
        • dereferencing
        • -
        • incrementing
        • -
        • decrementing
        • -
        • equality comparison
        • -
        • random-access motion
        • -
        • distance measurement
        • -
        -

        In addition to the behaviors listed above, the core interface elements -include the associated types exposed through iterator traits: -value_type, reference, difference_type, and -iterator_category.

        -

        Iterator facade uses the Curiously Recurring Template -Pattern (CRTP) [Cop95] so that the user can specify the behavior -of iterator_facade in a derived class. Former designs used -policy objects to specify the behavior, but that approach was -discarded for several reasons:

        -
        -
          -
        1. the creation and eventual copying of the policy object may create -overhead that can be avoided with the current approach.
        2. -
        3. The policy object approach does not allow for custom constructors -on the created iterator types, an essential feature if -iterator_facade should be used in other library -implementations.
        4. -
        5. Without the use of CRTP, the standard requirement that an -iterator's operator++ returns the iterator type itself -would mean that all iterators built with the library would -have to be specializations of iterator_facade<...>, rather -than something more descriptive like -indirect_iterator<T*>. Cumbersome type generator -metafunctions would be needed to build new parameterized -iterators, and a separate iterator_adaptor layer would be -impossible.
        6. -
        -
        -
        -

        Usage

        -

        The user of iterator_facade derives his iterator class from a -specialization of iterator_facade and passes the derived -iterator class as iterator_facade's first template parameter. -The order of the other template parameters have been carefully -chosen to take advantage of useful defaults. For example, when -defining a constant lvalue iterator, the user can pass a -const-qualified version of the iterator's value_type as -iterator_facade's Value parameter and omit the -Reference parameter which follows.

        -

        The derived iterator class must define member functions implementing -the iterator's core behaviors. The following table describes -expressions which are required to be valid depending on the category -of the derived iterator type. These member functions are described -briefly below and in more detail in the iterator facade -requirements.

        -
        - ---- - - - - - - - - - - - - - - - - - - - - - - - - - -
        ExpressionEffects
        i.dereference()Access the value referred to
        i.equal(j)Compare for equality with j
        i.increment()Advance by one position
        i.decrement()Retreat by one position
        i.advance(n)Advance by n positions
        i.distance_to(j)Measure the distance to j
        -
        - -

        In addition to implementing the core interface functions, an iterator -derived from iterator_facade typically defines several -constructors. To model any of the standard iterator concepts, the -iterator must at least have a copy constructor. Also, if the iterator -type X is meant to be automatically interoperate with another -iterator type Y (as with constant and mutable iterators) then -there must be an implicit conversion from X to Y or from Y -to X (but not both), typically implemented as a conversion -constructor. Finally, if the iterator is to model Forward Traversal -Iterator or a more-refined iterator concept, a default constructor is -required.

        -
        -
        -

        Iterator Core Access

        -

        iterator_facade and the operator implementations need to be able -to access the core member functions in the derived class. Making the -core member functions public would expose an implementation detail to -the user. The design used here ensures that implementation details do -not appear in the public interface of the derived iterator type.

        -

        Preventing direct access to the core member functions has two -advantages. First, there is no possibility for the user to accidently -use a member function of the iterator when a member of the value_type -was intended. This has been an issue with smart pointer -implementations in the past. The second and main advantage is that -library implementers can freely exchange a hand-rolled iterator -implementation for one based on iterator_facade without fear of -breaking code that was accessing the public core member functions -directly.

        -

        In a naive implementation, keeping the derived class' core member -functions private would require it to grant friendship to -iterator_facade and each of the seven operators. In order to -reduce the burden of limiting access, iterator_core_access is -provided, a class that acts as a gateway to the core member functions -in the derived iterator class. The author of the derived class only -needs to grant friendship to iterator_core_access to make his core -member functions available to the library.

        - - -

        iterator_core_access will be typically implemented as an empty -class containing only private static member functions which invoke the -iterator core member functions. There is, however, no need to -standardize the gateway protocol. Note that even if -iterator_core_access used public member functions it would not -open a safety loophole, as every core member function preserves the -invariants of the iterator.

        -
        -
        -

        operator[]

        -

        The indexing operator for a generalized iterator presents special -challenges. A random access iterator's operator[] is only -required to return something convertible to its value_type. -Requiring that it return an lvalue would rule out currently-legal -random-access iterators which hold the referenced value in a data -member (e.g. counting_iterator), because *(p+n) is a reference -into the temporary iterator p+n, which is destroyed when -operator[] returns.

        -

        Writable iterators built with iterator_facade implement the -semantics required by the preferred resolution to issue 299 and -adopted by proposal n1550: the result of p[n] is an object -convertible to the iterator's value_type, and p[n] = x is -equivalent to *(p + n) = x (Note: This result object may be -implemented as a proxy containing a copy of p+n). This approach -will work properly for any random-access iterator regardless of the -other details of its implementation. A user who knows more about -the implementation of her iterator is free to implement an -operator[] that returns an lvalue in the derived iterator -class; it will hide the one supplied by iterator_facade from -clients of her iterator.

        -
        -
        -

        operator->

        -

        The reference type of a readable iterator (and today's input -iterator) need not in fact be a reference, so long as it is -convertible to the iterator's value_type. When the value_type -is a class, however, it must still be possible to access members -through operator->. Therefore, an iterator whose reference -type is not in fact a reference must return a proxy containing a copy -of the referenced value from its operator->.

        -

        The return types for iterator_facade's operator-> and -operator[] are not explicitly specified. Instead, those types -are described in terms of a set of requirements, which must be -satisfied by the iterator_facade implementation.

        - - - - - -
        [Cop95][Coplien, 1995] Coplien, J., Curiously Recurring Template -Patterns, C++ Report, February 1995, pp. 24-27.
        -
        -
        -
        -

        Iterator Adaptor

        - - - - - -

        The iterator_adaptor class template adapts some Base3 -type to create a new iterator. Instantiations of iterator_adaptor -are derived from a corresponding instantiation of iterator_facade -and implement the core behaviors in terms of the Base type. In -essence, iterator_adaptor merely forwards all operations to an -instance of the Base type, which it stores as a member.

        - - - - - -
        [3]The term "Base" here does not refer to a base class and is -not meant to imply the use of derivation. We have followed the lead -of the standard library, which provides a base() function to access -the underlying iterator object of a reverse_iterator adaptor.
        -

        The user of iterator_adaptor creates a class derived from an -instantiation of iterator_adaptor and then selectively -redefines some of the core member functions described in the -iterator_facade core requirements table. The Base type need -not meet the full requirements for an iterator; it need only -support the operations used by the core interface functions of -iterator_adaptor that have not been redefined in the user's -derived class.

        -

        Several of the template parameters of iterator_adaptor default -to use_default. This allows the -user to make use of a default parameter even when she wants to -specify a parameter later in the parameter list. Also, the -defaults for the corresponding associated types are somewhat -complicated, so metaprogramming is required to compute them, and -use_default can help to simplify the implementation. Finally, -the identity of the use_default type is not left unspecified -because specification helps to highlight that the Reference -template parameter may not always be identical to the iterator's -reference type, and will keep users from making mistakes based on -that assumption.

        -
        -
        -

        Specialized Adaptors

        -

        This proposal also contains several examples of specialized adaptors -which were easily implemented using iterator_adaptor:

        -
          -
        • indirect_iterator, which iterates over iterators, pointers, -or smart pointers and applies an extra level of dereferencing.
        • -
        • A new reverse_iterator, which inverts the direction of a Base -iterator's motion, while allowing adapted constant and mutable -iterators to interact in the expected ways (unlike those in most -implementations of C++98).
        • -
        • transform_iterator, which applies a user-defined function object -to the underlying values when dereferenced.
        • -
        • filter_iterator, which provides a view of an iterator range in -which some elements of the underlying range are skipped.
        • -
        -
          -
        • counting_iterator, which adapts any incrementable type -(e.g. integers, iterators) so that incrementing/decrementing the -adapted iterator and dereferencing it produces successive values of -the Base type.
        • -
        • function_output_iterator, which makes it easier to create custom -output iterators.
        • -
        -

        Based on examples in the Boost library, users have generated many new -adaptors, among them a permutation adaptor which applies some -permutation to a random access iterator, and a strided adaptor, which -adapts a random access iterator by multiplying its unit of motion by a -constant factor. In addition, the Boost Graph Library (BGL) uses -iterator adaptors to adapt other graph libraries, such as LEDA [10] -and Stanford GraphBase [8], to the BGL interface (which requires C++ -Standard compliant iterators).

        -
        -
        -
        -

        Proposed Text

        -
        -

        Header <iterator_helper> synopsis [lib.iterator.helper.synopsis]

        -
        -struct use_default;
        -
        -struct iterator_core_access { /* implementation detail */ };
        -
        -template <
        -    class Derived
        -  , class Value
        -  , class CategoryOrTraversal
        -  , class Reference  = Value&
        -  , class Difference = ptrdiff_t
        ->
        -class iterator_facade;
        -
        -template <
        -    class Derived
        -  , class Base
        -  , class Value      = use_default
        -  , class CategoryOrTraversal  = use_default
        -  , class Reference  = use_default
        -  , class Difference = use_default
        ->
        -class iterator_adaptor;
        -
        -template <
        -    class Iterator
        -  , class Value = use_default
        -  , class CategoryOrTraversal = use_default
        -  , class Reference = use_default
        -  , class Difference = use_default
        ->
        -class indirect_iterator;
        -
        -template <class Dereferenceable>
        -struct pointee;
        -
        -template <class Dereferenceable>
        -struct indirect_reference;
        -
        -template <class Iterator>
        -class reverse_iterator;
        -
        -template <
        -    class UnaryFunction
        -  , class Iterator
        -  , class Reference = use_default
        -  , class Value = use_default
        ->
        -class transform_iterator;
        -
        -template <class Predicate, class Iterator>
        -class filter_iterator;
        -
        -template <
        -    class Incrementable
        -  , class CategoryOrTraversal  = use_default
        -  , class Difference = use_default
        ->
        -class counting_iterator;
        -
        -template <class UnaryFunction>
        -class function_output_iterator;
        -
        -
        -
        -

        Iterator facade [lib.iterator.facade]

        - - - -

        iterator_facade is a base class template that implements the -interface of standard iterators in terms of a few core functions -and associated types, to be supplied by a derived iterator class.

        -
        -

        Class template iterator_facade

        - - - - - -
        -template <
        -    class Derived
        -  , class Value
        -  , class CategoryOrTraversal
        -  , class Reference  = Value&
        -  , class Difference = ptrdiff_t
        ->
        -class iterator_facade {
        - public:
        -    typedef remove_const<Value>::type value_type;
        -    typedef Reference reference;
        -    typedef Value* pointer;
        -    typedef Difference difference_type;
        -    typedef /* see below */ iterator_category;
        -
        -    reference operator*() const;
        -    /* see below */ operator->() const;
        -    /* see below */ operator[](difference_type n) const;
        -    Derived& operator++();
        -    Derived operator++(int);
        -    Derived& operator--();
        -    Derived operator--(int);
        -    Derived& operator+=(difference_type n);
        -    Derived& operator-=(difference_type n);
        -    Derived operator-(difference_type n) const;
        - protected:
        -    typedef iterator_facade iterator_facade_;
        -};
        -
        -// Comparison operators
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -typename enable_if_interoperable<Dr1,Dr2,bool>::type // exposition
        -operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -typename enable_if_interoperable<Dr1,Dr2,bool>::type
        -operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -typename enable_if_interoperable<Dr1,Dr2,bool>::type
        -operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -typename enable_if_interoperable<Dr1,Dr2,bool>::type
        -operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -typename enable_if_interoperable<Dr1,Dr2,bool>::type
        -operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -typename enable_if_interoperable<Dr1,Dr2,bool>::type
        -operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        -// Iterator difference
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -/* see below */
        -operator-(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -          iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        -// Iterator addition
        -template <class Dr, class V, class TC, class R, class D>
        -Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
        -                   typename Derived::difference_type n);
        -
        -template <class Dr, class V, class TC, class R, class D>
        -Derived operator+ (typename Derived::difference_type n,
        -                   iterator_facade<Dr,V,TC,R,D> const&);
        -
        -

        The iterator_category member of iterator_facade is

        -
        -iterator-category(CategoryOrTraversal, value_type, reference)
        -
        -

        where iterator-category is defined as follows:

        -
        -iterator-category(C,R,V) :=
        -   if (C is convertible to std::input_iterator_tag
        -       || C is convertible to std::output_iterator_tag
        -   )
        -       return C
        -
        -   else if (C is not convertible to incrementable_traversal_tag)
        -       the program is ill-formed
        -
        -   else return a type X satisfying the following two constraints:
        -
        -      1. X is convertible to X1, and not to any more-derived
        -         type, where X1 is defined by:
        -
        -           if (R is a reference type
        -               && C is convertible to forward_traversal_tag)
        -           {
        -               if (C is convertible to random_access_traversal_tag)
        -                   X1 = random_access_iterator_tag
        -               else if (C is convertible to bidirectional_traversal_tag)
        -                   X1 = bidirectional_iterator_tag
        -               else
        -                   X1 = forward_iterator_tag
        -           }
        -           else
        -           {
        -               if (C is convertible to single_pass_traversal_tag
        -                   && R is convertible to V)
        -                   X1 = input_iterator_tag
        -               else
        -                   X1 = C
        -           }
        -
        -      2. category-to-traversal(X) is convertible to the most
        -         derived traversal tag type to which X is also
        -         convertible, and not to any more-derived traversal tag
        -         type.
        -
        -

        [Note: the intention is to allow iterator_category to be one of -the five original category tags when convertibility to one of the -traversal tags would add no information]

        - - - -

        The enable_if_interoperable template used above is for exposition -purposes. The member operators should only be in an overload set -provided the derived types Dr1 and Dr2 are interoperable, -meaning that at least one of the types is convertible to the other. The -enable_if_interoperable approach uses SFINAE to take the operators -out of the overload set when the types are not interoperable. -The operators should behave as-if enable_if_interoperable -were defined to be:

        -
        -template <bool, typename> enable_if_interoperable_impl
        -{};
        -
        -template <typename T> enable_if_interoperable_impl<true,T>
        -{ typedef T type; };
        -
        -template<typename Dr1, typename Dr2, typename T>
        -struct enable_if_interoperable
        -  : enable_if_interoperable_impl<
        -        is_convertible<Dr1,Dr2>::value || is_convertible<Dr2,Dr1>::value
        -      , T
        -    >
        -{};
        -
        -
        -
        -

        iterator_facade Requirements

        -

        The following table describes the typical valid expressions on -iterator_facade's Derived parameter, depending on the -iterator concept(s) it will model. The operations in the first -column must be made accessible to member functions of class -iterator_core_access. In addition, -static_cast<Derived*>(iterator_facade*) shall be well-formed.

        -

        In the table below, F is iterator_facade<X,V,C,R,D>, a is an -object of type X, b and c are objects of type const X, -n is an object of F::difference_type, y is a constant -object of a single pass iterator type interoperable with X, and z -is a constant object of a random access traversal iterator type -interoperable with X.

        -
        -

        iterator_facade Core Operations

        - ------ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        ExpressionReturn TypeAssertion/NoteUsed to implement Iterator -Concept(s)
        c.dereference()F::reference Readable Iterator, Writable -Iterator
        c.equal(y)convertible to booltrue iff c and y -refer to the same -position.Single Pass Iterator
        a.increment()unused Incrementable Iterator
        a.decrement()unused Bidirectional Traversal -Iterator
        a.advance(n)unused Random Access Traversal -Iterator
        c.distance_to(z)convertible to -F::difference_typeequivalent to -distance(c, X(z)).Random Access Traversal -Iterator
        -
        -
        -
        -

        iterator_facade operations

        -

        The operations in this section are described in terms of operations on -the core interface of Derived which may be inaccessible -(i.e. private). The implementation should access these operations -through member functions of class iterator_core_access.

        -

        reference operator*() const;

        - --- - - - -
        Returns:static_cast<Derived const*>(this)->dereference()
        -

        operator->() const; (see below)

        - --- - - - -
        Returns:

        If reference is a reference type, an object -of type pointer equal to:

        -
        -&static_cast<Derived const*>(this)->dereference()
        -
        -

        Otherwise returns an object of unspecified type such that, -(*static_cast<Derived const*>(this))->m is equivalent to (w = **static_cast<Derived const*>(this), -w.m) for some temporary object w of type value_type.

        -
        -

        unspecified operator[](difference_type n) const;

        - --- - - - -
        Returns:an object convertible to value_type. For constant -objects v of type value_type, and n of type -difference_type, (*this)[n] = v is equivalent to -*(*this + n) = v, and static_cast<value_type -const&>((*this)[n]) is equivalent to -static_cast<value_type const&>(*(*this + n))
        -

        Derived& operator++();

        - --- - - - -
        Effects:
        -static_cast<Derived*>(this)->increment();
        -return *static_cast<Derived*>(this);
        -
        -
        -

        Derived operator++(int);

        - --- - - - -
        Effects:
        -Derived tmp(static_cast<Derived const*>(this));
        -++*this;
        -return tmp;
        -
        -
        -

        Derived& operator--();

        - --- - - - -
        Effects:
        -static_cast<Derived*>(this)->decrement();
        -return *static_cast<Derived*>(this);
        -
        -
        -

        Derived operator--(int);

        - --- - - - -
        Effects:
        -Derived tmp(static_cast<Derived const*>(this));
        ---*this;
        -return tmp;
        -
        -
        -

        Derived& operator+=(difference_type n);

        - --- - - - -
        Effects:
        -static_cast<Derived*>(this)->advance(n);
        -return *static_cast<Derived*>(this);
        -
        -
        -

        Derived& operator-=(difference_type n);

        - --- - - - -
        Effects:
        -static_cast<Derived*>(this)->advance(-n);
        -return *static_cast<Derived*>(this);
        -
        -
        -

        Derived operator-(difference_type n) const;

        - --- - - - -
        Effects:
        -Derived tmp(static_cast<Derived const*>(this));
        -return tmp -= n;
        -
        -
        -
        -template <class Dr, class V, class TC, class R, class D>
        -Derived operator+ (iterator_facade<Dr,V,TC,R,D> const&,
        -                   typename Derived::difference_type n);
        -
        -template <class Dr, class V, class TC, class R, class D>
        -Derived operator+ (typename Derived::difference_type n,
        -                   iterator_facade<Dr,V,TC,R,D> const&);
        -
        - --- - - - -
        Effects:
        -Derived tmp(static_cast<Derived const*>(this));
        -return tmp += n;
        -
        -
        -
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -typename enable_if_interoperable<Dr1,Dr2,bool>::type
        -operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        - --- - - - -
        Returns:

        if is_convertible<Dr2,Dr1>::value

        -
        -
        then
        -

        ((Dr1 const&)lhs).equal((Dr2 const&)rhs).

        -
        -
        Otherwise,
        -

        ((Dr2 const&)rhs).equal((Dr1 const&)lhs).

        -
        -
        -
        -
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -typename enable_if_interoperable<Dr1,Dr2,bool>::type
        -operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        - --- - - - -
        Returns:

        if is_convertible<Dr2,Dr1>::value

        -
        -
        then
        -

        !((Dr1 const&)lhs).equal((Dr2 const&)rhs).

        -
        -
        Otherwise,
        -

        !((Dr2 const&)rhs).equal((Dr1 const&)lhs).

        -
        -
        -
        -
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -typename enable_if_interoperable<Dr1,Dr2,bool>::type
        -operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        - --- - - - -
        Returns:

        if is_convertible<Dr2,Dr1>::value

        -
        -
        then
        -

        ((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) < 0.

        -
        -
        Otherwise,
        -

        ((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0.

        -
        -
        -
        -
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -typename enable_if_interoperable<Dr1,Dr2,bool>::type
        -operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        - --- - - - -
        Returns:

        if is_convertible<Dr2,Dr1>::value

        -
        -
        then
        -

        ((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) <= 0.

        -
        -
        Otherwise,
        -

        ((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0.

        -
        -
        -
        -
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -typename enable_if_interoperable<Dr1,Dr2,bool>::type
        -operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        - --- - - - -
        Returns:

        if is_convertible<Dr2,Dr1>::value

        -
        -
        then
        -

        ((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) > 0.

        -
        -
        Otherwise,
        -

        ((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0.

        -
        -
        -
        -
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -typename enable_if_interoperable<Dr1,Dr2,bool>::type
        -operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -            iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        - --- - - - -
        Returns:

        if is_convertible<Dr2,Dr1>::value

        -
        -
        then
        -

        ((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) >= 0.

        -
        -
        Otherwise,
        -

        ((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0.

        -
        -
        -
        -
        -template <class Dr1, class V1, class TC1, class R1, class D1,
        -          class Dr2, class V2, class TC2, class R2, class D2>
        -typename enable_if_interoperable<Dr1,Dr2,difference>::type
        -operator -(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
        -           iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
        -
        - --- - - - - - -
        Return Type:

        if is_convertible<Dr2,Dr1>::value

        -
        -
        -
        then
        -

        difference shall be -iterator_traits<Dr1>::difference_type.

        -
        -
        Otherwise
        -

        difference shall be iterator_traits<Dr2>::difference_type

        -
        -
        -
        -
        Returns:

        if is_convertible<Dr2,Dr1>::value

        -
        -
        then
        -

        -((Dr1 const&)lhs).distance_to((Dr2 const&)rhs).

        -
        -
        Otherwise,
        -

        ((Dr2 const&)rhs).distance_to((Dr1 const&)lhs).

        -
        -
        -
        -
        -
        -
        -

        Iterator adaptor [lib.iterator.adaptor]

        - - - - - -

        Each specialization of the iterator_adaptor class template is derived from -a specialization of iterator_facade. The core interface functions -expected by iterator_facade are implemented in terms of the -iterator_adaptor's Base template parameter. A class derived -from iterator_adaptor typically redefines some of the core -interface functions to adapt the behavior of the Base type. -Whether the derived class models any of the standard iterator concepts -depends on the operations supported by the Base type and which -core interface functions of iterator_facade are redefined in the -Derived class.

        -
        -

        Class template iterator_adaptor

        - - - - - -
        -template <
        -    class Derived
        -  , class Base
        -  , class Value               = use_default
        -  , class CategoryOrTraversal = use_default
        -  , class Reference           = use_default
        -  , class Difference = use_default
        ->
        -class iterator_adaptor
        -  : public iterator_facade<Derived, V', C', R', D'> // see details
        -{
        -    friend class iterator_core_access;
        - public:
        -    iterator_adaptor();
        -    explicit iterator_adaptor(Base const& iter);
        -    typedef Base base_type;
        -    Base const& base() const;
        - protected:
        -    typedef iterator_adaptor iterator_adaptor_;
        -    Base const& base_reference() const;
        -    Base& base_reference();
        - private: // Core iterator interface for iterator_facade.
        -    typename iterator_adaptor::reference dereference() const;
        -
        -    template <
        -    class OtherDerived, class OtherIterator, class V, class C, class R, class D
        -    >
        -    bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
        -
        -    void advance(typename iterator_adaptor::difference_type n);
        -    void increment();
        -    void decrement();
        -
        -    template <
        -        class OtherDerived, class OtherIterator, class V, class C, class R, class D
        -    >
        -    typename iterator_adaptor::difference_type distance_to(
        -        iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
        -
        - private:
        -    Base m_iterator; // exposition only
        -};
        -
        -
        -
        -

        iterator_adaptor requirements

        -

        static_cast<Derived*>(iterator_adaptor*) shall be well-formed. -The Base argument shall be Assignable and Copy Constructible.

        -
        -
        -

        iterator_adaptor base class parameters

        -

        The V', C', R', and D' parameters of the iterator_facade -used as a base class in the summary of iterator_adaptor -above are defined as follows:

        -
        -V' = if (Value is use_default)
        -          return iterator_traits<Base>::value_type
        -      else
        -          return Value
        -
        -C' = if (CategoryOrTraversal is use_default)
        -          return iterator_traversal<Base>::type
        -      else
        -          return CategoryOrTraversal
        -
        -R' = if (Reference is use_default)
        -          if (Value is use_default)
        -              return iterator_traits<Base>::reference
        -          else
        -              return Value&
        -      else
        -          return Reference
        -
        -D' = if (Difference is use_default)
        -          return iterator_traits<Base>::difference_type
        -      else
        -          return Difference
        -
        - - - -
        -
        -

        iterator_adaptor public operations

        -

        iterator_adaptor();

        - --- - - - - - -
        Requires:The Base type must be Default Constructible.
        Returns:An instance of iterator_adaptor with -m_iterator default constructed.
        -

        explicit iterator_adaptor(Base const& iter);

        - --- - - - -
        Returns:An instance of iterator_adaptor with -m_iterator copy constructed from iter.
        -

        Base const& base() const;

        - --- - - - -
        Returns:m_iterator
        -
        -
        -

        iterator_adaptor protected member functions

        -

        Base const& base_reference() const;

        - --- - - - -
        Returns:A const reference to m_iterator.
        -

        Base& base_reference();

        - --- - - - -
        Returns:A non-const reference to m_iterator.
        -
        -
        -

        iterator_adaptor private member functions

        -

        typename iterator_adaptor::reference dereference() const;

        - --- - - - -
        Returns:*m_iterator
        -
        -template <
        -class OtherDerived, class OtherIterator, class V, class C, class R, class D
        ->
        -bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
        -
        - --- - - - -
        Returns:m_iterator == x.base()
        -

        void advance(typename iterator_adaptor::difference_type n);

        - --- - - - -
        Effects:m_iterator += n;
        -

        void increment();

        - --- - - - -
        Effects:++m_iterator;
        -

        void decrement();

        - --- - - - -
        Effects:--m_iterator;
        -
        -template <
        -    class OtherDerived, class OtherIterator, class V, class C, class R, class D
        ->
        -typename iterator_adaptor::difference_type distance_to(
        -    iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
        -
        - --- - - - -
        Returns:y.base() - m_iterator
        -
        -
        -
        -

        Specialized adaptors [lib.iterator.special.adaptors]

        -

        The enable_if_convertible<X,Y>::type expression used in -this section is for exposition purposes. The converting constructors -for specialized adaptors should be only be in an overload set provided -that an object of type X is implicitly convertible to an object of -type Y. -The signatures involving enable_if_convertible should behave -as-if enable_if_convertible were defined to be:

        -
        -template <bool> enable_if_convertible_impl
        -{};
        -
        -template <> enable_if_convertible_impl<true>
        -{ struct type; };
        -
        -template<typename From, typename To>
        -struct enable_if_convertible
        -  : enable_if_convertible_impl<is_convertible<From,To>::value>
        -{};
        -
        -

        If an expression other than the default argument is used to supply -the value of a function parameter whose type is written in terms -of enable_if_convertible, the program is ill-formed, no -diagnostic required.

        -

        [Note: The enable_if_convertible approach uses SFINAE to -take the constructor out of the overload set when the types are not -implicitly convertible. -]

        -
        -

        Indirect iterator

        - - - -

        indirect_iterator adapts an iterator by applying an -extra dereference inside of operator*(). For example, this -iterator adaptor makes it possible to view a container of pointers -(e.g. list<foo*>) as if it were a container of the pointed-to type -(e.g. list<foo>). indirect_iterator depends on two -auxiliary traits, pointee and indirect_reference, to -provide support for underlying iterators whose value_type is -not an iterator.

        -
        -

        Class template pointee

        - - - -
        -template <class Dereferenceable>
        -struct pointee
        -{
        -    typedef /* see below */ type;
        -};
        -
        - --- - - - -
        Requires:For an object x of type Dereferenceable, *x -is well-formed. If ++x is ill-formed it shall neither be -ambiguous nor shall it violate access control, and -Dereferenceable::element_type shall be an accessible type. -Otherwise iterator_traits<Dereferenceable>::value_type shall -be well formed. [Note: These requirements need not apply to -explicit or partial specializations of pointee]
        -

        type is determined according to the following algorithm, where -x is an object of type Dereferenceable:

        -
        -if ( ++x is ill-formed )
        -{
        -    return ``Dereferenceable::element_type``
        -}
        -else if (``*x`` is a mutable reference to
        -         std::iterator_traits<Dereferenceable>::value_type)
        -{
        -    return iterator_traits<Dereferenceable>::value_type
        -}
        -else
        -{
        -    return iterator_traits<Dereferenceable>::value_type const
        -}
        -
        -
        -
        -

        Class template indirect_reference

        - - - -
        -template <class Dereferenceable>
        -struct indirect_reference
        -{
        -    typedef /* see below */ type;
        -};
        -
        - --- - - - -
        Requires:For an object x of type Dereferenceable, *x -is well-formed. If ++x is ill-formed it shall neither be -ambiguous nor shall it violate access control, and -pointee<Dereferenceable>::type& shall be well-formed. -Otherwise iterator_traits<Dereferenceable>::reference shall -be well formed. [Note: These requirements need not apply to -explicit or partial specializations of indirect_reference]
        -

        type is determined according to the following algorithm, where -x is an object of type Dereferenceable:

        -
        -if ( ++x is ill-formed )
        -    return ``pointee<Dereferenceable>::type&``
        -else
        -    std::iterator_traits<Dereferenceable>::reference
        -
        -
        -
        -

        Class template indirect_iterator

        - - - -
        -template <
        -    class Iterator
        -  , class Value = use_default
        -  , class CategoryOrTraversal = use_default
        -  , class Reference = use_default
        -  , class Difference = use_default
        ->
        -class indirect_iterator
        -{
        - public:
        -    typedef /* see below */ value_type;
        -    typedef /* see below */ reference;
        -    typedef /* see below */ pointer;
        -    typedef /* see below */ difference_type;
        -    typedef /* see below */ iterator_category;
        -
        -    indirect_iterator();
        -    indirect_iterator(Iterator x);
        -
        -    template <
        -        class Iterator2, class Value2, class Category2
        -      , class Reference2, class Difference2
        -    >
        -    indirect_iterator(
        -        indirect_iterator<
        -             Iterator2, Value2, Category2, Reference2, Difference2
        -        > const& y
        -      , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
        -    );
        -
        -    Iterator const& base() const;
        -    reference operator*() const;
        -    indirect_iterator& operator++();
        -    indirect_iterator& operator--();
        -private:
        -   Iterator m_iterator; // exposition
        -};
        -
        -

        The member types of indirect_iterator are defined according to -the following pseudo-code, where V is -iterator_traits<Iterator>::value_type

        -
        -if (Value is use_default) then
        -    typedef remove_const<pointee<V>::type>::type value_type;
        -else
        -    typedef remove_const<Value>::type value_type;
        -
        -if (Reference is use_default) then
        -    if (Value is use_default) then
        -        typedef indirect_reference<V>::type reference;
        -    else
        -        typedef Value& reference;
        -else
        -    typedef Reference reference;
        -
        -if (Value is use_default) then
        -    typedef pointee<V>::type* pointer;
        -else
        -    typedef Value* pointer;
        -
        -if (Difference is use_default)
        -    typedef iterator_traits<Iterator>::difference_type difference_type;
        -else
        -    typedef Difference difference_type;
        -
        -if (CategoryOrTraversal is use_default)
        -    typedef iterator-category (
        -        iterator_traversal<Iterator>::type,``reference``,``value_type``
        -    ) iterator_category;
        -else
        -    typedef iterator-category (
        -        CategoryOrTraversal,``reference``,``value_type``
        -    ) iterator_category;
        -
        -
        -
        -

        indirect_iterator requirements

        -

        The expression *v, where v is an object of -iterator_traits<Iterator>::value_type, shall be valid -expression and convertible to reference. Iterator shall -model the traversal concept indicated by iterator_category. -Value, Reference, and Difference shall be chosen so -that value_type, reference, and difference_type meet -the requirements indicated by iterator_category.

        -

        [Note: there are further requirements on the -iterator_traits<Iterator>::value_type if the Value -parameter is not use_default, as implied by the algorithm for -deducing the default for the value_type member.]

        -
        -
        -

        indirect_iterator models

        -

        In addition to the concepts indicated by iterator_category -and by iterator_traversal<indirect_iterator>::type, a -specialization of indirect_iterator models the following -concepts, Where v is an object of -iterator_traits<Iterator>::value_type:

        -
        -
          -
        • Readable Iterator if reference(*v) is convertible to -value_type.
        • -
        • Writable Iterator if reference(*v) = t is a valid -expression (where t is an object of type -indirect_iterator::value_type)
        • -
        • Lvalue Iterator if reference is a reference type.
        • -
        -
        -

        indirect_iterator<X,V1,C1,R1,D1> is interoperable with -indirect_iterator<Y,V2,C2,R2,D2> if and only if X is -interoperable with Y.

        -
        -
        -

        indirect_iterator operations

        -

        In addition to the operations required by the concepts described -above, specializations of indirect_iterator provide the -following operations.

        -

        indirect_iterator();

        - --- - - - - - -
        Requires:Iterator must be Default Constructible.
        Effects:Constructs an instance of indirect_iterator with -a default-constructed m_iterator.
        -

        indirect_iterator(Iterator x);

        - --- - - - -
        Effects:Constructs an instance of indirect_iterator with -m_iterator copy constructed from x.
        -
        -template <
        -    class Iterator2, class Value2, unsigned Access, class Traversal
        -  , class Reference2, class Difference2
        ->
        -indirect_iterator(
        -    indirect_iterator<
        -         Iterator2, Value2, Access, Traversal, Reference2, Difference2
        -    > const& y
        -  , typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
        -);
        -
        - --- - - - - - -
        Requires:Iterator2 is implicitly convertible to Iterator.
        Effects:Constructs an instance of indirect_iterator whose -m_iterator subobject is constructed from y.base().
        -

        Iterator const& base() const;

        - --- - - - -
        Returns:m_iterator
        -

        reference operator*() const;

        - --- - - - -
        Returns:**m_iterator
        -

        indirect_iterator& operator++();

        - --- - - - - - -
        Effects:++m_iterator
        Returns:*this
        -

        indirect_iterator& operator--();

        - --- - - - - - -
        Effects:--m_iterator
        Returns:*this
        -
        -
        -
        -

        Reverse iterator

        - - - -

        The reverse iterator adaptor iterates through the adapted iterator -range in the opposite direction.

        -
        -

        Class template reverse_iterator

        - - - -
        -template <class Iterator>
        -class reverse_iterator
        -{
        -public:
        -  typedef iterator_traits<Iterator>::value_type value_type;
        -  typedef iterator_traits<Iterator>::reference reference;
        -  typedef iterator_traits<Iterator>::pointer pointer;
        -  typedef iterator_traits<Iterator>::difference_type difference_type;
        -  typedef /* see below */ iterator_category;
        -
        -  reverse_iterator() {}
        -  explicit reverse_iterator(Iterator x) ;
        -
        -  template<class OtherIterator>
        -  reverse_iterator(
        -      reverse_iterator<OtherIterator> const& r
        -    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
        -  );
        -  Iterator const& base() const;
        -  reference operator*() const;
        -  reverse_iterator& operator++();
        -  reverse_iterator& operator--();
        -private:
        -  Iterator m_iterator; // exposition
        -};
        -
        -

        If Iterator models Random Access Traversal Iterator and Readable -Lvalue Iterator, then iterator_category is convertible to -random_access_iterator_tag. Otherwise, if -Iterator models Bidirectional Traversal Iterator and Readable -Lvalue Iterator, then iterator_category is convertible to -bidirectional_iterator_tag. Otherwise, iterator_category is -convertible to input_iterator_tag.

        -
        -
        -

        reverse_iterator requirements

        -

        Iterator must be a model of Bidirectional Traversal Iterator. The -type iterator_traits<Iterator>::reference must be the type of -*i, where i is an object of type Iterator.

        -
        -
        -

        reverse_iterator models

        -

        A specialization of reverse_iterator models the same iterator -traversal and iterator access concepts modeled by its Iterator -argument. In addition, it may model old iterator concepts -specified in the following table:

        - ---- - - - - - - - - - - - - - - - - - - - -
        If I modelsthen reverse_iterator<I> models
        Readable Lvalue Iterator, -Bidirectional Traversal IteratorBidirectional Iterator
        Writable Lvalue Iterator, -Bidirectional Traversal IteratorMutable Bidirectional Iterator
        Readable Lvalue Iterator, -Random Access Traversal IteratorRandom Access Iterator
        Writable Lvalue Iterator, -Random Access Traversal IteratorMutable Random Access Iterator
        -

        reverse_iterator<X> is interoperable with -reverse_iterator<Y> if and only if X is interoperable with -Y.

        -
        -
        -

        reverse_iterator operations

        -

        In addition to the operations required by the concepts modeled by -reverse_iterator, reverse_iterator provides the following -operations.

        -

        reverse_iterator();

        - --- - - - - - -
        Requires:Iterator must be Default Constructible.
        Effects:Constructs an instance of reverse_iterator with m_iterator -default constructed.
        -

        explicit reverse_iterator(Iterator x);

        - --- - - - -
        Effects:Constructs an instance of reverse_iterator with -m_iterator copy constructed from x.
        -
        -template<class OtherIterator>
        -reverse_iterator(
        -    reverse_iterator<OtherIterator> const& r
        -  , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
        -);
        -
        - --- - - - - - -
        Requires:OtherIterator is implicitly convertible to Iterator.
        Effects:Constructs instance of reverse_iterator whose -m_iterator subobject is constructed from y.base().
        -

        Iterator const& base() const;

        - --- - - - -
        Returns:m_iterator
        -

        reference operator*() const;

        - --- - - - -
        Effects:
        -
        -Iterator tmp = m_iterator;
        -return *--tmp;
        -
        -

        reverse_iterator& operator++();

        - --- - - - - - -
        Effects:--m_iterator
        Returns:*this
        -

        reverse_iterator& operator--();

        - --- - - - - - -
        Effects:++m_iterator
        Returns:*this
        -
        -
        -
        -

        Transform iterator

        - - - -

        The transform iterator adapts an iterator by modifying the -operator* to apply a function object to the result of -dereferencing the iterator and returning the result.

        -
        -

        Class template transform_iterator

        - - - - -
        -template <class UnaryFunction,
        -          class Iterator,
        -          class Reference = use_default,
        -          class Value = use_default>
        -class transform_iterator
        -{
        -public:
        -  typedef /* see below */ value_type;
        -  typedef /* see below */ reference;
        -  typedef /* see below */ pointer;
        -  typedef iterator_traits<Iterator>::difference_type difference_type;
        -  typedef /* see below */ iterator_category;
        -
        -  transform_iterator();
        -  transform_iterator(Iterator const& x, UnaryFunction f);
        -
        -  template<class F2, class I2, class R2, class V2>
        -  transform_iterator(
        -        transform_iterator<F2, I2, R2, V2> const& t
        -      , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
        -      , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
        -  );
        -  UnaryFunction functor() const;
        -  Iterator const& base() const;
        -  reference operator*() const;
        -  transform_iterator& operator++();
        -  transform_iterator& operator--();
        -private:
        -  Iterator m_iterator; // exposition only
        -  UnaryFunction m_f;   // exposition only
        -};
        -
        -

        If Reference is use_default then the reference member of -transform_iterator is -result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type. -Otherwise, reference is Reference.

        -

        If Value is use_default then the value_type member is -remove_cv<remove_reference<reference> >::type. Otherwise, -value_type is Value.

        -

        If Iterator models Readable Lvalue Iterator and if Iterator -models Random Access Traversal Iterator, then iterator_category is -convertible to random_access_iterator_tag. Otherwise, if -Iterator models Bidirectional Traversal Iterator, then -iterator_category is convertible to -bidirectional_iterator_tag. Otherwise iterator_category is -convertible to forward_iterator_tag. If Iterator does not -model Readable Lvalue Iterator then iterator_category is -convertible to input_iterator_tag.

        -
        -
        -

        transform_iterator requirements

        -

        The type UnaryFunction must be Assignable, Copy Constructible, and -the expression f(*i) must be valid where f is an object of -type UnaryFunction, i is an object of type Iterator, and -where the type of f(*i) must be -result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type.

        -

        The argument Iterator shall model Readable Iterator.

        -
        -
        -

        transform_iterator models

        -

        The resulting transform_iterator models the most refined of the -following that is also modeled by Iterator.

        -
        -
          -
        • Writable Lvalue Iterator if transform_iterator::reference is a non-const reference.
        • -
        • Readable Lvalue Iterator if transform_iterator::reference is a const reference.
        • -
        • Readable Iterator otherwise.
        • -
        -
        -

        The transform_iterator models the most refined standard traversal -concept that is modeled by the Iterator argument.

        -

        If transform_iterator is a model of Readable Lvalue Iterator then -it models the following original iterator concepts depending on what -the Iterator argument models.

        - ---- - - - - - - - - - - - - - - - - - - - -
        If Iterator modelsthen transform_iterator models
        Single Pass IteratorInput Iterator
        Forward Traversal IteratorForward Iterator
        Bidirectional Traversal IteratorBidirectional Iterator
        Random Access Traversal IteratorRandom Access Iterator
        -

        If transform_iterator models Writable Lvalue Iterator then it is a -mutable iterator (as defined in the old iterator requirements).

        -

        transform_iterator<F1, X, R1, V1> is interoperable with -transform_iterator<F2, Y, R2, V2> if and only if X is -interoperable with Y.

        -
        -
        -

        transform_iterator operations

        -

        In addition to the operations required by the concepts modeled by -transform_iterator, transform_iterator provides the following -operations.

        -

        transform_iterator();

        - --- - - - -
        Returns:An instance of transform_iterator with m_f -and m_iterator default constructed.
        -

        transform_iterator(Iterator const& x, UnaryFunction f);

        - --- - - - -
        Returns:An instance of transform_iterator with m_f -initialized to f and m_iterator initialized to x.
        -
        -template<class F2, class I2, class R2, class V2>
        -transform_iterator(
        -      transform_iterator<F2, I2, R2, V2> const& t
        -    , typename enable_if_convertible<I2, Iterator>::type* = 0      // exposition only
        -    , typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
        -);
        -
        - --- - - - - - -
        Returns:An instance of transform_iterator with m_f -initialized to t.functor() and m_iterator initialized to -t.base().
        Requires:OtherIterator is implicitly convertible to Iterator.
        -

        UnaryFunction functor() const;

        - --- - - - -
        Returns:m_f
        -

        Iterator const& base() const;

        - --- - - - -
        Returns:m_iterator
        -

        reference operator*() const;

        - --- - - - -
        Returns:m_f(*m_iterator)
        -

        transform_iterator& operator++();

        - --- - - - - - -
        Effects:++m_iterator
        Returns:*this
        -

        transform_iterator& operator--();

        - --- - - - - - -
        Effects:--m_iterator
        Returns:*this
        -
        -
        -
        -

        Filter iterator

        - - - -

        The filter iterator adaptor creates a view of an iterator range in -which some elements of the range are skipped. A predicate function -object controls which elements are skipped. When the predicate is -applied to an element, if it returns true then the element is -retained and if it returns false then the element is skipped -over. When skipping over elements, it is necessary for the filter -adaptor to know when to stop so as to avoid going past the end of the -underlying range. A filter iterator is therefore constructed with pair -of iterators indicating the range of elements in the unfiltered -sequence to be traversed.

        -
        -

        Class template filter_iterator

        - - - - -
        -template <class Predicate, class Iterator>
        -class filter_iterator
        -{
        - public:
        -    typedef iterator_traits<Iterator>::value_type value_type;
        -    typedef iterator_traits<Iterator>::reference reference;
        -    typedef iterator_traits<Iterator>::pointer pointer;
        -    typedef iterator_traits<Iterator>::difference_type difference_type;
        -    typedef /* see below */ iterator_category;
        -
        -    filter_iterator();
        -    filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
        -    filter_iterator(Iterator x, Iterator end = Iterator());
        -    template<class OtherIterator>
        -    filter_iterator(
        -        filter_iterator<Predicate, OtherIterator> const& t
        -        , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
        -        );
        -    Predicate predicate() const;
        -    Iterator end() const;
        -    Iterator const& base() const;
        -    reference operator*() const;
        -    filter_iterator& operator++();
        -private:
        -    Predicate m_pred; // exposition only
        -    Iterator m_iter;  // exposition only
        -    Iterator m_end;   // exposition only
        -};
        -
        -

        If Iterator models Readable Lvalue Iterator and Bidirectional Traversal -Iterator then iterator_category is convertible to -std::bidirectional_iterator_tag. -Otherwise, if Iterator models Readable Lvalue Iterator and Forward Traversal -Iterator then iterator_category is convertible to -std::forward_iterator_tag. -Otherwise iterator_category is -convertible to std::input_iterator_tag.

        -
        -
        -

        filter_iterator requirements

        -

        The Iterator argument shall meet the requirements of Readable -Iterator and Single Pass Iterator or it shall meet the requirements of -Input Iterator.

        -

        The Predicate argument must be Assignable, Copy Constructible, and -the expression p(x) must be valid where p is an object of type -Predicate, x is an object of type -iterator_traits<Iterator>::value_type, and where the type of -p(x) must be convertible to bool.

        -
        -
        -

        filter_iterator models

        -

        The concepts that filter_iterator models are dependent on which -concepts the Iterator argument models, as specified in the -following tables.

        - ---- - - - - - - - - - - - - - - - - -
        If Iterator modelsthen filter_iterator models
        Single Pass IteratorSingle Pass Iterator
        Forward Traversal IteratorForward Traversal Iterator
        Bidirectional Traversal IteratorBidirectional Traversal Iterator
        - ---- - - - - - - - - - - - - - - - - -
        If Iterator modelsthen filter_iterator models
        Readable IteratorReadable Iterator
        Writable IteratorWritable Iterator
        Lvalue IteratorLvalue Iterator
        - ---- - - - - - - - - - - - - - - - - - - - -
        If Iterator modelsthen filter_iterator models
        Readable Iterator, Single Pass IteratorInput Iterator
        Readable Lvalue Iterator, Forward Traversal IteratorForward Iterator
        Writable Lvalue Iterator, Forward Traversal IteratorMutable Forward Iterator
        Writable Lvalue Iterator, Bidirectional IteratorMutable Bidirectional Iterator
        -

        filter_iterator<P1, X> is interoperable with filter_iterator<P2, Y> -if and only if X is interoperable with Y.

        -
        -
        -

        filter_iterator operations

        -

        In addition to those operations required by the concepts that -filter_iterator models, filter_iterator provides the following -operations.

        -

        filter_iterator();

        - --- - - - - - -
        Requires:Predicate and Iterator must be Default Constructible.
        Effects:Constructs a filter_iterator whose``m_pred``, m_iter, and m_end -members are a default constructed.
        -

        filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());

        - --- - - - -
        Effects:Constructs a filter_iterator where m_iter is either -the first position in the range [x,end) such that f(*m_iter) == true -or else``m_iter == end``. The member m_pred is constructed from -f and m_end from end.
        -

        filter_iterator(Iterator x, Iterator end = Iterator());

        - --- - - - - - -
        Requires:Predicate must be Default Constructible and -Predicate is a class type (not a function pointer).
        Effects:Constructs a filter_iterator where m_iter is either -the first position in the range [x,end) such that m_pred(*m_iter) == true -or else``m_iter == end``. The member m_pred is default constructed.
        -
        -template <class OtherIterator>
        -filter_iterator(
        -    filter_iterator<Predicate, OtherIterator> const& t
        -    , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
        -    );``
        -
        - --- - - - - - -
        Requires:OtherIterator is implicitly convertible to Iterator.
        Effects:Constructs a filter iterator whose members are copied from t.
        -

        Predicate predicate() const;

        - --- - - - -
        Returns:m_pred
        -

        Iterator end() const;

        - --- - - - -
        Returns:m_end
        -

        Iterator const& base() const;

        - --- - - - -
        Returns:m_iterator
        -

        reference operator*() const;

        - --- - - - -
        Returns:*m_iter
        -

        filter_iterator& operator++();

        - --- - - - - - -
        Effects:Increments m_iter and then continues to -increment m_iter until either m_iter == m_end -or m_pred(*m_iter) == true.
        Returns:*this
        -
        -
        -
        -

        Counting iterator

        - - - -

        counting_iterator adapts an object by adding an operator* that -returns the current value of the object. All other iterator operations -are forwarded to the adapted object.

        -
        -

        Class template counting_iterator

        - - - -
        -template <
        -    class Incrementable
        -  , class CategoryOrTraversal = use_default
        -  , class Difference = use_default
        ->
        -class counting_iterator
        -{
        -public:
        -    typedef Incrementable value_type;
        -    typedef const Incrementable& reference;
        -    typedef const Incrementable* pointer;
        -    typedef /* see below */ difference_type;
        -    typedef /* see below */ iterator_category;
        -
        -    counting_iterator();
        -    counting_iterator(counting_iterator const& rhs);
        -    explicit counting_iterator(Incrementable x);
        -    Incrementable const& base() const;
        -    reference operator*() const;
        -    counting_iterator& operator++();
        -    counting_iterator& operator--();
        -private:
        -    Incrementable m_inc; // exposition
        -};
        -
        -

        If the Difference argument is use_default then -difference_type is an unspecified signed integral -type. Otherwise difference_type is Difference.

        -

        iterator_category is determined according to the following -algorithm:

        -
        -if (CategoryOrTraversal is not use_default)
        -    return CategoryOrTraversal
        -else if (numeric_limits<Incrementable>::is_specialized)
        -    return iterator-category(
        -        random_access_traversal_tag, Incrementable, const Incrementable&)
        -else
        -    return iterator-category(
        -         iterator_traversal<Incrementable>::type,
        -         Incrementable, const Incrementable&)
        -
        -
        -
        [Note: implementers are encouraged to provide an implementation of
        -
        operator- and a difference_type that avoids overflows in -the cases where std::numeric_limits<Incrementable>::is_specialized -is true.]
        -
        -
        -
        -

        counting_iterator requirements

        -

        The Incrementable argument shall be Copy Constructible and Assignable.

        -

        If iterator_category is convertible to forward_iterator_tag -or forward_traversal_tag, the following must be well-formed:

        -
        -Incrementable i, j;
        -++i;         // pre-increment
        -i == j;      // operator equal
        -
        -

        If iterator_category is convertible to -bidirectional_iterator_tag or bidirectional_traversal_tag, -the following expression must also be well-formed:

        -
        ---i
        -
        -

        If iterator_category is convertible to -random_access_iterator_tag or random_access_traversal_tag, -the following must must also be valid:

        -
        -counting_iterator::difference_type n;
        -i += n;
        -n = i - j;
        -i < j;
        -
        -
        -
        -

        counting_iterator models

        -

        Specializations of counting_iterator model Readable Lvalue -Iterator. In addition, they model the concepts corresponding to the -iterator tags to which their iterator_category is convertible. -Also, if CategoryOrTraversal is not use_default then -counting_iterator models the concept corresponding to the iterator -tag CategoryOrTraversal. Otherwise, if -numeric_limits<Incrementable>::is_specialized, then -counting_iterator models Random Access Traversal Iterator. -Otherwise, counting_iterator models the same iterator traversal -concepts modeled by Incrementable.

        -

        counting_iterator<X,C1,D1> is interoperable with -counting_iterator<Y,C2,D2> if and only if X is -interoperable with Y.

        -
        -
        -

        counting_iterator operations

        -

        In addition to the operations required by the concepts modeled by -counting_iterator, counting_iterator provides the following -operations.

        -

        counting_iterator();

        - --- - - - - - -
        Requires:Incrementable is Default Constructible.
        Effects:Default construct the member m_inc.
        -

        counting_iterator(counting_iterator const& rhs);

        - --- - - - -
        Effects:Construct member m_inc from rhs.m_inc.
        -

        explicit counting_iterator(Incrementable x);

        - --- - - - -
        Effects:Construct member m_inc from x.
        -

        reference operator*() const;

        - --- - - - -
        Returns:m_inc
        -

        counting_iterator& operator++();

        - --- - - - - - -
        Effects:++m_inc
        Returns:*this
        -

        counting_iterator& operator--();

        - --- - - - - - -
        Effects:--m_inc
        Returns:*this
        -

        Incrementable const& base() const;

        - --- - - - -
        Returns:m_inc
        -
        -
        -
        -

        Function output iterator

        - - - -

        The function output iterator adaptor makes it easier to create custom -output iterators. The adaptor takes a unary function and creates a -model of Output Iterator. Each item assigned to the output iterator is -passed as an argument to the unary function. The motivation for this -iterator is that creating a conforming output iterator is non-trivial, -particularly because the proper implementation usually requires a -proxy object.

        - - -
        -

        function_output_iterator requirements

        -

        UnaryFunction must be Assignable and Copy Constructible.

        -
        -
        -

        function_output_iterator models

        -

        function_output_iterator is a model of the Writable and -Incrementable Iterator concepts.

        -
        -
        -

        function_output_iterator operations

        -

        explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());

        - --- - - - -
        Effects:Constructs an instance of function_output_iterator -with m_f constructed from f.
        -

        operator*();

        - --- - - - -
        Returns:An object r of unspecified type such that r = t -is equivalent to m_f(t) for all t.
        -

        function_output_iterator& operator++();

        - --- - - - -
        Returns:*this
        -

        function_output_iterator& operator++(int);

        - --- - - - -
        Returns:*this
        - -
        -
        -
        -
        -